Colour architecture
This is a spec: descriptive guidance, not a checkable rule. It carries no forbidden and instead pair, and no jig check detector applies to it directly.
The spec
Foregrounds are transparent. Backgrounds are solid.
Foreground colours (text, icons, strokes, fills) are opacities of black in light mode and white in dark. Background colours are three solid elevation levels.
This is not a stylistic choice. A solid foreground looks correct on one background and wrong on the next — a grey tag reads as prominent on white and recedes into a grey panel. Dark mode has three background levels, so a solid fill is wrong on at least two of them. A transparent foreground mixes with whatever is beneath it and keeps a consistent prominence everywhere.
It also removes tokens rather than adding them: hover and press become transparent layers reused across every component and both modes.
Three elevation levels, consistent across modes: base (page), raised (cards, panels), overlay (dialogs, dropdowns).
- Light mode: shadows carry elevation, plus lighter-on-darker — a white card on an off-white page reads as raised without a shadow at all.
- Dark mode: shadows are nearly invisible. Depth comes from the background colour, so
--shadow-raisedresolves tononeand the raised background does the work.
| Light | Dark | |
|---|---|---|
text-strong | black 90% | white 100% |
text-weak | black 60% | white 78% |
stroke-strong | black 45% | white 60% |
stroke-weak | black 10% | white 12% |
fill | black 4% | white 6% |
Brand and each system colour take the same four variations: 100% text, 80% stroke-strong, 20% stroke-weak, 5% fill.
Neutral or monochromatic. The default is neutral (pure black/white opacities), which works with any brand colour. For a monochromatic palette, tint the dark-mode backgrounds with the brand hue and, in light mode, replace the black opacities with a heavily saturated brand hue at low lightness. Change --brand-h and --brand-s; nothing else moves.
- Kind
- Spec
- Section
- Design Tokens