Fix Web Accessibility
Fix accessibility issues.
how to use
Do not rewrite large parts of the UI. Prefer minimal, targeted fixes.
standards and conformance target
- target WCAG 2.2 Level AA by default, while honoring explicit project
conformance requirements; AA covers both Level A and Level AA success criteria
- use the WCAG 2.2 Quick Reference to check applicable criteria and their
exceptions; the rules below are a focused checklist, not a complete conformance audit
- include relevant WCAG 2.2 additions: obscured focus (2.4.11), alternatives to dragging (2.5.7), pointer target size
(2.5.8), consistent help placement (3.2.6), repeated data entry (3.3.7), and accessible authentication (3.3.8)
- use ARIA APG patterns for widget semantics, keyboard interaction, states,
and focus management; preserve native HTML behavior where it provides the needed interaction
- APG is informative implementation guidance, and its examples
require integration and testing; following a pattern alone does not establish WCAG conformance
- conformance applies to full pages and complete processes; a component review or passing automated scan cannot
establish that the entire product conforms
when to apply
Reference these guidelines when:
- adding or changing buttons, links, inputs, menus, dialogs, tabs, dropdowns
- building forms, validation, error states, helper text
- implementing keyboard shortcuts or custom interactions
- working on focus states, focus trapping, or modal behavior
- rendering icon-only controls
- adding hover-only interactions or hidden content
rule categories by priority
These priorities are triage hints. Assess actual user impact and distinguish priority from WCAG conformance level.
| priority |
category |
impact |
| 1 |
accessible names |
critical |
| 2 |
keyboard access |
critical |
| 3 |
focus and dialogs |
critical |
| 4 |
semantics |
high |
| 5 |
forms and errors |
high |
| 6 |
announcements |
medium-high |
| 7 |
contrast and states |
medium |
| 8 |
media and motion |
low-medium |
| 9 |
tool boundaries |
critical |
quick reference
1. accessible names (critical)
- every interactive control must have an accessible name
- icon-only buttons must have aria-label or aria-labelledby
- every input, select, and textarea must be labeled
- links must have meaningful text (no “click here”)
- decorative icons must be aria-hidden
2. keyboard access (critical)
- do not use div or span as buttons without full keyboard support
- make every interaction operable by keyboard; use Tab between components and pattern-specific navigation within
composite widgets, following APG keyboard conventions
- focus must be visible for keyboard users
- do not use tabindex greater than 0
- Escape must close dialogs or overlays when applicable
3. focus and dialogs (critical)
- modals must trap focus while open
- restore focus to the trigger on close
- set initial focus inside dialogs
- opening a dialog should not scroll the page unexpectedly
4. semantics (high)
- prefer native elements (button, a, input) over role-based hacks
- if a role is used, required aria attributes must be present
- lists must use ul or ol with li
- do not skip heading levels
- tables must use th for headers when applicable
5. forms and errors (high)
- errors must be linked to fields using aria-describedby
- required fields must be announced
- invalid fields must set aria-invalid
- helper text must be associated with inputs
- disabled submit actions must explain why
6. announcements (medium-high)
- critical form errors should use aria-live
- loading states should use aria-busy or status text
- toasts must not be the only way to convey critical information
- expose expanded state through native semantics or aria-expanded; apply aria-controls according to the chosen pattern,
since it is optional for the disclosure pattern
7. contrast and states (medium)
- ensure sufficient contrast for text and icons
- hover-only interactions must have keyboard equivalents
- disabled states must not rely on color alone
- do not remove focus outlines without a visible replacement
8. media and motion (low-medium)
- images must have correct alt text (meaningful or empty)
- videos with speech should provide captions when relevant
- respect prefers-reduced-motion for non-essential motion
- avoid autoplaying media with sound
9. tool boundaries (critical)
- prefer minimal changes, do not refactor unrelated code
- do not add aria when native semantics already solve the problem
- do not migrate UI libraries unless requested
common fixes
<!-- icon-only button: add aria-label -->
<!-- before -->
<button><svg>...</svg></button>
<!-- after -->
<button aria-label="Close"><svg aria-hidden="true">...</svg></button>
<!-- div as button: use native element -->
<!-- before -->
<div
<!-- after -->
<button
<!-- form error: link with aria-describedby -->
<!-- before -->
<input id="email" /> <span>Invalid email</span>
<!-- after -->
<input id="email" aria-describedby="email-err" aria-invalid="true" /> <span id="email-err">Invalid email</span>
review guidance
- fix critical issues first (names, keyboard, focus, tool boundaries)
- prefer native HTML before adding aria
- quote the exact snippet, state the failure, propose a small fix
- for complex widgets (menu, dialog, combobox), prefer established accessible primitives over custom behavior
- cite the success criterion and level for verified WCAG failures; identify APG recommendations and other best practices
separately
- combine automated checks with manual keyboard, focus, zoom/reflow, and relevant screen-reader testing;
WAI evaluation guidance explains the limits of automation.
Report the tested scope, remaining issues, and checks that could not be performed
1---2name: fix-web-accessibility3description: Audit and fix HTML accessibility issues including ARIA labels, keyboard navigation, focus management, color contrast, and form errors. Use when adding interactive controls, forms, dialogs, or reviewing WCAG 2.2 compliance.4---56# Fix Web Accessibility78Fix accessibility issues.910## how to use1112- `/fix-web-accessibility` Apply these constraints to any UI work in this conversation.1314- `/fix-web-accessibility <file>` Review the file against all rules below and report:15 - violations (quote the exact line or snippet)16 - why it matters (one short sentence)17 - a concrete fix (code-level suggestion)1819Do not rewrite large parts of the UI. Prefer minimal, targeted fixes.2021## standards and conformance target2223- target [WCAG 2.2 Level AA](https://www.w3.org/TR/WCAG22/#conformance-reqs) by default, while honoring explicit project24 conformance requirements; AA covers both Level A and Level AA success criteria25- use the [WCAG 2.2 Quick Reference](https://www.w3.org/WAI/WCAG22/quickref/) to check applicable criteria and their26 exceptions; the rules below are a focused checklist, not a complete conformance audit27- include relevant WCAG 2.2 additions: obscured focus (2.4.11), alternatives to dragging (2.5.7), pointer target size28 (2.5.8), consistent help placement (3.2.6), repeated data entry (3.3.7), and accessible authentication (3.3.8)29- use [ARIA APG patterns](https://www.w3.org/WAI/ARIA/apg/patterns/) for widget semantics, keyboard interaction, states,30 and focus management; preserve native HTML behavior where it provides the needed interaction31- APG is [informative implementation guidance](https://www.w3.org/WAI/ARIA/apg/about/introduction/), and its examples32 require integration and testing; following a pattern alone does not establish WCAG conformance33- conformance applies to full pages and complete processes; a component review or passing automated scan cannot34 establish that the entire product conforms3536## when to apply3738Reference these guidelines when:3940- adding or changing buttons, links, inputs, menus, dialogs, tabs, dropdowns41- building forms, validation, error states, helper text42- implementing keyboard shortcuts or custom interactions43- working on focus states, focus trapping, or modal behavior44- rendering icon-only controls45- adding hover-only interactions or hidden content4647## rule categories by priority4849These priorities are triage hints. Assess actual user impact and distinguish priority from WCAG conformance level.5051| priority | category | impact |52| -------- | ------------------- | ----------- |53| 1 | accessible names | critical |54| 2 | keyboard access | critical |55| 3 | focus and dialogs | critical |56| 4 | semantics | high |57| 5 | forms and errors | high |58| 6 | announcements | medium-high |59| 7 | contrast and states | medium |60| 8 | media and motion | low-medium |61| 9 | tool boundaries | critical |6263## quick reference6465### 1. accessible names (critical)6667- every interactive control must have an accessible name68- icon-only buttons must have aria-label or aria-labelledby69- every input, select, and textarea must be labeled70- links must have meaningful text (no “click here”)71- decorative icons must be aria-hidden7273### 2. keyboard access (critical)7475- do not use div or span as buttons without full keyboard support76- make every interaction operable by keyboard; use Tab between components and pattern-specific navigation within77 composite widgets, following [APG keyboard conventions](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/)78- focus must be visible for keyboard users79- do not use tabindex greater than 080- Escape must close dialogs or overlays when applicable8182### 3. focus and dialogs (critical)8384- modals must trap focus while open85- restore focus to the trigger on close86- set initial focus inside dialogs87- opening a dialog should not scroll the page unexpectedly8889### 4. semantics (high)9091- prefer native elements (button, a, input) over role-based hacks92- if a role is used, required aria attributes must be present93- lists must use ul or ol with li94- do not skip heading levels95- tables must use th for headers when applicable9697### 5. forms and errors (high)9899- errors must be linked to fields using aria-describedby100- required fields must be announced101- invalid fields must set aria-invalid102- helper text must be associated with inputs103- disabled submit actions must explain why104105### 6. announcements (medium-high)106107- critical form errors should use aria-live108- loading states should use aria-busy or status text109- toasts must not be the only way to convey critical information110- expose expanded state through native semantics or aria-expanded; apply aria-controls according to the chosen pattern,111 since it is optional for the [disclosure pattern](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/)112113### 7. contrast and states (medium)114115- ensure sufficient contrast for text and icons116- hover-only interactions must have keyboard equivalents117- disabled states must not rely on color alone118- do not remove focus outlines without a visible replacement119120### 8. media and motion (low-medium)121122- images must have correct alt text (meaningful or empty)123- videos with speech should provide captions when relevant124- respect prefers-reduced-motion for non-essential motion125- avoid autoplaying media with sound126127### 9. tool boundaries (critical)128129- prefer minimal changes, do not refactor unrelated code130- do not add aria when native semantics already solve the problem131- do not migrate UI libraries unless requested132133## common fixes134135```html136<!-- icon-only button: add aria-label -->137<!-- before -->138<button><svg>...</svg></button>139<!-- after -->140<button aria-label="Close"><svg aria-hidden="true">...</svg></button>141142<!-- div as button: use native element -->143<!-- before -->144<div onclick="save()">Save</div>145<!-- after -->146<button onclick="save()">Save</button>147148<!-- form error: link with aria-describedby -->149<!-- before -->150<input id="email" /> <span>Invalid email</span>151<!-- after -->152<input id="email" aria-describedby="email-err" aria-invalid="true" /> <span id="email-err">Invalid email</span>153```154155## review guidance156157- fix critical issues first (names, keyboard, focus, tool boundaries)158- prefer native HTML before adding aria159- quote the exact snippet, state the failure, propose a small fix160- for complex widgets (menu, dialog, combobox), prefer established accessible primitives over custom behavior161- cite the success criterion and level for verified WCAG failures; identify APG recommendations and other best practices162 separately163- combine automated checks with manual keyboard, focus, zoom/reflow, and relevant screen-reader testing;164 [WAI evaluation guidance](https://www.w3.org/WAI/test-evaluate/tools/selecting/) explains the limits of automation.165 Report the tested scope, remaining issues, and checks that could not be performed