Colour Contrast Report — every brand pair, measured
What this covers, and what it does not
The rows above are the colour system, and only the colour system. The dataset’s own scope field says so: keyboard order, focus visibility, landmark structure, alt text and motion preferences are checked separately and are not in this file. A table where every pair meets its role is therefore not a claim that the site is accessible — it is a claim about the pairs listed above and nothing else, which is as far as arithmetic can honestly take you.
Each pair is judged against the role the palette gives it. A token meant for text has to clear 4.5:1 at normal sizes; a token meant as a FILL — a button, a rule, a section marker — is measured against the ground it sits on, which says how visible the block is rather than whether copy could be set on it. Both readings are in the table and both are labelled, because collapsing them into one “pass” column is how a palette ends up with red text nobody can read.
How the figures are produced
WCAG 2.1 relative luminance, computed from the sRGB hex values declared in src/app/brand.css. Arithmetic, not sampling: these are the declared token values, so each figure is exact rather than estimated from a screenshot of a rendered page. Nothing on this page recomputes them — the ratio and the two booleans beside it are read from the file as published.
Every row prints the two hex values it was computed from, and that is deliberate. A figure is only as current as the token it was read from, so if a token moves after the file is generated, that row is stale until the next run. Printing the hex instead of the token name is what makes such a drift visible rather than silent: compare any row against brand.css and you can settle it yourself.
Why publish this
Most consulting firms claim “WCAG-compliant” without showing a measurement. We have been on both sides of that — auditing sites that passed an accessibility review and still had keyboard traps. So this page publishes the part that can be computed exactly, names the part it does not cover, and leaves the file open so anyone can recompute it.
Open data. /assets/data/a11y-status.json — CC0-1.0, no auth, no rate limit.
