Generating rebuilds every token in both modes from the seed, using OKLCH so steps stay perceptually even. Fine-tune individual tokens in the steps that follow — nothing here is locked in. Every rebuild can be undone (Ctrl+Z), and your work autosaves to this browser as you go.
The audit on the right checks the palette you are editing (light or dark) pair by pair. Fix adjusts OKLCH lightness only — hue and chroma stay yours. It moves the foreground first; if that would break a sibling pair (button text must pass on the hover fill too), it moves the fill instead. When everything passes, export the tokens below the audit.
Recent fixes — what actually moved, and whether it worked.
Ratios are WCAG 2.1 contrast; Lc is the signed APCA (WCAG 3 draft) lightness-contrast score — positive for dark text on a light fill, negative for light text on a dark fill. Roughly, |Lc| 60+ suits body text, 45+ suits large text, headlines and UI components. A pair flagged APCA low passes WCAG but sits under the APCA level suggested for its use. Fixes target the WCAG AA threshold for each pair.
Both palettes, ready to paste into a stylesheet. Dark values sit behind [data-theme="dark"] — or flip the format to use a prefers-color-scheme media query instead.