| name | setup-accessibility |
| description | Enforce ARIA accessibility via PostToolUse hooks -- labels, keyboard handlers, widget attributes, Playwright AXE setup. Use when setting up a11y enforcement, WCAG 2.1 AA compliance, or accessibility testing. |
| paths | ["src/components/**/*.tsx"] |
Accessibility Enforcement
What This Catches
<img> without alt -- use alt="" for decorative img
- Mouse-only
onClick on <div>/<span> -- needs role + tabIndex + onKeyDown/onKeyUp
- Missing ARIA on widget roles --
role="combobox" needs aria-expanded + aria-controls, role="dialog" needs aria-label/aria-labelledby, role="tablist" needs child role="tab"
Escape hatch: // allow: a11y-skip [reason]
No Nested Pressables
Interactive components ONE pattern -- never both:
Pattern A: Container clickable -- no interactive children.
<ListCard onClick={handleSelect}>
<Avatar src={user.avatar} />
<Text>{user.name}</Text>
<ChevronRightIcon /> {}
</ListCard>
Pattern B: Children interactive -- container not clickable.
<ListCard>
<Avatar src={user.avatar} />
<Text>{user.name}</Text>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size="icon"><MoreVerticalIcon /></Button>
</DropdownMenuTrigger>
</DropdownMenu>
</ListCard>
Why: ambiguous click targets, event bubbling bugs, screen readers can't convey interaction model, touch targets overlap on mobile.
Visual Checklist
Initial setup (install, AXE fixture, hook config): see SETUP.md.