All designs
Vercel
Deployment platform. Monochrome discipline, Geist everywhere, hairline geometry.
extracted from https://vercel.com/ on 2026-07-21
Agentic Infrastructure - Vercel
light-leaning · 4 stylesheets · 120 native variables
fonts Geist Mono · Georgia · GeistSans · GeistPixelSquare · GeistPixelGrid · GeistPixelCircle · GeistPixelTriangle · GeistPixelLine
Preview
---
name: vercel-com-design-system
source: https://vercel.com/
extracted: 2026-07-21
theme: light # measured from neutral usage weight
colors: # roles inferred from usage frequency + luminance; names verified against values
canvas: "#ffffff"
ink: "#1f1f1f"
text-muted: "#878787"
surface: "#eaeaea"
hairline: "#cccccc"
accent: "#0070f3" # cyan
accent-2: "#ef4444" # red
accent-3: "#ff9900" # orange
fonts:
primary: "GeistSans"
serif: "Georgia"
mono: "Geist Mono"
---
# Agentic Infrastructure - Vercel — Design System
Extracted from **https://vercel.com/** on 2026-07-21.
> The autonomous stack for every app and agent.
Every value below is mined from the site's live CSS (120 native custom properties, ranked usage counts). Role assignments are inferred from usage and luminance and marked as such — treat them as a strong starting point, not gospel.
## Overview
The system reads as light: measured neutral usage weighs 202 light against 186 dark. The palette is chromatic: 12 saturated values against 10 neutrals, led by cyan (`#0070f3`). **GeistSans** carries the interface; **Georgia** appears in serif roles; **Geist Mono** handles code and data. Geometry mixes sharp corners (2px) with full pills.
## Usage rules
Derived from the measured usage below — each rule cites its evidence.
- Chromatic color is only 24% of measured color usage. Reserve `accent` (`#0070f3`) for primary actions, links, and emphasis — spreading it into body text or large surfaces breaks the ratio that defines this look.
- The theme is light (measured neutral weight 202:186). Don't flip individual sections to the opposite mode.
- `6px` is the workhorse radius (x27); treat the other radii as exceptions, not options.
- The only shadows are blur-less hairline offsets — this system barely uses elevation; don't add soft drop shadows.
- Spacing sits on a 4px grid (10 of 12 values divisible by 4) — stay on it.
- `Geist Mono` is the monospace — keep it for code, data, and metadata roles.
## Colors
### Neutrals (light → dark)
| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `neutral-50` | `#ffffff` | 161 | **canvas** — lightest neutral, matches the measured light-leaning theme |
| `neutral-100` | `#eaeaea` | 26 | **surface** — neutral closest to canvas luminance |
| `neutral-200` | `#cccccc` | 15 | **hairline** — next neutral near canvas, hairline-border weight |
| `neutral-400` | `#a0a0a0` | 6 | — |
| `neutral-500` | `#878787` | 9 | **text-muted** — most-used mid-luminance neutral |
| `neutral-600` | `#666666` | 8 | — |
| `neutral-700` | `#4b4c57` | 11 | — |
| `neutral-800` | `#404040` | 6 | — |
| `neutral-900` | `#333333` | 15 | — |
| `neutral-950` | `#1f1f1f` | 19 | **ink** — darkest neutral, highest contrast against canvas |
### Accents
| Token | Value | Usage | Inferred role |
| --- | --- | --- | --- |
| `cyan` | `#0070f3` | 13 | **accent** — most-used chromatic color |
| `red` | `#ef4444` | 10 | **accent-2** — supporting chromatic color |
| `orange` | `#ff9900` | 10 | **accent-3** — supporting chromatic color |
| `pale-cyan` | `#e1f0fd` | 9 | — |
| `lime` | `#95bf47` | 7 | — |
| `pale-orange` | `#ffe8cc` | 7 | — |
| `pink` | `#de2670` | 6 | — |
| `red-2` | `#fe5f57` | 6 | — |
| `indigo` | `#7928ca` | 5 | — |
| `pink-2` | `#eb367f` | 5 | — |
| `orange-2` | `#bd5200` | 4 | — |
| `pale-green` | `#d3f9d8` | 4 | — |
### Modern color values (kept verbatim)
- `lab(0% 0 0)`
- `lab(96.5005% 4.18508 1.52328)`
- `lab(98.6252% -.635922 8.42309)`
- `lab(38.4009% 52.6132 -92.3857)`
- `lab(96.2416% 2.28849 -5.51657)`
- `lab(93.0838% 4.35197 -9.88284)`
- `lab(35.2783% 67.9912 -88.793)`
- `lab(84.7652% -1.94535 -7.93337)`
- `lab(48.0876% -2.03595 -16.5814)`
- `lab(98.2596% -.247031 -.706708)`
- `lab(1.90334% .278696 -5.48866)`
- `lab(96.1634% .0993311 -.364041)`
### Dark mode
The source defines 60 dark-mode variants (via dark selector). Both halves of the system, first 30:
| Token | Light | Dark |
| --- | --- | --- |
| `--tw-gradient-from` | — | `var(--ds-background-200)` |
| `--tw-gradient-via` | — | `var(--ds-background-200)` |
| `--tw-gradient-to` | — | `var(--ds-background-100)` |
| `--tw-shadow` | — | `0 0 0 1px var(--tw-shadow-color,var(--ds-gray-600))` |
| `--tw-ring-color` | — | `var(--ds-gray-700)` |
| `--tw-invert` | — | `invert(0%)` |
| `--leaderboard-chart-cursor-fill` | — | `#27272a` |
| `--context-card-tip-stroke` | — | `#252525` |
| `--geist-cyan` | — | `#50e3c2` |
| `--geist-warning` | — | `#f5a623` |
| `--geist-error` | — | `#e00` |
| `--ds-black` | — | `#000` |
| `--ds-white` | — | `#fff` |
| `--ds-background-100` | — | `#fff` |
| `--ds-background-200` | — | `#fafafa` |
| `--ds-gray-100` | — | `#f2f2f2` |
| `--ds-gray-200` | — | `#ebebeb` |
| `--ds-gray-300` | — | `#e6e6e6` |
| `--ds-gray-400` | — | `#eaeaea` |
| `--ds-gray-500` | — | `#c9c9c9` |
| `--ds-gray-600` | — | `#a8a8a8` |
| `--ds-gray-700` | — | `#8f8f8f` |
| `--ds-gray-800` | — | `#7d7d7d` |
| `--ds-gray-900` | — | `#4d4d4d` |
| `--ds-gray-1000` | — | `#171717` |
| `--ds-gray-alpha-100` | — | `#0000000d` |
| `--ds-gray-alpha-200` | — | `#00000015` |
| `--ds-gray-alpha-300` | — | `#0000001a` |
| `--ds-gray-alpha-400` | — | `#00000014` |
| `--ds-gray-alpha-500` | — | `#00000036` |
`variables.css` ships these as a `prefers-color-scheme: dark` override block.
## Typography
**GeistSans** is the primary interface face; **Georgia** covers serif roles; **Geist Mono** is the monospace. Full list by usage:
| Family | Usage |
| --- | --- |
| Geist Mono | 7 |
| Georgia | 3 |
| GeistSans | 2 |
| GeistPixelSquare | 2 |
| GeistPixelGrid | 2 |
| GeistPixelCircle | 2 |
| GeistPixelTriangle | 2 |
| GeistPixelLine | 2 |
**Size scale (px):** `12`, `13`, `14`, `16`, `18`, `20`, `24`, `32`, `40`, `48`, `56`, `64`
**Weights in use:** `100` (x8), `400` (x12), `450` (x30), `500` (x43), `600` (x33), `700` (x8)
**Line-heights (unitless):** `0.75`, `1`, `1.05`, `1.1`, `1.2`, `1.3`, `1.5`, `1.6`
**Letter-spacing values:** `-2.88px`, `-2.4px`, `-1.28px`, `-.96px`, `-.4px`, `-.32px`
## Spacing
Most-used values (px): `1`, `2`, `4`, `8`, `12`, `16`, `20`, `24`, `32`, `40`, `48`, `64`
10 of 12 values sit on a 4px grid.
## Border radius
| Token | Value | Usage |
| --- | --- | --- |
| `radius-sm` | `2px` | 5 |
| `radius-md` | `.25rem` | 20 |
| `radius-lg` | `6px` | 27 |
| `radius-xl` | `8px` | 12 |
| `radius-2xl` | `12px` | 17 |
| `radius-3xl` | `100%` | 6 |
| `radius-4xl` | `128px` | 6 |
| `radius-full` | `50%` | 8 |
## Shadows (ordered by blur radius)
- `shadow-sm` — `0 1px 2px #0000000a` (x8)
## Breakpoints
`370px`, `375px`, `380px`, `383px`, `384px`, `400px`, `401px`, `440px`
## Starter recipes
Tokens composed into components. The source site's real components were **not** inspected — these are starting points built from the extracted values, with contrast ratios computed rather than assumed.
```css
.button-primary {
background: var(--color-accent); /* #0070f3 */
color: var(--color-canvas); /* #ffffff — contrast 4.6:1 */
border-radius: 9999px; /* pill — mined as 50% */
font-weight: 500;
}
.card {
background: var(--color-surface); /* #eaeaea */
border: 1px solid var(--color-hairline); /* #cccccc */
border-radius: 6px; /* most-used finite radius */
box-shadow: var(--shadow-sm);
}
.input {
background: var(--color-canvas); /* #ffffff */
color: var(--color-ink); /* #1f1f1f — contrast 16.5:1 */
border: 1px solid var(--color-hairline); /* #cccccc */
border-radius: 2px;
/* placeholder color: var(--color-text-muted) #878787 */
}
.nav {
background: var(--color-canvas); /* #ffffff */
border-bottom: 1px solid var(--color-hairline); /* #cccccc */
color: var(--color-ink); /* #1f1f1f */
/* inactive links: var(--color-text-muted) #878787 */
/* active link: var(--color-accent) #0070f3 — contrast vs canvas 4.6:1 */
}
.modal {
background: var(--color-surface); /* #eaeaea */
border-radius: 6px;
box-shadow: var(--shadow-sm); /* largest mined shadow */
}
.modal-backdrop {
background: color-mix(in srgb, var(--color-ink) 55%, transparent); /* scrim from #1f1f1f */
}
.input-error {
border-color: #ef4444; /* mined token: red */
/* error text: #ef4444 on canvas — contrast 3.8:1, below AA; darken for message text */
}
.input-success {
border-color: #d3f9d8; /* mined token: pale-green */
}
```
## Observations
- 10 of 22 extracted colors are neutrals.
- 1 distinct shadow; the softest reaches 0px blur.
- 8 breakpoints, from 370px to 440px.
- The site ships a large native token system (120+ custom properties) — prefer those names when extending it.
## Native CSS custom properties
First 40 of 120:
```css
:root {
--value: 0;
--font-sans: var(--font-geist-sans);
--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--color-red-50: #fef2f2;
--color-amber-50: #fffbeb;
--color-indigo-600: #4f39f6;
--color-violet-50: #f5f3ff;
--color-violet-100: #ede9fe;
--color-violet-700: #7008e7;
--color-slate-300: #cad5e2;
--color-slate-500: #62748e;
--color-gray-50: #f9fafb;
--color-gray-200: var(--ds-gray-200);
--color-gray-300: var(--ds-gray-300);
--color-gray-500: var(--ds-gray-500);
--color-gray-600: var(--ds-gray-600);
--color-gray-700: var(--ds-gray-700);
--color-gray-800: var(--ds-gray-800);
--color-gray-900: var(--ds-gray-900);
--color-gray-950: #030712;
--color-zinc-100: #f4f4f5;
--color-zinc-600: #52525c;
--color-zinc-900: #18181b;
--color-neutral-700: #404040;
--color-neutral-800: #262626;
--spacing: .25rem;
--container-xs: 20rem;
--container-sm: 401px;
--container-md: 601px;
--container-lg: 961px;
--container-xl: 1200px;
--container-2xl: 1400px;
--container-3xl: 48rem;
--container-4xl: 56rem;
--container-5xl: 64rem;
--text-xs: .75rem;
--text-xs--line-height: calc(1 / .75);
--text-sm: .875rem;
--text-sm--line-height: calc(1.25 / .875);
--text-base: 1rem;
}
```
## Components
4 UI components were detected and rebuilt from the site's own CSS (see `components.html` for the rendered gallery):
- **Buttons** (3) — `Copy Logo as SVG`, `Products`, `Ask AI`
- **Navigation** (1) — `5 links`
Each is a reconstruction: real component classes matched against the extracted stylesheet with custom properties resolved. Hover/focus states are not captured.
## Files
- `tailwind.css` — Tailwind v4 `@theme` block; tokens become utilities (e.g. `bg-neutral-900`, `text-cyan`). Semantic roles alias the base palette; sizes carry line-heights; dark mode included.
- `preview.html` — a visual style-guide of this system: palette cards, type scale, spacing tables, and do/don't guidelines.
- `components.html` — a rendered gallery of the detected UI components, each with a copyable snippet.
- `variables.css` — framework-agnostic `:root` variables with semantic aliases and a `data-theme="dark"` block.
- `tokens.json` — W3C DTCG design tokens: semantic aliases, composite shadow and typography tokens, for Figma plugins, Style Dictionary, etc.
