Lumen
Styles

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.

50100200300400500600700800900950
Neutral
Solar
Amber
Teal
Cobalt
Jade
Coral
Iris

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.

Brand: Halo — Solar
#EA580C
Primary action — Ink
#241917
Chapter time — Teal
#0B8E8C
Glow — Amber
#E89200

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.

Background — Eye-white
#FBF4F1
Surface — Sclera
#FFFDFC
Muted: ink at 4.5% — Mist
#F1EAE7
Border: ink at 7% — Linen
#ECE5E2
Control edge — Bark
#99867E
Foreground — Pupil
#241917

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.

Background — Midnight
#18120F
Surface — Espresso
#221A16
Raised — Roast
#2A201B
Muted — Well
#130E0C
Control edge — Bark · Night
#857467
Brand and action — Solar · Night
#FF8A33
Foreground — Moonlight
#EFE8DF

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.

Data 1 — Teal
#0B8E8C
Data 2 — Cobalt
#2E7DD1
Data 3 — Jade
#178F5E
Data 4 — Amber
#B57400
Data 5 — Coral
#DE5530
Data 6 — Iris
#6366F1
Success — Vital
#15936A
Warning — Honey
#B97309
Danger — Signal
#D42A2A
Info — Cyan
#0B85A0

On this page