Accessibility
WCAG 2.2 AA is the floor, AAA where practical. Accessibility is not a component — it's a property of every component. This guide is the working checklist; the behavioural foundation comes from React Aria, the visual affordances from Prism's tokens.
The non-negotiables
- Contrast. Every foreground/background pair clears AA: 4.5:1 for text, 3:1 for large text (≥24px or ≥19px bold) and UI/graphical objects. Pair text with its matching
-ontoken. Validate in both themes and under every signature and customer brand. - Never colour alone. Status, selection and meaning are always carried by an icon or text as well as hue — so colour-blind users are never stranded. Each status tone ships a paired icon.
- Visible focus. A 2px solid
--focus-ringoutline with a 2px offset, shown on keyboard focus (:focus-visible). Intentionally prominent — visible focus is the single most important affordance in Prism. Never remove an outline without replacing it with an equal-or-louder one. - Keyboard-complete. Every interactive element is reachable and operable by keyboard, in a logical tab order, with no traps. React Aria provides roving tabindex, arrow-key composites, type-ahead, and Esc/cancel.
- Touch & remote targets. 44px minimum (
--size-touch); 56pxxlon TV/remote surfaces. - Honour user settings. All motion collapses under
prefers-reduced-motion. The UI survivesforced-colors(Windows High Contrast) — guards live inbase.css. Text zoom always wins: all sizes arerem.
Input modalities
Prism components are specified across mouse, touch, keyboard, screen reader, switch control and TV remote — see INTERACTION for the per-component interaction contract and the modality matrix. Key points:
- Screen reader: semantic roles, names and states from React Aria; live regions for async status (
AutosaveIndicator,Toast,Alertuse polite/assertive appropriately); tables expose row/column context; charts ship a data-table fallback. - Switch control / TV remote: linear and spatial focus both land on every actionable element; focus order matches visual order; focus memory on rails (TV). See TV_AND_CINEMA.
- Zoom / reflow: layouts reflow to 320px-equivalent and tolerate 200% zoom without loss of content or function (logical properties +
rem+ wrapping guards).
Forms & errors
- Every control has a programmatically-associated label (
Fieldscaffold wires label, helper, error andaria-describedby). - Errors are announced, not just coloured: inline
aria-live, plusErrorSummaryat the top of long forms with in-page links to each field. - Required/optional, format hints and constraints are stated before the user errs, in helper text.
Content is accessibility
Plain language is an a11y feature. Sentence case, verb-first actions, blame-free errors that say what to do next — see CONTENT. Copy clarity reduces cognitive load for everyone and is essential for users with cognitive disabilities.
Authoring checklist (per component)
- All text/UI pairs clear AA in light and dark, under the default brand and at least one signature.
- Meaning never depends on colour alone (icon or text present).
- Fully keyboard-operable; logical tab order; no traps; Esc cancels overlays.
-
:focus-visibleshows the 2px ring with offset on every focusable element. - Targets ≥ 44px (≥ 56px on TV).
- Correct role/name/state to a screen reader; async changes announced via live region.
- Works under
prefers-reduced-motionandforced-colors. - Reflows at 320px and 200% zoom without clipping or overlap.
These map directly to the QA gates — every one is testable by toggling data-theme, data-density, dir and data-scale and tabbing through.