Accessibility Checklist
Run accessibility checks on every interactive component before code review.
When to Use
- After implementing any interactive UI component
- Before requesting code review
- When auditing existing UI for accessibility gaps
How to Use
Announce: "I'm using the accessibility-checklist skill to verify this component." This runs in a forked a11y-reviewer agent context.
Create TodoWrite items for each applicable check below. Mark as you verify.
Required Checks
Labels and Roles
Create todos for each:
-
aria-labelon icon buttons, inputs without visible labels, sliders -
roleattribute when not using semantic HTML elements -
aria-liveon dynamic content (toasts, loading states, live updates) - Form labels connected via
htmlFor/id
Keyboard Navigation
- Enter/Space activates buttons and interactive elements
- Escape dismisses modals, dropdowns, popovers
- Arrow keys navigate within composite widgets (tabs, menus, sliders)
- Tab order follows logical reading order
- No keyboard traps (can always tab out of components)
Visual
- Visible focus styles using
:focus-visible - Color contrast meets WCAG AA (4.5:1 for text, 3:1 for UI)
- Information not conveyed by color alone
- Touch targets at least 44x44px
Motion and Animation
- Reduced motion support via
prefers-reduced-motion - No auto-playing animations that can't be paused
- No flashing content (seizure risk)
Content
- Images have meaningful alt text (or empty alt="" for decorative)
- Headings follow hierarchical order (h1 → h2 → h3)
- Links have descriptive text (not "click here")
- Error messages are clear and associated with their fields
Quick Test
Before marking complete, perform these manual checks:
- Keyboard-only test: Navigate the entire feature without a mouse
- Screen reader spot-check: Turn on VoiceOver (Mac) or NVDA (Windows) and verify key flows
- Zoom test: Set browser to 200% zoom and verify layout doesn't break
Common Fixes
Icon button without label:
<button aria-label="Close modal"
<XIcon />
</button>
Live region for dynamic content:
<div aria-live="polite" aria-atomic="true">
{statusMessage}
</div>
Reduced motion support:
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Focus visible styles:
button:focus-visible {
outline: 2px solid var(--focus-ring-color);
outline-offset: 2px;
}
Workflow
- Identify all interactive elements in the component
- Create TodoWrite with applicable checks
- Test each item, marking complete or fixing issues
- Run the Quick Test manually
- Report any items that couldn't be verified
Output
After verification, provide:
- Verdict: approve / revise
- Issues fixed: What you corrected during the check
- Manual test results: Keyboard, screen reader, zoom outcomes
- Remaining issues: Anything that needs user attention
Converted and distributed by TomeVault — claim your Tome and manage your conversions.