<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/css" href="https://www.aaron-gustafson.com/c/feed.min.css" ?><feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:amg="https://www.aaron-gustafson.com.com/amg-dtd/"><title>Aaron Gustafson: Content tagged design</title><subtitle>The latest 20 posts and links tagged design.</subtitle><id>https://www.aaron-gustafson.com</id><link href="https://www.aaron-gustafson.com/feeds/design.xml" rel="self"/><link href="https://www.aaron-gustafson.com"/><author><name>Aaron Gustafson</name><uri>https://www.aaron-gustafson.com</uri></author><updated>2026-02-20T23:27:28Z</updated><entry><id>https://www.aaron-gustafson.com/notebook/accessibility-assistant-for-figma-v52/</id><title type="html"><![CDATA[✍🏻 Accessibility Assistant for Figma v52]]></title><link href="https://www.aaron-gustafson.com/notebook/accessibility-assistant-for-figma-v52/" rel="alternate" type="text/html" /><published>2026-02-20T23:27:28Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I just hit “publish” on <a href="https://www.figma.com/community/plugin/731310036968334777/accessibility-assistant">Accessibility Assistant for Figma</a> v52 and I wanted to share some details on why this is a monumental release for us.</p><p>We’re in the process of a major overhaul to this plugin. There was a lot of infrastructural work to do to modernize the plugin and set the stage for a host of new features to make designers more productive when it comes to making their designs more accessible. This release incorporates a lot of that foundational work, notably:</p><ul><li>Annotations are now presented as Figma-native Dev Mode annotations; this greatly reduces the working overhead of the plugin and reduces visual clutter in the document. We’ve also color-coordinated the icons in the Annotation Set viewer to the labels you see in the Dev Mode annotations, making it easier to scan.</li><li>Legacy annotation tables will automatically be migrated into the new system. The visual readout tables will be hidden when this happens, but are still accessible if you need to copy or reference them. We’ve also included a tool to clean up these old layers when you’re ready.</li><li>Annotations are now managed in a single UI rather than being separated, based on whether they impact focus order. This means you don’t need to jump back &amp; forth between tools to properly annotate your designs.</li><li>We’ve organized and expanded the list of W3C roles available in the role picker. Additionally, the form now adapts to the role, offering you only the relevant fields and reducing distraction. We also added a description field, should you need it.</li></ul><p>We also fixed bugs related to duplicating layers. You can now copy layers and the annotations will go along for the ride, becoming a new Annotation Set. Similarly, you can now duplicate pages and the annotations — which are page-bound — will be re-generated. It’s worth noting that this may take some time on particularly large pages.</p><p>This release has been a long time coming, but I’m incredibly proud of the team that’s been working so diligently on this, particularly Ashish Singh from HCL and Michael Fairchild, Scott O’Hara, and Ben Truelove from Microsoft. Their attention to detail and encyclopedic knowledge of accessibility has been instrumental in getting this project to the place that it is.</p><p>And there’s more to come!</p>]]></content><amg:twitter><![CDATA[I just hit “publish” on Accessibility Assistant for Figma v52 and I wanted to share some details on why this is a monumental release for us.]]></amg:twitter><amg:summary><![CDATA[I just hit “publish” on Accessibility Assistant for Figma v52 and I wanted to share some details on why this is a monumental release for us.]]></amg:summary><summary type="html"><![CDATA[<p>I just hit “publish” on Accessibility Assistant for Figma v52 and I wanted to share some details on why this is a monumental release for us.</p>]]></summary><category term="accessibility" /><category term="design" /><category term="inclusive design" /><category term="Microsoft" /><category term="user experience" /><category term="WAI-ARIA" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/passing-your-css-theme-to-canvas/</id><title type="html"><![CDATA[✍🏻 Passing Your CSS Theme to `canvas`]]></title><link href="https://www.aaron-gustafson.com/notebook/passing-your-css-theme-to-canvas/" rel="alternate" type="text/html" /><published>2025-05-01T21:49:27Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>While working on a recent project I noticed an issue with a <code>canvas</code>-based audio visualization when I toggled between light and dark modes. When I’d originally set it up I was browsing in dark mode and the light visualization stroke showed up perfectly on the dark background, but it was invisible when viewed using the light theme (which I’d neglected to test). I searched around, but didn’t find any articles on easy ways to make <code>canvas</code> respond nicely to user preferences, so I thought I’d share (in brief) how I solved it.</p><h2 id="the-css-setup" tabindex="-1"><a class="header-anchor" href="#the-css-setup" aria-hidden="true">#</a> The CSS Setup</h2><p>The theming of this particular project uses <a href="https://developer.mozilla.org/docs/Web/CSS/CSS_cascading_variables/Using_CSS_custom_properties">CSS custom properties</a>. For simplicty I’m going to set up two named colors and then use two theme-specific custom properties to apply them in the default light theme and the dark theme:</p><pre class="language-css" tabindex="0"><code class="language-css"><span class="token selector">:root</span><span class="token punctuation">{</span><span class="token property">–color-dark</span><span class="token punctuation">:</span> #222<span class="token punctuation">;</span><span class="token property">–color-light</span><span class="token punctuation">:</span><span class="token function">rgba</span><span class="token punctuation">(</span>255<span class="token punctuation">,</span> 255<span class="token punctuation">,</span> 255<span class="token punctuation">,</span> 0.5<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token property">–color-background</span><span class="token punctuation">:</span><span class="token function">var</span><span class="token punctuation">(</span>–color-light<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token property">–color-foreground</span><span class="token punctuation">:</span><span class="token function">var</span><span class="token punctuation">(</span>–color-dark<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token atrule"><span class="token rule">@media</span><span class="token punctuation">(</span><span class="token property">prefers-color-scheme</span><span class="token punctuation">:</span> dark<span class="token punctuation">)</span></span><span class="token punctuation">{</span><span class="token selector">:root</span><span class="token punctuation">{</span><span class="token property">–color-background</span><span class="token punctuation">:</span><span class="token function">var</span><span class="token punctuation">(</span>–color-dark<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token property">–color-foreground</span><span class="token punctuation">:</span><span class="token function">var</span><span class="token punctuation">(</span>–color-light<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token punctuation">}</span></code></pre><h2 id="applying-the-theme-to-canvas" tabindex="-1"><a class="header-anchor" href="#applying-the-theme-to-canvas" aria-hidden="true">#</a> Applying the Theme to Canvas</h2><p>To get the theme into my <code>canvas</code>-related code, I set up a <code>theme</code> object to hold the values:</p><pre class="language-js" tabindex="0"><code class="language-js"><span class="token keyword">const</span> theme <span class="token operator">=</span><span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre><p>Next, I wrote a function to pull in the theme colors using <a href="https://developer.mozilla.org/docs/Web/API/Window/getComputedStyle"><code>window.getComputedStyle()</code></a>. After defining the function, I call it immediately to populate the <code>theme</code> object:</p><pre class="language-js" tabindex="0"><code class="language-js"><span class="token keyword">function</span><span class="token function">importTheme</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span>theme<span class="token punctuation">.</span>foreground <span class="token operator">=</span>window<span class="token punctuation">.</span><span class="token function">getComputedStyle</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>documentElement<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPropertyValue</span><span class="token punctuation">(</span><span class="token string">“–color-foreground”</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">||</span><span class="token string">“black”</span><span class="token punctuation">;</span>theme<span class="token punctuation">.</span>background <span class="token operator">=</span>window<span class="token punctuation">.</span><span class="token function">getComputedStyle</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>documentElement<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">getPropertyValue</span><span class="token punctuation">(</span><span class="token string">“–color-background”</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">trim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">||</span><span class="token string">“white”</span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token function">importTheme</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>I set this up with just two theme colors, but you can import as many (or few) as you like. Be sure to set a sensible default or fallback for each color though, just in case your theme’s custom property names change.</p><p>With this in place, I can set my <code>canvas</code> animation’s colors by referencing them from the <code>theme</code> object. For example:</p><pre class="language-js" tabindex="0"><code class="language-js">context<span class="token punctuation">.</span>fillStyle <span class="token operator">=</span> theme<span class="token punctuation">.</span>foreground<span class="token punctuation">;</span></code></pre><h2 id="keeping-things-in-sync" tabindex="-1"><a class="header-anchor" href="#keeping-things-in-sync" aria-hidden="true">#</a> Keeping Things in Sync</h2><p>The final bit of magic comes when you add an event listener to a <code>MediaQueryList</code>:</p><pre class="language-js" tabindex="0"><code class="language-js"><span class="token keyword">const</span> mediaQuery <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token function">matchMedia</span><span class="token punctuation">(</span><span class="token string">“(prefers-color-scheme: dark)”</span><span class="token punctuation">)</span><span class="token punctuation">;</span>mediaQuery<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">“change”</span><span class="token punctuation">,</span> importTheme<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre><p>Here I’ve used <code>matchMedia()</code> to get a <code>MediaQueryList</code> object. Typically we use the <code>matches</code> property of this object to establish whether the media query currently matches or not. A lesser-known option, however, is that you can attach an event listener to it that will be triggered whenever the query’s status changes. So cool! With this in place, the <code>canvas</code> contents will update whenever the user’s theme changes. <a href="#fig-2025-05-01-01">Here’s an example of that</a>:</p><figure id="fig-2025-05-01-01" class="media-container"><p><a href="https://www.youtube.com/watch?v=pALIuO5uHUA">https://www.youtube.com/watch?v=pALIuO5uHUA</a></p><figcaption><p>This video demonstrates how a canvas element rendering a dark sine wave against a light background can miraculously transform into a light sine wave against a dark background using CSS custom properties and a bit of JavaScript.</p></figcaption></figure><h1 id="demo" tabindex="-1"><a class="header-anchor" href="#demo" aria-hidden="true">#</a> Demo</h1><p>I put together <a href="https://codepen.io/aarongustafson/pen/LEEQyqg">a quick demo of this</a> in a fork of <a href="https://codepen.io/alvinshaw/pen/mdEKggg">Alvin Shaw’s Canvas Sine Wave Experiment</a>:</p><figure id="fig-2025-05-01-02" class="media-container"><iframe class="codepen" height="331" style="width:100%;" scrolling="no" title="CodePen Embed" src="https://codepen.io/anon/embed/LEEQyqg?height=331&theme-id=dark&default-tab=result" frameborder="0" loading="lazy" allowtransparency="true" allowfullscreen="true"><p><a href="https://codepen.io/aarongustafson/pen/LEEQyqg" target="_blank" rel="noopener">See the Pen</a></p></iframe></figure><hr><p>Hopefully this is helpful to someone out there. Happy theming!</p>]]></content><amg:twitter><![CDATA[Need to pipe your CSS theme into a `canvas` element? Here’s how I did it.]]></amg:twitter><amg:summary><![CDATA[While working on a recent project I noticed an issue with a <code>canvas</code>-based audio visualization when I toggled between light and dark modes. I couldn’t find any articles on to make <code>canvas</code> respond nicely to user preferences, so I thought I’d share (in brief) how I solved it.]]></amg:summary><summary type="html"><![CDATA[<p>While working on a recent project I noticed an issue with a <code>canvas</code>-based audio visualization when I toggled between light and dark modes. I couldn’t find any articles on to make <code>canvas</code> respond nicely to user preferences, so I thought I’d share (in brief) how I solved it.</p>]]></summary><category term="accessibility" /><category term="animation" /><category term="CSS" /><category term="design" /><category term="JavaScript" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/complaining-about-designers-fiddling-with-figma-solves-nothing/</id><title type="html"><![CDATA[✍🏻 Complaining About Designers Fiddling with Figma Solves Nothing]]></title><link href="https://www.aaron-gustafson.com/notebook/complaining-about-designers-fiddling-with-figma-solves-nothing/" rel="alternate" type="text/html" /><published>2025-03-24T16:11:54Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Michael F. Buckley posted <a href="https://uxdesign.cc/figmas-not-a-design-tool-it-s-a-rube-goldberg-machine-for-avoiding-code-2a24f11add5d">a somewhat imflamatory piece to the UX Collective blog over on Medium</a> and I had some strong reactions to it I wanted to share. You should read it first before continuing.</p><p>First off, I agree with his core message: designers should understand the medium they are working in, be it web or an OS-specific UI. That’s where my agreements end, however.</p><blockquote><p>They pat themselves on the back, believing they’ve mastered digital design. Meanwhile, a developer glances at the file, sighs, and codes the button in five minutes.</p></blockquote><p>Condescention toward designers aside, this also assumes a high degree of competency and understanding of nuance on the engineering side which — in my experience — is not guaranteed. I cannot tell you how often I’ve designed an interface that calls for a button to submit a form and I get back a <code>div</code> with a click handler that can’t accept focus and has no design considerations for hover, focus, etc. In other words, if I provided a design with a single button on it, I get that button exactly. Sometimes exactly to those explicit dimensions, text overflow be damned.</p><p>There needs to be an acknowledgement and appreciation that designers know their craft and (generally) have good reasons for being overly prescriptive. Do some designers stray into realms of self-indulgence… absolutely! But so do engineers.</p><p>I think where we need to get to is a place where handoff provides enough information to inform the engineer of the totality of what’s needed. Sure, to a seasoned engineer that may seem overly detailed, but to a junior engineer it can be incredibly helpful in learning all of the considerations of something as seemingly simple as a button. And even a seasoned engineer might learn a thing (or three) from annotations regarding accessibility and such. Communication is the key to success here.</p><p>Also, some prototyping in a tool like Figma can help with catching issues — like keyboard traps, for instance — before they are codified into code. Making changes in Figma or other design tools is generally a lot cheaper that doing it in code. Back of the napkin math — which is generally agreed upon across the industry — is that catching &amp; fixing an accessibility issue in design costs about $100. In development, it’s like $1,000. If it sneaks into production, it’s gonna be more like $10,000.</p><p>To be clear, I’m not disagreeing with the piece in its entirety — designers should learn their medium (which is coding to a degree but also UX expectations) and Figma’s <strong>not</strong> the medium — but I think there’s more nuance to it. I also dislike the us vs. them framing; we’re all in this together.</p>]]></content><amg:twitter><![CDATA[Michael F. Buckley posted a somewhat imflamatory piece to the UX Collective blog over on Medium and I had some strong reactions to it I wanted to share.]]></amg:twitter><amg:summary><![CDATA[Michael F. Buckley posted a somewhat imflamatory piece to the UX Collective blog over on Medium and I had some strong reactions to it I wanted to share.]]></amg:summary><summary type="html"><![CDATA[<p>Michael F. Buckley posted a somewhat imflamatory piece to the UX Collective blog over on Medium and I had some strong reactions to it I wanted to share.</p>]]></summary><category term="design" /><category term="web development" /><category term="industry" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/accessible-figma-designs-just-got-easier-/</id><title type="html"><![CDATA[🔗 Accessible Figma designs just got easier]]></title><link href="https://www.aaron-gustafson.com/notebook/links/accessible-figma-designs-just-got-easier-/" rel="alternate" type="text/html" /><link href="https://www.linkedin.com/pulse/accessible-figma-designs-just-got-easier-ben-truelove" rel="related" type="text/html" /><published>2023-09-29T21:39:09Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>I love that folks in Microsoft are releasing the tools we use to build more accessible experiences.</p>]]></content><amg:twitter><![CDATA[Great walkthrough of new accessibility tooling for Figma.]]></amg:twitter><category term="accessibility" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://media.licdn.com/dms/image/D5612AQGjlpoKFcDvnQ/article-cover_image-shrink_720_1280/0/1695911300027?e=2147483647&amp;v=beta&amp;t=bTVktJiI07FlGzNVDWb-eGNzKJUbGkYN_HKikYcollw" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/please-size-your-inline-svgs/</id><title type="html"><![CDATA[✍🏻 Please size your inline SVGs]]></title><link href="https://www.aaron-gustafson.com/notebook/please-size-your-inline-svgs/" rel="alternate" type="text/html" /><published>2023-08-21T21:11:09Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>While it is a bit of an edge case, every now and then I’ll hit a site—yes, even a high profile one—and the CSS will fail to load for some reason. When this happens, inevitably every inline SVG resource on the page will grow to fill the entire width of my viewport, making for a <em>really</em> awkward experience.</p><h2 id="what%E2%80%99s-the-issue%3F" tabindex="-1"><a class="header-anchor" href="#what%E2%80%99s-the-issue%3F" aria-hidden="true">#</a> What’s the issue?</h2><p>Not to pick on anyone in particular, but consider <a href="https://presentations.aaron-gustafson.com/uygzjR/progressive-enhancement-where-do-i-begin#saVRzdC">this example from a recent talk I gave</a>:</p><figure id="2023-08-21-01"><p><img src="https://www.aaron-gustafson.com/i/posts/2023-08-21/01.png" alt="" width="696" height="481"></p><figcaption>The U.S. Transportation Safety Administration’s TSA PreCheck® landing page, with CSS applied.</figcaption></figure><p>When CSS fails to load, however, check out what happens:</p><figure id="2023-08-21-02"><p><img src="https://www.aaron-gustafson.com/i/posts/2023-08-21/02.png" alt="" width="696" height="481"></p><figcaption>The U.S. Transportation Safety Administration’s TSA PreCheck® landing page, without CSS applied. Note the <strong>huge</strong> SVG.</figcaption></figure><p>Yeah, that’s an inline SVG. You see, without any explicit dimensions set, the SVG will naturally grow to become as large as possible. Chances are you’re constraining that growth in CSS somewhere, but when your CSS fails to apply for any reason, every inline SVG on your site will swell like <a href="https://roalddahl.fandom.com/wiki/Violet_Beauregarde">Violet Beauregarde after eating Willy Wonka’s “three-course dinner” chewing gum</a>.</p><h2 id="how-do-we-solve-this%3F" tabindex="-1"><a class="header-anchor" href="#how-do-we-solve-this%3F" aria-hidden="true">#</a> How do we solve this?</h2><p>Thankfully, this is a pretty easy situation to avoid: just set an explicit <code>width</code> and <code>height</code>. To use an example from this site, instead of saying</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>0 0 38 48<span class="token punctuation">”</span></span><span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>1.1<span class="token punctuation">”</span></span><span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span><a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a><span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">&gt;</span></span></code></pre><p>You can explicitly set the <code>width</code> and <code>height</code> in the <code>svg</code> element like this:</p><pre class="language-html" tabindex="0"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>svg</span><span class="token attr-name">width</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>38<span class="token punctuation">”</span></span><span class="token attr-name">height</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>48<span class="token punctuation">”</span></span><span class="token attr-name">viewBox</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>0 0 38 48<span class="token punctuation">”</span></span><span class="token attr-name">version</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span>1.1<span class="token punctuation">”</span></span><span class="token attr-name">xmlns</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">“</span><a href="http://www.w3.org/2000/svg">http://www.w3.org/2000/svg</a><span class="token punctuation">”</span></span><span class="token punctuation">&gt;</span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>svg</span><span class="token punctuation">&gt;</span></span></code></pre><p>What you set these values to will likely vary depending on how the icon is being used. In a pinch, you could also pull the values directly from the <code>viewbox</code> value. And using that value, you could even make the inline values dynamic within your template, reading in the <code>viewbox</code> values and tweaking them to a ratio specific to the context.</p><p>Setting the SVG’s dimensions inline like this doesn’t restrict their flexibility either. You can still use CSS to override these inline values and set the SVG to whatever size you wish:</p><pre class="language-css" tabindex="0"><code class="language-css"><span class="token selector">svg</span><span class="token punctuation">{</span><span class="token property">inline-size</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span><span class="token property">block-size</span><span class="token punctuation">:</span> 200px<span class="token punctuation">;</span><span class="token punctuation">}</span></code></pre><p>I’ve thrown together a quick comparison over on CodePen so you can see the three different states:</p><figure id="2023-08-21-03"><iframe class="codepen" height="500" style="width:100%;" scrolling="no" title="CodePen Embed" src="https://codepen.io/anon/embed/JjwoLME?height=500&theme-id=dark&default-tab=result" frameborder="0" loading="lazy" allowtransparency="true" allowfullscreen="true"><p><a href="https://codepen.io/aarongustafson/pen/JjwoLME" target="_blank" rel="noopener">See the Pen</a></p></iframe></figure><p>And now that you know, please, please, <em>please</em> take a few minutes to make this small, simple change to your websites. While not a catastrophic issue, taking care to control how your sites render in the worst of circumstances goes a long way to demonstrating thoughtful consideration of your users.</p><hr><p><strong>Update:</strong> For more in-depth info on this topic (and scenarios where CSS isn’t applied to your SVGs), be sure to check out <a href="https://www.sarasoueidan.com/blog/svg-style-inheritance-and-fousvg/">this piece from Sara Soueidan</a>.</p>]]></content><amg:twitter><![CDATA[#ProTip: If you don’t explicitly set the dimensions of your inline SVGs, they’ll render full width when your CSS isn’t applied properly.]]></amg:twitter><amg:summary><![CDATA[If you don’t explicitly set the dimensions of your inline SVGs, they’ll render full width when your CSS isn’t applied properly.]]></amg:summary><summary type="html"><![CDATA[<p>If you don’t explicitly set the dimensions of your inline SVGs, they’ll render full width when your CSS isn’t applied properly.</p>]]></summary><category term="CSS" /><category term="design" /><category term="HTML" /><category term="SVG" /><category term="web design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/i/posts/2023-08-21/hero.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/design-for-developers/</id><title type="html"><![CDATA[✍🏻 Design for Developers]]></title><link href="https://www.aaron-gustafson.com/notebook/design-for-developers/" rel="alternate" type="text/html" /><published>2023-07-18T16:19:37Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>One of my favorite web designers, <a href="https://stephaniestimac.com/">Stephanie Stimac</a>, asked me to write the foreword for her amazing new book, <a href="http://mng.bz/zXqB"><cite>Design for Developers</cite></a>. With her permission, and Manning’s, I’m reprinting it here.</p><blockquote><p>I’ve worked on the web for a long time. When I say a long time, I mean a long time. As in <em>my first browser was on the command line</em> old. As in <em>my first back-end development was a CGI script</em> old. With my nearly three decades of building dozens upon dozens of projects for the web, the one skill I’ve found most valuable is the ability to bridge the gaps between the worlds of design, user experience, and development.</p><p>Each of these fields attract practitioners from different education and/or hobbyist backgrounds. This can be a point of tension, as folks in each camp tend to see their own field as having the greatest influence on a web project’s success. The reality is that web exists in the nexus of these fields, relying equally on what each of these practices bring to the table. I have found that the most valuable people in any web project are those that understand enough of each field to be able to operate in that nexus, ensuring each team is communicating effectively with the other teams and that everyone is working together toward a shared goal.</p><p>Which brings me to Stephanie Stimac’s <cite>Design for Developers</cite>. This book is an invaluable resource for developers looking to level up in their understanding of what it takes to build for the web today. It provides a crash course in design and user experience in a way that will both improve your fluency with these topics and give you the necessary skills to become productive in these spaces as well. Beyond that superficial perspective, however, this book provides the foundation for leveling up your career and becoming the person who thrives in the space between design, user experience, and development.</p><p>Stephanie is the perfect person to provide you with these insights as well. Not only is she an excellent communicator, she also has years of working experience as a designer, developer, user experience practitioner, and an educator. She’s even worked behind the scenes on web browsers and the web standards they implement, giving her an incredible depth of understanding when it comes to the web and the tools we rely on to build it.</p><p>Whether you’re a longtime developer looking to grow a new branch on your skill tree or you’re starting out and looking to get a solid foundation in what it takes to build for the web, <cite>Design for Developers</cite> is sure to provide you with a wealth of knowledge to help you on your way.</p></blockquote>]]></content><amg:twitter><![CDATA[One of my favorite web designers, @seaotta, asked me to write the foreword for her amazing new book, Design for Developers. With her permission, and Manning’s, I’ve reprinted it on my site.]]></amg:twitter><amg:summary><![CDATA[One of my favorite web designers, Stephanie Stimac, asked me to write the foreword for her amazing new book. With her permission, and Manning’s, I’m reprinting the foreword here.]]></amg:summary><summary type="html"><![CDATA[<p>One of my favorite web designers, Stephanie Stimac, asked me to write the foreword for her amazing new book. With her permission, and Manning’s, I’m reprinting the foreword here.</p>]]></summary><category term="design" /><category term="web design" /><category term="web development" /><category term="CSS" /><category term="HTML" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/i/books/design-for-developers.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/assume-the-position-a-labelling-story/</id><title type="html"><![CDATA[🔗 Assume the Position—A Labelling Story]]></title><link href="https://www.aaron-gustafson.com/notebook/links/assume-the-position-a-labelling-story/" rel="alternate" type="text/html" /><link href="https://www.tpgi.com/assume-the-position-a-labelling-story/" rel="related" type="text/html" /><published>2023-06-07T20:40:33Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Interesting examination of label positioning relative to checkboxes and radio controls in forms. While ostensibly web-focused, it applies equally to any GUI.</p>]]></content><amg:twitter><![CDATA[Interesting examination of label positioning relative to checkboxes and radio controls in forms. While ostensibly web-focused, it applies equally to any GUI.]]></amg:twitter><category term="accessibility" /><category term="forms" /><category term="design" /><category term="user experience" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.tpgi.com/wp-content/uploads/labelling-should-be.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/303-creative-llc-v-elenis-is-incredibly-problematic/</id><title type="html"><![CDATA[✍🏻 303 Creative LLC v. Elenis is Incredibly Problematic]]></title><link href="https://www.aaron-gustafson.com/notebook/303-creative-llc-v-elenis-is-incredibly-problematic/" rel="alternate" type="text/html" /><published>2022-12-13T21:03:25Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Before I get into this, let me start with this preface: I am not a legal expert by any means. I never even watched <cite>Law &amp; Order</cite>. That said, I am keenly interested in the law and how it relates to bias and discrimination, particularly if that intersects with technology, especially the web.</p><p>Which brings me to the subject at hand: <cite>303 Creative LLC v. Elenis</cite>. <a href="https://twitter.com/AaronGustafson/status/1599778647648665600">I tweeted about this case</a>, which is currently before the Supreme Court of the United States, the other day, but felt like I owed it a lengthier—and perhaps more enduring—discussion. So here goes…</p><h2 id="the-case%2C-in-a-nutshell" tabindex="-1"><a class="header-anchor" href="#the-case%2C-in-a-nutshell" aria-hidden="true">#</a> The case, in a nutshell</h2><p>Lorie Smith, a web designer operating as 303 Creative LLC, is interested in getting into the wedding announcement website game. She does not believe same-sex couples should be able to marry, so she wanted to put a notice on her website to that effect, stating that she would not create wedding announcements for same-sex weddings. This violates Colorado’s anti-discrimination law (some of you may recall it from <cite>Masterpiece Cakeshop v. Colorado Civil Rights Commission</cite>) which prevents public businesses from discriminating against gay people, who are a “protected class” in legal speak.</p><p>Smith contests that her web design work is her “expression” as an “artist” and that the First Amendment protects her right to that expression. What a lot of the coverage fails to include, however, is</p><ol><li>She does not currently offer wedding announcement website services, and</li><li>No same-sex couples have requested her services in creating a wedding announcement website.</li></ol><p>In other words, this case is not based on fact, but rather on hypotheticals. Additionally, there has been no injury on either side, just the potential for one. Anyway, if you’re interested in learning more about the case, you can check out the following:</p><ul><li><a href="https://en.wikipedia.org/wiki/303_Creative_LLC_v._Elenis">303 Creative LLC v Elenis on Wikipedia</a></li><li><a href="https://www.supremecourt.gov/docket/docketfiles/html/public/21-476.html">Court Docket at the Supreme Court</a></li><li><a href="https://www.oyez.org/cases/2022/21-476">Oral Arguments before the Supreme Court</a></li><li><a href="https://crooked.com/podcast/how-the-303-creative-case-threatens-to-roll-back-the-21st-century/"><cite>Strict Scrutiny</cite> podcast episode following oral arguments</a></li><li><a href="https://boom-lawyered.simplecast.com/episodes/is-anyone-surprised-by-sam-alitos-trolling-anymore"><cite>Boom! Lawyered</cite> podcast episode following oral arguments</a></li></ul><p>In particular, I highly recommend listening to Justices Ketanji Brown Jackson’s and Sonia Sotomayor’s contributions during oral arguments as they really cut through the bullshit and get to the heart of the case and its implications.</p><h2 id="fact%3A-design-%E2%89%A0-art" tabindex="-1"><a class="header-anchor" href="#fact%3A-design-%E2%89%A0-art" aria-hidden="true">#</a> Fact: Design ≠ Art</h2><p>This is something I talked about way back in <a href="https://presentations.aaron-gustafson.com/JoRKuw/designing-with-empathy">my 2013 talk “Designing With Empathy”</a>: Design is not art. Art is self-expression and serves the artist; design serves someone else (typically the client or their audience). If you don’t work in the industry, however, this distinction isn’t always clear. To quote Jeff Veen:</p><blockquote><p>I’ve been amazed at how often those outside the discipline of design assume that what designers do is decoration. Good design is problem solving.</p></blockquote><p>Design is not the creation of pretty pictures and decoration. Design serves a purpose. In fact, the term “design” originated in Medieval Latin as <i>designare</i> which meant “to mark out” (hence the related term <em>designate</em>). To design is “to devise for a specific function or end.” To practice “web design” is to use the tools of graphic design to achieve the purpose of the project.</p><p>In the context 303 Creative LLC seeks to operate, the purpose of each project would be to announce and provide the details about a wedding. 303 Creative LLC seeks to provide these services in exchange for money, at the behest of a client. It is not artistic expression any way you slice it.</p><h2 id="fact%3A-this-case-is-about-advertising-bigotry" tabindex="-1"><a class="header-anchor" href="#fact%3A-this-case-is-about-advertising-bigotry" aria-hidden="true">#</a> Fact: This Case is About Advertising Bigotry</h2><p>If you’ve run any sort of service business, you’ve likely come across clients and projects you had to turn away. Sometimes you don’t have the bandwidth to take on the project. Other times you may not be interested in the kind of work it entails. Still others, you might not have the right expertise to do the project justice. And sometimes you just get a sense that the potential client is not someone you’d work well with (perhaps based on the tone of their inquiry). Regardless of the reason, however, you can gently explain to them that you cannot do the project for them and either leave it at that or recommend someone who might be able to help them.</p><p>In the case of 303 Creative LLC, Smith could have easily used this approach to turn away same-sex couples without making it a thing. She could even have a form email prepared for this very purpose! And unless several couples approached her at roughly the same time and got wildly different responses with respect to her ability to create them a wedding website—which, to reiterate, is not a service she currently offers—no one would be any the wiser when it came to her belief that same-sex marriage doesn’t (or shouldn’t) exist.</p><p>But no, that’s not the route that Ms. Smith and 303 Creative LLC seeks to go. Instead, she would like to be able to express her “firmly held religious belief” that same-sex marriages should not happen and to put a notice on her website explicitly saying she refuses to create a website for a same-sex wedding. She wants to put her bigotry on full display and she doesn’t think she should suffer any legal consequences for doing so.</p><h2 id="clarification%3A-who-qualifies-as-%E2%80%9Cprotected%E2%80%9D%3F" tabindex="-1"><a class="header-anchor" href="#clarification%3A-who-qualifies-as-%E2%80%9Cprotected%E2%80%9D%3F" aria-hidden="true">#</a> Clarification: Who qualifies as “Protected”?</h2><p><a href="https://front-end.social/@jcct@mastodon.online/109462364114280675">Over on Mastodon</a>, I was asked to clarify whether the law allows you to refuse to work for a particular individual or corporation. For example, could a web designer refuse to do work for Chick-fil-a on account of their anti-LGBTQIA+ positions (a stance which I think they’ve reversed, but I don’t eat there so I’m not sure). A similar question was asked in Oral Arguments, framed as a speech writer’s ability to refuse to write a speech for a political candidate they disagree with. Public accommodations law, which is what is being considered in this case, would not require you to work on any project for anyone as long as the reason you are refusing your service is not on account of their membership in a <a href="https://www.thoughtco.com/what-is-protected-class-4583111">protected class</a>.</p><p>Corporations are not a protected class. Neither are politicians. Same-sex couples <em>are</em> protected from discrimination under both the Equal Pay Act of 1963 and the Civil Rights Act of 1964.</p><h2 id="potential-fallout" tabindex="-1"><a class="header-anchor" href="#potential-fallout" aria-hidden="true">#</a> Potential Fallout</h2><p>If the conservative majority on the Court decides to ignore all of the facts in this case an rule in favor of 303 Creative LLC, that decision will open the floodgates for discrimination against people based on their protected status by anyone who claims to have a religious objection to treating that person respectfully.</p><p>For example, people with disabilities are a protected class under the Americans with Disabilities Act. If this ruling goes in 303 Creative LLC’s favor, a business owner could claim eugenics as a “firmly held religious view” and refuse to provide accommodations for them. From the web side of things, that could mean they could intentionally make their site inaccessible to people who use screen readers. In the physical world, it could mean they could make entry to their business impossible for anyone using a wheelchair.</p><p>It might take a little time, but we’d likely end up in another “Jim Crow”-like era where restaurants are once again free to adorn their windows with “Whites Only” signs. Where the grocery store hangs a “Christians Only” sign on its door. Where the local bank proudly announces that only “Heterosexual Evangelical Christian Women” can apply for an open teller position. Where only women under 25 can date Leonardo DiCaprio… wait.</p><p>Instead of embracing our differences as a complement to one another and for the betterment of our society, condoning this would further drive us apart and foster a world of exclusion. People could use their religion to mask their bigotry and claim exemption from having to provide equal access to people based on their disabilities, gender (or gender expression), sexual orientation, racial characteristics, religion, age, or any other protected category. That’s not a world I want to live in nor is it a future I want for my kid.</p><p>If it comes to pass, I suppose the one silver lining is that we’ll learn what companies deserve our business, but that hardly outweighs the potential harms for people who need access to food, clothing, shelter, information, and other necessities for existence both online and off that are supposed to be guaranteed by anti-discrimination laws.</p><p>It’s all in the Supreme Court’s hands at this point, but I am more than a little concerned with what this could mean for the future here in the United States.</p>]]></content><amg:twitter><![CDATA[A longer essay on 303 Creative v. Elenis and why it should not be before the court in the first place as well as the potential it has to undermine other public accommodations laws.]]></amg:twitter><amg:summary><![CDATA[The myriad reasons I don’t think this case should be before the Supreme Court of the United States and the potential ramifications of it being decided in favor of the plaintiff.]]></amg:summary><summary type="html"><![CDATA[<p>The myriad reasons I don’t think this case should be before the Supreme Court of the United States and the potential ramifications of it being decided in favor of the plaintiff.</p>]]></summary><category term="accessibility" /><category term="business" /><category term="design" /><category term="industry" /><category term="society" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/i/posts/2022-12-13/hero.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/css-grid-responsive-layouts-and-components-eee1badd5a2f/</id><title type="html"><![CDATA[🔗 CSS Grid—Responsive layouts and components]]></title><link href="https://www.aaron-gustafson.com/notebook/links/css-grid-responsive-layouts-and-components-eee1badd5a2f/" rel="alternate" type="text/html" /><link href="https://medium.com/deemaze-software/css-grid-responsive-layouts-and-components-eee1badd5a2f" rel="related" type="text/html" /><published>2018-07-03T23:40:47Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Excellent, straightforward grid tutorial from <a href="https://medium.com/@rafaelaferro">Rafaela Ferro</a>.</p>]]></content><amg:twitter><![CDATA[Excellent, straightforward grid tutorial from @anarafaelaferro]]></amg:twitter><category term="CSS" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://miro.medium.com/max/1200/1*zEQtOUbiI00eXJ-iz5LuHQ.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/designing-for-accessibility-is-not-that-hard-c04cc4779d94/</id><title type="html"><![CDATA[🔗 Designing for accessibility is not that hard]]></title><link href="https://www.aaron-gustafson.com/notebook/links/designing-for-accessibility-is-not-that-hard-c04cc4779d94/" rel="alternate" type="text/html" /><link href="https://uxdesign.cc/designing-for-accessibility-is-not-that-hard-c04cc4779d94" rel="related" type="text/html" /><published>2018-07-03T23:34:09Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>While most of the recommendations in this piece are not new, per se, the animations do a great job of explaining the importance of Pablo’s advice for real people.</p>]]></content><category term="accessibility" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://miro.medium.com/freeze/max/1200/1*cHY0x1fZ1bI98CDD_Ox9OA.gif" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/layouts-of-tomorrow/</id><title type="html"><![CDATA[🔗 The Layouts of Tomorrow]]></title><link href="https://www.aaron-gustafson.com/notebook/links/layouts-of-tomorrow/" rel="alternate" type="text/html" /><link href="https://mxb.at/blog/layouts-of-tomorrow/" rel="related" type="text/html" /><published>2018-06-27T20:19:34Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Love this demo from <a href="https://mxb.at">Max Böck</a>!</p>]]></content><amg:twitter><![CDATA[Love this demo from Max Böck! The Layouts of Tomorrow]]></amg:twitter><category term="CSS" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://mxb.dev/blog/layouts-of-tomorrow/cover.jpg" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/colors/</id><title type="html"><![CDATA[🔗 Colors]]></title><link href="https://www.aaron-gustafson.com/notebook/links/colors/" rel="alternate" type="text/html" /><link href="https://www.canva.com/colors/" rel="related" type="text/html" /><published>2018-03-22T15:16:09Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>The folks at Canva have amassed a pretty expansive color tool that discusses various aspects—like history and associations—of a ridiculous number of colors. This resource also helps you build color sets around each of the colors by exploring complementary colors, analogous colors, and color triads that include it. Pretty cool stuff!</p>]]></content><amg:twitter><![CDATA[@canva has put together an interesting and useful color exploration tool]]></amg:twitter><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://static-cse.canva.com/_next/static/assets/wiki-social-combo-fb.1200x628.dfde0a3e4b4b0fedc8cd090c4860120a.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/links/flat-ui-less-attention-cause-uncertainty/</id><title type="html"><![CDATA[🔗 Flat UI Elements Attract Less Attention and Cause Uncertainty]]></title><link href="https://www.aaron-gustafson.com/notebook/links/flat-ui-less-attention-cause-uncertainty/" rel="alternate" type="text/html" /><link href="https://www.nngroup.com/articles/flat-ui-less-attention-cause-uncertainty/" rel="related" type="text/html" /><published>2017-09-12T16:08:12Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Beware the “weak signifier”:</p><blockquote><p>When we compared average number of fixations and average amount of time people spent looking at each page, we found that:</p><ul><li>The <strong>average amount of time</strong> was significantly higher on the weak-signifier versions than the strong-signifier versions. On average participants spent <strong>22% more time</strong> (i.e., slower task performance) looking at the pages with weak signifiers.</li><li>The <strong>average number of fixations</strong> was significantly higher on the weak-signifier versions than the strong-signifier versions. On average, people had <strong>25% more fixations</strong> on the pages with weak signifiers.</li><li>(Both findings were significant by a paired t-test with sites as the random factor, p &lt; 0.05.)</li></ul><p>This means that, when looking at a design with weak signifiers, <strong>users spent more time looking at the page, and they had to look at more elements on the page</strong>. Since this experiment used targeted findability tasks, <strong>more time and effort spent looking around the page are not good</strong>. These findings don’t mean that users were more “engaged” with the pages. Instead, they suggest that participants struggled to locate the element they wanted, or weren’t confident when they first saw it.</p></blockquote>]]></content><category term="user experience" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://media.nngroup.com/media/articles/opengraph_images/Flat_UI.png" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/lessons-in-averaging/</id><title type="html"><![CDATA[✍🏻 Lessons in Averaging]]></title><link href="https://www.aaron-gustafson.com/notebook/lessons-in-averaging/" rel="alternate" type="text/html" /><published>2016-12-14T18:01:32Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>In the work that we do on the Web (as well as in our daily lives), we’re often confronted, informed, or judged based on averages. I never really stopped to think about it, beyond being bugged by the fact that averages aren’t truly representative of reality. Then I listened to <a href="http://99percentinvisible.org/episode/on-average/">99% Invisible’s episode “On Average”</a>. It was incredibly enlightening and the stories shared in that episode provide sage wisdom that is very relevant to the work that we do.</p><p>Do you know where our fascination with averages began? It all started with Adolphe Quételet, a Belgian mathematician and astronomer:</p><blockquote><p>In the 1830s, astronomers were some of the only people that regularly calculated averages, since early telescopes were extremely imprecise. To obtain more accurate data for say, tracking the orbits of planets, astronomers would take multiple measurements (all of which were slightly different) add them together, then divide by the number of observations to get a better approximation of the true value.</p></blockquote><p>Quetelet decided to apply this tool to people, starting with Scottish soldiers’ chest sizes. Turns out the average chest size of a Scottish soldier in the 1830s was 39.75 inches. File that one away for Pub Trivia.</p><p>Quetelet believed that the average was the “true” size of something… something that we should strive for or that nature would attempt to create. The <a href="https://en.wikipedia.org/wiki/Platonic_idealism">Platonic ideal</a> if you will:</p><blockquote><p>In Quetelet’s mind, human averages had a certain moral mandate. By his logic, if everyone were optimally fed and lived under the same environmental conditions, they would be average. And this is what society should be striving for: the continual improvement of the average of the group.</p></blockquote><p>We look at averages all the time in our work. Some, like average <a href="https://developers.google.com/web/tools/lighthouse/audits/time-to-interactive">Time To Interactive (TTI)</a>, are useful measurements that allow us to improve our work; others, like the “average” user are decidedly less so. <span data-quotable>The “average” person (or dog or flower) is a myth. Everyone and everything is unique to some equally unique degree.</span><a href="https://en.wikipedia.org/wiki/Factory_second">Even mass-produced objects have variance</a>.</p><p>Designing for the “average” user is incredibly problematic. The episode I mentioned captured this perfectly in a story about the U.S. Army’s design of airplane cockpits:</p><blockquote><p>[I]n 1926, when the Army designed its first airplane cockpit, they measured the physical dimensions of male pilots and calculated the average measurement of their height, weight, arm-length and other dimensions.</p></blockquote><blockquote><p>The results determined the size and shape of the seat, the distance to the pedals and the stick, and even the shape of the flight helmets. This mean that, in part, pilots were selected based on their ability to fit into the cockpit designed for the average 1920s man.</p></blockquote><blockquote><p>This worked more or less up until World War II, when the Army began recruiting hundreds of new pilots to expand its air forces (which became a separate branch of the military in 1947). But with the birth and expansion of the Air Force came a decline in performance and a rash of deaths. Even with no war, pilots continued to die during training, as they were unable to control their planes.</p></blockquote><blockquote><p>The high death rate in the Air Force was a mystery for many years, but after blaming the pilots and their training programs, the military finally realized that the cockpit itself was to blame, that it didn’t actually fit most pilots.</p></blockquote><p>In 1950, the Air Force sent Gilbert S. Daniels out to collect ten measurements from thousands of airmen—yes, they were all men at the time—across the U.S. in order to establish a new average. After collecting the data, Daniels got curious and decided to see how many of the airmen he measured hit the average on all ten measurements. Not a single one. How about three of the measurements? Less than five percent. He realized that <span data-quotable>in designing for an average, they were, in fact, designing for no one.</span> Based on this discovery, the Air Force commissioned new equipment that including features like adjustable foot pedals, helmet straps, flight suits, and seats. And, wonder of wonders, pilot performance improved dramatically.</p><p>When we design, we need to be cognizant of the variety of human experience and plan accordingly. <span data-quotable>For our work to be successful, we need to accommodate the adjustments our users require for <em>them</em> to be successful.</span> Responsive layouts, adaptive interfaces, support for assistive technologies… all of these approaches enable our work to go further by enabling it to be tailored to the permanent, temporary, and/or situational needs of our users.</p><p>All of this is to say, this episode made me an even more ardent believer in the idea of <a href="http://alistapart.com/article/understandingprogressiveenhancement">progressive enhancement</a> and the continuum of experience it enables. You should go listen to it now, I promise there’s more to the story.</p>]]></content><amg:summary><![CDATA[We look at averages all the time in our work. Some, like average Time To Interactive (TTI) for instance, are useful measurements that allow us to improve our work; others, like the “average” user are decidedly less so.]]></amg:summary><summary type="html"><![CDATA[<p>We look at averages all the time in our work. Some, like average Time To Interactive (TTI) for instance, are useful measurements that allow us to improve our work; others, like the “average” user are decidedly less so.</p>]]></summary><category term="progressive enhancement" /><category term="design" /><category term="web design" /><category term="user experience" /><category term="accessibility" /></entry><entry><id>https://www.aaron-gustafson.com/speaking-engagements/your-brand-is-not-a-logo/</id><title type="html"><![CDATA[📢 Your Brand is Not a Logo]]></title><link href="" rel="alternate" type="text/html" /><published>2015-06-03T08:09:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>A brief presentation on what it means to consider your brand holistically.</p>]]></content><amg:twitter><![CDATA[A brief presentation on what it means to consider your brand holistically.]]></amg:twitter><amg:summary><![CDATA[A brief presentation on what it means to consider your brand holistically.]]></amg:summary><summary type="html"><![CDATA[<p>A brief presentation on what it means to consider your brand holistically.</p>]]></summary><category term="business" /><category term="design" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/undefined" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/native-vs-stylable-tug-of-war/</id><title type="html"><![CDATA[✍🏻 The “Native” vs. “Stylable” Tug of War]]></title><link href="https://www.aaron-gustafson.com/notebook/native-vs-stylable-tug-of-war/" rel="alternate" type="text/html" /><published>2014-07-17T12:21:47Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>In his astute post <a href="https://www.brucelawson.co.uk/2014/native-experience-vs-styling-select-boxes/">“‘Native experience’ vs styling select boxes”</a>, Bruce Lawson correctly identified a common tension in the web world:</p><blockquote><p>But why this urge to re-style page elements that end-users are familiar with? … Or is it that we love native look and feel, except when we don’t?</p></blockquote><p>Speaking as the guy who not only wrote JavaScript to help me create an accessible <code>select</code> element alternative, but who also made it <a href="https://books.google.com/books/content?id=Wmg6dkBJd50C&amp;pg=PA507&amp;img=1&amp;zoom=3&amp;hl=en&amp;bul=1&amp;sig=ACfU3U2DB7JkEBRWEjSwZLHwIJnpGqgq9w&amp;w=1280">the focus of a case study (PNG, 128kB)</a> in <a href="https://amzn.to/TaoffD">AdvancED DOM Scripting</a>, I am fully aware of the desire to have it both ways. I have not often seen the desire for both in a single individual, but it does happen in one particular instance occasionally.</p><p>Based on my own experience, I see the following arguments in favor of changing the display of a browser-delivered UI control quite often:</p><ol><li>It doesn’t look good to me.</li><li>It is not “on brand”.</li><li>It clashes with our brand’s color scheme.</li><li>We want the web experience to feel like a platform-specific app.</li><li>It doesn’t behave how we think it should.</li></ol><p><em>(<abbr lang="it" title="nota bene: please note">n.b.</abbr> Browsers have done a pretty good job reducing the amount of color and the overall visual strength used in their UI controls to help them better blend in with a wide variety of designs, so clashes as mentioned in #3 happen far less often than they did nearly a decade ago.)</em></p><p>As the weathered, battle tested (and, admittedly, somewhat jaded) front-end dev that I am, I typically push back with one or more of the following:</p><h2 id="in-addressing-desired-design-changes" tabindex="-1"><a class="header-anchor" href="#in-addressing-desired-design-changes" aria-hidden="true">#</a> In Addressing Desired Design Changes</h2><p>In terms of aesthetics (addressing arguments 1, 2, and 3), I understand where you’re coming from. Browser-delivered UI controls are not the most appealing things, but they are familiar to your users. A <code>select</code> box they see on your site that looks like the one they see on Wikipedia or their banking site will be immediately recognizable. Sure, the looks and feel may differ from browser to browser, but most people use only a small number of browsers throughout the day—at work, at home, on their device—and if you want to ensure the design of a form control feels “right” in the browser they are using, sometimes it’s best to let go of that control.</p><h2 id="in-addressing-os-parity" tabindex="-1"><a class="header-anchor" href="#in-addressing-os-parity" aria-hidden="true">#</a> In Addressing OS Parity</h2><p>I can understand the desire to have a form control in a web page look and feel like the same (or a similar) control within the operating system (argument 4), but I am not sure that’s a rabbit hole you want to go down. Here’s why: Achieving exact design and functional parity between a platform-specific control and a web control quite often requires extra markup, a bunch of CSS, and a bit of JavaScript. Anything is achievable with unlimited time and budget, so it’s completely doable, but it would be good to estimate the cost to see if you still think it is a worthwhile endeavor.</p><p>Assuming it is, we then have the question of which operating system to model the control after. Or maybe you want to offer a different take on the control based on the operating system your user is using. In that case, we may need to multiply the original estimate by the number of operating systems you want to support. But it’s worth noting that, in the Android world, different device manufacturers often “skin” the operating system to look different from other ones. Sometimes they even do it on a device-by-device basis. We’ll need to figure out which ones you want to include in your platform-like control matrix and multiply the estimate accordingly.</p><p>Then there’s maintenance. We’ll need to test these platform-like controls on each of their corresponding platforms and test the script that determines which experience gets delivered to which device to make sure we’re not accidentally sending the wrong experience. We’ll also need to test the delivery script on every other browser in our test matrix to ensure it is not causing issues there.</p><p>What should we do when a new operating system version is rolled out? iOS, for example, has made radical shifts in the design of their platform-specific controls in each major release. We’ll probably want to create unique versions of the control for each version of each OS we support and we’ll need to keep tabs on upgrades so we don’t end up confusing our users if they visit our site in iOS 7 and have a control that looks like it’s from iOS 6. We’ll need to add the number of OS versions into the multiplier as well.</p><p>Ok, and finally: How many controls did you want to apply this approach to again?</p><p>Or we could use the browser-delivered form control and it will just work.</p><h2 id="in-addressing-altered-behavior" tabindex="-1"><a class="header-anchor" href="#in-addressing-altered-behavior" aria-hidden="true">#</a> In Addressing Altered Behavior</h2><p>I completely agree that not all browser-delivered UI controls work exactly how I would like, but there are several risks in changing the expected behavior.</p><p>First of all, there’s the possibility we could actually end up making the interface more confusing or that the change in behavior might not be exactly what our user’s wanted (either based on what they are used to or our mental model not aligning with theirs). In order to rule out these issues, we should run a few rounds of usability tests. These could be quick café tests or more formal studies depending on the budget.</p><p>Assuming our tests go well, we will need to maintain this code and do all of the requisite browser testing. And potentially upgrade our code as new browsers and browser versions come out. Depending on the complexity of the code, this could become a large requirement, but if it is ultimately in the service of making the web a better, more usable interaction environment, it could be worth it.</p><p>For what it’s worth, if we go this route and are successful, we should consider getting involved in the spec-writing process at the <a href="https://w3.org">W3C</a> or <a href="https://whatwg.org">WhatWG</a>. We should contribute our recommended changes back to the community and share what we learned. If we make a compelling argument, perhaps our idea will become part of some future standard and we can taper off our browser testing when the change lands in the platform.</p><hr><p>As you can probably tell, I’m not a really big fan of changing existing controls as I feel it can amount to a wasted effort. That said, if there are design improvements to be made—“design” in the true sense: being about how usable something is, not just how aesthetically-pleasing it is to someone (e.g. improving contrast, making the control more intuitive, etc.)—I’m willing to accept the change as something we <em>should</em> do and then work to make sure that change has been vetted and, if successful, given away for inclusion in other projects. If it solves a major issue on the web, I want to give that change every opportunity to make it into the appropriate spec by talking to the appropriate folks about it both in-person, in blog posts, and on the appropriate mailing list. If the change solves a problem in a specific browser, I want to see it incorporated into said browser and will file a bug report and try to build momentum around it by engaging the community.</p><p>Anyway, that’s my general position on augmenting browser-delivered UI controls. What are your thoughts on the topic?</p><p><em>Note: I no longer use “native” in this context, but it remains in quoted material.</em></p>]]></content><amg:summary><![CDATA[In his astute post “‘Native experience’ vs styling select boxes”, Bruce Lawson correctly identified a common tension in the web world: wanting better form controls vs. wanting to throw away what the browser does. Here are my thoughts.]]></amg:summary><summary type="html"><![CDATA[<p>In his astute post “‘Native experience’ vs styling select boxes”, Bruce Lawson correctly identified a common tension in the web world: wanting better form controls vs. wanting to throw away what the browser does. Here are my thoughts.</p>]]></summary><category term="web design" /><category term="browsers" /><category term="design" /><category term="mobile" /></entry><entry><id>https://www.aaron-gustafson.com/notebook/evernote-for-interface-inventories/</id><title type="html"><![CDATA[✍🏻 Evernote for Interface Inventories]]></title><link href="https://www.aaron-gustafson.com/notebook/evernote-for-interface-inventories/" rel="alternate" type="text/html" /><published>2013-07-10T12:00:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Earlier today, Brad Frost posted <a href="http://bradfrostweb.com/blog/post/interface-inventory/">a great piece touting the usefulness of interface inventories</a>. I’ll give him the floor to explain:</p><blockquote><p>An interface inventory is similar to a content inventory, only instead of sifting through and categorizing content, you’re taking stock and categorizing the components making up your website, app, intranet, hoobadyboop, or whatever (it doesn’t matter). An interface inventory is a comprehensive collection of the bits and pieces that make up your interface.</p></blockquote><p>Interface inventories are a great way to take stock of the design consistency (or inconsistency) of your site and are a typical first step in creating a pattern library. After all, you need to know what patterns you have before you can document them.</p><p>In his article, Brad offers a Keynote template for gathering your screenshots, but I have been living in Evernote lately, so I wanted to take a moment to show off how you might use Evernote’s tools to simplify the process of building an interface inventory. If you don’t have an Evernote account, you can <a href="https://www.evernote.com/Registration.action">get a free one here</a>.</p><p>One method of getting screenshots into Evernote is using <a href="http://evernote.com/skitch/">Skitch</a>. Skitch was originally developed by <a href="http://plasq.com/">plasq</a>, but was acquired by Evernote in 2011. It is a general purpose screenshotting tool that supports annotations, etc.</p><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-skitch.png"/></figure><p>Here’s a quick run-down on how to use Skitch to build your interface inventory:</p><p><strong>Step 1:</strong> Create a new Notebook for your interface inventory and adjust the Skitch preferences so it uses it.</p><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-skitch-prefs.png"/></figure><p><strong>Step 2:</strong> Click the “Screen Snap” button and adjust the crop tool to contain the interface object you want to capture.</p><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-screen-snapping.png"/><figcaption>Position your crosshairs and…</figcaption></figure><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-skitch-screenshot.png"/><figcaption>…your snap is captured in Skitch</figcaption></figure><p><strong>Step 3:</strong> Rinse &amp; repeat.</p><p>When Skitch syncs up to Evernote, your screenshots will magically appear on any device you have.</p><p>Another route to go involves the <a href="http://evernote.com/webclipper/">Evernote Web Clipper</a>. This add-on is available for pretty much every browser and is available as a <a href="http://en.wikipedia.org/wiki/Bookmarklet">bookmarklet</a> to boot.</p><p>Using the Web Clipper is every bit as simple as it is with Skitch. Possibly moreso. One bonus is that you have the benefit of being able to direct your individual clips to different notebooks within Evernote. Simply click the Web Clipper button, select the area to clip, and choose where you want the clip to go. You can even add any tags you might find useful.</p><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-web-clipper.png"/></figure><p>Either way you go, you will eventually end up with a nice little collection of interface artifacts in Evernote which are, in turn, available on the web and on any device where you have Evernote installed.</p><figure><img alt="" src="/i/posts/2013-07-10/interface-inventory-evernote-inventory.png"/><figcaption>All your interface are belong to us.</figcaption></figure><p>The nice thing about using a tool like Evernote for creating an interface inventory is that you can share this notebook with your colleagues to speed up the documentation. Simply divide up your interface into categories and go on a scavenger hunt. All of the snaps will sync to the same place and become a part of your interface inventory. Done and done.</p><p>Happy snapping!</p>]]></content><amg:summary><![CDATA[Earlier today, Brad Frost posted a great piece touting the usefulness of interface inventories . I’ll give him the floor to explain:]]></amg:summary><summary type="html"><![CDATA[<p>Earlier today, Brad Frost posted a great piece touting the usefulness of interface inventories . I’ll give him the floor to explain:</p>]]></summary><category term="design" /><category term="developer tools" /><category term="web design" /></entry><entry><id>https://www.aaron-gustafson.com/speaking-engagements/designing-with-empathy/</id><title type="html"><![CDATA[📢 Designing with Empathy]]></title><link href="" rel="alternate" type="text/html" /><published>2013-04-08T14:00:00Z</published><content type="html" xml:base="https://www.aaron-gustafson.com"><![CDATA[<p>Every decision we make affects the way real people experience our products. We’ve all heard the rallying cry for user-centered design, but even those of us who ascribe to that ideal often fall back on our own biases and instincts when it comes to making decisions about how people experience our content and our services. Sadly, this often means we make decisions we think will be good for our “users”—that anonymous, faceless crowd—rather than actually trying to understand the perspectives, surroundings, capabilities, and disadvantages of the actual people who we are here to serve.</p><p>In this session, I explore why empathy is a good thing, how empathy empowers creativity, and how we, as a community, can inject more empathy into our work.</p>]]></content><amg:twitter><![CDATA[In this session, I explore why empathy is a good thing, how empathy empowers creativity, and how we, as a community, can inject more empathy into our work.]]></amg:twitter><amg:summary><![CDATA[In this session, I explore why empathy is a good thing, how empathy empowers creativity, and how we, as a community, can inject more empathy into our work.]]></amg:summary><summary type="html"><![CDATA[<p>In this session, I explore why empathy is a good thing, how empathy empowers creativity, and how we, as a community, can inject more empathy into our work.</p>]]></summary><category term="empathy" /><category term="equality" /><category term="design" /><category term="user experience" /><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.aaron-gustafson.com/undefined" /></entry></feed>