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.
Sign Up Deploy now
Card on extracted card recipe
Accent link: #0070F3 · border #EBEBEB

Color palette (light mode)

RoleValueTailwindUsage
canvasBg#FAFAFAbg-[#FAFAFA]Primary Vercel page canvas
surfaceElevated#FFFFFFbg-whitePrimary elevated card & bento surface
surfaceSecondary#FFFFFFbg-whiteSecondary interactive container / hover fill
borderPrimary#EBEBEBborder-[#EBEBEB]Primary structural divider (1px solid #EBEBEB)
borderSecondaryrgba(255, 255, 255, 0.4)border-white/[0.4]Secondary nested module or pill border
textPrimary#171717text-[#171717]Hero H1, section H2 & high-contrast foreground
textMuted#4D4D4Dtext-[#4D4D4D]Lead paragraphs, descriptions & muted labels
accentPrimary#0070F3bg-[#0070F3]Primary interactive CTA & brand highlight (6px / 9999px)
accentSecondaryrgba(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

LevelComputed spec
Hero H164px | 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 H3Subheading with crisp line-height
Body Copy (Paragraph)Readable body text with muted contrast
Monospace / Code Block13px–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 familyMost frequent values (count on page)
Border radius6px ×6 · 20px ×6 · 4px ×4 · 8px ×3
Box shadowrgba(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 gap6px ×87 · 12px ×7 · 4px ×5 · 4px 20px ×4 · 44px ×3 · normal 20px ×3
Container max-width1448px ×4 · 1440px ×1 · 1080px ×1 · 673.344px ×1
Section vertical padding40px / 40px ×1
Easingcubic-bezier(0.4, 0, 0.2, 1) ×94 · cubic-bezier(0, 0, 0.2, 1) ×8 · linear ×2
Duration0.1s ×79 · 0.2s ×8 · 0.15s ×7 · 0.3s ×6

Component recipes

Buttons (4 distinct)

RenderedHeightPaddingRadiusBackground / TextBorderFont
Sign Up32px0px 6px6px#171717
#FFFFFF
none14px / 500
Deploy now40px0px 12px9999px#171717
#FFFFFF
none16px / 500
Log In32px0px 6px6px#FFFFFF
#171717
none14px / 500
Talk to sales40px0px 12px9999px#FFFFFF
#171717
none16px / 500

Cards (2 distinct)

#BackgroundBorderRadiusPaddingShadow
1#FAFAFAnone6px20px 20pxrgba(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
2transparent1px solid #F2F2F24px0px 0pxnone

Rules: what never to do in the Vercel style

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

Similar styles

Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.

See taste-skill Pro →