accessibility
Checks and fixes semantics, keyboard, focus, contrast, labels and motion against WCAG 2.2 AA.
looks for
- div or span used as a button
- custom controls (switch, tabs, menu, dialog, combobox)
- icon-only buttons
- low-contrast text or status shown by colour alone
- animations without a reduced-motion path
outputs
- → findings mapped to WCAG success criteria
- → code fixes (native element, label, role, focus management)
- → a manual test script (keyboard + screen reader)
SKILL.md
Accessibility (WCAG 2.2 AA)
1. Native first
Use the real element: <button>, <a href>, <input type="checkbox">,
<select>, <dialog>, <details>. ARIA is for when no element exists, and
"no ARIA is better than bad ARIA".
2. Keyboard
- Everything clickable is reachable with Tab and works with Enter/Space.
- Logical tab order follows reading order; no positive
tabindex. - Composite widgets (tabs, menus, listboxes) use arrow keys inside, one tab stop.
- Esc closes overlays. No keyboard traps.
- A visible "Skip to content" link on pages with navigation.
3. Focus
:focus-visiblering with ≥ 3:1 contrast; neveroutline: nonewithout a replacement.- Dialogs: move focus in on open, trap it, return it to the trigger on close.
- After route changes or async content, move focus or announce it.
- Focused items are not hidden behind sticky headers (2.4.11).
4. Names, roles, states
- Icon-only buttons get
aria-label. - Inputs have a visible
<label>; placeholders are not labels. - Custom switch:
role="switch"+aria-checked. Toggle button:aria-pressed. Disclosure:aria-expanded+aria-controls. - Live updates (toasts, async results) use
role="status"oraria-live="polite".
5. Contrast and colour
- Text ≥ 4.5:1; large text (≥ 24 px, or 18.66 px bold) ≥ 3:1.
- UI components and focus indicators ≥ 3:1 against neighbours.
- Never convey state by colour alone: add an icon, label or pattern.
- Check both light and dark themes.
6. Motion
- Respect
prefers-reduced-motion: remove parallax, auto-play, large movement. - Nothing flashes more than 3 times per second.
- Auto-moving content longer than 5 s has pause/stop.
7. Forms and errors
- Errors are text, next to the field, linked with
aria-describedby, and say how to fix. - Don't block paste; support autocomplete attributes.
- Don't require re-entering info already given (3.3.7); allow non-puzzle auth (3.3.8).
8. Targets and zoom
- Pointer targets ≥ 24×24 CSS px (2.5.8); 44 px recommended.
- Works at 200% zoom and 320 px width without horizontal scroll.
- Drag actions have a single-pointer alternative (2.5.7).
9. Media and images
- Meaningful images have
alt; decorative images usealt="". - Video has captions; audio has transcripts.
Manual test script
- Unplug the mouse; complete the main flow with keyboard only.
- Run a screen reader (VoiceOver / NVDA / TalkBack) over the main flow.
- Zoom to 200%; set the viewport to 320 px.
- Turn on reduced motion; reload.
- Run an automated checker (axe, Lighthouse) and fix everything it finds; it catches ~30–40% of issues.
Customize for your project
Target level ({{WCAG_LEVEL}}, default AA), supported screen readers, and the
automated checker wired into CI.
pairs with
- skilltrueorfalse
ui-hig
Checks a screen against platform guidelines and the Laws of UX and names the specific rule each problem breaks.
- a new screen or flow being designed
- small or crowded tap targets
- too many choices on one screen
Claude · Codex · ChatGPT - skilltrueorfalse
design-system
Gives implementers a working checklist so every screen uses primitives and tokens instead of one-off styles.
- raw hex colours, px spacing or font sizes in a component
- a new UI library or icon set being added
- a component duplicated across two screens
Claude · Codex · ChatGPT - skilltrueorfalse
motion
Sets the rules for presets, wrappers, reduced motion and performance so animation is consistent and 60 fps.
- library animation calls scattered through pages
- animating width, height, top, left or box-shadow
- no prefers-reduced-motion handling
Claude · Codex · ChatGPT - agenttrueorfalse
ui-review
Reviews only the changed lines of a UI diff and reports blocking vs. should-fix findings with quoted code and fixes.
- a diff under pages, components or theme
- hex colours, px values or font sizes added in a change
- a new data surface without loading/empty/error states
Claude · Codex · ChatGPT