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-5 is for separators and disabled states only, never for readable content — it does not reach AA (1.49 : 1 on white) and is not meant to. The lightest ink that may still be read is --ink-4, at 5.85 : 1.--border-strong, not --border. With the ordinary outline the edge of a field would vanish on a light surface.The focus ring is a token rather than each component's own idea of one: --focus-ring is the width, --focus-ring-offset the gap, and the colour is --accent — so the ring follows the chosen accent family. The gap between the control and the ring is painted in the page colour, which is what makes the ring read on a dark button and a light one alike. A control standing on its own takes the ring outside it; a full-width row inside a scrolling list takes it inside, because that list would otherwise cut it off. 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 button is 34 px, an icon button 28, a checkbox 16. On a phone those are missed, and the ones missed most are a table's row actions and the close crosses. WCAG 2.5.5 and Apple's own rules both ask for 44 × 44 px.
The controls themselves do not grow. A larger button on touch would push the layout around and break the 34 px line the filter bar stands on — and a changed height is a major bump. What grows is the hit area: a transparent ::before with a negative inset, live only under pointer: coarse. Nothing is drawn, nothing reflows, and on a mouse not one declaration applies.
touch-target grows in both axes. For a control with room around it — a button, a switch.touch-target-y grows only upward and downward. For controls standing shoulder to shoulder: row actions sit 2 px apart, so a sideways area would reach across the neighbour and the tap would go to whichever is later in the DOM. On a row holding Edit next to Delete, that is not a rounding error.touch-row raises the whole row to 44 px instead. For a checkbox and a radio option: ::before generates no box on a replaced element, so an input cannot carry an area at all — and stacked options sit 6 px apart, where it would cover the neighbour's label anyway. The label wraps the control and its text, so the whole row is the target.The utilities live in the package preset rather than in the documentation site's own stylesheet — otherwise a consumer would not get them and the classes the components carry would draw nothing.
One limit worth knowing: the area reaches outside the element, so overflow: hidden on any ancestor cuts it back to that ancestor's edge. Measured on a card carrying overflow-hidden: the control was left with the height it started with. Where the wrapper clips, the room has to come from the wrapper — the hit area cannot take it.
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.