<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: a11ySolutions</title>
    <description>The latest articles on Forem by a11ySolutions (@a11ysolutions).</description>
    <link>https://forem.com/a11ysolutions</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3891044%2F5e091ec5-d07a-4d4f-b5dc-81adb3053f59.jpg</url>
      <title>Forem: a11ySolutions</title>
      <link>https://forem.com/a11ysolutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/a11ysolutions"/>
    <language>en</language>
    <item>
      <title>3 accessibility failures we find in every fintech onboarding flow.</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Tue, 26 May 2026 09:54:50 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/3-accessibility-failures-we-find-in-every-fintech-onboarding-flow-12k6</link>
      <guid>https://forem.com/a11ysolutions/3-accessibility-failures-we-find-in-every-fintech-onboarding-flow-12k6</guid>
      <description>&lt;p&gt;We audited several fintech onboarding flows this quarter. Different companies, different stacks, different teams.&lt;/p&gt;

&lt;p&gt;Same three issues. Every time.&lt;/p&gt;

&lt;p&gt;None of them appeared in automated scans. All of them showed up in the first 30 minutes of expert review. Here's what they are and how to fix them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue #1 — Email field with no visible label&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The field looks fine visually. There's placeholder text that says "Enter your email." But there's no &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; element connected to it.&lt;/p&gt;

&lt;p&gt;For a screen reader user, the field is either announced without context or skipped entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yd4y9xgrjjoqmt3j56h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9yd4y9xgrjjoqmt3j56h.png" alt="HTML code showing a label element connected to an email input field using matching for and id attributes" width="594" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you can't modify the label structure, use &lt;code&gt;aria-label&lt;/code&gt; as a fallback:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxoewkxee2z61wj4wyao0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxoewkxee2z61wj4wyao0.png" alt="HTML code showing an email input field using aria-label attribute as an accessible name fallback" width="606" height="76"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test with NVDA + Chrome:&lt;/strong&gt;&lt;br&gt;
Tab into the field. NVDA should announce "Email address, edit text." If it announces only "edit text" or nothing, you have this issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue #2 — Password validation that disappears&lt;/strong&gt;&lt;br&gt;
The error message appears when the user types a weak password, then vanishes after a second. Sighted users catch it. Users with low vision or screen readers miss it entirely.&lt;/p&gt;

&lt;p&gt;The fix is to use &lt;code&gt;aria-live&lt;/code&gt; so assistive technology announces the message when it appears:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0nsfffe7v0a0t8ldfpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy0nsfffe7v0a0t8ldfpx.png" alt="HTML code showing a div element with aria-live set to polite used to announce password validation messages to screen readers" width="528" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then inject the validation message into that container via JavaScript. The screen reader will announce it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt;&lt;br&gt;
Trigger the validation error. If NVDA doesn't announce the message out loud, you have this issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Issue #3 — Continue button unreachable via Tab on mobile&lt;/strong&gt;&lt;br&gt;
The button exists in the DOM. It looks tappable. But keyboard and switch access users on mobile can't reach it because focus order is broken or the element isn't natively focusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Use a native &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; element instead of a styled &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;. Native buttons are focusable and keyboard-operable by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkpvi88i2jfplga5o3q6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flkpvi88i2jfplga5o3q6.png" alt="HTML code comparing an inaccessible div element used as a button versus a native button element that is keyboard focusable by default" width="623" height="168"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you must use a custom element, add &lt;code&gt;tabindex="0"&lt;/code&gt; and handle keyboard events explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test:&lt;/strong&gt;&lt;br&gt;
On mobile, connect a Bluetooth keyboard. Tab through the form. If you can't reach the Continue button, you have this issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick checklist before you ship an onboarding flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every input has a visible, connected &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Error messages use &lt;code&gt;aria-live&lt;/code&gt; or &lt;code&gt;role="alert"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;All interactive elements are reachable via Tab&lt;/li&gt;
&lt;li&gt;No action depends exclusively on placeholder text&lt;/li&gt;
&lt;li&gt;The flow is testable with NVDA or VoiceOver in under 10 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;These issues don't show up in automated scans.&lt;/strong&gt;&lt;br&gt;
Automated tools check structure. They don't simulate how a real user navigates with a screen reader, a keyboard, or a switch device. That's what expert audits are for.&lt;/p&gt;

&lt;p&gt;If you want to know whether your onboarding has these issues, start here.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Your accessibility fixes are good. But do you know what they're worth?</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Thu, 21 May 2026 09:04:28 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/your-accessibility-fixes-are-good-but-do-you-know-what-theyre-worth-2igk</link>
      <guid>https://forem.com/a11ysolutions/your-accessibility-fixes-are-good-but-do-you-know-what-theyre-worth-2igk</guid>
      <description>&lt;p&gt;I put together a visual breakdown of this concept as a LinkedIn carousel -&lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7463121450070212609" rel="noopener noreferrer"&gt;https://www.linkedin.com/feed/update/urn:li:activity:7463121450070212609&lt;/a&gt; before diving into the full article.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The audit is not the full picture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You've run the audit. Fixed the contrast ratios. Added the missing alt text. Resolved the keyboard trap on that modal that's been broken for six months.&lt;/p&gt;

&lt;p&gt;WCAG compliance is checked. The report is clean.&lt;/p&gt;

&lt;p&gt;And then someone from product or leadership asks:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Great — but what did that actually do for the business&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most developers don't have a good answer to that question. Not because the work isn't valuable, it is, but because no one built the bridge between the technical fix and the business outcome.&lt;/p&gt;

&lt;p&gt;This article is that bridge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The drop-offs your analytics will never show you&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's something worth understanding about accessibility failures: most of them are invisible to standard tracking.&lt;/p&gt;

&lt;p&gt;When a screen reader user hits a form that doesn't announce validation errors, they don't trigger an error event. They just stop. When a keyboard user encounters a focus trap inside a modal they can't escape, there's no rage click, no heatmap signal, no session recording that captures what happened.&lt;/p&gt;

&lt;p&gt;They leave. Quietly. Before your funnel even starts.&lt;/p&gt;

&lt;p&gt;This is the category of lost revenue that never appears in any dashboard, and it's directly caused by inaccessible components.&lt;/p&gt;

&lt;p&gt;A broken &lt;code&gt;aria-live&lt;/code&gt; region. A missing &lt;code&gt;role="alert"&lt;/code&gt;. A date picker built without keyboard support. A checkout button that's visually styled but not semantically a button.&lt;/p&gt;

&lt;p&gt;These aren't edge cases. They're patterns that repeat across almost every production codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility barriers are conversion failures&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The framing matters here.&lt;/p&gt;

&lt;p&gt;When you fix a focus management issue, you're not just passing a WCAG 2.1 success criterion. You're removing a barrier that was preventing a subset of your users from completing a critical task, booking, purchasing, registering, submitting.&lt;/p&gt;

&lt;p&gt;That subset is larger than most teams assume. It includes users with permanent disabilities, but also users on keyboard-only setups, users with temporary injuries, power users who tab through forms, and older users who rely on larger text and higher contrast.&lt;/p&gt;

&lt;p&gt;When that barrier is removed, task completion goes up. And task completion is conversion.&lt;/p&gt;

&lt;p&gt;The technical fix and the business outcome are the same event, most teams just never measure them together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to calculate what your accessibility work is actually worth&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is where it gets concrete.&lt;/p&gt;

&lt;p&gt;The variables that determine the revenue impact of accessibility remediation are the same variables your analytics team already tracks:&lt;/p&gt;

&lt;p&gt;Monthly traffic, conversion rate, average order value, and industry sector.&lt;/p&gt;

&lt;p&gt;What changes when you improve accessibility is the effective conversion rate, because you're removing friction that was silently blocking a portion of your users from completing the flow.&lt;/p&gt;

&lt;p&gt;We built a free ROI calculator that takes exactly those inputs and returns a projected revenue impact based on verified industry data, not generic estimates, but numbers calibrated to your traffic, your conversion rate, and your sector.&lt;/p&gt;

&lt;p&gt;👉 Calculate the ROI of your accessibility work -&lt;a href="https://www.a11ysolutions.com/roi-calculator/" rel="noopener noreferrer"&gt;https://www.a11ysolutions.com/roi-calculator/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No sign-up. No pitch. Just your number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this matters beyond the ticket&lt;/strong&gt;&lt;br&gt;
If you're a developer who cares about accessibility, and if you're reading this, you probably do, you already know the work is worth doing.&lt;/p&gt;

&lt;p&gt;But knowing how to communicate its value to a product manager, a CTO, or a leadership team is a different skill. And it's one that determines whether accessibility stays a priority after the first audit, or gets deprioritized when the next quarter's roadmap fills up.&lt;/p&gt;

&lt;p&gt;The ROI calculator doesn't replace your expertise. It gives your work a language that the rest of the organization understands.&lt;/p&gt;

&lt;p&gt;Run it before your next sprint review. Share the number with your product lead. It's a two-minute exercise that can change how accessibility is resourced on your team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Accessibility fixes reduce friction. Reduced friction improves conversion. Improved conversion is measurable revenue.&lt;/p&gt;

&lt;p&gt;The chain is direct. Most teams just never close the loop.&lt;/p&gt;

&lt;p&gt;Now you can.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.a11ysolutions.com/roi-calculator/" rel="noopener noreferrer"&gt;https://www.a11ysolutions.com/roi-calculator/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>ux</category>
    </item>
    <item>
      <title>Accessible error messages: the patterns that work across JAWS, NVDA and VoiceOver</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Mon, 18 May 2026 11:36:38 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/accessible-error-messages-the-patterns-that-work-across-jaws-nvda-and-voiceover-1b5n</link>
      <guid>https://forem.com/a11ysolutions/accessible-error-messages-the-patterns-that-work-across-jaws-nvda-and-voiceover-1b5n</guid>
      <description>&lt;p&gt;You added &lt;code&gt;aria-live="assertive"&lt;/code&gt;. You set &lt;code&gt;aria-invalid="true"&lt;/code&gt;. You tested in Chrome with a mouse.&lt;/p&gt;

&lt;p&gt;The error message works perfectly.&lt;/p&gt;

&lt;p&gt;Then a JAWS user fills out your form and hears... nothing useful. Or worse,they hear the error, but by the time they navigate back to the field, the message is gone.&lt;/p&gt;

&lt;p&gt;Two real cases from audits that show exactly where this breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1: The toast that disappeared before the user could act&lt;/strong&gt;&lt;br&gt;
An e-learning platform displayed validation errors as auto-dismissing toasts with &lt;code&gt;data-delay="8000"&lt;/code&gt;. Eight seconds sounds reasonable until you map what a screen reader user actually needs to do: hear the announcement, understand the error, navigate back to the field, correct it, re-submit. On a complex form, that's not enough time, and the message was gone before they could act.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WCAG failure: SC 2.2.1 — Timing Adjustable.&lt;/strong&gt; Any time limit must be removable or adjustable. An 8-second toast carrying critical error information fails outright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; don't use auto-dismissing toasts for errors. Toasts work for redundant, low-stakes notifications. Not for information the user needs to act on. Display errors inline, adjacent to the field, and keep them visible until the user corrects the input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2: The error that vanished when focus left the field&lt;/strong&gt;&lt;br&gt;
A form showed the error while the field was focused, but an &lt;code&gt;onblur&lt;/code&gt; listener hid the container the moment the user tabbed away. The screen reader announced only "invalid entry." No explanation, no guidance.&lt;/p&gt;

&lt;p&gt;Two bugs in one component. First, the message disappeared on blur, so any user who tabbed to the next field and back found it gone. Second, there was no &lt;code&gt;aria-describedby&lt;/code&gt; linking the error text to the input,so even when the message was visible, JAWS and NVDA had no reason to read it on focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgu61a8kvo8xmou00817.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxgu61a8kvo8xmou00817.png" alt="Code comparison showing two HTML implementations of an inline error message. The " span="" id="email-error" width="674" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With &lt;code&gt;aria-describedby&lt;/code&gt; in place, JAWS, NVDA and VoiceOver all read the error automatically when the field receives focus. Remove the blur handler. Errors should persist until the user successfully corrects the field.&lt;/p&gt;

&lt;p&gt;Both bugs come down to the same root cause: errors that aren't persistent and aren't programmatically connected to their field. Fix those two things and you cover the vast majority of screen reader failure modes on form validation.&lt;/p&gt;

&lt;p&gt;What patterns are you using for error handling? Curious if anyone's hit edge cases with VoiceOver + Safari on iOS, that combination still has quirks worth discussing.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
      <category>html</category>
    </item>
    <item>
      <title>Focus indicators that fail WCAG 1.4.11: real cases and exact fixes</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Wed, 13 May 2026 08:52:26 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/focus-indicators-that-fail-wcag-1411-real-cases-and-exact-fixes-4aeo</link>
      <guid>https://forem.com/a11ysolutions/focus-indicators-that-fail-wcag-1411-real-cases-and-exact-fixes-4aeo</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is a focus indicator — and why does WCAG regulate it?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a user navigates a website using a keyboard, they need to know where they are on the page at all times. The focus indicator is the visual signal that answers that question: the outline, highlight, or state change that appears on the element currently receiving keyboard focus.&lt;/p&gt;

&lt;p&gt;WCAG Success Criterion 1.4.11 (Non-text Contrast) requires that the visual presentation of UI components, including focus and hover indicators, has a contrast ratio of at least 3:1 against adjacent colors.&lt;/p&gt;

&lt;p&gt;Without a sufficient focus indicator:&lt;/p&gt;

&lt;p&gt;Keyboard-only users lose their place on the page.&lt;br&gt;
Users with low vision cannot perceive the current focus state.&lt;br&gt;
The product fails a Level AA audit, the standard required by the EAA, ADA, and EN 301 549.&lt;/p&gt;

&lt;p&gt;Below are three real cases from accessibility audits, extracted from a structured issue bank. No simulated data. No approximations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1&lt;/strong&gt; — Login page: Dropdown focused/hovered option&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; "Tipo de documento" dropdown — focused and hovered option state&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: High&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;br&gt;
When the dropdown expanded and the user hovered or focused an option, the selected state was communicated only through a light grey background. There was no outline or other indicator with sufficient contrast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbzad7pbt0wh4qs1hfy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbzad7pbt0wh4qs1hfy7.png" alt="Table showing a WCAG 1.4.11 contrast failure where the focused option background color (#F1F4F4) is compared against a white page background (#FFFFFF). The measured contrast ratio is 1.1:1, below the required minimum of 3:1." width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The CSS driving the problem:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;.css-1kwd9xn-option {&lt;br&gt;
  background-color: rgb(241, 244, 244); /* #F1F4F4 */&lt;br&gt;
  color: rgb(0, 43, 69);&lt;br&gt;
  font-size: 14px;&lt;br&gt;
  font-weight: normal;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;A ratio of 1.1:1 means the focused state is virtually indistinguishable from the default state. For a user with low vision navigating with a keyboard, the dropdown is effectively unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Replace the near-white background with a grey that achieves the required 3:1 threshold against the white page background.&lt;br&gt;
css/* Before &lt;em&gt;/&lt;br&gt;
.css-1kwd9xn-option {&lt;br&gt;
  background-color: rgb(241, 244, 244); /&lt;/em&gt; ratio 1.1:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.css-1kwd9xn-option:hover,&lt;br&gt;
.css-1kwd9xn-option:focus {&lt;br&gt;
  background-color: #939393; /&lt;/em&gt; ratio 3.0:1 against #FFFFFF — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2&lt;/strong&gt; — Login page: Password digit field borders&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; Input field boundaries — digit fields for password entry&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: Medium&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The password entry screen used a series of individual digit input fields. Each field had only a bottom border as its visible boundary — the indicator that communicates "this is an input". That border failed the 3:1 contrast requirement against the white background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zvj909uqipq8g05l73b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zvj909uqipq8g05l73b.png" alt="Table showing a WCAG 1.4.11 non-text contrast failure for an input bottom border color (#CCD5DA) against a white background (#FFFFFF). The measured contrast ratio is 1.48:1, below the required minimum of 3:1." width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WCAG 1.4.11 applies not only to focus rings but to any visual indicator that communicates the presence or boundary of an interactive component. A field border that a user cannot see means they cannot locate the input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
Use a darker grey for the border that maintains the visual style while meeting the threshold.&lt;/p&gt;

&lt;p&gt;css/* Before &lt;em&gt;/&lt;br&gt;
.password-digit-field {&lt;br&gt;
  border-bottom: 1px solid #CCD5DA; /&lt;/em&gt; ratio 1.48:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.password-digit-field {&lt;br&gt;
  border-bottom: 1px solid #8094A3; /&lt;/em&gt; ratio 3.14:1 — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 3&lt;/strong&gt; — Account page: Radio button borders&lt;br&gt;
&lt;strong&gt;Component:&lt;/strong&gt; Radio button visual boundaries — payment method selection&lt;br&gt;
&lt;strong&gt;Audit type:&lt;/strong&gt; Color Contrast · Priority: Low&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was found:&lt;/strong&gt;&lt;br&gt;
A payment method selection screen presented a group of radio buttons for choosing between credit cards. The unchecked radio buttons used a light grey border to indicate their boundary. That border failed 3:1 against the white background.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37q8ure9e1dw2w59yong.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F37q8ure9e1dw2w59yong.png" alt="Table showing a WCAG 1.4.11 non-text contrast failure for a radio button border color (#C2CFD6) against a white background (#FFFFFF). The measured contrast ratio is 1.59:1, below the required minimum of 3:1." width="800" height="238"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When radio button borders are invisible, users with low vision cannot detect that a selectable option is present. This is a form usability failure, not just an aesthetic one: invisible controls block task completion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt;&lt;br&gt;
css/* Before &lt;em&gt;/&lt;br&gt;
.sc-radio-field-label:before {&lt;br&gt;
  border: 0.0625rem solid #C2CFD6; /&lt;/em&gt; ratio 1.59:1 — FAIL */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;/* After &lt;em&gt;/&lt;br&gt;
.sc-radio-field-label:before {&lt;br&gt;
  border: 0.0625rem solid #949494; /&lt;/em&gt; ratio 3.03:1 — PASS */&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What these three cases have in common&lt;/strong&gt;&lt;br&gt;
All three failures share the same root cause: grey UI elements on white backgrounds, where the grey is not dark enough to reach 3:1.&lt;/p&gt;

&lt;p&gt;This pattern is extremely common in design systems that prioritize subtle, minimal aesthetics. The visual result feels clean. The accessibility result is that a significant portion of users cannot perceive the interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tbkpvo8jkfo6jx8vg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl8tbkpvo8jkfo6jx8vg7.png" alt="Table comparing failing and corrected WCAG 1.4.11 non-text contrast ratios for three UI components: dropdown focused state improved from 1.1:1 to 3.0:1 using color #939393, password field border improved from 1.48:1 to 3.14:1 using color #8094A3, and radio button border improved from 1.59:1 to 3.03:1 using color #949494." width="800" height="195"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;None of these fixes required redesigning the component. Each required changing one CSS color value.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Focus indicators failing WCAG 1.4.11: real cases and exact fixes</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Tue, 12 May 2026 11:48:12 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/focus-indicators-failing-wcag-1411-real-cases-and-exact-fixes-13hm</link>
      <guid>https://forem.com/a11ysolutions/focus-indicators-failing-wcag-1411-real-cases-and-exact-fixes-13hm</guid>
      <description>&lt;p&gt;Focus indicators failing WCAG 1.4.11: real cases and exact fixes&lt;br&gt;
What is a focus indicator?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A focus indicator&lt;/strong&gt; is the visual signal that shows keyboard users which interactive element is currently focused.&lt;/p&gt;

&lt;p&gt;WCAG 2.1 SC 1.4.11 (Non-text Contrast) regulates focus indicators because users navigating with a keyboard must clearly perceive where focus is located.&lt;/p&gt;

&lt;p&gt;The minimum required contrast ratio for visible focus indicators is 3:1 against adjacent colors.&lt;/p&gt;

&lt;p&gt;Why static accessibility tools often miss these issues&lt;/p&gt;

&lt;p&gt;Most static accessibility scanners cannot reliably detect focus indicator failures because the :focus or :focus-visible state only exists during actual keyboard interaction.&lt;/p&gt;

&lt;p&gt;To properly validate focus indicators, manual testing with the keyboard is required.&lt;/p&gt;

&lt;p&gt;Usually:&lt;/p&gt;

&lt;p&gt;Tab&lt;br&gt;
Shift + Tab&lt;br&gt;
Browser DevTools&lt;br&gt;
Contrast analyzers&lt;br&gt;
Real accessibility audit cases&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 1 — Tourism company&lt;/strong&gt;&lt;br&gt;
The primary search button had a focus indicator with a contrast ratio below 3:1.&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Keyboard users could technically navigate to the button, but the visible focus state was too subtle to perceive clearly.&lt;/p&gt;

&lt;p&gt;WCAG failure&lt;br&gt;
SC 1.4.11 — Non-text Contrast&lt;br&gt;
Fix&lt;/p&gt;

&lt;p&gt;Use a high-contrast outline with :focus-visible.&lt;/p&gt;

&lt;p&gt;:focus-visible {&lt;br&gt;
  outline: 2px solid #FFFFFF;&lt;br&gt;
  outline-offset: 2px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 2 — Educational platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “Login” button changed from #02959F to #027279 when focused.&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Contrast between both visual states was only 1.57:1.&lt;/p&gt;

&lt;p&gt;The component relied exclusively on color to communicate focus.&lt;/p&gt;

&lt;p&gt;WCAG failures&lt;br&gt;
SC 1.4.11 — Non-text Contrast&lt;br&gt;
SC 1.4.1 — Use of Color&lt;br&gt;
Fix&lt;/p&gt;

&lt;p&gt;Add a visible outline independent of color changes.&lt;/p&gt;

&lt;p&gt;:focus-visible {&lt;br&gt;
  outline: 2px solid #FFFFFF;&lt;br&gt;
  outline-offset: 2px;&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case 3 — Same platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The “Remember me” checkbox used a black focus indicator (#212529) over a dark background (#1D191C).&lt;/p&gt;

&lt;p&gt;Problem&lt;/p&gt;

&lt;p&gt;Contrast ratio:&lt;/p&gt;

&lt;p&gt;1.12:1&lt;/p&gt;

&lt;p&gt;The focus state became nearly invisible.&lt;/p&gt;

&lt;p&gt;Fix&lt;/p&gt;

&lt;p&gt;Replace the focus indicator with:&lt;/p&gt;

&lt;p&gt;outline: 2px solid #0297A2;&lt;br&gt;
Results&lt;br&gt;
4.92:1 against background&lt;br&gt;
3.79:1 against adjacent colors&lt;/p&gt;

&lt;p&gt;WCAG compliant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to test focus indicators properly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Recommended setup:&lt;/p&gt;

&lt;p&gt;Chrome or Firefox&lt;br&gt;
Keyboard navigation only&lt;br&gt;
Colour Contrast Analyser (CCA)&lt;br&gt;
Optional: NVDA or VoiceOver&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing steps:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Navigate using only Tab&lt;br&gt;
Verify focus is always visible&lt;br&gt;
Measure contrast of the focus indicator&lt;br&gt;
Validate zoom and dark mode scenarios&lt;br&gt;
Quick production checklist&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before release, ask:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Can focus be identified immediately?&lt;br&gt;
Does the indicator reach at least 3:1 contrast?&lt;br&gt;
Does the state rely only on color changes?&lt;br&gt;
Is focus still visible in dark mode?&lt;br&gt;
Is it visible at 200% zoom?&lt;/p&gt;

&lt;p&gt;Focus indicators are one of the most commonly overlooked accessibility failures in production systems, especially because many automated tools cannot fully detect them.&lt;/p&gt;

&lt;p&gt;And yet, for keyboard users, they are critical navigation cues.&lt;/p&gt;

&lt;h1&gt;
  
  
  css #accessibility #wcag #webdev #a11y #focusvisible
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>css</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Keyboard traps: what they are, how to reproduce them, and how to fix them</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Mon, 11 May 2026 08:01:00 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/keyboard-traps-what-they-are-how-to-reproduce-them-and-how-to-fix-them-157m</link>
      <guid>https://forem.com/a11ysolutions/keyboard-traps-what-they-are-how-to-reproduce-them-and-how-to-fix-them-157m</guid>
      <description>&lt;p&gt;Definition of a keyboard trap according to WCAG 2.1 SC 2.1.2:&lt;/p&gt;

&lt;p&gt;“If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface.”&lt;/p&gt;

&lt;p&gt;Why can’t static accessibility tools detect it?&lt;/p&gt;

&lt;p&gt;Because detecting a keyboard trap requires actual keyboard navigation — typically using the Tab key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real case&lt;/strong&gt; (educational platform):&lt;/p&gt;

&lt;p&gt;The login form contained a keyboard trap. When users activated the “Login” button with empty required fields, keyboard focus was completely lost. Keyboard only users could no longer identify where to continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problematic HTML&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;input type="submit" name="commit" value="Entrar" class="btn btn-xchool btn-block mt-4" data-disable-with="Enviando..."&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Programmatically move focus to the error message’s “Close” button using &lt;code&gt;focus()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tested with Chrome + NVDA.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>html</category>
      <category>a11y</category>
    </item>
    <item>
      <title>5 ARIA mistakes that make accessibility worse, not better</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Wed, 06 May 2026 08:34:27 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/5-aria-mistakes-that-make-accessibility-worse-not-better-2pmp</link>
      <guid>https://forem.com/a11ysolutions/5-aria-mistakes-that-make-accessibility-worse-not-better-2pmp</guid>
      <description>&lt;p&gt;There's a rule in accessibility that doesn't get enough attention:&lt;/p&gt;

&lt;p&gt;No ARIA is better than bad ARIA.&lt;/p&gt;

&lt;p&gt;Adding ARIA attributes without understanding them doesn't help assistive tech, it actively misleads it. Here are the mistakes I find most often in real audits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. role="button" on a div — without keyboard support&lt;/strong&gt;&lt;br&gt;
If you give something a button role, screen readers announce it as a button.&lt;br&gt;
Users expect to activate it with Space or Enter.&lt;br&gt;
If your div only handles onClick, keyboard users get announced a button they can't press. Use &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;. That's what it's there for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. aria-label that duplicates visible text — badly&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;&amp;lt;button aria-label="Click here to submit the form"&amp;gt;Submit&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;br&gt;
Screen readers read the aria-label, ignoring "Submit". Now your button is "Click here to submit the form", verbose, inconsistent, and confusing in a list of controls.&lt;br&gt;
If the visible label is accurate, you don't need aria-label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. aria-hidden="true" on focusable elements&lt;/strong&gt;&lt;br&gt;
Hiding something from the accessibility tree while leaving it focusable creates a ghost, keyboard users can tab to it, but screen readers announce nothing. That's worse than not hiding it at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. aria-live on everything&lt;/strong&gt;&lt;br&gt;
aria-live="assertive" interrupts whatever the screen reader is doing to announce the update. Useful for critical alerts. Catastrophic for &lt;br&gt;
status messages, loading indicators, or anything non-urgent.&lt;br&gt;
Most of the time, aria-live="polite" is what you want, or nothing at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Decorative icons without aria-hidden&lt;/strong&gt;&lt;br&gt;
An icon inside a button with no aria-hidden forces screen readers to &lt;br&gt;
announce the SVG path or file name alongside the button label.&lt;br&gt;
&lt;code&gt;&amp;lt;svg aria-hidden="true"&amp;gt;&lt;/code&gt; is two words. Use them.&lt;/p&gt;

&lt;p&gt;No ARIA is better than bad ARIA.&lt;br&gt;
Before reaching for it, ask if a native HTML element solves it first.&lt;/p&gt;

&lt;p&gt;What ARIA mistakes do you see most in code reviews?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>webdev</category>
      <category>html</category>
    </item>
    <item>
      <title>Form accessibility: the checklist nobody actually uses (until users complain)</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Thu, 30 Apr 2026 07:19:49 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/form-accessibility-the-checklist-nobody-actually-uses-until-users-complain-1b3h</link>
      <guid>https://forem.com/a11ysolutions/form-accessibility-the-checklist-nobody-actually-uses-until-users-complain-1b3h</guid>
      <description>&lt;p&gt;Forms are where accessibility debt becomes user abandonment.&lt;/p&gt;

&lt;p&gt;A form can pass every automated scan and still be completely unusable &lt;br&gt;
for a significant chunk of your users.&lt;/p&gt;

&lt;p&gt;Here's what I see skipped constantly in real audits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Placeholder text used as a label&lt;/strong&gt;&lt;br&gt;
When the field gets focus, the hint disappears. For users with cognitive disabilities or memory issues, that's a dead end.&lt;br&gt;
Use &lt;code&gt;&amp;lt;label&amp;gt;&lt;/code&gt; elements. Always.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Error messages that only exist visually&lt;/strong&gt;&lt;br&gt;
Red border + error text looks complete. But if the error isn't linked to the input via &lt;code&gt;aria-describedby&lt;/code&gt;, screen readers announce nothing.&lt;br&gt;
The user submits. Nothing happens. They don't know why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required fields with no accessible indicator&lt;/strong&gt;&lt;br&gt;
An asterisk (*) is a visual convention. Without &lt;code&gt;aria-required="true"&lt;/code&gt; or a text equivalent, it means nothing to assistive tech.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autocomplete missing on personal data fields&lt;/strong&gt;&lt;br&gt;
WCAG 1.3.5 exists. Most teams don't know it does. Name, email, phone, address, those fields need proper &lt;code&gt;autocomplete&lt;/code&gt; &lt;br&gt;
attributes. For users with motor disabilities, it can be the difference between completing the form or not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Focus order that fights the visual layout&lt;/strong&gt;&lt;br&gt;
Tab order follows DOM order, not visual order. If your CSS grid or &lt;br&gt;
flexbox rearranges things visually, keyboard users may be jumping around the form in a completely unexpected sequence.&lt;/p&gt;

&lt;p&gt;None of these fail an automated scan.&lt;br&gt;
All of them fail real users.&lt;/p&gt;

&lt;p&gt;If you're doing form reviews, what's the first thing you check?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Great insights by Vitaly Skadorva! Our benchmarks confirm that moving to dynamic interaction testing is key, increasing finding precision from ~20% to over 80%. A must-read for true A11y!</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Mon, 27 Apr 2026 16:24:17 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/great-insights-by-vitaly-skadorva-our-benchmarks-confirm-that-moving-to-dynamic-interaction-mb7</link>
      <guid>https://forem.com/a11ysolutions/great-insights-by-vitaly-skadorva-our-benchmarks-confirm-that-moving-to-dynamic-interaction-mb7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-story__hidden-navigation-link"&gt;Accessibility Testing: Best Practices&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/vitalyskadorva" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3829602%2Ff815fcd6-c31b-40eb-abe7-08844fbc54d0.jpg" alt="vitalyskadorva profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/vitalyskadorva" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Vitaly Skadorva
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Vitaly Skadorva
                
              
              &lt;div id="story-author-preview-content-3555038" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/vitalyskadorva" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3829602%2Ff815fcd6-c31b-40eb-abe7-08844fbc54d0.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Vitaly Skadorva&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 27&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" id="article-link-3555038"&gt;
          Accessibility Testing: Best Practices
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/a11y"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;a11y&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/qa"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;qa&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/testing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;testing&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/vitalyskadorva/accessibility-testing-best-practices-3li9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              2&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            12 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Accessibility issues that automated tools won't catch (from real audits)</title>
      <dc:creator>a11ySolutions</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:35:10 +0000</pubDate>
      <link>https://forem.com/a11ysolutions/accessibility-issues-that-automated-tools-wont-catch-from-real-audits-2o8l</link>
      <guid>https://forem.com/a11ysolutions/accessibility-issues-that-automated-tools-wont-catch-from-real-audits-2o8l</guid>
      <description>&lt;p&gt;I run accessibility audits regularly. One pattern keeps showing up:&lt;/p&gt;

&lt;p&gt;The most critical issues are never in the code. They're in the interaction.&lt;/p&gt;

&lt;p&gt;Automated tools are genuinely useful, they catch structural and semantic &lt;br&gt;
issues fast. But they don't simulate real user behavior. And that's where &lt;br&gt;
things actually break.&lt;/p&gt;

&lt;p&gt;Here are the failure patterns I find most often:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keyboard traps in modals&lt;/strong&gt;: focus gets locked inside a dialog with no &lt;br&gt;
way out unless you know to press Escape (and even then, sometimes it doesn't &lt;br&gt;
work).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unpredictable focus jumps&lt;/strong&gt;: after a button click or route change, focus &lt;br&gt;
lands somewhere random. A screen reader user loses their place entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Silent error messages&lt;/strong&gt;: form validation runs, the error renders visually, &lt;br&gt;
but &lt;code&gt;aria-live&lt;/code&gt; is missing. Screen readers announce nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forms that validate but can't be completed&lt;/strong&gt;: the markup passes the &lt;br&gt;
scanner. Real users hit walls at step 2.&lt;/p&gt;

&lt;p&gt;None of these show up in axe, Lighthouse, or WAVE. You only find them &lt;br&gt;
when you actually use the product, keyboard only, screen reader on, &lt;br&gt;
cognitive load simulated.&lt;/p&gt;

&lt;p&gt;Accessibility isn't about passing a scan. It's about whether people can &lt;br&gt;
complete critical flows.&lt;/p&gt;

&lt;p&gt;How are you testing beyond automated tools in your projects?&lt;br&gt;
Keyboard only passes? Screen reader sessions? Something else?&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>digitalaccessibility</category>
      <category>a11ydetector</category>
      <category>wcag</category>
    </item>
  </channel>
</rss>
