Skip to content

Accessibility

The system aims at WCAG 2.2 AA. The rules below are built into the tokens and components; each component’s page says what it does on top.

The tables below are worked out from the token files when this site builds, in both themes. Body text needs 4.5:1; large text, and the parts of controls such as a status dot, need 3:1.

In the light theme several pairs fall short, and the tables mark each one: coral links, white text on the coral button, the softest muted text, muted text on the cream card, and the teal, amber and status marks. The dark theme passes almost everywhere. The light colours are kept as the brand handoff drew them, for now. Until they change, use the softest muted text only for hints and labels that repeat something said elsewhere, keep a link’s meaning in its words, not in its colour, and give every mark a word beside it.

ForegroundBackgroundLightDark
--text-ink--surface-canvas17.50:1AA17.01:1AA
--text-body-strong--surface-canvas14.58:1AA15.79:1AA
--text-body--surface-canvas10.35:1AA13.67:1AA
--text-muted--surface-canvas5.13:1AA6.62:1AA
--text-muted-soft--surface-canvas3.23:1Large only4.30:1Large only
--text-link--surface-canvas2.96:1Below5.74:1AA
--text-ink--surface-card15.26:1AA14.88:1AA
--text-body-strong--surface-card12.71:1AA13.81:1AA
--text-body--surface-card9.02:1AA11.96:1AA
--text-muted--surface-card4.48:1Large only5.79:1AA
--text-muted-soft--surface-card2.82:1Below3.76:1Large only
--text-link--surface-card2.58:1Below5.02:1AA
ForegroundBackgroundLightDark
--text-on-dark--surface-dark17.01:1AA13.78:1AA
--text-on-dark-soft--surface-dark6.62:1AA5.36:1AA
--text-on-dark--surface-dark-soft15.82:1AA12.65:1AA
--text-on-dark-soft--surface-dark-soft6.16:1AA4.92:1AA
--text-on-dark--surface-dark-elevated14.88:1AA11.42:1AA
--text-on-dark-soft--surface-dark-elevated5.79:1AA4.44:1Large only
ForegroundBackgroundLightDark
--color-on-primary--color-primary3.12:1Large only3.12:1Large only
--color-on-primary--color-primary-active5.06:1AA5.06:1AA

Status dots and accent marks are not text, so the line for them is 3:1. In the light theme most of them fall below it, so a dot must not carry meaning by colour alone: put a visible word beside it.

ForegroundBackgroundLightDark
--accent-teal--surface-canvas2.25:1Below7.57:13:1
--accent-amber--surface-canvas2.00:1Below8.50:13:1
--status-success--surface-canvas2.33:1Below7.31:13:1
--status-warning--surface-canvas2.25:1Below7.54:13:1
--status-error--surface-canvas4.59:13:13.70:13:1

Every link and button shows a 2px coral outline, offset by 2px, when it has keyboard focus (:focus-visible), so a keyboard user can always see where they are. Inputs draw their own --focus-ring halo instead.

Below 768px, every element marked data-ds-tap grows to --tap-min, 44px, which a finger needs: rows in a list grow taller, and cells such as icon buttons grow in both directions. A link inside running text is the one exception, because a 44px box would break the line spacing around it. A file tree is not marked either: its folders fold but its files cannot be pressed, and every row stays 28px so the two line up.

Motion drops to 1ms under the system’s reduced-motion setting and under the site’s own switch, so it never carries information on its own. See Motion.

Components use native elements wherever one exists: a real <button>, <details> for anything that folds, <dl> for name and value pairs, <figure> with <figcaption>. A state shown by a colour or a dot is also written out for screen readers. The fixed words in components, such as “Copy code” and “Required”, are in English.