<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HeydonWorks</title>
	<atom:link href="http://www.heydonworks.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.heydonworks.com</link>
	<description>The works, workings and reckonings of Heydon</description>
	<lastBuildDate>Mon, 21 Oct 2019 14:56:37 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.30</generator>
	<item>
		<title>Web Accessibility Is Out To Get You And Make You Feel Sad</title>
		<link>http://www.heydonworks.com/article/web-accessibility-is-out-to-get-you-and-make-you-feel-sad</link>
		<comments>http://www.heydonworks.com/article/web-accessibility-is-out-to-get-you-and-make-you-feel-sad#comments</comments>
		<pubDate>Mon, 21 Oct 2019 09:50:30 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=744</guid>
		<description><![CDATA[Since the landmark Domino&#8217;s case, I&#8217;ve been having some conversations about web accessibility with people who wouldn&#8217;t ordinarily take an interest. Some of these conversations have been productive; others have&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Since the <a href="https://arstechnica.com/tech-policy/2019/10/accessibility-the-future-and-why-dominos-matters/">landmark Domino&#8217;s case</a>, I&#8217;ve been having some conversations about web accessibility with people who wouldn&#8217;t ordinarily take an interest. Some of these conversations have been productive; others have not. The following is a dramatization based on true events.</p>
<p>&#8212;</p>
<p>DEVELOPER: Alright, lads? So what&#8217;s this accessibility thing all about then? Something about pizzas? Love a pizza, me. But no pineapples, haha <strong>TRIGGERED</strong>. But seriously, it sounds like I might be illegal or something. I don&#8217;t want to get fined and lose my second car. What&#8217;s the deal? </p>
<p>PATIENT ACCESSIBILITY ADVOCATE: Hi there. Accessibility is one of the fundamental—</p>
<p>DEVELOPER: Fucking hell, love, <strong>speak English much??</strong> This sounds complicated as fuck, <strong>Jesus</strong>. I&#8217;m only one man, I can&#8217;t do it all, much as I&#8217;d like to.</p>
<p>PATIENT ACCESSIBILITY ADVOCATE: Well, erm, no. It&#8217;s really fairly rudimentary, if you just—</p>
<p>DEVELOPER: <strong>TAGS! FUCKING TAGS EVERYWHERE!</strong> Fucking mess, it is, with all these tags.</p>
<p>PATIENT ACCESSIBILITY ADVOCATE: Wait, you mean HTML tags?</p>
<p>DEVELOPER: There were all these tags, right, and then HTML5 comes along. <strong>Jesus fuck</strong>. And then there were like&hellip; <strong>16 MORE FUCKIN TAGS</strong>. I can&#8217;t remember all that shit. Bad design it is, HTML. Can&#8217;t be helped. Would love to, but can&#8217;t.</p>
<p>PATIENT ACCESSIBILITY ADVOCATE #2: Hang on. I&#8217;m sure if you can learn things like asynchronous programming and the JavaScript event loop, you can easily manage to—</p>
<p>DEVELOPER: *SIGH* Tried, I really did. Gave it my best, but these standards people, these jokers and their tags. Makes it impossible for people like me who&#8217;d really really love to just make a <strong>GOD DANG accessible website</strong> once in a while, you know?</p>
<p>PATIENT ACCESSIBILITY ADVOCATE: But, wait, a minute ago you didn&#8217;t seem to know what accessibility even is? In any case, the Domino&#8217;s case sets a legal precedent whereby—</p>
<p>DEVELOPER: <strong>LAWS.</strong> Do we even need them? <strong>Fucked if I know.</strong> Take away the laws, and what do you get? Freedom, <em>that&#8217;s what</em>. Give me the <strong>FREEDOM</strong> to make my websites accessible, that&#8217;s what I say.</p>
<p>PATIENT ACCESSIBILITY ADVOCATE #2: You already have the freedom to—</p>
<p>DEVELOPER: Make all my websites just with <code>&lt;div></code>s. That&#8217;s what I&#8217;ll do. That&#8217;ll teach the standards bastards to make me not make my websites accessible. Tough love, someone&#8217;s gotta do it.</p>
<p>ME: First of all, that doesn&#8217;t make sense. Secondly, you&#8217;re being an asshole. Just take the time to—</p>
<p>DEVELOPER: <strong>GAH!!!! ARRGGHHHHH!!!! NO!! NONONONO!!! PLEASE NO!!! STOP!!!!</strong></p>
<p>PATIENT ACCESSIBILITY ADVOCATE: What&#8217;s happening?</p>
<p>ME: I&#8217;m not sure.</p>
<p>DEVELOPER: That word. That word you used on me. <strong>That &#8220;a&#8221; word</strong>. I&hellip; I&#8217;ve never&hellip; never in my life have I&hellip;oh God</p>
<p>ME: You can&#8217;t be seri—</p>
<p>DEVELOPER: I was just asking questions, that&#8217;s all, *sob*. And you just&hellip; <strong>went for me</strong>. Like I was <em>nothing</em> to you. Can&#8217;t you see I&#8217;m just a poor wee baby, with pink marshmallows for limbs, and a candy floss heart? Just asking questions, I was. <em>Just asking</em>.</p>
<p>SYCOPHANT #1: <strong>GOOD LORD, HEYDON</strong> what have you <em>done</em>? <strong>He&#8217;s dying</strong>. You monster, you coward, you husk-of-a-man. </p>
<p>SYCOPHANT #2: And Heydon has <strong>&#8220;INCLUSIVE DESIGNER&#8221;</strong> written right there in his bio. And that wasn&#8217;t inclusive behavior at all! <strong>THE IRONY.</strong></p>
<p>SYCOPHANT #1: Yes, quite, <em>the irony</em>.</p>
<p>SYCOPHANT #14: The irony.</p>
<p>SYCOPHANT #187: The irony.</p>
<p>SYCOPHANT #432: The irony.</p>
<p>SYCOPHANT #43451: Sorry I&#8217;m late, I was having a wank. The irony.</p>
<p>SYCOPHANT #199: The irony.</p>
<p>ME: OK, I get that you felt I was being a bit insulting. In any case, accessibility is a civil right and—</p>
<p>DEVELOPER: <strong>A BIT INSULTING??</strong></p>
<p>SYCOPHANT #432: <strong>YEAH A BIT INSULTING?? (please notice me)</strong></p>
<p>DEVELOPER: You <strong>deliberately</strong> (and with <strong>deliberation</strong>, don&#8217;t forget) <strong>FIRED</strong> that word, that <strong>seed of evil</strong>, into my ear. You, and by extension  everyone who has ever worked in web accessibility, is a foul demon sent to torment me, probably. Let&#8217;s go with that for now, I might back-pedal a bit later.</p>
<p>ME: Wait, just because I used a bit of strong language doesn&#8217;t mean everyone is—</p>
<p>SYCOPHANT #14: These accessibility people are always <strong>hating on us</strong> and using <strong>no-no words</strong>! And they think they&#8217;re the good guys! <strong>You couldn&#8217;t make it up!</strong></p>
<p>SYCOPHANT #432: The irony.</p>
<p>SYCOPHANT #199: Indeed, the irony.</p>
<p>SYCOPHANT #1647: Irn Bru.</p>
<p>SYCOPHANT #7384: Shut up, Kyle.</p>
<p>SYCOPHANT #111: The irony.</p>
<p>SYCOPHANT #76: The irony.</p>
<p>SYCOPHANT #88: The irony.</p>
<p>DEVELOPER: All I <strong>EVER</strong> wanted to do, since I first slid out of my mother and planted my feet into the rich, fertile soil of my homeland, was to make the web (which technically wasn&#8217;t invented yet) <strong>accessible</strong>, so help me God.</p>
<p>ME: &hellip;</p>
<p>DEVELOPER: But then YOU came along. You and <strong>YOUR WORD</strong>. And now I&#8217;m in hospital, on a drip. Do you want to know what&#8217;s in that drip, Heydon? <strong>Do you?</strong> Go on, ask me. <strong>Ask me what&#8217;s in the fucking drip, Heydon</strong>. It&#8217;ll <strong>fuck with your head.</strong></p>
<p>ME: Well, IV fluid is usually a dilute saline solution with—</p>
<p>DEVELOPER: <strong>IT&#8217;S MY TEARS, HEYDON. MY FUCKING TEARS.</strong> How am I supposed to make the web accessible now, Heydon? <strong>How?</strong> While I&#8217;m in hospital, <strong>with my own tears getting pumped into my fucking wrist?</strong></p>
<p>SYCOPHANT #432: <strong>FUCKING HELL, HEYDON! BY BEING RUDE THIS ONE TIME TO THIS ONE DUDE WHO CLEARLY HAS AN  EARNEST AND LONG-HELD DESIRE TO MAKE THE WEB ACCESSIBLE, YOU HAVE FUCKED EVERYTHING UP.</strong></p>
<p>SYCOPHANT #111: The web is inaccessible, <strong>and it&#8217;s all Heydon&#8217;s fault!</strong></p>
<p>SYCOPHANT #88: And he claims he <strong>LIKES</strong> web accessibility. The irony!</p>
<p>SYCOPHANT #7116: The irony.</p>
<p>SYCOPHANT #6: The irony.</p>
<p>SYCOPHANT #1957: Fallacy or something.</p>
<p>SYCOPHANT #677: No, I think it&#8217;s irony this time.</p>
<p>SYCOPHANT #8836: The irony.</p>
<p>&#8212;</p>
<p><em>A couple of hours later, in my DMs:</em></p>
<p>FOLLOWER ABOUT TO UNFOLLOW ME: Hi Heydon. I just wanted to say: I bought and enjoyed all of your books on web accessibility. They taught me so much. But then you called that one guy a no-no word, and I am forced to conclude that you are a shit demon, sent from shitty hell, and covered in shit and stuff. Also, I think you probably catapult dogs into the sea. Good day, sir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/web-accessibility-is-out-to-get-you-and-make-you-feel-sad/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Every Layout Is Released: Some Facts</title>
		<link>http://www.heydonworks.com/article/every-layout-is-released-some-facts</link>
		<comments>http://www.heydonworks.com/article/every-layout-is-released-some-facts#comments</comments>
		<pubDate>Mon, 29 Jul 2019 09:11:12 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=735</guid>
		<description><![CDATA[In case you haven&#8217;t already heard: the full version of Every Layout is now ready for purchase! You&#8217;ll find all the information you need on the Every Layout site. This&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">In case you haven&#8217;t already heard: the <a href="https://every-layout.dev/checkout">full version of <strong>Every Layout</strong></a> is now ready for purchase! You&#8217;ll find all the information you need on the <a href="https://every-layout.dev"><strong>Every Layout</strong> site</a>.</p>
<p>This post is just an opportunity to tell you that in a different channel (done!) and to share some fun™ facts about how <strong>Every Layout</strong> came together.</p>
<p>1. Andy and I didn&#8217;t actually meet IRL (in real life) until after the launch of our product.<br />
2. The site/book includes over 100 diagrams, all in black and white, and created in the superior (free!) SVG editor: <a href="https://inkscape.org/">Inkscape</a>.<br />
3. The weird sounding phrases (&#8220;CSS is hard&#8221;, &#8220;CSS is bad&#8221;, &#8220;I hate CSS&#8221;) from the <a href="https://www.youtube.com/watch?v=rCLO5jRLC3k">trailer video</a> were created using the <a href="https://developer.mozilla.org/en-US/docs/Web/API/SpeechSynthesis">Speech Synthesis API</a> with randomized voice profiles and pitches for each word.<br />
4. Heydon promised to wear a pair of latex crab claws for his <a href="https://vimeo.com/showcase/4673650/video/345905639">Patterns Day talk</a> if the site took more than 5000 subscribers. On the morning of Patterns Day, the subscriber count was 5046. As many have pointed out, the claws—despite coming from the card game You&#8217;ve Got Crabs—are anatomically more similar to those of a lobster.<br />
5. The site, built using <a href="https://www.11ty.io/">Eleventy</a>, uses JSDOM to server-side render the <a href="https://every-layout.dev/layouts/">layout components</a> which, despite being custom elements, are therefore not dependent of JavaScript running in the browser.<br />
6. The book is created by hooking up <a href="https://www.11ty.io/">Eleventy</a> with <a href="https://pandoc.org/">pandoc</a> to produce the EPUB file.<br />
7. We have <a href="https://every-layout.dev/blog/you-pay/">an honour system</a>, according to which you may qualify for a free copy of <strong>Every Layout</strong>. When you buy <strong>Every Layout</strong>, you help us give those who can&#8217;t afford it free copies. We&#8217;ve given away more than 25 free copies already.<br />
8. At least one person uses the music from the trailer video (composed by Heydon) <a href="https://www.youtube.com/watch?v=rCLO5jRLC3k&#038;lc=Ugx1h_jBIWXsE-o244B4AaABAg">as their alarm clock</a>.<br />
9. The development codename for Every Layout was <em>Robert</em>, which should be pronounced as The Alderman pronounces it on <a href="https://athleticomince.com/">Athletico Mince</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/every-layout-is-released-some-facts/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Withdraws React</title>
		<link>http://www.heydonworks.com/article/facebook-withdraws-react</link>
		<comments>http://www.heydonworks.com/article/facebook-withdraws-react#comments</comments>
		<pubDate>Fri, 22 Mar 2019 12:22:20 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=732</guid>
		<description><![CDATA[It&#8217;s important you sign and share this petition. Right now, it&#8217;s the closest thing Britain has to averting serious disaster in the next few days. It&#8217;s really important, unlike the&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">It&#8217;s important you <a href="https://petition.parliament.uk/petitions/241584">sign and share this petition</a>. Right now, it&#8217;s the closest thing Britain has to averting serious disaster in the next few days. It&#8217;s really important, unlike the status of a single open source JavaScript project. Thank you.</p>
<p><strong><a href="https://petition.parliament.uk/petitions/241584">Revoke Article 50</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/facebook-withdraws-react/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Flexbox Holy Albatross Reincarnated</title>
		<link>http://www.heydonworks.com/article/the-flexbox-holy-albatross-reincarnated</link>
		<comments>http://www.heydonworks.com/article/the-flexbox-holy-albatross-reincarnated#comments</comments>
		<pubDate>Mon, 14 Jan 2019 08:51:12 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=708</guid>
		<description><![CDATA[You may want to read the original Flexbox Holy Albatross post but basically, I missed a step (I was hungover): You can switch between horizontal (multi-column) to vertical (single column)&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">You may want to read the original <a href="http://www.heydonworks.com/article/the-flexbox-holy-albatross">Flexbox Holy Albatross post</a> but basically, I missed a step (I was hungover): You can switch between horizontal (multi-column) to vertical (single column) Flexbox layouts just using <code>flex-basis</code>. No <code>min-width</code> or <code>max-width</code> needed — in fact, they just restrict Flexbox from doing its beautiful Flexbox thing. </p>
<p>This way, <em>any</em> number of horizontal elements can become vertical elements at a &#8216;container query&#8217; breakpoint (<code>40rem</code> in the below example). </p>
<p><a href="https://codepen.io/heydon/pen/JwwZaX">Here&#8217;s a CodePen</a>.</p>
<h2>The code</h2>
<pre><code>.container {
  display: flex;
  flex-wrap: wrap;
  --margin: 1rem;
  --modifier: calc(40rem - 100%);
  margin: calc(var(--margin) * -1);
}

.container > * {
  flex-grow: 1;
  flex-basis: calc(var(--modifier) * 999);
  margin: var(--margin);
}</code></pre>
<p>Also: <a href="https://twitter.com/heydonworks/status/1084856193795919874">You can set different individual item widths with <code>flex-grow</code> still</a>.</p>
<h2>The Holy Albatross with a Quantity Query</h2>
<p>What if you wanted to display the items horizontally above a certain container width <em>only</em> if there are fewer than a certain number of items. <a href="https://codepen.io/heydon/pen/RvZQXR">This CodePen</a> does just that. It also removes the custom properties (which are just for readability, really) so it works in Internet Explorer!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/the-flexbox-holy-albatross-reincarnated/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Flexbox Holy Albatross</title>
		<link>http://www.heydonworks.com/article/the-flexbox-holy-albatross</link>
		<comments>http://www.heydonworks.com/article/the-flexbox-holy-albatross#comments</comments>
		<pubDate>Sun, 13 Jan 2019 00:09:37 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=666</guid>
		<description><![CDATA[For the last 6 or so months, I&#8217;ve been engaged in a number of activities including (but not limited to): Scratching my head Staring out of the window Laying in&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">For the last 6 or so months, I&#8217;ve been engaged in a number of activities including (but not limited to):</p>
<ul>
<li>Scratching my head</li>
<li>Staring out of the window</li>
<li>Laying in bed and staring at the ceiling</li>
<li>Screaming into a pillow</li>
<li>Rolling around on the floor sweating feverishly while muttering archaic and forbidden incantations</li>
</ul>
<p>Coincidentally, I&#8217;ve been spending this same time period trying to solve a particularly vexing CSS layout problem. You might say the problem has become both my albatross and my Holy Grail; my Holy Albatross, if you will.</p>
<p>At 5am this morning, through the fug of a Tiny Rebel Stay Puft Marshmallow Porter™ hangover, the solution struck me. And now I&#8217;m going to share it with you.</p>
<h2>The problem</h2>
<p>With Flexbox you can combine <em>wrapping</em> (<code>flex-wrap: wrap</code>) and <em>growing</em> (<code>flex-grow: 1</code>) to ensure all flex items fall into their rightful place across different viewport widths. Flexbox can create an effortlessly responsive layout with no collisions or unseemly gaps in sight.</p>
<p>The trouble is, sometimes you want your items to wrap in a very particular way. For instance, when you have three items, you&#8217;ll be happy with the three-abreast layout and accepting of the single-column configuration. But you might like to avoid the intermediary part where you get a pair of elements on one line followed by a longer element underneath.</p>
<div><img src="http://www.heydonworks.com/wp-content/uploads/2019/01/flex1.png" alt="The three in a row layout bypasses the 2 followed by 1 layout straight to the one per row layout" width="799" height="118" class="alignnone size-full wp-image-676" /></div>
<p>Why? Well, when you have a set of three equivalent items and one is displayed differently it looks deliberate — like you consider the third item special and want the user to perceive it that way. It&#8217;s bigger; does that mean it&#8217;s better? Or more important?</p>
<p>But never mind the whys and wherefores. How do we skip this intermediary layout state and switch directly from a horizontal to vertical triptych? What&#8217;s the solution?</p>
<h2>Use a media query, silly</h2>
<p>No, I don&#8217;t want to. In fact, <strong>I outright refuse to</strong>. And it&#8217;s not just because I&#8217;m self-conscious about writing the cleanest and cleverest code. It&#8217;s because <strong><code>@media</code> breakpoints are anathema to design systems</strong>. My component, defined outside of context, could be instantiated within a container/parent element of any width. Context is variable, but all <code>@media</code> queries can do is adjust things according to the constant that is the viewport.</p>
<div><img src="http://www.heydonworks.com/wp-content/uploads/2019/01/flex2.png" alt="In a wide viewport the elements are on one row. On a narrow viewport they are on three rows. Unfortunately, in a narrow context inside a wide viewport its one row." width="901" height="316" class="alignnone size-full wp-image-677" /></div>
<p>Useless, actually. And that&#8217;s why so many people have been writing and fighting and conspiring for <a href="https://css-tricks.com/container-query-discussion/">container queries</a>: breakpoints that correspond to the immediate container element instead of the viewport.</p>
<p>The trouble is, container queries ask a lot from browsers and nobody&#8217;s come up with a native CSS solution that would be acceptably performant. Soooooo&hellip; JavaScript?</p>
<h2>JavaScript all the things</h2>
<p>Using <code>ResizeObserver</code> you can spawn element/container queries with very little code. I spun this little module up earlier this morning; you can have it.</p>
<pre><code>export default function markBreak(elem, width) {
  if (ResizeObserver) {
    const test = document.createElement('div');
    test.classList.add('test');
    test.style.width = width;
    elem.appendChild(test);
    let br = test.offsetWidth;
    elem.removeChild(test);

    const ro = new ResizeObserver( entries => {
      for (let entry of entries) {
        const cr = entry.contentRect;
        const q = cr.width <= br;
        entry.target.classList.toggle('lt-' + width, q);
        entry.target.classList.toggle('gte-' + width, !q);
      }
    });

    ro.observe(elem);
  }
}</code></pre>
<p>(There's a great <a href="https://developers.google.com/web/updates/2016/10/resizeobserver">intro to ResizeObserver by Surma</a>.)</p>
<p>If I wanted my triptych to become a vertical column from <code>40rem</code>, I'd just execute <code>markBreak(container, '40rem')</code> and write this CSS:</p>
<pre><code>.container > * {
  width: 100%;
}

.container.gte-40rem > * {
  width: 33%;
}
</code></pre>
<p>Not bad because:</p>
<ol>
<li><code>ResizeObserver</code> is optimized for efficiency. Much less janky than using <code>onresize</code> or some such horror</li>
<li>It's a progressive enhancement: if JavaScript doesn't run, or <code>ResizeObserver</code> isn't supported, the user gets a perfectly adequate single column configuration regardless of the container width.</li>
<li>The <code>test</code> element lets you choose a breakpoint using any unit. '20em' would be accurate because the relative dimension is translated to pixels <em>for the current context</em> (20rem could mean something else entirely elsewhere in the page).</li>
</ol>
<p>But actually it's quite bad because:</p>
<ol>
<li>JavaScript may well not run, and is always relatively intensive when it does. And it makes you bleed profusely from your anus.</li>
<li><code>ResizeObserver</code> is currently only supported in Chrome and *checks notes* Opera for desktop.</li>
</ol>
<p>So is there a CSS-only solution? Yes, there is (well, HTML and CSS to be honest). I hope you like custom properties and the <code>calc()</code> function.</p>
<h2>Solved with CSS</h2>
<p><strong>HOLD YOUR HORSES!</strong> <em>I now have a MUCH SMARTER solution using just <code>flex-basis</code>, meaning any number of horizontal elements can be switched to a vertical configuration. This will probably suit you better. See <a href="http://www.heydonworks.com/article/the-flexbox-holy-albatross-reincarnated">The Flexbox Holy Albatross Reincarnated</a>.</em></p>
<p>Let's break this down. I want my component to be flexible; to grow and shrink. However, I only want the items to take up <em>either</em> 33% or 100% of the container/parent element's width. The easy part is ensuring the elements never take up <em>less</em> than 33% or <em>more</em> than 100%:</p>
<pre><code>.container > * {
  min-width: 33%;
  max-width: 100%;
  flex-grow: 1;
}</code></pre>
<p>(The <code>flex-grow</code> part is really just because I can't be bothered to write out 33.33333333333%. It makes sure each column distributes to take up exactly one third of the space.)</p>
<p>The <code>flex-basis</code> property sets the basic/initial width for any item. Items can still grow and shrink from the <code>flex-basis</code> value where there's room. Critically, <code>min-width</code> and <code>max-width</code> override <code>flex-basis</code>. So if the <code>flex-basis</code> value is absurdly high, like 999rem, the width will fall back to 100%. If it's absurdly low, like -999rem, it'll default to 33% (or 33.333333333333% thanks to <code>flex-grow</code>).</p>
<div><img src="http://www.heydonworks.com/wp-content/uploads/2019/01/flex4.png" alt="Diagram shows how the absurdly low and high flex-basis values pull the width to the minimum and maximum points of 33% and 100% respectively" width="900" height="165" class="alignnone size-full wp-image-688" /></div>
<p>The key is making this switch at the desired point. For argument's sake, this point will be 40rem. At below 40rem, the items will be on one row. At 40rem and above, they'll each have their own row.</p>
<p>On the container, I set a custom property, <code>--multiplier</code>:</p>
<pre><code>.container {
  display: flex;
  flex-wrap: wrap;
  --multiplier: calc(40rem - 100%);
}</code></pre>
<p>That's right: the calculated value will be positive if the container is 40rem or more and negative if it's narrower than 40rem. On the flex items we use this as a multiplier, setting our absurdly high or absurdly low <code>flex-basis</code> value. 999 is customary in these situations.</p>
<pre><code>.container > * {
  min-width: 33%;
  max-width: 100%;
  flex-grow: 1;
  flex-basis: calc(var(--multiplier) * 999);
}</code></pre>
<div><img src="http://www.heydonworks.com/wp-content/uploads/2019/01/flex3.png" alt="In a wide viewport the elements are on one row. On a narrow viewport they are on three rows. Now, in a narrow context inside a wide viewport the items are one per row as desired" width="901" height="316" class="alignnone size-full wp-image-678" /></div>
<p>And that is that. </p>
<p><strong>Edit:</strong> <em>As Snook points out in his <a href="https://snook.ca/archives/html_and_css/understanding-the-flexbox-albatross">follow-up post</a>, the custom property isn't needed. I should have explained you can just include the value as part of the child element's calc. Why? Because <code>100%</code> is the same for the parent and the child. However, I like to name and set this value with the container, for readability. It's also neat how dynamic custom property values are automatically inherited. There might be more wild things can be done with that.</p>
<p>Unless you want margins. You can use the negative margin hack (as <a href="https://youtu.be/qOUtkN6M52M?t=269">demonstrated in my video</a>) to keep things flush, but you need to remove the margin from the <code>min-width</code> value to make sure things still 'switch' where they're supposed to:</p>
<pre><code>.container {
  display: flex;
  flex-wrap: wrap;
  --margin: 1rem;
  --multiplier: calc(40rem - 100%);
  margin: calc(var(--margin) * -1); /* excess margin removed */
}

.container > * {
  min-width: calc(33% - (var(--margin) * 2)); /* remove from both sides */
  max-width: 100%;
  flex-grow: 1;
  flex-basis: calc(var(--multiplier) * 999);
  margin: var(--margin);
}</code></pre>
<p>(This will become redundant when the <code>gap</code> property is more widely supported. Think <code>grid-gap</code> but for Grid, Flexbox, and other contexts.)</p>
<p>It can also work with different numbers of elements and elements of different widths. For example, given four elements, you may want the odd ones to be 20% and the even ones 30% above 60rem. Here's Flexbox, custom properties, <code>calc()</code>, and <code>nth-child</code> all working nicely together:</p>
<pre><code>.container {
  display: flex;
  flex-wrap: wrap;
  --margin: 1rem;
  --multiplier: calc(60rem - 100%);
  margin: calc(var(--margin) * -1);
}

.container > * {
  max-width: 100%;  
  flex-grow: 1;
  flex-basis: calc(var(--multiplier) * 999);
  margin: var(--margin);
}

.container > :nth-child(2n - 1) {
  min-width: calc(20% - (var(--margin) * 2));
}

.container > :nth-child(2n) {
  min-width: calc(30% - (var(--margin) * 2));
</code></pre>
<p>(Note the use of <code>*</code> and the cascade here, so not to redundantly repeat shared declarations. The older CSS stuff still pulls its weight!)</p>
<p><a href="https://codepen.io/heydon/pen/ebQyYV">Here is a demo of the basic version in CodePen</a>. If you want to learn more about algorithmic layouts for the web, <a href="https://www.youtube.com/watch?v=qOUtkN6M52M">I have a video you might like</a>. See also <a href="https://medium.freecodecamp.org/the-fab-four-technique-to-create-responsive-emails-without-media-queries-baf11fdfa848">The Fab Four technique</a> which, as was pointed out to me, arrives at a very similar solution, except with <code>width</code> in place of <code>flex-basis</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/the-flexbox-holy-albatross/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick 2018 Review</title>
		<link>http://www.heydonworks.com/article/quick-2018-review</link>
		<comments>http://www.heydonworks.com/article/quick-2018-review#comments</comments>
		<pubDate>Mon, 24 Dec 2018 16:10:11 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=659</guid>
		<description><![CDATA[Just for the sake of some links for the most part — in case you missed anything. I helped Bulb make their new, accessible design system Inclusive Components went from&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Just for the sake of some links for the most part — in case you missed anything.</p>
<ul>
<li>I helped Bulb make their new, <a href="http://design.bulb.co.uk/#/patterns/styles/colors/README.md">accessible design system</a></li>
<li>Inclusive Components went from <a href="https://inclusive-components.design/">blog</a> to <a href="http://book.inclusive-components.design/">book</a></li>
<li>I created a <a href="https://mutable.gallery/">customizable generative art gallery</a> with SVG and Vue</li>
<li>I learned lots about web components and created a <a href="https://github.com/Heydon/bruck">prototyping tool</a></li>
<li>I gave <a href="https://fronteers.nl/congres/2018/speakers#heydon-pickering">my third Fronteers conference talk</a></li>
<li>I wrote and produced my first instructional videos, on <a href="https://www.youtube.com/watch?v=k-v7lmmF7kc">CSS custom properties</a> and <a href="https://www.youtube.com/watch?v=eCHt8zsbCT4">CSS shapes</a></li>
<li>I wrote about the <a href="https://medium.com/@Heydon/choosing-the-right-javascript-arrow-function-a-guide-5151c5c6b8b6">many JavaScript arrow functions</a></li>
<li>I spoke at my second <a href="https://www.meetup.com/London-Accessibility-Meetup/">London Accessibility meetup</a></li>
<li>I started working with the BBC to help them rewrite their front-end design patterns</li>
<li>I gave the last keynote at the wonderful <a href="http://conf.a11yto.com/">a11yTO conference</a></li>
<li>I started a conversation about <a href="https://medium.com/@Heydon/reluctant-gatekeeping-the-problem-with-full-stack-e9ad836570f6">full stack development, sexism, and capitalism</a></li>
<li>I went bowling with some Syrian refugees</li>
<li>I ran my first workshops, in The Hague and Toronto</li>
<li>I had a lot of dark and hopeless days, was visited by the memories of past failures and degradations, and cried in the shower a lot</li>
<li>Some stuff I can&#8217;t remember</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/quick-2018-review/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reluctant Gatekeeping: The Problem With Full Stack</title>
		<link>http://www.heydonworks.com/article/reluctant-gatekeeping-the-problem-with-full-stack</link>
		<comments>http://www.heydonworks.com/article/reluctant-gatekeeping-the-problem-with-full-stack#comments</comments>
		<pubDate>Mon, 03 Dec 2018 15:16:29 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=648</guid>
		<description><![CDATA[Much of my career as a web designer has been spent, quite happily, working alongside programmers, engineers, people with computer science degrees. In this symbiotic relationship, each party has a&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Much of my career as a web designer has been spent, quite happily, working alongside programmers, engineers, people with computer science degrees. In this symbiotic relationship, each party has a secure job with a well-defined role, and gets to work on the thing they are best at and enjoy the most.</p>
<p>It’s not that the computer scientists get to do all the code; it’s that they get to do architecture while I do communication, form, and interaction. We all code, because we work on the web, but we code in different ways to achieve different and complementary ends.</p>
<p>But that’s not so obvious to someone who doesn’t code at all: it’s easy to think coders are people who do <em>all</em> the code you’re <em>not</em> doing — because, to the untrained eye, all code is the same.</p>
<p>This misconception has unfortunate consequences, exacerbated by the non-coder often being the one who gets to choose and hire technical staff. The doctrine of capitalism dictates you should squeeze the most value out of the fewest resources. That’s how you make a profit. If you can find wage slaves willing to do All The Codez™, then you can significantly diminish your biggest overhead: <em>people</em>.</p>
<p>And so the Full Stack Developer emerges in the market, like an Uruk-hai emerging from its grimy placenta: stronger, better, problematic.</p>
<p>Problematic how?  Well, HTML, CSS, JavaScript, Python, C#, and SQL may all be code, but they’re really quite different kinds of code and are suited to different kinds of people. Just taking the frontend technologies: HTML, a metalanguage, is closely associated with language, narrative and meaning: the realm of the writer. CSS codifies form, the purview of the typographer and graphic artist, while JavaScript (client-side in this case, but the real™ programming language to a computer scientist) deals in things like data transmission and events.</p>
<p>This is all to say that, if you put someone in charge of all of these things, it’s highly likely they are going to be much weaker in some areas than others (I’m identifying a trend here; there’s no need to comment with “but I can do all the things”, thank you). Worse: they’ll tend to have little interest in improving in areas with which they don’t identify or for which they aren&#8217;t rewarded. In my experience, men especially earn kudos for their knowledge of JavaScript, but little from CSS skills. CSS, which makes things look ‘pretty’, is considered feminine (don’t tell that to a peacock).</p>
<p>By assuming the role of the Full Stack Developer (which is, in practice, a computer scientist who also writes HTML and CSS), one takes responsibility for all the code, in spite of its radical variance in syntax and purpose, and becomes the gatekeeper of at least some kinds of code <strong>one simply doesn’t care about writing well</strong>. This has two adverse effects:</p>
<ol>
<li>Poor quality code</li>
<li>A bunch of people who can (and would enjoy!) expertly writing that code, standing unemployed on the sidelines muttering “WTF”</li>
</ol>
<p>As an inclusive design consultant, one of the most glaring issues with making Full Stack Developers the gatekeepers of all-things-code is the pitiful quality of the HTML output. Most come from a computer science background, and document structure is simply not taught alongside control structure. It’s not their competency, but we still make it their job.</p>
<p>To a ‘classical’ computer scientist, CSS can be quite elusive. Features like the cascade just don’t <em>feel</em> right. To make CSS easier to write and manage, it becomes subsumed by something more familiar, hence CSS-in-JS.</p>
<p>CSS-in-JS is often characterized as a solution (by practitioners) or a problem (by naysayers) in technical terms. I don’t think it makes the actual CSS intrinsically any better or worse — it’s just a different way to write it. But that’s not to say it doesn’t pose a grave cultural issue:</p>
<p>Put CSS in JS and anyone who wishes to write CSS now has to know JavaScript. Not just JavaScript, but —most likely—the specific ‘flavor’ of JavaScript called React. That’s gatekeeping, first of all, but the worst part is the JavaScript aficionado didn’t want CSS on their plate in the first place.</p>
<p>I recently worked with an organization where there were dozens of Full Stack Developers and no Frontend Developers. We had a website to build and nobody understood Flexbox, except me. Of course I was happy to help, but I had to learn React on the job to put the work in place. Fortunately I picked it up quite quickly, but the next CSS expert may not have done. The value you want from a CSS expert is their CSS, not their JavaScript, so it&#8217;s absurd to make JavaScript a requirement.</p>
<hr/>
<p name="f604" id="f604" class="graf graf--p graf--leading">To conclude, here are a few things I think we need to address:</p>
<ol class="postList">
<li name="2080" id="2080" class="graf graf--li graf-after--p">We need to identify exploitation. While there are some gleeful Full Stack Developers, many are computer scientists given too many responsibilities, and over things for which they are not willing or qualified to be held accountable.</li>
<li name="02fd" id="02fd" class="graf graf--li graf-after--li">We need to address the undervaluing of HTML and CSS for what it is: gender bias. Even though we wouldn’t have computer science without pioneering women, interloping men have claimed it for themselves. Anything less than ‘real programming’ is now considered trivial, silly, artsy, female. That attitude needs to eat a poisoned ass.</li>
<li name="3d43" id="3d43" class="graf graf--li graf-after--li">We need to revisit the separation of concerns principle. We simple can’t afford for people to have to <em class="markup--em markup--li-em">know everything</em> just to <em class="markup--em markup--li-em">do something</em>. It’s good that we conceptualize designs in terms of self-contained components now, but that can be a mental model without being a technology-specific land-grab.</li>
<li name="b01f" id="b01f" class="graf graf--li graf-after--li graf--trailing">Most of all, we need to educate people who don’t code at all just how many different things different types of code can do, and how different each is to understand and write. Hopefully, this way, more of us will be writing the kind of code that suits us best, and not spending our time anxious and demoralized because we don’t know what we’re doing. That’s not to say that if you <em class="markup--em markup--li-em">do</em> take to JS, CSS, HTML, SQL, and C# you shouldn’t be writing all of them if you‘d like to and you have enough time!</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/reluctant-gatekeeping-the-problem-with-full-stack/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS: A New Kind Of JavaScript</title>
		<link>http://www.heydonworks.com/article/css-a-new-kind-of-javascript</link>
		<comments>http://www.heydonworks.com/article/css-a-new-kind-of-javascript#comments</comments>
		<pubDate>Thu, 12 Jul 2018 21:47:59 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=640</guid>
		<description><![CDATA[Originally published on Medium. Those familiar with the web platform will be well-versed in its two complementary technologies: HTML for documents and their structure, and JavaScript for interaction and styling.&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro"><em><a href="https://medium.com/@Heydon/css-a-new-kind-of-javascript-fcf730d33ce7">Originally published on Medium</a>.</em></p>
<p>Those familiar with the web platform will be well-versed in its two complementary technologies: <strong>HTML</strong> for documents and their structure, and <strong>JavaScript</strong> for interaction and styling.</p>
<p>For as long as anyone can remember, styling documents — affecting their appearance — has been facilitated via the JavaScript <code>style</code> property, which is exposed for any supporting DOM node.</p>
<pre><code>node.style.color = 'red';</code></pre>
<p>Before the advent of this styling API, HTML authors had to write style attributes into the DOM manually, impeding the editorial process.</p>
<p>Combined with JavaScript’s node selection engine, we are able to style multiple elements simultaneously. In the following example, all <code>p</code> nodes are styled with the red text color.</p>
<pre><code>const nodes = document.querySelectorAll('p');
Array.prototype.forEach.call(nodes, node => {
  node.style.color = 'red';
});</code></pre>
<p>One of the great things about this selector engine is it allows one to target different elements simultaneously, by providing a comma-separated list.</p>
<pre><code>const nodes = document.querySelectorAll('p, li, dd');</code></pre>
<p>What’s less straightforward is attaching multiple styles to any one node. The following approach quickly becomes verbose.</p>
<pre><code>node.style.color = 'red';
node.style.backgroundColor = 'black';
node.style.padding = '1rem';
// etc.</code></pre>
<p>The only standardized alternative is to use the <code>cssText</code> property:</p>
<pre><code>node.style.cssText = 'color: red; background-color: black; padding: 1rem;';</code></pre>
<p>Managing multiple styles as a single string is problematic. It makes it difficult to update, remove, or replace individual styles at a later point in time.</p>
<p>For this reason, authors have invented ways to manage styling information in objects, often by manipulating the <code>Element</code> interface’s prototype.</p>
<pre><code>Element.prototype.styles = function(attrs) {
  Object.keys(attrs).forEach(attr => {
    this.style[attr] = attrs[attr];
  });
}</code></pre>
<p>Adding styles to a node is now possible like so:</p>
<pre><code>node.styles({
  'color': 'red',
  'backgroundColor': 'black',
  'padding': '1rem'
});</code></pre>
<p>This assignment approach tends to get used <em>a lot</em> throughout an application and its lifecycle. It’s infamously difficult to know where to put all this stuff, or how to clearly separate it from the interaction scripting that is JavaScript’s other responsibility.</p>
<p>But there’s another, more fundamental, problem: these style properties are not reactive. For example, let’s say I’ve set some styles for disabled buttons:</p>
<pre><code>const disableds = document.querySelectorAll('[disabled]');
Array.prototype.forEach.call(disableds, disabled => {
  disabled.styles({
    'opacity': '0.5',
    'cursor': 'not-allowed'
  });
});</code></pre>
<p>These styles only apply to disabled buttons that are already in the DOM. Any disabled buttons added to the DOM or — more likely—buttons that acquire the disabled property/attribute, will not automatically adopt the appropriate styling.</p>
<pre><code>button.disabled = true;
button.style // nothing new here
</code></pre>
<p>It is possible to listen for the attribute change and react to it using <code>mutationObserver</code>:</p>
<pre><code>const button = document.querySelector('button');
var config = { attributes: true }
var callback = function(mutationsList) {
  for(var mutation of mutationsList) {
    if (mutation.type == 'attributes') {
      if (button.disabled) { 
        button.styles({
          'opacity': '0.5',
          'cursor': 'not-allowed'
        });
      }
    }
  }
}
var observer = new MutationObserver(callback);
observer.observe(button, config);</code></pre>
<p>I think we can agree this is quite a lot of code, especially since it only makes one instance of one type of element reactive to one type of attribute change. It also only changes the styling in one direction: we’d have to handle reverting the styles when the disabled property is removed. Not easy, since we don’t know the initial values for <code>opacity</code> or <code>cursor</code>.</p>
<p>As much as I like JavaScript, I don’t think it’s very well designed when it comes to styling tasks. It is, after all, a procedural and event-based language, whereas style is just something you have or you don’t.</p>
<p>We waste far too much time writing and maintaining styles with JavaScript, and I think it’s time for a change. Which is why it’s my pleasure to announce an emerging web standard called <strong>CSS</strong>.</p>
<h2>CSS</h2>
<p>CSS is a declarative subset of JavaScript, optimized for styling tasks. A CSS file takes the <code>.css</code> extension and, importantly, is parsed completely separately to standard JavaScript files. With CSS it’s finally possible to separate style from behavior. You can brand your applications without having to touch your business logic!</p>
<h3>Syntactic sugar</h3>
<p>One of the first things you’ll notice is the cleaner syntax, which fans of CoffeeScript will appreciate:</p>
<pre><code>[disabled] {
  opacity: 0.5;
  cursor: not-allowed;
}</code></pre>
<p>The object-like structure remains, but you no longer have to explicitly call upon <code>querySelectorAll</code> to iterate over DOM nodes. The iteration is taken care of internally instead, making it more performant too.</p>
<p>The above example affects all DOM nodes with the <code>disabled</code> attribute automatically. Better yet: any new buttons adopting the disabled property will immediately adopt the associated styles. Reactive out of the box!</p>
<h3>The cascade</h3>
<p>CSS stands for <strong>Cascading Style Sheets</strong>. The cascading part is perhaps its best feature. Consider the following CSS.</p>
<pre><code>button {
  background-color: blue;
  cursor: pointer;
}
[disabled] {
  cursor: not-allowed;
}</code></pre>
<p>The styles for the <code>[disabled]</code> ‘block’ come after the <code>button</code> block in the style sheet. Any styles declared in the <code>[disabled]</code> block with the same keys (property names) as those in the preceding <code>button</code> block become overrides. The upshot is that adding the <code>disabled</code> attribute/property to a button only updates pertinent styles. In the above example, <code>cursor</code> is updated but <code>background-color</code> remains the same. It’s a kind of filtering system.</p>
<p>In addition, where the <code>disabled</code> attribute/property is removed, the default styles are automatically reinstated — because now the node only matches the <code>button</code> block further up the cascade. No need to ‘remember’ which styles have been applied and under which conditions.</p>
<h3>Resilience</h3>
<p>When styling with JavaScript, any unrecognized style properties or syntax mistakes will cease the parsing of the script. Any ensuing styles or interactions will simply be dropped en masse and your whole application will fall over.</p>
<p>CSS is more robust. In most cases, an unrecognized property or a syntax mistake will only cause the single, erroneous declaration (property/value pair) to be dropped.</p>
<p>This innovation acknowledges that different browsers support different styling properties, and that individual styles are not mission critical. The resilience of CSS means more users get access to a functional interface.</p>
<h2>Conclusion</h2>
<p>A good sign that a technology is not fit for purpose is how much we have to rely on workarounds and best practices to get by. Another sign is just how much code we have to write in order to get simple things done. When it comes to styling, JavaScript is that technology.</p>
<p>CSS solves JavaScript’s styling problems, and elegantly. The question is: are you willing to embrace the change, or are you married to an inferior methodology?</p>
<p>For more information on CSS and tips on getting up and running, <a href="https://en.wikipedia.org/wiki/Campus_SuperStar">read this primer</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/css-a-new-kind-of-javascript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Your Tooltips Are Bogus</title>
		<link>http://www.heydonworks.com/article/your-tooltips-are-bogus</link>
		<comments>http://www.heydonworks.com/article/your-tooltips-are-bogus#comments</comments>
		<pubDate>Wed, 21 Mar 2018 12:01:56 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=626</guid>
		<description><![CDATA[Tooltips are implemented all over the place. Badly. Let me count the ways. It&#8217;s attached to a non-interactive element It&#8217;s not a tooltip if there&#8217;s no tool (control, button, whatever).&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Tooltips are implemented all over the place. Badly. Let me count the ways.</p>
<h2>It&#8217;s attached to a non-interactive element</h2>
<p>It&#8217;s not a tooltip if there&#8217;s no tool (control, button, whatever). What you&#8217;re really doing is just hiding content away. Why? </p>
<h2>It&#8217;s attached to a non-interactive element that&#8217;s focusable</h2>
<p>So, at some point, you realize that your faux-tooltip (see above) only works on hover, meaning keyboard users don&#8217;t have access to it. Accordingly, you add <code>tabindex="0"</code> to it or turn it into a <code>&lt;button></code>.</p>
<p>You&#8217;ve played yourself. Non-interactive elements (elements that do nothing when you click them) should not be focusable, as per <a href="https://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-focus-order.html">Focus Order, 2.4.3</a>. </p>
<p>Even if you consider the showing of the tooltip an interactive &#8216;action&#8217;, it happening on focus makes little sense, especially to unsighted screen reader users who won&#8217;t know anything has happened.</p>
<h2>It doesn&#8217;t work by touch</h2>
<p>Your tooltip is a tip for an actual tool: good. But it doesn&#8217;t work by touch because tapping the tool/button/whatever activates it. If the user&#8217;s lucky, they may see the tooltip briefly before the button&#8217;s action takes place. By then, it&#8217;s too late.</p>
<p>Yes, this means that most tooltips are just not viable components in 2018. Solve the problem differently.</p>
<h2>It does nothing for AT users</h2>
<p>Okay, you&#8217;ve decided to make the tooltip click-activated because that works by touch. Of course, now the button can only show a tooltip and do nothing else. Not a problem, if that&#8217;s all it&#8217;s for.</p>
<p>But! You&#8217;ve also used <code>aria-labelledby</code> or <code>aria-describedby</code> so that screen reader users have access to the tooltip message from the button. Great, but now clicking the button doesn&#8217;t actually do anything as far as they can tell.</p>
<h2>The tooltip contains interactive content</h2>
<p>You&#8217;re thinking of dialogs. Use a dialog.</p>
<hr/>
<p>You probably don&#8217;t need to use a tooltip, but if you do <a href="https://inclusive-components.design/tooltips-toggletips/">I wrote this to help you go about it in an accessible way</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/your-tooltips-are-bogus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>aria-label is a xenophobe</title>
		<link>http://www.heydonworks.com/article/aria-label-is-a-xenophobe</link>
		<comments>http://www.heydonworks.com/article/aria-label-is-a-xenophobe#comments</comments>
		<pubDate>Thu, 01 Feb 2018 18:57:33 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=599</guid>
		<description><![CDATA[Internationalization is a major component of inclusive design. But with automatic translation features provided by Google and Microsoft, it&#8217;s mercifully simple to support — at least at the most basic&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Internationalization is a major component of inclusive design. But with automatic translation features provided by Google and Microsoft, it&#8217;s mercifully simple to support — at least at the most basic level. Just include a default language for the page, like <code>lang="en"</code>, on the <code>&lt;html></code> element to give translation services a helping hand.</p>
<p>It&#8217;s amazing how many sites <em>don&#8217;t</em> do this. I know, because as an accessibility specialist I have to look out for it. If it&#8217;s not there, there are certain implications for screen readers and their voice profiles.</p>
<p>Anyway, services like Google&#8217;s do most of the heavy lifting by looking for strings and simply translating them. Not as good as a manual translation by a bilingual, human speaker, but surprisingly okay.</p>
<p>The only trouble comes with attributes, and determining which provide strings for users, and which programmatic tokens. While you wouldn&#8217;t want <code>aria-pressed="true"</code> to be translated to <code>aria-pressed="vrai"</code>, strings intended for human consumption like the value of an <code>aria-label</code> <em>should</em> be covered.</p>
<p>Unfortunately, unlike longstanding attributes marked for assistive technology consumption (<code>alt</code> and <code>title</code> to name a couple), <code>aria-label</code> is ignored by Google&#8217;s translator. <a href="http://t.co/IKYEbvWi7U">MS Translate</a> has the same issue, <a href="https://twitter.com/FremyCompany/status/957129361106247682">I&#8217;m told</a>.</p>
<p>So yeah, <code>aria-label</code> kind of refuses to speak other languages (but, in fairness, it&#8217;s not really <code>aria-label</code>&#8216;s fault).</p>
<h2>Here are some test cases</h2>
<ul>
<li><a href="https://s.codepen.io/heydon/debug/rpXWzX">Using <code>alt</code> and <code>title</code> for a submit button/image</a></li>
<li><a href="https://s.codepen.io/heydon/debug/xpvERy">Using <code>aria-label</code> for a submit button</a></li>
</ul>
<p>(English should be listed as a supported language in Chrome, but not French, for these to work.)</p>
<h2>Workarounds</h2>
<h3>✖️ Not recommended</h3>
<p>So, you <em>could</em> use JavaScript to dynamically assign the <code>aria-label</code> based on the page&#8217;s <code>lang</code>&hellip;</p>
<pre><code>const labels = {
  en: 'Submit',
  fr: 'Soumettre',
  es: 'Enviar',
  de: 'Einreichen'
};

const lang = document.documentElement.lang;

const submit = document.querySelector('[type="submit"]');

submit.setAttribute('aria-label', labels[lang]);</code>
</pre>
<p>Urgh. That could quickly get unmaintainable when managing a lot of ARIA labels. One thing it does have going for it, though, is more control over the specific translation, so it might be a good way to override automatic translation.</p>
<h3>✔️ Recommended</h3>
<p>Use <code>aria-labelledby</code>! It refers to an element (which can be hidden if you like) containing a text node, which we know gets translated.</p>
<pre><code>&lt;span id="submit-label" hidden>Submit&lt;/span>
&lt;button type="submit" aria-labelledby="submit-label">→&lt;/button></code>
</pre>
<p>See how the <code>#submit-label</code> element is <code>hidden</code>. This means it won&#8217;t be encountered independently of the button by screen readers but, because of the explicit association, it still announces when the button is focused. Good.</p>
<h3>✔️✔️✔️ More Recommended</h3>
<p>That last approach is a bit complex and contrived. Why not just have a <a href="https://gist.github.com/marcol/3979586">visually hidden</a> <code>&lt;span></code> inside the button?</p>
<pre><code>&lt;button type="submit">
  &lt;span class="visually-hidden">Submit&lt;/span>
  &lt;span aria-hidden="true">→&lt;/span>
&lt;/button></code>
</pre>
<p>Note the <code>aria-hidden</code>. Now that an ARIA label isn&#8217;t there to override the &#8220;→&#8221; text node, this symbol would be read out in screen readers (&#8220;right arrow&#8221;). Using <code>aria-hidden</code> puts a stop to that.</p>
<h3>✔️✔️✔️✔️✔️✔️ GALAXY BRAIN RECOMMENDED</h3>
<p>Just use some fucking text. Text that people can see and read and hear in their screen readers all at once. Fucking  arrows.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/aria-label-is-a-xenophobe/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who Is Inclusive Design For?</title>
		<link>http://www.heydonworks.com/article/who-is-inclusive-design-for</link>
		<comments>http://www.heydonworks.com/article/who-is-inclusive-design-for#comments</comments>
		<pubDate>Thu, 07 Dec 2017 12:59:50 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=596</guid>
		<description><![CDATA[If you simultaneously Have perfect eyesight Have excellent motor control and coordination Speak English as a first language Find reading and processing complex information easy Never get tired Have as&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">If you simultaneously</p>
<ul>
<li>Have perfect eyesight</li>
<li>Have excellent motor control and coordination</li>
<li>Speak English as a first language</li>
<li>Find reading and processing complex information easy</li>
<li>Never get tired</li>
<li>Have as much free time as you wish</li>
<li>Live somewhere with access to super fast internet</li>
<li>Can afford super fast internet</li>
<li>Have a top-of-the-range smartphone or computer</li>
<li>Have perfect hearing</li>
<li>Never suffer any injuries or illnesses, even temporarily</li>
<li>Never feel the effects of pain</li>
<li>Are a member of a preferred social/cultural group</li>
</ul>
<p>then you may not benefit from inclusive design.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/who-is-inclusive-design-for/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The New Linkin Park Album Is Not By Nasum</title>
		<link>http://www.heydonworks.com/article/new-linkin-park-album-is-not-by-nasum</link>
		<comments>http://www.heydonworks.com/article/new-linkin-park-album-is-not-by-nasum#comments</comments>
		<pubDate>Sat, 24 Jun 2017 10:23:14 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=588</guid>
		<description><![CDATA[I&#8217;ve just been listening to the new Linkin Park album. The first thing that jumped out at me was that, in keeping with previous Linkin Park albums, it is not&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">I&#8217;ve just been listening to the new Linkin Park album. The first thing that jumped out at me was that, in keeping with previous Linkin Park albums, it is not in fact an album by Nasum. This appears to have caused disappointment among their audience, and rightly so. In one case, <a href="http://www.nme.com/news/music/linkin-park-jug-thrown-heavy-hellfest-2090797">a fan threw a jug at singer Chester Bennington</a>. </p>
<p>A jug.</p>
<p>I say threw, but it was more a sort of lacklustre roll — the kind of half-baked act of defiance one might expect to be inspired by Linkin fucking Park.</p>
<p>Linkin Park have always been soulless, gutless, wet shit. They are no more a hard-rock-and-metal band than Avril Lavigne. At least Avril (&#8220;Avy&#8221;, I call her) was able to elicit hatred. So why the sudden consternation about their new record, <em>&#8220;One More Light&#8221;</em>? </p>
<p>Don&#8217;t get me wrong, it <em>is</em> bilge. I mean, it has a song promisingly titled &#8220;Battle Symphony&#8221; but which sounds like Katy Perry gently pity-wanking an elderly Jonas brother. But what did anyone expect? When you were listening to all the other Linkin Park records what were you thinking? &#8220;2002 projections show that this band of whinging, charmless gimps will be the new Motörhead by 2017.&#8221;</p>
<p>I&#8217;m being disingenuous. I know perfectly well why fans are hypoglycemically lobbing jugs at Linkin Park, and it&#8217;s all about <strong>the broken pact</strong>. With this record, Linkin Park have welched. From the outset the deal was that they&#8217;d ship a few overproduced &#8220;heavy&#8221; guitars. That way you could fill your boots with insipid whining but pretend you were listening to actual rock and roll music. </p>
<p>Distorted guitars can&#8217;t make music cool, punk, or rebellious on their own and Linkin Park are testament to that. But they seem to make it easier to believe you&#8217;re not listening to the same generic waffle as everyone else, if that&#8217;s what you need to believe.</p>
<p>Now all the guitars are gone and you&#8217;re left with the same beige effluent there always was. You either like it or you don&#8217;t and, if you don&#8217;t, you wasted the last 15 years not listening to Nasum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/new-linkin-park-album-is-not-by-nasum/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML Is Broken</title>
		<link>http://www.heydonworks.com/article/html-is-broken</link>
		<comments>http://www.heydonworks.com/article/html-is-broken#comments</comments>
		<pubDate>Tue, 28 Mar 2017 12:32:39 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=566</guid>
		<description><![CDATA[Yes, HTML is broken (see title &#x2191;). Anyone who has used HTML on a big project knows it. Just the other day, I went to code a submit button for&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Yes, HTML is broken (see title &#x2191;). Anyone who has used HTML on a big project knows it.</p>
<p>Just the other day, I went to code a submit button for a form. Should be pretty straightforward. Well how come this is what I wrote, then?</p>
<pre>
<code>&lt;table>
  &lt;td>
    &lt;a class="submit">
      &lt;img src="submit-image.bmp">
    &lt;/a>
  &lt;/td>
&lt;/table>
</code></pre>
<p>I&#8217;ve had complaints from users saying they &#8220;can&#8217;t use this shit&#8221; and mean developer &#8220;friends&#8221; have pointed and laughed at me, like it&#8217;s some sort of failing on my part.</p>
<p>But let&#8217;s look at the facts:</p>
<ol>
<li>I have a degree in computer science</li>
<li>I literally probably have a really high IQ. That stands to reason.</li>
<li>I live in San Francisco</li>
<li>That&#8217;s where Silicon Valley is. <strong>Ever heard of it??</strong></li>
</ol>
<p>I may have majored in computer science, but I minored in rationalist scientific enquiry. I say minored; it was more of a hobby. Anyway, given the <strong>FACTS</strong> provided above, if I see myself writing shit code I can only draw one logical conclusion: </p>
<blockquote><p>It&#8217;s not me who&#8217;s stupid, it&#8217;s you. You stupidly designed the stupid thing I&#8217;m trying to use stupidly and it&#8217;s all your fault. Stupid HTML standardista stupid bum faces.</p>
</blockquote>
<p>I rest my case.</p>
<p>But if that isn&#8217;t enough to convince you that HTML is trying to make me look bad, wait until you see <em>just how poorly</em> HTML deals with basic arithmetic! Consider the following code example:</p>
<pre>
<code>
&lt;p> + &lt;i>
</code>
</pre>
<p>Which of the following do you think the above code evaluates as? The answer may surprise you.</p>
<ol>
<li><code>&lt;p>&lt;i></code></li>
<li><code>&lt;pi></code></li>
<li><code>&#x3c0;</code></li>
<li><strong>IT JUST WRITES IT OUT THE SAME THEN COMPLAINS AT ME ABOUT MISSING CLOSING TAGS WHATEVER THEY ARE??1!!?1!</strong></li>
</ol>
<p>I can do basic arithmetic, HTML. Why can&#8217;t you? Oh, you&#8217;re a &#8220;markup language&#8221; are you? Well <em>bully for you</em>. I didn&#8217;t learn about HTML in my Ivy League university of choice, so how could I know that?</p>
<p>Fine, whatever. When there&#8217;s an international standard for formatting and transmitting digital information available, <strong>I&#8217;LL USE IT TO FUCKING WELL LOOK UP WHAT HTML IS, HOW ABOUT THAT?</strong></p>
<hr />
<p>Idea for this article from <a href="https://twitter.com/petervangrieken">@petervangrieken</a>.</p>
<p>If you&#8217;re struggling with the finer points of writing accessible markup, I have a new blog called <a href="http://inclusive-components.club/">Inclusive Components</a> which explores the inclusive design of web interfaces.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/html-is-broken/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Accessibility, The Free Market, and Punching Nazis While Sitting Down</title>
		<link>http://www.heydonworks.com/article/accessibility-the-free-market-and-punching-nazis-while-sitting-down</link>
		<comments>http://www.heydonworks.com/article/accessibility-the-free-market-and-punching-nazis-while-sitting-down#comments</comments>
		<pubDate>Mon, 06 Feb 2017 09:30:41 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=554</guid>
		<description><![CDATA[Before Hitler set about exterminating Jewish people, he practiced on the disabled. The Aktion T4 programme was particularly fond of administering &#8220;involuntary euthanasia&#8221; to children. Parents were tricked into relinquishing&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Before Hitler set about exterminating Jewish people, he practiced on the disabled. The <a href="https://en.wikipedia.org/wiki/Aktion_T4"><em>Aktion T4</em> programme</a> was particularly fond of administering &#8220;involuntary euthanasia&#8221; to children. Parents were tricked into relinquishing their little ones with the promise that they would be offered special care. This special care consisted of a lethal injection, and would be recorded as a tragic case of pneumonia.</p>
<p>Victims included those with Down syndrome, cerebral palsy, and various localized deformities. A district judge, Lothar Kreyssig, wrote to protest against the programme. The minister of justice, Franz Gürtner, replied: &#8220;If you cannot recognize the will of the Führer as a source of law, then you cannot remain a judge.&#8221;</p>
<p>Kreyssig was deposed. In towns hosting killing centers, residents reported the persistent smell of burnt human hair.</p>
<p>The Nazis believed disabled people were better off dead. I&#8217;ll leave you to decide whether they felt it was better for the &#8216;patients&#8217;, better for the Nazi vision of society from which they were being expunged, or better for both. In any case, the Nazis saw no <em>value</em> in these people.</p>
<p>So it was under German fascism. Since the 40s, fascists operating within ostensible democracies have had to find ways to obfuscate their intentions, including their disableist ones. And I don&#8217;t just mean the ability to hide behind digitally transmitted pictures of cartoon frogs.</p>
<p>Of course there are obvious displays of ignorance, like Donald Trump <a href="http://www.thedailybeast.com/articles/2016/10/13/donald-trump-called-deaf-apprentice-marlee-matlin-retarded.html">referring to deaf actress Marlee Matlin as &#8220;retarded&#8221;</a>, or Betsy DeVos <a href="https://www.washingtonpost.com/news/answer-sheet/wp/2017/01/18/six-astonishing-things-betsy-devos-said-and-refused-to-say-at-her-confirmation-hearing/?utm_term=.532c578530d3">having seemingly no understanding of The Individuals With Disabilities Education Act</a>. But it runs much deeper than this.</p>
<p>Attorney General appointee, <a href="http://www.independent.co.uk/news/world/americas/us-elections/donald-trump-attorney-general-disabled-children-comments-jeff-sessions-schools-failing-decline-in-a7447246.html">Jeff Sessions is on record</a> saying he believes protections helping to integrate disabled children have accelerated the decline of &#8220;civility and discipline&#8221; in mainstream classrooms. The notion that groups which include disabled people are less <em>civilized</em> as a result is particularly striking for its fascistic overtones.</p>
<p>That&#8217;s not to say Sessions outright proposes the eradication of the disabled from society, Nazi-style. But, then again, he wouldn&#8217;t have to. There&#8217;s a more passive way of killing off those deemed surplus, and that&#8217;s by letting them die neoliberalism-style. That&#8217;s precisely what the <a href="https://www.nytimes.com/2017/01/22/us/politics/donald-trump-health-plan-medicaid.html?_r=0">slashing of Medicaid</a>, the <a href="https://www.theatlantic.com/politics/archive/2017/01/the-trump-administrations-first-blow-to-obamacare/514103/">trashing of the ACA</a>, the segregation and disenfranchisement of the disabled in education, and the diminishing of workplace rights would mean.</p>
<p>Of course, to get away with this you need an alibi. And that alibi comes in the form of a particular brand of freedom. According to the <a href="https://en.wikipedia.org/wiki/Capitalism_and_Freedom">Milton Friedman school of free market economics</a>, true deregulation will lead to the eradication of discrimination. Why? Because there&#8217;s money to be made by and from all types of people. Pure market forces, we&#8217;re told, are &#8220;color blind&#8221;. Ergo, cutting state support for the vulnerable is actually <em>good</em> for them!</p>
<p>There&#8217;s just one problem with this ideology: It&#8217;s a trap. The rich establishment don&#8217;t need intervention and support from the state. At the point that it is removed, they are placed at an increased advantage, happily able to exploit the market and those now placed at its mercy.</p>
<p>The market has no mercy. That&#8217;s the point. But like the <a href="https://www.autostraddle.com/i-was-trained-for-the-culture-wars-in-home-school-awaiting-someone-like-mike-pence-as-a-messiah-367057/">Christofascist</a> God for which it makes a telling analogue, it cannot be questioned. To tamper with market forces means to defy its will. Accordingly, when the Americans With Disabilities Act (ADA) was first discussed at the start of the 1990s, it was <a href="http://thehill.com/blogs/pundits-blog/healthcare/309299-disability-and-the-trump-administration-whats-next">met with opposition</a>. Business leaders argued it represented a reregulation of the labor market, which ultimately would lead to greater opportunities for discrimination.</p>
<p>This was all completely disingenuous, of course. These people don&#8217;t really believe in God <em>or</em> the free market. They want to be free to discriminate as they please, for greater personal gain, and for everyone else to believe they are entitled to do so guilt free. They are interested in <em>being</em> Gods.</p>
<p>One way this is achieved is by erasing the meaning of being disabled. It is for good reason that <a href="http://www.autistichoya.com/2013/08/differently-abled.html">many object to the term &#8220;differently abled&#8221;</a>: Differently abled implies <em>equally</em> abled, and equally abled means you can weather the &#8220;mysterious ways&#8221; of the market just as well as me. You don&#8217;t need support or special treatment.</p>
<p>This works as well for mental health as for physical: As a depressive, I&#8217;m told it is my <em>choice</em> to feel that way; I&#8217;m just wallowing. There&#8217;s a gleeful orgy of futility happening down at the marketplace, and I don&#8217;t want to get on the bus. It&#8217;s my own fault I&#8217;m missing out.</p>
<p>Another way of leveraging the concept of the market to defer guilt is through the notion of niche. Friedman&#8217;s model imagines greater prosperity for all, but that&#8217;s not to say the market would become homogenous. There would still be sectors and segments; varieties of business and product.</p>
<p>By characterizing disability as a discrete &#8216;target&#8217; group, the aim is to excuse the creation of products and services which do not cater for disability. &#8220;Oh I&#8217;m not making things for disabled people. But I&#8217;m sure someone else is, don&#8217;t worry. Such-and-such law of economics states it must be so.&#8221; </p>
<p>Disability does not work that way, though. It isn&#8217;t a discrete community or field of interest. It is complex, multifaceted and pervades all kinds of cultural identity through race, socio-economic level, gender identity, and faith. If you create an inaccessible product or service, you are almost guaranteed to be disenfranchising someone, including your future self.</p>
<p>It is because disability is such a broad category of human experience that it&#8217;s so easy to neglect. Even some of those trying to combat discrimination and bigotry have trouble grappling with disability rights as civil rights. It was, after all, amid concerns that the Women&#8217;s Marches did not originally include a clear statement on accessibility that the <a href="http://mashable.com/2017/01/18/disability-march-womens-march-on-washington/#xG6IuK2.zmqc">virtual march</a> was conceived.</p>
<h2 id="afewthingstoremember">A few things to remember</h2>
<p>Firstly, try not to snort at &#8220;armchair activists&#8221;. Some don&#8217;t have the choice. They&#8217;d like to march, but they simply can&#8217;t.</p>
<p>Secondly, be wary of people who insist on removing politics from conversation or company policy. The official position is that we live in a meritocracy, benevolently guided by market forces, so positive discrimination is not necessary. You&#8217;ll find that it is only the ones who are already well represented and paid that take this stance (remember the &#8216;trap&#8217; I described previously). </p>
<p>It&#8217;s more passive and less transparent to discourage political discourse than it is to outright tell someone that <em>their</em> politics is not welcome. If someone tells you to &#8220;take the politics&#8221; out of what you&#8217;re doing, or to &#8220;stop making things political&#8221;, it&#8217;s not because anything benefits from being less political as such. It&#8217;s because they don&#8217;t want to make room for <em>your</em> politics in that space. That would mean taking some of theirs out. Well screw that; resist.</p>
<p>Thirdly, be aware that making accessible products and interfaces under a regime that regresses on disability rights <em>is</em> resistance. It goes against the prevailing ideology. Do it loudly and help others get up to speed. This is especially important when devising protests and related resources. When you&#8217;re inclusive, you reach more allies.</p>
<p>Finally, whether or not you believe it is right or sensible to punch a neo-nazi, remember that not everyone who might like to punch a neo-nazi has the physical strength, the dexterity, or even the appendage to do so. And some of these people would be first in line if they did, because they know fascists are the kind of cowards that pick on them first.  Accordingly, whether you aim to do it literally or figuratively, punch a neo-nazi for someone who can&#8217;t.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/accessibility-the-free-market-and-punching-nazis-while-sitting-down/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working For People</title>
		<link>http://www.heydonworks.com/article/working-for-people</link>
		<comments>http://www.heydonworks.com/article/working-for-people#comments</comments>
		<pubDate>Wed, 23 Nov 2016 19:10:44 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=532</guid>
		<description><![CDATA[2016 has not been an exemplary year in some ways. What with the anti-intellectualism and fascism and kleptocracy and all. And you know what? I&#8217;m not completely convinced everything&#8217;s going&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">2016 has not been an exemplary year in some ways. What with the anti-intellectualism and fascism and kleptocracy and all. And you know what? I&#8217;m not <em>completely</em> convinced everything&#8217;s going to be okay again when the clock strikes twelve on New Year&#8217;s Eve. </p>
<p>I&#8217;m not convinced the far right will develop a sudden fondness for anyone with a better tan than them, doctors and scientists will be respected and revered for actually knowing a thing or two, or Mike Pence&#8217;s head will spontaneously fall off, exploding in a cloud of rainbow-colored sherbet.</p>
<h2>What I&#8217;m doing</h2>
<p>In the new year, I want to offer my services — at reduced rates <a href="#rates">*</a> — to organizations who are doing good for society in the wake of neoliberalism and under the spectre of fascism; organizations who are trying to make things a bit better for ordinary and vulnerable people.</p>
<p>I&#8217;m only one person who can only make the tiniest difference and, hey, maybe I&#8217;m only doing this to quell my own guilt for having the privilege of being a white, male, english speaker. But anyway.</p>
<h3>What I can offer</h3>
<ul>
<li>Branding (styleguides — including typography, iconography etc. and associated documentation)</li>
<li>Pattern libraries (catalogues of attractive and accessible interface components written in HTML, JS, and CSS)</li>
<li>Prototyping</li>
<li>Accessibility remediation (diagnosis and advice on fixing accessibility and usability issues in your existing interfaces)</li>
<li>Copywriting and help with readability</li>
<li>Fast, responsive websites</li>
<li>Other stuff; just ask</li>
</ul>
<p>I&#8217;m a web designer/developer with 10+ years experience. I have two books published on interface design with Smashing Magazine. The latest, <a href="https://www.smashingmagazine.com/inclusive-design-patterns/">Inclusive Design Patterns</a>, was released just a month ago and is set to sell out before Christmas. I worked as a front-end developer for several years with <a href="https://www.neontribe.co.uk/">Neontribe</a>, helping to design and create applications for folks with disabilities and mental health concerns, as well as for educational projects. I currently work with <a href="https://www.paciellogroup.com/">The Paciello Group</a> who offer expert accessibility guidance to large organizations, mostly in the US. I have spoken (including keynotes) at large conferences in The Netherlands, Sweden, Germany, Romania, and the UK on interface design and web accessibility.</p>
<h3>Who I&#8217;m offering work to</h3>
<ul>
<li>Charities and non-profits supporting the vulnerable, disabled, and ethnic minorities</li>
<li>Campaign and legal organizations working to protect civil liberties and rights</li>
<li>Organizations fighting racism</li>
<li>Organizations representing and advocating for the LGBTQ community / communities</li>
<li>Advocate organizations for the autistic community where autistic folks actually have an influence in the organization</li>
<li>Feminist organizations and organizations supporting women&#8217;s reproductive rights</li>
<li>Organizations offering free education services, especially in politics and critical thinking</li>
</ul>
<p>One type of organization I will not work for is any organization that uses resources to promote religion. So, for example, I&#8217;d be delighted to support the Muslim community but not the spread of Islamic doctrine. Another example would be a Christian organization which includes proselytising in its activities. I am a humanist and want to work with people, including religious individuals, if the cause and focus is to help other human beings in need.</p>
<p>I work remotely and I tend to restrict long haul travel for the sake of mental wellbeing and productivity.</p>
<h2>Is this you?</h2>
<p>Are you someone working for any such described organization? Or do you know someone who is? I&#8217;m available by email: <strong>heydon@heydonworks.com</strong>.</p>
<p>* Negotiable. My standard corporate rate is not exorbitant already and I am prepared to offer between 33% and 50% reductions. Under some circumstances, free work may be applicable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/working-for-people/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Signs You May Be A Designer, Not Just A Coder</title>
		<link>http://www.heydonworks.com/article/signs-you-may-be-a-designer-not-just-a-coder</link>
		<comments>http://www.heydonworks.com/article/signs-you-may-be-a-designer-not-just-a-coder#comments</comments>
		<pubDate>Thu, 03 Nov 2016 09:49:43 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=528</guid>
		<description><![CDATA[You spend more time contemplating and discussing code than you do writing it. You spend more time thinking about how the end product affects users than you do about how&#8230;]]></description>
				<content:encoded><![CDATA[<ol>
<li>You spend more time contemplating and discussing code than you do writing it.</li>
<li>You spend more time thinking about how the end product affects users than you do about how pleasurable it is for you to write its code.</li>
<li>You think in terms of relationships and systems, not just the thing you&#8217;re coding up at the time.</li>
<li>You choose technologies based on what they can achieve, not how new, trendy, or ergonomic they are.</li>
<li>When a bug ticket is given to you, you take the time to consider what its implications are rather than just diving in to write it off your list.</li>
<li>You&#8217;re not happy to add new features just because it gives you something to do.</li>
<li>You&#8217;re not happy being told what to code or how to code it. You think you should be part of that decision making process.</li>
<li>You think of code as means to an end. It&#8217;s a tool for realizing design thinking.</li>
</ol>
<p class="intro">Is this you? Then you are not a coder. You are a designer who is skilled in coding.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/signs-you-may-be-a-designer-not-just-a-coder/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Designer Is Not A Profession</title>
		<link>http://www.heydonworks.com/article/designer-is-not-a-profession</link>
		<comments>http://www.heydonworks.com/article/designer-is-not-a-profession#comments</comments>
		<pubDate>Mon, 22 Aug 2016 12:27:51 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=516</guid>
		<description><![CDATA[Design is a wonderful thing. It&#8217;s an integral part of how we work to shape the world around us. But it is not a discrete profession or occupation. We are&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">Design is a wonderful thing. It&#8217;s an integral part of how we work to shape the world around us.</p>
<p>But it is not a discrete profession or occupation. </p>
<p>We are not divided into designers and people who are not designers.</p>
<p>If someone says you don&#8217;t have the right background, you haven&#8217;t spoken to or listened to the right people, or you don&#8217;t have the appropriate skills or experience to be a designer? They are wrong.</p>
<p>If someone says particular skills — creative, discursive, technical — preclude you from being a designer and put you in a category outside of design? They are wrong.</p>
<p>Design is not in the mastery of any particular medium, skill, piece of software, style, or philosophy.</p>
<p>Websites, boats, guns, hats, buildings, events, fonts, and data schemas can all be designed or not designed. But it isn&#8217;t in hiring a designer that the crucial difference is made.</p>
<p>All design consultants can do is encourage <em>you</em> to design. And you should know enough to be doing it already.</p>
<p>Designing is deliberating; reasoning; justifying. It is joining up the dots. </p>
<p>Designing is what we&#8217;re doing when we&#8217;re <em>not</em> doing. It&#8217;s deciding what&#8217;s right to do, what the best way to do it is, for who, by who, for how long, and with what. Context, relationships, implications.</p>
<p>If you don&#8217;t do any of this, your work will be horrendous. If you hire someone else to do it for you, it will not be saved. You cannot add design.</p>
<p>If you care to think about your work as you work, then you are a designer. </p>
<p>Everything else — Javascript, Microsoft Excel, a pencil, Adobe Illustrator, a soldering iron, a coffee machine, MySQL, a pair of knitting needles — is a tool.</p>
<p>Designers cannot be identified by their tools because anything can be a designer&#8217;s tool. </p>
<p>That is, so long as it&#8217;s the right tool for the job.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/designer-is-not-a-profession/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aria-Controls is Poop</title>
		<link>http://www.heydonworks.com/article/aria-controls-is-poop</link>
		<comments>http://www.heydonworks.com/article/aria-controls-is-poop#comments</comments>
		<pubDate>Sun, 21 Aug 2016 11:43:14 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=495</guid>
		<description><![CDATA[We need to talk about aria-controls. It&#8217;s poorly supported, does very little, and does what it does when it does badly. It is poop and we rely on it way&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">We need to talk about <code>aria-controls</code>. It&#8217;s poorly supported, does very little, and does what it does <em>when</em> it does badly. It is <em>poop</em> and we rely on it way too much. We are short-changing assistive technology users when we do.</p>
<h2>What it is</h2>
<p>The <code>aria-controls</code> attribute is a &#8216;relationship attribute&#8217; which denotes which elements in a page an interactive element or set of elements has control over and affects. It&#8217;s commonly used to describe a relationship between a button and the expandable region revealed by that button.</p>
<pre>
<code style="white-space: pre-wrap">
&lt;button aria-expanded="false" aria-controls="expandable">open / close&lt;/button>
&lt;div id="expandable" hidden>content of the expandable region&lt;/div>
</code>
</pre>
<h2>What we think it does</h2>
<p>Wishfully thinking, we assume that marking up relationships with <code>aria-controls</code> means screen reader users can effortlessly flit between the moving parts of a web application, like a mechanic tinkering in a ship&#8217;s engine room.</p>
<p>Because we&#8217;ve used <code>aria-controls</code>, we don&#8217;t have to worry about source order, right? We&#8217;ve connected up the dots explicitly, with our magic attribute! And it doesn&#8217;t matter about all the elements between a controller and its subject because we&#8217;ve tunneled between them, right?</p>
<pre>
<code style="white-space: pre-wrap">
&lt;button aria-expanded="false" aria-controls="expandable"&gt;open / close&lt;/button&gt;
&lt;div>
  &lt;!-- a load of other markup, including interactive elements in focus order -->
&lt;/div>
&lt;div id="expandable" hidden>content of the expandable region&lt;/div>
</code>
</pre>
<h2>Good luck with that</h2>
<p>First of all, only the JAWS screen reader supports <code>aria-controls</code>. If a user is operating NVDA or VoiceOver (or others), they would have no idea it&#8217;s even there. That&#8217;s reason enough not to use it.</p>
<p>But, just for giggles, let&#8217;s talk about <em>how</em> JAWS supports <code>aria-controls</code>. When you focus an element with the attribute included, JAWS will announce, &#8220;<em>press the JAWS key plus Alt and M to move to the controlled element.</em>&#8221; Verbose and clumsy. Then again, I&#8217;m not sure how else you&#8217;d go about supporting it.</p>
<p>But, that&#8217;s not the only problem. <strong>How in the hell do I move back?</strong> And, even if I could, how would that be communicated and how long should the option to move back remain active? No wonder the other screen reader vendors are giving this a wide berth.</p>
<h2>Multiple controlled elements</h2>
<p>You can create a one-to-many relationship by supplying a space separated list of <code>id</code>s, representing different, simultaneously controlled elements.</p>
<pre>
<code style="white-space: pre-wrap">
&lt;button aria-controls="elem1 elem2 elem3 elem4"&gt;open / close&lt;/button&gt;
</code>
</pre>
<p>Cute! And good luck with implementing a half-decent UX there, everybody. In case you&#8217;re interested, JAWS just says &#8220;<em>press the JAWS key plus Alt and M to move to the controlled element</em>&#8221; as normal. Genius.</p>
<h2>Conclusion</h2>
<p>The <em>aria-controls</em> attribute is a prime example of something we&#8217;d love to &#8216;just work&#8217;. Trouble is, there&#8217;s no clear way <em>how</em> it should work. JAWS makes a perfunctory attempt at implementation, but it&#8217;s incomplete and I suspect it creates much more confusion than it provides clarity for real users.</p>
<p>In the absence of a good purpose-built solution for letting folks using an interface aurally move between and around tools and their outputs, try a combination of the following:</p>
<ul>
<li>Same-page links to move users from one part of the interface to another</li>
<li>Landmark roles to encapsulate major areas of the interface&#8217;s functionality</li>
<li>Expandable areas that come immediately after their <code>aria-expanded</code> controllers in the source (and in focus order)</li>
</ul>
<p>There&#8217;s also the question of &#8216;focus management&#8217;. In keyboard and screen reader accessibility terms, focus management usually means using the <code>focus()</code> method in JavaScript to move focus between elements. Be aware that, in almost all cases, users <strong>do not</strong> want to be moved from one place to another without their explicit say-so. Even when they <em>do</em> want to, providing a link is probably your best bet. </p>
<p>I think I&#8217;ll give the focus management wasps&#8217; nest a proper poke on another occasion.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/aria-controls-is-poop/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing Less Damn Code</title>
		<link>http://www.heydonworks.com/article/on-writing-less-damn-code</link>
		<comments>http://www.heydonworks.com/article/on-writing-less-damn-code#comments</comments>
		<pubDate>Tue, 16 Aug 2016 09:01:52 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=471</guid>
		<description><![CDATA[I&#8217;m not the most talented coder in the world. No, it&#8217;s true. So I try to write as little code as possible. The less I write, the less there is&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro">I&#8217;m not the most talented coder in the world. No, it&#8217;s true. So I try to write as little code as possible. The less I write, the less there is to break, justify, or maintain.</p>
<p>I&#8217;m also lazy, so it&#8217;s all gravy. (<em>ed: maybe run with a food analogy?</em>)</p>
<p>But it turns out the only surefire way to make <em>performant</em> Web Stuff is also to just write less. Minify? Okay. Compress? Well, yeah. Cache? Sounds technical. Flat out refuse to code something or include someone else&#8217;s code in the first place? <strong>Now you&#8217;re talking.</strong> What goes in one end has to come out the other in some form, whether it&#8217;s broken down and liquified in the gastric juices of your task runner or not. (<em>ed: I&#8217;ve changed my mind about the food analogy</em>)</p>
<p>And that&#8217;s not all. Unlike aiming for &#8216;perceived&#8217; performance gains — where you still send the same quantity of code but you chew it up first (<em>ed: seriously</em>) — you can actually make your Web Stuff <em>cheaper</em> to use. My data contract doesn&#8217;t care whether you send small chunks or one large chunk; it all adds up the same.</p>
<p>My <em>favorite</em> thing about aiming to have less stuff is this: you finish up with only the stuff you really need — only the stuff your <em>user</em> actually wants. Massive hero image of some dude drinking a latte? Lose it. Social media buttons which pull in a bunch of third-party code while simultaneously wrecking your page design? Give them the boot. That JavaScript thingy that hijacks the user&#8217;s right mouse button to reveal a custom modal? Ice moon prison.</p>
<p>It&#8217;s not just about what you pull in to destroy your UX or not, though. The <em>way</em> you write your (own) code is also a big part of having less of it. Here are a few tips and ideas that might help. I&#8217;ve written about some of them before, but in terms of accessibility and responsive design. It just happens that a flexible, accessible Web is one we try to exert little of our own control over; one we do less to break.</p>
<h2>WAI-ARIA</h2>
<p>First off, WAI-ARIA != web accessibility. It&#8217;s just a tool to enhance compatibility with certain assistive technologies, like screen readers, where it&#8217;s needed. Hence, the <a href="https://www.w3.org/TR/aria-in-html/#first-rule-of-aria-use">first rule of ARIA use</a> is to <em>not</em> use WAI-ARIA if you don&#8217;t have to.</p>
<p>LOL, no:</p>
<pre>
<code>
&lt;div role="heading" aria-level="2">Subheading&lt;/div>
</code>
</pre>
<p>Yes:</p>
<pre>
<code>
&lt;h2>Subheading&lt;/h2>
</code>
</pre>
<p>The benefit of using native elements is that you often don&#8217;t have to script your own behaviors either. Not only is the following checkbox implementation verbose HTML, but it needs a JavaScript dependency to control state changes and to <a href="https://twitter.com/heydonworks/status/765444886099288064">follyfill</a> standard, basic behavior  regarding the <code>name</code> attribute and <code>GET</code> method. It&#8217;s more code, and it&#8217;s less robust. Joy!</p>
<pre>
<code>
&lt;div role="checkbox" aria-checked="false" tabindex="0" id="checkbox1" aria-labelledby="label-for-checkbox1">&lt;/div>
&lt;div class="label" id="label-for-checkbox1">My checkbox label&lt;/div>
</code>
</pre>
<p><a href="http://wtfforms.com/">Styling? Don&#8217;t worry, you&#8217;re covered</a>. That&#8217;s if you really need custom styles, anyway.</p>
<pre>
<code>
&lt;input type="checkbox" id="checkbox1" name="checkbox1">
&lt;label for="checkbox1">My checkbox label&lt;/label>
</code>
</pre>
<h2>Grids</h2>
<p>Do you remember ever enjoying using/reading a website with more than two columns? I don&#8217;t. Too much stuff all at once, begging for my attention. &#8220;I wonder which thing that looks like navigation is the navigation I want?&#8221; It&#8217;s a rhetorical question: my executive functioning has seized up and I&#8217;ve left the site.</p>
<p>Sometimes we want to put things next to things, sure. Like search results or whatever. But why pull in a whole tonne of grid framework boilerplate just for that? Flexbox can do it with no more than a couple of declaration blocks.</p>
<pre>
<code>
.grid {
  display: flex;
  flex-flow: row wrap;
}

.grid > * {
  flex-basis: 10em;
  flex-grow: 1;
}
</code>
</pre>
<p>Now everything &#8216;flexes&#8217; to be approximately <code>10em</code> wide. The number of columns depends on how many approx&#8217; <code>10em</code> cells you can fit into the viewport. Job done. Move on.</p>
<p>Oh and, while we&#8217;re here, we need to talk about this kind of thing:</p>
<pre>
<code>
width: 57.98363527356473782736464546373337373737%;
</code>
</pre>
<p>Did you know that precise measurement is calculated according to a mystical ratio? A ratio which purports to induce a state of calm and awe? No, I wasn&#8217;t aware and I&#8217;m not interested. Just make the porn button big enough that I can find it.</p>
<h2>Margins</h2>
<p><a href="http://alistapart.com/article/axiomatic-css-and-lobotomized-owls">We&#8217;ve done this</a>. Share your margin definition across elements using the universal selector. Add overrides only where you need them. You won&#8217;t need many.</p>
<pre>
<code>
body * + * {
  margin-top: 1.5rem;
}
</code>
</pre>
<p>No, the universal selector will not kill your performance. That&#8217;s bunkum.</p>
<h2>Views</h2>
<p>You don&#8217;t need the whole of Angular or Meteor or whatever to divide a simple web page into &#8216;views&#8217;. Views are just bits of the page you see while other bits are unseen. CSS can do this:</p>
<pre>
<code>
.view {
  display: none;
}

.view:target {
  display: block;
}
</code>
</pre>
<p>&#8220;But single-page apps run stuff when they load views!&#8221; I hear you say. That&#8217;s what the <code>onhashchange</code> event is for. No library needed, and you&#8217;re using links in a standard, bookmark-able way. Which is nice. <a href="https://www.smashingmagazine.com/2015/12/reimagining-single-page-applications-progressive-enhancement/">There&#8217;s more on this technique, if you&#8217;re interested</a>.</p>
<h2>Font sizes</h2>
<p>Tweaking font sizes can really bloat out your <code>@media</code> blocks. That&#8217;s why you should let CSS take care of it for you. With a single line of code.</p>
<pre>
<code>
font-size: calc(1em + 1vw);
</code>
</pre>
<p>Err&#8230; that&#8217;s it. You even have a minimum font size in place, so no tiny fonts on handsets. Thanks to <a href="https://twitter.com/vasilis">Vasilis</a> for showing me this.</p>
<h2><a href="https://a-k-apart.com/">10k Apart</a></h2>
<p>Like I said, I&#8217;m not the best coder. I just know some tricks. But it is possible to do a hell of a lot, with only a little. That&#8217;s the premise of the <a href="https://a-k-apart.com/">10k Apart competition</a> — to find out what can be made with just 10k or less. There are big prizes to be won and, as a judge, I look forward to kicking myself looking at all the amazing entries; ideas and implementations I wish I&#8217;d come up with myself. What will you make?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/on-writing-less-damn-code/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Star Trek TNG: First Impressions</title>
		<link>http://www.heydonworks.com/article/star-trek-tng-first-impressions</link>
		<comments>http://www.heydonworks.com/article/star-trek-tng-first-impressions#comments</comments>
		<pubDate>Fri, 08 Jul 2016 10:27:42 +0000</pubDate>
		<dc:creator><![CDATA[Large Heydon Collider]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.heydonworks.com/?p=463</guid>
		<description><![CDATA[Star Trek: The Next Generation was on TV in the UK when I was a little younger than Wesley Crusher, but I never watched it properly. I&#8217;ve started watching it&#8230;]]></description>
				<content:encoded><![CDATA[<p class="intro"><a href="https://en.wikipedia.org/wiki/Star_Trek:_The_Next_Generation">Star Trek: The Next Generation</a> was on TV in the UK when I was a little younger than Wesley Crusher, but I never watched it properly. I&#8217;ve started watching it on Netflix and I&#8217;m about twenty episodes into the first season. These are some notes I&#8217;ve made.</p>
<hr />
<p>The set is very sterile. Reassuringly tidy though. No dashboard dross or the like.</p>
<p>I like how the first baddies introduced (the Ferenghi) are described as &#8220;capitalists&#8221; and therefore evil. They act a bit like the crappier orcs out of LOTR.</p>
<p>It&#8217;s nice how everyone gets on so well with Worf. I expected a little bit more anti-Klingon racial tension, though. Be interesting if it came from Geordie. I like to imagine Worf&#8217;s sash is from winning a beauty pageant. </p>
<p>It occurs to me the Klingons are a bit like the English. Wedded to the past and needlessly combative.</p>
<p>Doctor Crusher: Name of a hip-hop producer, face of someone who&#8217;s very much <em>not</em> a hip-hop producer.</p>
<p>The Captain&#8217;s role is bitter sweet. He&#8217;s a sort of childless father. Comforting BBC Radio 4 voice.</p>
<p>I think Deanna Troi should have a smaller part. <em>Way</em> too much mission-critical stuff depends on her  telepathic &#8216;insights&#8217;. Doesn&#8217;t seem like a good protocol. I imagine she was called Diana Troy, then changed her name when she found out she was a telepath. Pretentious.</p>
<p>The computer interfaces look to me like they could benefit from some clearer labeling and better differentiated colors.</p>
<p>All alien races like shiny clothes. Space is camp AF.</p>
<p>Yar is my second favorite after the Captain. I like that the security officer is a woman. Lovely, wispy hair.</p>
<p>There&#8217;s something unseemly about Riker. He constantly looks like he&#8217;s trying to brave his way through a sex scandal.</p>
<p>Wesley gets an inordinate amount of romantic attention. It&#8217;s a mystery to me how.</p>
<p>Data scares the shit out of me. I know he&#8217;s an android, but I just see a psychopath. I keep expecting him to suddenly and indiscriminately strangle one of the other crew members then tilt his head and say &#8220;most curious&#8221; when they stop struggling.</p>
<p>There are a lot of alien forces which all seem to exist for the sole purpose of creating existential crises.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.heydonworks.com/article/star-trek-tng-first-impressions/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
