Light and dark
Both modes side by side, with the same hierarchy and the same capabilities.
The surface ladder, by mode
Four surfaces, three text weights and four alpha values. Each one with its hex, its measured L* and where it is used. The swatch is painted from the token, so the swatch and the number cannot disagree.
Rungs sit at least 3 L* apart, and carry no tint
Below 3 L*, two neighbouring surfaces read as the same one. The steps below are computed with the CIE L* formula every time the page opens, and the ui-tokens test measures them again against tokens.css.
The greys are neutral: each value has its three channels equal. This is Vercel, not hue 231 turned grey — the hue lives in the accent and in the brand pieces, not in the surfaces.
- Ground · #090909
- L* 2.47
- Island · #141414
- L* 6.32 · step 3.85
- Subtle · #1C1C1C
- L* 10.27 · step 3.95
- Elevated · #242424
- L* 14.20 · step 3.93
Until 2026-09-20: canvas #050506, surface #141417 and greys on hue 231. The study’s subtle was #1a1a1a and stepped 2.94 L*; it rose to #1c1c1c. The ground is #090909 and not the study’s #0a0a0a: with that one the island measured 1.0747:1 over the canvas and missed the 1.08 ui-tokens already required.
The island floats with light, and its shadow only falls down
Four shots in dark: a 5% hairline of light around it, a 4% line of light on top, a hard black line underneath and a long shadow offset downwards. In light there are three, without the lines of light.
A diffuse shadow all around, over a near-black ground, is a smudge and not height. No shot has a negative Y offset, and the test checks it by reading the CSS.
Until 2026-09-20 dark elevation was a top light plus a diffuse shadow all around. The founder saw it in round 2 and rejected it: over a near-black ground it reads as a smudge.
The shots, in order
- Dark · 1
- inset 0 0 0 1px white 5% — the hairline of light
- Dark · 2
- inset 0 1px 0 white 4% — the light on top
- Dark · 3
- 0 1px 0 black 70% — the hard line underneath
- Dark · 4
- 0 24px 48px -28px black 85% — the fall
- Light · 1
- 0 0 0 1px black 6%
- Light · 2
- 0 1px 2px black 4%
- Light · 3
- 0 20px 40px -24px black 14%
- Y offset
- always ≥ 0 — never upwards
The island lets the ground show
Eight pixels of margin against the ground on top, bottom and right; on the left the ground is already there, because that is where the sidebar lives. Radius 16.
That margin is the definition: without it the island is the screen, and the surface ladder stops being visible.
The sidebar is not a panel
It lives directly on the ground: no background of its own, no border, no shadow. Its text goes in the secondary weight and its icons one step quieter, and there is exactly one row lit.
It carries no specimen because there is nothing to draw: it is the absence of a surface. If you look at it and see a panel, somebody gave it a background.
The contrasts of the ladder
Measured with the same contrastRatio as the palette, each text against the island of its mode. Muted is also measured against the elevated surface, the lightest one in dark: 4.56:1.
The same markup, two modes
Inbox
12 conversations
Constructora Andes
14:32Perfect, let us review the proposal on Thursday…
AgentClínica Alameda
13:07A person took over the conversation.
PersonVinos del Maule
12:05Meeting confirmed for Tuesday 10:00.
Booked
Inbox
12 conversations
Constructora Andes
14:32Perfect, let us review the proposal on Thursday…
AgentClínica Alameda
13:07A person took over the conversation.
PersonVinos del Maule
12:05Meeting confirmed for Tuesday 10:00.
Booked
Both columns render exactly the same component. The right one only changes a data attribute. If the modes diverge, the bug is in a token — never in a fork of the UI.
Same hierarchy, same capabilities
Dark is not an alternative brand or a "pro" mode: it is the same product with less light. And the background is neutral, nearly black — the family blue lives in the accents, never tinted into the canvas.
What does change by design: the action blue steps down to #183E75 (the light one over a dark surface measures 2.64:1), and elevation changes engine: the surface step separates, and the shadow token adds a hairline of light. The shadow only falls downwards.
The public landing stays light in this phase — that is a decision of the landing, not a rule of the system.
Signal paper is a controlled exception
Notifications and toasts are legible receipts laid over the work, not a second dark room. That is why their sheet stays white in both modes and the state lives in the rule, the icon and the text.
The exception is declared on the subtree with tokens, never with a fork of the component. It does not apply to dialogs, menus or ordinary panels: those follow the product mode.
Signal centre
Notifications
Open handoff · AltoAndes Cloud
Needs a human decision.
Meeting booked
The invite was recorded.
- Canvas
- #F2F2F3 · #090909
- Surface
- #FFFFFF · #141414
- Text
- #171717 · #EDEDED
- Action
- #2457A8 · #183E75
- Link
- #2457A8 · #7AA3F0
- Signal paper
- white / ink in both modes
- Selection
- system → localStorage
- First paint
- no flash · boot script