A monochrome field with one warm accent. Roles, scales and contrast guarantees.
Colour is layered so it can move without breaking. Core is the raw material: every hue as a 50-to-900 scale, plus a single black and white. Nothing uses it directly. Semantic is what components consume, in two tiers: intensity ramps (weakest to strongest) that alias a core ramp, then role tokens (background, text, action) that reference those ramps by name. A theme is that semantic layer resolved to real colour. Optimistic stays dark-first and monochrome: neutral carbon carries almost every screen, and the one warm accent (ember #FF7A00) lives in the brand ramp, so a re-skin never loses it.
A component never names a hex. It asks for a role, the role points at an intensity ramp, and the ramp points at one core step. Follow the chain for a primary button on the dark theme.
The value #FF8A24 passes through every layer unchanged. Re-point brand at another core ramp and every button, tint and border that reads action.primary re-skins at once, with no component edits.
Core is the raw material, kept broad on purpose so new hues are already on hand without editing anything downstream. The functional ramps (brand, red, green, amber, blue) and the neutral carbon scale do the real work; black and white are single values; the rest are spare hues. Each ramp runs 50 to 900, read straight from tokens/primitive/color.json.
Charts and illustrations are the one place more colour earns its keep, since series must be told apart. A categorical set of ten, dark-tuned and ordered so element-1 is the warm brand. Use them in order; stop at the count you need.
For heatmaps and gradients, don't mix hues. Run a single core ramp as a sequential scale (here, Cobalt 900 → 200).
On a dark field, depth is mostly a hairline job, so shadows are used sparingly. When they are, the tint is near-black; focus rings are the one warm exception.
Even with a full token system, restraint is the point. Neutral carbon fills almost every screen; the feedback ramps (red, green, amber, blue) show up only as state: an icon tint, a subtle *-surface wash, a *-solid fill. The brand accent spends its warmth once per view. #FF7A00 never shifts, and its label stays near-black #1A0E04 (7.25:1 contrast), never white (2.61:1, which fails).
| Pairing | Ratio | Rule |
|---|---|---|
| text-secondary on surface | 7.0:1 | Passes AA for all text |
| text-muted on surface | 4.6:1 | AA for meta / secondary |
| on-accent on accent | 7.25:1 | Dark label on warm fills |
| white on accent | 2.61:1 | Never; use on-accent |