The WCAG 2.2 AA rules the kit holds for screens, the contrast tokens, the keys that hold everywhere, and three pre-release checks.
The bar is WCAG 2.2 AA and the whole admin is operable from the keyboard. That is not only an obligation: shop-floor staff work faster by key than by mouse. Most rules are held by the components themselves — which is why screens are assembled from them and not from copied classes, where the bar quietly drops.
Contrast is not judged by eye — the palette is measured for it, so it is enough to reach for the right token. A colour outside the tokens carries no such guarantee.
--ink, --ink-2 and --ink-3 hold AA on white and on --surface-2 alike, in the light and the dark theme.--ink-4 is for disabled states and decoration only, never for readable content — it does not reach AA and is not meant to.--border-strong, not --border. With the ordinary outline the edge of a field would vanish on a light surface.The focus ring is 2px of --accent with a 2px offset. An input adds a soft 3px ring in --accent-bg, so the field stays legible on a raised surface. outline: none without a replacement is never used — it is the fastest way to close a screen to keyboard users.
Five keys hold across the whole admin. A screen does not redefine them — a relearned key costs the user more than a missing one.
| Key | Behaviour |
|---|---|
Tab | The order matches the visual order; hidden elements drop out of it. |
Esc | Closes the side panel, the modal and an expanded menu; focus returns to the element that opened it. |
↑ ↓ | Movement inside a list and an expanded menu; focus does not escape the component. |
Cmd/Ctrl K | Global search from anywhere. |
Enter | Submits a form; in a table it opens the detail of the highlighted row. |
A screen reader does not see the layout — it reads role, name and state. Whatever a screen says by shape has to be said by those too.
aria-label with a verb; a decorative icon is hidden from screen readers.role="dialog", aria-modal="true" and a trapped focus; the rest of the page beneath them is marked inert so it cannot be tabbed into.aria-live="polite"; assertive is reserved for a critical error, because it interrupts whatever the screen reader is reading.scope, otherwise a screen reader cannot tell which column a cell belongs to; a selected row carries aria-selected.aria-describedby — not by the border colour alone, which a screen reader never reads.prefers-reduced-motion turns off shifts and animation; only the colour change remains.Three quick checks before a screen ships. They do not measure everything — but what fails them fails everything else too.