Vercel

An inspired interpretation of Vercel's design language — a developer-platform brand whose surface is a stark black-and-ink duet on near-white canvas, broken at hero scale by a mul…

Back to all styles

A live page in this style is not built yet — the CSS variables and the prompt below are enough to reproduce it.

At a glance

24tokens
11type steps
8radius steps
4pxspacing base

Vercel, in one page

Vercel is a developer-platform brand — the page is a deployment dashboard's marketing surface, written for engineers who already know the syntax. It earns that posture with one of the cleanest stark systems on the web: near-white {colors.canvas-soft} body background, ink-near-black {colors.ink} text, a 200-step gray scale that gives every divider, border, and disabled state its own deliberate step. The only place the brand introduces colour at marketing scale is the multi-stop mesh gradient ({colors.gradient-develop-start} → {colors.gradient-preview-end} → {colors.gradient-ship-start} → cyan / magenta / amber) that floats in atmospheric backdrops, never miniaturised to a swatch. That gradient is the entire decoration system.

Type is the second decisive voice. The brand's own custom geometric sans (Geist) carries display, body, button — everything narrative — at weight 600 for display, 500 for buttons, 400 for body. A matching monospaced face (Geist Mono) carries technical labels: terminal mockups, code blocks, sometimes filename captions. Headlines are sentence-case with aggressive negative letter-spacing (-2.4px at 48 px hero) — the brand never letter-spaces positively, never goes uppercase outside of mono labels.

Surfaces use a four-step ladder: {colors.canvas} (pure white for cards), {colors.canvas-soft} 98% (the page body), {colors.canvas-soft-2} 95% (occasional inset region), {colors.primary} (the deep ink-near-black used as the polarity-flipped band when a section needs the dark mode treatment). Shadows are exceptionally subtle — every elevated card carries a stacked shadow built from 0px 1px 1px #00000005 + 0px 2px 2px #0000000a + an inset border. Cards never float on heavy drop-shadow; they sit on the page held by hairline + soft glow.

Key Characteristics:

Do's and don'ts

Do

  • Reserve {colors.primary} (#171717) for primary CTAs across the page. Black ink IS the conversion target.
  • Use {rounded.pill} 100 px for every marketing-scale CTA and {rounded.sm} 6 px for nav-scale buttons. The two pill scales coexist deliberately.
  • Set every headline in {typography.display-*} weight 600, sentence-case, often period-terminated. Aggressive negative tracking is part of the voice.
  • Use the brand mesh gradient as atmospheric decoration at hero scale only — never miniaturise it to an icon, never reduce to a single colour.
  • Layer stacked shadows (multiple small offsets with inset hairline) rather than single heavy drops. The brand's elevation is calmer than Material.
  • Cycle page surfaces in {colors.canvas-soft} → {colors.canvas} → {colors.primary} polarity-flipped bands; the dark band IS the depth cue.
  • Set every code block and technical eyebrow in {typography.code} / {typography.caption-mono}. Mono is the voice of the platform.

Don't

  • Don't introduce a sixth accent colour. The brand operates with ink + gray + the four-pair gradient palette; new accents flatten the voice.
  • Don't render headlines in all-caps. Sentence-case + negative tracking is non-negotiable.
  • Don't drop a single heavy drop-shadow on cards. The brand's elevation is built from stacked small offsets + inset hairline rings.
  • Don't render the brand gradient at icon scale or in a single-colour reduced form. The gradient lives at hero scale only.
  • Don't promote the geometric sans to weight 700. The brand's display ceiling is 600.
  • Don't pair the marketing 100-px pill CTA shape with the 6-px nav radius on the same screen — pick a scale and stay there.
  • Don't set body paragraphs in the mono face. The mono is for code + technical labels only.

Copy this into your AI builder

Paste it as-is. Every value below was measured from the original site, not guessed.

Assembled from the measured tokens — the source document has no prompt block.

Build a page in the Vercel design language. Follow the measured tokens below — do not substitute your own palette.

Colors:
- primary: #171717
- on-primary: #ffffff
- ink: #171717
- body: #4d4d4d
- mute: #888888
- hairline: #ebebeb
- hairline-strong: #a1a1a1
- canvas: #ffffff
- canvas-soft: #fafafa
- canvas-soft-2: #f5f5f5

Type:
- families: Geist, Inter, -apple-system, Geist Mono
- scale: 12, 13, 14, 16, 18, 20, 24, 28, 32
- weights: 400, 500, 600

Shape:
- radius: 0, 4, 6, 8, 12, 16, 64, 100
- elevation: `ex-toast` — Toast notification surface — feature-card shape + medium shadow.

Spacing: 4, 8, 12, 16, 24, 32, 40, 48, 64, 96

Rules:
- Reserve `{colors.primary}` (`#171717`) for primary CTAs across the page. Black ink IS the conversion target.
- Use `{rounded.pill}` 100 px for every marketing-scale CTA and `{rounded.sm}` 6 px for nav-scale buttons. The two pill scales coexist deliberately.
- Set every headline in `{typography.display-*}` weight 600, sentence-case, often period-terminated. Aggressive negative tracking is part of the voice.
- Use the brand mesh gradient as atmospheric decoration at hero scale only — never miniaturise it to an icon, never reduce to a single colour.
- Layer stacked shadows (multiple small offsets with inset hairline) rather than single heavy drops. The brand's elevation is calmer than Material.
- Cycle page surfaces in `{colors.canvas-soft}` → `{colors.canvas}` → `{colors.primary}` polarity-flipped bands; the dark band IS the depth cue.

Avoid:
- Don't introduce a sixth accent colour. The brand operates with ink + gray + the four-pair gradient palette; new accents flatten the voice.
- Don't render headlines in all-caps. Sentence-case + negative tracking is non-negotiable.
- Don't drop a single heavy drop-shadow on cards. The brand's elevation is built from stacked small offsets + inset hairline rings.
- Don't render the brand gradient at icon scale or in a single-colour reduced form. The gradient lives at hero scale only.
- Don't promote the geometric sans to weight 700. The brand's display ceiling is 600.
- Don't pair the marketing 100-px pill CTA shape with the 6-px nav radius on the same screen — pick a scale and stay there.

Keep every value literal. If a token is given, use that exact value.

The specification

Colour paletteRead the full spec

Brand & Accent

  • Ink ({colors.primary} — #171717): The single primary CTA color. Black-near-pure ink that carries every Sign Up pill, every footer CTA, the dark-band polarity-flip. Used as text color throughout the page on light surfaces. (Resolved from --ds-gray-1000.)
  • Cyan ({colors.cyan} — #50e3c2): A signature mint-cyan used in the brand gradient and inside Geist-system spotlight tokens. Visible inside the hero gradient stops.
  • Highlight Pink ({colors.highlight-pink} — #ff0080): The brand's highlight magenta, used as the high-saturation stop in the preview-gradient pair.
  • Violet ({colors.violet} — #7928ca): The deep purple used as the start of the preview-gradient and inside developer-console highlights.
  • Link Blue ({colors.link} — #0070f3): The brand's primary link color and the legacy --geist-success semantic.

Surface

  • Canvas ({colors.canvas} — #ffffff): The pure-white card / dialog / modal surface.
  • Canvas Soft ({colors.canvas-soft} — #fafafa): The default page background — 98 % white. Almost every section sits on this tone.
  • Canvas Soft 2 ({colors.canvas-soft-2} — #f5f5f5): A slightly deeper inset surface for "code editor inner background", template-card hover states, and dropdown menus.
  • Hairline ({colors.hairline} — #ebebeb): 1 px dividers — table rows, card borders, input borders.
  • Hairline Strong ({colors.hairline-strong} — #a1a1a1): The 500-level gray, used as the slightly-stronger divider on light bands and as the deemphasised text color.

Text

  • Ink ({colors.ink} — #171717): Every heading and body paragraph on light surfaces.
  • Body ({colors.body} — #4d4d4d): Secondary text — sub-headings, body captions, nav-link inactive text, footer column body.
  • Mute ({colors.mute} — #888888): Lowest-priority text — placeholder text, fine print, low-key labels.
  • On Primary ({colors.on-primary} — #ffffff): All text on {colors.primary} surfaces.

Semantic

  • Success / Link ({colors.success} — #0070f3): The brand's legacy success indicator doubles as the primary link color. Visible underline-on-hover for inline body links.
  • Link Deep ({colors.link-deep} — #0761d1): The pressed / visited tone for inline links.
  • Link Bg Soft ({colors.link-bg-soft} — #d3e5ff): Soft pastel blue fill for "what's new" pill banners and informational badges.
  • Error ({colors.error} — #ee0000): Validation red for destructive actions and form errors.
  • Error Soft ({colors.error-soft} — #f7d4d6): Soft pastel red for destructive-state backgrounds.
  • Error Deep ({colors.error-deep} — #c50000): Pressed / deep destructive state.
  • Warning ({colors.warning} — #f5a623): Caution / pending status indicator.
  • Warning Soft ({colors.warning-soft} — #ffefcf) / Warning Deep ({colors.warning-deep} — #ab570a): Background + pressed variants.

Brand Gradient

The brand's signature decoration is a three-pair gradient stack:

  • Develop ({colors.gradient-develop-start} #007cf0 → {colors.gradient-develop-end} #00dfd8) — the blue-to-teal pair used to mark the "deploy" / "develop" rhythm.
  • Preview ({colors.gradient-preview-start} #7928ca → {colors.gradient-preview-end} #ff0080) — the violet-to-pink pair used for "preview" surfaces.
  • Ship ({colors.gradient-ship-start} #ff4d4d → {colors.gradient-ship-end} #f9cb28) — the coral-to-amber pair used for "ship" surfaces.

The three pairs collapse into a single multi-color mesh gradient when used as the hero atmospheric backdrop. Treat the gradient as one unified object — do not crop down to a single colour, do not reorder the stops, and do not miniaturise. Used at hero scale only.

Type scaleRead the full spec

Font Family

Two custom faces carry the entire system:

  1. A custom geometric sans (extracted as Geist) for every display, body, button, link, and label. Weights 400 / 500 / 600 are the working set; the face never appears in 700 or heavier. Display sizes are tracked aggressively negative (-2.4 px at 48 px hero, -1.28 px at 32 px section); body stays at neutral or slightly-negative tracking.
  2. A custom monospaced face (extracted as Geist Mono) for terminal mockups, code blocks, and small mono-caption labels — anything that wants to signal "technical." Weight 400 only at 12 – 13 px. Tracking neutral.

A condensed display sans (Space Grotesk) is loaded as a third face for occasional editorial moments but does not render as the primary face anywhere in the captured surfaces.

Hierarchy

TokenSizeWeightLine HeightLetter SpacingUse
{typography.display-xl}48px60048px-2.4pxHero headline ("Build and deploy on the AI Cloud.").
{typography.display-lg}32px60040px-1.28pxSection headlines ("Your frontend, delivered.", "A compute model for all workloads.").
{typography.display-md}24px60032px-0.96pxCard-cluster headlines, pricing-tier names.
{typography.display-sm}20px60028px-0.6pxInline display micro-headings.
{typography.body-lg}18px40028px0Lead paragraphs under section headlines.
{typography.body-md}16px40024px0Default body paragraph.
{typography.body-md-strong}16px50024px0Bolded inline body.
{typography.body-sm}14px40020px-0.28pxSecondary body, nav-link text, button-md labels.
{typography.body-sm-strong}14px50020px-0.28pxNav CTA labels, table-row emphasis.
{typography.caption}12px40016px0Footer secondary lines, badge labels.
{typography.caption-mono}12px40016px0Section eyebrows and label captions that want a technical voice.
{typography.code}13px40020px0Inline code, terminal mockups, command snippets.
{typography.button-md}14px50020px0Small / nav-scale button labels.
{typography.button-lg}16px50024px0Marketing-scale pill button labels.

Principles

  • Negative tracking is part of the voice. Display sizes use aggressive -2.4 to -0.6 px tracking. Reverting to default tracking breaks the brand.
  • Sentence-case headlines, period-terminated. Headlines like "Build and deploy on the AI Cloud." end with a deliberate period — that punctuation is part of the brand's voice.
  • Mono for the technical layer only. Section eyebrows, code blocks, terminal mockups. Body paragraphs never set in mono.
  • Weight 600 is the display ceiling. The geometric sans never appears at 700 / 800. The brand reads as a calmer system because of this.

Note on Font Substitutes

The two primary faces are proprietary (custom-cut for the brand). Open-source substitutes:

  • Geometric sans — *Inter* (400 / 500 / 600) is the closest stylistic match; font-feature-settings: "ss01", "ss02" enables the geometric alternates. *Satoshi* is a passable second choice.
  • Monospace — *JetBrains Mono* (400) at 12 – 13 px matches the technical voice. *IBM Plex Mono* is the second-best option.
Components and layoutRead the full spec

Buttons

button-primary — the canonical 100-px-radius black pill, marketing scale.

  • Background {colors.primary}, text {colors.on-primary}, label set in {typography.button-lg}, padding 0px {spacing.sm} 12 px, shape {rounded.pill} 100 px. Renders ~48 px tall when paired with the marketing flex layout.

button-secondary — the white pill paired with the black primary inside marketing bands.

  • Background {colors.canvas}, text {colors.ink}, same typography + padding as button-primary, shape {rounded.pill}.

button-primary-sm — the smaller-scale primary pill used inside nav and pricing-card CTAs.

  • Background {colors.primary}, text {colors.on-primary}, label set in {typography.button-md} (14 px / 500), shape {rounded.pill}.

button-secondary-sm — the smaller-scale white pill paired with button-primary-sm.

  • Background {colors.canvas}, text {colors.ink}, same typography + shape as button-primary-sm.

tab-ghost — the centred-row tab pill ("AI Apps / Web Apps / Ecommerce / Marketing / Platforms").

  • Background {colors.canvas}, text {colors.ink}, label set in {typography.body-sm}, padding 0px {spacing.md}, shape {rounded.pill-sm} 64 px.

icon-button-circular — the circular icon container (often a "?" or arrow inside).

  • Background {colors.canvas}, dark icon, 1 px solid hairline border, shape {rounded.full}.

Nav CTAs:

nav-cta-signup — the small black "Sign Up" button in the nav row.

  • Background {colors.primary}, text {colors.on-primary}, label {typography.body-sm-strong}, padding 0px {spacing.xs}, height 28 px, shape {rounded.sm} 6 px (the brand's --geist-radius).

nav-cta-login — the white "Log In" button in the nav.

  • Background {colors.canvas}, text {colors.ink}, same typography / height / shape as nav-cta-signup.

nav-cta-ask-ai — the small "Ask AI" button with a faint border.

  • Background {colors.canvas}, text {colors.ink}, 1 px solid {colors.hairline} border (extracted as 0px solid rgb(235, 235, 235)), same typography / height / shape.

Cards & Containers

card-marketing — the canonical marketing feature card (3-up section cards).

  • Background {colors.canvas}, text {colors.ink}, padding {spacing.lg} 24 px, shape {rounded.md} 8 px (the --geist-marketing-radius). Carries Level 3 soft-stack shadow.

card-marketing-large — the larger marketing card used for "compute model" / "AI Gateway" callouts.

  • Background {colors.canvas}, text {colors.ink}, padding {spacing.xl}, shape {rounded.lg} 12 px. Carries Level 4 float-stack shadow.

card-soft — the soft-tinted card used inside cluster groups (lighter than canvas-soft).

  • Background {colors.canvas-soft}, text {colors.ink}, padding {spacing.lg}, shape {rounded.md}.

template-card — the deploy-template card in the "Deploy your first app" grid.

  • Background {colors.canvas}, text {colors.ink}, padding {spacing.md} 16 px, shape {rounded.md} 8 px. Hosts a 16:9 thumbnail at the top.

code-editor-mockup — the dark code-preview surface inside marketing bands.

  • Background {colors.primary}, text {colors.on-primary}, body in {typography.code} (13 px / Geist Mono), padding {spacing.lg} 24 px, shape {rounded.md} 8 px.

pricing-card — the default pricing-tier card.

  • Background {colors.canvas}, text {colors.ink}, padding {spacing.xl} 32 px, shape {rounded.lg} 12 px. Inside: tier name in {typography.display-md}, price in {typography.display-xl}, feature list in {typography.body-md} rows, CTA at the bottom.

pricing-card-featured — the polarity-flipped "Pro" tier card.

  • Background {colors.primary}, text {colors.on-primary}, same shape + padding as pricing-card. CTA inverts to button-secondary-sm (white pill on black card).

Inputs & Forms

form-input — the canonical text input.

  • Background {colors.canvas}, text {colors.ink}, 1 px solid {colors.hairline} border, body in {typography.body-sm} (14 px), padding 0px {spacing.sm}, height 40 px (the brand's --geist-form-height), shape {rounded.sm} 6 px.

form-input-sm — small-height variant (32 px tall) for tight forms.

  • Same as form-input but height 32 px (the --geist-form-small-height).

form-input-lg — large-height variant (48 px tall) for hero CTAs.

  • Same as form-input but height 48 px (the --geist-form-large-height); body in {typography.body-md} 16 px.

Navigation

nav-bar — the sticky top nav.

  • Background {colors.canvas}, text {colors.ink}, height 64 px (the brand's --header-height), padding {spacing.sm} {spacing.lg}. Layout: logo left, link row centre, "Ask AI / Log In / Sign Up" cluster right.

nav-link — the centred link row inside nav-bar.

Drop-in CSS variables

The same values as a theme block. Add the class to <body> and the site repaints.

body.theme-vercel {--page-bg: #ffffff;
  --page-bg-gradient: none;
  --text-color: #171717;
  --heading-color: #171717;
  --link-color: #0070f3;
  --link-hover-color: #0058c0;
  --border-color: #d5d5d5;
  --card-bg: #ffffff;
  --card-shadow: 0 1px 2px rgba(23,23,23,0.06);
  --card-hover-shadow: 0 6px 18px rgba(23,23,23,0.12);
  --header-bg: #171717;
  --header-text-color: #ffffff;
  --header-shadow: none;
  --footer-bg: #ffffff;
  --footer-text-color: #686868;
  --button-bg: #171717;
  --button-text-color: #ffffff;
  --button-hover-bg: #000000;
  --button-border: none;
  --button-border-radius: 12px;
  --button-secondary-bg: #f1f1f1;
  --button-secondary-text-color: #171717;
  --button-secondary-hover-bg: #e3e3e3;
  --button-secondary-border: 1px solid #d5d5d5;
  --prompt-bg: #f3f3f3;
  --prompt-text-color: #171717;
  --base-font: var(--font-inter);
  --heading-font: var(--font-helvetica);
  --card-border-radius: 12px;
}

Download theme.css

Visually close to

Measured with a deterministic colour + geometry comparison across 958 styles. Not a hand-picked list.

Where this came from

Source document
volt/design-md/vercel/DESIGN.md · 40.1 KB
Repository
VoltAgent/awesome-design-md
Licence
MIT

Source text is reproduced under its original licence. Tokens, similarity scores and page structure are ours.