Foundations
Accessibility
Every text and UI color pair in both themes is checked against WCAG 2.1 AA. The audit is a script —
.context/ds-a11y-check.mjs — run with node; it currently reports
0 failures. Thresholds: normal text ≥ 4.5:1, large/bold text & UI graphics ≥ 3.0:1.
Color is never the only signal. Status always pairs the hue with an icon, a dot, and a text
label (see the data-display and feedback pages), so red/green meaning survives for color-blind users
(DESIGN.md §8). Focus is shown with a visible
:focus-visible ring on the primary color, and
all looping motion honors prefers-reduced-motion.
Light theme — contrast ratios
AA pass at every row| Pair | Tokens | Ratio | Min | Result |
|---|---|---|---|---|
| Body text on card | ink-dim / panel | 9.76 | 4.5 | Pass |
| Labels on canvas | muted / bg | 5.09 | 4.5 | Pass |
| Primary link / text | primary-ink / panel | 7.10 | 4.5 | Pass |
| Button label on primary | on-primary / primary | 7.10 | 4.5 | Pass |
| Success text | green-ink / panel | 7.13 | 4.5 | Pass |
| Error text | red-ink / panel | 6.58 | 4.5 | Pass |
| Label on danger button | white / danger | 5.71 | 4.5 | Pass |
| Rainbow inks (darkest→lightest) | cat-*-ink / panel | 4.88–6.32 | 4.5 | Pass |
| Faint caption (large only) | muted2 / bg | 3.47 | 3.0 | Pass |
Dark theme — contrast ratios
AA pass at every row| Pair | Tokens | Ratio | Min | Result |
|---|---|---|---|---|
| Body text on card | ink-dim / panel | 9.17 | 4.5 | Pass |
| Labels on canvas | muted / bg | 6.07 | 4.5 | Pass |
| Primary link / text | primary-ink / panel | 9.08 | 4.5 | Pass |
| Button label on primary | on-primary / primary | 5.20 | 4.5 | Pass |
| Success text | green-ink / panel | 10.67 | 4.5 | Pass |
| Error text | red-ink / panel | 8.19 | 4.5 | Pass |
| Label on danger button | white / danger | 4.80 | 4.5 | Pass |
| Rainbow inks | cat-*-ink / panel | 6.81–11.48 | 4.5 | Pass |
| Faint caption (large only) | muted2 / bg | 3.34 | 3.0 | Pass |
Re-run the audit
node .context/ds-a11y-check.mjs
The script holds the literal token values and computes WCAG relative-luminance contrast for every meaningful pair, exiting non-zero on any failure — so it can gate CI later. When a token changes, re-run it and update the rows above.