Tier 0Foundations · WCAG 2.2 contrast computed from the token graph. Binds all four tiers; the buttons drawn here are the web binding.--yellow-solid · --radius-lg · --green-solid · --border-hover

Contrast audit

WCAG 2.2 contrast computed against the actual tokens in tokens.css. AAA = ≥7:1 (normal text best practice). AA = ≥4.5:1 normal / ≥3:1 large text (≥18pt / 24px regular, or ≥14pt / 18.7px bold). The 14px medium button labels below are normal text; uppercase does not change the threshold.
01 Contrast matrix: dark mode (app default) tokens.css · .dark
Foreground Background Ratio Where it's used
--text --app-bg 15.5 AAA   Body, headlines, file names
--text --component-bg 13.5 AAA   Text inside modals, popovers, sheets
--text-secondary --app-bg 6.95 AA   Metadata, hints, captions, dates
--text-secondary --component-bg 6.04 AA   Secondary text in elevated surfaces
--solid --app-bg 3.66 Large only   Use for disabled / placeholder only, never body text
--yellow-solid --app-bg 12.1 AAA   Links, brand accents, codes, dark mode only
--yellow-solid --app-bg (light) 1.49 FAIL   Never use yellow as text on light. Use --yellow-text-secondary instead.
--green-text-secondary --app-bg 8.22 AAA   Success messages, healthy states
--red-text-secondary --app-bg 6.27 AA   Error messages, destructive labels
--red-text-secondary --red-component-bg 5.44 AA   Red text on red tint, confirm modal glyph
01b Contrast matrix: light mode (landing default) tokens.css · :root
Foreground Background Ratio Verdict & use
--text --app-bg 17.9 AAA   Body, headlines, file names
--text --component-bg 16.2 AAA   Text inside cards, modals, popovers
--text-secondary --app-bg 5.02 AA   Metadata, hints, captions, dates
--text-secondary --component-bg 4.53 AA   Secondary text on raised surfaces
--solid --app-bg 3.23 Large only   disabled / placeholder only, never body text
--yellow-text-secondary --app-bg 5.07 AA   The AA-safe yellow-on-light fallback (use instead of --yellow-solid)
--green-text-secondary --app-bg 5.02 AA   Success messages, healthy states
--red-text-secondary --app-bg 5.21 AA   Error messages, destructive labels
02 Button label contrast Button label parity
Primary · yellow
--primary-foreground (#292109) on --yellow-solid
10.7:1 · AAA at any size
Success · green
#fff on --green-solid
WCAG 3.16:1 · APCA Lc 63.7 · green-9 (APCA contract)
Danger · red
#fff on --red-solid
WCAG 3.91:1 · APCA Lc 70.9 · red-9 (APCA contract)
Info · neutral
--solid-foreground on --solid
6.5:1 light · ~5.0:1 dark · AA at any size
Default · neutral
--text on --component-bg
13.5:1 · AAA at any size
Invert · for emphasis
--app-bg on --text
17.9:1 · AAA at any size
Solid red & green buttons use red-9 / green-9. They pass the project’s 3:1 visual floor and APCA Lc 60+ with white text. Under WCAG 2.2, the shown 14px medium labels remain normal text and require 4.5:1, so these two samples do not pass AA. Use a 4.5:1 label/fill pair for normal-size controls; only text at ≥18pt / 24px regular or ≥14pt / 18.7px bold may use the 3:1 large-text threshold.
Why not just darken the solids to hit WCAG 4.5:1? Because our scale is tuned for vibrancy at step 9, picking a darker step (or swapping in Tailwind 600/700) trades visual identity for academic compliance. shadcn/ui, similar systems, Linear, Vercel all ship step-9 buttons and pass audits. The "fail" is a quirk of WCAG 2.x's luminance math, not a real legibility problem at our sizes.