This service tests the validity of an RSS 2.0 feed, checking to see that it follows the rules of the RSS specification. For advice from the RSS Advisory Board on how to implement RSS and handle issues such as enclosures and HTML encoding, read the RSS Best Practices Profile. This checker is also a validator of Atom and RSS 1.0 feeds.
Use this tester regularly to ensure that your RSS feed continues to work well in the wide audience of RSS readers, podcast clients and other software that supports the format.
This feed does not validate.
line 46, column 254: (28 occurrences) [help]
... ;</content:encoded><author>Steve Frenzel</author></item><item><title>Two ...
^
In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendations.
line 11, column 0: (15 occurrences) [help]
<iframe allow="accelerometer 'none'; autoplay 'none&a ...
line 30, column 0: (20 occurrences) [help]
<pre class="astro-code github-dark" style="background-colo ...
line 30, column 0: (15 occurrences) [help]
<pre class="astro-code github-dark" style="background-colo ...
line 36, column 0: (16 occurrences) [help]
<img src="https://www.stevefrenzel.dev/_astro/text-fragment-example. ...
line 36, column 0: (16 occurrences) [help]
<img src="https://www.stevefrenzel.dev/_astro/text-fragment-example. ...
line 46, column 215: (164 occurrences) [help]
... and so fast at the same time.</p></content:encoded><author>Steve ...
^
line 197, column 0: (19 occurrences) [help]
<p><img ="" src="https://www.stevefrenzel.dev/_astro ...
<p>This is called a deceptive pattern and you can read more about it h ...
<p>This is called a deceptive pattern and you can read more about it h ...
... ed><author>Steve Frenzel</author></item></channel></rss>
^
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Blog by Steve Frenzel</title><description>A blog about web accessibility, nerdy music stuff, everything beyond and in-between by Steve Frenzel. Go away if these things offend you: đłïžââ§ïž đłïžâđ âđż đșđŠ đ”đž</description><link>https://www.stevefrenzel.dev/</link><item><title>Cool shit from the wwweb #1</title><link>https://www.stevefrenzel.dev/blog/cool-shit-from-the-wwweb-1/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/cool-shit-from-the-wwweb-1/</guid><description>Am I getting into newsletter territory here? Who knows, but here's some stuff about accessibility!</description><pubDate>Fri, 01 Nov 2024 00:00:00 GMT</pubDate><content:encoded><p>In this format, I will share everything I find interesting at random intervals. Most of the time it will have to do with web development and accessibility, but not always! You can find a list of these posts by clicking on the <code>micro-blog</code> under âRelated Tagsâ.</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#real-talk-on-web-accessibility-with-marcy-sutton-todd">Real Talk on Web Accessibility with Marcy Sutton Todd</a></li>
<li><a href="#linking-directly-to-web-page-content">Linking Directly to Web Page Content</a></li>
<li><a href="#the-accessibility-operations-guidebook">The Accessibility Operations Guidebook</a></li>
<li><a href="#progressive-enhancement-at-govuk">Progressive enhancement at gov.uk</a></li>
<li><a href="#website-speed-mcmaster-class">Website speed (Mc)master class</a></li>
</ul>
<h2 id="real-talk-on-web-accessibility-with-marcy-sutton-todd">Real Talk on Web Accessibility with Marcy Sutton Todd</h2>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/A7cVW-8tCXY" title="Real Talk on Web Accessibility with Marcy Sutton Todd" data-astro-cid-7yu2nja5="">
</iframe>
<p>Marcy touched on a couple of interesting topics I was somewhat aware of, but now I understand them way better. Hereâs a short list of them:</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-within">focus-within</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/CSS/:focus-visible">focus-visible</a></li>
<li><a href="https://www.nvaccess.org/files/nvda/documentation/keyCommands.html#ElementsList">NVDA element list</a></li>
<li><a href="https://a11ysupport.io/">Accessibility support</a></li>
</ul>
<p>My biggest takeaway was that the <code>placeholder</code> attribute is part of the accessible name calculation. đ€Ż Of course you should always associate a <code>&lt;label&gt;</code> to an <code>&lt;input&gt;</code>, but apparently placeholders are recognized by assistive technology if no label is present.</p>
<h3 id="further-reading">Further reading</h3>
<ul>
<li><a href="https://www.w3.org/WAI/ARIA/apg/practices/names-and-descriptions/">Providing Accessible Names and Descriptions</a></li>
<li><a href="https://testingaccessibility.com/">Testing Accessibility â by Marcy Sutton</a></li>
</ul>
<h2 id="linking-directly-to-web-page-content">Linking Directly to Web Page Content</h2>
<p><a href="https://alfy.blog/2024/10/19/linking-directly-to-web-page-content.html?">Smarter than âCtrl+Fâ: Linking Directly to Web Page Content</a> by Ahmad Alfy</p>
<p>Saw this one in <a href="https://cassidoo.co/">Cassidy Williams</a> newsletter and had no idea it existed! If you want to link to a certain text section in your document, you can do this, for example:</p>
<p>Basic syntax:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="plaintext"><code><span class="line"><span>https://example.com/page.html#:~:text=[prefix-,]textStart[,textEnd][,-suffix]</span></span>
<span class="line"><span></span></span></code></pre>
<p>Real example:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8;overflow-x:auto" tabindex="0" data-language="plaintext"><code><span class="line"><span>https://developer.mozilla.org/en-US/docs/Web/URI/Fragment/Text_fragments#:~:text=without%20relying%20on%20the%20presence%20of%20IDs</span></span>
<span class="line"><span></span></span></code></pre>
<p>Which can look like this, depending on your browser:</p>
<img src="https://www.stevefrenzel.dev/_astro/text-fragment-example.C49TCWY__ZiXLF3.webp" alt="Screenshot by Ahmad Alfy showing highlighted text in a paragraph" width="801" height="316" loading="lazy" decoding="async">
<h2 id="the-accessibility-operations-guidebook">The Accessibility Operations Guidebook</h2>
<p><a href="https://devonpersing.netlify.app/book/">The Accessibility Operations Guidebook</a> by Devon Persing</p>
<p>This was recommended by someone else on Mastodon and I was very intrigued, because itâs not about how to do accessibility, but rather what itâs like to work in this particular field. Read a good chunk of it and it really puts things in perspective.</p>
<h2 id="progressive-enhancement-at-govuk">Progressive enhancement at gov.uk</h2>
<p><a href="https://www.gov.uk/service-manual/technology/using-progressive-enhancement">Building a robust frontend using progressive enhancement</a></p>
<p>Short and sweet article about the benefits of creating a robust frontend leveraging the power of HTML, CSS and JavaScript. Bookmark this one and show it to whoever, who thinks that (blazingly fast) JavaScript framework XYZ is the best way to build a simple landing page.</p>
<h2 id="website-speed-mcmaster-class">Website speed (Mc)master class</h2>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/-Ln-8QM8KhQ" title="How is this Website so fast!? by Wes Bos" data-astro-cid-7yu2nja5="">
</iframe>
<p>Interesting look under the hood of the <a href="https://www.mcmaster.com/">McMaster Carr</a> website by Wes Bos to find out how it can be so old and so fast at the same time.</p></content:encoded><author>Steve Frenzel</author></item><item><title>Two quarters of 2024 in (new-ish) music</title><link>https://www.stevefrenzel.dev/blog/two-quarters-of-2024-in-new-ish-music/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/two-quarters-of-2024-in-new-ish-music/</guid><description>We've got some Country, Metal, Ambient & Pop</description><pubDate>Sun, 20 Oct 2024 00:00:00 GMT</pubDate><content:encoded><p>Thereâs no introduction for this, itâs music I listened to in the past six months and now Iâm sharing it with you! LETâS DO THIS đȘ</p>
<h2 id="april-2024">April 2024</h2>
<h3 id="charley-crockett---10-cowboy">Charley Crockett - $10 Cowboy</h3>
<img src="https://www.stevefrenzel.dev/_astro/1-charley-crockett-10-dollar-cowboy.DCX8wT3S_ZL0o1d.webp" alt="Cover artwork for Charley Crockett - $10 Cowboy" loading="eager" width="1280" height="1280" decoding="async">
<p>If you ever wanted to get into Country music (like me) but thought it was way too corny and cliché (like me), you should give Charley Crockett a listen.</p>
<p>Heâs got lots of influences that make his music very unique, like Blues, Jazz or Motown. <a href="https://www.youtube.com/watch?v=qi0JyLKTbDA">He also seems to be a very nice, genuine guy.</a></p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/aK89bntEg5w" title="Charley Crockett - America" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/358967303?u">Listen to $10 Cowboy from Charley Crockett</a></p>
<h3 id="full-of-hell---coagulated-bliss">Full Of Hell - Coagulated Bliss</h3>
<img src="https://www.stevefrenzel.dev/_astro/2-full-of-hell.D3ESIARI_1fvRHJ.webp" alt="Cover artwork for Full Of Hell - Coagulated Bliss" width="1280" height="1280" loading="lazy" decoding="async">
<p>The collaboration between <a href="https://tidal.com/browse/album/316979894?u">Full Of Hell and Nothing</a> is one of the best things thatâs ever happened to the scene, so I was very interested to hear what a âregularâ album would sound like.</p>
<p>Itâs not totally up my alley, but if youâre in need of some legit, heavy punk music: Go for it!</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/5MeB7fa8vGA" title="Full Of Hell - Coagulated Bliss" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/344412733?u">Listen to Coagulated Bliss by Full Of Hell</a></p>
<h3 id="northlane---mirrors-edge">Northlane - Mirrorâs Edge</h3>
<img src="https://www.stevefrenzel.dev/_astro/3-northlane.CU3sZJXu_1ed3pQ.webp" alt="Cover artwork for Northlane - Mirror's Edge" width="1280" height="1280" loading="lazy" decoding="async">
<p>Northlane is one of THE bands in the <a href="https://en.wikipedia.org/wiki/Djent">Djent</a> genre, but I never really got into them. I still got curious when I saw that they released an EP, which is usually easier to digest, especially in this genre.</p>
<p>When I saw that they had a song with Ian from <a href="https://tidal.com/browse/artist/19239?u">Karnivool</a>, I was sold. A match made in heaven. đ</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/EiiVVJNA0nk" title="Northlane - Afterimage featuring Ian Kenny" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/340302755?u">Listen to Mirrorâs Edge by Northlane</a></p>
<h2 id="may-2024">May 2024</h2>
<h3 id="bring-me-the-horizon---post-human-nex-gen">Bring Me The Horizon - POST HUMAN: NeX GEn</h3>
<img src="https://www.stevefrenzel.dev/_astro/4-bmth.DHb1mLy9_Z1lWn0f.webp" alt="Cover artwork for Bring Me The Horizon - POST HUMAN: NeX GEn" width="1280" height="1280" loading="lazy" decoding="async">
<p>Hearing that <a href="https://loudwire.com/bring-me-the-horizon-oli-sykes-exact-reason-split-jordan-fish/">Jordan Fish was no longer part of the band</a> made me a bit concerned, as he seemed to have a big influence on their sound for the last decade.</p>
<p>After a couple of listens this record REALLY clicked with me though and it might be favourite album. Thereâs the heavy, thereâs the soft, thereâs the in-between and it all sounds like BMTH.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/LxxlN_FhLac" title="Bring Me The Horizon - Top 10 staTues tHat CriEd bloOd" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/364332768?u">Listen to POST HUMAN: NeX GEn by Bring Me The Horizon</a></p>
<h3 id="knocked-loose---you-wont-go-before-youre-supposed-to">Knocked Loose - You Wonât Go Before Youâre Supposed To</h3>
<img src="https://www.stevefrenzel.dev/_astro/5-knocked-loose.CAdx85uQ_ZmksIT.webp" alt="Cover artwork for Knocked Loose - You Won't Go Before You're Supposed To" width="1280" height="1280" loading="lazy" decoding="async">
<p>I saw them last year and was super impressed, they really know how to work a crowd as soon as they enter the stage. If youâre a fan of super heavy, groovy music with an ear for details, give them a listen.</p>
<p>If youâre interested in how the title came about, check out <a href="https://www.youtube.com/watch?v=b7MWE9Z0mOM">The Downbeat episode with singer Bryan Garris</a>.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/RAuuVY__KQ0" title="Knocked Loose - Suffocate featuring Poppy" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/361877821?u">Listen to You Wonât Go Before Youâre Supposed To by Knocked Loose</a></p>
<h2 id="june-2024">June 2024</h2>
<h3 id="washed-out---notes-from-a-quiet-life">Washed Out - Notes from a Quiet Life</h3>
<img src="https://www.stevefrenzel.dev/_astro/6-washed-out.Bk_0_MAq_MzYWF.webp" alt="Cover artwork for Washed Out - Notes from a Quiet Life" width="1280" height="1280" loading="lazy" decoding="async">
<p>One of my favourite and most played albums ever is <a href="https://tidal.com/browse/album/147965124?u">Purple Noon</a>, so I had really high expectations for this one. The first single âThe Hardest Partâ was the perfect cure for that itch, even though it was less melancholic than before and I hate this generative âAIâ video.</p>
<p>The record as a whole was disappointing for me, as itâs just too much on the happy side, at least musically. What can I say, Iâm a sad emo boy đ€·ââïž</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/-Nb-M1GAOX8" title="Washed Out - The Hardest Part" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/356638686?u">Listen to Notes from a Quiet Life from Washed Out</a></p>
<h3 id="queen-of-jeans---all-again">Queen of Jeans - All Again</h3>
<img src="https://www.stevefrenzel.dev/_astro/7-queen-of-jeans.DysGEluc_1rTH1p.webp" alt="Cover artwork for Queen of Jeans - All Again" width="1280" height="1280" loading="lazy" decoding="async">
<p>I only discovered this record after seeing them live in September in Montreal (Canada) supporting <a href="https://tidal.com/browse/artist/6501073?u">Movements</a> and <a href="https://tidal.com/browse/artist/4931797?u">Turnover</a>.</p>
<p>Instantly fell in love with them, especially with their singerâs voice! đ For fans of shoe-gaze dream pop with stunning vocals and great hooks.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/0ypc3mobj3I" title="Queen of Jeans - All My Friends" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/344655048?u">Listen to All Again by Queen of Jeans</a></p>
<h2 id="july-2024">July 2024</h2>
<h3 id="charley-crockett---visions-of-dallas">Charley Crockett - Visions of Dallas</h3>
<img src="https://www.stevefrenzel.dev/_astro/8-charley-crocket-visions-of-dallas.FwXax6o9_Z21F7pL.webp" alt="Cover artwork for Charley Crockett - Visions of Dallas" width="1280" height="1280" loading="lazy" decoding="async">
<p>The output of this man is incredible, two albums in one year! I canât put my finger down why, but I like this one more than $10 Cowboy.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/aQnw4i-t4qA" title="Charley Crockett - Killers of the Flower Moon" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/375281465?u">Listen to Visions of Dallas by Charley Crockett</a></p>
<h3 id="cigarettes-after-sex---xs">Cigarettes After Sex - Xâs</h3>
<img src="https://www.stevefrenzel.dev/_astro/9-cigarettes-after-sex.BRIbKHLo_Z2cRU9Q.webp" alt="Cover artwork for Cigarettes After Sex - X's" width="1280" height="1280" loading="lazy" decoding="async">
<p>Having a moody day and just want to snuggle up while thereâs a slight drizzle outside? Or just need to come down after a stressful day? Then this record will be the perfect soundtrack for you!</p>
<p><a href="https://tidal.com/browse/album/343983146?u">Listen to Xâs by Cigarettes After Sex</a></p>
<h3 id="graphic-nature---who-are-you-when-no-one-is-watching">Graphic Nature - Who Are You When No One Is Watching?</h3>
<img src="https://www.stevefrenzel.dev/_astro/10-graphic-nature.B35z56ZP_1T3fPW.webp" alt="Cover artwork for Graphic Nature - Who Are You When No One Is Watching?" width="1280" height="1280" loading="lazy" decoding="async">
<p>Ever since the first record came out Iâm a massive fan! I like to refer to them as âSlipknot but coolâ, as theyâre giving me strong <a href="https://tidal.com/browse/album/68572327?u">Iowa</a>-era vibes. Music and lyrics go hard, enjoy the ride!</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/kZENkZnHG0Q" title="Graphic Nature - Something I'm Not" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/359828113?u">Listen to Who Are You When No One Is Watching?</a></p>
<h3 id="the-album-leaf---blast">The Album Leaf - Blast</h3>
<img src="https://www.stevefrenzel.dev/_astro/11-the-album-leaf.D3nr5eP5_1Q9dQQ.webp" alt="Cover artwork for The Album Leaf - Blast" width="1280" height="1280" loading="lazy" decoding="async">
<p>Iâve known the name for a while, but never checked them out. This has become my go-to focus music now, as it has just the right amount of percussion while still being ambient.</p>
<p>The whole record has a great climax, the cover artwork captures it perfectly. Canât believe that this is a live session! đ±</p>
<p><a href="https://tidal.com/browse/album/366557856?u">Listen to Blast by The Album Leaf</a></p>
<h2 id="august-2024">August 2024</h2>
<h3 id="holding-absence---the-noble-art-of-self-destruction">Holding Absence - The Noble Art Of Self Destruction</h3>
<img src="https://www.stevefrenzel.dev/_astro/12-holding-absence.CDVcGCIc_12bRQG.webp" alt="Cover artwork for Holding Absence - The Noble Art Of Self Destruction" width="1280" height="1280" loading="lazy" decoding="async">
<p>Ok, so this record came out in 2023, but I only discovered it because <a href="https://www.youtube.com/watch?v=DoeMirzkFMU">Lucas and Ash were guests in The Downbeat Podcast</a>. They seemed super nice, so I checked out there music and got hooked instantly!</p>
<p>Creative songwriting and singing, as well as one of the best song transitions ever from âFalse Dawnâ to âScissorsâ. For people who listen to Metal but actually like Pop music.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/4guUJmAnld4" title="Holding Absence - A Crooked Melody" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/291212064?u">Listen to The Noble Art Of Self Destruction by Holding Absence</a></p>
<h3 id="lambert---actually-good">Lambert - Actually Good</h3>
<img src="https://www.stevefrenzel.dev/_astro/13-lambert.DEOafAqD_1tMcF8.webp" alt="Cover artwork for Lambert - Actually Good" width="1280" height="1280" loading="lazy" decoding="async">
<p>Not as experimental as his <a href="https://tidal.com/browse/album/117224660?u">True</a> and <a href="https://tidal.com/browse/album/170554588?u">False</a> album, but a more âtypicalâ Lambert making calm, relaxing piano music while being technically impressive at the same time. This record is actually good!</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/Zmas7XdpSfQ" title="Lambert - Actually Good" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/382894236?u">Listen to Actually Good by Lambert</a></p>
<h2 id="september-2024">September 2024</h2>
<h3 id="foxing---foxing">Foxing - Foxing</h3>
<img src="https://www.stevefrenzel.dev/_astro/14-foxing.CJTlMF8u_Z1Q7DMt.webp" alt="Cover artwork Foxing" width="1280" height="1280" loading="lazy" decoding="async">
<p>This band hit the nerve so much, I canât believe I havenât listened to it more. Itâs like a melancholic Pink Floyd with its fair share of (Black) Metal. Sounds wild and really good!</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/ULtsv_-dscM" title="Foxing - Greyhound" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/370954635?u">Listen to Foxing by Foxing</a></p>
<h3 id="thrown---excessive-guilt">thrown - EXCESSIVE GUILT</h3>
<img src="https://www.stevefrenzel.dev/_astro/15-thrown.CEjXxFiO_ZM6Kcd.webp" alt="Cover artwork for thrown - EXCESSIVE GUILT" width="1280" height="1280" loading="lazy" decoding="async">
<p>This band goes so hard and needs only a little more than 20 minutes to show you how itâs done. The sound is ignorantly fat and loud, songs are short and straight to the point. Perfect for working out or any other occasion where you need to pump the gas a little bit.</p>
<iframe allow="accelerometer 'none'; autoplay 'none'; camera 'none'; clipboard-write 'none'; display-capture 'none'; encrypted-media 'none'; fullscreen; gyroscope 'none'; geolocation 'none'; microphone 'none'; picture-in-picture; publickey-credentials-get 'none'; screen-wake-lock 'none'; web-share 'none'" loading="lazy" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube-nocookie.com/embed/DqBzOVCmIdM" title="Thrown - on the verge" data-astro-cid-7yu2nja5="">
</iframe>
<p><a href="https://tidal.com/browse/album/363349693?u">Listen to EXCESSIVE GUILT by thrown</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>âFuck offâ to hand-off: Holistic web design</title><link>https://www.stevefrenzel.dev/blog/fuck-off-to-hand-off-holistic-web-design/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/fuck-off-to-hand-off-holistic-web-design/</guid><description>How I do a hand-off from design, to ticket, to development. Might be borderline micromanaging.</description><pubDate>Mon, 19 Aug 2024 00:00:00 GMT</pubDate><content:encoded><h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#why-im-writing-this">Why Iâm writing this</a></li>
<li><a href="#back--forth-in-figma">Back &#x26; forth in Figma</a>
<ul>
<li><a href="#smallest--largest-viewport">Smallest &#x26; largest viewport</a></li>
<li><a href="#annotations-with-stark">Annotations (with Stark)</a>
<ul>
<li><a href="#alt-text">Alt-Text</a></li>
<li><a href="#focus-order">Focus Order</a></li>
<li><a href="#headings">Headings</a></li>
<li><a href="#landmarks">Landmarks</a></li>
<li><a href="#measure-tools">Measure Tools</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#creating-the-ticket">Creating the ticket</a>
<ul>
<li><a href="#user-story">User story</a></li>
<li><a href="#user-story">Tasks</a></li>
<li><a href="#design">Design</a></li>
</ul>
</li>
<li><a href="#doing-the-hand-off">Doing the hand-off</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="why-im-writing-this">Why Iâm writing this</h2>
<p>Do you sometimes feel irritated when opening a ticket for a task that only has one line of text, but it seems to be a big, complex component or feature you have to implement? Does it feel like a gentle, but distinguished âfuck off, this your responsibility nowâ coming from the person creating the ticket?</p>
<p>I might have a solution for this, if youâre a developer knowing your way around in design tools and willing to take more responsibility. (And increase your market value along the way.)</p>
<p>Recently I had the privilege of doing web development with a holistic approach, or âthe way it used to beâ đ. Which means that I was responsible for the following things:</p>
<ul>
<li>Design (in Figma)</li>
<li>Ticket creation (in JIRA)</li>
<li>Implementation (in code)</li>
</ul>
<p>The workload for this task was immense, but I learned a lot about what worked well and where things could be improved.</p>
<p>The fewer open questions there are in the design phase and the more detailed a ticket is written, the faster the implementation goes. I have created around ten of them and there were almost no follow-up questions from my developer colleagues.</p>
<p>I would like to share my approach, as it can make your workflow run smoothly if used in this or a similar way. As an example I use a Figma template from Faqih Sopyan called <a href="https://www.figma.com/community/file/1235152009438565697/the-blog-a-web-personal-blog">A Web Personal Blog</a>, which is freely available.</p>
<p>This article is very much inspired by <a href="https://piccalil.li/blog/the-time-for-designers-to-learn-to-code-is-now">The time for designers to learn to code is now</a>, as it was published at almost exactly the same time. Similar articles are <a href="https://css-tricks.com/the-great-divide/">The Great Divide</a> and <a href="https://www.ellyloel.com/blog/front-end-development-s-identity-crisis/">Front-end developmentâs identity crisis</a>.</p>
<h2 id="back--forth-in-figma">Back &#x26; forth in Figma</h2>
<p>This is NOT a Figma tutorial. Iâm not going to tell you how to create something there, but which tools you should use for a hand-off that will bring tears of joy to your eyes and those of your developers.</p>
<p>At this stage, it is important that you communicate openly and a lot so that you can work quickly and efficiently for yourself from a certain point onwards.</p>
<p>Talk to the person who is responsible for this project: product owner, product manager, <a href="https://tidal.com/browse/album/80813905?u">master of puppets</a>, whatever label is used for this particular position. Have you both clarified all your questions? Good, then letâs move on:</p>
<p>Make sure you use your design system for your templates. You have one, donât you?</p>
<p>Again, sustainability and efficiency are key here, so work with <a href="https://help.figma.com/hc/en-us/articles/360038662654-Guide-to-components-in-Figma">components</a> and <a href="https://help.figma.com/hc/en-us/articles/5731482952599-Add-auto-layout-to-a-design">auto layout</a> as much as possible (if youâre using Figma).</p>
<p>If you have questions related to a backend implementation, ask your backend developers if itâs possible. The same applies to frontend specific questions. If they have a better suggestion how to implement it in the real world, consider adjusting your design.</p>
<p>Some questions must be asked in writing in the group so that everyone can give their feedback. Others may only concern individuals and in this case you could simply call this person to clarify it quickly.</p>
<p>This phase can be a bit messy as there will be a lot of back and forth. Thatâs ok as long as you clean up your mess after all the issues have been resolved.</p>
<h3 id="smallest--largest-viewport">Smallest &#x26; largest viewport</h3>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/size-of-planets.BtyA7ymH_Z2m8Dyw.webp" alt="Size of planets in order, a diameter from smallest to largest: Mercury, Mars, Venus, Earth, Neptune, Uranus, Saturn, Jupiter and the sun for reference." width="1500" height="1000" loading="lazy" decoding="async"></p>
<p><a href="https://sciencenotes.org/size-of-planets-in-order/">Image source</a></p>
<p>All questions and arguments on this topic have been answered on <a href="https://viewports.fyi/">The ideal viewport doesnât exist</a>. For our example, Iâm only using the smallest viewport, but just use your imagination to envision the largest viewport version.</p>
<p>Try to get away from the terms âmobileâ, âtabletâ and âdesktopâ because they donât apply to the real world. Instead, use terms like:</p>
<ul>
<li>âsmallestâ and âlargestâ</li>
<li>âminimumâ and âmaximumâ</li>
</ul>
<p>You could also use planet names, such as âMercuryâ and âSunâ. Like the universe, the possibilities are endless! Leave everything in between to the browser, following the motto <a href="https://buildexcellentwebsit.es/">Be the browserâs mentor, not its micromanager.</a></p>
<p>Once youâre done, export these two as images and add them to the ticket. Donât just throw a Figma link in the ticket like itâs breadcrumbs and your developers are pigeons in the park and hope for the best.</p>
<p>If you have a lot of templates in your Figma page, do yourself and the others a favour and use <a href="https://help.figma.com/hc/en-us/articles/9771500257687-Organize-your-canvas-with-sections">sections</a> in Figma. Itâs simple, looks good and is⊠well, really easy to use!</p>
<h3 id="annotations-with-stark">Annotations (with Stark)</h3>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/stark-annotations.B1AuqqyO_1pjym2.webp" alt="A split screen view showing the new Stark UI in light and dark mode, a pointer hovering over the Alt-Text tool." width="2280" height="1672" loading="lazy" decoding="async"></p>
<p><a href="https://www.getstark.co/blog/all-new-beautiful-design-smart-suggestions-from-design-system-new-annotation-tools/">Image source</a></p>
<p>I am a very big fan of Stark as they present the topic of accessibility in a light, easy-to-understand and sexy way, same goes for their products. There are different tools to add accessibility annotations in Figma and maybe this is not the right one for you.</p>
<p>For me, however, it is currently an all-in-one solution as I can easily cover different areas. From the following annotations you create an additional template in Figma and export it as an image:</p>
<h4 id="alt-text">Alt-Text</h4>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/annotations-alt-Text.TM0yxlk8_uaLHo.webp" alt="Article preview in Figma, show the alt-text annotations" width="790" height="692" loading="lazy" decoding="async"></p>
<p>Hereâs one big âIt dependsââąïžÂ topic! Are there images in your design, that are purely decorative? Mark them accordingly.</p>
<p>Do you have images, where you know that theyâll need alt-text and it can be provided by you? Add them or read <a href="https://design102.blog.gov.uk/2022/01/14/whats-the-alternative-how-to-write-good-alt-text/">Whatâs the alternative? How to write good alt text</a> first before you get started.</p>
<p>The alt-text will be provided by someone else? Mark it accordingly and pray to the <a href="https://en.wikipedia.org/wiki/Flying_Spaghetti_Monster">flying spaghetti monster</a> they know how to write proper alt-text. Maybe send them the link above?</p>
<h4 id="focus-order">Focus Order</h4>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/blog-post-focus-order.DTSktLQi_16fscV.webp" alt="Article preview in Figma, showing numbers at three elements that can be interacted with via keyboard." width="800" height="800" loading="lazy" decoding="async"></p>
<p>Anything that can be interacted with via keyboard should be marked accordingly.</p>
<p>If the focus order looks funny to you and goes up, down, left and right, tack a step back and rearrange the UI, please.</p>
<p>Keyboard support is crucial for anyone who is dependent on it and you want to get it right BEFORE itâs implemented.</p>
<h4 id="headings">Headings</h4>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/blog-post-headings.CkXaJ-ZN_1nTHKR.webp" alt="Article preview in Figma, showing &#38;#x27;H2&#38;#x27; attached to the title." width="800" height="800" loading="lazy" decoding="async"></p>
<p>One of my favourite topics! Most developers have no clue what these HTML elements are for, so hereâs a handy resource for them: <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements">The HTML Section Heading elements</a></p>
<p>What Iâve seen way too often is that these elements where picked based on their look but not there semantic meaning.</p>
<p>Do NOT do this, <a href="https://webaim.org/projects/screenreadersurvey9/#heading">heading levels are very important for screen reader users</a> and search engine crawlers as well!</p>
<p>Do you really need an H3 to look like an H1? Create CSS classes (in your design system), use the correct HTML element, add the class to it, done. Although this shouldnât be necessary, but at least your heading order will remain intact.</p>
<h4 id="landmarks">Landmarks</h4>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/annotations-landmarks-min.jnmQAdhc_ZbdIuj.webp" alt="Template of the whole page showing landmarks for nav, section, main &#38;#x26; footer." width="1840" height="2658" loading="lazy" decoding="async"></p>
<p>Very underrated, yet super important for screen reader users. These are invisible to the eye, but provide the structure of a website through semantics.</p>
<p>There are only a couple of them, so chances are high youâre gonna get this right on the first try: <a href="https://developer.mozilla.org/en-us/blog/aria-accessibility-html-landmark-roles/">Using HTML landmark roles to improve accessibility</a></p>
<p>I wouldnât annotate individual components, but rather full pages where they all come together. This way you and your developers will have a better overview of which landmark elements to use.</p>
<h4 id="measure-tools">Measure tools</h4>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/blog-post-spacing.BUM5Q8pX_heXu7.webp" alt="Article preview with annotations for spacing between elements." width="800" height="800" loading="lazy" decoding="async"></p>
<p>I consider <a href="https://www.figma.com/community/plugin/822781486072277843">Measure Tools</a> by Habo Chen a nice-to-have. It displays the spacing used in your design system (hopefully) and developers will know which spacing or utility class to apply (fingers crossed).</p>
<h2 id="creating-the-ticket">Creating the ticket</h2>
<p>You may use <a href="https://www.atlassian.com/software/jira">JIRA</a>, <a href="https://asana.com/logged-in">Asana</a>, <a href="https://docs.github.com/en/issues">GitHub Issues</a>, or some other tool to create your tickets. You may love or you may hate it. You may have a pre-defined structure for tickets in place.</p>
<p>When I have the chance to write a ticket, I want it to be understandable by anyone who takes a look at it. Hereâs my approach:</p>
<h3 id="user-story">User story</h3>
<p>Unless itâs something internal you work on where no end-users are involved, this is the most important part. It describes (in first-person mode) what the user experience with this particular thing youâll create will be like.</p>
<p>Try to keep it brief and avoid technical jargon, if possible. Assume that the person on the other end has no clue how to use it. It could look something like this:</p>
<blockquote>
<p><em>As a user, I want to have a preview of a blog article. When pressing the âread moreâ button, I can access the whole article on a new page.</em></p>
</blockquote>
<p>See what I did there? Keeping the <a href="https://www.w3.org/WAI/fundamentals/accessibility-principles/">P.O.U.R. principles</a> in mind! đȘ</p>
<ul>
<li>I didnât use the word âseeâ, cause some people might not be able to. But they will have this blog article preview available on the page and can interact with it however they want.</li>
<li>I didnât use the word âclickâ, cause people might not be able to use a mouse. But they can both press the button with a mouse and a keyboard (or other assistive technology).</li>
<li>I didnât use the word âreadâ, cause some people might not be able to actively read but have it read out loud by a screen reader.</li>
<li>I didnât use the word âredirectâ, but this is whatâs gonna happen after interacting with the button.</li>
</ul>
<p>I covered both the presentational and functional part of it in two shorts sentences. You might disagree with me here, but thatâs the way how I write user stories to get the point across.</p>
<p>Donât forget: Whatever you build, you build it for people!</p>
<h3 id="design">Design</h3>
<p>Here youâre gonna add two things:</p>
<ol>
<li>Link(s) to the design in Figma, Sketch, Adobe XD, whatever</li>
<li>The images of the templates for
<ol>
<li>Smallest viewport</li>
<li>Largest viewport</li>
<li>Alt text annotations</li>
<li>Focus order annotations</li>
<li>Heading annotations</li>
<li>Landmark annotations</li>
<li>Spacing annotations</li>
</ol>
</li>
</ol>
<p>Depending on the provider, you might not be able to add the images directly to the ticket. Thatâs cool, as long as you can at least add a link to them.</p>
<p>If there are images or icons which are not part of the frontend or design system; add them directly to the ticket!</p>
<p>The goal here is to reduce the amount of follow-up questions, so itâs essential that all the info is available at once, one way or another.</p>
<h3 id="tasks">Tasks</h3>
<p>Hereâs the part where you can go in-depth and describe how something should be implemented.</p>
<p>Letâs keep the example of the blog article preview. How would you describe it to your developers?</p>
<p>If youâre using <a href="https://bradfrost.com/blog/post/atomic-web-design/">atomic design</a> for your design system and have everything pre-defined, you could at first specify which atoms, molecules and / or organisms should be used.</p>
<p>I then like to work my way from outer to inner shell when describing:</p>
<ul>
<li>Which landmark element(s) should be used</li>
<li>Which other semantic HTML element(s) should be used
<ul>
<li>If they need an aria-label, describe itâs content</li>
<li>If it should be hidden via aria-hidden=âtrueâ, add the info</li>
<li>If they need other aria roles, describe them accordingly</li>
</ul>
</li>
<li>Which font-sizes should be used</li>
<li>Which colors should be used</li>
<li>Which tracking parameters should be added (if applicable)</li>
</ul>
<p>If done properly, this should cover enough, if not all the ground for developers to get started right away. This might be borderline micromanaging, but so far my experience with a detailed list of requirements has been very good.</p>
<h2 id="doing-the-hand-off">Doing the hand-off</h2>
<p>When you think youâre done with your ticket, present it to your team lead, designers and developers. Do they have any questions or suggestions? Update the ticket or design accordingly. By this point, the amount of work to adjust something should be very little.</p>
<p>If everyoneâs happy, start hacking or create the next ticket. đ€</p>
<h2 id="conclusion">Conclusion</h2>
<p>To sum it up, the structure of your ticket could look like this:</p>
<ul>
<li>User story
<ul>
<li>Brief and general description of the expected user experience</li>
</ul>
</li>
<li>Tasks
<ul>
<li>Describing which HTML elements, font-sizes and colours should be used</li>
<li>Describing functionality, for example a redirect</li>
</ul>
</li>
<li>Design
<ul>
<li>Add a link to the design in Figma, Sketch, Adobe XD, whatever you use</li>
<li>Add the following pictures to the ticket:
<ul>
<li>Smallest &#x26; largest viewport</li>
<li>Alt-Text annotation</li>
<li>Focus order annotation</li>
<li>Headings annotation</li>
<li>Landmarks annotation</li>
<li>Spacing annotation (nice-to-have)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>All of this can take a while to prepare and might require a bigger shift in your work flow. But in the long run every party involved (product owner, designer, developer) will benefit from a well documented design and ticket.</p>
<p>Because now youâre not saying âfuck-offâ anymore when delivering your work, but doing a proper hand-off.</p></content:encoded><author>Steve Frenzel</author></item><item><title>Webmentions in Astro (for blog posts)</title><link>https://www.stevefrenzel.dev/blog/webmentions-in-astro-for-blog-posts/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/webmentions-in-astro-for-blog-posts/</guid><description>Code for you to copy and things for me to learn. This blog became part of the IndieWeb! đ„</description><pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate><content:encoded><h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#tldr">TL;DR</a></li>
<li><a href="#how-i-got-hooked">How I got hooked</a></li>
<li><a href="#taking-a-step-back">Taking a step back</a></li>
<li><a href="#implementing-it">Implementing it</a></li>
<li><a href="#my-webmentions-component">My Webmentions component</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="tldr">TL;DR</h2>
<p>You want to get started right away? Add this code to your <a href="https://docs.astro.build/en/basics/astro-components/#the-component-script">Component Script</a> in your blog post layout and replace <code>YOUR_DOMAIN</code> with your domain name.</p>
<p>If there are <a href="https://www.w3.org/TR/webmention/#introduction">Webmentions</a>, you will get back an (empty) array through which you can loop. You can find more information here: <a href="https://github.com/aaronpk/webmention.io#api">Find links to a specific page</a>.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> webmentionsUrl</span><span style="color:#F97583"> =</span><span style="color:#F97583"> import</span><span style="color:#E1E4E8">.</span><span style="color:#79B8FF">meta</span><span style="color:#E1E4E8">.env.</span><span style="color:#79B8FF">PROD</span></span>
<span class="line"><span style="color:#F97583"> ?</span><span style="color:#9ECBFF"> `https://webmention.io/api/mentions.jf2?target=https://YOUR_DOMAIN${</span><span style="color:#E1E4E8">Astro</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">url</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">pathname</span><span style="color:#9ECBFF">}`</span></span>
<span class="line"><span style="color:#F97583"> :</span><span style="color:#9ECBFF"> `https://webmention.io/api/mentions.jf2?target=https://YOUR_DOMAIN${</span><span style="color:#E1E4E8">Astro</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">url</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">pathname</span><span style="color:#9ECBFF">}/`</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> response</span><span style="color:#F97583"> =</span><span style="color:#F97583"> await</span><span style="color:#B392F0"> fetch</span><span style="color:#E1E4E8">(webmentionsUrl);</span></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> json</span><span style="color:#F97583"> =</span><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> response.</span><span style="color:#B392F0">json</span><span style="color:#E1E4E8">();</span></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> webmentions</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> json.children;</span></span>
<span class="line"></span></code></pre>
<h2 id="how-i-got-hooked">How I got hooked</h2>
<p>Iâve been aware of webmentions peripherally for some time, but hadnât paid much attention to them until recently. That changed after I saw <a href="https://www.youtube.com/watch?v=iLxJ6PtuF9M&#x26;t=8542s">Henry Desrochesâ talk at The 11ty International Symposium on Making Web Sites Real Good</a>!</p>
<p>So I was feverishly searching for information that would help me to receive, send and display Webmentions in <a href="https://astro.build/">Astro</a>. Fortunately, I found this blog post: <a href="https://kld.dev/adding-webmentions/">Adding Webmentions to a static Astro site</a>.</p>
<p>Unfortunately, I couldnât get it to work, partly because the article is a bit outdated (more on that later). And because Iâm not really good with <a href="https://nodejs.org/en">Node.js</a>. đđ</p>
<p>As always when I get stuck, I put out a call for help to the Mastodon community and got a lot of suggestions, but almost all of them were for <a href="https://www.11ty.dev/">Eleventy</a>.</p>
<p>While I was very grateful for the help, unfortunately it didnât get me anywhere. I tried a lot, pushed and undid changes. Partly I was successful and something sort of worked. So it was time for:</p>
<h2 id="taking-a-step-back">Taking a step back</h2>
<p>Before I took care of the Webmentions, I first followed all the steps on <a href="http://IndieWebify.me">IndieWebify.me</a> to successfully make my website and blog posts available on the <a href="https://indieweb.org/">IndieWeb</a>. Then I looked at the <a href="https://github.com/aaronpk/webmention.io#api">example URL from the webmention.io repository</a> and pasted it into my browser:</p>
<blockquote>
<p><a href="https://webmention.io/api/mentions.jf2?target=https://indieweb.org">https://webmention.io/api/mentions.jf2?target=https://indieweb.org</a></p>
</blockquote>
<p>Then I thought to myself: Ok, that should also work with my website? It didnât work with stevefrenzel.dev, nor with stevefrenzel.dev/blog. After I tried it with this blog post URL:</p>
<blockquote>
<p><a href="https://webmention.io/api/mentions.jf2?target=https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/">https://webmention.io/api/mentions.jf2?target=https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/</a></p>
</blockquote>
<p>I got a response, which was this:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"feed"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Webmentions"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "children"</span><span style="color:#E1E4E8">: [</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"entry"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "author"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"card"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Sara Joy :happy_pepper:"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "photo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://webmention.io/avatar/files.mastodon.online/a06118ca119ec1183309db1aa65689d6bd69349b68713fd0c3f49cc5de8ca683.jpg"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://front-end.social/@sarajw"</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://mastodon.online/@stvfrnzl/112457754528196561#favorited-by-109297968568930830"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "published"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">null</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-received"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"2024-05-17T18:51:48Z"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-id"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">1828656</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-source"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://brid.gy/like/mastodon/@stvfrnzl@mastodon.online/112457754528196561/109297968568930830"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-target"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-protocol"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"webmention"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "like-of"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-property"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"like-of"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-private"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">false</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"entry"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "author"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"card"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Programming Feed"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "photo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://webmention.io/avatar/files.mastodon.online/2a355e8ebe7968eff2c0f472b2ddf0e673bb20294c43adc29145fbe2c2a358e9.png"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://newsmast.community/@programming"</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://mastodon.online/@stvfrnzl/112457754528196561#reblogged-by-111653441837787906"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "published"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">null</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-received"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"2024-05-17T18:25:47Z"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-id"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">1828650</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-source"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://brid.gy/repost/mastodon/@stvfrnzl@mastodon.online/112457754528196561/111653441837787906"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-target"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-protocol"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"webmention"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "repost-of"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-property"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"repost-of"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-private"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">false</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"entry"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "author"</span><span style="color:#E1E4E8">: {</span></span>
<span class="line"><span style="color:#79B8FF"> "type"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"card"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Journalism &#x26; Comment Feed"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "photo"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://webmention.io/avatar/files.mastodon.online/2a355e8ebe7968eff2c0f472b2ddf0e673bb20294c43adc29145fbe2c2a358e9.png"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://newsmast.community/@journalismandcomment"</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#79B8FF"> "url"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://mastodon.online/@stvfrnzl/112457754528196561#reblogged-by-111653306305749482"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "published"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">null</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-received"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"2024-05-17T18:25:46Z"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-id"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">1828649</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-source"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://brid.gy/repost/mastodon/@stvfrnzl@mastodon.online/112457754528196561/111653306305749482"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-target"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-protocol"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"webmention"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "repost-of"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"https://stevefrenzel.dev/posts/from-boot-camp-to-blog-five-years-in-the-tech-industry/"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-property"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"repost-of"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "wm-private"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">false</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#E1E4E8"> ]</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<p>Sweet, now weâre talking! Letâs try to make this work with Astro. đ</p>
<h2 id="implementing-it">Implementing it</h2>
<p>This is the bare minimum I need to make them available in the respective blog post. Feel free to expand, change and configure it to your personal needs. Weâll go through the code line by line:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> webmentionsUrl</span><span style="color:#F97583"> =</span><span style="color:#F97583"> import</span><span style="color:#E1E4E8">.</span><span style="color:#79B8FF">meta</span><span style="color:#E1E4E8">.env.</span><span style="color:#79B8FF">PROD</span></span>
<span class="line"><span style="color:#F97583"> ?</span><span style="color:#9ECBFF"> `https://webmention.io/api/mentions.jf2?target=https://stevefrenzel.dev${</span><span style="color:#E1E4E8">Astro</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">url</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">pathname</span><span style="color:#9ECBFF">}`</span></span>
<span class="line"><span style="color:#F97583"> :</span><span style="color:#9ECBFF"> `https://webmention.io/api/mentions.jf2?target=https://stevefrenzel.dev${</span><span style="color:#E1E4E8">Astro</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">url</span><span style="color:#9ECBFF">.</span><span style="color:#E1E4E8">pathname</span><span style="color:#9ECBFF">}/`</span><span style="color:#E1E4E8">;</span></span>
<span class="line"></span></code></pre>
<p>This part is very interesting and has given me a lot of headaches. Remember when I mentioned that the article above is a bit outdated?</p>
<p>It says that you access the environment variables using <code>process.env.WEBMENTION_API_KEY</code>. This no longer works in Astro, because you need <code>import.meta.env.WEBMENTION_API_KEY</code>, as you can read in the <a href="https://docs.astro.build/en/guides/environment-variables/#default-environment-variables">Astro documentation</a>.</p>
<p>Why is this relevant if I donât use an API key at all? After I proudly pushed my code with the working Webmentions, I noticed that nothing was visible online.</p>
<p>No problems with the commit, no problems with the build, no error message in the console, nothing. Why do they work locally but not in production?</p>
<p>Quite simple: A trailing slash is required live, but not locally⊠I canât believe that a slash cost me so much time and nerves. đ€Šââïž</p>
<p>This <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator">ternary operator</a> is used to check whether my server is in <code>production</code> or <code>development</code> mode. Accordingly, it has a slash at the end, or not.</p>
<p>To reference the current file pathname, Iâm using the <a href="https://docs.astro.build/en/reference/api-reference/#astrourl">Astro global</a>, which is available in all contexts in <code>.astro</code> files</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> response</span><span style="color:#F97583"> =</span><span style="color:#F97583"> await</span><span style="color:#B392F0"> fetch</span><span style="color:#E1E4E8">(webmentionsUrl);</span></span>
<span class="line"></span></code></pre>
<p>Here weâre leveraging the powerful <a href="https://developer.mozilla.org/en-US/docs/Web/API/fetch">fetch() method of the Web API</a>. We do an asynchronous call to retrieve all the content of this call and turn it into a JavaScript object with the <a href="https://developer.mozilla.org/en-US/docs/Web/API/Response/json">json() method</a>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> json</span><span style="color:#F97583"> =</span><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> response.</span><span style="color:#B392F0">json</span><span style="color:#E1E4E8">();</span></span>
<span class="line"></span></code></pre>
<p>As weâre just interested in the children of this object, we store them accordingly in a variable:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">const</span><span style="color:#79B8FF"> webmentions</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> json.children;</span></span>
<span class="line"></span></code></pre>
<p>And thatâs it! Now you can loop through this array to your liking and display all the content however you want. I created a <code>Webmentions.astro</code> component to do just that.</p>
<h2 id="my-webmentions-component">My Webmentions component</h2>
<p>Letâs brake it down into chunks and see what I did in the Component Script:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#F97583">---</span></span>
<span class="line"><span style="color:#F97583">import</span><span style="color:#E1E4E8"> { Image } </span><span style="color:#F97583">from</span><span style="color:#9ECBFF"> "astro:assets"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">interface</span><span style="color:#B392F0"> AuthorProps</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70"> name</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#FFAB70"> photo</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#FFAB70"> url</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">interface</span><span style="color:#B392F0"> WebmentionProps</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70"> author</span><span style="color:#F97583">:</span><span style="color:#B392F0"> AuthorProps</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#9ECBFF"> "wm-received"</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#9ECBFF"> "wm-property"</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">interface</span><span style="color:#B392F0"> Props</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#FFAB70"> webmentions</span><span style="color:#F97583">:</span><span style="color:#B392F0"> WebmentionProps</span><span style="color:#E1E4E8">[];</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#E1E4E8"> { </span><span style="color:#79B8FF">webmentions</span><span style="color:#E1E4E8"> } </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> Astro.props;</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">const</span><span style="color:#B392F0"> showDate</span><span style="color:#F97583"> =</span><span style="color:#E1E4E8"> (</span><span style="color:#FFAB70">webmention</span><span style="color:#F97583">:</span><span style="color:#79B8FF"> string</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span></span>
<span class="line"><span style="color:#F97583"> new</span><span style="color:#B392F0"> Date</span><span style="color:#E1E4E8">(webmention).</span><span style="color:#B392F0">toLocaleDateString</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">undefined</span><span style="color:#E1E4E8">, {</span></span>
<span class="line"><span style="color:#E1E4E8"> day: </span><span style="color:#9ECBFF">"numeric"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#E1E4E8"> month: </span><span style="color:#9ECBFF">"long"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#E1E4E8"> year: </span><span style="color:#9ECBFF">"numeric"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#E1E4E8"> });</span></span>
<span class="line"><span style="color:#F97583">---</span></span>
<span class="line"></span></code></pre>
<p>Nothing too fancy, just some type definitions and a method to show a human readable date. Moving on to the <a href="https://docs.astro.build/en/basics/astro-components/#the-component-template">Component Template</a>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="javascript"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#E1E4E8"> webmentions.</span><span style="color:#79B8FF">length</span><span style="color:#F97583"> ></span><span style="color:#79B8FF"> 0</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">section</span><span style="color:#B392F0"> aria-label</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"Webmentions"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">>Webmentions&#x3C;/</span><span style="color:#85E89D">h2</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {webmentions.</span><span style="color:#B392F0">map</span><span style="color:#E1E4E8">((</span><span style="color:#FFAB70">webmention</span><span style="color:#F97583">:</span><span style="color:#B392F0"> WebmentionProps</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">=></span><span style="color:#E1E4E8"> (</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"avatar-and-author"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {webmention.author.photo </span><span style="color:#F97583">?</span><span style="color:#E1E4E8"> (</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#79B8FF">Image</span></span>
<span class="line"><span style="color:#B392F0"> alt</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">""</span></span>
<span class="line"><span style="color:#B392F0"> height</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"50"</span></span>
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{webmention.author.photo}</span></span>
<span class="line"><span style="color:#B392F0"> width</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"50"</span></span>
<span class="line"><span style="color:#E1E4E8"> /></span></span>
<span class="line"><span style="color:#E1E4E8"> ) </span><span style="color:#F97583">:</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{webmention.author.url} </span><span style="color:#B392F0">rel</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"author"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {webmention.author.name}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"information"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {webmention[</span><span style="color:#9ECBFF">"wm-property"</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">===</span><span style="color:#9ECBFF"> "like-of"</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> Liked on</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">time</span><span style="color:#B392F0"> aria-hidden</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"true"</span><span style="color:#B392F0"> datetime</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{webmention[</span><span style="color:#9ECBFF">"wm-received"</span><span style="color:#E1E4E8">]}></span></span>
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#B392F0">showDate</span><span style="color:#E1E4E8">(webmention[</span><span style="color:#9ECBFF">"wm-received"</span><span style="color:#E1E4E8">])}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">time</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> ) </span><span style="color:#F97583">:</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8"> {webmention[</span><span style="color:#9ECBFF">"wm-property"</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">===</span><span style="color:#9ECBFF"> "repost-of"</span><span style="color:#F97583"> ?</span><span style="color:#E1E4E8"> (</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> Reposted on</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">time</span><span style="color:#B392F0"> aria-hidden</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">"true"</span><span style="color:#B392F0"> datetime</span><span style="color:#F97583">=</span><span style="color:#E1E4E8">{webmention[</span><span style="color:#9ECBFF">"wm-received"</span><span style="color:#E1E4E8">]}></span></span>
<span class="line"><span style="color:#E1E4E8"> {</span><span style="color:#B392F0">showDate</span><span style="color:#E1E4E8">(webmention[</span><span style="color:#9ECBFF">"wm-received"</span><span style="color:#E1E4E8">])}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">time</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">p</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> ) </span><span style="color:#F97583">:</span><span style="color:#79B8FF"> null</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">li</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> ))}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">ul</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">section</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> ) </span><span style="color:#F97583">:</span><span style="color:#79B8FF"> null</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<p>If the array of Webmentions is empty, I donât show this component at all, so itâs gonna equal <code>null</code>.</p>
<p>If theyâre present, Iâll show the author picture, or not. And depending on the type of Webmention (like or repost), Iâll show just that.</p>
<p>The current implementation looks like this, but itâs gonna change for sure. If youâre curios regarding the styling, have a <a href="https://github.com/stevefrenzel/dev-portfolio/blob/main/src/components/utils/Webmentions.astro">look at the code on GitHub</a>.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/webmentions-screenshot.Ns3DVx_X_1kLaT1.webp" alt="Webmentions section from my website, showing the headline and three Webmentions. One is a like, the other two are reposts." width="1482" height="754" loading="lazy" decoding="async"></p>
<h2 id="conclusion">Conclusion</h2>
<p>Those few lines of code were a whole weekend of trying back and forth and Iâm glad I stuck with it. I like the idea of an open, decentralized web that isnât dependent on monolithic companies <em>doing devious and evil 2024 website things</em>. <sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup></p>
<p>I hope this article helps other Astro users to integrate Webmentions more easily into their blog and I would be happy to receive many Webmentions so that I have more data to work with and can update this article accordingly. âïž</p>
<section data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>Quote from <a href="https://csscade.com/membership/#1-i-like-the-simplicity">The Cascade</a> <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">â©</a></p>
</li>
</ol>
</section></content:encoded><author>Steve Frenzel</author></item><item><title>From boot camp to blog: Five years in the tech industry</title><link>https://www.stevefrenzel.dev/blog/from-boot-camp-to-blog-five-years-in-the-tech-industry/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/from-boot-camp-to-blog-five-years-in-the-tech-industry/</guid><description>It's been quite a ride and I haven't even mentioned all of it in this giant article. đ„”</description><pubDate>Fri, 17 May 2024 00:00:00 GMT</pubDate><content:encoded><p>Five years ago today, I received my certificate from the <a href="https://www.spiced-academy.com/en">Spiced Academy</a>, which recognized me as a âFullstack Developerâ. Time to look back and evaluate whether this decision was worth it for me, what I have experienced and learned about the industry so far.</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#first-year-2019-to-2020">First year: 2019 to 2020</a></li>
<li><a href="#second-year-2020-to-2021">Second year: 2020 to 2021</a></li>
<li><a href="#third-year-2021-to-2022">Third year: 2021 to 2022</a></li>
<li><a href="#fourth-year-2022-to-2023">Fourth year: 2022 to 2023</a></li>
<li><a href="#fifth-year-2023-to-2024">Fifth year: 2023 to 2024</a></li>
<li><a href="#the-future">The future</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="first-year-2019-to-2020">First year: 2019 to 2020</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-first-year-min.BuKl7spL_Z8lovm.webp" alt="Collage of some of the biggest pop culture moments in 2019" width="1200" height="675" loading="lazy" decoding="async"></p>
<p>After I graduated, my head was spinning. There was so much input and material that I wanted to catch up on. At the same time, I had to start applying for jobs and stay on the ball so that I would remember what I had just learned.</p>
<p>Even during the boot camp, I realized that I didnât like the backend part at all. I did what was asked of me, knowing that I would hopefully never have to deal with it again. Frontend was just so much more fun!</p>
<p>But here, too, there are many points of contact with the backend, which already confused me at the time. Elly Loel summarized this dilemma very well in her article <a href="https://www.ellyloel.com/blog/front-end-development-s-identity-crisis/">Front-end developmentâs identity crisis</a>.</p>
<h3 id="keep-on-grinding">Keep on grinding</h3>
<p>My main project during the job search was the <a href="https://github.com/stevefrenzel/mars-rover-picture-search">Mars Rover Picture Search</a>, which only exists as a GitHub repository, as I didnât manage to get the website online at the time. đ</p>
<p>I like space stuff, I wasnât (and still am not) very good at backend stuff, but still I decided to âfeel the painâ and improve my skills in this area. In the end, this project and the recommendation of a friend led me to land my first job.</p>
<p>Before that happened, however, I had to spend a lot of time on LinkedIn and make various recruiters aware that I was happy about their offers, but that I didnât have the several years of experience they were so impressed by. I donât remember the application phase very well, but I do remember my very first coding challenge:</p>
<h3 id="the-interview-phase">The interview phase</h3>
<p>This was live in front of an experienced developer and for me one of the most stressful situations I have experienced. Needless to say, I blacked out and got absolutely nothing together.</p>
<p>I also remember an interview where I made it to the final round (of several), was invited in person, only to be told a little later that I didnât have enough experience for the position.</p>
<p>Oops, didnât I mention that when I said I had no work experience in this field and therefore just completed a coding boot camp? Sorry, my bad.</p>
<h3 id="landing-the-first-job">Landing the first job</h3>
<p>And so five months went by before I had an interview with an <a href="https://en.wikipedia.org/wiki/Internet_of_things">Internet of Things</a> company. Not only did we get on very well personally, they also seemed to be impressed by my side project and my career to date. So much so that they hired me! đ±</p>
<p>Until the end of the year, I worked a lot with <a href="https://react.dev/">React</a>, <a href="https://storybook.js.org/">Storybook</a> and <a href="https://helpx.adobe.com/xd/get-started.html">Adobe XD</a> and was very happy that the company was so small and the communication lines were short. The office was in a nice co-working space and my commute was short, good times.</p>
<p>To get to this point, however, I had gone through a long, exhausting process. I only got this job through a personal recommendation. Not through my LinkedIn profile or my cover letter, but because someone said âyou should meet Steveâ.</p>
<p>I then put the ball over the line into the goal during the interview, but I was only given this opportunity because someone else helped me (thank you Ingrid â€ïž).</p>
<h3 id="imposter-syndrome">Imposter syndrome</h3>
<p>I had many different jobs before my time at boot camp, where I never had the feeling that I would be thrown out because I wasnât good enough. I was often thrown in at the deep end and did well by learning by doing. But for some reason it was different during the boot camp. đ
</p>
<p>Especially when I saw how good some people were with <a href="https://developer.mozilla.org/en-US/docs/Web/javascript">JavaScript</a>, I often thought to myself: Youâll never find a job. Interestingly, in my cohort, these people had less of a knack for visual design than those who felt more comfortable with CSS (like me).</p>
<p>My <a href="https://en.wikipedia.org/wiki/Impostor_syndrome">imposter syndrome</a> didnât just get stronger during the first job, after all, losing my job would have threatened my existence. It also grew a little bit every time I watched video tutorials by well-known developers from the âsceneâ. I asked myself: Do I have to make videos now to learn in public? Will it be easier for me to find a job if I have a blog?</p>
<p>At this point, the answer is clearly no.</p>
<h2 id="second-year-2020-to-2021">Second year: 2020 to 2021</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-second-year-min.BWHkTxIz_1wqdOu.webp" alt="Collage of some of the biggest pop culture moments in 2020" width="1200" height="675" loading="lazy" decoding="async"></p>
<p>In February, the time had come: I had the interview in which I was told that I unfortunately couldnât be there for âfinancial reasonsâ and would have to be let go. I remember that day very well because I had just done some cool shit in Storybook and this sudden conversation threw me completely off track.</p>
<p>Looking back, I realize why it happened: I was just too âjuniorâ. In a very small company, time really is money and you donât have the luxury of a monolith that is too big to fail.</p>
<h3 id="second-job-one-month">Second job, one month</h3>
<p>As I still had enough muscle memory, it was easy for me to apply for other jobs straight away. I quickly came into contact with a company that was developing a cash back app based on <a href="https://mui.com/">Material UI</a>. I canât remember how the contact came about, maybe it was because I approached the company directly.</p>
<p>The interview was strange and my gut feeling told me that something was off. But my wallet told me that I needed a job. So I agreed to do a coding challenge.</p>
<p>In this case, I was supposed to use their <a href="https://www.freecodecamp.org/news/how-apis-work/">API</a> to display something with progress bars, I donât remember what it was. Just the fact that I was supposed to do something with the backend on my own made me very nervous. I didnât complete the coding challenge in time either, but at least this time I didnât have to code live.</p>
<p>At the second interview, we discussed my work and I explained my thought process. That seemed to be enough for them to offer me an employment contract! The job was completely remote and I could work from my own laptop, which was more convenient for me, but in hindsight another red flag.</p>
<p>When I started the job, I was then asked to change the <a href="https://reactnative.dev/">React Native</a> version of the app to a âdesktop versionâ, i.e. rewrite it to React. Perhaps it was mentioned during the interview that this would be my task. But if that had been the case, I would have immediately said that I had absolutely no idea about React Native. đ€·ââïž</p>
<p>My only contact was a backend programmer who worked according to the motto âI donât need a <a href="https://en.wikipedia.org/wiki/Graphical_user_interface">GUI</a>, I just use the terminalâ (direct quote) and was no help at all. One day he even wanted to watch me while working, to make comments, even though he himself said heâs not too familiar with frontend stuff. I felt like in my first interview all over again, having someone experienced watch me, while I have no clue what Iâm doing. After several minor panic attacks and a few weeks, it was over and I was laid off. Iâm sure that both sides were very happy with this decision.</p>
<h3 id="lockdowns-real-second-job-and-a-change-of-scenery">Lockdowns, (real) second job and a change of scenery</h3>
<p>The whole lockdown phase is a blur for me, but I think I remember getting my second job through a recruiter. (That one-month interlude doesnât count for me.) Which is amazing, because so far my experience with them has been very bad, as they either</p>
<ul>
<li>didnât even look at my profile but still found my several years of experience with programming language XYZ âimpressiveâ</li>
<li>realized during the interview that I am not as experienced as expected (see point 1)</li>
<li>get in touch FOR SURE as soon as they hear something</li>
</ul>
<p>I was lucky, however, and this person was able to refer me to a company that put me through several interviews and a coding challenge, but left me with a very positive impression. The only problem was that I would have had to relocate.</p>
<h3 id="tschĂŒss-berlin-servus-nĂŒrnberg">TschĂŒss Berlin, servus NĂŒrnberg!</h3>
<p>But that was the smallest problem for me, because I was planning to leave the city at that point anyway. They were a little hesitant and said that they would like to have me on the team, but the fact that I live in Berlin would be a problem. I then said âwell then, give me a yes and Iâll be on my way to Nurembergâ. Said and done!</p>
<p>I remember a very good onboarding process and that I was impressed that each of the bosses (from this 250+ employee company) wanted to get to know me personally, even if only briefly. There were also many benefits which were actually attractive and I donât mean a foosball table, fresh fruit and Friday beers. The tech stack was <a href="https://nextjs.org/">Next.js</a>, Storybook, TypeScript and <a href="https://www.figma.com/">Figma</a>, at least the main tools.</p>
<p>During this time, I had the privilege of working on several projects with various excellent and experienced designers and developers. As a result, I not only got to know different colleagues, but also different ways of working, different characters and different ways of writing code.</p>
<p>One of the biggest plus points was that I had a personal mentor with whom I not only got on extremely well (he was also a music nerd), but with whom I also developed a joint curriculum. This included getting better at <a href="https://www.typescriptlang.org/">TypeScript</a> and so far I canât say thatâs the case. đ</p>
<p>I also learned how important it is to stick to the definition of done and that it is an advantage to have strict but friendly colleagues who slap you on the wrist if you donât do exactly that.</p>
<p>Despite the large number of employees, communication internally was very good in my opinion and it didnât feel so big. Meeting various colleagues in person was also very nice and I definitely let myself go at a summer party. đ»</p>
<p>Thanks to my employer, I also had the opportunity to give an (online) presentation on the topic of web accessibility at <a href="https://nuernberg.digital/programm/programmuebersicht/details-vorschau/the-benefits-of-an-accessible-website-with-a-practical-example.html">NĂŒrnberg Digital</a>. Rarely have I been so excited and rarely have I put so much work into a presentation, as I also built a website with Next.js especially for it. Which I cannot find on my GitHub account, so I assume I created it with my work account, to which I have no access. đ</p>
<p>Unfortunately, there were technical problems and my presentation was not recorded. Nevertheless, I had a great time, was very satisfied with the organization and especially with the questions I was asked after the presentation.</p>
<h3 id="obsessing-with-web-accessibility">Obsessing with web accessibility</h3>
<p>It was during this period that I became very interested in web accessibility. The initial spark was after a colleague gave me <a href="https://inclusive-components.design/">Inclusive Components by Heydon Pickering</a>, which I just soaked up. Not only did I enjoy his dry, British humor, but he also showed me how important and impactful it can be to master the basics of HTML, CSS and JavaScript.</p>
<p>From then on, I dove deep into the Twitter bubble to follow various people who were making waves in the scene and making a big contribution:</p>
<ul>
<li><a href="https://adrianroselli.com/">Adrian Roselli</a></li>
<li><a href="https://www.sarasoueidan.com/">Sara Soueidan</a></li>
<li><a href="https://piccalil.li/author/andy-bell">Andy Bell</a></li>
<li><a href="https://thinkdobecreate.com/">Stephanie Eckles</a></li>
<li><a href="https://nerdy.dev/">Adam Argyle</a></li>
<li><a href="https://yatil.net/">Eric Eggert</a></li>
</ul>
<p>And many others that I discovered as mentors. I also learned that to keep tabs on the scene and whatâs latest and hottest, subscribing to certain newsletters is key to stay ahead of the curve. So my e-mail inbox and Twitter became my most important research tool.</p>
<p>During that time, it was already clear that the <a href="https://www.tpgi.com/european-accessibility-act-eaa-resource-center/">European Accessibility Act</a> (or EAA) would come into force and I saw it as a sign to make this topic my focus. I was also given a lot of freedom to express myself, even if it was not (yet) a priority. That wasnât a problem for me, I had only just discovered it for myself and there was still a lot to learn.</p>
<p>What did become a problem over time, however, was my pay. I was officially a junior and was paid accordingly, which was no longer compatible with ever-increasing costs (and an upcoming wedding).</p>
<h3 id="dabbling-with-freelancing">Dabbling with freelancing</h3>
<p>At that time, I also started to earn some money on the side as a freelancer because I needed money for my wedding. It was always frontend positions that I applied for, but in these interviews I made it clear that I wanted to focus on web accessibility.</p>
<p>I had worked with a few companies, but often only for a short time because I wasnât producing results fast enough. Thatâs my biggest problem with working as a freelancer: thereâs no time to really get to know colleagues, the tech stack and the company because it costs the company money.</p>
<p>I also often had the problem that the tech stack was too new to me and colleagues didnât have time to help me. It was an interesting trip, but Iâm glad that I no longer have to do it on the side. Also because in the end it cost me more money than it made, because you have to pay incredibly high taxes in Germany.</p>
<p>At least if youâre not a millionaire, there are ways around it, but thatâs a completely different topicâŠ</p>
<h2 id="third-year-2021-to-2022">Third year: 2021 to 2022</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-third-year-min.Bq1pKZgT_1rdi8O.webp" alt="Collage of some of the biggest pop culture moments in 2021" width="1200" height="675" loading="lazy" decoding="async"></p>
<p>I was very happy with the job and my colleagues, but pay also plays an important role. So after two years, I felt it was time for a pay raise. Both parties were happy with each other and they wanted to give me more responsibility, but unfortunately this wasnât reflected in the salary.</p>
<p>For this reason, we unfortunately had to go our separate ways, as I received a VERY good offer (from a recruiter) and the tech stack was very similar to my previous one (switch out Next.js with <a href="https://nuxt.com/">Nuxt.js</a>). There were also only two interviews. The first was with all my future colleagues, who asked me various personal and programming-related questions.</p>
<p>When it came to JavaScript-specific questions, I started to sweat a bit and didnât know the answers to many of them. A few days after the interview, the recruiter contacted me again to ask how it went. I said that I was a bit overwhelmed that there were so many people in the meeting, but that it went quite well until the JavaScript questions came up. Everyone was very nice and I could imagine working with them, but I thought that I screwed up so badly (hello, imposter syndrome) that it wasnât going to work out anyway.</p>
<p>He then told me that my future boss would like to meet me in person to clarify the details of my employment with me. At first I thought I had misheard him, but they wanted to work with me despite my problems in the interview and my non-existent backend knowledge.</p>
<p>During the interview, I made it clear once again that the topic of web accessibility was very important to me and that I wanted to focus on it as much as possible during my work. I was told that they would be happy if someone would take on this topic and that they would try to support me as much as possible. Done deal. đ€</p>
<p>That was towards the end of the year and I got to know my colleagues and tech stack in a relaxed way before going on Christmas vacation.</p>
<h2 id="fourth-year-2022-to-2023">Fourth year: 2022 to 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-fourth-year-min.DyEpYa6O_Z1XiQcq.webp" alt="Collage of some of the biggest pop culture moments in 2022" width="1200" height="675" loading="lazy" decoding="async"></p>
<p>Maybe I wasnât done with freelancing after all, because I focused even more on web accessibility than before and started giving workshops for small companies, back then with <a href="https://www.figma.com/figjam/">FigJam</a>. The best way for me to learn is to talk about a topic in front of others, get feedback from participants and thus work on myself and my workshops.</p>
<p>This year Iâve also left my footprints more and more in the area of web accessibility within my company. Also to make it clear to them that the EAA is very likely to affect us and that we still have enough time for training and adjustments.</p>
<p>In October of this year, it was also time for me to say goodbye to Twitter <a href="https://edition.cnn.com/2022/10/28/tech/elon-musk-twitter-deal-close/index.html">after Elon Musk bought it</a>. One of his first moves was to <a href="https://techcrunch.com/2022/11/04/elon-musk-twitter-layoffs/?guccounter=1">axe the accessibility team</a>, which would become one of many nails in that coffin. I had signed up long before that, but now it was time for me to make myself comfortable on Mastodon and become more active there. đ</p>
<h3 id="teaching-at-spiced-academy">Teaching at Spiced Academy</h3>
<p>Sometimes I randomly check the Spiced Academy Slack channel, which I still have access to. There I saw that they were looking for teachers in the field of UI &#x26; UX who were familiar with the topic of accessibility, among other subjects.</p>
<p>I wasnât interested in this job, but suggested that I could tell the students something about the topic. After an introductory meeting with the super nice head coach Boaz, I was invited to talk about the topic for half an hour.</p>
<p>And although I was late because I drove to the wrong street with the same name, I still managed to do just that. And I had a blast! The people from Spiced also liked it, which is why I was invited back afterwards and introduced as an âexpertâ.</p>
<p>I was very flattered, but I had to make it clear that Iâm more of an enthusiast than an expert. đ
If there was an opportunity for me to teach online on this topic at Spiced, I would be seriously interested.</p>
<h2 id="fifth-year-2023-to-2024">Fifth year: 2023 to 2024</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-fifth-year-min.CZb2r3Us_10e646.webp" alt="Collage of some of the biggest pop culture moments in 2023" width="1200" height="675" loading="lazy" decoding="async"></p>
<p>After many failed iterations, I finally managed to put <a href="https://stevefrenzel.dev/">my personal website</a> online. Shortly after I did that, I decided to start blogging as there were and are enough topics for me to write about.</p>
<p>By the way, the tech stack of my website is <a href="https://astro.build/">Astro</a>, nothing else! It combines the best of all worlds for me: I can write with a <a href="https://en.wikipedia.org/wiki/Component-based_software_engineering">component based approach</a> using only HTML, CSS and JavaScript and the result is a static website without JavaScript payload. And I even managed to include an RSS feed! đ</p>
<p>Iâve also tried working with <a href="https://www.11ty.dev/">Eleventy</a> (or 11ty) again and again, because the community is large, active and very helpful, but itâs still too abstract for me. It just flows better with Astro, what can I say?</p>
<h3 id="from-figjam-to-ia-presenter">From FigJam to iA Presenter</h3>
<p>When I did a workshop with FigJam once, I noticed that it took us quite some time to set everything up, as my participants didnât have a Figma account and I needed to walk them through how to get everything working. As this presented many barriers for a workshop teaching how to REMOVE barriers, I had to come up with a different solution.</p>
<p>I saw a post once by Andy Bell where he praised <a href="https://ia.net/writer">iA Writer</a> and when checking it out, I noticed they also offer a product called <a href="https://ia.net/presenter">iA Presenter</a>. This seemed to be the perfect solution for my problem, as I would be able to create simple, clean presentations, write them in <a href="https://www.markdownguide.org/getting-started/#what-is-markdown">Markdown</a> and export them to a plethora of formats. The speed of creating a whole presentation with this app still amazes me.</p>
<p>One thing that concerned me though, was the misuse of headings. iA advertised to use the headings levels based on their styling to achieve a certain look, which is very bad practice, as <a href="https://webaim.org/projects/screenreadersurvey9/#heading">heading levels are super important for screen reader users</a>. So I pointed this out on Mastodon and their CEO got back to me quickly, offering to discuss this rather complex issue.</p>
<p>I had a lovely chat with him and understood why they chose this approach. Still I told him to at least educate customers about the issue or even set up guard rails when exporting a presentation. I offered my services if he ever needed help with anything accessibility related and he told me to stay in touch.</p>
<h3 id="smashingconf-belgium">SmashingConf Belgium</h3>
<p>Thanks to my generous employer, I had the chance to attend the great <a href="https://smashingconf.com/antwerp-2023">SmashingConf in Belgium</a> with a couple of colleagues. It was in a beautiful venue and almost all of the talks were very interesting and inspirational. A learned a lot about the importance typography and UX writing. The most impressive talk was by Nick DiLallo, heâs such a talented speaker and I hope to reach his quality level one day when speaking publicly.</p>
<p>The most hilarious (and still very informative) one was by Oliver Schöndorfer. This guyâs energy is at đŻ, I enjoyed it so much. Brad Frostâs talk about the death of <a href="https://bradfrost.com/blog/post/atomic-web-design/">Atomic Design</a> and his idea of a global design system made out of <a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Components">Web Components</a> approved by the <a href="https://www.w3.org/">W3C</a> was also super interesting.</p>
<p>This conference taught me that itâs important to remember that, while our work as developers is very technical in nature, at the end of the day weâre creating something for human beings. Not search engines or âAIâs.</p>
<h2 id="the-future">The future</h2>
<p>What has already happened this year and what is still to come?</p>
<h3 id="mastodon">Mastodon</h3>
<p>Mastodon has become a very important tool for me for inspiration and research. While I was very passive on Twitter and hardly posted anything, Iâm the exact opposite here. It also helps a lot that there is no algorithm and no advertising, I only see content from the people I follow.</p>
<h3 id="the-cpacc-certificate">The CPACC certificate</h3>
<p>I am currently studying for the CPACC certificate from the IAAP. These two acronyms stand for <a href="https://www.accessibilityassociation.org/s/certified-professional">Certified Professional in Accessibility Core Competencies</a> and <a href="https://www.accessibilityassociation.org/s/">International Association of Accessibility Professionals</a>.</p>
<p>While I am somewhat critical of this organization, as they have schmoozed with <a href="https://overlayfactsheet.com/en/">accessibility overlay</a> vendors in the past, preparing for the exam will help me become an even better accessibility advocate. If I pass the exam, I will of course be happy to take the certificate with me, as it could increase my market value and job opportunities. đ€</p>
<p>By the way, Iâm preparing for it with this (paid) course from <a href="https://dequeuniversity.com/online-courses/web-accessibility">Deque University</a> and while it sometimes seems a bit high maintenance, Iâve already learned an extreme amount here. Another excellent and free course is <a href="https://www.edx.org/learn/web-accessibility/the-world-wide-web-consortium-w3c-introduction-to-web-accessibility?index=product&#x26;objectID=course-8ac6f7ff-0ff9-4894-a5f3-cc34fc5768fa&#x26;webview=false&#x26;campaign=Introduction+to+Web+Accessibility&#x26;source=edX&#x26;product_category=course&#x26;placement_url=https://www.edx.org/learn/web-accessibility">W3Cx: Introduction to Web Accessibility</a> from edX.</p>
<h3 id="volksverpetzer">Volksverpetzer</h3>
<p>The political situation in Germany is currently very critical, as the neo-Nazis of the AfD (Alternative for Germany) are unfortunately gaining more and more ground and are already in a position to co-govern.</p>
<p>For this reason, I keep myself informed about their schemes and the ban procedure via a platform called <a href="https://www.volksverpetzer.de/">Volksverpetzer</a>. I support not only this but other independent institutions with a donation.</p>
<p>I offered my services to the Volksverpetzer on the subject of accessibility because I see a lot of potential for improvement on their website and I would like to contribute to something that I am 100% behind. They were open to it and weâll have a chat soon. đȘ</p>
<h3 id="webmentions">Webmentions</h3>
<p>I would like to show in my blog posts to what extent they have been interacted with, but not use a third party product for this. And this is where <a href="https://indieweb.org/Webmention">webmentions</a> come into play. However, itâs not so easy to integrate them into Astro as there isnât much information available yet. But getting this done is on the bucket list for this year.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Since Iâve already written a lot, Iâll keep it short: Switching to this industry to work as a web developer was the best decision Iâve ever made in my professional life.</p>
<p>I donât like a lot of things that happen on the web and are considered ânormalâ or âbest practiceâ. But I now have enough knowledge to be able to educate people on what they can improve to make it a little bit more of a user-friendly place. Which ultimately leads to reducing the legal risk and expanding the customer radius.</p>
<p>But honestly, making the web accessible to as many people as possible is just the right thing to do. No matter where they come from or what condition they are in.</p></content:encoded><author>Steve Frenzel</author></item><item><title>1/4 of 2024 in music</title><link>https://www.stevefrenzel.dev/blog/first-quarter-of-2024-in-music/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/first-quarter-of-2024-in-music/</guid><description>We got some Emo, Pop, Rock, Black Metal and even german Pop. Get in, come have some fun!</description><pubDate>Thu, 16 May 2024 00:00:00 GMT</pubDate><content:encoded><p>I usually only associate a few albums with a particular year, even if there were many more that touched and moved me.</p>
<p>This post is primarily a reminder to myself why I put certain records on this list. But also, of course, to share them with you, dear reader. Maybe one or two are on your own list, or maybe you donât know them all but are interested in giving them a listen.</p>
<p>Itâs a good mix of genres, maybe thereâs something on there? The first quarter has started very well for me musically, letâs see what ended up in my favorites:</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#how-to-disappear-by-casey">âHow To Disappearâ by Casey</a></li>
<li><a href="#obsidian-wreath-by-infant-island">âObsidian Wreathâ by Infant Island</a></li>
<li><a href="#wall-of-eyes-by-the-smile">âWall Of Eyesâ by The Smile</a></li>
<li><a href="#a-city-in-the-skies-by-ulver">âA City in the Skiesâ by Ulver</a></li>
<li><a href="#effigy-by-talk-show">âEffigyâ by Talk Show</a></li>
<li><a href="#close-to-home-by-a-burial-at-sea">âClose to Homeâ by A Burial At Sea</a></li>
<li><a href="#cold-waves-divide-us-by-midas-fall">âCold Waves Divide Usâ by Midas Fall</a></li>
<li><a href="#eden-by-tua">âEdenâ by Tua</a></li>
</ul>
<h2 id="how-to-disappear-by-casey">âHow To Disappearâ by Casey</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-casey.YRYHGf5I_Z1KOdDu.webp" alt="An open, white fence with a tree behind it growing plenty of red roses. The photo is grainy and has a warm color, giving it a nostalgic vibe. This scenery is within a thick, red frame with plenty of information below it. Like the track list, artist and album name, as well as production credits. " width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>My first contact with Casey was when I had my training at coding bootcamp. <a href="https://tidal.com/browse/album/314881390?u">Love Is Not Enough</a> was on my radar at the time because it hit that sweet spot between emo and hardcore that I grew to love.</p>
<p>After I got more involved with the band (and their second album <a href="https://tidal.com/browse/album/314869863?u">Where I Go When I Am Sleeping</a>), I was very sad when I found out that they had broken up.</p>
<p>So I was all the more delighted when <a href="https://www.youtube.com/watch?v=Yh16Bqw2uGA">Puncture Wounds to Heaven</a> was the first sign of life after five years. There was no doubt in my mind that it would end up at the top of my Top Albums of 2024 without having heard the rest of the record.</p>
<p>Each subsequent single I soaked up like a sponge and confirmed my prediction even more. I love Casey, especially this record! đ</p>
<p><a href="https://tidal.com/browse/album/322218976?u">Listen to âHow To Disappearâ by Casey</a></p>
<h2 id="obsidian-wreath-by-infant-island">âObsidian Wreathâ by Infant Island</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-infant-island.B-7GHNhH_1UCt52.webp" alt="A scenery created with water colors. In the night sky, you can see the stars in different colors and shapes. Below them are mountain tops, with no snow on them. In the center and foreground is a huge bonfire with long, wild grass around it. Directly around the fire you can see the soil, with silhouettes of people imprinted on it." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>This is one of those records that caught my interest with its artwork. I didnât know what to expect and was very pleased to hear atmospheric black metal that doesnât just blast all the way through but also slows down from time to time.</p>
<p>Especially the vocals, which are sometimes out of breath, hooked me; it makes their music feel very raw and authentic.</p>
<p><a href="https://tidal.com/browse/album/317634846?u">Listen to âObsidian Wreathâ by Infant Island</a></p>
<h2 id="wall-of-eyes-by-the-smile">âWall Of Eyesâ by The Smile</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-the-smile.ieNPWtMm_Z1jXft7.webp" alt="Abstract painting with orange and blue as the main colors. The shapes look lik a mix of mountain and waves. Above them are plenty of open eyes, looking at the viewer. The have different sizes and colors. In the foreground is the artist and album name in black, all uppercase letters." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>When random songs were played that I might like, something by The Smile came on and I thought to myself âboy, this guy sounds a lot like Thom Yorke!â. Turns out it was another one of his projects! đ</p>
<p>If you like Radiohead but with a lot less electronic gimmicks, you should give it a listen. Iâd even say itâs a bit unwieldy, but the craftsmanship is world class as youâd expect.</p>
<p><a href="https://tidal.com/browse/album/338279162?u">Listen to âWall Of Eyesâ by The Smile</a></p>
<h2 id="a-city-in-the-skies-by-ulver">âA City in the Skiesâ by Ulver</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-ulver.CpEG_ETb_2qhVri.webp" alt="Photograph of what appears to be a mother and her child standing barefoot on a campsite with almost no trees. The mother is touching her face with the back of her hand and looks sad or worried. The child looks to the right and doesn&#38;#x27;t seem too happy either. It has a strong red filter on it, the only other colors being black and white. In the foreground in huge, all uppercase letters is the artist and album name. " width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>Ulver have made an incredible transition from black metal to ambient to a proper pop band. On album length I often lost interest after the âhitsâ, so this EP with its three songs is just right! Also check out <a href="https://tidal.com/browse/track/231388647?u">Rolling Stone</a>, what a banger!</p>
<p><a href="https://tidal.com/browse/album/340237152?u">Listen to âA City in the Skiesâ by Ulver</a></p>
<h2 id="effigy-by-talk-show">âEffigyâ by Talk Show</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-talk-show.D-40vqp4_Z1BTN2X.webp" alt="A photograph of a brick wall building with three giant antennas on it. The door is open, a graffiti can be seen and red light is coming from the inside. In front of the building are multiple black trash bags. The night sky is pitch black. " width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>Another record that only sparked my interest because of its artwork. I would categorize it under electronic garage pop (?) with spoken words lyrics. I donât really listen to music in this genre, so I canât make a âfor fans ofâ recommendation here. Listen to it, or donât. đ€·ââïž</p>
<p><a href="https://tidal.com/browse/album/319710008?u">Listen to âEffigyâ by Talk Show</a></p>
<h2 id="close-to-home-by-a-burial-at-sea">âClose to Homeâ by A Burial At Sea</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/6-a-burial-at-sea.CX9g7Ds5_1V70dx.webp" alt="Photo collage of three girls standing on a rock in the middle of the ocean, with their backs facing to the viewer. Further in the distance are bigger rocks and in the far distance a quarter of what appears to be planet earth. Behind earth is space with a bright, shining star or planet on center left. On the top are the artist and album name in small letters but all uppercase." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>To be honest, I thought this was a new <a href="https://tidal.com/browse/artist/3540799?u">After The Burial</a> record, but oops, itâs something completely different! If youâre in the mood for some not-so-typical post-rock with a lot of âhappyâ mathcore like <a href="https://tidal.com/browse/artist/7485276?u">Standards</a>, then give it a listen.</p>
<p><a href="https://tidal.com/browse/album/330869951?u">Listen to âClose to Homeâ by A Burial At Sea</a></p>
<h2 id="cold-waves-divide-us-by-midas-fall">âCold Waves Divide Usâ by Midas Fall</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/7-midas-fall.BbMX3m_a_ZNs40P.webp" alt="Illustration of several jelly fishes in white and orange layered on top of each other and slightly shifted, to create the impression of movement or shaking. Behind them are several squares angled 45 degrees, which makes it look like they had wings. The background is a grey-ish texture and on the right side ist the artist and album name, all uppercase and 90 degrees tilted." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>This record is a real grower and hard to describe. Guitar music in the broadest sense with an incredible, gifted female singer, EXTREMELY thick reverb on the vocals and very good songs.</p>
<p>Again, my interest was piqued by the cover. I was expecting something more technical and was pleasantly surprised.</p>
<p><a href="https://tidal.com/browse/album/328790136?u">Listen to âCold Waves Divide Usâ by Midas Fall</a></p>
<h2 id="eden-by-tua">âEdenâ by Tua</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/8-tua.d6gmB0pM_28nxRA.webp" alt="Photograph of what appears to be a man, facing the viewer, dressed in white clothes and barefoot. He has a long, white cloth on his face covering it completely, showing the wind is blowing to the left. He&#38;#x27;s holding a white and yellow motocross bike facing the viewer as well. The scenery is a desert with a few trees and bushes in the background." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>My German rap phase is long gone, but Tua has managed to keep my interest over the years. <a href="https://tidal.com/browse/album/26886042?u">Stevia</a> is one of the best German pop albums and the self-tilted <a href="https://tidal.com/browse/album/199604902?u">Tua</a> is in no way inferior, even if the rap portion was a bit too much for me. Still heâs one of the best producers and songwriters in Germany!</p>
<p>I listened to and loved every single from âEdenâ before its release. The grey, monochrome phase is behind him and it suits his music very well that there is so much color in it now.</p>
<p><a href="https://tidal.com/browse/album/347112181?u">Listen to âEdenâ by Tua</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>Five web accessibility law suits</title><link>https://www.stevefrenzel.dev/blog/five-web-accessibility-law-suits/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/five-web-accessibility-law-suits/</guid><description>Pointing fingers at five HUGE enterprises and looking at the (very avoidable) issues.</description><pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate><content:encoded><p>I recently gave several smaller workshops on the subject of web accessibility and started with a rough overview of the topic. It was about the <a href="https://developer.mozilla.org/en-US/docs/Learn/Accessibility/What_is_accessibility#so_what_is_accessibility">general meaning</a>, the <a href="https://www.w3.org/WAI/standards-guidelines/wcag/">WCAG</a>, the <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/Understanding_WCAG#the_four_principles">four principles</a> and the <a href="https://en.wikipedia.org/wiki/European_Accessibility_Act">European Accessibility Act</a>.</p>
<p>After this workshop, I was asked if I knew of any examples of companies being sued because of web accessibility problems. I spontaneously thought of two: BeyoncĂ© and Dominoâs Pizza.</p>
<p>Unfortunately, I had to stop here because I couldnât give any more details. So I would like to list a few famous law suits here for future reference and show that most of the problems were trivial and among the <a href="https://webaim.org/projects/million/#wcag">six most common</a> on the web. Which in most cases are very easy to fix.</p>
<p>All information comes from the âDigital Accessibility Lawsuitsâ subpage of <a href="http://accessibility.com/">accessibility.com</a>. More details can be found under the link for each example. Also Iâm not a lawyer and cannot give you any legal advice.</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#mary-conner-vs-parkwood-entertainment-llc">Beyoncé case</a></li>
<li><a href="#guillermo-robles-vs-dominos-pizza-llc">Dominoâs Pizza case</a></li>
<li><a href="#thompson-vs-walmart-inc">Walmart case</a></li>
<li><a href="#jack-kang-vs-burger-king-corporation">Burger King case</a></li>
<li><a href="#elia-haggar-vs-adidas-america-inc">Adidas case</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="mary-conner-vs-parkwood-entertainment-llc">Mary Conner vs. Parkwood Entertainment LLC</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-beyonce-min.CV-XLIIw_Z1GPymO.webp" alt="Close-up of BeyoncĂš wearing red sun glasses." width="1200" height="675" loading="lazy" decoding="async"></p>
<p><a href="https://www.accessibility.com/digital-lawsuits/mary-parkwood-2019-01-03">More information about the Beyoncé case</a></p>
<h3 id="case-summary---parkwood-entertainment-llc">Case summary - Parkwood Entertainment LLC</h3>
<p>On January 3, 2019, MARY CONNER filed a Complaint in New York Federal court against PARKWOOD ENTERTAINMENT LLC.</p>
<p>Plaintiff MARY CONNER alleges that <a href="http://www.beyonce.com/">www.Beyonce.com</a> is not accessible per the WCAG 2.1, Section 508 accessibility standard(s).</p>
<h3 id="case-details---parkwood-entertainment-llc">Case details - Parkwood Entertainment LLC</h3>
<p>Case arises out of Parkwoodâs policy and practice of denying the blind access to the goods and services offered by <a href="http://beyonce.com/">Beyonce.com</a>.</p>
<p>Due to Parkwoodâs failure and refusal to remove access barriers to <a href="http://beyonce.com/">Beyonce.com</a>, blind individuals have been and are being denied equal access to Beyonce, as well as to the numerous goods, services and benefits offered to the public through <a href="http://beyonce.com/">Beyonce.com</a>.</p>
<h3 id="my-comment">My comment</h3>
<p>Unfortunately, there are no details here as to what exactly the problems are, but since it cites âpractice of denying the blind access to the goods and servicesâ as the reason, I suspect the following:</p>
<ul>
<li>Missing alt text</li>
<li>Empty links</li>
<li>Empty buttons</li>
<li>Elements cannot be operated with screen reader</li>
</ul>
<h2 id="guillermo-robles-vs-dominos-pizza-llc">Guillermo Robles vs. Dominoâs Pizza LLC</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-dominos-min.CfSAUvoI_Z1SyHsK.webp" alt="The Domino&#38;#x27;s Pizza logo on the left side and a slice of Salami pizza on the right side." width="1200" height="675" loading="lazy" decoding="async"></p>
<p><a href="https://www.accessibility.com/digital-lawsuits/guillermo-dominos-2016-09-01">More information about the Dominoâs Pizza case</a></p>
<h3 id="case-summary---dominos-pizza">Case summary - Dominoâs Pizza</h3>
<p>On September 1, 2016, GUILLERMO ROBLES filed a Complaint in California State court against Dominos, LLC.</p>
<p>Plaintiff GUILLERMO ROBLES alleges that <a href="http://www.dominos.com/">www.Dominos.com</a> is not accessible per the WCAG 2.0, Section 508 accessibility standard(s).</p>
<h3 id="case-details---dominos-pizza">Case details - Dominoâs Pizza</h3>
<p>This is a summarized version of mine:</p>
<ul>
<li>Website cannot be operated by a blind or visually-impaired person</li>
<li>Mobile app cannot be operated by a blind or visually-impaired person</li>
<li>Request that these be adapted so that blind or visually-impaired people can use the website and mobile app</li>
<li>Missing alternative text or a suitable text alternative</li>
<li>Empty links</li>
<li>Redundant links</li>
</ul>
<h2 id="thompson-vs-walmart-inc">Thompson vs. Walmart, Inc</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-walmart-min.DuN4keAj_Z8i4x7.webp" alt="Main entrance of a Walmart store." width="1200" height="675" loading="lazy" decoding="async"></p>
<p><a href="https://www.accessibility.com/digital-lawsuits/tyrone-walmart-2021-03-11">More information about the Walmart case</a></p>
<h3 id="case-summary---walmart-inc">Case summary - Walmart, Inc</h3>
<p>On March 11, 2021, Tyrone Thompson filed a Complaint in California Federal court against Walmart, Inc.</p>
<p>Plaintiff Tyrone Thompson alleges that <a href="http://www.walmart.com/">www.walmart.com</a> is not accessible per the WCAG 2.1 accessibility standard(s).</p>
<h3 id="case-details---walmart-inc">Case details - Walmart, Inc</h3>
<p>This is a summarized version of mine:</p>
<ul>
<li>Landmark elements have a missing description</li>
<li>Images were used for visual separation of elements</li>
<li>Redundant &#x26; empty links</li>
<li>External links are not announced as such when screen reader is used</li>
<li>No skip links available to bypass content</li>
<li>Purpose of <code>iframe</code> elements is not clear, missing <code>title</code> or <code>aria-label</code> attribute</li>
<li>Links are wrapping elements and do not have sufficient description</li>
</ul>
<h2 id="jack-kang-vs-burger-king-corporation">Jack Kang vs. Burger King Corporation</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-burger-king-min.D-U7MiIN_ZTEEUx.webp" alt="Main entrance of a Burger King restaurant." width="1200" height="675" loading="lazy" decoding="async"></p>
<p><a href="https://www.accessibility.com/digital-lawsuits/jack-burger-2019-04-30">More information about the Burger King case</a></p>
<h3 id="case-summary---burger-king-corporation">Case summary - Burger King Corporation</h3>
<p>On April 30, 2019, Jack Kang filed a Complaint in Florida Federal court against Burger King Corporation.</p>
<p>Plaintiff Jack Kang alleges that <a href="http://www.bk.com/">www.bk.com</a> is not accessible per the WCAG 2.0 accessibility standard(s).</p>
<h3 id="case-details---burger-king-corporation">Case details - Burger King Corporation</h3>
<p>This is a summarized version of mine:</p>
<ul>
<li>Lack of Alternative Text (âalt-textâ), or a text equivalent</li>
<li>Empty links</li>
<li>Redundant links</li>
<li>Linked Images missing alt-text</li>
</ul>
<h2 id="elia-haggar-vs-adidas-america-inc">Elia Haggar vs. Adidas America, Inc</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-adidas-min.DS1Ia-gU_U8s4N.webp" alt="Curvy building with three long horizontal stripes and three variations of the Adidas logo on it." width="1200" height="675" loading="lazy" decoding="async"></p>
<p><a href="https://www.accessibility.com/digital-lawsuits/elia-adidas-2019-02-25">More information about the Adidas case</a></p>
<h3 id="case-summary---adidas-america-inc">Case Summary - Adidas America, Inc</h3>
<p>On February 25, 2019, Elia Haggar, Kyo Hak Chu, and Valerie Brooks filed a Complaint in California Federal court against Adidas America, Inc.</p>
<p>Plaintiff Elia Haggar, Kyo Hak Chu, and Valerie Brooks alleges
that <a href="http://www.adidas.com/us">www.adidas.com/us</a> is not accessible.</p>
<h3 id="case-details---adidas-america-inc">Case details - Adidas America, Inc</h3>
<p>This is a summarized version of mine:</p>
<ul>
<li>Lack of Alternative Text (âalt-textâ), or a text equivalent.</li>
<li>Empty links</li>
<li>Redundant links</li>
<li>Linked Images missing alt-text</li>
</ul>
<h2 id="conclusion">Conclusion</h2>
<p>These are just a few examples from very well-known companies, but they all make more or less the same mistakes, which can be easily avoided and rectified. So what I told my workshop participants is:</p>
<p>If you can avoid the six most common problems, you will not only provide a good experience for your users, but you will make yourself less vulnerable to law suits. The work doesnât stop here, but youâve already taken a big step in the right direction.</p></content:encoded><author>Steve Frenzel</author></item><item><title>Screen reader check: TIDAL widget</title><link>https://www.stevefrenzel.dev/blog/screen-reader-check-tidal-widget/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/screen-reader-check-tidal-widget/</guid><description>Let's find out how my favorite streaming service's widget performs with screen readers. And how NVDA dominates them all! đȘ</description><pubDate>Sat, 13 Apr 2024 00:00:00 GMT</pubDate><content:encoded><p>Itâs time for the second article in a series where I test how various music player widgets interact with the four most popular screen readers and web browsers. Check out the first article to find out why Iâm doing this: <a href="https://stevefrenzel.dev/posts/screen-reader-check-soundcloud-widget/">Screen reader check: SoundCloud widget</a>.</p>
<p>Disclaimer: Iâm not an expert nor a regular screen reader user but I know my way around them. I do this purely out of curiosity and are not sponsored or compensated in any way. Also Iâm using a virtual Windows machine on macOS, thanks to this tutorial by Sara Soueidan: <a href="https://www.sarasoueidan.com/blog/testing-environment-setup/">Setting up a screen reader testing environment on your computer</a>. Letâs dive in! đ</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#the-tools">The Tools</a>
<ul>
<li><a href="#operating-systems">Operating Systems</a></li>
<li><a href="#web-browsers">Web browsers</a></li>
<li><a href="#screen-readers">Screen readers</a></li>
</ul>
</li>
<li><a href="#the-widget-itself">The widget itself</a></li>
<li><a href="#the-test">The Test</a>
<ul>
<li><a href="#without-a-screen-reader">Without a screen reader</a></li>
<li><a href="#jaws-on-windows-11">JAWS on Windows 11</a></li>
<li><a href="#nvda-on-windows-11">NVDA on Windows 11</a></li>
<li><a href="#voiceover-on-macos-sonoma">VoiceOver on macOS Sonoma</a></li>
<li><a href="#narrator-on-windows-11">Narrator on Windows 11</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
<li><a href="#bonus-music-recommendations">Bonus: Music recommendations</a>
<ul>
<li><a href="#when-no-birds-sang-by-full-of-hell--nothing">âWhen No Birds Sangâ by Full Of Hell &#x26; Nothing</a></li>
<li><a href="#every-sound-has-a-color-in-the-valley-of-night-by-night-verses">âEvery Sound Has A Color In The Valley Of Nightâ by Night Verses</a></li>
<li><a href="#stereo-grief-by-greyhaven">âStereo Griefâ by Greyhaven</a></li>
</ul>
</li>
</ul>
<h2 id="the-tools">The tools</h2>
<h3 id="operating-systems">Operating systems</h3>
<ul>
<li>macOS Sonoma (Version 14.4.1)</li>
<li>Windows 11 Home (Version 22H2)</li>
</ul>
<h3 id="web-browsers">Web browsers</h3>
<ul>
<li>Google Chrome (Version 123.0.6312.124)</li>
<li>Mozilla Firefox (Version 124.0.2)</li>
<li>Apple Safari (Version 17.4.1)</li>
<li>Microsoft Edge (Version 123.0.2420.81)</li>
</ul>
<h3 id="screen-readers">Screen readers</h3>
<ul>
<li>JAWS (Version 2024.2403.3)</li>
<li>NVDA (Version 2024.1.0.31547)</li>
<li>VoiceOver (Version 10)</li>
<li>Narrator (Version 2023H2)</li>
</ul>
<h2 id="the-widget-itself">The widget itself</h2>
<p>Very similar to the SoundCloud one, as theyâre also using some deprecated attributes. Letâs have a look at the original code:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">div</span></span>
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF"> position: relative;</span></span>
<span class="line"><span style="color:#9ECBFF"> padding-bottom: 100%;</span></span>
<span class="line"><span style="color:#9ECBFF"> height: 0;</span></span>
<span class="line"><span style="color:#9ECBFF"> overflow: hidden;</span></span>
<span class="line"><span style="color:#9ECBFF"> max-width: 100%;</span></span>
<span class="line"><span style="color:#9ECBFF"> "</span></span>
<span class="line"><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">iframe</span></span>
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"https://embed.tidal.com/tracks/121378214?layout=gridify"</span></span>
<span class="line"><span style="color:#B392F0"> frameborder</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"0"</span></span>
<span class="line"><span style="color:#B392F0"> allowfullscreen</span></span>
<span class="line"><span style="color:#B392F0"> style</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"</span></span>
<span class="line"><span style="color:#9ECBFF"> position: absolute;</span></span>
<span class="line"><span style="color:#9ECBFF"> top: 0;</span></span>
<span class="line"><span style="color:#9ECBFF"> left: 0;</span></span>
<span class="line"><span style="color:#9ECBFF"> width: 100%;</span></span>
<span class="line"><span style="color:#9ECBFF"> height: 1px;</span></span>
<span class="line"><span style="color:#9ECBFF"> min-height: 100%;</span></span>
<span class="line"><span style="color:#9ECBFF"> margin: 0 auto;</span></span>
<span class="line"><span style="color:#9ECBFF"> "</span></span>
<span class="line"><span style="color:#E1E4E8"> >&#x3C;/</span><span style="color:#85E89D">iframe</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>Which makes it look ginormous:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-widget.Dh03o--V_xzVnu.webp" alt="Screenshot of the Firefox browser showing the headline &#34;Showcase TIDAL embed&#34; and the widget taking up the full width and height of the screen." width="3808" height="2414" loading="lazy" decoding="async"></p>
<p>So I removed the default styling, added some of my own and got rid of the <a href="https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter">axe-linter</a> warning regarding the accessible name of an <code>iframe</code> element:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">iframe</span></span>
<span class="line"><span style="color:#B392F0"> allowfullscreen</span></span>
<span class="line"><span style="color:#B392F0"> title</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Ludens by Bring Me The Horizon on TIDAL"</span></span>
<span class="line"><span style="color:#B392F0"> frameborder</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"0"</span></span>
<span class="line"><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"https://embed.tidal.com/tracks/121378214?layout=gridify"</span></span>
<span class="line"><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">iframe</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>Now it looks a lot nicer, donât you think?</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-widget.DAUW7c89_1KH6Eg.webp" alt="Screenshot of the Firefox browser showing the headline &#34;Showcase TIDAL embed&#34; and a smaller widget taking up only a little bit of space." width="888" height="1000" loading="lazy" decoding="async"></p>
<p>Sweet, now letâs have a quick look (in Chrome) at the accessibility tree of this element:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/a11y-tree-chrome.eiHm5uF6_Z1U30Yc.webp" alt="Screenshot of the accessibility tree in Google Chrome from the Tidal widget. It shows several elements such as links, buttons and even time elements." width="1019" height="800" loading="lazy" decoding="async"></p>
<p>Most interesting thing is that the âplayâ button is nowhere to be found so⊠This should be interesting!</p>
<p>You can give it a go yourself on the <a href="https://stevefrenzel.github.io/showcase-tidal-embed/">example website</a>. Be aware that your experience might be different then mine, depending on your operating systems and the web browsers you use.</p>
<h2 id="the-test">The test</h2>
<p>Different than last time Iâm also gonna describe my experience without the screen reader. Consider it a bonus! đ€ Hereâs the user story from last time. Itâs general and specific enough at the same time, so letâs reuse it for this widget:</p>
<blockquote>
<p>As a screen reader user, I expect the widget to be announced as âLudens by Bring Me The Horizon on TIDAL. It should not auto-play, but start playing when selecting the âplayâ button. When clicking the button again, it should stop playing the music. All links inside the widget should have a descriptive, accessible name. I should be able to leave this widget by using the tab button.</p>
</blockquote>
<p>As last time, Iâm running three automated accessibility checks BEFORE my changes with <a href="https://www.deque.com/axe/devtools/">axe DevToolsÂź</a>, <a href="https://www.getstark.co/">Stark</a> and <a href="https://wave.webaim.org/">WAVE</a>. Only axe found three issues, the other two said thereâs nothing to worry about:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/axe-devtools.DIpwx4mR_1VA4qk.webp" alt="Screenshot of the axe dev tools extension showing three issues with the Tidal widget." width="1616" height="1498" loading="lazy" decoding="async"></p>
<p><a href="https://dequeuniversity.com/rules/axe/4.8/frame-title">Frames must have an accessible name</a> was expected and fixed by me, but letâs see if <a href="https://dequeuniversity.com/rules/axe/4.8/tabindex?application=AxeChrome">Elements should not have tabindex greater than zero</a> becomes an issue when testing with a keyboard.</p>
<h3 id="without-a-screen-reader">Without a screen reader</h3>
<p>When hovering the widget, the whole album cover gets slightly darker to increase contrast for the text and icons. Also the âshareâ icon appears when hovering it.</p>
<p>Hovering the TIDAL and âshareâ icon in the top right corner gives you the pointer as visual feedback, while hovering the links will add a underline to them. Thereâs no visual feedback for hovering the âplayâ button.</p>
<p>Clicking the TIDAL icon and the two text links opens a new tab to take you to the respective content. Shameless plug: I wrote an article why you should consider avoiding this behavior: <a href="https://stevefrenzel.dev/posts/should-links-open-in-a-new-tab/">Should links open in a new tab?</a>.</p>
<p>Clicking the âshareâ button opens an overlay to presents options to share the song. When hovering these icons, they get slightly bigger.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-widget.vJwsDi-0_TdA6o.webp" alt="Screenshot of the Firefox browser showing the overlay in the Tidal widget. It shows a &#34;x&#34; button, the artist and song name, as well as four icons for Facebook, Facebook messenger, Twitter and &#34;copy to clipboard&#34;." width="888" height="1000" loading="lazy" decoding="async"></p>
<p>After the overlay opens (in Chrome and Firefox), it immediately focusses the âcloseâ button, presented with an âXâ icon. Hitting <code>ENTER</code> or pressing <code>ESC</code> will close the overlay. The focus trap is also working as expected, you can only navigate inside the overlay while itâs open.</p>
<p>The focus ring for the social media icons is barely visible. I was presently surprised how nice this overlay works, although there are considerations if you should auto-focus elements. Adrian Roselli wrote a few words about this: <a href="https://adrianroselli.com/2020/10/dialog-focus-in-screen-readers.html">Dialog Focus in Screen Readers</a>.</p>
<p>So far the behavior was the same in all four browsers, except that this overlay will open only in Chrome and Firefox (macOS) or only Firefox (Windows), depending on your operating system.</p>
<p>When using the <code>TAB</code> key, all elements can be focused and provide (barely) visible feedback, except the âplayâ button. It can only be focussed in Safari, but hitting <code>ENTER</code> or <code>SPACE</code> doesnât do anything.</p>
<p>Funny, considering that this is (in my opinion) the most important element in a music player embed. đ€·ââïž</p>
<p>Clicking the play button or anywhere inside this widget will start a preview of the song after a second or so. When playing, all UI elements are removed.</p>
<p>The progress bar will only appear when hovering the widget and the rest of the elements will appear again when pausing. To pause, you can click anywhere in the widget.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-widget.By3tfDmU_8ujqO.webp" alt="Screenshot of the Firefox browser showing the widget after pressing &#34;play&#34;. It now shows a progress bar, as well as past time and remaining time of the song." width="888" height="1000" loading="lazy" decoding="async"></p>
<p>I expected that it would at least be possible to play and pause via a keyboard after clicking the play button, but still no luck.</p>
<h3 id="jaws-on-windows-11">JAWS on Windows 11</h3>
<p>Very similar to the visual experience, as every element gets announced as expected, also when opening the overlay (only possible in Firefox). Unfortunately thereâs no feedback at all when using Edge with JAWS.</p>
<p>The auto-focus of the overlay does itâs job and announces the buttons accordingly, so you shouldnât get lost. All icons are announced correctly, but unfortunately thereâs no audible feedback when copying the link to the clipboard, only visual feedback.</p>
<h3 id="nvda-on-windows-11">NVDA on Windows 11</h3>
<p>Amazing, it is actually possible to hit the âplayâ button when using NVDA and itâs working in all three browsers! After pressing <code>ENTER</code> or <code>SPACE</code> itâs announced as âclickable playâ when pressing it once and as âpauseâ when pressing it again.</p>
<p>I donât know how this is possible, as thereâs no indication that this is a button or has the accessible name âplayâ or âpauseâ. đ€Ż</p>
<p>The overlay works the same as with JAWS, also no audible feedback when copying to clipboard.</p>
<h3 id="voiceover-on-macos-sonoma">VoiceOver on macOS Sonoma</h3>
<p>Also very similar to the visual experience. A nice touch would have been to add an empty alt-text to the TIDAL link / icon to reduce the amount of announced text here, but itâs fine I guess.</p>
<p>The âplayâ button is only announced as âimageâ and you can select the two <code>time</code> elements, but itâs still not possible to start the music via keyboard.</p>
<p>The overlay works the same as with JAWS and NVDA, also no audible feedback when copying to clipboard.</p>
<h3 id="narrator-on-windows-11">Narrator on Windows 11</h3>
<p>Same experience as with NVDA, the âplayâ button can also be operated! Only difference is that itâs announced as âplay, groupâ or âpause, groupâ, depending on itâs state.</p>
<p>The overlay can only be opened (in Firefox) when selecting the âshareâ button with the <code>TAB</code> key, otherwise it wonât work when using the native Narrator navigation. Also no audible feedback when copying to clipboard.</p>
<h2 id="conclusion">Conclusion</h2>
<p>I had high hopes for this one, as Iâm a TIDAL fan and supporter. Although it looks cleaner than the SoundCloud widget, I was disappointed that it has limited keyboard functionality, depending on the browser you use.</p>
<p>This is where NVDA really shines, as it provided the most consistent experience with all three (Windows) browsers. Narrator also made it possible to hit the âplayâ button, but my overall user experience was better with NVDA.</p>
<h2 id="bonus-music-recommendations">Bonus: Music recommendations</h2>
<p>While we are here, why not check out some of the music Iâm currently listening to? Have fun:</p>
<h3 id="when-no-birds-sang-by-full-of-hell--nothing">âWhen No Birds Sangâ by Full Of Hell &#x26; Nothing</h3>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-music.jC784hfk_2vfU9h.webp" alt="Album artwork for &#34;When No Birds Sang&#34; by Full Of Hell &#38;#x26; Nothing." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>If youâre a fan of these two bands, youâre in for a ride. This could also be interesting for you when youâre a fan of <a href="https://tidal.com/browse/artist/3569642?u">Celtic Frost</a>.</p>
<p><a href="https://tidal.com/browse/album/316979894?u">Listen to âWhen No Birds Sangâ by Full Of Hell &#x26; Nothing</a></p>
<h3 id="every-sound-has-a-color-in-the-valley-of-night-by-night-verses">âEvery Sound Has A Color In The Valley Of Nightâ by Night Verses</h3>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-music.BCFCzM0n_ZRrsvU.webp" alt="Album artwork for &#34;Every Sound Has A Color In The Valley Of Night&#34; by Night Verses." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>I listened a lot to <a href="https://tidal.com/browse/album/87131015?u">From the Gallery of Sleep</a> when it came out but found it a little bit exhausting at times. This new one though has become one of my favorite instrumental albums ever! Also they have a feature with Brandon Boyd of <a href="https://tidal.com/browse/artist/1086?u">Incubus</a> and Anthony Green of <a href="https://tidal.com/browse/artist/3677780?u">Circa Survive</a>.</p>
<p><a href="https://tidal.com/browse/album/339236923?u">Listen to âEvery Sound Has A Color In The Valley Of Nightâ by Night Verses</a></p>
<h3 id="stereo-grief-by-greyhaven">âStereo Griefâ by Greyhaven</h3>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-music.CZ7jBqFN_1Ci7zb.webp" alt="Album artwork for &#34;Stereo Grief&#34; by Greyhaven." width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>This is one of the records I checked out just because of the cover artwork and was expecting <a href="https://en.wikipedia.org/wiki/Shoegaze">Shoegaze</a>, but got something with a heavy <a href="https://tidal.com/browse/artist/3619519?u">The Dillinger Escape Plan</a> vibe. đ</p>
<p><a href="https://tidal.com/browse/album/339236923?u">Listen to âStereo Griefâ by Greyhaven</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>How to: Cancel a Figma subscription</title><link>https://www.stevefrenzel.dev/blog/how-to-cancel-a-figma-subscription/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/how-to-cancel-a-figma-subscription/</guid><description>You think it's easy to cancel their subscription? Think again, they perfected the art of deceptive patterns.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded><p>I had actually planned to write my next article for my âscreen reader checkâ series, which I started with the <a href="https://stevefrenzel.dev/posts/screen-reader-check-soundcloud-widget/">SoundCloud widget</a>.</p>
<p>Since I already knew how I was going to design the thumbnail, I wanted to do that first and opened Figma. Then I remembered that I had received a reminder a few days earlier that my subscription was about to be renewed.</p>
<p>I bought one for FigJam, which wasnât expensive, but I donât use it for my workshops anymore so I wanted to cancel it. And here is where my journey beginsâŠ</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#one-does-not-simply-cancel-a-subscription">One does not simply cancel a subscription</a></li>
<li><a href="#cancelling-the-subscription">Cancelling the subscription</a>
<ul>
<li><a href="#step-1">Step 1</a></li>
<li><a href="#step-2">Step 2</a></li>
<li><a href="#step-3">Step 3</a></li>
<li><a href="#step-4">Step 4</a></li>
<li><a href="#step-5">Step 5</a></li>
</ul>
</li>
<li><a href="#simply-cancel-and-figma-will-charge-you-even-more">Simply cancel and Figma will charge you even more</a>
<ul>
<li><a href="#step-6">Step 6</a></li>
<li><a href="#step-7">Step 7</a></li>
<li><a href="#step-8">Step 8</a></li>
<li><a href="#step-9">Step 9</a></li>
<li><a href="#step-10">Step 10</a></li>
</ul>
</li>
<li><a href="#check-the-amount-of-seats">Check the amount of seats</a></li>
</ul>
<h2 id="one-does-not-simply-cancel-a-subscription">One does not simply cancel a subscription</h2>
<p>My first impulse was to click on the three dots in the top right-hand corner to go directly to a place where you can manage your subscriptions and delete them if necessary.</p>
<p>But Figma doesnât make it that easy. They want to prevent you from doing exactly that at all costs, so they make the process as cumbersome and frustrating as possible. The goal is to upset / confuse / tire you out so much that you give up before you get there.</p>
<p>This is called a deceptive pattern and you can read more about it here: <a href="https://blog.mozilla.org/en/internet-culture/deceptive-design-patterns/">What are deceptive design patterns?</a>. You will find more info when looking for the term âdark patternsâ but I refuse to use this term. Click the footnote to find out why. <sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup></p>
<p>Letâs find out how to cancel this subscription, shall we? đ</p>
<h2 id="cancelling-the-subscription">Cancelling the subscription</h2>
<p>I was able to cancel my subscription in 10 easy steps and 13 clicks:</p>
<h3 id="step-1">Step 1</h3>
<p>First you have to select âTeamsâ on the Figma start page:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-screenshot.l7yfhZdA_1hIgtG.webp" alt="Start screen of the Figma app on macOs. A red, curved arrow points to the item &#34;Teams&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-2">Step 2</h3>
<p>Click the downward arrow right to the âProfessionalâ badge to open a context menu and click âView settingsâ:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-screenshot.DyaLMKXL_Z1mDquN.webp" alt="Overview of the selected team of the Figma app on macOs. A red, curved arrow points to a downward arrow, which revealed a context menu. It provides several menu items, including &#34;Delete...&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-3">Step 3</h3>
<p>In the newly opened dialog window, select âGo to Billingâ under the âPlan and Billingâ section:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-screenshot.CxEJEVNx_2wuYHO.webp" alt="Dialog window in the Figma app on macOS. It shows several menu items under the &#34;Settings&#34; banner, including &#34;Plan and Billing&#34;. A red, curved arrow points to &#34;Go to Billing&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-4">Step 4</h3>
<p>In the section regarding the annual and monthly renewal, select âChange annual planâ:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-screenshot.DS13KqrR_Z1FtU5.webp" alt="Overview of the billing situation for the selected team of the Figma app on macOs. A red, curved arrow points to &#34;Change annual plan&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-5">Step 5</h3>
<p>When I arrived here, I thought I just change the number in the âNumber of FigJam seats on annual plan:â input from 1 to 0:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-screenshot.id2OaJ9A_1px1kH.webp" alt="Dialog window in the Figma app on macOS. It provides information when the subscription will auto-renew and two number inputs to adjust the count of the seats. It contains two buttons, &#34;Cancel&#34; and &#34;Update annual plan&#34;. A red, curved arrow points to &#34;Don&#38;#x27;t renew my annual plan&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<p>But when doing that or clicking âDonât renew my annual planâ, I receive the following message:</p>
<blockquote>
<p>Cancel your annual plan?</p>
<p>Figma Design and FigJam seats on your team will be charged monthly at âŹ15/mo and âŹ5/mo, respectively.</p>
<p>You can always add an annual plan later, if you change your mind.</p>
</blockquote>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/6-screenshot.73XlK2Kg_Z22iyTv.webp" alt="Dialog window in the Figma app on macOS. The headline says &#34;Cancel your annual plan?&#34;. It provides some information regarding pricing and two buttons: &#34;Nevermind&#34; (yes, like the Nirvana album) and &#34;Cancel annual plan&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h2 id="simply-cancel-and-figma-will-charge-you-even-more">Simply cancel and Figma will charge you even more</h2>
<p>I currently pay 36 euros a year and if I had confirmed here with âCancel annual planâ, it would cost me 5 euros a month, so 60 euros a year! There are no instructions on how to avoid this and REALLY cancel.</p>
<p>Except for the note that it will be 5 euros per seat in the team. So I canceled and researched how to delete my team BEFORE I cancel.</p>
<h3 id="step-6">Step 6</h3>
<p>To do this, I opened the context menu for my team name and selected âDeleteâŠâ:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/7-screenshot.CCsmIGaI_2uunkH.webp" alt="Overview of the selected team of the Figma app on macOs. It shows a context menu with several options, including &#34;Delete...&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-7">Step 7</h3>
<p>Then I receive a message prompting me to first cancel my âProfessionalâ subscription, which was my plan in the first place. đ</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/8-screenshot.SLtP1hvd_1gAUvr.webp" alt="Dialog window in the Figma app on macOS. Headline: &#34;Action required&#34;. Body text: &#34;To delete the team Steve Frenzel, you must first cancel your Professional subscription.&#34;. There are two buttons, &#34;Dismiss&#34; and &#34;Proceed to cancel...&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-8">Step 8</h3>
<p>But to make it REALLY clear to me what a poor decision it would be for me to cancel this subscription, I am given a list of everything I will miss out on. For example âTeam librariesâ, âAudio conversationsâ, âAdvanced prototypingâ and more:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/9-screenshot.RNwLYxRn_Z25BRt.webp" alt="Dialog window in the Figma app on macOS. Headline: &#34;If you cancel...&#34;. Body text: &#34;Your team will lose access to these Professional features:&#34;. Below is a list of several features, for example &#34;Team libraries&#34;, &#34;Audio conversations&#34;, &#34;Advanced prototyping&#34; and more." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-9">Step 9</h3>
<p>After confirming this fatal decision further below, I am asked why I want to cancel (multiple choice):</p>
<ul>
<li>Switching to a different plan</li>
<li>No longer using Figmaâs products</li>
<li>Too expensive</li>
<li>Billing structure is unclear</li>
<li>Did not mean to upgrade</li>
<li>Project is over or no longer active</li>
<li>Other</li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/10-screenshot.BQ4HPwaJ_Z1uKxCn.webp" alt="Dialog window in the Figma app on macOS. Headline: &#34;Before you go, please let us know why&#34;. Body text: &#34;What made you cancel your plan? Check all that apply.&#34;. Below is a list of checkboxes and I selected &#34;Billing structure is unclear&#34; and &#34;Project is over or no longer active&#34;. There are two buttons: &#34;Go back&#34; and &#34;Continue&#34;." width="1012" height="712" loading="lazy" decoding="async"></p>
<h3 id="step-10">Step 10</h3>
<p>I receive a final warning that by canceling I will be joining the mob and will only have the free âStarterâ plan:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/11-screenshot.B04YQiRB_bDwRb.webp" alt="Dialog window in the Figma app on macOS. Headline: &#34;Are you sure you want to cancel?&#34;. Body text: &#34;If you choose to cancel, Steve Frenzel will be downgraded to our free Starter plan on your next billing date.&#34;. There are two buttons: &#34;Go back&#34; and &#34;Cancel plan&#34;, which is red instead of the usual blue to add some tension to the process, I suppose." width="1012" height="712" loading="lazy" decoding="async"></p>
<p>It is done! I receive confirmation that my plan will be downgraded from âProfessionalâ to âStarterâ at the âend of the current subscription periodâ. đ„ł</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/12-screenshot.Dwez0e0j_Z2quqmD.webp" alt="Overview of the selected team of the Figma app on macOs. On top is an alert message with blue background and white font saying: &#34;Steve Frenzel will become a free Starter team at the end of the current subscription period&#34;. A added a fat red border around it as it can be easily overlooked." width="1012" height="712" loading="lazy" decoding="async"></p>
<p>I had to click 13 times (15 if you count the checkboxes) and navigate through numerous menus to cancel my subscription. As I mentioned at the beginning, I expected to be able to do this with just a few clicks, but I didnât take Figmaâs deceitful tactics into account.</p>
<p>Another deceptive pattern I have seen on numerous websites is the presentation of pricing tiers. The focus here is not on the limited, boring but very reasonably priced âStarterâ plan, but âProfessionalâ:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/13-screenshot.DqBkgjqh_tXA6s.webp" alt="Overview of pricing tiers inside the Figma app on macOS. It&#38;#x27;s the last step when creating a new team, titled &#34;Finish setup&#34;. The first step is called &#34;Name your team&#34; and the second one is called &#34;Add team members&#34;. The headline of the current step says &#34;Choose your team plan&#34;. Below is a table of four columns with three options. First column lists all features, second one more info on the &#34;Starter&#34; plan, third and fourth for the &#34;Professional&#34; and &#34;Organization&#34; plan. &#34;Starter&#34; is for free and has the least amount of features and &#34;Professional&#34; is highlighted and very prominent." width="1162" height="1189" loading="lazy" decoding="async"></p>
<p>Anyway, I hope this article will help you navigate through the dense jungle of links and context menus to cancel your Figma subscription rather quickly.</p>
<h2 id="check-the-amount-of-seats">Check the amount of seats</h2>
<p>I learned the following information during one of my FigJam workshops: If you invite people to join your team (so that they can participate in the workshop), 5 euros per seat will be deducted from your account each month.</p>
<p>Itâs made very easy to invite people and there is NO indication that it will cost you money if you do so. To find out how much you have to pay per month, follow the instructions until step 3.</p>
<p><em>Thumbnail image credit: Taken from the article <a href="https://www.figma.com/blog/the-outsized-role-culture-plays-in-attracting-design-talent/">The outsized role culture plays in attracting design talent</a>.</em></p>
<section data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>Partial quote from the linked article: <em>âYou may notice we use âdeceptive design patternsâ rather than âdark patternsâ throughout this article. While the latter is commonly used and has been for years, the phrase also reinforces the idea that being âdarkâ is âbad,â which is directly tied to white supremacy.â</em> <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">â©</a></p>
</li>
</ol>
</section></content:encoded><author>Steve Frenzel</author></item><item><title>Shut up, Jakob</title><link>https://www.stevefrenzel.dev/blog/shut-up-jakob/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/shut-up-jakob/</guid><description>Me getting very angry about an out-of-touch web accessibility influencer.</description><pubDate>Fri, 22 Mar 2024 00:00:00 GMT</pubDate><content:encoded><p>Full disclaimer: Before Jakob Nielsenâs very controversial article came out, I didnât know who he was. Iâve been working intensively on the topic of accessibility for a few years now, but this name hadnât appeared in my bubble until then.</p>
<p>Probably because I tend to follow the ânew guardâ, such as <a href="https://www.sarasoueidan.com/">Sara Soueidan</a>, <a href="https://heydonworks.com/">Heydon Pickering</a>, <a href="https://adrianroselli.com/">Adrian Roselli</a>, <a href="https://thinkdobecreate.com/">Stephanie Eckles</a> and others whose names I canât think of right now.</p>
<p>I am not an expert in this field either, but through my work I have the opportunity to compare Jakobâs statements with my own experiences. There are already MANY reactions to this article, which Adrian Roselli has summarized here: <a href="https://adrianroselli.com/2024/03/jakob-has-jumped-the-shark.html">Jakob has Jumped the Shark</a>.</p>
<p>It wasnât my plan to write about it, but after my wife read the article and had more questions than answers, I felt inspired to add my two cents. I chose the statements that raised the most questions for me. Here is the link to the article: <a href="https://web.archive.org/web/20240229233609/https://jakobnielsenphd.substack.com/p/accessibility-generative-ui">Accessibility Has Failed: Try Generative UI = Individualized UX (archived)</a>.</p>
<h2 id="disclaimer">Disclaimer</h2>
<p>I use the term âLLMâ, which stands for Large Language Model. I refuse to use to term âAIâ, which stands for Artificial Intelligence.</p>
<p>While I can see the benefits for many other sectors and also as a sparring partner for writing code, these models havenât shown any sign of intelligence regarding web accessibility. At least in my experience.</p>
<h2 id="summary--opinion">Summary &#x26; opinion</h2>
<p>Out-of-touch, influential old guy working in web accessibility for many years claims that all hope is gone and only AIâą can save us. People who he thinks are disabled will receive a more âconciseâ UI, because he thinks they are not able to use a computer and assistive technology.</p>
<p>I think this is another big move by AIâą companies to buy community leaders and to make sure - once the <a href="https://en.wikipedia.org/wiki/European_Accessibility_Act">European Accessibility Act</a> is in action - that people buy their shitty âAIâ powered overlays and donât waste any time and especially money on actually improving the user experience.</p>
<p>And what really annoys me, is that people who are new to web accessibility might think that this guy is right and has a couple of âinteresting ideasâ. It sends a dangerous signal.</p>
<h2 id="the-statements">The statements</h2>
<blockquote>
<p>Accessibility has failed as a way to make computers usable for disabled users.</p>
</blockquote>
<p>I tend to disagree. While <a href="https://webaim.org/projects/million/">the web is in a horrible state regarding accessibility</a>, disabled users still seem to make it work and get around. Thereâs plenty of hardware and software choices to consume content on the web in whatever way works best for you.</p>
<blockquote>
<p>Computers are still <strong>difficult</strong>, <strong>slow</strong>, and <strong>unpleasant</strong> for disabled users, despite about 30 years of trying.</p>
</blockquote>
<p>Hard to say, do you know ALL disabled users out there, Jakob? Seems like a pretty general statement. If it wasnât for many people trying, it would probably even worse.</p>
<blockquote>
<p>Where I have always differed from the accessibility movement is that I consider users with disabilities to be simply users.</p>
</blockquote>
<p>Huh, so all people are the same for you? Very honourable, but it gets tricky when you realise that people have different needs and cultural backgrounds, so you MIGHT want to reconsider as this approach could exclude a large chunk of folks.</p>
<blockquote>
<p><strong>Accessibility is too expensive</strong>Â for most companies to be able to afford everything thatâs needed with the current, clumsy implementation.</p>
</blockquote>
<p>This is true if itâs an afterthought on your agenda and not baked in to your development cycle to begin with. But <a href="https://www.deque.com/blog/design-code-thinking-accessibility-ground/">shifting left</a> can help to reduce costs while your whole team gets educated and more efficient during time, avoiding accessibility related costs in the long run.</p>
<blockquote>
<p><strong>Accessibility is doomed to create a substandard user experience</strong>, no matter how much a company invests, particularly for blind users who are given a linear (one-dimensional) auditory user interface to represent the two-dimensional graphical user interface (GUI) designed for most users.</p>
</blockquote>
<p>Can you back that claim up? Can you define a âsubstandard user experienceâ?</p>
<blockquote>
<p>By âoldâ users, I mainly mean people <strong>older than 75 years</strong> who start to exhibit major aging symptoms, such as weakened memory. These users need simplified navigation, simplified comparison features that do not require retaining information in short-term memory, and simplified explanations.</p>
</blockquote>
<p>Sounds reasonable if you give them the choice to choose between a simplified (whatever that means) version and the regular (whatever that means) version. Otherwise it would be a pretty <a href="https://en.wikipedia.org/wiki/Ableism">ableist</a> move.</p>
<blockquote>
<p>On the other hand, I donât want to slow down a blind user with a screen reader blabbering through that word salad. Yes, I could â and should â edit ChatGPTâs ALT text to be shorter, but even after editing, a description of the appearance of an illustration wonât be useful for task performance.</p>
</blockquote>
<p>Maybe leave it up to the user to skip your LLM-generated alt text? And how can you generally say itâs not useful? Some images can give context to a website or article and others are decorative. It always depends on the context.</p>
<blockquote>
<p>Estimates from <a href="https://web.archive.org/web/20240229233609/https://www.oecd.org/skills/piaac/">international reading research</a> show that about 40% of the adult population in the United States can be classified as having low literacy. (This is about 100 million customers. Think dollar signs when you read these statistics.)</p>
</blockquote>
<p>The sad truth is that most companies care about whatâs profitable and not whatâs ethically right or requested by a minority of users. However, I find this phrasing very weird coming from someone who should work with and for people. I have a feeling that you had dollar signs in your eyes when offered to write this questionable article.</p>
<blockquote>
<p>We need an approach that scales, and that can support users with a wide range of conditions. Luckily, this is now emerging in the form of generative UI.</p>
</blockquote>
<p>How about doing proper research, educating your team, implementing design with good olâ HTML, CSS and JavaScript and sprinkle on some <a href="https://developer.mozilla.org/en-US/docs/Glossary/Progressive_Enhancement">progressive enhancement</a>?</p>
<p>If each department is in and aware, a little can go a long way here. But I guess itâs easier and more cost efficient to type into a LLM what website you want, copy the code and ship it to production? For a deep-dive, check out this article by Sophie Koonin: <a href="https://localghost.dev/blog/ai-and-the-trouble-with-inaccessible-saas/">âAIâ, and the trouble with inaccessible SaaS</a>.</p>
<blockquote>
<p>âGenerative UIâ is simply the application of artificial intelligence to automatically generate user interface designs, leveraging algorithms that can produce a variety of designs based on specified parameters or data inputs.</p>
</blockquote>
<p>Based on the <a href="https://webaim.org/projects/million/">status quo of the web</a>? Oh Jakob, then weâre in for a ride. đ Cause most developers still donât know how heading levels work, what an alternative text is or the difference between anchors and buttons.</p>
<blockquote>
<p>In this <strong>second-generation generative UI</strong>, the user interface is generated afresh every time the user accesses the app. Most important, this means that different users will get
drastically different designs. This is how we genuinely help disabled users.</p>
</blockquote>
<p>How? I mean⊠how? What are the criteria for seeing different content? When do you decide that a user classifies as disabled? And why would disabled people want to see different designs than non-disabled people? So you decide who gets the full experience and whoâs not capable of being able to enjoy it? Again, sounds pretty ableist to me.</p>
<blockquote>
<p>For example, a more simplified experience can be shown to beginners, and advanced features surfaced for expert users.</p>
</blockquote>
<p>Oh my god, will you stop throwing in vague fantasy ideas and explain HOW you would actually do it and WHAT the deciding factors are?!</p>
<blockquote>
<p>We will no longer be designing the exact user interface that our users will see, since the UI will be different for each user and generated at runtime. Instead, UX designers will specify the rules and heuristics the AI uses to generate the UI.</p>
</blockquote>
<p>This might sound good in theory, but do you think developers and designers will question the output of a LLM while their CEO is breathing in their neck and tells them to âmove fast &#x26; break thingsâ? Itâs more likely they will just use whatever looks good and move on.</p>
<blockquote>
<p>Besides creating optimized 1-D representations for blind users, generative UI can also optimize the user experience in other ways. Since it is slower to listen than to visually scan text, the version for blind users can be generated to be more concise.</p>
</blockquote>
<p>Dude, this statement reminds me SO MUCH of the whole <a href="https://en.wikipedia.org/wiki/Loudness_war">loudness war</a> debate: âI donât want to leave it up to the listener to turn up the volume, Iâll do it for them! The louder my record, the better it will sound than anyone elseâs!â</p>
<p><em>My brother in Christ</em>, have you ever considered in your 100+ years working in the field, that screen reader users can increase the speed of their app? That you donât need to generate a more âconciseâ version but instead leave the choice to the users?</p></content:encoded><author>Steve Frenzel</author></item><item><title>Developer & design conferences (in Europe)</title><link>https://www.stevefrenzel.dev/blog/developer-and-design-conferences-in-europe/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/developer-and-design-conferences-in-europe/</guid><description>Mostly smaller conferences recommended by the cool kids on Mastodon. â€ïž Suggest something and I might add it to the list!</description><pubDate>Fri, 15 Mar 2024 00:00:00 GMT</pubDate><content:encoded><p>Once again I <a href="https://mastodon.online/@stvfrnzl/112076174840502681">summoned the swarm intelligence of Mastodon</a> so I need to do less research for a blog article of mine. Conferences are not only a great way to get out of the office, itâs also an opportunity to get in touch with âthe sceneâ. Newsletters and RSS feeds can only do so much and itâs a lot more inspiring to listen to (and watch) people from the community about topics that are important to them and relevant.</p>
<p>Iâve only been to a ginormous one (WeAreDevelopers World Congress) and a cozy small-ish one (SmashingConf Belgium), so I canât compare that much, but my experience so far has been great.</p>
<p>Traveling is fun and what could be better than a paid trip by your employer to explore new cities, meet like-minded people and nerd out about web dev and design related things? Bonus for your employer: You come back with fresh ideas! âš</p>
<p>Which is why I created this list for you (and me), so you can suggest it to your colleagues and bosses. Please let me know if you want me to add a conference, I consider this article a living thing. See you there!</p>
<h2 id="belgium">Belgium</h2>
<ul>
<li><a href="https://smashingconf.com/antwerp-2024">SmashingConf - Antwerp</a></li>
</ul>
<h2 id="germany">Germany</h2>
<ul>
<li><a href="https://beyondtellerrand.com/">beyond tellerand - DĂŒsseldorf</a></li>
<li><a href="https://smashingconf.com/freiburg-2024">SmashingConf - Freiburg</a></li>
<li><a href="https://www.wearedevelopers.com/world-congress">WeAreDevelopers World Congress - Berlin</a></li>
</ul>
<h2 id="netherlands">Netherlands</h2>
<ul>
<li><a href="https://cssday.nl/2024">CSS Day - Amsterdam</a></li>
</ul>
<h2 id="portugal">Portugal</h2>
<ul>
<li><a href="https://websummit.com/">Web Summit - Lisbon</a> (Trigger warning: Auto-playing video which doesnât respect âreduce motionâ setting!)</li>
</ul>
<h2 id="spain">Spain</h2>
<ul>
<li><a href="https://penpotfest.org/">Penpot Fest - Barcelona</a></li>
</ul>
<h2 id="switzerland">Switzerland</h2>
<ul>
<li><a href="https://frontconference.com/">Front Conference - Zurich</a> (Trigger warning: Auto-playing video which doesnât respect âreduce motionâ setting!)</li>
</ul>
<h2 id="united-kingdom">United Kingdom</h2>
<ul>
<li><a href="https://ffconf.org/">ffconf - Brighton</a></li>
<li><a href="https://heypresents.com/">Hey! All Day - Leeds</a></li>
<li><a href="https://patternsday.com/">Patterns Day - Brighton</a></li>
<li><a href="https://2024.stateofthebrowser.com/">State of the Browser - London</a></li>
</ul>
<p><em>Photo credit: <a href="https://unsplash.com/@theunsteady5?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Edwin Andrade</a> on <a href="https://unsplash.com/photos/people-raising-their-hands-4V1dC_eoCwg?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Unsplash</a></em></p></content:encoded><author>Steve Frenzel</author></item><item><title>Celebrating women in music</title><link>https://www.stevefrenzel.dev/blog/celebrating-women-in-music/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/celebrating-women-in-music/</guid><description>It's international women's fight day. â A day to celebrate the superior sex and worship them and their music!</description><pubDate>Fri, 08 Mar 2024 00:00:00 GMT</pubDate><content:encoded><p>Today is international womenâs fight day and I want to celebrate all the women who help me get through the day with their music, lift my spirits or simply put me in a certain mood.</p>
<p>No matter if youâre into metal, pop, hardcore, punk or something in-between: I bet thereâs at least on record in this list of female-fronted and man-reared albums that youâre gonna like. đ§</p>
<h2 id="sound--color-by-alabama-shakes">âSound &#x26; Colorâ by Alabama Shakes</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-music.BNLChxVI_Z2llnuB.webp" alt="&#34;Sound &#38;#x26; Color&#34; by Alabama Shakes" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>The only interesting Grammy category for me is âBest Engineered Albumâ, which is how I discovered this awesome band!</p>
<p><a href="https://songwhip.com/alabama-shakes/sound-and-color-2015">Listen to âSound &#x26; Colorâ by Alabama Shakes</a></p>
<h2 id="is-it-light-where-you-are-by-art-school-girlfriend">âIs It Light Where You Areâ by Art School Girlfriend</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-music.BYJPZQug_Z1zSBsq.webp" alt="&#34;Is It Light Where You Are&#34; by Art School Girlfriend" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>A friend recommended this one, which is prefect for a moody, rainy day. Or maybe Tokyo at night.</p>
<p><a href="https://songwhip.com/artschoolgirlfriend/is-it-light-where-you-are">Is It Light Where You Areâ by Art School Girlfriend</a></p>
<h2 id="only-constant-by-gel">âOnly Constantâ by Gel</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-music.CeYFG0WN_Z1zaOrC.webp" alt="&#34;Only Constant&#34; by Gel" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>Imagine Motörhead with a strong Hardcore and Punk influence plus female vocals and youâll know what to expect from this one.</p>
<p><a href="https://songwhip.com/gel2/only-constant">Listen to âOnly Constantâ by Gel</a></p>
<h2 id="keepsake-by-hatchie">âKeepsakeâ by Hatchie</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-music._Xs_EhA9_qMc7C.webp" alt="&#34;Keepsake&#34; by Hatchie" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>Dreamy pop music with a 90s vibe. Hard to describe, but a pleasure to listen to.</p>
<p><a href="https://songwhip.com/hatchie/keepsake">Listen to âKeepsakeâ by Hatchie</a></p>
<h2 id="retrovision-by-honey-revenge">âRetrovisionâ by Honey Revenge</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-music.C9FL85Qp_Z1bpAUL.webp" alt="&#34;Retrovision&#34; by Honey Revenge" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>This is for the old school Paramore funs: Epic hooks, fat guitars and juicy drums.</p>
<p><a href="https://songwhip.com/honeyrevenge/retrovision">Listen to âRetrovisionâ by Honey Revenge</a></p>
<h2 id="evergreen-by-pvris">âEVERGREENâ by PVRIS</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/6-music.CoXt2rCY_Z2qXyxb.webp" alt="&#34;Evergreen&#34; by Paris" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>On of my favorite records ever! Every song is super catchy, the hooks are spectular and the production is stellar. My go-to album for getting the crowd pumped up before a gig (when I work as live sound engineer).</p>
<p><a href="https://songwhip.com/pvris/evergreen">Listen to âEVERGREENâ by PVRIS</a></p>
<h2 id="the-fear-of-fear-by-spiritbox">âThe Fear of Fearâ by Spiritbox</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/7-music.B6fAP7Ep_Z1zgCdo.webp" alt="ALT_T&#34;The Fear of Fear&#34; by SpiritboxEXT" width="1280" height="1280" loading="lazy" decoding="async"></p>
<p>Canadaâs finest đšđŠâš If youâre a fan of modern metal, low-tuned guitars, beefy screamed vocals and great vocal melodies, then GET THE FUCK IN HERE đ</p>
<p><a href="https://songwhip.com/spiritbox/the-fear-of-fear">Listen to âThe Fear of Fearâ by Spiritbox</a></p>
<h2 id="copingmechanism-by-willow">âCOPINGMECHANISMâ by WILLOW</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/8-music.DmPxm0H2_1MfGL1.webp" alt="&#34;Coping Mechanism&#34; by Willow" width="1200" height="1200" loading="lazy" decoding="async"></p>
<p>Her music is a bit diffult to describe, but I would call it super polished garage pop? The songs are well written and produced but sound raw at the same time.</p>
<p><a href="https://songwhip.com/willow-2/copingmechanism2022">Listen to âCOPINGMECHANISMâ by WILLOW</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>Create a custom theme in iA Presenter (reworked)</title><link>https://www.stevefrenzel.dev/blog/create-a-custom-theme-in-ia-presenter-reworked/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/create-a-custom-theme-in-ia-presenter-reworked/</guid><description>No disrespect to the iA team, but their documentation had plenty of room for improvement. I hope this will be a useful reference to you. đ€</description><pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate><content:encoded><p><a href="https://ia.net/presenter">iA Presenter</a> is THE tool for me to create presentations easily and quickly. However, I had a hard time creating my own theme because their tutorial has two major weaknesses for me:</p>
<ol>
<li>The order doesnât make sense to me</li>
<li>Individual sections cannot be navigated via anchor element and therefore cannot be shared</li>
</ol>
<p>To make it easier for other people to create presentations with this amazing app, I have adapted the instructions so that they make sense to me. As a bonus, Iâve also added two goodies, you can find them in the <a href="#bonus">bonus section</a>!</p>
<p>I did some heavy editing regarding words and grammar, but mostly itâs still the original instructions, which you can find here: <a href="#developing-custom-themes">Developing custom themes</a>. Some names are different in version 1.2, so I updated them accordingly. <em>All images are property of iA, I do not own any rights!</em> Here is the reworked version:</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#developing-custom-themes">Developing custom themes</a>
<ul>
<li><a href="#1-create-a-new-theme">1. Create a new theme</a></li>
<li><a href="#2-navigate-to-the-theme-files">2. Navigate to the theme files</a></li>
<li><a href="#3-use-your-new-theme">3. Use your new theme</a></li>
<li><a href="#4-modify-your-theme">4. Modify your theme</a></li>
</ul>
</li>
<li><a href="#theme-structure">Theme structure</a></li>
<li><a href="#slides-html-structure">Slides HTML structure</a></li>
<li><a href="#layouts">Layouts</a>
<ul>
<li><a href="#1-cover">1. Cover</a></li>
<li><a href="#2-title">2. Title</a></li>
<li><a href="#3-section">3. Section</a></li>
<li><a href="#4-split">4. Split</a></li>
<li><a href="#5-grid">5. Grid</a></li>
<li><a href="#6-caption">6. Caption</a></li>
<li><a href="#7-title-image">7. Title image</a></li>
<li><a href="#8-default-text">8. Default (text)</a></li>
</ul>
</li>
<li><a href="#alignments">Alignments</a>
<ul>
<li><a href="#1-horizontal-alignment">1. Horizontal alignment</a></li>
<li><a href="#2-vertical-alignment">2. Vertical alignment</a></li>
</ul>
</li>
<li><a href="#responsiveness">Responsiveness</a></li>
<li><a href="#appearances">Appearances</a></li>
<li><a href="#backgrounds">Backgrounds</a></li>
<li><a href="#gradient-background">Gradient background</a></li>
<li><a href="#custom-fonts">Custom fonts</a>
<ul>
<li><a href="#1-add-the-font-files-to-your-theme-folder">1. Add the font files to your theme folder</a></li>
<li><a href="#2-reference-the-fonts-at-the-beginning-of-your-css">2. Reference the fonts at the beginning of your CSS</a></li>
<li><a href="#3-add-meta-data">3. Add meta data</a></li>
</ul>
</li>
<li><a href="#using-images-from-your-theme-in-css">Using images from your theme in CSS</a></li>
<li><a href="#bonus">Bonus</a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>A <a href="https://ia.net/presenter/support/visuals/in-app-themes">Theme</a> is a set of files allowing to change the visual style of a presentation.</p>
<p>You can change the style of a presentation at different levels:</p>
<ul>
<li>Using a specific Theme and its CSS</li>
<li>Using presets</li>
<li>Depending on your slide content (auto-layout)</li>
<li>By defining CSS variables in the Style Inspector</li>
</ul>
<p>Note that if you are not very comfortable with HTML and CSS, creating a custom theme might be difficult. To help you, we have created a <a href="https://ia.net/topics/theme-builder-for-ia-presenter">Theme Builder for iA Presenter</a> that you can access here: <a href="https://themes.ia.net/presenter/builder/editor">themes.ia.net</a></p>
<p>But if you would rather get your hands dirty and do it yourself, keep on reading.</p>
<h2 id="developing-custom-themes">Developing custom themes</h2>
<h3 id="1-create-a-new-theme">1. Create a new theme</h3>
<p>Go to <code>Settings</code> â <code>Themes</code>. Click on the <code>+</code> symbol in the lower left corner, select <code>Create Theme...</code> and enter a name.</p>
<h3 id="2-navigate-to-the-theme-files">2. Navigate to the theme files</h3>
<p>Right-click on a theme and select <code>Show in Finder</code>.</p>
<h3 id="3-use-your-new-theme">3. Use your new theme</h3>
<p>Open a presentation, go to the <code>Design</code> tab of the <code>Inspector</code>, and select the newly created theme.</p>
<h3 id="4-modify-your-theme">4. Modify your theme</h3>
<p>Open the <code>YOUR_THEME_NAME.css</code> file in your preferred editor and add your custom CSS.</p>
<h2 id="theme-structure">Theme structure</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-theme-structure.DzOJcZ0Y_ZA679o.webp" alt="Illustration of a file structure, marking several files with a number: image1.jpg to image4.jpg has the number 1. presets.json has the number 2. roboto-slab-bold.woff2 and roboto-slab-regular.woff2 have the number 3. stains.css has the number 4. template.jpg has the number 5. template.json has the number 6." width="1536" height="740" loading="lazy" decoding="async"></p>
<ol>
<li>Themes assets</li>
<li>Presets (Predefined sets of CSS variables)</li>
<li>Custom fonts</li>
<li>Theme CSS definitions</li>
<li>Theme thumbnail</li>
<li>Theme definition</li>
</ol>
<h2 id="slides-html-structure">Slides HTML structure</h2>
<ul>
<li>A presentation has a collection of <em>slide containers</em> and a collection of <em>slide backgrounds</em>
<ul>
<li>Each slide generates a <em>slide container</em> and a <em>slide background</em> <code>&#x3C;div></code></li>
<li>The <em>slide background</em> has the same layout CSS class as the <em>slide container</em></li>
</ul>
</li>
<li>If there are no footnotes, the footnotes <code>&#x3C;div></code> has a height of <code>0</code>
<ul>
<li>If there are no header and footer, the slide content occupies all the available space</li>
</ul>
</li>
<li>You can choose to hide headers and footers on a per layout basis (see illustration for list of classes): For example <code>.cover-container .header { display: none; }</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-html-structure.C9SaVCE9_W5fAY.webp" alt="Illustration showing four rows of blocks to visualize where certain CSS classes can be found. The title says &#34;Slide container, depends on layout, see layouts section for list of possible classes&#34;. Row one: .header class, containing three more classes: .leading, .middle and .trailing. Row two says &#34;Slide content, see layouts section for list of possible classes&#34;. Row three: .footnotes. Row four: .footer, containing three more classes: .leading, .middle and .trailing. " width="1536" height="864" loading="lazy" decoding="async"></p>
<h2 id="layouts">Layouts</h2>
<h3 id="1-cover">1. Cover</h3>
<ul>
<li>Container CSS Class: <code>.cover-container</code></li>
<li>Slide Content CSS Class: <code>.layout-cover</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-layouts.DTpRYUeR_1rB7xC.webp" alt="Illustration showing two screens: A level one Markdown heading and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="2-title">2. Title</h3>
<ul>
<li>Container CSS Class: <code>.title-container</code></li>
<li>Slide Content CSS Class: <code>.layout-title</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/4-layouts.D1Py633l_ZUTczL.webp" alt="Illustration showing two screens: A level two Markdown heading and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="3-section">3. Section</h3>
<ul>
<li>Container CSS Class: <code>.section-container</code></li>
<li>Slide Content CSS Class: <code>.layout-section</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/5-layouts.sRKyW4wv_Z1VdyIs.webp" alt="Illustration showing two screens: A level three Markdown heading and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="4-split">4. Split</h3>
<ul>
<li>Container CSS Class: <code>.v-split-container</code></li>
<li>Slide Content CSS Class: <code>.layout-v-split</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/6-layouts.npSPMC8z_Z1kbVaV.webp" alt="Illustration showing two screens: A level three Markdown heading with an image url below and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="5-grid">5. Grid</h3>
<ul>
<li>Container CSS Class: <code>.grid-container</code></li>
<li>Slide Content CSS Class: <code>.layout-grid</code></li>
</ul>
<p>The Grid layout also has a CSS class indicating the number of grid cells at the slide content <code>&#x3C;div></code> level: <code>.grid-items-2</code>, <code>.grid-items-3</code>, <code>.grid-items-4</code>, and so on.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/7-layouts.J0u5c6Az_19MMWe.webp" alt="Illustration showing two screens: A level three Markdown heading with four image urls below and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="6-caption">6. Caption</h3>
<ul>
<li>Container CSS Class: <code>.caption-container</code></li>
<li>Slide Content CSS Class: <code>.layout-caption</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/8-layouts.BqbPweGP_Z17DHwL.webp" alt="Illustration showing two screens: An image url with a level four Markdown heading below and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="7-title-image">7. Title image</h3>
<ul>
<li>Container CSS Class: <code>.title-image-container</code></li>
<li>Slide Content CSS Class: <code>.layout-title-image</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/9-layouts.BymKpmWk_Z1ddXKQ.webp" alt="Illustration showing two screens: An level four Markdown heading with an image url below and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h3 id="8-default-text">8. Default (text)</h3>
<ul>
<li>Container CSS Class: <code>.default-container</code></li>
<li>Slide Content CSS Class: <code>.layout-default</code></li>
</ul>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/10-layouts.DcZdru2b_Z1cLU1l.webp" alt="Illustration showing two screens: Some body text and what it will look like." width="1536" height="864" loading="lazy" decoding="async"></p>
<h2 id="alignments">Alignments</h2>
<p>You need to target the inner <code>&#x3C;div></code> of each layout:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#B392F0">.layout-cover</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> justify-content</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">flex-end</span><span style="color:#E1E4E8">; </span><span style="color:#6A737D">/* vertical alignment */</span></span>
<span class="line"><span style="color:#79B8FF"> align-items</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">flex-start</span><span style="color:#E1E4E8">; </span><span style="color:#6A737D">/* horizontal alignment */</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h3 id="1-horizontal-alignment">1. Horizontal alignment</h3>
<p>Use the <code>align-items</code> property with the <code>flex-start</code>, <code>center</code> or <code>flex-end</code> value to <em>horizontally</em> align it either left, center or right.</p>
<h3 id="2-vertical-alignment">2. Vertical alignment</h3>
<p>Use the <code>justify-content</code> property with the <code>flex-start</code>, <code>center</code> or <code>flex-end</code> value to <em>vertically</em> align it either left, center or right.</p>
<h2 id="responsiveness">Responsiveness</h2>
<p>The themes are responsive. By default, CSS applies to mobile devices. If you want to target non-mobile devices:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#F97583">@media</span><span style="color:#E1E4E8"> (</span><span style="color:#79B8FF">min-width</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">768</span><span style="color:#F97583">px</span><span style="color:#E1E4E8">) { ... }</span></span>
<span class="line"></span></code></pre>
<p>You can add additional breakpoints if, for instance, you want to provide different font-size/margins depending on the viewport size. However, iA Presenter already has its logic, and defaults should be enough.</p>
<h2 id="appearances">Appearances</h2>
<p>iA Presenter uses a <code>.dark</code> and <code>.light</code> CSS class. â These classes are set per layout. â You can force the appearance for a specific layout in a custom theme in the <code>template.json</code> file:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF"> "Name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Version"</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">0.1</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Author"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"iA"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "ShortDescription"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Stylish, bold, classy."</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "LongDescription"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Stylish, bold, classy</span><span style="color:#79B8FF">\n</span><span style="color:#9ECBFF">- Different sizes for headlines</span><span style="color:#79B8FF">\n</span><span style="color:#9ECBFF">- Simple color background</span><span style="color:#79B8FF">\n</span><span style="color:#9ECBFF">- Default white on black</span><span style="color:#79B8FF">\n</span><span style="color:#9ECBFF">- Default font: New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Css"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"newyork.css"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "TitleFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "BodyFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Layouts"</span><span style="color:#E1E4E8">: [</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "Name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Cover"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Classes"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"invert"</span></span>
<span class="line"><span style="color:#E1E4E8"> },</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "Name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Title"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Classes"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"invert"</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#E1E4E8"> ]</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h2 id="backgrounds">Backgrounds</h2>
<p>You can use regular bitmap images (for example <code>.jpg</code> or <code>.png</code>), but iA Presenter also supports <code>.svg</code> backgrounds. Background images can also be inlined directly in the CSS as shown below. You can target a specific layout:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#B392F0">.backgrounds</span><span style="color:#B392F0"> .v-split-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> background-image</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">url</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">'data:image/svg+xml;utf8,&#x3C;svg viewBox="0 0 1024 600" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="2">&#x3C;path fill="red" d="m541.526-57.455 584.065 49.14-56.35 669.755-584.065-49.14z"/>&#x3C;/svg>'</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#79B8FF"> background-size</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">cover</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> background-position</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<p>If you use a inline SVG as url directly in your CSS file, youâll need to take care of how you declare colors. Colors in hexadecimal format (like <code>#FFFFFF</code>) will break your CSS. Instead, youâll need to use the <code>rgb(0,0,0)</code> format.</p>
<p>If you want to target all backgrounds, no matter the layout, target the <code>.slide-background</code> class.</p>
<h2 id="gradient-background">Gradient background</h2>
<p>You need to define two different gradients: One per appearance, light and dark. These gradients are defined in the <code>presets.json</code> file:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#E1E4E8">{</span></span>
<span class="line"><span style="color:#79B8FF"> "Presets"</span><span style="color:#E1E4E8">: [</span></span>
<span class="line"><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> "Name"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Default"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "TitleFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"system-ui"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "BodyFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"system-ui"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Appearance"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"dark"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "DarkBodyTextColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#000000"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "LightBodyTextColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#ffffff"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "DarkTitleTextColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#000000"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "LightTitleTextColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#ffffff"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "DarkBackgroundColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"transparent"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "LightBackgroundColor"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"transparent"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent1"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#f94144"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent2"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#43aa8b"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent3"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#f9c74f"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent4"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#90be6d"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent5"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#f8961e"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "Accent6"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"#577590"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#79B8FF"> "LightBgGradient"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"#c7e7ff"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#f0c8ff"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#ffdada"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#ffebb2"</span><span style="color:#E1E4E8">],</span></span>
<span class="line"><span style="color:#79B8FF"> "DarkBgGradient"</span><span style="color:#E1E4E8">: [</span><span style="color:#9ECBFF">"#15354c"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#3e154c"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#4c2828"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"#4c3900"</span><span style="color:#E1E4E8">]</span></span>
<span class="line"><span style="color:#E1E4E8"> }</span></span>
<span class="line"><span style="color:#E1E4E8"> ]</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h2 id="custom-fonts">Custom fonts</h2>
<p>Youâll need to follow these steps to add a custom font to your theme:</p>
<h3 id="1-add-the-font-files-to-your-theme-folder">1. Add the font files to your theme folder</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="markdown"><code><span class="line"><span style="color:#E1E4E8">Roboto-Slab-Regular.woff2</span></span>
<span class="line"><span style="color:#E1E4E8">Roboto-Slab-Bold.woff2</span></span>
<span class="line"></span></code></pre>
<h3 id="2-reference-the-fonts-at-the-beginning-of-your-css">2. Reference the fonts at the beginning of your CSS</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#F97583">@font-face</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> font-family</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Roboto Slab"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> font-style</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">normal</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> font-weight</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">400</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> src</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">url</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">Roboto-Slab-Regular.woff2</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">format</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"woff2"</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#F97583">@font-face</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> font-family</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"Roboto Slab"</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> font-style</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">normal</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> font-weight</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">700</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> src</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">url</span><span style="color:#E1E4E8">(</span><span style="color:#FFAB70">roboto-slab-Bold.woff2</span><span style="color:#E1E4E8">) </span><span style="color:#79B8FF">format</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"woff2"</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h3 id="3-add-meta-data">3. Add meta data</h3>
<p>In this example, youâll need to add the display name of your custom fonts in <code>template.json</code>. Thatâs the name that will appear in the style inspector. Hereâs an example for the New York font:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#9ECBFF">"TitleFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#9ECBFF"> "BodyFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"New York"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"></span></code></pre>
<p>In your <code>presets.json</code> youâll need to add the CSS name of your custom font. This example is for the New York font. You will notice that the name is different than the display name.</p>
<p><em>NOTE: You could directly set your custom font in CSS, but you would lose the ability to override it using the style inspector.</em></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="json"><code><span class="line"><span style="color:#9ECBFF">"TitleFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"-apple-system-ui-serif, ui-serif"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#9ECBFF">"BodyFont"</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">"-apple-system-ui-serif, ui-serif"</span><span style="color:#E1E4E8">,</span></span>
<span class="line"></span></code></pre>
<h2 id="using-images-from-your-theme-in-css">Using images from your theme in CSS</h2>
<p>Once your custom theme is installed, iA Presenter preserves the directories structure. You can then reference an image using the <code>url()</code> function. Example:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#B392F0">.backgrounds</span><span style="color:#B392F0"> .default-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> background-image</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">url</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"image1.jpg"</span><span style="color:#E1E4E8">);</span></span>
<span class="line"><span style="color:#79B8FF"> background-size</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">cover</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> background-position</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<h2 id="bonus">Bonus</h2>
<p>Center everything except <code>&#x3C;h1></code> elements vertically and horizontally:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#B392F0">.layout-caption</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.layout-default</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.layout-grid</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.layout-section</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.layout-title-image</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.layout-v-split</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8">,</span></span>
<span class="line"><span style="color:#B392F0">.section-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> align-items</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#F97583"> !important</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> justify-content</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#F97583"> !important</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#79B8FF"> text-align</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#F97583"> !important</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.layout-cover</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> justify-content</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">center</span><span style="color:#F97583"> !important</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre>
<p>Colored and shaped borders on everything for easier debugging. Unfortunately, there is no hot reload (yet?), so as soon as you save changes in the CSS file, Presenter has to be closed and reopened. The following clumsy approach helped me a lot to find out when which element is displayed:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="css"><code><span class="line"><span style="color:#B392F0">.cover-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> red</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-cover</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dashed</span><span style="color:#79B8FF"> red</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.title-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> blue</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-title</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dotted</span><span style="color:#79B8FF"> blue</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.section-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> aqua</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-section</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dashed</span><span style="color:#79B8FF"> aqua</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.v-split-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> yellow</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-v-split</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dotted</span><span style="color:#79B8FF"> yellow</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.grid-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> green</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-grid</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dotted</span><span style="color:#79B8FF"> green</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.caption-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> orange</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-caption</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dashed</span><span style="color:#79B8FF"> orange</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.title-image-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> violet</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-title-image</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dotted</span><span style="color:#79B8FF"> violet</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:#B392F0">.default-container</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> solid</span><span style="color:#79B8FF"> chartreuse</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#B392F0">.layout-default</span><span style="color:#F97583"> ></span><span style="color:#85E89D"> div</span><span style="color:#E1E4E8"> {</span></span>
<span class="line"><span style="color:#79B8FF"> border</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">5</span><span style="color:#F97583">px</span><span style="color:#79B8FF"> dashed</span><span style="color:#79B8FF"> chartreuse</span><span style="color:#E1E4E8">;</span></span>
<span class="line"><span style="color:#E1E4E8">}</span></span>
<span class="line"></span></code></pre></content:encoded><author>Steve Frenzel</author></item><item><title>WCAG? More like, W-what?!</title><link>https://www.stevefrenzel.dev/blog/wcag-more-like-what/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/wcag-more-like-what/</guid><description>Three resources (text, map and video) to help you better understand the WCAG.</description><pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate><content:encoded><p>It doesnât matter whether youâve just started to get to grips with the topic of web accessibility or are already more familiar with the subject: The <a href="https://www.w3.org/TR/WCAG22/">Web Content Accessibility Guidelines</a> (WCAG) can be challenging and confusing at times.</p>
<p>In this article, I want to share three resources that simplify the content, so you can do for example the following:</p>
<ul>
<li>Make it easier for newcomers to get started</li>
<li>Untangle a knot in your brain</li>
<li>Discuss a specific criterion with someone who has little or no knowledge of the guidelines</li>
</ul>
<p>It is very important to mention that these are to be considered as a complement and do not replace the original WCAG as a reference!</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#the-wcag-explained">The WCAG explained</a></li>
<li><a href="#wcag-22-map">WCAG 2.2 Map</a></li>
<li><a href="#a-wcag-overview">A WCAG Overview</a></li>
</ul>
<h2 id="the-wcag-explained">The WCAG explained</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/1-stark.CFctLW7B_ZwlMU1.webp" alt="The WCAG Explained: Simplified and actionable explanations of every WCAG 2.2 criteria" width="1800" height="945" loading="lazy" decoding="async"></p>
<p><a href="https://www.getstark.co/">Stark</a> is one of the companies that are tirelessly working to make web accessibility simple, modern and appealing for those interested. Their browser extension is one of my standard tools for automated testing, as is their Figma plugin.</p>
<p>Recently they took the trouble to present all WCAG in a simplified form (in English)! đ± The result is a reference in easy-to-understand form, which should be understood as a supplement and not as a replacement.</p>
<p><a href="https://www.getstark.co/wcag-explained/">The WCAG explained</a></p>
<h2 id="wcag-22-map">WCAG 2.2 Map</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/2-intopia.DtXW3wF0_ZHCXsQ.webp" alt="Upper half of the WCAG 2.2 map by Intopia, showing the name and several A, AA and AAA criteria" width="1500" height="776" loading="lazy" decoding="async"></p>
<p>If youâre more of a visual learner (like me), this WCAG map from <a href="https://intopia.digital/">Intopia</a> might help you better understand the criteria. Again, a lot of complexity has been removed to make the information more accessible. It is currently only available in English and as a PDF document.</p>
<p><a href="https://intopia.digital/articles/intopia-launches-wcag-2-2-map/">WCAG 2.2 Map</a></p>
<h2 id="a-wcag-overview">A WCAG Overview</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/3-eric-eggert.DdovkaSb_ZLBVcB.webp" alt="A WCAG Overview by Eric Eggert, Web Accessibility Expert" width="1280" height="720" loading="lazy" decoding="async"></p>
<p>In case you are not in the mood for text or maps with illustrations, this video by <a href="https://mastodon.online/@yatil@yatil.social/111942226349030469">Eric Eggert</a> might be something for you. He gives a good overview of WCAG itself and some of the criteria. The video is available in English (with subtitles) on YouTube.</p>
<p><a href="https://www.youtube.com/watch?v=rIebSHUZz_w">A WCAG Overview by Eric Eggert</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>Screen reader check: SoundCloud widget</title><link>https://www.stevefrenzel.dev/blog/screen-reader-check-soundcloud-widget/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/screen-reader-check-soundcloud-widget/</guid><description>Inspired by one Mastodon post, I tested how JAWS, NVDA, VoiceOver and Narrator interact with this widget.</description><pubDate>Tue, 27 Feb 2024 00:00:00 GMT</pubDate><content:encoded><p>This article was inspired by <a href="https://mastodon.online/@FINOkoye@mastodon.social/111969507444864766">a post on Mastodon by FINOkoye</a>.</p>
<p>Web accessibility and music have been two very big topics in my life for a while now. Thanks to the article I mentioned, I have finally found a topic to combine these two things! And since there are so many streaming providers, Iâm might make a little series out of itâŠ</p>
<p>My original plan was to align this component with all the appropriate WCAG criteria, but as I went through this scenario in my head, I realized what a huge amount of work (not paid for by SoundCloud) this would be. It would also overshoot the mark and the core issue is the extent to which it works with a screen reader.</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#ludens-by-bring-me-the-horizon">âLudensâ by Bring Me The Horizon</a></li>
<li><a href="#the-widget-itself">The widget itself</a></li>
<li><a href="#testing-tools-automatic-and-manual">Testing tools (automatic and manual)</a></li>
<li><a href="#how-i-tested">How I tested</a>
<ul>
<li><a href="#testing-with-jaws-on-windows-11">Testing with JAWS on Windows 11</a></li>
<li><a href="#testing-with-nvda-on-windows-11">Testing with NVDA on Windows 11</a></li>
<li><a href="#testing-with-voiceover-on-macos-sonoma">Testing with VoiceOver on macOS Sonoma</a></li>
<li><a href="#testing-with-narrator-on-windows-11">Testing with Narrator on Windows 11</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="ludens-by-bring-me-the-horizon">âLudensâ by Bring Me The Horizon</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/bmth.B4hEd4uf_1nx32J.webp" alt="Five white guys with colorful shirts in front of a window that has a huge Pizza image" width="1220" height="775" loading="lazy" decoding="async"></p>
<p>Our test subject will be one of my favorite songs by Bring Me The Horizon from Sheffield, UK: <a href="https://soundcloud.com/bring-me-the-horizon/ludens?utm_source=clipboard&#x26;utm_medium=text&#x26;utm_campaign=social_sharing">Ludens</a>! Since Suicide Season came out in 2008, Iâve not only been a fan of the guys from Sheffield, but also of <a href="https://en.wikipedia.org/wiki/Hideo_Kojima">Hideo Kojima</a> since his masterpiece <a href="https://en.wikipedia.org/wiki/Metal_Gear_Solid_(1998_video_game)">Metal Gear Solid</a> was released for the Playstation in 1998.</p>
<p>The fact that they wrote a song for Death Stranding - a more recent game by Hideo Kojima - was just a match made in heaven for me. They seem to be fans of it themselves, because their song <a href="https://www.youtube.com/watch?v=-k9qDxyxS3s">Shadow Moses</a> is a direct Metal Gear reference. And it fucking slaps.</p>
<p>As always, Iâve created a test website for testing purposes: <a href="https://stevefrenzel.github.io/showcase-soundcloud-embed/">Showcase SoundCloud player embed</a></p>
<h2 id="the-widget-itself">The widget itself</h2>
<p>Already while I was inserting the âiframeâ in my code editor, I received a warning from my <a href="https://marketplace.visualstudio.com/items?itemName=deque-systems.vscode-axe-linter">axe-linter</a> extension:</p>
<blockquote>
<p>Ensures <code>&#x3C;iframe></code> and <code>&#x3C;frame></code> elements have an accessible name - <a href="https://dequeuniversity.com/rules/axe/4.8/frame-title?application=axe-linter">Deque University</a></p>
</blockquote>
<p>In any case, itâs off to a good start. đ
Letâs solve the problem by adding an <code>aria-label</code> with the text âLudens by Bring Me The Horizon on SoundCloudâ.</p>
<p>If you use the default styling of SoundCloud, this component has a width of 100%. This means that no matter how big your screen is, this element will take up the entire width of the screen. This is not a problem if it is embedded somewhere where a width has already been set, but in our case we donât have that, so it looks like this:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/widget-full-width.BdEe8HxS_2wYMTV.webp" alt="SoundCloud widget that is super wide and stretched. The controls on the left and the right side are far away from each other." width="3518" height="704" loading="lazy" decoding="async"></p>
<p>If we apply 500 pixels as a fixed width (as on SoundCloud) then it looks much better:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/widget-500-pixel.B6Jpaweq_d42NR.webp" alt="SoundCloud widget with a very compact width, all controls are now close to each other." width="1109" height="704" loading="lazy" decoding="async"></p>
<p>Before we start with the practical tests, letâs take a look at this component in the accessibility tree:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/a11y-tree.KiJ6tEsY_2vmo4l.webp" alt="Screenshot from the accessibility tree of the SoundCloud widget. It shows mostly link, except for one element, which has a role of &#34;application&#34;." width="1412" height="1430" loading="lazy" decoding="async"></p>
<p>So far everything looks about right. Links are links with accessible names and buttons are buttons with⊠Wait a minute. Why does the âplayâ button have a role âapplicationâ? Letâs take a closer look at the definition of this role:</p>
<blockquote>
<p>The <code>application</code> role indicates to assistive technologies that an element and all of its children should be treated similar to a desktop application, and no traditional HTML interpretation techniques should be used. [âŠ] - <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Application_Role">mdn web docs</a></p>
</blockquote>
<p>Huh. Iâm no expert, but if they had left that part out, it would have been totally ok. Well, moving on! Letâs take a look at the three attributes of the <code>iframe</code> element and what exactly they do (other attributes removed for claritiy):</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">iframe</span><span style="color:#B392F0"> scrolling</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"no"</span><span style="color:#B392F0"> frameborder</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"no"</span><span style="color:#B392F0"> allow</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"autoplay"</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">iframe</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>The <code>scrolling</code> attribute âindicates when the browser should provide a scrollbar for the frameâ. In this case it will never show a scrollbar, which is an interesting choice. Itâs is also deprecated and hereâs what mdn web docs has to say about it:</p>
<blockquote>
<p>These attributes are deprecated and may no longer be supported by all user agents. You should not use them in new content, and try to remove them from existing content. - <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#deprecated_attributes">mdn web docs</a></p>
</blockquote>
<p>Oops, another deprecated attribute coming right up! Hereâs what <code>frameborder</code> is supposed to do:</p>
<blockquote>
<p>The value 1 (the default) draws a border around this frame. The value 0 removes the border around this frame, but you should instead use the CSS property <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/border">border</a> to control <code>&#x3C;iframe></code> borders.</p>
</blockquote>
<p>Cool, they didnât use any of these values, they just wrote ânoâ. Iâve seen this a couple of times now, so I guess it works? The last attribute of this infernal trio is <code>allow</code>, which does the following:</p>
<blockquote>
<p>Specifies a <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Permissions_Policy">Permissions Policy</a> for the <code>&#x3C;iframe></code>. The policy defines what features are available to the <code>&#x3C;iframe></code> (for example, access to the microphone, camera, battery, web-share, etc.) based on the origin of the request.</p>
</blockquote>
<p>In this case, they allow the music to play automatically, which is one of THE most annoying and unpleasant things you can experience on the web. Imagine you have to rely solely on what you can here while browsing.</p>
<p>Suddenly the song starts playing and you have to frantically navigate through the site to turn it off. Why does anyone think thatâs a good idea? If we look at an explanation from WCAG <a href="https://www.w3.org/WAI/WCAG21/Understanding/audio-control.html">SC 1.4.2 Audio Control (Level A)</a>, the problem becomes even clearer:</p>
<blockquote>
<p>Playing audio automatically when landing on a page may affect a screen reader userâs ability to find the mechanism to stop it because they navigate by listening and automatically started sounds might interfere with that navigation. [âŠ]</p>
</blockquote>
<p>For this reason, I have removed the <code>allow</code> attribute, otherwise I keep everything (apart from custom width and the added <code>aria-label</code>) as it was provided by SoundCloud. I am also throwing out the two bottom links, as they are not relevant for this test.</p>
<h2 id="testing-tools-automatic-and-manual">Testing tools (automatic and manual)</h2>
<p>I used the following screen readers for manual testing:</p>
<ul>
<li>JAWS (Version 2024.2312.53)</li>
<li>NVDA (Version2023.3.3)</li>
<li>VoiceOver (Sonoma 14.3.1)</li>
<li>Narrator (Version 2023H2)</li>
</ul>
<p>Which I have combined with these web browsers:</p>
<ul>
<li>Google Chrome (Blink engine)</li>
<li>Mozilla Firefox (Gecko engine)</li>
<li>Apple Safari (WebKit engine)</li>
<li>Microsoft Edge (Blink engine)</li>
</ul>
<p>There are more screen readers and web browsers, but I chose these as they are <a href="https://webaim.org/projects/screenreadersurvey10/#used">the most popular</a> and I didnât want to make this article too long.</p>
<p>I do not rely on screen readers in my daily life, nor am I an expert using them. Nevertheless, I am quite comfortable with them, but unfortunately I donât have the time to do this study with ALL the tools available.</p>
<p>To get a quick overview of what problems I might encounter, I used the following automatic testing tools in Google Chrome:</p>
<ul>
<li><a href="https://www.deque.com/axe/devtools/">axe DevToolsÂź</a></li>
<li><a href="https://www.getstark.co/">Stark</a></li>
<li><a href="https://wave.webaim.org/">WAVE Web Accessibility Evaluation Tools</a></li>
</ul>
<h2 id="how-i-tested">How I tested</h2>
<p>Letâs use the good olâ user story to define what I expect from this widget:</p>
<blockquote>
<p>As a screen reader user, I expect the widget to be announced as âLudens by Bring Me The Horizon on SoundCloudâ. It should not autoplay, but start playing when selecting the âplayâ button. When clicking the button again, it should stop playing the music. All links inside the widget should have a descriptive, accessible name. I should be able to leave this widget by using the tab button.</p>
</blockquote>
<p>Not really that much I expect here, is it?</p>
<p>I have combined each screen reader with the respective (available) web browser and briefly describe what happened. This is a very subjective test and I have adapted the screen readers to my needs. This means that if you run the same tests, your experience may be very different.</p>
<p>Regarding the automated tests: WAVE had nothing to complain about, <a href="https://www.getstark.co/wcag-explained/robust/compatible/parsing/">Stark found an obsolete violation</a> and axe DevTools found a total of 10 issues, namely the following:</p>
<ul>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/aria-prohibited-attr?application=AxeChrome">Elements must only use permitted ARIA attributes</a> (3 issues)</li>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/aria-roles?application=AxeChrome">ARIA roles used must conform to valid values</a> (1 issue)</li>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/aria-valid-attr-value?application=AxeChrome">ARIA attributes must conform to valid values</a> (1 issue)</li>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/aria-valid-attr?application=AxeChrome">ARIA attributes must conform to valid names</a> (3 issues)</li>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/link-name?application=AxeChrome">Links must have discernible text</a> (1 issue)</li>
<li><a href="https://dequeuniversity.com/rules/axe/4.8/aria-allowed-role?application=AxeChrome">ARIA role should be appropriate for the element</a> (1 issue)</li>
</ul>
<p>When clicking the âpauseâ button for the first time, a dialog appears which invites you to explore more music on SoundCloud. It also introduces a list of links of recommendations with more music from the respective artist to the accessibility tree.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/widget-dialog.kWQf_Yot_ZISAej.webp" alt="Dialog inside the SoundCloud widget saying &#34;Explore more music &#38;#x26; audio like Ludens on SoundCloud&#34;. It also has a button with the text &#34;Hear more on SoundCloud&#34; and a close button, visualized with an X." width="1109" height="678" loading="lazy" decoding="async"></p>
<p>Visually, itâs not possible to get back to the music player unless you close this dialog. But you can still access all elements by using the <code>TAB</code> key, so thereâs no focus trap. Also, the list will only become visible once you click the âpauseâ button for a second time. It will then show up every time after hitting the âpauseâ button again:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/widget-recommendations-list.BVB_virJ_Z1VqX1c.webp" alt="Overlay inside the SoundCloud widget saying &#34;Play another track by Bring Me The Horizon&#34;, showing more songs of the artist with the respective cover artwork, artist name and song title." width="1109" height="678" loading="lazy" decoding="async"></p>
<p>Which is not what I would expect when pressing âpauseâ on a music player widget, but these are the times weâre living in and these are the widgets we were given. đ€·ââïžÂ Before we get to the juicy part, letâs have a quick look at the focus order, which goes clockwise instead from left to right:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/widget-focus-order.CMkOgdVR_1txzqV.webp" alt="SoundCloud widget containing numbers from 1 to 6, placed on top of every interactive element, connected by lines and going clockwise." width="1036" height="642" loading="lazy" decoding="async"></p>
<h3 id="testing-with-jaws-on-windows-11">Testing with JAWS on Windows 11</h3>
<p>When arriving on the page, the first element that can be focussed via <code>TAB</code> key is the âplayâ button. Focussing it announces it as âplayâ, but not as âplay, buttonâ. After pressing âpauseâ for the first time, the dialog appears.</p>
<p>This dialog can only be dismissed when pressing the âcloseâ button, pressing <code>ESC</code> doesnât work. In Chrome, an alert with the text âGet captions for your audio and videoâ appears after the dialog opens.</p>
<p>Personally, I would have found it convenient if the âcloseâ button was focussed right after the dialog opened, so I could dismiss it quicker. <sup><a href="#user-content-fn-1" id="user-content-fnref-1" data-footnote-ref="" aria-describedby="footnote-label">1</a></sup> I had to press the <code>TAB</code> key three times to get to the close button, so thankfully there was no need to traverse through the huge list of recommendations, which is now part of the accessibility tree.</p>
<p>After closing the dialog, thereâs no announcement that focus is on the âplayâ button again. Pressing <code>SPACE</code> or <code>ENTER</code> announces it as âpauseâ button again. After closing the dialog in Firefox and pressing first âplayâ and then âpauseâ, the focus shifts to the second link in the recommendation list, but without announcement.</p>
<p>Besides that, the behavior in Chrome, Firefox and Edge was the same.</p>
<h3 id="testing-with-nvda-on-windows-11">Testing with NVDA on Windows 11</h3>
<p>The behavior is the same as with JAWS in all three browsers, the only difference being that after closing the dialog, the focus moves to the ââ 2019 Sony Music Entertainment UK Limitedâ without announcement, so youâll have to navigate back there by yourself.</p>
<h3 id="testing-with-voiceover-on-macos-sonoma">Testing with VoiceOver on macOS Sonoma</h3>
<p>Same behavior as with JAWS in all three browsers and Safari, except:</p>
<p>In Chrome, Safari and Edge, thereâs no announcement that the button (aka âapplicationâ) now has a name of âpauseâ after pressing âplayâ. It only gets announced in Firefox.</p>
<p>When closing the dialog pressing <code>SPACE</code>, it will start the music again immediately. When pressing <code>ENTER</code>, nothing happens.</p>
<h3 id="testing-with-narrator-on-windows-11">Testing with Narrator on Windows 11</h3>
<p>The behavior is the same as with JAWS in all three browsers, except that the role of the âplayâ button gets announced in all of them, so youâre gonna hear âplay, applicationâ.</p>
<p>Also in Firefox, when pressing âpauseâ for the first time, focus wonât be moved inside the dialog. Youâll have to press <code>B</code> to directly select the close button.</p>
<h2 id="conclusion">Conclusion</h2>
<p>If I compare my experiences with the user story, everything actually worked as I expected. Essentially, this widget works as it should: You press âplayâ, the music plays, you press âpauseâ and it stops. Unfortunately, SoundCloud has added an annoying dialog to this logic and a large list of links with recommendations, which inflates the accessibility tree somewhat.</p>
<section data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2>
<ol>
<li id="user-content-fn-1">
<p>If youâre interested in the topic of moving focus, check out this great article by Adrian Roselli: <a href="https://adrianroselli.com/2023/08/where-to-put-focus-when-deleting-a-thing.html">Where to Put Focus When Deleting a Thing</a> <a href="#user-content-fnref-1" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">â©</a></p>
</li>
</ol>
</section></content:encoded><author>Steve Frenzel</author></item><item><title>Easy web accessibility wins: Hashtags</title><link>https://www.stevefrenzel.dev/blog/easy-web-accessibility-wins-hashtags/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/easy-web-accessibility-wins-hashtags/</guid><description>Is there a way to create hashtags that work for everyone? I did some screen reader testing and was surprised by the outcome!</description><pubDate>Fri, 16 Feb 2024 00:00:00 GMT</pubDate><content:encoded><p>There are many opportunities for simple web accessibility wins. Not only developers and designers should have a duty to create an accessible product, but also content creators.</p>
<p>One of these small wins can be achieved by tweaking your hashtags. This process in general is called âshifting leftâ, you can learn more about it here: <a href="https://mn.gov/mnit/media/blog/?id=38-522146">What Happens When A Project Team Shifts Accessibility Left?</a></p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#the-problem">The problem</a></li>
<li><a href="#the-data">The data</a>
<ul>
<li><a href="#test-case-1-all-lower-case">Test case 1: All lower case</a></li>
<li><a href="#test-case-2-pascal-case-with-a-div-element">Test case 2: Pascal case with a <code>&#x3C;div></code> element</a></li>
<li><a href="#test-case-3-pascal-case-with-a-p-element">Test case 3: Pascal case with a <code>&#x3C;p></code> element</a></li>
<li><a href="#test-case-4-manually-added-aria-label">Test case 4: Manually added aria-label</a></li>
<li><a href="#test-case-5-automatically-added-aria-label-via-javascript">Test case 5: Automatically added aria-label via JavaScript</a></li>
</ul>
</li>
<li><a href="#the-results">The results</a></li>
<li><a href="#the-conclusion">The conclusion</a></li>
<li><a href="#another-problem">Another problem</a></li>
</ul>
<h2 id="the-problem">The problem</h2>
<p>Letâs turn the title of this article into a hashtag: #easywebaccessibilitywinshashtags</p>
<p>Not only was the fear of making a typo my constant companion while writing, itâs also super hard to read. Fortunately, there is a writing method that could help: <a href="https://www.freecodecamp.org/news/snake-case-vs-camel-case-vs-pascal-case-vs-kebab-case-whats-the-difference/#pascal-case">Pascal case</a>!</p>
<p>If we apply it to our example, the text is already much easier to read visually: #EasyWebAccessibilityWinsHashtags</p>
<p>So weâve removed a barrier for sighted people, but what about those who rely on screen readers, for example?</p>
<h2 id="the-data">The data</h2>
<p>Since 2008, WebAIM has been conducting a <a href="https://webaim.org/projects/screenreadersurvey9/#used">screen reader user survey</a>, which shows, among other things, which software is popular and how important the correct use of heading elements is, for example.</p>
<p>Based on this survey, I have selected the four most popular screen readers in order to test whether I can find a solution for consistently announcing hashtags correctly.</p>
<p>For this purpose, I have created a <a href="https://stevefrenzel.github.io/showcase-accessible-hashtags/">test website</a> to carry out these tests. This code is NOT production ready and is for demonstration purposes only. In the last section I explain my thought process regarding this example website. There are five test cases, for each I document the results in a table.</p>
<ul>
<li>âNoâ means that the words were not pronounced individually</li>
<li>âYesâ means that the individual words were pronounced correctly</li>
<li>âPartiallyâ means that the individual words were pronounced more or less correctly</li>
<li>âNot testedâ means that a test was not possible</li>
</ul>
<h3 id="test-case-1-all-lower-case">Test case 1: All lower case</h3>
<p>A <code>&#x3C;div></code> with an WAI-ARIA role of ânoteâ, containing the all lower case string â#easywebaccessibilitywinshashtagsâ.</p>
<div style="overflow-x: auto;">
<table><thead><tr><th></th><th><strong>Google Chrome</strong></th><th><strong>Mozilla Firefox</strong></th><th><strong>Apple Safari</strong></th><th><strong>Microsoft Edge</strong></th></tr></thead><tbody><tr><td><strong>JAWS</strong></td><td>Partially</td><td>Partially</td><td>Not tested</td><td>Partially</td></tr><tr><td><strong>NVDA</strong></td><td>Partially</td><td>Partially</td><td>Not tested</td><td>Yes</td></tr><tr><td><strong>VoiceOver</strong></td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td><strong>Narrator</strong></td><td>Partially</td><td>Partially</td><td>Not tested</td><td>Partially</td></tr></tbody></table>
</div>
<h3 id="test-case-2-pascal-case-with-a-div-element">Test case 2: Pascal case with a <code>&#x3C;div></code> element</h3>
<p>A <code>&#x3C;div></code> with an WAI-ARIA role of ânoteâ, containing the Pascal case string â#EasyWebAccessibilityWinsHashtagsâ.</p>
<div style="overflow-x: auto;">
<table><thead><tr><th></th><th><strong>Google Chrome</strong></th><th><strong>Mozilla Firefox</strong></th><th><strong>Apple Safari</strong></th><th><strong>Microsoft Edge</strong></th></tr></thead><tbody><tr><td><strong>JAWS</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr><tr><td><strong>NVDA</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr><tr><td><strong>VoiceOver</strong></td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td><strong>Narrator</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr></tbody></table>
</div>
<h3 id="test-case-3-pascal-case-with-a-p-element">Test case 3: Pascal case with a <code>&#x3C;p></code> element</h3>
<p>A <code>&#x3C;p></code> element, containing the Pascal case string â#EasyWebAccessibilityWinsHashtagsâ.</p>
<div style="overflow-x: auto;">
<table><thead><tr><th></th><th><strong>Google Chrome</strong></th><th><strong>Mozilla Firefox</strong></th><th><strong>Apple Safari</strong></th><th><strong>Microsoft Edge</strong></th></tr></thead><tbody><tr><td><strong>JAWS</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr><tr><td><strong>NVDA</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr><tr><td><strong>VoiceOver</strong></td><td>No</td><td>No</td><td>No</td><td>No</td></tr><tr><td><strong>Narrator</strong></td><td>Yes</td><td>Yes</td><td>Not tested</td><td>Yes</td></tr></tbody></table>
</div>
<h3 id="test-case-4-manually-added-aria-label">Test case 4: Manually added aria-label</h3>
<p>A <code>&#x3C;div></code> with an WAI-ARIA role of ânoteâ and an aria-label containing the string â#EasyWebAccessibilityWinsHashtagsâ. Inside is the actual element, which is another <code>&#x3C;div></code> with the <code>aria-hidden='true'</code> attribute.</p>
<div style="overflow-x: auto;">
<table><thead><tr><th></th><th><strong>Google Chrome</strong></th><th><strong>Mozilla Firefox</strong></th><th><strong>Apple Safari</strong></th><th><strong>Microsoft Edge</strong></th></tr></thead><tbody><tr><td><strong>JAWS</strong></td><td>No</td><td>Yes</td><td>Not tested</td><td>No</td></tr><tr><td><strong>NVDA</strong></td><td>No</td><td>No</td><td>Not tested</td><td>No</td></tr><tr><td><strong>VoiceOver</strong></td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td><strong>Narrator</strong></td><td>No</td><td>No</td><td>Not tested</td><td>No</td></tr></tbody></table>
</div>
<h3 id="test-case-5-automatically-added-aria-label-via-javascript">Test case 5: Automatically added aria-label via JavaScript</h3>
<p>A <code>&#x3C;div></code> element with a WAI-ARIA role of ânoteâ. Inside is the actual element, which is another <code>&#x3C;div></code> with the aria-hidden=âtrueâ attribute. The content is injected via JavaScript, adding an aria-label to the parent <code>&#x3C;div></code>. This string has no â#â symbol and added white space between every word.</p>
<div style="overflow-x: auto;">
<table><thead><tr><th></th><th><strong>Google Chrome</strong></th><th><strong>Mozilla Firefox</strong></th><th><strong>Apple Safari</strong></th><th><strong>Microsoft Edge</strong></th></tr></thead><tbody><tr><td><strong>JAWS</strong></td><td>No</td><td>Yes</td><td>Not tested</td><td>No</td></tr><tr><td><strong>NVDA</strong></td><td>No</td><td>No</td><td>Not tested</td><td>No</td></tr><tr><td><strong>VoiceOver</strong></td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr><tr><td><strong>Narrator</strong></td><td>No</td><td>No</td><td>Not tested</td><td>No</td></tr></tbody></table>
</div>
<h2 id="the-results">The results</h2>
<p>For me, the results of the first three test cases are not as surprising as the fact that the same screen reader on the same website can sometimes behave completely differently! đ±</p>
<p>The last two test cases are particularly interesting, as VoiceOver and JAWS worked with my solution, but the other screen readers did not.</p>
<p>It also showed that JAWS is (for now) the leading software for a reason, as it works particularly reliably in combination with Firefox. VoiceOver is the worst performer for me, as it has problems where the others at least partially announce the hashtag correctly.</p>
<h2 id="the-conclusion">The Conclusion</h2>
<p>In an ideal world, no hacks would be necessary for a hashtag to be announced correctly. Unfortunately, the reality is different and based on my tests, my conclusion is to choose the lesser of two evils as it was rendered correctly by the majority of the software tested.</p>
<p>In other words, using Pascal case when writing hashtags can make a significant difference and helps to shift left. Therefore, the responsibility for accessibility would lie with the content creators and not with the designers or developers. For better or for worseâŠ</p>
<h2 id="another-problem">Another problem</h2>
<p>When creating the test website, I quickly had to ask myself the question: What kind of HTML element would a hashtag actually be? If they were displayed collectively, I would turn them into a list element within a list. But solo, for example in the middle of a sentence?</p>
<p>After a little research, my conclusion was that there is no native element that fits exactly, so I would assign the WAI-ARIA role <code>note</code>, as it makes the most sense to me:</p>
<blockquote>
<p>A note role suggests a section whose content is parenthetic or ancillary to the main content. - <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/note_role">mdn web docs</a></p>
</blockquote>
<p>The reason for this is a warning from my axe-linter extension, which came up when I tried to assign <code>aria-label</code> to a <code>&#x3C;div></code>, <code>&#x3C;span></code> and <code>&#x3C;p></code> element:</p>
<blockquote>
<p>Ensures ARIA attributes are not prohibited for an elementâs role - <a href="https://dequeuniversity.com/rules/axe/4.8/aria-prohibited-attr?application=axe-linter">Deque University</a></p>
</blockquote>
<p>My goal was to be able to work as consistently as possible with a specific role, for a better comparison. But is a hashtag really a section, like it says in the definition?</p>
<p>In my solution, I wrapped it in a <code>&#x3C;div></code> and added an <code>aria-label</code> to avoid announcing the content twice in VoiceOver. Shortly afterwards I read this article by Adrian Roselli on the subject of âaria-labelâ</p>
<blockquote>
<p>Please stop adding <code>aria-label</code> to <code>&#x3C;span></code> and <code>&#x3C;div></code>. They wonât love you back no matter what you name them. - <a href="https://mastodon.online/@aardrian@toot.cafe/111886225658765256">Mastodon</a></p>
</blockquote>
<p>In addition, he also tested the WAI-ARIA role <code>note</code> with different screen reader and browser combinations: <a href="https://github.com/whatwg/html/issues/10100#issuecomment-1933108856">Results of Adrianâs test</a></p>
<p>After going back and forth, I still decided to stick to this role for my example, as Iâm making it very clear that the example code is NOT production ready.</p>
<p>However, I encourage you to do your own research and test for yourself. Also please let me know if thereâs a better solution, cause Iâm no expert and always open to suggestions! đ</p></content:encoded><author>Steve Frenzel</author></item><item><title>Tour blog: Kora Winter in Austria</title><link>https://www.stevefrenzel.dev/blog/tour-blog-kora-winter-in-austria/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/tour-blog-kora-winter-in-austria/</guid><description>Travelling Austria with a metal band and doing live sound in Vienna, Linz and Salzburg.</description><pubDate>Tue, 13 Feb 2024 00:00:00 GMT</pubDate><content:encoded><p>The last time I was in Austria must have been in the mid-nineties. I remember driving go-karts, hearing strange German being spoken and realizing that I would need glasses because I could see absolutely nothing at the license plate bingo.</p>
<p>More than twenty years later, I return, this time with my friends from <a href="https://www.instagram.com/korawinter/">Kora Winter</a> and in the role of sound engineer. Unfortunately, we werenât complete as one of our guitarists couldnât come along for health reasons. đ</p>
<p>It was therefore a little less fun than usual, but it was still an unforgettable experience and Iâm very grateful that I was able to be there. Because a tour weekend like this doesnât happen often, I kept a diary. The following are the events as I perceived them:</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#day-1-vienna-viper-room">Day 1: Vienna, Viper Room</a></li>
<li><a href="#day-2-linz-kapu">Day 2: Linz, KAPU</a></li>
<li><a href="#day-3-salzburg-rockhouse">Day 3: Salzburg, Rockhouse</a></li>
</ul>
<h2 id="day-1-vienna-viper-room">Day 1: Vienna, Viper Room</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/vienna-1.CVR5ARsS_1cFnRP.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>After an uneventful train ride with an hour delay (thanks Deutsche Bahn), I met our tour manager at the entrance of the venue because the band wasnât there yet. Loading in (and out) wasnât so much fun as it was a basement show and you had to walk down quite some stairs.</p>
<p>The concert hall was tunnel-shaped, which just screams for bass frequencies to build up. However, they solved it cleverly by placing the sub woofers on the ceiling above the stage. As a result, the bass sounded very compact and not at all out of control, as is usually the case in such venues. To find out quickly what a room and its sound system sounds like, I listen to songs that I know very well. Here is <a href="https://tidal.com/browse/playlist/a630f32d-a62f-4a5b-9f31-b7b9be96c6c4">my soundcheck playlist on TIDAL</a>.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/vienna-2.aQEqQS5X_ZlM28D.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>It was the first time we had our own backstage with our own drinks. The Austrians know how to spoil their guests! Also, the room looked like a swingers club, with mirrors and pillars everywhere.</p>
<p>The show went quite well, as we are now a well-rehearsed team and every move during set-up, breakdown and soundcheck is well executed. What you canât plan for, however, is when the bassistâs strap pin fails in the middle of the show. đ</p>
<p>The tuning of the replacement bass was also unplanned, which had to be found out by ear due to technical problems. But the guys took it with humor like professionals and finished the show as usual.</p>
<p>I would have liked more people to have been there. There would have been more going on, but also because the large number of bodies absorbs the high-frequency sound in particular, which makes it rattle less. My mixing desk that night was a Midas but I donât know which one, but let me tell you: Desk shows are my favorite ones! Nothing annoys me more than having to mix a show on a tablet or even a smartphone. đ€ź</p>
<p>After the show, the pampering program continued and we slept blissfully in our beds in our apartment not far from the venue. No sleeping mat or sleeping bag necessary that evening!</p>
<h2 id="day-2-linz-kapu">Day 2: Linz, KAPU</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/linz-2.CeVX_ztq_2tI0KS.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>We started the day with a late breakfast at a cafe before driving to Linz. Our anticipation was enormous, as we would be playing on the same stage that Nirvana had played on November 20, 1989. đ±</p>
<p>When we arrived, we were greeted by a brightly colored house facade outside. Inside, the super nice house technician welcomed us and confirmed to me once again that this was the stage where Nirvana played over 30 years ago (fuck yeah).</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/linz-1.D60WhEaW_npXIb.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>During the sound check, I noticed that the concert hall sounded very dry and controlled, which I was very pleased about. Our drummer plays his cymbals very loud and I welcome anything that can tame those high frequencies. My console that night was an Allen &#x26; Heath, but (again) I donât know which one. I took pictures of everything, but not of my desk. đ€Šââïž</p>
<p>Our sleeping area was in the same building a few floors above the venue and was a very large but cozy room with lots of beds, a kitchen, dining and living area. The walls were full of band names that had played and immortalized themselves there. Of course, I asked where Nirvana left their message, but that was painted over a few years ago. CAN YOU BELIEVE IT.</p>
<p>Nirvana also spent the night in the building back then, but not where we stayed, but one floor below us. The room had been converted into a recording studio, but it was still humbling to be in the same room where Kurt Cobain slept.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/linz-3.tp1l8528_Z1H9CLg.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>Because of all these positive circumstances, the show was a lot of fun for all of us, even if we went on stage a bit late. I was also blown away by the support act Seeking, which rarely happens to me with unknown bands. If you wish Hundredth had carried on like they did on RARE, you should definitely <a href="https://songwhip.com/seeking2/plush">check out Seeking</a>. To top it off, they were all super nice. đ</p>
<p>We were allowed to leave everything in the locked concert room and take it out the next morning and put it in our van. I wanted to pack it up that evening so weâd have less stress in the morning, but was overruledâŠ</p>
<h2 id="day-3-salzburg-rockhouse">Day 3: Salzburg, Rockhouse</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/salzburg-1.CWAgB8LT_Bhucp.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>Needless to say, we were pressed for time on this glorious morning because we still had to dismantle, pack and load everything. But the six of us managed! In general, our trips were always short and Salzburg announced itself with an epic mountain landscape. Arriving at the venue, I was surprised at how big the building was.</p>
<p>There were two concert rooms inside of it, a large one on the left and a small one on the right, where we played. In between was the entrance area where our merchandise table was and a staircase leading up to the improvised catering area. The technical equipment was excellent and the crew on site was very nice and helpful.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/salzburg-2.D_1A3yuP_bwcah.webp" alt="TEXT" width="750" height="1000" loading="lazy" decoding="async"></p>
<p>My mixing desk that evening was an <a href="https://www.allen-heath.com/hardware/dlive-series/dlive-surfaces/">Allen &#x26; Heath dLive C2500</a>, the most luxurious console Iâve had the pleasure of standing at. I love turning potentiometers, moving faders and pressing buttons. But when itâs such an intuitive hybrid solution with a huge touchscreen, itâs twice as much fun. đ It was also very handy to have a volume meter next to the console as the requirement was not to be above 99 decibels for too long. When the boys are on stage, they tend to reach this level of volume pretty quickly, though.</p>
<p>There were a handful of people at the front during the show who were really into it, but the energy in the room was a bit strange and there wasnât that much going on. Two people in metal vests were talking at the bar about Kora Winter being âemo shitâ and felt affirmed after the first song and left. Well, their loss. đ€·ââïž We were also warned in Linz that Salzburg can be difficult when it comes to live shows for âalternative musicâ.</p>
<p>Since there was a curfew, everything was packed and loaded before midnight and I went straight to the building next door because thatâs where our apartment was. What a luxury to be able to sleep in a bed every night!</p></content:encoded><author>Steve Frenzel</author></item><item><title>X marks the spot: Landmark elements</title><link>https://www.stevefrenzel.dev/blog/x-marks-the-spot-landmark-elements/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/x-marks-the-spot-landmark-elements/</guid><description>It's not like I hate WAI-ARIA, but often it's better to stick to what the internet gods have given us: Native HTML!</description><pubDate>Mon, 05 Feb 2024 00:00:00 GMT</pubDate><content:encoded><h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#disclaimer">Disclaimer</a></li>
<li><a href="#prologue">Prologue</a></li>
<li><a href="#a-solid-foundation">A solid foundation</a></li>
<li><a href="#bonjour-tristesse">Bonjour Tristesse</a></li>
<li><a href="#wai-would-you-do-that">WAI would you do that</a>
<ul>
<li><a href="#lets-talk-about-form-and-region">Letâs talk about <code>form</code> and <code>region</code></a></li>
</ul>
</li>
<li><a href="#land-in-sight">Land in sight</a>
<ul>
<li><a href="#the-case-for-seo">The case for SEO</a></li>
</ul>
</li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
<h2 id="disclaimer">Disclaimer</h2>
<p>I use the abbreviation âATâ in the text, which stands for âassistive technologyâ. I also show examples with two screen readers, <a href="https://support.apple.com/guide/voiceover/welcome/mac">VoiceOver</a> on macOS Sonoma 14.3 using <a href="https://arc.net/">Arc</a> and <a href="https://www.nvaccess.org/about-nvda/">NVDA</a> on Windows 11 using <a href="https://www.mozilla.org/en-US/firefox/">Firefox</a>.</p>
<p>There are many other screen reader and browser combinations, but to cover them all would have gone beyond the scope of this article. In general, I recommend testing as much as possible before you ship something in production!</p>
<p>Want to deep-dive into the topic of screen readers? Check out this article by Adrian Roselli for plenty of resources: <a href="https://adrianroselli.com/2022/11/your-accessibility-claims-are-wrong-unless.html#SRs">Your Accessibility Claims Are Wrong, UnlessâŠ</a></p>
<h2 id="prologue">Prologue</h2>
<p>Imagine you had to describe the way through a building to someone without being able to point out certain things that the person could use for orientation:</p>
<blockquote>
<p>First you go through the thing to get into the thing. Take the thing upstairs because the other thing is broken. After you have gone past a row of things, there is a thing that you have to climb up. Once at the top, press the thing so that you can find the thing with the things more easily.</p>
</blockquote>
<p>Youâll have a rough idea of what to do, but youâll have to work your way up most of the way by trial and error. But what if you had a concrete description of the landmarks?</p>
<blockquote>
<p>First, go through the door to get to the entrance hall. Take the stairs up because the elevator is broken. After you pass a row of windows, there is a ladder that you have to climb up. Once at the top, press the light switch to make it easier to find the box of photo albums.</p>
</blockquote>
<p>It should now be very clear where you need to go and what you need to do to achieve your goal. This example can easily be transferred to websites, as many websites swim in a <a href="https://i0.wp.com/css-tricks.com/wp-content/uploads/2021/09/Screen-Shot-2021-09-21-at-9.58.00-AM.png?resize=1536%2C907&#x26;ssl=1"><code>&#x3C;div></code> soup</a>.</p>
<p>Its main component is the meaningless <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/div"><code>&#x3C;div></code> element</a>. It is used for all kinds of things, even if there is often a better alternative. And this is where my beloved <a href="https://developer.mozilla.org/en-US/blog/aria-accessibility-html-landmark-roles/#what_are_html_landmark_roles">landmark elements</a> come into play!</p>
<h2 id="a-solid-foundation">A solid foundation</h2>
<p>Iâm a basic guy, I admit it. I love it when simple solutions have a big impact. One of these solutions allows you to make the structure of your website easier to understand for AT users and your developer colleagues. You can use the following eight HTML elements to do this:</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/aside"><code>&#x3C;aside></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/footer"><code>&#x3C;footer></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form"><code>&#x3C;form></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/header"><code>&#x3C;header></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main"><code>&#x3C;main></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/nav"><code>&#x3C;nav></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/search"><code>&#x3C;search></code></a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/section"><code>&#x3C;section></code></a></li>
</ul>
<p>This article is strongly inspired by <a href="https://developer.mozilla.org/en-US/blog/aria-accessibility-html-landmark-roles/#what_are_html_landmark_roles">Using HTML landmark roles to improve accessibility</a> by <a href="https://github.com/schalkneethling/">Schalk Neethling</a>, where you will find a concrete example for each element. I, however, will use all elements simultaneously in my examples to keep this article short and crisp.</p>
<h2 id="bonjour-tristesse">Bonjour Tristesse</h2>
<p>Example website: <a href="https://stevefrenzel.github.io/showcase-landmark-elements/div-soup.html">Only <code>&#x3C;div></code> elements</a></p>
<p>If we now transfer our very vague directions from the beginning to HTML code, it could look like this, for example:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">>Only div elements&#x3C;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"header"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"nav"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"main"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"section"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"search"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"form"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"aside"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"footer"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>If we open our browser inspector and look at the <a href="https://developer.mozilla.org/en-US/docs/Glossary/Accessibility_tree">accessibility tree</a>, we discover the following:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/browser-div-soup.BKJxb70Y_Z1o9PNg.webp" alt="Screenshot showing a visual presentation of landmark elements to the left and the accessibility tree to the right. It&#38;#x27;s only a div soup though, no landmark elements were actually used, which is why the accessibility tree shows them ungrouped." width="1425" height="1035" loading="lazy" decoding="async"></p>
<p>Apart from a few semantic HTML elements, not much structure is recognizable. If we activate VoiceOver on MacOs to view all available landmark elements, the picture is similarly bleak. None at all! If none of these elements are available, not even an empty list or a hint is displayed.</p>
<p>If we open NVDA together with Firefox in Windows 11, things donât look much better. Using âDâ you can jump to the next landmark element, but we only get the message âno next landmarkâ. âčïž If we were dependent on a screen reader, only the existing elements could show us the structure of this website.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/nvda-div-soup.DTQ1u4he_21YM5w.webp" alt="Screenshot of NVDA Speech Viewer showing that &#34;no text landmark&#34; elements are present." width="681" height="600" loading="lazy" decoding="async"></p>
<h2 id="wai-would-you-do-that">WAI would you do that</h2>
<p>Example website: <a href="https://stevefrenzel.github.io/showcase-landmark-elements/wai-aria.html">Only WAI-ARIA roles</a></p>
<p>A really sad sight⊠How about an interim solution that is neither elegant nor advisable? To give meaning to all these numerous, ownerless <code>&#x3C;div></code> elements and make them visible, we could assign them a <a href="https://www.w3.org/WAI/standards-guidelines/aria/">WAI-ARIA</a> role. The following are available for this purpose:</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/Banner_Role">banner</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/complementary_role">complementary</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/contentinfo_role">contentinfo</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/form_role">form</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/main_role">main</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/navigation_role">navigation</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/region_role">region</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/search_role">search</a></li>
</ul>
<p>Have you noticed that many of these roles have the same name as the corresponding HTML element? If it is not possible for you to use a landmark element, you can fall back on it as an emergency solution. However, the roles only add a semantic meaning, but no functionality! In the case of our form, we gain nothing, as it would be visible, but has no functionality.</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">>Only WAI-ARIA roles&#x3C;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"header"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"banner"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"nav"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"navigation"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"main"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"main"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"The three elements"</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"section"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"region"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Main"</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"search"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"search"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Name search"</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"form"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"form"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"aside"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"complementary"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">div</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"footer"</span><span style="color:#B392F0"> role</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"contentinfo"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">div</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>Now there is a lot more going on in our accessibility tree, all eight elements are represented! This has the advantage for screen reader users that they can now select these elements directly. On a website with a lot of content, this can speed up navigation enormously, as they can simply skip over areas.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/browser-wai-aria.BfYxHMoB_Z1MgKEB.webp" alt="Screenshot showing a visual presentation of landmark elements to the left and the accessibility tree to the right. No HTML elements were used, only WAI-ARIA roles were added to the div soup. Yet all individual elements are now grouped in the accessibility tree." width="1425" height="1035" loading="lazy" decoding="async"></p>
<p>If we use VoiceOver, all eight elements are now also listed:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/voiceover-landmarks.hn3IlqZX_ZlxPE.webp" alt="Screenshot of VoiceOver overview of all eight landmark elements." width="660" height="556" loading="lazy" decoding="async"></p>
<p>Thanks to these assigned roles, we can now also navigate quickly through the website with NVDA:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/nvda-wai-aria.DpGvb5J8_DxGHT.webp" alt="Screenshot of NVDA Speech Viewer listing all eight available landmark elements." width="681" height="600" loading="lazy" decoding="async"></p>
<p>Before we look at how we can achieve the same result even more easily with landmark elements, letâs take a little detour:</p>
<h3 id="lets-talk-about-form-and-region">Letâs talk about <code>form</code> and <code>region</code></h3>
<p>These two elements are somewhat out of line, as they only appear in the accessibility tree if you assign them a (descriptive) <code>aria-label</code>, at least with the setup Iâve used.</p>
<p>Also itâs possible that the words âsectionâ, âregionâ and âformâ are announced by a screen reader when using these roles, so you may not need to add them at all to your <code>aria-label</code>.</p>
<h2 id="land-in-sight">Land in sight</h2>
<p>Example website: <a href="https://stevefrenzel.github.io/showcase-landmark-elements/landmarks.html">Only landmark elements example</a></p>
<p>Finally, the awful part is over! Letâs code our example the way itâs meant to be, with native elements that also make it easier to read the code as a developer.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/browser-landmarks.CzL29LVG_Z2ibf6M.webp" alt="Screenshot showing a visual presentation of landmark elements to the left and the accessibility tree to the right. All individual elements are grouped in the accessibility tree." width="1425" height="1035" loading="lazy" decoding="async"></p>
<p>There are no differences in terms of the accessibility tree, but we now have a working form because we use the power and robustness of native HTML! đȘ Look at this beautiful, self-explanatory code:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">>Only landmark elements&#x3C;/</span><span style="color:#85E89D">h1</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">nav</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">nav</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">header</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">main</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">section</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"The three elements"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#FDAEB7;font-style:italic">search</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Main"</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> {# ... #}</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">form</span><span style="color:#B392F0"> action</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">""</span><span style="color:#B392F0"> aria-label</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"Name search"</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">form</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#FDAEB7;font-style:italic">search</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">section</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;/</span><span style="color:#85E89D">main</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">aside</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">aside</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">>{# ... #}&#x3C;/</span><span style="color:#85E89D">footer</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;/</span><span style="color:#85E89D">body</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>In NVDA the only difference is that for the <code>form</code> element, we now get a notification for âinvalid entryâ, which proves that we have a functional form without any additional JavaScript. Itâs great to get things for free, isnât it?</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/nvda-landmarks.i-zTMRPo_QEYln.webp" alt="Screenshot of NVDA Speech Viewer listing all eight available landmark elements. It also show &#34;invalid entry&#34; for the form element." width="681" height="600" loading="lazy" decoding="async"></p>
<h3 id="the-case-for-seo">The case for SEO</h3>
<p>Letâs face it, your employer probably doesnât care as much about landmark elements as SEO (search engine optimization). But if it makes it easier for people to navigate your website, the same should apply to search engines, right?</p>
<p>Imagine that people are looking for something on your website but canât find it because itâs very difficult to impossible for technical reasons. Instead, they go to the competition because itâs easier for them to find it there. This can have a direct impact on your search engine ranking and a simple fix like adding landmark elements can have a positive impact.</p>
<h2 id="conclusion">Conclusion</h2>
<p>Why use landmark elements when it works just as well with WAI-ARIA roles?</p>
<p>Use these roles more for complex components to ensure better accessibility. In this case, there is often no suitable element and you have to get creative. This is where WAI-ARIA can help to compensate for accessibility deficits.</p>
<p>Whenever possible, you should use native HTML elements, as these are not only easier to read in the code, but are often also equipped with functionality. This way you can ensure that your website is robust and future-proof. Landmarks help you to build a solid foundation that you can expand with additional semantic elements so that as many people as possible can use your website.</p>
<p>If youâre a fan of analogies: Imagine youâre building a car, but instead of using functioning components (landmark elements), you use ones that look like the original (WAI-ARIA) but canât do anything else. Needless to say, this is very dangerous and could get you sued.</p></content:encoded><author>Steve Frenzel</author></item><item><title>Preparing for the WAS exam</title><link>https://www.stevefrenzel.dev/blog/preparing-for-the-was-exam/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/preparing-for-the-was-exam/</guid><description>Gotta level up my web accessibility skills so I'm gonna prepare for getting a certificate. But I'm not gotta take the exam. đ (Maybe I will, though.)</description><pubDate>Mon, 29 Jan 2024 00:00:00 GMT</pubDate><content:encoded><h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#prologue">Prologue</a></li>
<li><a href="#the-day-things-changed">The day things changed</a></li>
<li><a href="#parallels-to-music-production">Parallels to music production</a></li>
<li><a href="#how-i-will-learn">How I will learn</a></li>
<li><a href="#research-for-the-exam">Research for the exam</a></li>
<li><a href="#predictions">Predictions</a></li>
</ul>
<h2 id="prologue">Prologue</h2>
<p>It must have been about two years ago that I started noticing the topic of web accessibility. Before that, I visited a <a href="https://www.spiced-academy.com/">coding bootcamp</a> and started my first job and shortly after my second one, being way too busy trying to âdeliverâ and become more familiar with React and Next.js.</p>
<p>But with experience (and diminishing imposter syndrome) came the realisation that almost all of my work didnât have a good foundation. I didnât pay attention to color contrasts, keyboard or screen reader support and simply implemented what was suggested on Stack Overflow, various YouTube tutorials or by my colleagues.</p>
<h2 id="the-day-things-changed">The day things changed</h2>
<p>When I discovered that there is an official recommendation on how to build usable and robust websites, my mind was blown! Itâs called the <a href="https://www.w3.org/TR/WCAG22/">Web Content Accessibility Guidelines</a>, or âš WCAG âš for short. These standards provide guidance on how to create websites that can be used by as many people as possible. Turns out that I like standards. I am deeply involved in this topic, but I think that my knowledge can be much more profound. My craft as a web developer is not yet at the level of quality I would like it to be.</p>
<p>Thatâs why Iâve decided to study for the <a href="https://www.iaap-hq.org/">IAAP</a> WAS certificate, short for <a href="https://www.accessibilityassociation.org/s/wascertification">Web Accessibility Specialist</a>. However, at this point I donât actually plan to take the exam, as Iâm not sure if itâs really going to be of any value for my professional career. So far nobody cared about any of the certificates Iâve gathered, but rather if Iâm a good fit as a person and if I had the necessary skills for the job. đ€·ââïž</p>
<h2 id="parallels-to-music-production">Parallels to music production</h2>
<p>I am no stranger to implementing standards, as I am familiar with them as a sound engineer and music producer. In radio and cinema, for example, there are volume specifications that you have to comply to, otherwise the delivered product will not be accepted.</p>
<p>This is a little more relaxed in the streaming and physical media sector, but here too there are recommendations regarding average volume and what needs to be taken into account when creating masters for a vinyl production, for example.</p>
<h2 id="how-i-will-learn">How I will learn</h2>
<p>My plan is to first gather my thoughts in <a href="https://www.figma.com/figjam/">FigJam</a> and organize them once I call it a (learning) day. After that Iâll write or draw it very nicely into a notebook with my (inferior) drawing skills. Then Iâll write an article about it and propably add some FigJam screenshots. With this approach Iâm certain that some of it will stay in long-term memory. đ€</p>
<p>When creating my workshops, it helped me a lot that I could stick notes in books. Iâm not a fan of writing in an actual book or even dog-earing it, no way JosĂ©! But nothing beats being able to look something up with your own hands. Also I havenât physically written anything in years, so this will be a nice way to introduce hand cramps into my learning routine.</p>
<h2 id="research-for-the-exam">Research for the exam</h2>
<p>To make sure itâs really worth it to invest my time into this, I read a couple of articles by people who went through the same process. Some of them are quite critical, which is nice cause not everything in life is cupcakes and rainbows.</p>
<p>I decided to take the <a href="https://dequeuniversity.com/online-courses/web-accessibility">Web Accessibility course by Deque University</a>, as Iâm not only a heavy user of their browser extension <a href="https://www.deque.com/axe/devtools/">axe DevToolsÂź</a> but also because they have a decent reputation in the âsceneâ. Along with it, I will also use the <a href="https://www.accessibilityassociation.org/resource/WAS_Certification_FInal_2020_FINAL">Body of Knowledge</a> provided by the IAAP for my studies. And hereâs the list from my research:</p>
<ul>
<li><a href="https://medium.com/@jnblatz/prepare-for-the-cpacc-exam-strategies-for-learning-success-97b7dc963c2a">Prepare for the CPACC (or any) Exam â Strategies for Learning Success by Jen Blatz</a></li>
<li><a href="https://medium.com/@dseo1212/a-comprehensive-guide-to-preparing-for-the-iaap-cpacc-exam-insights-and-strategies-30a9b22f4332">A Comprehensive Guide to Preparing for the IAAP CPACC Exam by Dongyeon Seo</a></li>
<li><a href="https://100daysofa11y.com/cpacc/">100 Days of A11y by Amy Carney</a></li>
<li><a href="https://www.youtube.com/watch?v=a01vcZMTJqU">FULL CPACC Study Guide đ | Pass the Certified Professional in Accessibility Core Competencies Exam!</a></li>
<li><a href="https://stevenwoodson.com/blog/cpacc-exam-reflection/">IAAP CPACC Exam Preparation and Reflection by Steven Woodson</a></li>
<li><a href="https://www.getstark.co/blog/a-discouraging-cpacc-exam-experience/">A discouraging CPACC exam experience by Caitlyn Mayers</a></li>
<li><a href="https://www.camcoulter.com/2021/07/21/cpacc-reflection/">CPACC Reflection by Cam Coulter</a></li>
</ul>
<p>Yes, this is about a different exam but contents are somewhat similar, so this worked for me to understand what studying for the exam was like.</p>
<h2 id="predictions">Predictions</h2>
<p>Looking at the body of knowledge overview, plenty of the things listed I have already done on the job to a certain extent. But I donât want to get cocky and tackle my studies with a humble attitude, as Iâm very certain that I have only surface level knowledge of most of the topics. Letâs see how it goes, itâs gonna be fun!</p></content:encoded><author>Steve Frenzel</author></item><item><title>Should links open in a new tab?</title><link>https://www.stevefrenzel.dev/blog/should-links-open-in-a-new-tab/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/should-links-open-in-a-new-tab/</guid><description>The answer will probably not surprise you very much, as there are not many plausible use cases for this practice. In other words, it depends.</description><pubDate>Thu, 25 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p><em>Photo credit: Photo by <a href="https://unsplash.com/@sebastiaanstam?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Sebastiaan Stam</a> on <a href="https://unsplash.com/photos/man-wearing-red-hoodie-RChZT-JlI9g?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Unsplash</a></em></p>
<p>Disclaimer: When talking about âlinksâ, I actually mean <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a">anchor elements</a>. But for the sake of simplicity, I will use the term âlinkâ. Also I should practice what I preach, but for now external links do not have a visual or audible indicator. I am aware of it and itâs on my evergrowing to-do-list for this blog.</p>
<p>The question in the title seems to be as old and unanswered as the discourse on âlinks versus buttonsâ and âshould I use section or article?â. My personal preference is that links should open in the same tab, as I make heavy use of the back button. This article is largely based on <a href="https://blog.pope.tech/2024/01/02/how-to-make-external-links-accessible">How to make external links accessible</a> by Whitney Lewis.</p>
<h2 id="table-of-contents">Table of contents</h2>
<ul>
<li><a href="#the-arguments-in-favour">The arguments in favour</a></li>
<li><a href="#the-arguments-against">The arguments against</a></li>
<li><a href="#damage-control">Damage control</a></li>
</ul>
<h2 id="the-arguments-in-favour">The arguments in favour</h2>
<p>Letâs look at the dilemma from the positive side for reasons to open a link in a new tab:</p>
<p>When filling out a form, you may lose progress if you navigate forward or backward. If you open the form in a new tab, you are safe from this. An alternative to this would be to make the form persistent and display new information in an overlay that can be easily closed.</p>
<p>If you are on a website that logs the user out after a certain amount of time, it can be useful for links to open in a new tab to avoid this mechanism. In this context, however, it is important to give users the option of adjusting the time limit, otherwise it might fail <a href="https://www.w3.org/TR/WCAG22/#timing-adjustable">Success Criterion 2.2.1 Timing Adjustable</a>.</p>
<p>These are two very specific examples and in general you should consider (preferably on the basis of user feedback) whether and at what point links should open in a new tab.</p>
<h2 id="the-arguments-against">The arguments against</h2>
<p>Whitney made what I consider the most important argument first, so Iâll quote her directly:</p>
<blockquote>
<p>âThe most important reason why links should open in the same tab is to give users a choice. If a link is set to open in the same tab, the user always has the choice to open it in a new tab.â</p>
</blockquote>
<p>The World Wide Web Consortium also has a clear opinion on this:</p>
<blockquote>
<p>âIn general, itâs better not to open new windows and tabs, as they can be confusing for people, especially those who have difficulty perceiving visual content.â - <a href="https://www.w3.org/TR/WCAG20-TECHS/G200.html">W3C</a></p>
</blockquote>
<p>In her article, Whitney lists many more reasons against it, but the core problem is: You are taking a piece of self-determination from your visitors and forcing something on them.</p>
<h2 id="damage-control">Damage control</h2>
<p>Letâs say you couldnât convince the marketing team that itâs better for users to have links open in the same tab. What can you do to minimize the negative effects of this decision?</p>
<p>For one thing, you can add an icon to all external links that visually signals what will happen when you click or press âenterâ. The symbol looks more or less like this and seems to be becoming an unofficial standard:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/link-list-open-new-tab.C_fuz4b6_11fq6v.webp" alt="Links with an icon after them. The icon is a square with an arrow in it pointing upwards and to the right." width="1062" height="300" loading="lazy" decoding="async"></p>
<p>If you use a screen reader, however, this symbol would be announced every time. Thatâs why Whitney suggests hiding it with <code>aria-hidden</code> and adding a screen reader exclusive hint. It could look like this, for example:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">âLINK_URLâ</span><span style="color:#B392F0"> target</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">â_blankâ</span><span style="color:#E1E4E8">></span></span>
<span class="line"><span style="color:#E1E4E8"> LINK_TEXT</span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">img</span><span style="color:#B392F0"> aria-hidden</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">âtrueâ</span><span style="color:#B392F0"> src</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">âICON_URLâ</span><span style="color:#E1E4E8">/></span></span>
<span class="line"><span style="color:#E1E4E8"> &#x3C;</span><span style="color:#85E89D">span</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"visually-hiddenâ>Opens in new tab</span><span style="color:#FDAEB7;font-style:italic">&#x3C;</span><span style="color:#9ECBFF">/span></span></span>
<span class="line"><span style="color:#FDAEB7;font-style:italic">&#x3C;</span><span style="color:#9ECBFF">/a></span></span>
<span class="line"></span></code></pre>
<p>With this solution, there would not only be a visual, but also an audible indicator that a link will open in a new tab. This would be a compromise that the marketing team could perhaps live with, as they may have seen this icon before and your suggestion would appear less âexoticâ.</p></content:encoded><author>Steve Frenzel</author></item><item><title>Books I read in 2023</title><link>https://www.stevefrenzel.dev/blog/books-i-read-in-2023/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/books-i-read-in-2023/</guid><description>Six books I enjoyed in 2023, mostly novels and biographies. Featuring Trevor Noah, Dave Grohl and more!</description><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p>When I made this list, I thought it would be much longer. It feels like Iâve read more, but these are the books I can remember from last year. In 2022 it was a lot of non-fiction, so Iâm getting a bigger kick out of reading novels and biographies. đ€·ââïž</p>
<h2 id="born-a-crime-stories-from-a-south-african-childhood-by-trevor-noah">âBorn a Crime: Stories from a South African Childhoodâ by Trevor Noah</h2>
<p>I was only peripherally aware of Trevor as just another late night host, but always found him likeable. When I saw that he had written a book about his teenage years in Africa, my interest was piqued!</p>
<p>Itâs super exciting and very funny to read about how much shit he got up to with his friends, what his relationship with his mother and her partners was like and how much his buddy Hitler loved to dance. đ
</p>
<p><a href="https://www.barnesandnoble.com/w/born-a-crime-trevor-noah/1123595364?ean=9780399588198">Buy âBorn a Crimeâ by Trevor Noah</a></p>
<h2 id="tomorrow-and-tomorrow-and-tomorrow-by-gabrielle-zevin">âTomorrow, and Tomorrow, and Tomorrowâ by Gabrielle Zevin</h2>
<p>Of all these books, this one is my favorite because it struck a chord with me. Itâs about two friends who found each other mainly through their passion for video games in the late 90s. They are both programmers and decide to program a game together. đŸ</p>
<p>The game becomes a hit, but the tensions between the two grow and so the plot develops. Itâs not a romantic love story, but itâs definitely a love story. My generation especially will really enjoy it because there are tons of video game references in this book.</p>
<p><a href="https://www.barnesandnoble.com/w/tomorrow-and-tomorrow-and-tomorrow-gabrielle-zevin/1140356782?ean=9780593321201">Buy âTomorrow, and Tomorrow, and Tomorrowâ by Gabrielle Zevin</a></p>
<h2 id="the-lincoln-highway-by-amor-towles">âThe Lincoln Highwayâ by Amor Towles</h2>
<p>I tried to start with his big hit âA Gentleman in Moscowâ but just couldnât get into the book. But this story was really fun because itâs set in the USA in the 1950s, which is a time period often chosen by Stephen King. And I love Stephen King! đ</p>
<p>What I like about the plot is that an expectation is created from the beginning, but in the end it is not satisfied at all. Thatâs what makes this book so great, because I was on a journey with the protagonists that never really happened.</p>
<p><a href="https://www.barnesandnoble.com/w/the-lincoln-highway-amor-towles/1138843333?ean=9780735222366">Buy âThe Lincoln Highwayâ by Amor Towles</a></p>
<h2 id="normal-people-by-sally-rooney">âNormal Peopleâ by Sally Rooney</h2>
<p>Another book that I had difficulties getting started with because I found the writing style very cumbersome. Especially the fact that dialogs were not written with quotation marks took a lot out of me.</p>
<p>Nevertheless, it is a very good, but also depressing book, as the two main characters not only talk past each other all the time, but also often treat each other very badly. If youâre in the mood for a teenage angst book, this is the one for you. đ”âđ«</p>
<p><a href="https://www.barnesandnoble.com/w/normal-people-sally-rooney/1129141966?ean=9781984822185">Buy âNormal Peopleâ by Sally Rooney</a></p>
<h2 id="storyteller-by-dave-grohl">âStorytellerâ by Dave Grohl</h2>
<p>If you know and like Nirvana and / or Foo Fighters, you probably heard about this book or read it already.</p>
<p>Dave is a great storyteller and especially the chapters right before the Nirvana boom were particularly interesting to me. Also that he made no money during that time for a long time still amazes me. Gotta love the music industry! đ¶</p>
<p><a href="https://www.barnesandnoble.com/w/der-storyteller-dave-grohl/1139384326?ean=9783843725682">Buy âStorytellerâ by Dave Grohl</a></p>
<h2 id="the-power-by-naomi-alderman">âThe Powerâ by Naomi Alderman</h2>
<p>This book is so rad! Women develop a power to shoot electrical jolts from their fingers (but can also heal) and become the dominant sex. It is very well written and the plot happens all around the world.</p>
<p>I really enjoyed the overall vibe and that it was easy to imagine how everything is taking place and that the exciting parts were truly exciting. đż</p>
<p><a href="https://www.barnesandnoble.com/w/the-power-naomi-alderman/1125454421?ean=9780316547604">Buy âThe Powerâ by Naomi Alderman</a></p></content:encoded><author>Steve Frenzel</author></item><item><title>Should text be truncated?</title><link>https://www.stevefrenzel.dev/blog/should-text-be-truncated/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/should-text-be-truncated/</guid><description>A CSS feature that should have never made into to production, and why you sh...</description><pubDate>Wed, 17 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p><em>Photo credit: Cover image by <a href="https://unsplash.com/@markuswinkler?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Markus Winkler</a> on <a href="https://unsplash.com/photos/silver-scissors-on-blue-surface-bNhCzmKZ_dI?utm_content=creditCopyText&#x26;utm_medium=referral&#x26;utm_source=unsplash">Unsplash</a>, example screenshots by James Edwards</em></p>
<h2 id="short-answer-no">Short answer: No</h2>
<p>Thereâs no benefit for the user to have truncated text and itâs a CSS feature which should have never made it into production in the first place.</p>
<h2 id="long-answer-no-you-should-not">Long answer: No, you should not</h2>
<p>While browsing through one of my favourite newsletters <a href="https://a11yweekly.com/">Accessibility Weekly</a>, I came across this article by <a href="https://www.tpgi.com/author/doug/">Doug Abrams</a>: <a href="https://www.tpgi.com/reflow-red-flags/">Reflow Red Flags</a>. This article is about <a href="https://www.w3.org/TR/WCAG21/#reflow">Success Criterion 1.4.10 Reflow</a>, but what caught my attention was the part about truncated text. Personally, I never saw a benefit in using it, because I always asked myself:</p>
<ul>
<li>Why would I obscure text information? If it has to be truncated, itâs obviously not that important.</li>
<li>So why not ditch the text or make it shorter?</li>
<li>If itâs for âconsistencyâ and âcorporate identityâ, itâs still not a good idea and shouldnât be done?</li>
</ul>
<p>Doug links to another article about this topic by <a href="https://www.tpgi.com/author/brothercake/">James Edwards</a>, called <a href="https://www.tpgi.com/the-ballad-of-text-overflow/">The Ballad of Text Overflow</a>. Here he showcases how bad truncated text for low vision users is.</p>
<p>Have a look at this screenshot, it shows truncated text in a width-constrained list of 640px viewport:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/truncated-list.CC49g0-v_Z20Vo2.webp" alt="A text list in which each item is truncated using text-overflow, so you can only read the first two or three words of each link, followed by an ellipsis." width="506" height="657" loading="lazy" decoding="async"></p>
<p>This one shows the same list 400% zoomed in, like low vision users might do:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/truncated.BhzuVuur_2gMmKQ.webp" alt="The same list viewed at 400% zoom, in which the text is so large that it&#38;#x27;s only possible to read the first few letters of each word." width="853" height="1200" loading="lazy" decoding="async"></p>
<p>This not only fails the success criterion mentioned earlier but could also fail <a href="https://www.w3.org/TR/WCAG/#info-and-relationships">Success Criterion 1.3.1 Info and Relationships</a>. So what are the alternatives to text truncation? Iâll leave you with a quote from James himself:</p>
<blockquote>
<p>The real answer here is not to rely on text truncation at all.
Designs should be flexible enough to accommodate any content they might have, in any viewport size (from 320px), and any increases in zoom (up to 400%).
This is not as challenging as it might sound.</p>
</blockquote></content:encoded><author>Steve Frenzel</author></item><item><title>Creating more inclusive workspaces</title><link>https://www.stevefrenzel.dev/blog/creating-more-inclusive-workspaces/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/creating-more-inclusive-workspaces/</guid><description>Usage of pronouns, how to address groups, inappropriate emojis and more.</description><pubDate>Fri, 12 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p><em>Image credit: <a href="https://affecttheverb.com/disabledandhere">Disabled And Here</a></em></p>
<p>When working with people from different cultures and countries, there are a few things you can keep in mind to ensure that everyone feels equally integrated. This short list of tips is based on my own experience and is not exhaustive. However, it provides a good starting point as most things are very easy to implement:</p>
<h2 id="table-of-contents">Table of contents</h2>
<ol>
<li><a href="#1-pronouns">Pronouns</a></li>
<li><a href="#2-addressing-a-group-of-people">Addressing a group of people</a></li>
<li><a href="#3-accessible-charts">Accessible charts</a></li>
<li><a href="#4-providing-subtitles">Providing subtitles</a></li>
<li><a href="#5-calling-someone-out">Calling someone out</a></li>
<li><a href="#6-using-inappropriate-words-or-emojis">Using inappropriate words or emojis</a></li>
</ol>
<h2 id="1-pronouns">1. Pronouns</h2>
<p>When talking about your customers or users, use the pronouns âthey/themâ instead of âhe/himâ or âshe/herâ. This will include everyone, even those who identify as neither male nor female. It also applies when your colleagues tell you which is their real pronoun.</p>
<p><a href="https://www.verywellmind.com/they-them-pronouns-7110726">They/Them Pronouns: What They Mean and When to Use Them</a></p>
<h2 id="2-addressing-a-group-of-people">2. Addressing a group of people</h2>
<p>Instead of using âguysâ, use âpeopleâ, âeveryoneâ or âfolksâ when speaking to a diverse group of people. This way everyone will feel addressed, as âguysâ is a rather masculine term.</p>
<p><a href="https://www.huffpost.com/entry/gendered-language-hey-guys_l_5f21b189c5b6b8cd63b0f331">Instead Of Saying âHey, Guys!â At Work, Try These Gender-Neutral Alternatives</a></p>
<h2 id="3-accessible-charts">3. Accessible charts</h2>
<p>When presenting charts, make sure that the content is not only conveyed through colors. You may have color-blind colleagues and they may have difficulty understanding the diagram.</p>
<p>Look at your diagram in black and white. Can you still easily grasp and relate all the information? If not, add shapes, additional text, or change the brightness of the colours to make them easier to distinguish.</p>
<p><a href="https://accessibility.psu.edu/images/charts/">Accessibility at Penn State | Charts &#x26; Accessibility</a></p>
<h2 id="4-providing-subtitles">4. Providing subtitles</h2>
<p>If you share audio or video files with your colleagues, make sure that everyone can understand the content. For example, if you are giving a presentation in Spanish, you can provide subtitles in English if that is the language spoken at work.</p>
<p>There are now several AI-based services that offer this quickly and easily. An investment that can not only increase productivity, but also reduce frustration! Here are three suggestions:</p>
<ul>
<li><a href="https://www.kapwing.com/subtitles">Kapwing</a></li>
<li><a href="https://www.veed.io/tools/auto-subtitle-generator-online">VEED.IO</a></li>
<li><a href="https://www.flexclip.com/tools/auto-subtitle/">FlexClip</a></li>
</ul>
<h2 id="5-calling-someone-out">5. Calling someone out</h2>
<p>When I read <a href="https://www.freecodecamp.org/news/learn-to-code-book/">How to Learn to Code &#x26; Get a Developer Job</a> by Quincy Larson, one sentence stuck with me: âPraise in public, criticise in private.â
How would you feel if one of your colleagues criticised you in front of the whole team, even if it was very polite? Even if itâs justified, it can be inappropriate to do it in this context. It makes them look like a bully and the other person might feel blindsided and exposed.</p>
<p>Instead, emphasise what the person has done well and discuss the critical things in private. This creates a safe space in which both people can concentrate on solving the problem without outside interference.</p>
<h2 id="6-using-inappropriate-words-or-emojis">6. Using inappropriate words or emojis</h2>
<p>Sometimes our counterpart may feel offended or hurt because we have used a certain word or emoji in the wrong context. If you want to get an overview of whether such words are in your everyday vocabulary, take a look at Self-Defined.</p>
<p>Here is a small selection of words that I often hear in my everyday life that can be replaced with less offensive alternatives:</p>
<ul>
<li><a href="https://www.selfdefined.app/definitions/crazy/">Crazy</a></li>
<li><a href="https://www.selfdefined.app/definitions/dumb/">Dumb</a></li>
<li><a href="https://www.selfdefined.app/definitions/r-word/">R-word</a></li>
</ul>
<p><em>Special thanks to <a href="https://mastodon.online/@AccordionBruce@mastodon.social">AccordionBruce</a> who <a href="https://mastodon.online/@stvfrnzl/111713731507258625">offered his help on Mastodon</a> for the research of this article. Go Canada! đšđŠđȘ</em></p></content:encoded><author>Steve Frenzel</author></item><item><title>TIDAL "Wrapped" 2023</title><link>https://www.stevefrenzel.dev/blog/tidal-wrapped-2023/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/tidal-wrapped-2023/</guid><description>My favorite tunes from the year Tina Turner died, Twitter turned X and mass shootings in the U.S. reached a new all-time high.</description><pubDate>Sun, 07 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p>Itâs a shame that TIDAL doesnât offer a summary at the end of the year like Spotify, but you can see which artists youâve streamed and how much each month. <a href="https://thenaturehero.com/tidal-rewind-2023/">Apparently this used to exist in the past</a> and was called âRewindâ, but that was before I switched. Letâs see what I listened to the most each month and what my personal album of the year is:</p>
<h2 id="january-2023">January 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/01-january.BF7Kwvaq_Z2kjDyj.webp" alt="Circa Survive with 188 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>âTwo Dreamsâ by Circa Survive was my soundtrack for the beginning of the year because it hit the spot with its melancholic but not too calm songs. I never really had the band on my radar, but Iâm glad I listened to it because I liked the cover so much. When Iâm working as a sound engineer at shows, I like to play this as the background music. Itâs just perfect for any occasion!</p>
<p><a href="https://songwhip.com/circa-survive/two-dreams">Listen to âTwo Dreamsâ by Circa Survive</a></p>
<h2 id="february-2023">February 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/02-february.QqTWratm_Z1quSrm.webp" alt="Graphic Nature with 80 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>I donât remember how I became aware of âA Mind Waiting To Dieâ by Graphic Nature, probably during the short time I had Instagram. Their producer <a href="https://www.sambloorproducer.com/">Sam Blood</a> had mentioned in an ask-me-anything that some of the songs were in Drop F (guitar tuning), which made me curious. When I describe the record to people I always say âSlipknot in cool and without clean singingâ and god damn it I love it. Itâs so heavy and such a great piece of art.</p>
<p><a href="https://songwhip.com/graphicnature/a-mind-waiting-to-die">Listen to âA Mind Waiting To Dieâ by Graphic Nature</a></p>
<h2 id="march-2023--july-2023">March 2023 &#x26; July 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/03-march-july.BhqIRjAz_SqcwV.webp" alt="Rival Consoles with 181 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>âNight Melody / Articulationâ by Rival Consoles is my go-to record when it comes to instrumental music for concentrated work. The soundscapes have a certain nostalgia and a slight Stranger Things charm that is perfect for getting into the âtunnelâ. Iâve tried listening to lo-fi while coding but itâs too clichĂ© and too random. I need that certain something only Rival Consoles can give me!</p>
<p><a href="https://songwhip.com/rival-consoles/night-melody-articulation">Listen to âNight Melody / Articulationâ by Rival Consoles</a></p>
<h2 id="april-2023">April 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/04-april.D2R0o-5C_Z14pdRz.webp" alt="Arms And Sleepers with 41 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>I havenât listened to much music this month and I wasnât picky about what was on at work. I guess after Rival Consoles came random songs that were supposed to fit and at some point âKiss Tomorrow Goodbyeâ by Arms And Sleepers came on and I listened to it on repeat. If youâre a fan of Massive Attack, you should definitely check out this record:</p>
<p><a href="https://songwhip.com/arms-and-sleepers/the-organ-hearts">Liste to âThe Organ Heartsâ by Arms And Sleepers</a></p>
<h2 id="may-2023">May 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/05-may.YENEqSuT_1GqNB2.webp" alt="Lambert with 88 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>âFalseâ by Lambert stands out from the discography for me, as it is very percussive and experimental by his standards. Another record to get into the âtunnelâ without being too intrusive or too boring.</p>
<p><a href="https://songwhip.com/lambert/false">Listen to âFalseâ by Lambert</a></p>
<h2 id="june-2023">June 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/06-june.DJ5IY3-Y_Z8Gwg5.webp" alt="Meshuggah with 81 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>That month I saw Meshuggah live for the third time, as the last band at the Rock am Ring Festival at midnight. Seeing this band at their own shows at an earlier time is already a different experience, but this gig was something very special. They just get better every time I see them live, especially visually. I donât like all of their albums, but thereâs one that always works any time of year or day:</p>
<p><a href="https://songwhip.com/meshuggah/catch-thirty-three">Listen to âCatch Thirty Threeâ by Meshuggah</a></p>
<h2 id="august-2023">August 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/08-august.BqAMOHQL_Z1ILlKE.webp" alt="Post Malone with 84 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>I never missed the hype surrounding him, but the music never caught my attention. That was until I heard âAUSTINâ for the first time. Itâs definitely the best pop album of this year for me, almost every song has vocal melodies that burn into my brain without being annoying. Iâm very impressed that such a well-known artist can write such good songs that sound like him and donât too obviously follow a certain formula.</p>
<p><a href="https://songwhip.com/post-malone/austin">Listen to âAUSTINâ by Post Malone</a></p>
<h2 id="september-2023">September 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/09-september.C7ydM4oL_Z19MgRB.webp" alt="Slowdive with 105 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>How I was looking forward to âeverything is aliveâ by Slowdive and was almost not disappointed! They are THE band of the shoegaze genre for a reason. I feel a physical sense of well-being when I listen to this record and immerse myself in the warm reverb of their guitars. Only âAndalusia playsâ is a song that bores me a lot and I always skip it, otherwise this record is perfect!</p>
<p><a href="https://songwhip.com/slowdive/everything-is-alive">Listen to âeverything is aliveâ by Slowdive</a></p>
<h2 id="october-2023">October 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/10-october.B7v-FQTp_2avISm.webp" alt="Charley Crockett with 174 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>Felt like I havenât listened to anything else in the last quarter, so Iâm surprised it didnât get the most streams from me. đ
Iâve always wanted to dip my foot in the country water, but always found it too corny from a lyrical and / or musical perspective. Thanks to a personal recommendation I discovered him and find his live albums better than the studio version, similar to Johnny Cash. If you like blues mixed with country and a pinch of jazz, give it a listen:</p>
<p><a href="https://songwhip.com/charley-crockett/live-from-the-ryman">Listen to âLive from the Rymanâ by Charley Crockett</a></p>
<h2 id="november-2023">November 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/11-november.DXekPCgH_1tyl4Q.webp" alt="Christian Löffler with 84 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>âParallels: Shellac Reworksâ by Christian Löffler is another record that popped up after my regular selection and stuck. The perfect music for the gray, rainy German autumn. What fascinates me about this record is that the samples sound kind of creepy, also because they sometimes donât fit the timing and key of the rest of the songâŠ</p>
<p><a href="https://songwhip.com/christian-loffler/parallelsshellacreworksbychristianloffler">Liste to âParallels: Shellac Reworksâ by Christian Löffler</a></p>
<h2 id="december-2023">December 2023</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/12-december.CSesiJcN_1d0JmS.webp" alt="Sleep Token with 34 streams" width="1080" height="1680" loading="lazy" decoding="async"></p>
<p>What would a musical review of the year be without âTake Me Back To Edenâ by Sleep Token, eh? Even though I think the hype is justified, as an album itâs not as strong as âSundowningâ for me. The songs are either REALLY rad or just meh. âChokeholdâ isnât just the best Sleep Token song, itâs simply the best song of 2023.</p>
<p><a href="https://songwhip.com/sleep-token/take-me-back-to-eden">Listen to âTake Me Back To Edenâ by Sleep Token</a></p>
<h2 id="award-ceremony">Award ceremony</h2>
<p>Hm⊠Rival Consoles doesnât really count for me because I havenât actively listened to it, so Iâd pick the three winners as follows:</p>
<ul>
<li>1st place: Circa Survive đ„</li>
<li>2nd place: Charley Crockett đ„</li>
<li>3rd place: Slowdive đ„</li>
</ul>
<p>That looks better and two of the artists have even released a album in 2023. đ
Looking at these artists, I can safely say that a lot has been going on musically in the last year. A very diverse list!</p></content:encoded><author>Steve Frenzel</author></item><item><title>My thoughts on accessibility overlays</title><link>https://www.stevefrenzel.dev/blog/my-thoughts-on-accessibility-overlays/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/my-thoughts-on-accessibility-overlays/</guid><description>Predicting what will happen and a couple useful links.</description><pubDate>Fri, 05 Jan 2024 00:00:00 GMT</pubDate><content:encoded><p>I predict that Overlay vendors will make a lot of money with their false promise of adding a widget (with AI) to solve all accessibility problems.</p>
<p>Once the first lawsuit comes in because they do not work and worsen the accessibility of a website, users will start suing website owners. In return web site owners aka companies will start suing overlay vendors because they got sued (who couldâve known).</p>
<p>Then comes the part where they hire professionals to ACTUALLY fix their problems.</p>
<h2 id="related-links">Related links</h2>
<ul>
<li>
<p><a href="https://commission.europa.eu/resources-partners/europa-web-guide/design-content-and-development/accessibility/testing-early-and-regularly/accessibility-overlays_en">European commission on accessibility overlays</a>: Itâs nice to have it in writing from a big institution that these widgets are scams and will make it worse for certain users.</p>
</li>
<li>
<p><a href="https://yatil.net/blog/level-access-userway">Level Access crosses the line; buys accessibility overlay company</a>: Eric Eggert sharing his thoughts about a accessibility acquiring an overlay vendor, with many useful links.</p>
</li>
<li>
<p><a href="https://www.levelaccess.com/blog/the-many-pitfalls-of-accessibility-overlays/">The Many Pitfalls of Accessibility Overlays</a>: This company wrote an article more than three years ago why these overlays are bad⊠I expect it to be gone soon, so I attached a screenshot.</p>
</li>
<li>
<p><a href="https://karlgroves.com/the-financial-argument-for-using-an-outside-firm-for-accessibility-remediation/">The financial argument for using an outside firm for accessibility remediation</a>: Somewhat related to the topic, as this is about hiring a person to hand accessibility, no relying just on a widget. Also comes with ROI formulas!</p>
</li>
</ul></content:encoded><author>Steve Frenzel</author></item><item><title>The great confusion: Links & Buttons</title><link>https://www.stevefrenzel.dev/blog/great-confusion-links-and-buttons/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/great-confusion-links-and-buttons/</guid><description>Me trying to explain the key differences between links, anchors and buttons.</description><pubDate>Fri, 11 Aug 2023 00:00:00 GMT</pubDate><content:encoded><p>Itâs fascinating to see how people can get creative when it comes to making a link look (and work) like a button and vice versa. Both elements couldnât be more different from each other and yet many web designers and developers seem to think it doesnât matter which to use for what.</p>
<p>But when we talk about links, weâre actually talking about anchor elements. So letâs get some facts straight before using a really helpful analogy.</p>
<h2 id="1-the-actual-link-element">1. The (actual) link element</h2>
<p>Are you currently creating the look of a link for your design system? Have you implemented the newly designed link and handing it over for testing? I really doubt it, because this element wonât be visible to your users and is yet very important. Hereâs the description from MDN:</p>
<blockquote>
<p><em>The <code>&#x3C;link></code> HTML element specifies relationships between the current document and an external resource. This element is most commonly used to link to stylesheets, but is also used to establish site icons (both âfaviconâ style icons and icons for the home screen and apps on mobile devices) among other things.</em></p>
</blockquote>
<p>And hereâs what it looks like (also from <a href="https://developer.mozilla.org/">MDN</a>):</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">link</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"/media/examples/link-element-example.css"</span><span style="color:#B392F0"> rel</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"stylesheet"</span><span style="color:#E1E4E8"> /></span></span>
<span class="line"></span></code></pre>
<p>Now thatâs curios, isnât it! Because all this time you and maybe your entire company were referring to something that has absolutely nothing to do with what your talking about. What you actually meant was</p>
<h2 id="2-the-anchor-element">2. The anchor element</h2>
<p>This work horse is what getâs the job done and it comes with tons of functionality and screen reader support out-of-the-box. But donât take my word for it, hereâs how MDN describes it:</p>
<blockquote>
<p><em>The anchor HTML element (or anchor element), with its href attribute, creates a hyperlink to web pages, files, email addresses, locations in the same page, or anything else a URL can address. Content within each anchor should indicate the linkâs destination. If the href attribute is present, pressing the enter key while focused on the anchor element will activate it.</em></p>
</blockquote>
<p>Hereâs what an anchor element looks like. It might be a bit underwhelming but let me tell you in just a bit of all the things it can do:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"https://stevefrenzel.dev"</span><span style="color:#E1E4E8">>Website&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>Do you want it to open an e-mail client with a pre-filled recipient, subject and body? Start your <code>href</code> string with <code>mailto:</code> and adjust it accordingly. Do you want it to make it very easy to call a certain number when clicking on it? Add the <code>tel:</code> attribute, the respective telephone number and youâre good to go. Do you want it to download a file when clicking on it? Add the <code>download</code> attribute, as well as the file path and YOU ARE GOLDEN. đ€©</p>
<p>All this functionality comes without any JavaScript, by the way. The anchor element is a real bang for the buck! Letâs have a brief look at the last member of this love triangle:</p>
<h2 id="3-the-button-element">3. The button element</h2>
<p>Youâre probably on the internet at least once a day, so chances are high you visited a website were some dreadful cookie banner asked for your consent. The rectangle saying âAgreeâ, which makes you give up all your privacy rights? Thatâs a button! And hereâs what MDN has to say about it:</p>
<blockquote>
<p><em>The button HTML element is an interactive element activated by a user with a mouse, keyboard, finger, voice command, or other assistive technology. Once activated, it then performs an action, such as submitting a form or opening a dialog.</em></p>
</blockquote>
<p>Button example from MDN:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">button</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"favorite styled"</span><span style="color:#B392F0"> type</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"button"</span><span style="color:#E1E4E8">>Add to favorites&#x3C;/</span><span style="color:#85E89D">button</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>Pay extra attention to the part saying âperforms an actionâ. To simplify: A button does something. A link takes you somewhere.</p>
<h2 id="4-the-analogy">4. The analogy</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/flow-chart.CvSu1EpB_1NtPrM.webp" alt="Flow chart showing the difference between a button and link (which is an anchor element): It&#38;#x27;s a button. No. If not, then it&#38;#x27;s a link. Sure. That&#38;#x27;s it." width="1024" height="576" loading="lazy" decoding="async"></p>
<p>This flow chart was taken from the article <a href="https://www.smashingmagazine.com/2019/02/buttons-interfaces/">When Is A Button Not A Button</a> by <a href="https://www.smashingmagazine.com/author/vadim-makeev/">Vadim Makeev</a>. As you can see, in their default form, they look very different from each other. You may also noticed that Vadim is calling it a link, even though heâs showing an anchor element. Is it correct? No, but it makes sense because people will understand what heâs talking about.</p>
<p>This ânaming conventionâ is so common, that I also notice it in Notion and Storyblok, which I use for writing and publishing my blog posts. Have a look at the screenshots:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/screenshot-1.DBnC6zUL_9oyC5.webp" alt="Overlay in Storyblok showing the options for adding a link, although it&#38;#x27;s actually an anchor element." width="1248" height="586" loading="lazy" decoding="async"></p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/screenshot-2.-UhlOlMR_25kgwR.webp" alt="Screenshot showing a toolbar in the Notion app offering to turn the marked text into a link (which is actually an anchor element)." width="2308" height="642" loading="lazy" decoding="async"></p>
<p>To make the difference between links, anchors and buttons easier to understand, I came up with the analogy of switching a light on:</p>
<ul>
<li>Link: This is how your lightbulb is decorated. đĄ</li>
<li>Anchor: The wires leading from the lightbulb to the button. đ</li>
<li>Button: Itâs the button for switching it on or of. Surprise! ⥠ïž</li>
</ul>
<p>Even though their purposes are very different, how come we not only misuse them but also use the wrong names when describing them? Before exploring these issues, letâs talk about the looks of these elements.</p>
<h2 id="5-the-problem">5. The problem</h2>
<p>I would say it is a chain of events that leads to this great confusion. It starts with the fact that we often use the wrong name. Instead of anchor, we say link element. It continues with the fact that in the design, anchor elements are made to look like buttons and the other way around.</p>
<p>This in itself is not too big a problem, as long as the correct HTML elements are used in the implementation. Although it would be nice if theyâd look like theyâre supposed to look. Here is usually when people get really creative and give an anchor element the functionality of a button (and the other way around). To illustrate this, here are a few of the wildest examples from real websites:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="html"><code><span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> type</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"button"</span><span style="color:#B392F0"> class</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"button"</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"/signup"</span><span style="color:#B392F0"> tabindex</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"-1"</span><span style="color:#E1E4E8">>Sign up&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"#"</span><span style="color:#B392F0"> onclick</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">modal</span><span style="color:#9ECBFF">.</span><span style="color:#B392F0">open</span><span style="color:#9ECBFF">()"</span><span style="color:#E1E4E8">>Login&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">&#x3C;</span><span style="color:#85E89D">a</span><span style="color:#B392F0"> href</span><span style="color:#E1E4E8">=</span><span style="color:#9ECBFF">"https://example.com"</span><span style="color:#E1E4E8">>&#x3C;</span><span style="color:#85E89D">button</span><span style="color:#E1E4E8">>Example&#x3C;/</span><span style="color:#85E89D">button</span><span style="color:#E1E4E8">>&#x3C;/</span><span style="color:#85E89D">a</span><span style="color:#E1E4E8">></span></span>
<span class="line"></span></code></pre>
<p>These examples are from <a href="https://www.htmhell.dev/">HTMLHell</a>, one of my favourite websites for having a laugh and weeping at the same time because it is quite unbelievable.</p>
<h2 id="6-conclusion">6. Conclusion</h2>
<p>This article is supposed to inform you about the key differences between links, anchors and buttons. Itâs also a way for me to think out loud why thereâs so much confusion and wrong usage of these elements. What could be your takeaway?</p>
<p>Next time when youâre communicating with your team, you could start using the term âanchorâ instead of âlinkâ. If this raises any eyebrows, you now have the knowledge to explain the differences between these two.</p></content:encoded><author>Steve Frenzel</author></item><item><title>How the Washington Post design system made me learn about Perceptual Contrast (APCA)</title><link>https://www.stevefrenzel.dev/blog/learning-about-perceptual-contrast/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/learning-about-perceptual-contrast/</guid><description>Using the Accessible Perceptual Contrast Algorithm on a real world example.</description><pubDate>Sun, 06 Aug 2023 00:00:00 GMT</pubDate><content:encoded><p><em>Disclaimer: All screenshots in this article were taken on macOS Ventura 13.4.1, in Arc Browser 1.2.1. I have the dark theme as default, which is why the website was rendered accordingly. Depending on what settings you have, the site will be rendered with the light theme.</em></p>
<p>Recently someone pointed me to the <a href="https://build.washingtonpost.com/resources/accessibility">design system of the Washington Post</a>, especially the part about accessibility. What I noticed immediately was the poor readability of the body text and anchor elements:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/wp-screenshot-1.DWTLqKH__Zm3r1A.webp" alt="Screenshot of a section about color contrast standards for the Washington Post Design System. It has a black background, white headlines but dark grey body text and links." width="1577" height="1000" loading="lazy" decoding="async"></p>
<p>So I went to the <a href="https://build.washingtonpost.com/resources/accessibility/color">Color</a> section and saw that the Washington Postâs minimum requirement is the level AA standard:</p>
<blockquote>
<p><em>The Postâs <a href="https://www.washingtonpost.com/accessibility/">accessibility statement</a> notes that we are guided by the <a href="https://www.w3.org/WAI/WCAG21/quickref/?showtechniques=143">WCAG 2.1 Level AA standard</a>. However, we strongly encourage meeting the <a href="https://www.w3.org/WAI/WCAG21/quickref/?showtechniques=143%2C146">level AAA standard</a> whenever possible.</em></p>
</blockquote>
<p>If I want to make automatic accessibility checks in the browser very quickly, I use the Stark extension. Here my assumption was confirmed that despite poor readability almost all requirements were met:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/wp-screenshot-2.CVLmmdSi_Zg32H5.webp" alt="Screenshot of the Washington Post Design System with the Stark browser extension open. It shows a contrast ratio of 5.62 to 1 for the body text." width="1577" height="1000" loading="lazy" decoding="async"></p>
<p>To get a second opinion, I switched to APCA (Advanced Perceptual Contrast Algorithm). Lo and behold, the requirements for âLarge textâ and âBody textâ were not met. You can read more about it in this article: <a href="https://www.getstark.co/blog/stark-APCA-beta">Announcing Starkâs APCA beta</a>.</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/wp-screenshot-3.Alg6Gkp5_ZbfqNn.webp" alt="Screenshot of the Washington Post Design System with the Stark browser extension open. It shows a APCA value of -37." width="1577" height="1000" loading="lazy" decoding="async"></p>
<p>If you switch to the light theme, the criterion for âLarge textâ is met, but not for âBody textâ:</p>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/wp-screenshot-4.DadL7lRG_Z1RT1Hs.webp" alt="Screenshot of the Washington Post Design System light theme with the Stark browser extension open. It shows a APCA value of 78." width="1577" height="1000" loading="lazy" decoding="async"></p>
<p>It is very important to say that the APCA value is not yet an official reference, but rather can be understood as another tool to check color contrast. However, I was interested in the details of what these numbers are all about and how to understand them. On <a href="https://git.apcacontrast.com/documentation/WhyAPCA">Why APCA as a New Contrast Method?</a> there is a simplified listing of the different levels, which are also partly found in the Stark extension (Lc stands for lightness contrast):</p>
<blockquote>
<ul>
<li>Lc 90: Preferred level for fluent text and columns of body text with a font no smaller than 14px/weight 400 (normal).</li>
<li>Lc 75: The minimum level for columns of body text with a font no smaller than 18px/400. L 75 should be considered a minimum for text where readability is important.</li>
<li>Lc 60: The minimum level recommended for content text that is not body, column, or block text. In other words, text you want people to read. The minimums: 24px normal weight (400) or 16px/700 (bold). These values based on the reference font Helvetica.</li>
<li>Lc 45: The minimum for larger, heavier text (36px normal weight or 24px bold) such as headlines. This is also the minimum for pictograms with fine details.</li>
<li>Lc 30: The absolute minimum for any text not listed above. This includes placeholder text and disabled element text. This is also the minimum for large/solid semantic &#x26; understandable non-text elements.</li>
<li>Lc 15: The absolute minimum for any non-text that needs to be discernible and differentiable, and is no less than 6px in its smallest dimension. This may include disabled large buttons. <strong>Designers should treat anything below this level as invisible</strong>, as it will not be visible for many users. This minimum level should be avoided for any items important to the use, understanding, or interaction of the site.</li>
</ul>
</blockquote>
<p>One last question I have is what the minus in the APCA score is all about. On the screenshots with the dark theme the value -37 is displayed and on the one with the light theme the value 78. I understand that a positive value is displayed when the text is darker than the background and vice versa. If you want to try it yourself, have a look at the <a href="https://www.myndex.com/APCA/">APCA Contrast Calculator</a>.</p>
<p><strong>Conclusion: It is unclear when APCA will become an official standard for accessibility. Still, itâs a good tool to get feedback on the extent to which color contrasts are perceived âin the real worldâ. For me personally, the different levels (see quote above) are less abstract than the level A, AA and AAA classifications.</strong></p></content:encoded><author>Steve Frenzel</author></item><item><title>The six most common accessibility issues on the web</title><link>https://www.stevefrenzel.dev/blog/six-most-common-accessibility-issues/</link><guid isPermaLink="true">https://www.stevefrenzel.dev/blog/six-most-common-accessibility-issues/</guid><description>When creating a website or fixing one, look for these issues: Low contrast text, missing alternative text, empty links, missing form labels, empty buttons and missing document language.</description><pubDate>Sat, 24 Jun 2023 00:00:00 GMT</pubDate><content:encoded><p>The screenshot above was taken on the <a href="https://webaim.org/projects/million/#errors">The WebAIM Million</a> website from their 2023 report. I added the percentages for a better understanding.</p>
<p>Accessibility is a crucial aspect of web design, ensuring that everyone can access and use your website. However, it is often overlooked or considered secondary to other design elements. Wether youâre just getting started with this topic or want to dive deeper, the <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility">accessibility tutorial on MDN</a> is a great resource!</p>
<p>Many accessibility issues are low-hanging fruits and easy to fix with a bit of effort and attention. Also accessibility and SEO (search engine optimization) go hand in hand. So the more accessible your website, the higher are the chances for a great ranking on search engines. The first five images are screenshots from the <a href="https://inaccessible.gallery/">Inaccessible Gallery</a> by <a href="https://www.matuzo.at/">Manuel Matuzovic</a>.</p>
<h2 id="1-low-contrast-text">1. Low Contrast Text</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/exhibit-1.CVEE0gtn_Yetc4.webp" alt="Example from Inaccessible Gallery showcasing low contrast text" width="2240" height="1054" loading="lazy" decoding="async"></p>
<p>The problem: Low contrast text is when there is not enough contrast between the text and the background, making it difficult to read for people with visual impairments.</p>
<p>The solution: Increase the contrast by using darker / lighter text or background color. There are two great tools out there for checking the color contrast ratio:</p>
<ul>
<li><a href="https://webaim.org/resources/contrastchecker/">Contrast Checker by WebAIM</a></li>
<li><a href="https://www.tpgi.com/color-contrast-checker/">Colour Contrast Analyser by TPGi</a></li>
</ul>
<h2 id="2-missing-alternative-text">2. Missing Alternative Text</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/exhibit-2.BvWzCVE__kaqTC.webp" alt="Example from Inaccessible Gallery showcasing missing alternative text" width="2240" height="1516" loading="lazy" decoding="async"></p>
<p>The problem: Alternative text, or alt text, is a description of an image that is read by screen readers for people with visual impairments. When itâs missing or not descriptive enough, people will have no clue what itâs about or for.</p>
<p>The solution: When using a CMS, look for an option called âalternative textâ or âalt textâ when uploading your image. When coding, add it to the image element via alt=âYour image descriptionâ. If itâs purely decorative, just add alt="" and youâre good to go!</p>
<h2 id="3-empty-links">3. Empty Links</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/exhibit-3.CAk3MTRT_Z14X6Je.webp" alt="Example from Inaccessible Gallery showcasing empty links" width="2240" height="1280" loading="lazy" decoding="async"></p>
<p>The problem: Empty links are links that contain no text, only an image or icon. This is a common issue for social media icons or download links.</p>
<p>The solution: Add descriptive text to the link that describes the action or destination of it. This will help screen readers understand the purpose of the link.</p>
<h2 id="4-missing-form-labels">4. Missing Form Labels</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/exhibit-4.C7pjXD9K_1JnIBk.webp" alt="Example from Inaccessible Gallery showcasing missing form labels" width="2240" height="1089" loading="lazy" decoding="async"></p>
<p>The problem: Forms that are missing labels make it difficult for users to understand what information is required. Often instead of labels, placeholders are being used to convey meaning. This is not sufficient, because once you start typing, the placeholder will be gone.</p>
<p>The solution: Add descriptive labels to form fields. This helps screen readers provide a more meaningful experience to visually impaired users, as well as people with no impairment. More information about the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/label">label element</a> can be found on MDN.</p>
<h2 id="5-empty-buttons">5. Empty Buttons</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/exhibit-5.a3z8N5JF_12SrG8.webp" alt="Example from Inaccessible Gallery showcasing empty buttons" width="2240" height="1139" loading="lazy" decoding="async"></p>
<p>The problem: Empty buttons are buttons that contain no text, only an image or color. This is pretty much the same problem as with empty links.</p>
<p>The solution: Add descriptive text to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button">button element</a> to determine the action of it. This will help everyone to understand what the button is for. Do not use only an image or color to convey meaning. If you cannot (for whatever reason) add text to the button, use the <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-label">aria-label</a> to add it. This will at least make it possible for screen reader users to understand what itâs for.</p>
<h2 id="6-missing-document-language">6. Missing Document Language</h2>
<p><img ="" src="https://www.stevefrenzel.dev/_astro/language-flowers.BCaXqRFh_Z1V1T6e.webp" alt="Collection of flower illustrations saying goodbye in different languages" width="1000" height="618" loading="lazy" decoding="async"></p>
<p>The problem: Missing document language can be a common issue, but it is easy to fix.</p>
<p>The solution: Simply add the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang">language attribute</a> to the HTML tag of your website. This helps screen readers provide a more meaningful experience to visually impaired users who use screen readers in a specific language. If there are sections (for example a quote) that have a different language than the rest of the site, add the lang attribute here and adjust it accordingly.</p>
<h2 id="conclusion">Conclusion</h2>
<p>By addressing these six common accessibility issues, you can make your website more inclusive and accessible to everyone. The best part is, that all of these issues are low-hanging fruits and can be fixed with a bit of effort and attention.</p></content:encoded><author>Steve Frenzel</author></item></channel></rss>