4.5:1 required for normal text. 3:1 for large text (18pt+ or 14pt bold). Colors marked "Bg only" must not be used as text color or icon fill on white.
Sample
Bedrock ink / dark
#E2E8F0 on #020617
16.36:1 — Pass AAA
Sample
Bedrock ink / light
#0F172A on #EEF2F6
15.87:1 — Pass AAA
Sample
Catalyst ink / dark
#FFFFFF on #232D4A (raised — worst ground)
13.59:1 — Pass AAA
Sample
Commons Deep Forest / Warm Paper
#064E3B on #FAF7F2
9.10:1 — Pass AAA
Sample
Systems Blue / Data Midnight
#007FFF on #020617
5.26:1 — Pass AA
Sample
Systems Blue / Lab Clean v2
#007FFF on #EEF2F6
3.41:1 — Large / UI only
Sample
Figure green / Lab Clean v2
#047857 on #EEF2F6
4.87:1 — Pass AA
Sample
Commons Emerald / Warm Paper
#059669 on #FAF7F2
3.53:1 — Large / UI only
Sample
Spring ink / Spring fill (S-07)
#022C22 on #10B981
5.97:1 — Pass AA
Sample
Signal / Core Deep
#FB923C on #0A0C10
6.98:1 — Pass AA
Sample
Signal / Lab Clean v2
#C2410C on #EEF2F6
4.60:1 — Pass AA
Sample
Civic Blue / Core Deep
#60A5FA on #0A0C10
7.70:1 — Pass AA
Interactive requirements
→Focus-visible: 2px ring, 2px offset. Ring is #FFFFFF on dark grounds, #0F172A on light. The offset gap renders in the base colour, which separates the ring from the component — a single-colour ring cannot clear 3:1 against both
→Theme toggle: aria-label updates dynamically ("Switch to light/dark mode"), aria-pressed reflects state
→Decorative SVGs: aria-hidden="true" and focusable="false"
→Color swatches: role="img" with aria-label naming color and hex value
→Reduced motion: @media (prefers-reduced-motion: reduce) disables all transitions and animations