04 — Colour
Every colour in the system comes off one of three ramps, built in OKLCH. Each ramp holds a single hue at a near-constant chroma, so its steps differ only in lightness — which is what lets both themes walk the same ladders from opposite ends. Two of the three are the brand’s neutrals: there is no grey here, only a cool family and a warm one, and that is where the palette’s temperature comes from.
- 600#2a4a6cL 40.0
- 700#163454L 32.0
- 800#0c253fL 26.0
- 900#091d31L 22.5
- 950#051222L 18.0
The cool family. Display ink, reading copy, and all three dark grounds.
- 50#fff9edL 98.4
- 100#f4ebdbL 94.2
- 200#d9d1c2L 86.3
- 300#c2b9aaL 79.0
- 400#a69d8eL 70.0
- 500#8b8272L 61.0
- 600#766d5dL 53.8
- 700#665e4eL 48.4
- 800#4f4738L 40.0
The warm family. Page grounds and every muted text tier. The system has no grey.
- 300#e3ccb8L 86.0
- 400#d4b89fL 80.0
- 500#c9ad94L 76.6
- 600#b6987dL 70.0
- 700#9e8064L 62.0
The accent — the only ramp with real chroma. Draws lines; never sets type.
The colours the brand says out loud. Each is an alias pinned to a ramp step — it introduces no new value, it just keeps the vocabulary sayable.
Components reference role tokens — never a ramp step, never a named colour. Each theme points those roles at different rungs: Light descends the navy ramp for type and sits on sand‑50; Dark inverts it, standing the type on the sand ramp over navy grounds. Dark is a re‑point, not a second palette — every value below already exists above. It follows the operating system by default, with a masthead toggle to override that is remembered across visits.
- RoleLightDark
--surfacesand-50navy-950--surface-recessedsand-100navy-900--surface-contrastnavy-800navy-800--textnavy-900sand-200--text-strongnavy-800sand-100--text-mutedsand-600sand-400--text-muted-strongsand-700sand-300--text-on-contrastsand-50sand-100--accenttan-500tan-400
Measured ratios for every text-on-ground pairing the system ships, in both themes. AA needs 4.5:1 for body text; AAA, 7:1. The tan accent clears neither on ivory — which is exactly why it only ever draws a line, never sets type. The rule holds in Dark even though the ratio there is comfortable.
- BodyInk on ivoryLight16.3 : 1AAA
- DisplayNavy on ivoryLight14.8 : 1AAA
- LabelsTaupe strong on ivoryLight6.1 : 1AA
- IndicesTaupe quiet on ivoryLight4.9 : 1AA
- ApproachInk on creamLight14.4 : 1AAA
- CloseIvory on navyLight14.8 : 1AAA
- AccentTan on ivoryLight2.0 : 1Decorative
- BodyBody on the dark groundDark12.4 : 1AAA
- DisplayDisplay on the dark groundDark15.9 : 1AAA
- LabelsLabels on the dark groundDark9.7 : 1AAA
- IndicesIndices on the dark groundDark7.0 : 1AAA
- ApproachBody on the recessed bandDark11.2 : 1AAA
- CloseDisplay on the closeDark13.1 : 1AAA
- AccentTan on the dark groundDark10.0 : 1Decorative