Color tokens
Six surfaces and the roles each one hands down. Components consume surfaces; they never reach past them to a palette color. Brand · Color owns the primitives underneath.
Three tiers, one direction
Values only ever flow downward. A component reading a primitive directly has skipped a tier, and that is the bug the tiering exists to catch.
Six colors and five per-surface muted tokens. The only literal hex values in the system.
Each surface binds a ground to the text, muted, accent, and line that clear AA on it.
Read --on-ground* only. No component names a palette color for text.
The six surfaces
Applying a surface class is the whole action. Everything inside inherits a set of AA-verified roles.
Secondary copy at the muted role for this ground.
Secondary copy at the muted role for this ground.
Secondary copy at the muted role for this ground.
Secondary copy at the muted role for this ground.
Secondary copy at the muted role for this ground.
Secondary copy at the muted role for this ground.
Choosing a surface
Bands alternate to give the page rhythm, but the sequence is not decorative — it tracks how hard the visitor is being asked to read.
| The section asks the visitor to… | Surface |
|---|---|
| Arrive and orient | Navy |
| Scan a few facts | Deep |
| Read at length | Cream |
| Absorb one statement | Blue |
| Act right now | Yellow |
Documentation-viewer roles
These pages need chrome the marketing site does not have. They map onto the same primitives, and swap under [data-theme="dark"].
| Token | Light | Dark |
|---|---|---|
--bg | White | Navy |
--surface | Cream | Deep |
--text | Navy | White |
--text-muted | --muted-on-white | --muted-on-navy |
--accent | Blue | Yellow |
--appbar-accent exists as its own token instead of reusing --accent.