Evidence
Contrast, measured
Every ratio below was computed while this page was built, by the same engine that gates the system in continuous integration. 19 of 19 pairs clear the 4.5:1 floor for normal text in both themes — and a pair that stopped clearing it would fail the build rather than quietly appear here.
How the pairs are chosen
The system names a foreground for a surface by suffix: a token ending in
-foreground is the text colour for the token it shares a stem with. Pairs are
derived from that convention rather than listed, so a new foreground token is measured the
moment it exists — there is no list to remember to update.
Deriving pairs mechanically is honest but not sufficient, because the convention has two kinds of exception, and both matter more than the rule.
Some foregrounds sit on a gradient, not on their stem
A family that declares gradient stops paints its text on the gradient. Measured against the solid accent that shares the stem instead, several families appear to fail by a wide margin — while the composition a reader actually sees clears the floor comfortably. Those pairs are measured against both stops, and reported at the worse of the two.
Some foregrounds are text colours, not surfaces
The destructive token is a text and icon colour. A filled destructive control paints a separate surface token, and that is the pairing measured here. Pairing the text colour with itself would report a ratio for something nobody ever renders.
Translucent text is composited before it is measured
Where text sits on a wash of its own hue, the effective background is the composite of the
wash over the surface beneath — not either token alone. Measuring against the bare surface
would overstate the ratio, which is the failure this system's -on-tint tokens exist
to prevent.
Measured pairs
| Foreground | Measured against | Light | Dark | Floor | Result |
|---|---|---|---|---|---|
--accent-foreground | --accent | 15.99 | 16.44 | 4.5 | Passes AA |
--foreground | --background | 18.60 | 19.93 | 4.5 | Passes AA |
--card-foreground | --card | 20.32 | 18.48 | 4.5 | Passes AA |
--destructive-foreground | --destructive-surface | 4.86 | 7.59 | 4.5 | Passes AA |
--domain-catalog-foreground | --domain-catalog-from → --domain-catalog-to | 4.94 | 4.94 | 4.5 | Passes AA |
--domain-list-foreground | --domain-list-from → --domain-list-to | 5.04 | 5.04 | 4.5 | Passes AA |
--domain-more-foreground | --domain-more-from → --domain-more-to | 5.13 | 5.13 | 4.5 | Passes AA |
--domain-pantry-foreground | --domain-pantry-from → --domain-pantry-to | 5.09 | 5.09 | 4.5 | Passes AA |
--domain-trips-foreground | --domain-trips-from → --domain-trips-to | 4.98 | 4.98 | 4.5 | Passes AA |
--fab-addtrip-foreground | --fab-addtrip-from → --fab-addtrip-to | 5.15 | 5.15 | 4.5 | Passes AA |
--muted-foreground | --muted | 4.75 | 5.18 | 4.5 | Passes AA |
--popover-foreground | --popover | 20.32 | 18.48 | 4.5 | Passes AA |
--primary-foreground | --primary | 5.62 | 5.04 | 4.5 | Passes AA |
--secondary-foreground | --secondary | 16.02 | 18.11 | 4.5 | Passes AA |
--sidebar-foreground | --sidebar | 17.02 | 19.40 | 4.5 | Passes AA |
--sidebar-accent-foreground | --sidebar-accent | 15.10 | 16.44 | 4.5 | Passes AA |
--sidebar-primary-foreground | --sidebar-primary | 5.62 | 5.04 | 4.5 | Passes AA |
--success-foreground | --success | 6.65 | 8.88 | 4.5 | Passes AA |
--warning-foreground | --warning | 6.12 | 11.51 | 4.5 | Passes AA |
Pairs this table does not measure
The naming convention produces some pairings that are never rendered, and one that is held below the floor on purpose. Listing them is the difference between a stated exception and a quiet omission.
-
--text-disabledon--background - Disabled control text is exempt from WCAG 1.4.3, which does not apply to inactive user-interface components. Held below the floor deliberately so that disabled reads as disabled.