Accessibility
Accessibility is a foundation here, not a review step. The tokens, the components, and the brand rules are all shaped by it — if you build with the system's defaults, you inherit most of this for free.
The standard
- WCAG 2.1 AA at minimum. Every color pairing the system ships passes AA for its intended use — the color page computes the ratios live so the claim stays checkable.
- 16px minimum body text. The smaller type steps exist for captions and metadata, never paragraphs.
- Visible focus, always. A high-contrast ink ring (
2px solid var(--focus-ring), 2px offset) on every interactive element, applied globally via:focus-visiblein tokens.css. It's ink on both light and dark — never amber on amber. - Reduced motion honored globally. tokens.css collapses all animation under
prefers-reduced-motion: reduce.
Touch targets are scoped, not blanket
Two classes of control, two rules — this is the system's most misunderstood policy:
- Primary interactive controls — buttons, pagination items, segmented-control options, nav items — get a minimum 44×44px hit area. Where visual density matters, the painted control stays small and the hit area expands via padding or a bounded overlay.
- Dense inline affordances — a chip's remove glyph, a search field's clear button, rating stars, calendar day cells — follow the shadcn/MUI dense scale instead. A 44px remove button inside a 24px chip is how you get overlapping hit areas.
- In both cases an expanded hit area must never overlap sibling content — a hit area that covers a neighboring label fires the wrong action from a correct click.
Keyboard, by construction
- Native elements first:
<button>,<input>,<dialog>— their keyboard behavior comes from the platform, not a re-implementation. - Composite widgets (tabs, segmented controls) use a roving tabindex via
useRovingFocus; listbox popups (combobox, command palette) keep DOM focus in the input and track the highlighted option witharia-activedescendantviauseActiveDescendant. - Every component page documents its exact keyboard contract in its Accessibility section — those contracts are backed by the component test suites.
What the system can't do for you
- Labels. Icon-only buttons need
aria-label; images need realalttext. - Reading order. The DOM order is the reading order — keep it sensible before reaching for CSS ordering.
- Content. Plain language is an accessibility feature; see voice and content.
The audit prompt packages these checks for an agent to run against a page of your app.