A project
One sentence a recruiter can skim.
Nothing here is transcribed. The page parses
site/assets/style.css during the build, so a token that is
renamed or removed changes this sheet in the same pass. The specimens are
live elements, not screenshots: resize the window and the type scale moves,
because every step is a clamp rather than a fixed size.
A perfect fourth at the top of the viewport range easing to a minor third at the bottom, so the headline cannot bully the rest of the page on a phone.
Each token in light and dark. Both themes are audited
against WCAG AA on every build by npm run contrast.
--bg
#0b0a12same
--bg-2
#121020same
--bg-3
#1a172bsame
--text
#f3eff8same
--muted
#b2abc4same
--faint
#8f88a6same
--line
#221e33same
--line-firm
#352f4bsame
--accent
#ff9ec6same
--accent-bg
#2a1424same
--edge
rgb(255 220 240 / .07)same
Only things I have actually shipped with.
One sentence a recruiter can skim.
The edge highlight. A single hairline of light along the top of a raised surface is what stops a dark card reading as a hole cut in the page.
--sans |
"Inter Tight", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif |
|---|---|
--mono |
"JetBrains Mono", ui-monospace, "Cascadia Mono", Menlo, monospace |
Display is the same family, distinguished by weight and tracking rather than by a second typeface.
--display |
var(--sans) |
|---|---|
--pad |
clamp(1.15rem, 4.5vw, 4rem) |
--maxw |
1180px |
--readw |
68ch |
--radius |
10px |
--radius-sm |
6px |
--ease |
cubic-bezier(0.2, 0.8, 0.2, 1) |
The header's own height, named once so anything that has to clear it (the sticky rail, scroll-margin on anchor targets) stays correct if it ever changes.
--hdr-h |
3.4rem |
|---|
Named roles, so components ask for meaning rather than a number.
--t-hero |
var(--step-7) |
|---|---|
--t-sec |
var(--step-4) |
--t-item |
var(--step-2) |
--t-body |
var(--step-0) |
--t-small |
var(--step--1) |
--t-micro |
var(--step--2) |
Line heights tighten as type grows, which is how it stays readable at both ends instead of loose at the top and cramped at the bottom.
--lh-display |
0.98 |
|---|---|
--lh-heading |
1.12 |
--lh-body |
1.62 |
--lh-tight |
1.3 |
Tracking follows size in the opposite direction. A grotesque set this large needs more negative tracking than a serif did.
--tr-display |
-0.042em |
|---|---|
--tr-heading |
-0.024em |
--tr-body |
-0.006em |
--tr-caps |
0.16em |