Make the UI accessible
Bring the affected UI to WCAG 2.2 AA: operable by keyboard, understandable to
assistive tech, and tolerant of user preferences — proven, not assumed.
Steps
- Read the lore first. Call
search_lore (Memory MCP) for the repo's
accessibility conventions and any design-system a11y primitives already in use.
- Use semantic HTML before ARIA. Reach for the native element (
button, a,
label, nav, dialog) first; add ARIA roles/attributes only to fill real gaps.
- Make it keyboard operable. Every interactive element must be focusable and
activatable by keyboard, in a logical tab order, with a visible focus indicator.
- Label everything. Associate inputs with
labels, give icon-only controls an
accessible name, and announce dynamic changes with live regions where needed.
- Manage focus for overlays/dialogs/menus: move focus in on open, trap it while
open, restore it on close.
- Respect preferences. Honour
prefers-reduced-motion; ensure text/background
contrast meets AA (4.5:1 body, 3:1 large text).
- Verify + evidence. Run the repo's automated a11y checks and exercise keyboard
flow; record the results via the
record-evidence skill and submit for review.
Rules
- Native semantics over ARIA; never use ARIA to paper over the wrong element.
- No keyboard trap, no focus loss, no invisible focus.
- Don't remove focus outlines without a compliant replacement.
- Colour is never the only signal — pair it with text or icon.
Capture lore
This skill is one of the places durable, reusable knowledge naturally surfaces:
An accessibility pattern or boundary this repo standardises on — a focus-management rule, a semantics convention, or an a11y check that must pass. That kind of fact is lore. Capture it via the lore-capture
protocol in your brief (CLAUDE.factory.md, step 11 "Memory contribution"):
call the Memory MCP suggest_lore once at the close of your work — reusable
conventions, gotchas, decisions, and boundaries only, never per-ticket trivia.
1---2name: frontend-a11y3description: Use when a ticket requires accessibility work or when delivering UI that must be usable by everyone — keyboard navigation, screen-reader labelling, focus management, colour contrast, or reduced-motion support. Invoke for "make X accessible", "fix the a11y issues", "add keyboard support", or as a companion check on any new component.4---56# Make the UI accessible78Bring the affected UI to WCAG 2.2 AA: operable by keyboard, understandable to9assistive tech, and tolerant of user preferences — proven, not assumed.1011## Steps12131. **Read the lore first.** Call `search_lore` (Memory MCP) for the repo's14 accessibility conventions and any design-system a11y primitives already in use.152. **Use semantic HTML before ARIA.** Reach for the native element (`button`, `a`,16 `label`, `nav`, `dialog`) first; add ARIA roles/attributes only to fill real gaps.173. **Make it keyboard operable.** Every interactive element must be focusable and18 activatable by keyboard, in a logical tab order, with a visible focus indicator.194. **Label everything.** Associate inputs with `label`s, give icon-only controls an20 accessible name, and announce dynamic changes with live regions where needed.215. **Manage focus** for overlays/dialogs/menus: move focus in on open, trap it while22 open, restore it on close.236. **Respect preferences.** Honour `prefers-reduced-motion`; ensure text/background24 contrast meets AA (4.5:1 body, 3:1 large text).257. **Verify + evidence.** Run the repo's automated a11y checks and exercise keyboard26 flow; record the results via the `record-evidence` skill and submit for review.2728## Rules2930- Native semantics over ARIA; never use ARIA to paper over the wrong element.31- No keyboard trap, no focus loss, no invisible focus.32- Don't remove focus outlines without a compliant replacement.33- Colour is never the only signal — pair it with text or icon.3435## Capture lore3637This skill is one of the places durable, reusable knowledge naturally surfaces:38**An accessibility pattern or boundary this repo standardises on — a focus-management rule, a semantics convention, or an a11y check that must pass.** That kind of fact is *lore*. Capture it via the **lore-capture39protocol in your brief** (`CLAUDE.factory.md`, step 11 "Memory contribution"):40call the Memory MCP `suggest_lore` once at the close of your work — reusable41conventions, gotchas, decisions, and boundaries only, never per-ticket trivia.