Design system
How this site is built
Every token below is read out of the stylesheet at build time, so this page cannot drift from the code. Change a value and the documentation changes with it.
59 tokens across 9 groups · generated by scripts/build-tokens.mjs from globals.css
Foundations
Surfaces
What everything sits on. Light, never dark.
sky-0#fbfdffsky-1#eff6fdsky-2#dbe9f9paper#ffffffline#e2eaf4
Ink
Text, in four weights of presence. Every one clears 4.5:1 on all four surfaces.
ink#16233a15.72 on paper15.42 on sky-014.43 on sky-113.69 on blue-softink-soft#3d4c648.69 on paper8.52 on sky-07.98 on sky-17.57 on blue-softmuted#4e5b6d6.91 on paper6.77 on sky-06.34 on sky-16.01 on blue-softfaint#5a6d865.29 on paper5.19 on sky-04.86 on sky-14.61 on blue-soft
Accent
Spent on state and meaning, never ornament. Each state has a soft fill and an ink measured against it.
blue#2d6ac75.25 on paper5.15 on sky-04.82 on sky-14.57 on blue-softblue-soft#e7f0fdblue-ink#245aa86.77 on paper5.89 on blue-softblue-soft-hover#d9e8fcblue-line#b9d2f3blue-line-soft#d8e6fablue-dash#a9c8f0sun#f2b134sun-soft#fdf3ddsun-ink#8a5e125.69 on paper5.16 on sun-softsun-line#c98d22sun-rail#e8d3a4sun-tape#fbe6besun-tape-edge#f9d89amint#2fa87cmint-soft#e4f4eemint-ink#1d7a585.28 on paper4.65 on mint-softmint-line#8fd4b6blush-ink#b3402c5.70 on paper
Typeface
Four faces, each with one job.
displayvar(--font-display), Georgia, serifbodyvar(--font-body), system-ui, -apple-system, sans-serifmonovar(--font-mono), ui-monospace, Menlo, monospacehandvar(--font-hand), cursive
Type scale
Eight steps. Nothing below 12px, anywhere.
fs-2xs12pxfs-xs13pxfs-sm15pxfs-md17pxfs-lg20pxfs-xl24pxfs-2xl30pxfs-3xl38px
Spacing
A 4px base. Layout uses gap, not stacked margins.
s14pxs28pxs312pxs416pxs524pxs632pxs748pxs864pxs996px
Radius
Four steps, by role rather than by taste.
r-sm6pxr-md12pxr-lg20pxr-pill999px
Line height
Tight for display, generous for reading.
lh-tight1.15lh-snug1.4lh-body1.65
Elevation
Three levels. Shadow means "separate object", so it is rationed.
shadow-sm0 1px 2px rgba(22, 35, 58, 0.04), 0 2px 8px rgba(22, 35, 58, 0.05)shadow-md0 4px 10px rgba(22, 35, 58, 0.06), 0 14px 34px rgba(22, 35, 58, 0.09)shadow-lg0 10px 20px rgba(22, 35, 58, 0.08), 0 28px 60px rgba(22, 35, 58, 0.12)
Every colour that carries text is measured where it is used: the four inks and the blue against paper, sky-0, sky-1, blue-soft, and each state ink against its own soft fill. A token that passes on paper can fail on a tinted band, and that is exactly where it slips through.
Components
Live, using the same classes as the rest of the site. Nothing here is a mock-up.
Buttons
One shape. Weight carries the hierarchy; the dashed one is a utility, never the main action.
State pills
Status is never carried by colour alone: every pill states its state in words.
Commit log
The journey is a git graph: a node per commit, gitmoji for the type, and a merge row for a promotion. Gitmoji appear here and nowhere else.
- rewrite end-to-end testing onto Playwright
- take over the design system
- Promoted to Senior Full-Stack EngineerOct 2025
Emphasis
Three levels, each meaning something different.
Highlighter marks the phrase that matters, bold carries a claim, and the hand is for asides only.
The rules
A system is the constraints, not the swatches. These are enforced on every change.
- Text clears 4.5:1 and any marker that carries meaning clears 3:1, both against the background actually rendered behind them, not the one assumed.
- Nothing is set below 12px, and every tap target is at least 32px on both axes.
- Every class defined has a use and every class used has a rule. A script checks both directions.
- Colour never carries meaning on its own. Each state has a word as well as a hue.
- Not everything is a card. Border, fill and shadow mean a separate object, so they are spent sparingly.
- Content is visible at rest. Anything that animates in has a failsafe, and plays again each time it comes back into view.
- Reduced motion is honoured everywhere.
- One metaphor per section: the journey is a git graph, so the paper planes stay out of it.