Night and paper
The person’s world is dark and lit by persona colour. The business world is daylight paper. Same token names, two sets of values: components never know which theme they are in.
Design system
The vocabulary behind the landing page. Every colour, size, radius, shadow and duration below is read live from shared/tokens.css, so this page cannot drift from the site.
The person’s world is dark and lit by persona colour. The business world is daylight paper. Same token names, two sets of values: components never know which theme they are in.
A persona is a card you hold close to your chest (.pcard), fanned like a hand. A door (.arch) is where a business stands, and the page opens like one. Never a dome on a persona: it reads as a gravestone.
○ none, ◐ coarse, ● precise. The same marks drive the dial, the fact field, the legend and the console tags, so a share level always looks the same.
Three signature moves: a thing opens, a value resolves from blur to sharp, a retinue re-orders. Everything else is quiet. Reduced motion keeps every state, drops the travel.
Semantic tokens, resolved per theme. The ratio on each chip is WCAG contrast of that token as text against the theme’s --bg (AA needs 4.5 for body text, 3 for large text and graphics).
Each business console owns one colour (shared/usecases.js). On night it is lifted to a luminous tone (--p-lit, same hue and chroma, lightness .78); on paper it is used as is. Set --p on any element, or on :root to retarget the whole page’s light.
Instrument Serif for voice (display and headings, italic for the one idea in a line), Inter for reading, the system monospace for receipts, labels and anything a machine said. Fluid sizes use clamp(); there are no breakpoint-only type sizes.
--fs-displayDoor
--fs-h1--fs-h2--fs-h3--fs-ledeBusinesses ask your personas, you decide what each one shares, and every answer comes with a receipt.
--fs-baseBody copy sits at 16px on a 1.6 line height, in Inter, with text-wrap: pretty so paragraphs end well.
--fs-micro / monoHow it works
Receipt rcp_4e1c written to both ledgers.
4px base, half-step scale.
Soft, never sharp; pill for anything you press.
Highlight edge plus a long, cool shadow.
.pcard is a rounded card (--r-2xl, width --card-w) lit by --p. Add .edge for the lit rim. Several cards fan from a pivot below, like a hand; the front one is live. Never put a dome on a persona: a dome on a slab reads as a gravestone.
.arch sets the top corners to half the width (--arch-w). It is for openings only: the way into the business side and the doorways of the finale. Doors nest (echo rings) and open (@keyframes rt-open).
Durations and easings are tokens; reduced motion collapses them to 1ms, so a state change is still a state change. Press replay.
A door opens. --ease-open, --dur-stage.
A value resolves from blur to sharp. .focus-in for entrances; .focus-swap when a value changes in place, so the old one is never removed first. --ease-settle, --blur-focus.
$200–250k
The hand re-orders on a spring. --ease-spring.
| Token | Value | Use |
|---|
Shown in both themes. State lives in ARIA (aria-selected, aria-checked, aria-pressed, aria-expanded), so a component’s look and its accessibility cannot disagree. Tab through them.
<link rel="stylesheet" href="shared/tokens.css">
<link rel="stylesheet" href="shared/components.css">
<link rel="stylesheet" href="my-page.css"> /* @layer page { … } */Tokens first, then components, then the page’s own layer. Reference tokens, never hex.
<section data-theme="paper">
…every component re-themes
</section>Use paper for anything a business operates; night for anything a person owns.
<a class="chip" style="--p:#b4531f">
Tenant
</a>
/* :root { --p: … } retargets the light */One variable drives dot, rim, glow and tint, in either theme.
--dim is decoration only; small text uses --soft or stronger.--focus) on keyboard focus; never remove it.prefers-reduced-motion removes travel, blur and tilt.shared/brand.js, never from the markup.The person’s console and the business consoles still carry their own stylesheets. tokens.css ships compatibility aliases (--panel, --line2, --mint …) so they can adopt it later without touching a rule.