<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Greg Whitworth</title>
  <subtitle>My random thoughts, normally web dev related.</subtitle>
  <link href="https://gwhitworth.com/feed.xml" rel="self"/>
  <link href="https://gwhitworth.com/"/>
  <updated>2026-08-02T01:36:15Z</updated>
  <id>https://gwhitworth.com/</id>
  <author>
    <name>Greg Whitworth</name>
    <email></email>
  </author>
  
  <entry>
    <title>How to use -ms-high-contrast</title>
    <link href="https://gwhitworth.com/posts/2017/how-to-use-ms-high-contrast/"/>
    <updated>2017-05-04T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2017/how-to-use-ms-high-contrast/</id>
    <content type="html">&lt;div class=&quot;highlight&quot;&gt;
    &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; This content is now outdated, I recommend referencing Microsoft Edge&#39;s &lt;a href=&quot;https://blogs.windows.com/msedgedev/2020/09/17/styling-for-windows-high-contrast-with-new-standards-for-forced-colors/&quot;&gt;blog post&lt;/a&gt; about the standardized solution
    &lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;This post is in response to Patrick H. Lauke&#39;s post titled,
&lt;a href=&quot;https://www.paciellogroup.com/blog/2016/12/windows-high-contrast-mode-the-limited-utility-of-ms-high-contrast/&quot;&gt;&lt;em&gt;Windows High Contrast Mode: the limited utility of -ms-high-contrast.&lt;/em&gt;&lt;/a&gt;
Since this is a response post, I recommend reading his first and then
come back to read this, I&#39;ll wait.&lt;/p&gt;
&lt;p&gt;I mentioned in the twitter thread that I&#39;d try to find
some time to blog about this to help clarify how it works since it wasn&#39;t mentioned in his post, well I finally found some time.&lt;/p&gt;
&lt;h2&gt;Why the media query exists&lt;/h2&gt;
&lt;p&gt;The high contrast feature within Windows is designed to help people with contrast
sensitivity issues. The colors are propagated from Windows High Contrast into the site&#39;s style to ensure that the
site is offering a true high-contrast experience similar to other applications on Windows.&lt;/p&gt;
&lt;p&gt;This is different from other browsers where they do graphic modifications
to the site such as color inversion. For example, here is Google Chrome with High Contrast enabled
compared to Edge with Windows High Contrast on the same site:&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/chrome-high-contrast.png&quot; /&gt;
    &lt;figcaption&gt;Chrome in high contrast&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;center&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/edge-high-contrast.png&quot; /&gt;
    &lt;figcaption&gt;Edge in high contrast&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;This route is beneficial for another reason, since we are modifying the styles this allows us to offer
control back to the web developer via the &lt;code&gt;-ms-high-contrast&lt;/code&gt; media query so they can further improve the experience
for their users.&lt;/p&gt;
&lt;h2&gt;It&#39;s about UX, not design&lt;/h2&gt;
&lt;p&gt;A common misconception that I&#39;ve seen often with this media query is that people
want to be able to make site changes by knowing which colors were selected
by the user.&lt;/p&gt;
&lt;p&gt;While the feature has to do with color modifications it&#39;s sole purpose is to aid in providing
users with contrast sensitivity a better experience. As such, you shouldn&#39;t necessarily care about
what the specific color is. To some extent, you shouldn&#39;t even care how your site looks; but how it
functions in high contrast.&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;Note: I am not a designer, and I&#39;m sure some designers will read this and inform me that UX is
a part of design. That&#39;s fine, but for the scope of this article please allow me to stretch the definition
of design to be separate from UX.&lt;/p&gt;
&lt;p&gt;To make this easier we mapped the Windows High Contrast colors to CSS system color keywords so you can utilize
the specified colors without needing to know them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Text is mapped to &lt;code&gt;windowText&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hyperlinks is mapped to N/A, we apply the color to &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Selected Text is mapped to &lt;code&gt;highlightText&lt;/code&gt; &amp;amp; &lt;code&gt;highlight&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Button Text is mapped to &lt;code&gt;buttonFace&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Background is mapped to &lt;code&gt;window&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&#39;s a screenshot of the Window High Contrast options as it will make
the above more clear:&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/high-contrast-black.png&quot; style=&quot;width: 60%;&quot; /&gt;
    &lt;figcaption&gt;The high contrast color settings for High Contrast Black&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;There are three values for the media query, &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;white-on-black&lt;/code&gt;, and &lt;code&gt;black-on-white&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is basic usage of the media query.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@media screen and (-ms-high-contrast: active) {
    /* All high contrast styling rules */
}
@media screen and (-ms-high-contrast: black-on-white) {
    /* Rules for users using black-on-white */
}
@media screen and (-ms-high-contrast: white-on-black) {
    /* Rules for users using white-on-black */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Enough background - let&#39;s get practical&lt;/h2&gt;
&lt;p&gt;All of the above is a good primer, so let&#39;s take a look
at some practical examples and how to utilize the media
query to achieve great results for your users. All of the
examples below are based on real sites I&#39;ve seen break when
in high contrast mode, so if you&#39;re doing the below - please update
your site.&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;Note: for simplicity purposes, in each of these demos I&#39;m only
  showing the final state that causes a broken behavior and how to
  fix it, not a fully functional implementation of said solution&lt;/p&gt;
&lt;h3&gt;Custom checkbox images&lt;/h3&gt;
&lt;p&gt;This is a common scenario I&#39;ve seen. You want to provide your users with
consistent graphics for checkboxes or you just don&#39;t like the
look of the browser provided ones. So you hide the checkbox and provide
your own. Here is an example of this &lt;strong&gt;without&lt;/strong&gt; high contrast enabled.&lt;/p&gt;
&lt;p data-height=&quot;115&quot; data-theme-id=&quot;dark&quot; data-slug-hash=&quot;ZKORLq&quot; data-default-tab=&quot;result&quot; data-user=&quot;gregwhitworth&quot; data-embed-version=&quot;2&quot; data-pen-title=&quot;custom checkbox without -ms-high-contrast&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/gregwhitworth/pen/ZKORLq/&quot;&gt;custom checkbox without -ms-high-contrast&lt;/a&gt; by gregwhitworth (&lt;a href=&quot;http://codepen.io/gregwhitworth&quot;&gt;@gregwhitworth&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io/&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://production-assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;Now if I turn on white-on-black high contrast, let&#39;s see how this experience changes:&lt;/p&gt;
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/checkmark-high-contrast-black.png&quot; /&gt;
&lt;p&gt;The checkmark completely disappears due to its alpha transparency and the background being switched to black
provide high contrast in other areas. The image itself is still there, but there is no way to see this. So,
what can we do to fix this. Well, there are two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a high contrast icon to begin with&lt;/li&gt;
&lt;li&gt;Switch out the background image using the &lt;code&gt;-ms-high-contrast&lt;/code&gt; media query&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Create a high contrast icon to begin with&lt;/h3&gt;
&lt;p&gt;This should be considered best practice in my opinion, any icon that you&#39;re creating should
have high contrast. There are numerous tools to help you ensure that the colors
you&#39;re using meet the guidelines produced by &lt;a href=&quot;http://www.w3.org/TR/WCAG20/&quot;&gt;WICAG for high contrast&lt;/a&gt;. I usually use the &lt;a href=&quot;http://webaim.org/resources/contrastchecker/&quot;&gt;WebAIM Color Contrast Checker&lt;/a&gt; but there are many great ones to use.
So let&#39;s assume that the checkmark &lt;strong&gt;has&lt;/strong&gt; to be black to match the rest of our site,
we can ensure high contrast by including the background with the image.&lt;/p&gt;
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/checkmark-high-contrast-black-correct.png&quot; /&gt;
&lt;p&gt;Yes, it isn&#39;t the best design, but that&#39;s not the point. The user can now see all of the
content that a person without contrast sensitivity can. If you&#39;re able to design a
style guide for your site that takes into account high contrast, you could make the checkmark
stand out even more by making it green. Again, the goal here is functionality, not form.&lt;/p&gt;
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/green-checkmark-high-contrast-black-correct.png&quot; /&gt;
&lt;h3&gt;Using system colors for dynamic color propagation&lt;/h3&gt;
&lt;p&gt;Rather than building up numerous images, one can utilize
the mappings I referred to above. Let&#39;s take a
look at a poorly executed SVG chart, first
the intended look for people that don&#39;t have contrast sensitivity.&lt;/p&gt;
&lt;p data-height=&quot;265&quot; data-theme-id=&quot;dark&quot; data-slug-hash=&quot;xdEKax&quot; data-default-tab=&quot;result&quot; data-user=&quot;gregwhitworth&quot; data-embed-version=&quot;2&quot; data-pen-title=&quot;SVG chart without high-contrast solution&quot; class=&quot;codepen&quot;&gt;See the Pen &lt;a href=&quot;https://codepen.io/gregwhitworth/pen/xdEKax/&quot;&gt;SVG chart without high-contrast solution&lt;/a&gt; by gregwhitworth (&lt;a href=&quot;http://codepen.io/gregwhitworth&quot;&gt;@gregwhitworth&lt;/a&gt;) on &lt;a href=&quot;http://codepen.io/&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://production-assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;p&gt;We could improve this for our contrast sensitive users by adding the following:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@media screen and (-ms-high-contrast: active) {
    .axis,
    .bar {
        stroke: windowText;
    }

    .box {
        fill: window;
    }

    .bar {
        fill: highlight;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is the result in both the White and Black high contrast modes:&lt;/p&gt;
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/chart-high-contrast-black.png&quot; alt=&quot;The chart in black high contrast shows teal bars&quot; /&gt;
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/04/chart-high-contrast-white.png&quot; alt=&quot;The chart in white high contrast shows purple bars&quot; /&gt;
&lt;p&gt;There is more that could be done here to further improve this chart, but
I think you get the point.&lt;/p&gt;
&lt;h2&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;Like so many things on the web a lot can be done for all users that also results
in aiding users that have contrast sensitivity issues. Here is an excellent talk by
&lt;a href=&quot;https://twitter.com/AaronGustafson&quot;&gt;Aaron Gustafson&lt;/a&gt; about &lt;a href=&quot;https://channel9.msdn.com/Events/Speakers/aaron+gustafson&quot;&gt;Inclusive Design&lt;/a&gt;
which covers this.&lt;/p&gt;
&lt;p&gt;High contrast tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to make icons high contrast from the beginning for everyone, if you can&#39;t
utilize &lt;code&gt;-ms-high-contrast: active&lt;/code&gt; to provide high contrast versions&lt;/li&gt;
&lt;li&gt;If you have alpha transparency, use &lt;code&gt;-ms-high-contrast&lt;/code&gt; to add in
a background to ensure high contrast&lt;/li&gt;
&lt;li&gt;Utilize the system color variables in order to utilize the colors selected by the
user to provide a great high contrast experience in any scenario that takes CSS
colors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have feedback on this post, feel free to contact me on &lt;a href=&quot;https://twitter.com/gregwhitworth&quot;&gt;twitter&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Accurately checking for CSS Grid support in Microsoft Edge</title>
    <link href="https://gwhitworth.com/posts/2017/Accurately-checking-for-CSS-Grid-support-in-Microsoft-Edge/"/>
    <updated>2017-05-10T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2017/Accurately-checking-for-CSS-Grid-support-in-Microsoft-Edge/</id>
    <content type="html">&lt;p&gt;Edge is updating it&#39;s implementation of CSS Grid. YAY! I was thrilled to fire up a test build
and take it for a spin and check out a few of the most common CSS Grid demos as a good first pass
at real life scenarios.&lt;/p&gt;
&lt;p&gt;Then I hopped over to a great &lt;a href=&quot;https://cssgrid.design/?utm_content=buffer95010&amp;amp;utm_medium=social&amp;amp;utm_source=twitter.com&amp;amp;utm_campaign=buffer&quot;&gt;repo&lt;/a&gt; set up by Rachel Andrew
that shows live sites using CSS Grid.&lt;/p&gt;
&lt;p&gt;I discovered something unfortunate while looking at Bryan Robinson&#39;s awesome &lt;a href=&quot;http://bryanlrobinson.com/&quot;&gt;portfolio site&lt;/a&gt;.
It didn&#39;t look like a grid layout. I then check his site in Firefox, and bam, - it looks great. Something was up.&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/05/bryan-robinson-no-grid.png&quot; alt=&quot;Bryan Robinson&#39;s site without grid&quot; /&gt;
    &lt;figcaption&gt;Image of Bryan Robinson&#39;s site without grid&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Looking at the code I see this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@supports(display: grid) and (not(display: -ms-grid)) {
    /* grid code here */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;While I get the purpose of this, IE&#39;s implementation of grid is not a
direct 1:1 of the standardized CSS Grid. Unfortunately this makes it so that Edge
will &lt;strong&gt;NOT&lt;/strong&gt; go into this support block at all, because we will support both &lt;nobr&gt;&lt;code&gt;display: grid&lt;/code&gt;&lt;/nobr&gt; and &lt;nobr&gt;&lt;code&gt;display: -ms-grid&lt;/code&gt;&lt;/nobr&gt;
when Edge ships.&lt;/p&gt;
&lt;h2&gt;The solution, just display: grid&lt;/h2&gt;
&lt;p&gt;So to make this work, we don&#39;t want to focus on &lt;code&gt;-ms-grid&lt;/code&gt; at all, but harness the power
of any of the other standard approach such as &lt;code&gt;display: grid&lt;/code&gt; or any other &lt;code&gt;grid-template-*&lt;/code&gt; properties added to the spec.
For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@supports(display: grid) {
    /* will return true for any browser supporting the spec */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bryan was awesome and updated his site about five minutes after we spoke on twitter and it now
looks great.&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2017/05/bryan-robinson-with-grid.png&quot; alt=&quot;Bryan Robinson&#39;s site with grid&quot; /&gt;
    &lt;figcaption&gt;Image of Bryan Robinson&#39;s site with accurate grid support check&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2&gt;What&#39;s Grid?&lt;/h2&gt;
&lt;p&gt;Just in case you read this whole post and don&#39;t know what CSS Grid is and what all the hype is about. &lt;a href=&quot;http://jensimmons.com/post/feb-27-2017/learn-css-grid&quot;&gt;Learn more&lt;/a&gt;
about this awesome layout capability coming to a browser near you.&lt;/p&gt;
&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;In an earlier version of this post, I theorized why such a feature query was being used, as possibly related to a bug with
&lt;code&gt;@supports&lt;/code&gt; in an Insiders build of Edge 15 (eg: our Canary builds). This bug did not ship to stable, so I have updated the content to be the simpler more sane
approach. Basically, don&#39;t include &lt;code&gt;-ms-grid&lt;/code&gt; checks.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Freedom in exceptions</title>
    <link href="https://gwhitworth.com/posts/2018/freedom-in-exceptions/"/>
    <updated>2018-08-05T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2018/freedom-in-exceptions/</id>
    <content type="html">&lt;p&gt;The subtle clack of the keys joins the chorus of beeps and whirs of medical devices in my daughter&#39;s hospital room.
She was diagnosed with brain cancer in January and quickly had two tumors removed. We&#39;re now over half way through her
chemo treatments, and we&#39;re all getting used to this as our current reality.&lt;/p&gt;
&lt;p&gt;One evening my wife and I were talking about some scenarios that we had encountered through this process that could
be improved through technology. Working at Microsoft, this is a common past-time for my wife and I as we flush out various ideas to different depths.
Some are more viable than others, but this one - it didn&#39;t matter about its viability; it offered me something else -- an opportunity.&lt;/p&gt;
&lt;p&gt;So I began coding.&lt;/p&gt;
&lt;p&gt;I never noticed it before; maybe due to apathy or preferring to look at the success of overcoming a problem rather than the
problems themselves, but there is a beauty; I&#39;d maybe even go so far as saying a freedom in the exceptions. I&#39;m sure many of us
became hooked to programming when building out our first &amp;quot;Hello World&amp;quot; scenario.&lt;/p&gt;
&lt;p&gt;Each of us have our moments of frustration, struggle
and humility wrought by these exceptions. But I find it remarkable how I can still achieve that same
rush of accomplishment as I cross off another hurdle to a clear console. It doesn&#39;t matter how often I do it, each time that I get an opportunity
to learn something new, face the challenges and overcome them - that rush returns. &amp;quot;I did it.&amp;quot; Working in web tech this is a common
scenario as the tech is ever evolving at an amazing rate. When building out a prototype for this solution I used this as an opportunity to learn Vue (it&#39;s all the rage right now)
and I enjoyed various moments of &amp;quot;ahaa&amp;quot;.&lt;/p&gt;
&lt;p&gt;I loved being able to explore a world where problems existed that &lt;strong&gt;I&lt;/strong&gt; can solve. In a season of life
where it feels like I have absolutely no control, and am met with fears that I don&#39;t have any desire to confront; I find freedom
in the exceptions that rendered in my dev tools. Even though they are remarkably un-important in the grand scheme of things,
it gave me a sense of control.&lt;/p&gt;
&lt;p&gt;So if you&#39;re banging you&#39;re head against a problem today, remember your &amp;quot;Hello World&amp;quot;
moment. You&#39;ve been here before, you&#39;ve got this, and to find the freedom and joy that the solution will produce.&lt;/p&gt;
&lt;p&gt;Please share you&#39;re most recent victory, or ahaa moment on &lt;a href=&quot;https://twitter.com/gregwhitworth&quot;&gt;twitter&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Blessed by your love</title>
    <link href="https://gwhitworth.com/posts/2018/blessed-by-your-love/"/>
    <updated>2018-08-20T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2018/blessed-by-your-love/</id>
    <content type="html">&lt;figure class=&quot;full center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/karen_greg_seattle.jpg&quot; alt=&quot;Karen and Greg posing in front of a museum in Seattle, Washington&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;span class=&quot;fancy&quot;&gt;Dear Karen,&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I can see it my mind&#39;s eye like it was yesterday; we&#39;re both walking along railroad ties in our church parking
lot like they&#39;re tight ropes and talking. I said something that makes you laugh and you look back over your shoulder
and that warm summer glow dances through your hair and illuminates the smile that continues to take my breath away.&lt;/p&gt;
&lt;p&gt;Like many young couples, we primarily talked and planned for the joyful milestones we might share together. We talked about
visiting Hawaii, which we would do a few years after our marriage thanks to your loving Nana &amp;amp; Papa which would spark a
tradition of scrounging money; and initially you trading your art for places to stay on any island we could. So many wonderful
memories for our family are bathed in the sun and sand of those islands; and encourage our wanderlust spirit.&lt;/p&gt;
&lt;figure class=&quot;right&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/matt-rachel-baby.jpg&quot; alt=&quot;Matt and Rachel sleeping as babies&quot; /&gt;
  &lt;br /&gt;&lt;br /&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/matt-rachel.jpg&quot; alt=&quot;Matt and Rachel posing on logs in Alaska&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;We talked about children, and how we felt two is the perfect number. You had more practical reasons, but I still stand
by the fact that most vacation competitions are for a family of four, not more (still hopeful on this one panning out).
In 2006 we would welcome our first, Rachel into the world and she would change our world in many ways. I recall sitting
in the back of your parent&#39;s SUV singing to her as she screamed because she believe that Kenai is too far from Wasilla (I tend
to agree with her). Then sitting in the kitchen of our new home while Rachel, at the time - two years of age, sat defiantly telling you
that she will not say she&#39;s sorry to you for being bad. We laughed about her stubbornness after the standoff came to a close and she was in bed.&lt;/p&gt;
&lt;iframe style=&quot;margin: auto&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/djpZ9CldkOg?rel=0&quot; frameborder=&quot;0&quot; allow=&quot;autoplay; encrypted-media&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Then Matt came into our life, a sweet, sympathetic and joyful little boy. One that was all to eager to get into
trouble with an older sister that was more than happy to come up with creative solutions and allow him to take the fall. These
two were inseparable and quickly became each other&#39;s best friends.&lt;/p&gt;
&lt;p&gt;As our family and careers grew, we were ready for more and we increasingly ready to leave Alaska. One March we visited Lake Oswego, Oregon where your Nana and
Papa live for vacation. We took a walk around the neighborhood and relished in what it might like to live in a community like this
and feel 70 degree weather in early spring rather than having to wait for summer. A few years later I would be on the phone with
an employee from Microsoft and he asked, &amp;quot;Are you willing to relocate?&amp;quot; With absolutely no hesitation I stated emphatically, &amp;quot;Yes.&amp;quot;&lt;/p&gt;
&lt;figure class=&quot;full center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/greg-karen-france.jpg&quot; alt=&quot;Greg and Karen posing in front of the pond at Monet&#39;s garden in Giverny, France&quot; /&gt;
  &lt;figcaption&gt;Greg and Karen posing in front of the pond at Monet&#39;s garden in Giverny, France&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Our journey to the lower 48 began and excitement filled the tiny 800 square foot apartment for opportunities to come. We began to talk
about what retirement should look like for us and things we long to do together while on this earth. We quickly listed out most of the
hot spots in Europe. We&#39;ve been truly blessed in that the team I joined at Microsoft just so happens to join W3C standards meetings in Europe
at least once a year. You would tag along for some of them, and while I was in the meetings you would be out seeing some of the sites. We
would meet up in the evening and enjoy the culture and friends. So many great memories that further unlocked our desire to travel and
we&#39;ve been able to see some our dreams for our fifties occur in our thirties.&lt;/p&gt;
&lt;figure class=&quot;full center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/rachel-sick.jpg&quot; alt=&quot;Rachel sick in the hospital&quot; /&gt;
  &lt;figcaption&gt;In January of 2018 Rachel was diagnosed with brain cancer&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Then came 2018, a year that embodies the harsh realities that no one ever thinks of when they say their vows; although we all know there
is a possibility of unfortunate events occurring. Karen, you have stepped up in a big way, and honestly I wouldn&#39;t expect anything different.
You&#39;re remarkably selfless, confident and strong. I don&#39;t wish the year we&#39;ve had on anyone but I also know that I hope that anyone that
has to walk this road has someone beside them like you. You&#39;ve shown a patience and love, not only to Rachel but to the entire family
that I will continue to strive and match. You&#39;re incredible and no words that I type can do you justice.&lt;/p&gt;
&lt;figure class=&quot;right&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2018/08/karen-greg-leavenworth.jpg&quot; alt=&quot;Greg and karen in Leavenworth.&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;I fell in love with a woman that is beautiful, strong, creative and confident and when we said, &amp;quot;I do&amp;quot;, I had no idea how much I would
appreciate those qualities as I have this year.&lt;/p&gt;
&lt;p&gt;While this year doesn&#39;t feel quite like the others, it has shown how &lt;strong&gt;blessed by your love I am&lt;/strong&gt; - possibly more so than any other year. With you, the Lord we can get through this.&lt;/p&gt;
&lt;p&gt;I love you,&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;fancy&quot;&gt;Greg&lt;/span&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>What do you think about the ResizeObserver entry object?</title>
    <link href="https://gwhitworth.com/posts/2019/wdyt-resize-observer-entry/"/>
    <updated>2019-02-23T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2019/wdyt-resize-observer-entry/</id>
    <content type="html">&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/SdYNYPiLDso?rel=0&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;h2&gt;What is Resize Observer?&lt;/h2&gt;
&lt;p&gt;ResizeObserver is built on top of the same functionality of MutationObserver that allows you to attach a callback event to an element. When an element&#39;s layout content box changes in size the callback that you registered with the observer is called and it gets passed an entry object which has the layout information about the content box. This is a very useful API to use if you’re ever wanting to make any style or content changes based on the dimensions of the box even if the viewport doesn’t change (a.k.a container queries).&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;Learn more about how to use ResizeObserver on &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;MDN&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;ResizeObserver also has the performance benefit that it passes you the layout information of the box so that you aren’t flushing the rendering pipeline in order to get these same dimensions since callback is called following layout and this information is already available.&lt;/p&gt;
&lt;h2&gt;What should the entry object structure be?&lt;/h2&gt;
&lt;p&gt;Aleks Totic and I are making some changes to ResizeObserver based on feedback we’ve already received from web developers, some of these improvements are being able to select which box you wish to observe, such as the &lt;code&gt;border-box&lt;/code&gt;, &lt;code&gt;content-box&lt;/code&gt; or &lt;code&gt;scroll-box&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What we would like feedback from you on is this. When the observer for observing the &lt;code&gt;border-box&lt;/code&gt; is triggered and the browser passes in the entry object to your callback would you prefer Option A or Option B.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Option A&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;    entry = {
        target: Element,
        contentRect: {/* v1 for back compat */},
        inline: 400,
        block: 400
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Option B&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;    entry = {
        target: Element,
        contentRect: {/* v1 for back compat */},
        contentBox: null,
        borderBox: {
            inline: 400,
            block: 400
        },
        scrollBox: null
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Vote now!&lt;/h2&gt;
&lt;p&gt;There are two ways to vote, you can vote in the YouTube video embedded above by clicking the &#39;i&#39; in the top right hand corner, or you can vote via Office forms &lt;a href=&quot;https://forms.office.com/Pages/ResponsePage.aspx?id=v4j5cvGGr0GRqy180BHbR9d8DwlN8spDuYgb2of6LalUM0JJMlEzTzFRTTc0STRDUkdDTjRCU1AxWS4u&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Initial thoughts on standardizing form controls</title>
    <link href="https://gwhitworth.com/posts/2019/form-controls-components/"/>
    <updated>2019-07-15T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2019/form-controls-components/</id>
    <content type="html">&lt;p&gt;While the move to Chromium is bitter sweet for me, one of the things that has
me excited is being able to take &lt;em&gt;some&lt;/em&gt; of the time that the team has spent devoting to
compat and investing it in trying to address the many pain points that we’ve heard through the years.&lt;/p&gt;
&lt;p&gt;One area that we’re beginning to investigate is the problem of form controls and
components built into the browser. Initially, we started at a very high level by doing an opportunity
analysis of the various buckets of work we could consider addressing in this
space; all with varying levels of necessary investment. Ultimately, they all
came back with an indicator that there was substantial opportunity for web
developers, designers and end users if the problem is &lt;strong&gt;solved correctly&lt;/strong&gt;.
In addition, it revealed a few core pillars that I feel must exist for the work done in this
space to solve the pain points web developers and designers currently face when working with
the built in form controls.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web developers need complete control over the appearance&lt;/li&gt;
&lt;li&gt;Extensibility needs to be possible&lt;/li&gt;
&lt;li&gt;State management across component(s), including composite components&lt;/li&gt;
&lt;li&gt;Expectation from developers is that the controls &amp;quot;just work&amp;quot;&lt;/li&gt;
&lt;li&gt;Accessibility, performance, focus and other foundational items work as
expected&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ok, so now that we have a quick overview of the expected key pillars, let’s dig
into a few of them in a little bit more detail with some of the data that lead us
to making these key pillars.&lt;/p&gt;
&lt;h2&gt;Complete control over the appearance&lt;/h2&gt;
&lt;p&gt;In many of the currently shipping controls and components there are a set
of CSS properties that developers can apply to aspects of control. This is one of the
major pain points presented, some of the top offenders being &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;, &lt;nobr&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt;&lt;/nobr&gt; and &lt;nobr&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;date&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/nobr&gt;. Additionally, there currently is no
way in which to extend the control if the developer desires to. A good example of this is
the &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; element where the developer either gets all of the controls or none of them by
adding or removing the &lt;code&gt;controls&lt;/code&gt; attribute. Because of this, many developers are left recreating all of the functionality already provided even though
they may have only desired to make a small content adjustment, like adding an additional button next
to the play/pause button.&lt;/p&gt;
&lt;p&gt;While there is a desire for more native controls in the browser (more on this
later), adding them does no good if the web developers and designers can’t
adjust them to meet the needs of their site&#39;s design or user experience.&lt;/p&gt;
&lt;p&gt;I sent out a survey on twitter to understand this problem space a bit more. With close to 1,400 unique
respondants it helped reveal why this area is such a pain point for web developers &amp;amp; designers.&lt;/p&gt;
&lt;p&gt;Let&#39;s take a quick look at some of the results (view the full &lt;a href=&quot;https://gwhitworth.com/surveys/controls-components&quot;&gt;results here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Within the survey we asked if they have ever used a library or created
their own version of controls, and if they did which controls did they create? Here
are the top 10:&lt;/p&gt;
&lt;div id=&quot;top10Created&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;top10Created&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
    text: &#39;Top 10 form controls re-created by web developers&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Chart Name&quot;,
          colorByPoint: true,
          data: [
            {
              name: &quot;Select&quot;,
              y: 10.7
          },
          {
              name: &quot;Checkbox&quot;,
              y: 10.16
          },
          {
            name: &quot;Date&quot;,
            y: 9.46
          },
          {
              name: &quot;Radio&quot;,
              y: 8.34
          },
          {
            name: &quot;File&quot;,
            y: 7.32
          },
          {
              name: &quot;Progress&quot;,
              y: 6.37
          },
          {
            name: &quot;Button&quot;,
            y: 5.85
          },
          {
            name: &quot;Dialog&quot;,
            y: 5.69
          },
          {
              name: &quot;TextArea&quot;,
              y: 5.44
          },
          {
            name: &quot;Text&quot;,
            y: 5.14
          }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;This list isn’t surprising if you’ve been in the web development community for a
while. But simply requesting which ones were created doesn’t necessarily inform
us why they reached for a library or created their own, so we then asked, “What
were the top two reasons that you needed to create or use a custom control?”&lt;/p&gt;
&lt;div id=&quot;reasonsToCreate&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;reasonsToCreate&#39;, {
  chart: {
      type: &#39;pie&#39;,
      height: 300,
      plotBackgroundColor: null,
      plotBorderWidth: null,
      plotShadow: false,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
      text: &quot;Reasons controls are created&quot;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
    pie: {
      allowPointSelect: true,
      cursor: &#39;pointer&#39;,
      dataLabels: {
          enabled: true,
          format: &#39;&lt;b&gt;{point.name}&lt;/b&gt;: {point.percentage:.1f} %&#39;,
          style: {
              color: (Highcharts.theme &amp;&amp; Highcharts.theme.contrastTextColor) || &#39;black&#39;
          }
      }
    }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Reasons controls are created&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Couldn&#39;t change appearance sufficiently&quot;,
                  y: 36.55
              },
              {
                  name: &quot;Wanted to add functionality&quot;,
                  y: 31.57
              },
              {
                name: &quot;Browser inconsistencies&quot;,
                y: 27.29
              },
              {
                name: &quot;Accesibility issues&quot;,
                y: 2.79
              },
              {
                name: &quot;Other&quot;,
                y: 1.8
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;In addition to Microsoft, &lt;a href=&quot;https://bocoup.com/&quot;&gt;Bocoup&lt;/a&gt; and Google have been actively investigating
this space so when Simon Pieters of Bocoup reached out, having seen my survey, we decided to collaborate on a
survey that was presented to attendees of JS/CSS Conf EU. It had the same questions overall but it
included two new questions. “Which form control gives you the most frustration”:&lt;/p&gt;
&lt;div id=&quot;frustration&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;frustration&#39;, {
  chart: {
    type: &#39;column&#39;,
    height: 300,
    events: {
      load: function () {
        chart = this;
        timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
      }
    }
},
title: {
  text: &#39;Which form control gives you the most frustration?&#39;
},
xAxis: {
    type: &#39;category&#39;
},
yAxis: {
    title: {
        text: &#39;Percentage&#39;
    }
},
legend: {
    enabled: false
},
plotOptions: {
    series: {
        borderWidth: 0,
        dataLabels: {
            enabled: true,
            format: &#39;{point.y:.1f}%&#39;
        }
    }
},
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Control&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;select&quot;,
                  y: 42.67
              },
              {
                  name: &quot;date&quot;,
                  y: 17.33
              },
              {
                name: &quot;file&quot;,
                y: 9.33
              },
              {
                name: &quot;checkbox&quot;,
                y: 8
              },
              {
                name: &quot;radio&quot;,
                y: 6.67
              },
              {
                name: &quot;range&quot;,
                y: 4
              },
              {
                name: &quot;progress&quot;,
                y: 2.67
              },
              {
                name: &quot;fieldset&quot;,
                y: 2.67
              },
              {
                name: &quot;text&quot;,
                y: 1.33
              },
              {
                name: &quot;number&quot;,
                y: 1.33
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;And while this is only a slight pivot to what could be inferred from the earlier question
it shines a strong light on the most problematic controls.&lt;/p&gt;
&lt;p&gt;In addition to this, we asked &amp;quot;Why does that form control give you the most frustration?&amp;quot; (bolded quotes
were more commonly stated by respondants but phrased differently):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;“Requires hacky tricks”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;“Can’t style &lt;code&gt;&amp;lt;option&amp;gt;&lt;/code&gt; elements at all to the extent we need to”&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;“Too little control over styling across popular browsers”&lt;/li&gt;
&lt;li&gt;&amp;quot;I’m generally ok with default rendering of form components and the amount
that web fonts, etc can be used. But select menus are a major outlier and
just sort of stink”&lt;/li&gt;
&lt;li&gt;“Label “select a file” and file name are hard to customise.”&lt;/li&gt;
&lt;li&gt;“Styling implementation for Select is &lt;strong&gt;inconsistent between browsers&lt;/strong&gt;. Not
all styling properties apply to the control.”&lt;/li&gt;
&lt;li&gt;“…but the &lt;strong&gt;amount of work it takes to implement&lt;/strong&gt; an accessible alternative
with complete feature parity is massive”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Browser consistency&lt;/h2&gt;
&lt;p&gt;In order to achieve the capability of control over the appearance; we also need
to ensure that browser vendors align as much as possible on the sub-parts available to web
developers. A good example of how this can be problematic is &lt;nobr&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/nobr&gt;. Here is what it currently looks like in Edge (EdgeHTML), Firefox, Chrome
and Safari:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chrome:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/06/chrome.png&quot; alt=&quot;Chrome&#39;s file control&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edge (EdgeHTML):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/06/edge.png&quot; alt=&quot;EdgeHTML&#39;s file control&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Firefox:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/06/firefox.png&quot; alt=&quot;Firefox&#39;s file control&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Safari (MacOS):&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/06/safari.png&quot; alt=&quot;Safari&#39;s file control&quot; /&gt;&lt;/p&gt;
&lt;p&gt;These types of browser inconsistencies wouldn’t be &lt;em&gt;such&lt;/em&gt; a huge deal if the
form parts were agreed upon and reachable by web developers. Unfortunately, the
majority of form controls aren’t standardized, which requires web developers to
go to great lengths to work around these shortcomings. Here is one example &lt;a href=&quot;https://tympanus.net/codrops/2015/09/15/styling-customizing-file-inputs-smart-way/&quot;&gt;blog
post&lt;/a&gt;
detailing ways to work around the file form control. Similiar &amp;quot;hacks&amp;quot; can be seen on many
major sites such as Facebook and Twitter.&lt;/p&gt;
&lt;h2&gt;Why is this a necessary pillar?&lt;/h2&gt;
&lt;p&gt;Browser inconsistencies can lead to negative end user experiences and browser
engineers often have an unrealistic expectation of web developers to open every
browser and test it thoroughly. This has long been known to be a large request,
especially for smaller shops. In order to try to put a quantitative number to
qualitative assessment we asked, “Which browsers do you actively test during the development phase?”&lt;/p&gt;
&lt;div id=&quot;browserSupport&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;browserSupport&#39;, {
  chart: {
      type: &#39;column&#39;
  },
  title: {
      text: &#39;Which browser(s) do you typically need to support?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Browser&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Chrome&quot;,
                  y: 28.51
              },
              {
                  name: &quot;Firefox&quot;,
                  y: 20.32
              },
              {
                name: &quot;Microsoft Edge&quot;,
                y: 19.64
              },
              {
                name: &quot;IE 11&quot;,
                y: 12.96
              },
              {
                  name: &quot;Safari&quot;,
                  y: 12.07
              },
              {
                  name: &quot;IE 10&quot;,
                  y: 2.69
              },
              {
                name: &quot;IE 9&quot;,
                y: 1.63
              },
              {
                name: &quot;Other&quot;,
                y: .98
              },
              {
                name: &quot;Opera Mini&quot;,
                y: .86
              },
              {
                name: &quot;UC&quot;,
                y: .35
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;This is not necessarily surprising to me given my history on the Microsoft Edge
team, but it was kind of surprising how few Safari testers there were. I can
only speculate at this point, but I think this has to do with the thought that
Chrome is derived from Webkit, as is Safari and thus interoperability is not an issue.
Where as Microsoft’s browsers have an infamous reputation of causing web developer pain
through interop issues even if Microsoft Edge made huge strides in this regard.&lt;/p&gt;
&lt;p&gt;An additional point to Safari’s lower testing can be due to developer access to
testing Safari since it’s only available on Mac. We asked, “Which operating
system do you primarily develop on?”&lt;/p&gt;
&lt;div id=&quot;primaryOsDevelopedOn&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;primaryOsDevelopedOn&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
      text: &#39;Primary OS&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Primary OS Developed On&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Windows&quot;,
                  y: 82.37
              },
              {
                  name: &quot;Mac OSX&quot;,
                  y: 11.63
              },
              {
                name: &quot;Linux&quot;,
                y: 5.09
              },
              {
                name: &quot;Other&quot;,
                y: .91
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;h2&gt;This can have a negative impact on our shared users&lt;/h2&gt;
&lt;p&gt;As we’ve seen in the results above, web developers have an ever-increasing
testing matrix of operating systems and browsers. This can result in a negative impact on
the end user which is bad for browser vendors, web developers and the companies that
employ them to build their site.&lt;/p&gt;
&lt;p&gt;To this end, I was curious about a key aspect of the end user experience, accessibility.
Since the accessibilty team has spent so much time over the past few years
&lt;a href=&quot;https://www.html5accessibility.com/&quot;&gt;improving accessibility in Microsoft Edge&lt;/a&gt; and
now in &lt;a href=&quot;https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/master/Accessibility/UIA/i2i.md&quot;&gt;Chromium&lt;/a&gt;,
how many web developers take advantage of this investment and great work?&lt;/p&gt;
&lt;p&gt;To understand this, we asked, “Do you do accessibility testing?”&lt;/p&gt;
&lt;div id=&quot;doYouDoA11yTesting&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;doYouDoA11yTesting&#39;, {
  chart: {
    height: 300,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
      text: &#39;Do you do accessibility testing&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
    pie: {
        dataLabels: {
            enabled: true,
            format: &#39;{point.name}: {point.y:.1f}%&#39;
        },
    }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          type: &#39;pie&#39;,
          name: &#39;Answer&#39;,
          innerSize: &#39;50%&#39;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;No&quot;,
                  y: 60.95
              },
              {
                  name: &quot;Yes&quot;,
                  y: 39.05
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;Then, of the respondants that selected they do accessibility testing, we asked what
type of accessibility testing they do:&lt;/p&gt;
&lt;div id=&quot;typeOfA11yTestingDone&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;typeOfA11yTestingDone&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
      text: &#39;Type of accessibility testing done&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Type&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Keyboard navigation&quot;,
                  y: 40.5
              },
              {
                  name: &quot;Color contrast&quot;,
                  y: 29.21
              },
              {
                name: &quot;Assistive Technology&quot;,
                y: 27.60
              },
              {
                name: &quot;Other&quot;,
                y: 2.69
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;Then, if they are doing assistive technology (AT) testing we asked which ATs
they test with:&lt;/p&gt;
&lt;div id=&quot;atTested&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;atTested&#39;, {
      type: &#39;column&#39;
  },
  title: {
      text: &#39;Accessibilty Technology Tested&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Accessibilty Technology Tested&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Narrator&quot;,
                  y: 22.58
              },
              {
                  name: &quot;Voice Over&quot;,
                  y: 19
              },
              {
                name: &quot;ChromeVox&quot;,
                y: 19
              },
              {
                name: &quot;Jaws&quot;,
                y: 17.56
              },
              {
                name: &quot;NVDA&quot;,
                y: 15.77
              },
              {
                name: &quot;Other&quot;,
                y: 6.09
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;So we only have ~40% of web developers (that were willing to answer) doing any
type of accessibility testing, and of those users only 27% doing any type of AT
testing. This undoubtedly leads to broken user experiences and we have only
begun to scratch the surface in this regard.&lt;/p&gt;
&lt;h2&gt;Standardize in-page controls&lt;/h2&gt;
&lt;p&gt;My current thinking in this space, and I know some folks will find this
controversial, but I think we should completely standardize &lt;strong&gt;in-page&lt;/strong&gt; form
controls with no limitations on their styling capabilities. What
do I mean by in-page controls? I am referring to any form control or component
that is rendered within the content process. This standardization would
include the sub-parts and their related states and how these are exposed
(probably through CSS psuedo classes or HTML attributes). This will enable the
shadow-dom to be encapsulated while providing web developers with a consistent
experience to adjust to match their brand and needs of their site/application.&lt;/p&gt;
&lt;div class=&quot;note&quot;&gt;&lt;strong&gt;Note:&lt;/strong&gt; regarding external controls/components: There are very valid reasons that
operating systems can not standardize the external “windowed” controls, such as
the keyboard flyouts, file explorers as these need to remain consistent across
any application and there may be scenarios when the company is developing a new
form factor that they require a new paradigm for input (eg: iPhone or
HoloLens).&lt;/div&gt;
&lt;h2&gt;Reduce throw away work while increasing usability&lt;/h2&gt;
&lt;p&gt;As seen above, very few web developers have the time to put in the effort to
do complete performance, accessibility and compat testing. Whereas the browser
vendors, in many cases, are spending their time doing this work. This is something I&#39;m acutely
aware of since that’s what we’re actively doing within the Chromium codebase to match our Fluent Design
System for the new Microsoft Edge built on top of Chromium.&lt;/p&gt;
&lt;p&gt;As such, we want our users to have this experience while enabling web developers
to benefit from this time spent by allow them to extend and style these controls; not throw them away to produce their own.
Although I realize, give the current state of form controls, web developers are often stuck
between a rock and hard place. This will not only improve the end user experience but also
improve the developer experience and expense cost for the web development firms.
In order to try and solve this problem, we should...&lt;/p&gt;
&lt;h3&gt;Introduce new form controls and components&lt;/h3&gt;
&lt;p&gt;Since we are aware of web developers needing to create their own controls, we
figured we’d take this time to ask which form controls or enhancements they’d
like added to the platform. We didn’t provide an exhaustive list but put in some of
the top requests we’ve heard over the years, each respondent could select their
top 3:&lt;/p&gt;
&lt;div id=&quot;nativeControlsRequested&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;nativeControlsRequested&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
          timerId = setInterval(() =&gt; checkBounds(chart, timerId), 10);
        }
      }
  },
  title: {
      text: &#39;Native Controls Requested&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Percentage&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y:.1f}%&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}%&lt;/b&gt; of total&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Control/Component&quot;,
          colorByPoint: true,
          data: [
              {
                  name: &quot;Virtual lists/scroller&quot;,
                  y: 24.35
              },
              {
                  name: &quot;Toggle switch&quot;,
                  y: 24.23
              },
              {
                name: &quot;Input masks&quot;,
                y: 19.85
              },
              {
                name: &quot;Edit menu for selected content&quot;,
                y: 11.54
              },
              {
                name: &quot;Focus trap region&quot;,
                y: 8.56
              },
              {
                name: &quot;Segment buttons&quot;,
                y: 8.20
              },
              {
                name: &quot;Other&quot;,
                y: 3.28
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;Top requests under &amp;quot;Other&amp;quot; were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tooltips&lt;/li&gt;
&lt;li&gt;Context menu&lt;/li&gt;
&lt;li&gt;A fully functional dialog&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Introduce new APIs to avoid hacky work arounds&lt;/h3&gt;
&lt;p&gt;As we’ve been looking into this, and as I’ve tried to show above, there will be
scenarios in which the web platform is simply missing solutions or APIs
necessary to unlock the creativity that web developers and designers hope to
accomplish with their controls. Also, as we saw above and during the
opportunity analysis, the web community wants to simplify the effort necessary
to build the controls they need.&lt;/p&gt;
&lt;p&gt;Take the &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; control as one example, without digging too deeply into
it yet - we currently don&#39;t have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a way in which to have a popup that we can ensure to be on top of all
content and break out of &lt;code&gt;overflow: hidden&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;have the popup open in the direction that has more space within
the viewport&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Google Chrome team has been actively looking into this space as well,
by &lt;a href=&quot;https://developers.google.com/web/updates/2019/03/kv-storage&quot;&gt;utilizing built in modules&lt;/a&gt;, and they have
introduced a proposal for a &lt;a href=&quot;https://github.com/tkent-google/std-switch/blob/master/README.md&quot;&gt;toggle/switch&lt;/a&gt; (&lt;a href=&quot;https://discourse.wicg.io/t/proposal-a-toggle-switch-control-element/3620&quot;&gt;WICG Thread&lt;/a&gt;) and
have begun work on a virtual scroller component as well.  In addition, they have an issue open for
researching the &amp;quot;top layer&amp;quot; issue noted above &lt;a href=&quot;https://github.com/whatwg/html/issues/4633&quot;&gt;open&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;First steps regarding this work&lt;/h2&gt;
&lt;h3&gt;More research into select &amp;amp; file&lt;/h3&gt;
&lt;p&gt;My initial thinking on this, and steps we’ll hopefully be taking soon for this
is to take the &lt;nobr&gt;&lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt;&lt;/nobr&gt; and &lt;nobr&gt;&lt;code&gt;&amp;lt;input type=&amp;quot;file&amp;quot;&amp;gt;&lt;/code&gt;&lt;/nobr&gt; controls and dig deeper into
them. We will use the above information as our north star to guide the
implementations to ensure we&#39;re solving the problems outlined by the developers. We will be
doing this work within this &lt;a href=&quot;https://github.com/WICG/form-controls-components/blob/master/README.md&quot;&gt;WICG Repo&lt;/a&gt; and
as we discover APIs we&#39;ll take them to the appropriate working groups with the elements ultimatley living in the HTML specification.&lt;/p&gt;
&lt;h3&gt;Component libraries&lt;/h3&gt;
&lt;p&gt;We&#39;ve also begun talking with many of the component libraries and frameworks, spefically about this work to understand what they would like
to see from this and to learn from them due to their vast experience in this space. Some of the ones we&#39;ve
begun speaking with are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast DNA&lt;/li&gt;
&lt;li&gt;Fabric&lt;/li&gt;
&lt;li&gt;Polymer&lt;/li&gt;
&lt;li&gt;Ionic&lt;/li&gt;
&lt;li&gt;Ember&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you work on a component library or framework and are interested in talking,
contact me on &lt;a href=&quot;http://twitter.com/gregwhitworth&quot;&gt;twitter&lt;/a&gt; (my DMs are open).&lt;/p&gt;
&lt;h3&gt;Stay tuned &amp;amp; get involved&lt;/h3&gt;
&lt;p&gt;Hopefully this is clear based on the data and the resulting post, that I want to ensure that what is built enables
developers and designers to create enriching experiences without having to re-create the wheel. I&#39;m very eager to hear
from you and I know many from other browser vendors and members in the standards community are too.&lt;/p&gt;
&lt;p&gt;If you&#39;re interested in getting involved and keeping up with the progress, follow me on &lt;a href=&quot;http://twitter.com/gregwhitworth&quot;&gt;twitter&lt;/a&gt;
(I commonly send out surveys and short info there), star the &lt;a href=&quot;https://github.com/WICG/form-controls-components/blob/master/README.md&quot;&gt;Standardized Controls &amp;amp; Components Repo&lt;/a&gt;,
and provide feedback to Google on their &lt;a href=&quot;https://github.com/tkent-google/std-switch/blob/master/README.md&quot;&gt;toggle/switch&lt;/a&gt; proposal.&lt;/p&gt;
&lt;p&gt;That&#39;s all for now - thanks for reading and I look forward to a day where we can fully style
a &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; control (can you imagine?!)!&lt;/p&gt;
&lt;div class=&quot;highlight highlight-with-icon&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/icons8-graph-report-64.png&quot; alt=&quot;graph image&quot; /&gt;
    &lt;p&gt;&lt;a href=&quot;https://gwhitworth.com/surveys/controls-components/&quot;&gt;Click here&lt;/a&gt; to view the full survey results&lt;/p&gt;
&lt;/div&gt;</content>
  </entry>
  
  <entry>
    <title>Working with the text backplate in Windows High Contrast</title>
    <link href="https://gwhitworth.com/posts/2019/high-contrast-text-backplate/"/>
    <updated>2019-08-05T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2019/high-contrast-text-backplate/</id>
    <content type="html">&lt;p&gt;I&#39;ve written in the past about how to adjust your site to provide a useful experience
to users that turn on Windows High Contrast (if you haven&#39;t read about it, jump over &lt;a href=&quot;https://www.gwhitworth.com/blog/2017/04/how-to-use-ms-high-contrast/&quot;&gt;here&lt;/a&gt; to
read it and then come back).&lt;/p&gt;
&lt;h2&gt;Some background&lt;/h2&gt;
&lt;p&gt;An issue was brought to my attention recently &lt;a href=&quot;https://twitter.com/aardrian&quot;&gt;Adrian Roselli&lt;/a&gt;
where he asked, &amp;quot;... am unable to get Edge to properly do text in button on focus/hover when inverting
values as it seems to think it conflicts with background and is putting
bar behind it. Typo? Help?.&amp;quot;&lt;/p&gt;
&lt;p&gt;Before I get into how to fix this issue, I&#39;m going to quickly outline why this issue is exists
in the first place. In the 2016 Spring Release of Microsoft Edge, a change was made in high-contrast
mode where a blackplate was added behind text nodes to ensure contrast. Bogdan Brinza &amp;amp; Rossen Atanassov
of the Microsoft Edge team &lt;a href=&quot;https://blogs.windows.com/msedgedev/2016/04/20/building-a-more-accessible-web-platform/#U71aOXDXPTETvKbL.97&quot;&gt;stated&lt;/a&gt;
the reasoning for this was, &amp;quot;Many modern web sites use background images as foreground content,
which doesn’t provide a great experience for users who need increased contrast.&amp;quot;&lt;/p&gt;
&lt;p&gt;Here is an example of this issue seen in the Microsoft Edge browser with high-contrast enabled:
&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/08/xbox-before.png&quot; alt=&quot;Xbox background content missing due to removal of background images&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So the Xbox site is using the background image to convey context that Halo is one of the best
xbox games. In order to achieve contrast however, Edge replaces background images and fills in the
background of every container with the user&#39;s selected colors in the OS settings. This ensures
high-contrast, but the user has a degraded experience over all in relation to non-high-contrast
users.&lt;/p&gt;
&lt;p&gt;To solve this, the team did something pretty creative by taking a common paradigm seen in another
medium where the background content is dynamic, video media. What they did was allow the background
images to be rendered and inserted a backplate behind all of the text nodes that achieves the desired
end result.&lt;/p&gt;
&lt;p&gt;Here is what that same site looks like with these adjustments:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/08/xbox-after.png&quot; alt=&quot;Xbox background content is rendered and contrast is consistent&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The problem&lt;/h2&gt;
&lt;p&gt;Now back to Adrian&#39;s problem from earlier. Adrian has a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; that he has a nice
little &lt;code&gt;:hover&lt;/code&gt; effect on where the background and text color change. Here&#39;s what it looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/08/button-standard.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now, let&#39;s take a look at this same scenario with Windows high-contrast turned on:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/08/high-contrast-w-backplate.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;As you see the backplate actually ruins the high-contrast that Adrian was hoping to achieve.
This happens, ironically because Adrian is being responsible and adjusting the web content for
high-contrast:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@media screen and (-ms-high-contrast: active) {
  button {
    -ms-high-contrast-adjust: none;
    color: buttonText;
    background-color: buttonFace;
    border: 3px solid windowText;
  }
  button:hover,
  button:focus {
    color: buttonFace;
    background-color: buttonText;
    border: 3px solid windowText;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;So in order to solve this, all you need to do is add &lt;code&gt;-ms-high-contrast-adjust: none;&lt;/code&gt;(&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/-ms-high-contrast-adjust&quot;&gt;MDN docs&lt;/a&gt;) to the
&lt;code&gt;button&lt;/code&gt; selector. This tells the browser, &amp;quot;I&#39;ve got this, I know what I&#39;m doing and I&#39;ll handle
all of the high contrast.&amp;quot; So the browser then doesn&#39;t touch that content leaving you in control
of how high-contrast is handled. So now that &lt;code&gt;-ms-high-contrast-adjust&lt;/code&gt; has been added, let&#39;s take
another look:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/08/high-contrast-adjust-on.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That&#39;s all there is to it. Happy coding!&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Can we please style the &lt;select&gt; control?!</title>
    <link href="https://gwhitworth.com/posts/2019/can-we-please-style-select/"/>
    <updated>2019-10-10T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2019/can-we-please-style-select/</id>
    <content type="html">&lt;p&gt;When working in Product Management one important aspect to determine the importance of a
bug or feature in the product is how the person responds to the question or task you have them
do. People give off many emotions, even subtle ones, that help you determine relative priority
of potential work items. In my previous &lt;a href=&quot;http://gwhitworth.com/blog/2019/07/form-controls-components/&quot;&gt;post regarding the native browser Controls &amp;amp; Components&lt;/a&gt;,
I saw frustration at forms and controls in general, but goodness the &amp;lt;select&amp;gt; control got
the brunt of the hate. One specific item of feedback I got in this survey which points to this
passion and also to the opportunity here is summed up in five words, *&lt;em&gt;&amp;quot;Don&#39;t f@&lt;em&gt;k this up more.&amp;quot;&lt;/em&gt;&lt;/em&gt; (&lt;a href=&quot;https://gwhitworth.com/surveys/select#quotes&quot;&gt;read more quotes here&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Let&#39;s start digging into the data, beginning with the breakdown of  demographics of
who answered the survey:&lt;/p&gt;
&lt;div id=&quot;roles&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;roles&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;Of the following roles, which would you consider to be your primary role when working on your web projects?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}&lt;/b&gt;  ({point.percent:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;Of the following roles, which would you consider to be your primary role when working on your web projects?&quot;,
          colorByPoint: true,
          description: &quot;blah&quot;,
          data: [
              {
                name: &quot;Front-end Developer&quot;,
                y: 413,
                percent: 45.84
              },
              {
                name: &quot;Full-stack Developer&quot;,
                y: 286,
                percent: 31.74
              },
              {
                name: &quot;Back-end Developer&quot;,
                y: 106,
                percent: 11.76
              },
              {
                  name: &quot;Designer&quot;,
                  y: 63,
                  percent: 6.99
              },
              {
                name: &quot;Other&quot;,
                y: 33,
                percent: 3.66
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;div id=&quot;experience&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;experience&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;How would you rate your experience level?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;b&gt;{point.y:.2f}&lt;/b&gt;  ({point.percent:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;&quot;,
          colorByPoint: true,
          description: &quot;&quot;,
          data: [
              {
                name: &quot;Advanced&quot;,
                y: 646,
                percent: 71.70
              },
              {
                name: &quot;Intermediate&quot;,
                y: 234,
                percent: 25.97
              },
              {
                name: &quot;Beginner&quot;,
                y: 21,
                percent: 2.33
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;In this survey, we asked a similar question regarding what type of projects that you
normally work on; but we added a new section to understand the reach of your largest
web project. More on why we asked this a bit later.&lt;/p&gt;
&lt;div id=&quot;typeOfWebProjects&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;typeOfWebProjects&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;What type of web project do you commonly work on?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}&lt;/b&gt;  ({point.percent:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;What type of web project do you commonly work on?&quot;,
          colorByPoint: true,
          description: &quot;&quot;,
          data: [
              {
                name: &quot;Web applications&quot;,
                y: 526,
                percent: 58.38
              },
              {
                name: &quot;Web sites&quot;,
                y: 209,
                percent: 23.20
              },
              {
                name: &quot;Enterprise LOB applications&quot;,
                y: 102,
                percent: 11.32
              },
              {
                name: &quot;Design Systems&quot;,
                y: 31,
                percent: 3.44
              },
              {
                name: &quot;Developer Frameworks&quot;,
                y: 20,
                percent: 2.22
              },
              {
                name: &quot;Other&quot;,
                y: 13,
                percent: 1.44
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;div id=&quot;howManyUsers&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;howManyUsers&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;How many users would you estimate visit your top web project per week?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;span&gt;{point.name}&lt;/span&gt;: &lt;b&gt;{point.y:.2f}&lt;/b&gt;  ({point.percent:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;How many users would you estimate visit your top web project per week?&quot;,
          colorByPoint: true,
          description: &quot;&quot;,
          data: [
              {
                name: &quot;1K - 10K&quot;,
                y: 204,
                percent: 24.70
              },
              {
                name: &quot;10K - 100K&quot;,
                y: 200,
                percent: 24.21
              },
              {
                name: &quot;100 - 1K&quot;,
                y: 141,
                percent: 17.07
              },
              {
                name: &quot;100K - 1M&quot;,
                y: 132,
                percent: 15.98
              },
              {
                name: &quot;1M - 100M&quot;,
                y: 76,
                percent: 9.2
              },
              {
                name: &quot;Less than 100&quot;,
                y: 53,
                percent: 6.42
              },
              {
                name: &quot;Great than 100M&quot;,
                y: 20,
                percent: 2.42
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;div id=&quot;estimatedProjectsFrameworks&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;estimatedProjectsFrameworks&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;How many estimated projects take a dependency on your framework or design system?&#39;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;b&gt;{point.y:.2f}&lt;/b&gt;  ({point.percent:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &quot;&quot;,
          colorByPoint: true,
          description: &quot;&quot;,
          data: [
              {
                name: &quot;10 - 100&quot;,
                y: 16,
                percent: 34.76
              },
              {
                name: &quot;100 - 1K&quot;,
                y: 9,
                percent: 19.57
              },
              {
                name: &quot;Less than 10&quot;,
                y: 8,
                percent: 17.39
              },
              {
                name: &quot;1K - 10K&quot;,
                y: 4,
                percent: 8.70
              },
              {
                name: &quot;100K - 1M&quot;,
                y: 4,
                percent: 8.70
              },
              {
                name: &quot;Greater than 1M&quot;,
                y: 4,
                percent: 8.70
              },
              {
                name: &quot;10K - 100K&quot;,
                y: 1,
                percent: 2.17
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;From this data we can adequately derive that we have a decent sampling across experience (although
fewer beginners than I&#39;d hope), project type and project scale. This is important
because we want to ensure that we’re taking everyone’s feedback into account. The person
working directly with React/Vue/Ember/Angular to build out their own &amp;lt;select&amp;gt;
replacement will have a completely different set of “wants” versus the users of those
components or developers using the built-in &amp;lt;select&amp;gt;.&lt;/p&gt;
&lt;h2&gt;&amp;lt;select&amp;gt;, oh, the lowly &amp;lt;select&amp;gt;&lt;/h2&gt;
&lt;p&gt;Jumping into the deep end of this, we asked what you found &lt;strong&gt;MOST&lt;/strong&gt;
frustrating when working with the &amp;lt;select&amp;gt; control, and I’ll admit I was kind
of surprised at the top one:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th class=&quot;align-left&quot;&gt;Frustration&lt;/th&gt;
      &lt;th style=&quot;width:&#39;10%&#39;&quot;&gt;%&lt;/th&gt;
      &lt;th style=&quot;width:&#39;10%&#39;&quot;&gt;Count&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to create a good user experience for searching within the list&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;27.43%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;186&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to style the &amp;lt;option&amp;gt; element to the extent that you needed to&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;17.85%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;121&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to style the default state (dropdown arrow, etc.)&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;14.01%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;95&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to style the pop-up window on desktop (e.g. the border, drop shadows, etc.)&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;11.36%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;77&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Insertion of content beyond simple text in the &amp;lt;select&amp;gt; control or its &amp;lt;option&amp;gt;s&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;11.21%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;76&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Insertion of arbitrary HTML content in an &amp;lt;option&amp;gt; element&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;7.82%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;53&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to create distinctive unselected/placeholder style and behavior&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;3.39%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;23&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Being able to generate new options from a large dataset while the popup is open&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;3.10%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;21&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to style the currently selected &amp;lt;option&amp;gt;(s) to the extent you needed to&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;1.77%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;12&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Not being able to style the pop-up window on mobile&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;1.03%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;7&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Being able to have the options automatically repeat on scroll (i.e., if you have an list of options 1 – 100, as you reach 100 rather than having the user scroll back to the top, have 1 show up below 100)&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;1.03%&lt;/td&gt;
      &lt;td class=&quot;align-center&quot;&gt;7&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;While it did surprise me that the top pain point was not “Being able to create a good
user experience for searching within the list”; the rest of it aligned with what I
would have expected. All of the questions above can fit into three different categories, by
placing them into their buckets it can further help us understand the category that will provide
the largest impact if solved.&lt;/p&gt;
&lt;div id=&quot;buckets&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;buckets&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 300,
      events: {
        load: function () {
          chart = this;
        }
      }
  },
  title: {
      text: &#39;Top frustrations of the built-in &amp;lt;select&amp;gt; put into buckets&#39;
  },
  subtitle: {
    text: &quot;From 679 unique votes&quot;
  },
  xAxis: {
      type: &#39;category&#39;
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      }
  },
  legend: {
      enabled: false
  },
  plotOptions: {
      series: {
          borderWidth: 0,
          dataLabels: {
              enabled: true,
              format: &#39;{point.y}&#39;
          }
      }
  },
  tooltip: {
      pointFormat: &#39;&lt;b&gt;{point.y}&lt;/b&gt; ({point.percent}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [
      {
          name: &#39;&#39;,
          colorByPoint: true,
          description: &quot;&quot;,
          data: [
              {
                name: &quot;Styling&quot;,
                y: 335,
                percent: 49
              },
              {
                name: &quot;Behavior &amp; extensibility&quot;,
                y: 215,
                percent: 32
              },
              {
                name: &quot;Content adjustments&quot;,
                y: 129,
                percent: 19
              }
          ]
      }
  ]
});
&lt;/script&gt;
&lt;p&gt;This is important for us to understand because each of these categories requires its own
investigation as there are numerous ways in which we could go about solving each of these
problems and their subsequent sub-problems. Take the top pain point for example of
“Being able to create a good user experience for searching within a list.” There are
many ways in which we can try and solve this problem, but the two that immediately
come to mind are the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new HTML control with search built-in and an improved develop UX for how the search behaves&lt;/li&gt;
&lt;li&gt;Provide extensibility of the built in &amp;lt;select&amp;gt; so that the web developer
can insert their own “searching component”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We could do one of them, we could do both, or we could do something else; but I say this merely
to point out that the searching issue itself will need to be investigated to ensure that we
create something that will be used and cover the majority of use cases.&lt;/p&gt;
&lt;p&gt;Looking at the categories of issues, we understand the largest area of frustration is
styling. But let’s try to get an understanding of end user impact. As you may recall from the
previous survey results; one of the reasons we&#39;re wanting to solve this problem is to improve both the
developer experience &lt;strong&gt;AND&lt;/strong&gt; the user experience.&lt;/p&gt;
&lt;p&gt;Here&#39;s a breakdown of the top 5 frustrations pivoted on estimated weekly user visits to a given
web project.&lt;/p&gt;
&lt;div id=&quot;limitationUsers&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;limitationUsers&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 500,
      events: {
        load: function () {
          chart = this;
        }
      },
      inverted: true
  },
  title: {
      text: &#39;Top 5 frustrations with the built-in &amp;lt;select&amp;gt; based on estimated user visits&#39;
  },
  subtitle: {
    text: &#39;Pivoted on estimated weekly users of web site or web application | 640 unique votes&#39;
  },
  xAxis: {
      labels: {
        style: {
          textOverflow: &#39;none&#39;
        }
      },
      categories: [
        &quot;Searching &amp;lt;options&amp;gt;(s)&quot;,
        &quot;Non-text content in &amp;lt;option&amp;gt;(s)&quot;,
        &quot;Styling &amp;lt;option&amp;gt;(s)&quot;,
        &quot;Styling &amp;lt;select&amp;gt; default button/arrow&quot;,
        &quot;Styling pop-up window on desktop&quot;,
      ]
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      },
      stackLabels: {
        enabled: true,
        style: {
            fontWeight: &#39;bold&#39;
        }
    }
  },
  legend: {
      align: &#39;center&#39;,
      verticalAlign: &#39;bottom&#39;,
      floating: false,
      borderColor: &#39;#CCC&#39;,
      borderWidth: 1,
      shadow: false
  },
  plotOptions: {
      column: {
          stacking: &#39;normal&#39;
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;b&gt;{point.y}&lt;/b&gt; ({point.percentage:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [{
        name: &#39;&lt; 100&#39;,
        data: [11, 7, 4, 4, 5]
    }, {
        name: &#39;100 - 1K&#39;,
        data: [34, 24, 14, 18, 9]
    }, {
        name: &#39;1K - 10K&#39;,
        data: [52, 27, 31, 18, 19]
    },
    {
      name: &#39;10K - 100K&#39;,
      data: [42, 32, 28, 24, 15]
    },
    {
      name: &#39;100K - 1M&#39;,
      data: [25, 16, 23, 12, 13]
    },
    {
      name: &#39;1M - 100M&#39;,
      data: [16, 12, 12, 7, 4]
    },
    {
      name: &#39;&gt; 100M&#39;,
      data: [2, 3, 2, 3, 2]
    }
  ]
});
&lt;/script&gt;
&lt;p&gt;What I find interesting about this is if you click the legend items for the various
segments the priorities slightly adjust. For example, the top pain points for projects
with greater than 100 million visitors per week is styling the default &amp;lt;select&amp;gt; arrow/button
and inserting non-text based content into &amp;lt;option&amp;gt; elements.&lt;/p&gt;
&lt;p&gt;And since we know that frameworks and design systems have a broad reach as well,
let&#39;s look at their breakdown as well:&lt;/p&gt;
&lt;div id=&quot;limitationFrameworks&quot;&gt;&lt;/div&gt;
&lt;script&gt;
Highcharts.chart(&#39;limitationFrameworks&#39;, {
  chart: {
      type: &#39;column&#39;,
      height: 500,
      events: {
        load: function () {
          chart = this;
        }
      },
      inverted: true
  },
  title: {
      text: &#39;Top 5 frustrations with the built-in &amp;lt;select&amp;gt; based on estimated projects taking dependancy on framework or design system&#39;
  },
  subtitle: {
    text: &#39;37 unique votes&#39;
  },
  xAxis: {
      labels: {
        style: {
          textOverflow: &#39;none&#39;
        }
      },
      categories: [
        &quot;Styling pop-up window on desktop&quot;,
        &quot;Styling &amp;lt;select&amp;gt; default button/arrow&quot;,
        &quot;Non-text content in &amp;lt;option&amp;gt;(s)&quot;,
        &quot;Styling &amp;lt;option&amp;gt;(s)&quot;,
        &quot;Searching &amp;lt;options&amp;gt;(s)&quot;
      ]
  },
  yAxis: {
      title: {
          text: &#39;Count&#39;
      },
      stackLabels: {
        enabled: true,
        style: {
            fontWeight: &#39;bold&#39;
        }
    }
  },
  legend: {
      align: &#39;center&#39;,
      verticalAlign: &#39;bottom&#39;,
      floating: false,
      borderColor: &#39;#CCC&#39;,
      borderWidth: 1,
      shadow: false
  },
  plotOptions: {
      column: {
          stacking: &#39;normal&#39;
      }
  },
  tooltip: {
      headerFormat: &#39;&lt;span style=&quot;font-size:11px&quot;&gt;{series.name}&lt;/span&gt;&lt;br&gt;&#39;,
      pointFormat: &#39;&lt;b&gt;{point.y}&lt;/b&gt; ({point.percentage:.2f}%)&lt;br/&gt;&#39;
  },
  credits: {
    text: &quot;Source: gwhitworth.com&quot;,
    href: &quot;https://gwhitworth.com&quot;,
    position: {
      x: -30
    }
  },
  series: [{
        name: &#39;&lt; 10&#39;,
        data: [3, 1, 0, 2, 0]
    }, {
        name: &#39;10 - 100&#39;,
        data: [4, 4, 3, 3, 0]
    }, {
        name: &#39;100 - 1K&#39;,
        data: [1, 2, 3, 0, 2]
    },
    {
      name: &#39;1K - 10K&#39;,
      data: [0, 1, 1, 0, 1]
    },
    {
      name: &#39;10K - 100K&#39;,
      data: [0, 0, 0, 1, 0]
    },
    {
      name: &#39;100K - 1M&#39;,
      data: [1, 1, 0, 1, 0]
    },
    {
      name: &#39;&gt; 1M&#39;,
      data: [1, 0, 1, 0, 0]
    }
  ]
});
&lt;/script&gt;
&lt;p&gt;I found this interesting as well due to the fact that the top pain point overall is not
searching the select. All of the pain points above that, by a decent margin, is about
styling and non-text based content in &amp;lt;option&amp;gt; elements.&lt;/p&gt;
&lt;h2&gt;Most commonly used dropdowns&lt;/h2&gt;
&lt;p&gt;We provided images of a variety of &amp;lt;select&amp;gt; and dropdown components from across
the web, and all of them help hint to the above buckets of issues. This also
allows us to get a general understanding of the more common use cases to ensure that
we’re prioritizing the most impactful work up front. Here were the top five selected
dropdowns that respondents said they use the most often in their web projects:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://gwhitworth.com/static/images/blog/2019/10/top5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Of the top five used, the following can be derived:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All of them will need complete styling of everything of the control&lt;/li&gt;
&lt;li&gt;Three of the five will require the capability to insert non-text content&lt;/li&gt;
&lt;li&gt;One of them will require behavior and interactions among sub parts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As we can see, there are many areas within each of these buckets that we&#39;ll need to
investigate; but these provide us with a good understanding of what web developers and
designers should be able to build using the improved &amp;lt;select&amp;gt; or they won&#39;t use it.&lt;/p&gt;
&lt;h2&gt;Overloading &amp;lt;select&amp;gt;&lt;/h2&gt;
&lt;p&gt;Some folks correctly noted that some of the &amp;lt;select&amp;gt; options that could
be chosen were not something they would consider to be a semantic &amp;lt;select&amp;gt;.
And I can buy that argument, but one thing we’re trying to do in this is to not
assume anything with regards to this content. If you look at popular design
frameworks across the web, some of the most popular do not have a &amp;lt;select&amp;gt; component
but a dropdown component that can be modified to either be a select, or even more
complex than that. As such, we’re wanting to understand this further.&lt;/p&gt;
&lt;p&gt;This does not imply that we’ll be advocating for web developers to utilize the
improved &amp;lt;select&amp;gt; element for generic dropdown containers. This information though
can inform a new component that does have a basic semantic meaning but provides a lot
of the same functionality that a &amp;lt;select&amp;gt; contains since the user experience of a &amp;lt;select&amp;gt;
control and dropdown are so similar.&lt;/p&gt;
&lt;h2&gt;Any additional thoughts?&lt;/h2&gt;
&lt;p&gt;The final question we asked is if there were any additional thoughts, below are a few that
I found interesting and my initial thoughts around them.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Expose a “toggle” event or “open”/“close”...&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a great point, and based on styles being one of the top requests I foresee us needing
some solution for this, but we&#39;ll need to look into the primary use-cases for this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Introduce a dropdown element separate from the form semantics, which can be used for various purposes.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Completely agree, as I tried to portray in the section above this is why I added in some examples that
aren&#39;t necessarily semantic &amp;lt;select&amp;gt; controls since the user experience overall is so similar. This
is probably something we&#39;ll do.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;One thing that I&#39;ve found very hard when rolling my own is positioning in a manner that doesn&#39;t take the dropdown out of the canvas. Maybe something that automatigally makes the dropdown go to where there is space would be super helpful (as the native select already does)&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I love that this was raised. I can say up front, that any &amp;lt;select&amp;gt; control that is built will have that
same positional awareness. That said, we&#39;ve been discussing if we should potentially explore API solutions in
addition to the primary pain points to make a solution for this easier. As noted though (I&#39;m beginning to sound like a broken record),
that will need it&#39;s own investigation and probably won&#39;t block on the other work we do. Another one that
fits into this bucket is how the built-in &amp;lt;select&amp;gt; always renders on top of all content. At any rate,
we&#39;ll keep looking into these areas and will reach out to ensure that we&#39;re solving the right problems
&lt;strong&gt;in the right way&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Next Steps&lt;/h2&gt;
&lt;p&gt;We’ll begin peeling the onion of styling a &amp;lt;select&amp;gt;. We
first need to understand the current reasoning of browsers in why they limit the
styling of the &amp;lt;select&amp;gt;.&lt;/p&gt;
&lt;p&gt;One reason we’re already aware of is that desktop based &amp;lt;select&amp;gt;
elements are able to escape the browser UI. Keeping this and still
offerring complete styling isn&#39;t possible as it introduces a security risk. Because of this we&#39;ll
want to first understand how important this capability is to end users and
compare that with limitations this capability
creates for web developers, which ultimately impacts end users as well.
We&#39;ll be adding telemetry to get an understanding of how common this is hit by end users,
I&#39;ll share that data at a later date.&lt;/p&gt;
&lt;h2&gt;Want to help out or keep track of progress?&lt;/h2&gt;
&lt;p&gt;We know form controls have long been a pain point for web developers and we’d
love for you to give us your feedback as we go down this road. We’ll be
working in the &lt;a href=&quot;https://github.com/WICG/open-ui/tree/master/platform&quot;&gt;OpenUI&lt;/a&gt; repo on
these investigations and as we begin creating
proposals for new APIs, we’ll begin initial feedback and incubation there.&lt;/p&gt;
&lt;p&gt;Also make sure to follow me (&lt;a href=&quot;https://twitter.com/gregwhitworth&quot;&gt;@gregwhitworth&lt;/a&gt;) and
Nicole Sullivan (&lt;a href=&quot;https://twitter.com/stubbornella&quot;&gt;@stubbornella&lt;/a&gt;) on
twitter as we keep people updated on the progress of this work.&lt;/p&gt;
&lt;div class=&quot;highlight highlight-with-icon&quot;&gt;
    &lt;img src=&quot;https://gwhitworth.com/static/images/icons8-graph-report-64.png&quot; alt=&quot;graph image&quot; /&gt;
    &lt;p&gt;&lt;a href=&quot;https://gwhitworth.com/surveys/select&quot;&gt;Click here&lt;/a&gt; to view the full survey results&lt;/p&gt;
&lt;/div&gt;</content>
  </entry>
  
  <entry>
    <title>Please don&#39;t stick to tech</title>
    <link href="https://gwhitworth.com/posts/2020/please-dont-stick-to-tech/"/>
    <updated>2020-03-09T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2020/please-dont-stick-to-tech/</id>
    <content type="html">&lt;p&gt;I was about 11 years old when I took my first crack at working with web technology. I can still recall the simple pleasure of inserting some markup and create something unique to my little corner of the web. At that point I wasn&#39;t really allowed to &amp;quot;surf&amp;quot; the web but did manage to get a few tips from my brother and some recycled printed out sections from the &lt;a href=&quot;https://www.htmlgoodies.com/&quot;&gt;HTML Goodies&lt;/a&gt; website. I&#39;d finally get my hands on a &lt;a href=&quot;https://www.amazon.com/HTML-Goodies-2nd-Burns-Ph-D/dp/0789726114&quot;&gt;printed version&lt;/a&gt; of the 1st edition by Joe Burns from a school library a few years later and it greatly improved my web learning experience..&lt;/p&gt;
&lt;p&gt;That is one thing that I&#39;ve always loved about this industry, the willingness of smart and talented people that spend their time creating content to share them to teach others. These same people that are so willing to provide these insights often are requested to leave their personal opinions aside, or to put it another way, &amp;quot;Stick to tech.&amp;quot;&lt;/p&gt;
&lt;h2&gt;&amp;quot;Stick to Tech&amp;quot;&lt;/h2&gt;
&lt;p&gt;I recall being very frustrated by &lt;a href=&quot;https://twitter.com/LeaVerou/&quot;&gt;Lea Verou&lt;/a&gt; feeling the need to &lt;a href=&quot;https://twitter.com/LeaVerou/status/157125146501578752&quot;&gt;tweet&lt;/a&gt; her frustrations of how &amp;quot;people like to hear your tech tips but want to shut you up when it comes to other matters.&amp;quot; We all know it to be true, but it is very hard to separate your personal and professional lives, but many people seem to have an expectation of this. This distinction is especially true for those who are underrepresented in their industry and are the target of bias.&lt;/p&gt;
&lt;p&gt;When &lt;a href=&quot;https://twitter.com/shanselman&quot;&gt;Scott Hanselman&lt;/a&gt; had a similar statement told to him he made a very clear and important &lt;a href=&quot;https://twitter.com/shanselman/status/478578630964957184&quot;&gt;point&lt;/a&gt; that I&#39;d like to re-iterate, &amp;quot;When following someone on Twitter, follow the whole person, their diverse interests, and their life. Not just the topic they&#39;re known for.&amp;quot;&lt;/p&gt;
&lt;p&gt;We&#39;re an industry built on tutorials and learning from one another when it comes to designing or programming; so why should these learnings be limited to tech? There are many things that we can learn from one another by encouraging the sharing of diverse viewpoints on a broad range of topics: race, religion, sexual orientation, politics, personal passions or general life? By trying to constrain someone to single topic you are not only limiting the potential for you to grow but also the potential for someone else.&lt;/p&gt;
&lt;h2&gt;I can&#39;t imagine&lt;/h2&gt;
&lt;figure class=&quot;right&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2020/rachel-dad-400.jpg&quot; alt=&quot;Greg with his daughter Rachel in the warm summer&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;I say all this because these words that are spoken or written can be powerful tools to improve our industry, possibly beyond, and help others that are dealing with the same situations. I learned this most recently in the loss of my thirteen-year-old daughter. In 2014, I saw a &lt;a href=&quot;https://twitter.com/meyerweb/status/475423495178838016&quot;&gt;tweet&lt;/a&gt; by Eric Meyer informing his twitter followers that his little girl, Rebecca, had passed away. All I could muster was &amp;quot;So, so sorry Eric.&amp;quot;&lt;/p&gt;
&lt;p&gt;I felt as though I knew Eric and Rebecca even though, at the time, I had never met either of them because Eric chronicled that rough journey and still does to this day on his &lt;a href=&quot;https://meyerweb.com/eric/thoughts/category/personal/rebecca/&quot;&gt;blog&lt;/a&gt;. I remember telling my wife that I can&#39;t imagine living through what Eric and his family were going through.&lt;/p&gt;
&lt;p&gt;When my daughter was diagnosed with brain cancer in 2018, my wife and I discussed how to keep the many people inquiring about Rachel and the family informed with as little burden on us as possible. I brought up Eric&#39;s raw honesty and view into the journey and the impact that it had on me and many others and we agreed that we should go the same route.&lt;/p&gt;
&lt;p&gt;Through this journey, we&#39;ve received many responses, similar to what I saw Eric receive during his journey and we are very glad that we shared Rachel&#39;s story as it has likewise had a positive impact on others.&lt;/p&gt;
&lt;p&gt;Now, with her passing and we begin to figure out how to live life without her I find myself re-reading these lines from Eric&#39;s blog post, &amp;quot;&lt;a href=&quot;https://meyerweb.com/eric/thoughts/2019/06/07/half-a-decade/&quot;&gt;Half a decade&lt;/a&gt;&amp;quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;quot;Being used to this hurts, when I think about it.  So I try not to think about it, and that hurts too.  Not like a sword through the heart, not like unending fire, more like a dull ache.  My aging body is starting to produce more and more of those.  I resent it for living years beyond what Rebecca got.  Snarl at reality for offering no way to give my years to her.&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now being on this side of: having her laughing in my room; saying, &amp;quot;Thank you daddy;&amp;quot; apologizing for being up at all hours of the night vomiting; not having the energy to walk downstairs; play with her puppy; or playing a game of connect four I can say with certainty that I truly couldn&#39;t imagine this pain. But I know that I am so incredibly thankful to Eric for sharing his journey with Rebecca with us so that I could have some words of wisdom to use in my struggle neither of us knew I would walk when he wrote those words.&lt;/p&gt;
&lt;h2&gt;Share un-apologetically&lt;/h2&gt;
&lt;p&gt;I know this probably comes off as obvious to many of you, but since I continue to see people asking or generous tech folks lamenting being told to &amp;quot;&lt;a href=&quot;https://twitter.com/search?q=%22stick%20to%20tech%22&amp;amp;src=typed_query&quot;&gt;stick to tech&lt;/a&gt;&amp;quot; (this search doesn&#39;t capture the other ways in which people request this) I figured I&#39;d follow my own thinking and share my story.&lt;/p&gt;
&lt;p&gt;Much like Eric, we all have our own journeys that we can share, and they are filled with all manner of ups and downs. We never know who will benefit from sharing our stories so share them boldly and un-apologetically as they will have an impact and &lt;strong&gt;will&lt;/strong&gt; help make our industry better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please, don&#39;t stick to tech.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Special thanks to Melanie Richards, Lea Verou, Eric Meyer and Scott Hanselman for their review and feedback&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Thoughts on a Global Design System</title>
    <link href="https://gwhitworth.com/posts/2024/my-thoughts-on-global-design-system/"/>
    <updated>2024-07-08T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2024/my-thoughts-on-global-design-system/</id>
    <content type="html">&lt;h2&gt;Practical steps to make it a reality&lt;/h2&gt;
&lt;p&gt;After sipping a drink filled with caffeine and cracking my knuckles I&#39;m prepared to author my first blog post on this dusty site in over four years. A lot has happened in that time but before I turn this introduction into one that resembles the ramblings of a recipe site; I&#39;ll smoothly transition from my lack of writing to the purpose of this post. As the title alludes, I will be outlining my thoughts on the feasibility of a Global Design System which was reinvigorated by Brad Frost in his post &lt;em&gt;&lt;a href=&quot;https://bradfrost.com/blog/post/a-global-design-system/&quot;&gt;A global design system&lt;/a&gt;&lt;/em&gt;. If you haven&#39;t read this post I recommend it.&lt;/p&gt;
&lt;p&gt;As I was reading Brad&#39;s post it reminded me of a key goal when we initially proposed Open UI. Heck, here is a design in the early pitch deck:&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2024/original-open-ui-gds-pitch.png&quot; alt=&quot;Graphic that shows all of the specifications that developers and designers use and how Open UI will bring them together and then back.&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;Granted, Brad&#39;s version of it is far prettier than mine but it articulates the same problem overall:&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2024/brad-frosts-gds-graphic.png&quot; alt=&quot;Graphic that shows a circle with Global Design System and then its use within a lot of other design systems represented by other circles&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;The Open UI Community group resolved that the group should work on a Global Design System via a new dedicated work-stream. This blog post aims to tackle some key questions as to try our best to ensure we do not waste anyone&#39;s time by becoming another example of &lt;a href=&quot;https://xkcd.com/927/&quot;&gt;XKCD 927&lt;/a&gt; where we produce another standard.&lt;/p&gt;
&lt;p&gt;I agree with others that the best way to do this is to provide the web community with something that is tangible which requires us to go beyond documents. Granted, the documents that outline the parts, accessibility, internationalization, behaviors, base styles, and variations are important; but we want that work to be realized through utilization.&lt;/p&gt;
&lt;h2&gt;Aligning on definitions and Open UI scope&lt;/h2&gt;
&lt;p&gt;Before I jump into how I think Open UI can help facilitate a Global Design System I think it&#39;s important to outline what constitutes a design system and what Open UI&#39;s scope may take.&lt;/p&gt;
&lt;h3&gt;What is a design system?&lt;/h3&gt;
&lt;p&gt;I&#39;ve seen a lot of blog posts that articulate what a design system is and they &lt;em&gt;can&lt;/em&gt; vary wildly but I find &lt;a href=&quot;https://www.figma.com/blog/design-systems-101-what-is-a-design-system/&quot;&gt;Figma&#39;s&lt;/a&gt; to be the most succint and encapsulates what I&#39;ve seen in the wild.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At its core, a design system is a set of building blocks and standards that help keep the look and feel of products and experiences consistent. Think of it as a blueprint, offering a unified language and structured framework that guides teams through the complex process of creating digital products.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;What building blocks should Open UI produce&lt;/h3&gt;
&lt;p&gt;The following graphic by Rohan Kamath in his post &lt;a href=&quot;https://blog.kamathrohan.com/atomic-design-methodology-for-building-design-systems-f912cf714f53&quot;&gt;&lt;em&gt;Atomic Design methodology for building design systems&lt;/em&gt;&lt;/a&gt;, does a great job showing the broad spectrum that a design system can define and potentially produce for utilization.&lt;/p&gt;
&lt;p&gt;A design system can cover defining sub-atomic items (eg: spacing, colors, typography), molecules (eg: an email component that includes both the label and input and relative styles) to complete pages (layout of the page, component placement, styles, etc).&lt;/p&gt;
&lt;figure class=&quot;center&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/2024/parts-of-a-design-system.png&quot; alt=&quot;Graphic that shows sub-atomic, atomic, molecules, organisms to pages.&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;HTML primarily &lt;em&gt;focuses&lt;/em&gt; on sub-atomic and atoms. I think that Open UI should define from sub-atomic to molecules.&lt;/p&gt;
&lt;h2&gt;What&#39;s the value of this?&lt;/h2&gt;
&lt;p&gt;It&#39;s worth noting that Open UI has been doing some of this with the improvements to the &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element and the &lt;code&gt;popover&lt;/code&gt; primitive (&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/popover&quot;&gt;MDN docs&lt;/a&gt; - use it today!). Many of the discussions on these items were about expected end-user experience, styles and accessibility requirements.&lt;/p&gt;
&lt;p&gt;However, the Global Design System blueprints that will be authored should be able to be authored in any language, with a browser implementation being one implementation rather than the &lt;em&gt;only&lt;/em&gt; implementation. It is important to note that there will be some items that land in this work-stream that may never find its way into HTML, and that&#39;s ok. A good example of this was the &lt;a href=&quot;https://github.com/openui/open-ui/issues/139&quot;&gt;discussion&lt;/a&gt; we had around the potential of a &lt;code&gt;skeleton&lt;/code&gt; element. We ultimately aligned that while this was very common across the industry the variations are broad and that has implications on the what accessibility changes are applied; and so baking this into the web platform wasn&#39;t the right path forward.&lt;/p&gt;
&lt;p&gt;This work-stream within Open UI will provide a blue-print that defines the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accessibility&lt;/li&gt;
&lt;li&gt;Internationalization&lt;/li&gt;
&lt;li&gt;Privacy&lt;/li&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;li&gt;User experience for different input modalities&lt;/li&gt;
&lt;li&gt;Default base styling&lt;/li&gt;
&lt;li&gt;Default events&lt;/li&gt;
&lt;li&gt;Variations&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Value&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another value that this work-stream can provide is by increasing adoption of primitives, elements and other solutions produced by the current Open UI work-stream. Additionally, as components and controls are created we can make proposals for new primitives and elements based on utilization to create a fly-wheel between the two works-streams.&lt;/p&gt;
&lt;h2&gt;Possible solutions to move this forward&lt;/h2&gt;
&lt;p&gt;I believe there are two different approaches to enable a Global Design System and they are &lt;strong&gt;not&lt;/strong&gt; mutually exclusive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Testing solution&lt;/strong&gt;: Will enable any component library determine adherence to the blueprint&#39;s defined by Open UI (&lt;a href=&quot;https://wpt.fyi/&quot;&gt;similar to web platform tests&lt;/a&gt;). This will allow component libraries to be implemented in other languages but leverage the research and resolutions provided by Open UI in a tangible way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Component Library&lt;/strong&gt;: Produce a component library that adheres to Open UI blueprints that can be consumed by web developers and even other component libraries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have had discussions with a few people regarding both of the options above and &lt;strong&gt;I&lt;/strong&gt; think it makes the most sense to tackle the Component Library first. The reason for this is that I think it&#39;s the most pragmatic in the short term. There are some large component library authors interested in up-streaming their solution to become the foundation for this component library.&lt;/p&gt;
&lt;p&gt;No matter what solution we go after, I don&#39;t think that the Open UI work-stream will or should strive for solving 100% of use-cases for a control or component; but we should aim for solving 80% of them. As Brian Kardell put it recently (I&#39;m paraphrasing), &amp;quot;It will be hard to create one tab component to meet every usecase.&amp;quot;&lt;/p&gt;
&lt;p&gt;In order to move forward with a component library I&#39;ve put together the following list of principles:&lt;/p&gt;
&lt;h3&gt;Component library principles&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Ships as web components. This does not preclude Open UI from including a library that help facilitate abstractions, utility methods or polyfills&lt;/li&gt;
&lt;li&gt;Meets W3C &lt;a href=&quot;https://www.w3.org/copyright/intellectual-rights/&quot;&gt;Intellectual Rights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run as an Open Source solution. This does NOT mean that there will not be consensus driven resolutions as key topics will be brought to the Open UI CG telecon for resolution but many of the capabilities should be able to land within a PR with asynchronous review.&lt;/li&gt;
&lt;li&gt;Align implementations with Open UI global design system blueprints&lt;/li&gt;
&lt;li&gt;Adopts Open UI primitives as they become available for increased adoption and feedback&lt;/li&gt;
&lt;li&gt;Has decent adoption and web developer/designer community support (monetary funding is a positive but not required)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Testing Framework Principles&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Needs to be framework agnostic&lt;/li&gt;
&lt;li&gt;Everything in component library principles section&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Next steps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Land on foundation for a component library in a new repository within the Open UI Github organization&lt;/li&gt;
&lt;li&gt;Define working model for this work-stream that increases engagement/contributions from developers, designers and spec editors&lt;/li&gt;
&lt;li&gt;Outline success metrics and begin working towards alpha version with a clear roadmap&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Let&#39;s get started&lt;/h2&gt;
&lt;p&gt;I&#39;m excited to get this going as I think this approach will enable us to increase velocity through incubation and I can&#39;t wait to work with you all on this project. As things progress I&#39;ll keep updates coming here which hopefully won&#39;t be in another four years. Alright, that&#39;s enough typing; I need some more caffeine. Talk to you all later.&lt;/p&gt;
&lt;p&gt;If you have read this far, please feel free to let me know your thoughts on &lt;a href=&quot;https://x.com/gregwhitworth&quot;&gt;Twitter&lt;/a&gt; (sorry I can&#39;t seem to call it X yet) or on our &lt;a href=&quot;https://discord.com/channels/714891843556606052/1216793626290421814&quot;&gt;Global Design System channel&lt;/a&gt; in the Open UI Discord server.&lt;/p&gt;
&lt;p class=&quot;note subtle&quot;&gt;Special thanks to Brad Frost for review of this post&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Stylable select is here!</title>
    <link href="https://gwhitworth.com/posts/2025/styleable-select-is-here/"/>
    <updated>2025-06-14T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2025/styleable-select-is-here/</id>
    <content type="html">&lt;p&gt;For years, web developers and designers have grappled with the elusive beast that is the HTML &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; element. It’s a foundational aspect of the web, yet one that has caused countless headaches due to its stubborn resistance to style it, insert more complex content (even images), and extensibility. But I&#39;m thrilled to share that, thanks to years of dedicated effort across the community, the tide is finally turning. A truly stylable and extensible &lt;code&gt;select&lt;/code&gt; is no longer a distant dream – it&#39;s here!&lt;/p&gt;
&lt;h2&gt;The Long and Winding Road: A History of Styling Frustration&lt;/h2&gt;
&lt;p&gt;Cast your mind back to 2019, the web development landscape was buzzing with innovation, yet the humble &lt;code&gt;&amp;lt;select&amp;gt;&lt;/code&gt; remained a relic. Back then, I conducted a &lt;a href=&quot;https://www.gwhitworth.com/posts/2019/form-controls-components/&quot;&gt;survey&lt;/a&gt; that really highlighted the pain points. The top frustrations? Hands down, it was the styling limitations. Developers and designers were tearing their hair out trying to make selects look consistent across browsers and match their brand&#39;s aesthetic. Beyond that, creating a good user experience for searching within long lists and inserting non-text content into options was a constant battle.&lt;/p&gt;
&lt;p&gt;The core problem was deeply rooted in how browsers rendered the &lt;code&gt;select&lt;/code&gt;. They limited styling significantly, making it incredibly difficult to achieve a custom look without resorting to complex JavaScript workarounds that often sacrificed accessibility and performance. It was a clear call to action: we needed improvements to this fundamental control to enhance both the developer and user experience. In that same year; Nicole Sullivan and I &lt;a href=&quot;https://youtu.be/ZFvPLrKZywA&quot;&gt;gave a talk&lt;/a&gt; at the Chrome Dev Summit outlining these gaps and our plans to try and address it and formally announcing the &lt;a href=&quot;https://open-ui.org/&quot;&gt;Open UI Community Group&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How It all works and examples; Una&#39;s talk at Google I/O&lt;/h2&gt;
&lt;p&gt;So, how did we get from that state of frustration to today&#39;s reality? A significant part of the journey involves groundbreaking work on new web UI primitives. As Una highlighted in her &lt;a href=&quot;https://io.google/2025/explore/pa-keynote-15&quot;&gt;&amp;quot;What&#39;s new in web UI&amp;quot;&lt;/a&gt; talk at Google I/O, standards bodies and browser implementers have focused on simplifying notoriously tricky UI patterns.&lt;/p&gt;
&lt;p&gt;Features like the &lt;strong&gt;Popover API&lt;/strong&gt; and &lt;strong&gt;Anchor Positioning&lt;/strong&gt; are game-changers. The Popover API, now widely available, makes it incredibly easy to create overlay elements like dropdowns, handling all the complex lifecycle, focus, and dismiss behaviors natively. No more wrestling with JavaScript for basic dropdown functionality! Anchor Positioning, which is expected to be in all browsers by the end of 2025, allows you to declaratively tether elements together, automatically handling edge collisions – a dream for precisely positioning popovers relative to their triggers.&lt;/p&gt;
&lt;p&gt;Crucially, native styling for &lt;code&gt;select&lt;/code&gt; elements has reached stable release in Chromium 134. This means extensive control over styling dropdowns, options, and even check marks. With new properties like &lt;code&gt;appearance: base-select&lt;/code&gt; and the &lt;code&gt;::picker()&lt;/code&gt; pseudo-element, developers finally have the CSS hooks they&#39;ve craved for years. This isn&#39;t just about making things &lt;em&gt;look&lt;/em&gt; pretty; it&#39;s about making them truly part of your design system, accessible, and performant, all without the heavy JavaScript tax.&lt;/p&gt;
&lt;h2&gt;Open UI&#39;s Impact: Fostering Primitives and Unlocking Possibilities&lt;/h2&gt;
&lt;p&gt;The progress we&#39;ve seen with &lt;code&gt;select&lt;/code&gt; is a testament to the collaborative spirit within the web community, particularly through the Open UI community group. Open UI, working closely with the CSS Working Group (CSSWG) and the Web Hypertext Application Technology Working Group (WHATWG), has been instrumental in fostering improvements in core primitives. This journey did not go as quickly as I had hoped but I&#39;ll save that for another post. Open UI is now incubating expanded &lt;a href=&quot;https://open-ui.org/components/future-invokers.explainer/&quot;&gt;invoker commands&lt;/a&gt; which is a generalized solution akin to &lt;code&gt;popover&lt;/code&gt; of binding interactive functionality declaratively.&lt;/p&gt;
&lt;p&gt;The group is not stopping at &lt;code&gt;select&lt;/code&gt;; we&#39;re actively looking into the &lt;a href=&quot;https://open-ui.org/components/enhanced-range-input.explainer/&quot;&gt;Enhanced Range Input&lt;/a&gt; in parrallel with the great work happening on styling of &lt;a href=&quot;https://drafts.csswg.org/css-forms-1/&quot;&gt;form control styling in the CSSWG&lt;/a&gt; that will enable the extensibility and scenarios that styling alone will not enable. Also a new &lt;a href=&quot;https://open-ui.org/components/menu.explainer/&quot;&gt;menu elements&lt;/a&gt; of &lt;code&gt;menulist&lt;/code&gt;, &lt;code&gt;menubar&lt;/code&gt;, and &lt;code&gt;menuitem&lt;/code&gt; elements due to concerns of &lt;code&gt;popover&lt;/code&gt; being used for menu scenarios. There is a lot more amazing work happening in the group and I&#39;m thrilled at the communities growth and role in pushing the web forward.&lt;/p&gt;
&lt;h2&gt;It&#39;s been a journey, thank you to everyone involed&lt;/h2&gt;
&lt;p&gt;The journey to a stylable &lt;code&gt;select&lt;/code&gt; has been a long one, marked by numerous iterations, a lot of feedback, compromises on the final shape but not only is it finally here but the platform has also gained awesome primitives that support UI solutions beyond &lt;code&gt;select&lt;/code&gt;. This is an exciting time for web UI development. One of the key things that I am excited about is that we now have an understanding of how we should land these in the platform. I am excited to see what everyone builds with these and I can&#39;t wait to close out the UI toolkit built in to the platform. With these new tools, developers can build more robust, accessible, and beautiful form controls with greater ease than ever before. &lt;strong&gt;It&#39;s not just about making &lt;code&gt;select&lt;/code&gt; pretty; it&#39;s about making the web a better place for everyone.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Special thanks to Mason Freed and Una Kravets for their review :)&lt;/em&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <title>Happy 20th Rach</title>
    <link href="https://gwhitworth.com/posts/2026/happy-birthday-rachel/"/>
    <updated>2026-03-24T00:00:00Z</updated>
    <id>https://gwhitworth.com/posts/2026/happy-birthday-rachel/</id>
    <content type="html">&lt;figure class=&quot;right&quot;&gt;
  &lt;img src=&quot;https://gwhitworth.com/static/images/blog/rachel-stuffed-animal.png&quot; alt=&quot;Rachel cuddling a stuffed puppy dog&quot; /&gt;
&lt;/figure&gt;
&lt;p&gt;I struggle with the words. I say that every year and at this point it will probably be in every post where I try to convey my thoughts to you.&lt;/p&gt;
&lt;p&gt;Twenty. I truly can&#39;t believe it; it feels just like yesterday that the nurses brought in a fancy dinner to celebrate your birth.&lt;/p&gt;
&lt;p&gt;Matt graduates this year, which is also shocking, and I think you&#39;d be really pleased with what he&#39;s interested in persuing. He&#39;s also gotten into working on vehicles the past
few years; it&#39;s been fun watching him lean into that passion. I&#39;m sure he&#39;d love to take you for a ride in his car with the top down, even if he initially protested.&lt;/p&gt;
&lt;p&gt;Corn is a treasure; I know that you know that but figured you&#39;d like to know he&#39;s such a delightful reminder of your remarkable disposition and mirrors your friendly,
compassionate and loving traits. Mom and I laugh, every night I go to cuddle with her and I say it out loud and no matter where he is he gets up and comes and lays
right next to her and stares at me. It&#39;s hilarious.&lt;/p&gt;
&lt;p&gt;We&#39;ve been going camping a lot lately and we even did a fire lookout last year; the scientist in you would love these adventures. Even Corn understands the word &amp;quot;adventure&amp;quot; and
we talk about how he&#39;ll get to be a wolf for a few days. He prances around like he owns the mountain even though he&#39;s about the size of a rabbit.&lt;/p&gt;
&lt;p&gt;Mom is amazing at every turn; which should come as no surprise. If she&#39;s not designing a new innovation for her truck, helping search and rescue, digging up dinosaurs, or helping the local Rivian club that she&#39;s on the board for she&#39;s rock-hounding or helping clear trails for hikers and other outdoor enthusiasts. There is nothing truly that she can&#39;t do
and you would be so proud of her.&lt;/p&gt;
&lt;p&gt;Given that; it&#39;s hard not to think about what you would be doing with your life.I struggle to make any sense of what you went through; and I never will,
but I will always marvel at how you handled it with such grace and love.&lt;/p&gt;
&lt;p&gt;Not a day goes by, possibly I could even say hour, that I don&#39;t think about you. My wall behind my office chair is covered in family photos; many people mention it and when they do my eyes are always drawn to a photo of you and it brings me joy. Thank you for the wonderful memories Rach, even in the midst of the worst you showed your best.&lt;/p&gt;
&lt;p&gt;Happy birthday, love and miss you Rach.&lt;/p&gt;
&lt;p&gt;~ Dad&lt;/p&gt;
</content>
  </entry>
</feed>