taste-skill / Style guides / Vercel style
How to build a UI in the Vercel style
Vercel (vercel.com) reads as Geist Architectural Grid & Swiss Precision Monochrome — Architectural #FAFAFA / #FFFFFF daylight grid with exposed 1px #EBEBEB structural hairlines, corner crosshair markers, ultra-tight -0.06em GeistSans display type, and #171717 monochrome CTAs. This guide turns its extracted computed styles into an implementation kit: a live preview, the exact palette and type scale, real button and card recipes, the rules to avoid, and drop-in CSS variables, Tailwind config and a Cursor / Claude Code SKILL.md snippet.
Source: computed styles extracted from
https://vercel.com on 2026-10-26 by the taste-skill extractor. Brand fonts may be proprietary; previews fall back to Inter / system fonts. Vercel is a trademark of its owner; this page documents publicly visible styling for reference and is not affiliated with Vercel.Live preview with Vercel tokens
Vercel style · light
Ship the product, not the pixels.
Preview text rendered with the extracted Vercel canvas, text, muted and accent tokens.
Card on extracted card recipe
Accent link: #0070F3 · border
#EBEBEBColor palette (light mode)
| Role | Value | Tailwind | Usage |
|---|---|---|---|
| canvasBg | #FAFAFA | bg-[#FAFAFA] | Primary Vercel page canvas |
| surfaceElevated | #FFFFFF | bg-white | Primary elevated card & bento surface |
| surfaceSecondary | #FFFFFF | bg-white | Secondary interactive container / hover fill |
| borderPrimary | #EBEBEB | border-[#EBEBEB] | Primary structural divider (1px solid #EBEBEB) |
| borderSecondary | rgba(255, 255, 255, 0.4) | border-white/[0.4] | Secondary nested module or pill border |
| textPrimary | #171717 | text-[#171717] | Hero H1, section H2 & high-contrast foreground |
| textMuted | #4D4D4D | text-[#4D4D4D] | Lead paragraphs, descriptions & muted labels |
| accentPrimary | #0070F3 | bg-[#0070F3] | Primary interactive CTA & brand highlight (6px / 9999px) |
| accentSecondary | rgba(82, 174, 255, 0.8) | text-[rgba(82,174,255,0.8)] | Secondary badge, syntax or telemetry highlight |
Typography
Heading GeistSans · body GeistSans · mono GeistMono
| Level | Computed spec |
|---|---|
| Hero H1 | 64px | line-height 64px (leading-[1]) | letter-spacing -3.84px (tracking-[-0.06em]) | weight 400 (font-[400]) | color #171717 (text-[#171717]) | font GeistSans |
| Section H2 (Primary) | 56px | line-height 56px (leading-[1]) | letter-spacing -3.36px (tracking-[-0.06em]) | weight 450 (font-[450]) | color #171717 (text-[#171717]) | font GeistSans |
| Card / Feature H3 | Subheading with crisp line-height |
| Body Copy (Paragraph) | Readable body text with muted contrast |
| Monospace / Code Block | 13px–14px | line-height 1.5 (leading-relaxed) | font "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Liberation Mono, DejaVu Sans Mono, Courier New, monospace, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol |
Spacing, radius, depth and motion
| Token family | Most frequent values (count on page) |
|---|---|
| Border radius | 6px ×6 · 20px ×6 · 4px ×4 · 8px ×3 |
| Box shadow | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(235, 235, 235) 0px 0px 0px 1px ×4 · rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px ×4 · rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgba(0, 0, 0, 0.04) 0px 2px 2px 0px, rgb(250, 250, 250) 0px 0px 0px 1px ×4 |
| Grid / flex gap | 6px ×87 · 12px ×7 · 4px ×5 · 4px 20px ×4 · 44px ×3 · normal 20px ×3 |
| Container max-width | 1448px ×4 · 1440px ×1 · 1080px ×1 · 673.344px ×1 |
| Section vertical padding | 40px / 40px ×1 |
| Easing | cubic-bezier(0.4, 0, 0.2, 1) ×94 · cubic-bezier(0, 0, 0.2, 1) ×8 · linear ×2 |
| Duration | 0.1s ×79 · 0.2s ×8 · 0.15s ×7 · 0.3s ×6 |
Component recipes
Buttons (4 distinct)
| Rendered | Height | Padding | Radius | Background / Text | Border | Font |
|---|---|---|---|---|---|---|
| Sign Up | 32px | 0px 6px | 6px | #171717#FFFFFF | none | 14px / 500 |
| Deploy now | 40px | 0px 12px | 9999px | #171717#FFFFFF | none | 16px / 500 |
| Log In | 32px | 0px 6px | 6px | #FFFFFF#171717 | none | 14px / 500 |
| Talk to sales | 40px | 0px 12px | 9999px | #FFFFFF#171717 | none | 16px / 500 |
Cards (2 distinct)
| # | Background | Border | Radius | Padding | Shadow |
|---|---|---|---|---|---|
| 1 | #FAFAFA | none | 6px | 20px 20px | rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.08) 0px 0px 0px 1px, rgb(250, 250, 250) 0px 0px 0px 1px |
| 2 | transparent | 1px solid #F2F2F2 | 4px | 0px 0px | none |
Rules: what never to do in the Vercel style
- NEVER substitute generic uncalibrated gray backgrounds for Vercel’s exact
#FAFAFAcanvas and#FFFFFFsurface pairing. - NEVER replace
GeistSansdisplay typography or ignore its signature scale (64px / -0.06em (w400)). - NEVER use thick opaque borders that clash with
#EBEBEB(1px solid #EBEBEB). - NEVER deviate from the signature button geometry (
6px / 9999px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with
GeistMono.
Copy-paste kit
CSS variables
:root {
/* Vercel style — extracted from vercel.com by taste-skill */
--canvas: #FAFAFA;
--surface: #FFFFFF;
--text: #171717;
--text-muted: #4D4D4D;
--accent: #0070F3;
--border: #EBEBEB;
--font-heading: GeistSans, Inter, system-ui, -apple-system, sans-serif;
--font-body: GeistSans, Inter, system-ui, -apple-system, sans-serif;
--font-mono: 'GeistMono', 'JetBrains Mono', ui-monospace, monospace;
--h1-size: 64px;
--h1-tracking: -0.06em;
--h1-weight: 400;
--radius-button: 6px;
--radius-common: 6px;
--shadow-common: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(235, 235, 235) 0px 0px 0px 1px;
--ease: cubic-bezier(0.4, 0, 0.2, 1);
--duration: 0.1s;
}tailwind.config.js
// tailwind.config.js — Vercel style tokens (taste-skill)
module.exports = {
theme: {
extend: {
colors: {
canvas: "#FAFAFA",
surface: "#FFFFFF",
ink: "#171717",
muted: "#4D4D4D",
accent: "#0070F3",
line: "#EBEBEB",
},
fontFamily: {
heading: ["GeistSans", 'Inter', 'system-ui', 'sans-serif'],
sans: ["GeistSans", 'Inter', 'system-ui', 'sans-serif'],
mono: ["GeistMono", 'ui-monospace', 'monospace'],
},
fontSize: { display: ["64px", { letterSpacing: "-0.06em", fontWeight: "400" }] },
borderRadius: { button: "6px", card: "6px" },
boxShadow: { brand: "rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgb(235, 235, 235) 0px 0px 0px 1px" },
transitionTimingFunction: { brand: "cubic-bezier(0.4, 0, 0.2, 1)" },
},
},
};.cursor/skills/vercel-style/SKILL.md
--- name: vercel-style description: Build UI in the Vercel visual style (Geist Architectural Grid & Swiss Precision Monochrome). Use when the user asks for a Vercel-like look. --- # Vercel Style — Quick Rules (source: vercel.com, extracted by taste-skill) ## Tokens - canvasBg: #FAFAFA — Primary Vercel page canvas - surfaceElevated: #FFFFFF — Primary elevated card & bento surface - surfaceSecondary: #FFFFFF — Secondary interactive container / hover fill - borderPrimary: #EBEBEB — Primary structural divider (1px solid #EBEBEB) - borderSecondary: rgba(255, 255, 255, 0.4) — Secondary nested module or pill border - textPrimary: #171717 — Hero H1, section H2 & high-contrast foreground - textMuted: #4D4D4D — Lead paragraphs, descriptions & muted labels - accentPrimary: #0070F3 — Primary interactive CTA & brand highlight (6px / 9999px) - accentSecondary: rgba(82, 174, 255, 0.8) — Secondary badge, syntax or telemetry highlight ## Typography - Heading font: GeistSans; body: GeistSans; mono: GeistMono - Hero H1: 64px | line-height 64px (leading-[1]) | letter-spacing -3.84px (tracking-[-0.06em]) | weight 400 (font-[400]) | color #171717 (text-[#171717]) | font GeistSans - Section H2 (Primary): 56px | line-height 56px (leading-[1]) | letter-spacing -3.36px (tracking-[-0.06em]) | weight 450 (font-[450]) | color #171717 (text-[#171717]) | font GeistSans - Card / Feature H3: Subheading with crisp line-height - Body Copy (Paragraph): Readable body text with muted contrast ## Components - Primary button: height 32px, padding 0px 6px, radius 6px, bg #171717, text #FFFFFF, 14px / 500 - Card: bg #FAFAFA, border none, radius 6px, padding 20px 20px ## Never - NEVER substitute generic uncalibrated gray backgrounds for Vercel’s exact #FAFAFA canvas and #FFFFFF surface pairing. - NEVER replace GeistSans display typography or ignore its signature scale (64px / -0.06em (w400)). - NEVER use thick opaque borders that clash with #EBEBEB (1px solid #EBEBEB). - NEVER deviate from the signature button geometry (6px / 9999px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with GeistMono. Full 120-line spec: https://taste-skill.pages.dev/taste/vercel/
Or install the full spec
npx taste-skill add vercel
Related
Vercel full token specVercel ButtonsVercel CardsVercel Pricing TableLinear vs VercelVercel vs RailwayVercel vs FramerVercel vs SupabaseVercel vs UpstashVercel vs Clerk
Similar styles
Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.
See taste-skill Pro →