Palettes · solved, not picked

Colour is a layer.

Nothing in src/pages or src/components names a colour. Both palettes below were solved in OKLCH against four contrast rules, and both are measured on this page rather than asserted. Swapping one edits a single file.

01 · The sheets

Two palettes, two modes.

Every chip is background: var(--token) inside a wrapper carrying that palette's classes — so these are the live values, not a picture of them. The hex beside each chip is read from the generated tokens.json.

Satin light

the default

Planes

ground#f9f5f2
panel#fffdfb
band#eee8e5
gate#251817

Inks

ink#271517
run#5d4749
gate-ink#f6f0f0
gate-run#b3a8a7

Accents

accent#a54e5c
accent-deep#8c4651
warm#ae7b53
warm-deep#876144

States

ok#12734f
warn#9a5600
bad#bd2b38
info#2159b8

Series

series-1#ce737f
series-2#c57e44
series-3#34a079
series-4#b17abe
series-5#949234
series-6#728cd6

Satin dark

designed, not inverted

Planes

ground#150d09
panel#201712
band#1b130e
gate#0d0606

Inks

ink#f2ecec
run#aba1a2
gate-ink#f2ecec
gate-run#aba1a2

Accents

accent#a96e75
accent-deep#be9195
warm#be9576
warm-deep#be9576

States

ok#3ccf95
warn#f2a93b
bad#ff6b76
info#6ea2ff

Series

series-1#c57983
series-2#be8356
series-3#53a584
series-4#ac7fb7
series-5#98974e
series-6#7990cd

Matte light

.finish-matte

Planes

ground#f8fafc
panel#fcfefe
band#ebeff0
gate#090e11

Inks

ink#26160f
run#5f4b44
gate-ink#f0f2f3
gate-run#a7acae

Accents

accent#bb4603
accent-deep#a63d02
warm#0098a4
warm-deep#067882

States

ok#12734f
warn#9a5600
bad#bd2b38
info#2159b8

Series

series-1#e06b39
series-2#01a0ad
series-3#08a489
series-4#c76ac0
series-5#839b00
series-6#9b7be9

Matte dark

.dark.finish-matte

Planes

ground#0c1012
panel#151a1d
band#111618
gate#010102

Inks

ink#f2edeb
run#aba29e
gate-ink#f2edeb
gate-run#aba29e

Accents

accent#FF6B35
accent-deep#e1815b
warm#49DCE1
warm-deep#49DCE1

States

ok#3ccf95
warn#f2a93b
bad#ff6b76
info#6ea2ff

Series

series-1#d87248
series-2#05a5b3
series-3#03aa8e
series-4#c170bb
series-5#889e2a
series-6#997fde

02 · The rules

Checked mechanically, never by eye.

Accent ≥ 4.5:1 on ground and band. Ink ≥ 15:1, never achromatic. An ink on a fill ≥ 4.5:1 — measured, not assumed. Running text ≥ 7:1. Rows marked·ext extend a rule to the raised plane, which is the lightest plane in dark mode and so the weakest place for text there.

satin

pairminlightdark
--accent on --ground4.55.044.73
--accent on --band4.54.504.51
--accent-deep on --ground4.56.237.02
--accent-deep on --band4.55.576.70
--ink on --ground1516.0616.45
--ink on --panelext1517.1615.08
--gate-ink on --gate1515.2617.20
--accent-ink on --accent4.55.464.52
--warm-ink on --warm4.54.585.45
--run on --ground77.877.64
--run on --band77.037.29
--run on --panelext78.407.00
--gate-run on --gate77.437.99
--ok on --ground4.55.399.65
--ok on --band4.54.829.21
--warn on --ground4.55.239.62
--warn on --band4.54.679.17
--bad on --ground4.55.436.97
--bad on --band4.54.856.65
--info on --ground4.56.087.57
--info on --band4.55.437.22

matte

pairminlightdark
--accent on --ground4.55.036.74
--accent on --band4.54.556.43
--accent-deep on --ground4.56.106.82
--accent-deep on --band4.55.516.51
--ink on --ground1516.6716.47
--ink on --panelext1517.2315.11
--gate-ink on --gate1517.2717.97
--accent-ink on --accent4.55.266.45
--warm-ink on --warm4.54.548.66
--run on --ground77.797.64
--run on --band77.047.29
--run on --panelext78.057.01
--gate-run on --gate78.468.34
--ok on --ground4.55.599.61
--ok on --band4.55.059.16
--warn on --ground4.55.429.57
--warn on --band4.54.909.13
--bad on --ground4.55.636.93
--bad on --band4.55.096.61
--info on --ground4.56.307.53
--info on --band4.55.697.18

Every rule passes, both finishes, both modes

Regenerated with npm run tokens; the numbers above come from that run, not from this page.

03 · Kept sets

Two palettes, still in the file.

Earlier palettes survive under renamed tokens rather than in a git history. Nothing reads them; map one onto the live set —--accent: var(--donor-accent) — to go back.

Legacy

--legacy-*

The cool corporate blue this tree shipped with before the one-token-set refactor.

Donor

--donor-*

The original walnut and stone palette of the atelier donor, with its Archivo and IBM Plex Mono faces.

Swapping one

One file. Then measure.

  1. 01 Solve it: node design/tools/ramp.mjs --preset satin, or with your own hue, warm hue and chroma.
  2. 02 Paste the blocks into src/styles/tokens.css. Nothing else in the tree changes.
  3. 03 npm run tokens — regenerates the contract and re-measures every rule, for both finishes.
  4. 04 Restart the dev server, then read this page again.