Color
One warm primary on a pinkish-white ground, cool data accents — over even-lightness tonal scales.
One warm primary (the iris-sun) anchored on Solar; a warm, near-white ground (the sclera); cool data accents as the clinical counterpoint. Hex is canonical; OKLCH on implementation.
Tonal scales — the source of truth
Each hue is an even-lightness OKLCH ramp (50 → 950). Pick a step by role and contrast is structural, not
lucky — the scales are generated by strategy/tools/ramps.py, shipped as data in the lumen package
(import { ramps } from 'lumen'), and rendered below from the package so these rows can never go stale.
Role → step
The solid neutrals are ramp steps: the ground is neutral-50, the control edge neutral-600, muted text neutral-700 and the ink neutral-950. The soft lines and fills are not steps. They are the ink at a low alpha, so they layer over whatever lies beneath. For each hue, fills and dots are 600 and text is 700. The card sits just above neutral-50, deliberately off-ramp. Night brightens one band, where 300 to 400 carry text and accents.
The personal halo (north star)
The Neutral ramp is a skin tone, not a tinted gray — Day and Night sample two points on the human skin spectrum (very light ↔ very dark · cool ↔ warm · olive ↔ red). The generator already treats the neutral's hue/chroma as an undertone parameter, so a future, personal Halo can wear your undertone while the even-lightness structure keeps every contrast guarantee. Unshipped by design — but every token decision today must keep this door open. (Philosophy #7: the halo is personal.)
Brand and action
Solar, the iris-sun, means Halo and nothing else: the mark, the Halo button and the warm light on a
cover. --brand is a fill, never text. The action is the ink. Buttons, active pills, links and progress
stay neutral, so Solar keeps its meaning. One hue has a second meaning in the app: teal (--data-1) is
time through the chapter, on the week arc and the plan's progress.
Ground — Day (the eye-white)
The ground is a light skin tone, one step below white cards, so a card stands apart by its fill and a
soft shadow, never by a line. Every soft line and fill is the ink at a low alpha: the muted fill at 4.5%,
the border at 7%, the accent at 5%. Edges come in two strengths. The soft --border is for dividers
inside a card. --border-strong is the edge that identifies a control, and it clears 3:1 (WCAG 1.4.11);
--input is that edge. The muted and border swatches below are shown blended over the ground.
Ground — Night (warm espresso)
At Night, shadows barely read, so surfaces step lighter as they rise and the muted fill steps darker, into a well.
Data accents (cool) & status
The clinical counterpoint — cool hues for categorical data, plus the four status colors. Every one clears 3:1 on a card, so a dot, a range-bar segment or a lone chart line reads on its own.