SFDS color system — v2 (OKLCH · APCA-contracted)
Generated from the committed token pipeline (tokens/color-gen.mjs → dist/tokens.json) so this page can't drift. Every value solved in OKLCH: 12-step role scales per family per mode, chroma-cusp solids, APCA-bisected text steps, no purple. Signature sampled from the 😱 (face gold #d88507, crown blue #8fadde). Swatches show step · role · hex, with APCA badges on solids (9) and text (11/12).
The signature & the gain-grad
The one sanctioned gradient (gain-grad): symmetric gold→luminous→blue, mirroring the 😱. Fills / bars / accents only — never a text overlay.
Primitive scales — 6 families × 12 steps × light/dark
Step-as-role (Radix-class): 1 bg · 2 surface · 3–5 component bg/hover/active · 6–8 border/focus · 9 solid (chroma cusp) · 10 solid-hover · 11–12 text (APCA-solved). Badges: solid-9 shows chosen fg (● black / ○ white) + APCA; text 11/12 show achieved/target. Dark isn't an invert — chroma reduced ~25%.
neutral near-achromatic · warm whisper
gold cusp L=0.779 C=0.173 H=66.7°
blue cusp L=0.597 C=0.221 H=258.0°
green cusp L=0.874 C=0.246 H=149.1°
amber cusp L=0.885 C=0.182 H=95.0°
red cusp L=0.630 C=0.255 H=24.8°
Semantic layer — app vs marketing, in components
Shared primitives; one alias differs. APP → blue accent · MARKETING → gold accent. Gold is always brand + gain/SOTA. Same roles, wired into real UI: primary button, link, bordered chip, gain badge, gain-grad bar, danger text, body/secondary on surface.
APP · light
+10.2% vs SOTAgain-grad bardanger text sample
Primary text on surface. Secondary text on surface.
APP · dark
+10.2% vs SOTAgain-grad bardanger text sample
Primary text on surface. Secondary text on surface.
MARKETING · light
+10.2% vs SOTAgain-grad bardanger text sample
Primary text on surface. Secondary text on surface.
MARKETING · dark
+10.2% vs SOTAgain-grad bardanger text sample
Primary text on surface. Secondary text on surface.
Data visualization
Categorical: 10 colorblind-aware hues, no purple, fixed order. 5-step ramps per hue for magnitude. Sequential = gold. Diverging = blue↔neutral↔gold ("below / above SOTA"), never through purple.
Categorical (light)
Categorical (dark)
5-step ramps (per hue)
Sequential & diverging
sequential (gold)
#ffead8
#e4c1a1
#c69a6f
#a7743b
#855100
#5a3500
#321c00
diverging (blue ↔ neutral ↔ gold)
#002f6d
#1c56a8
#5d84bf
#9ab1d3
#d9dee6
#c4aa91
#a47a4e
#7f4c00
#4a2a00
Alpha overlays
Neutral (black-on-light / white-on-dark) + per-theme accent tints at 5/10/20/40/60% — scrims, hovers, overlays.
Contrast — APCA (WCAG-3) gate
✓ All 24 text-step contracts pass (step 11 ≥ Lc60, step 12 ≥ Lc90, per family × mode) · ✓ all 10 solid-9 foreground contracts pass · ✓ 0 values in the 280–330° purple band. The build refuses to emit tokens unless this gate is green.