[01]
Vercel Geist
Vercel's design system. Geist Sans and Geist Mono, a grey-first palette, and colour scales where every step has one job.
specimen · Geist Sans, with Geist Mono for code and labels
- heading-72 · 72
- heading-48 · 48
- heading-32 · 32
- heading-20 · 20
- copy-16 · 16
- label-13 · 13
- Step 100: bg
- Step 200: bg hover
- Step 300: bg active
- Step 400: border
- Step 500: border hover
- Step 600: border active
- Step 700: solid
- Step 800: solid hover
- Step 900: text 2
- Step 1000: text 1
Geist names each style by its size: text-heading-72 down to text-heading-14, then label, copy and button styles.
5 things I steal
- Type scale
- Name styles by their size and role (heading-32, copy-16, label-13). Nobody has to guess what 'h3' means.
- Colour tokens
- Ten steps per colour, each with one job: 100 to 300 backgrounds, 400 to 600 borders, 700 to 800 solid fills, 900 to 1000 text.
- Spacing
- Keep space in a small set of steps and let grey borders, not boxes of colour, separate things.
- Motion
- Quiet, short transitions on hover and open. Motion confirms an action; it never performs.
- States
- Default, hover and active are neighbouring steps on the same scale, so every state is one step away.
Do this with the toolkit
I set my greys as ten role-named steps with the oklch picker, then wire them into shadcn's CSS variables.