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.

Ground#090909 · L* 2.47where the sidebar livesIsland#141414 · L* 6.32the content planeSubtle#1C1C1C · L* 10.27box fillElevated#242424 · L* 14.20received bubble
the four surfaces in dark · hex and measured L*
Ground#F2F2F3 · L* 95.52where the sidebar livesIsland#FFFFFF · L* 100.00the content planeSubtle#F6F6F6 · L* 96.88box fillElevated#EDEDED · L* 93.75received bubble
the same four in light
Strong text#EDEDED · L* 93.75titles and valuesSecondary text#A1A1A1 · L* 66.24body and listsMuted text#8B8B8B · L* 57.86metadata and times
the three text weights in dark
Hairlinewhite 4% · between rowsStrong hairlinewhite 12% · control ringSelectedwhite 6% · neutral, never blueHoverwhite 4%
the four alpha values · dark

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.

240 × 140 · the shadow is the only thing to look at
the same box in light

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

Strong text · Dark 15.74:1 AASecondary text · Dark 7.13:1 AAMuted text · Dark 5.41:1 AAStrong text · Light 17.93:1 AASecondary text · Light 7.81:1 AAMuted text · Light 5.33:1 AA

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:32

    Perfect, let us review the proposal on Thursday…

    Agent
  • Clínica Alameda

    13:07

    A person took over the conversation.

    Person
  • Vinos del Maule

    12:05

    Meeting confirmed for Tuesday 10:00.

    Booked
ReplyView lead
Light

Inbox

12 conversations

  • Constructora Andes

    14:32

    Perfect, let us review the proposal on Thursday…

    Agent
  • Clínica Alameda

    13:07

    A person took over the conversation.

    Person
  • Vinos del Maule

    12:05

    Meeting confirmed for Tuesday 10:00.

    Booked
ReplyView lead
Dark · the same component with data-color-mode="dark"

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.

light sheet over dark canvas · same content
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