taste-skill / Style guides / shadcn/ui style
How to build a UI in the shadcn/ui style
shadcn/ui (ui.shadcn.com) reads as Zinc Monochrome Component Primitives & Zero-Distraction Craft — Pure #FFFFFF / #F5F5F5 zinc monochrome palette with 1px #E5E5E5 borders, 48px Geist display typography (-0.05em tracking), 10px radius primitives, and strict #171717 / #737373 hierarchy. 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://ui.shadcn.com on 2026-10-26 by the taste-skill extractor. Brand fonts may be proprietary; previews fall back to Inter / system fonts. shadcn/ui is a trademark of its owner; this page documents publicly visible styling for reference and is not affiliated with shadcn/ui.Live preview with shadcn/ui tokens
Color palette (light mode)
| Role | Value | Tailwind | Usage |
|---|---|---|---|
| canvasBg | #FFFFFF | bg-white | Primary shadcn/ui page canvas |
| surfaceElevated | #F5F5F5 | bg-[#F5F5F5] | Primary elevated card & bento surface |
| surfaceSecondary | rgba(245, 245, 245, 0.5) | bg-[rgba(245,245,245,0.5)] | Secondary interactive container / hover fill |
| borderPrimary | #E5E5E5 | border-[#E5E5E5] | Primary structural divider (1px solid #E5E5E5) |
| borderSecondary | #171717 | border-[#171717] | Secondary nested module or pill border |
| textPrimary | #0A0A0A | text-[#0A0A0A] | Hero H1, section H2 & high-contrast foreground |
| textMuted | #737373 | text-[#737373] | Lead paragraphs, descriptions & muted labels |
| accentPrimary | #171717 | bg-[#171717] | Primary interactive CTA & brand highlight (8px / 10px) |
| accentSecondary | #F5F5F5 | text-[#F5F5F5] | Secondary badge, syntax or telemetry highlight |
Typography
Heading Geist · body Geist · mono Geist Mono
| Level | Computed spec |
|---|---|
| Hero H1 | 48px | line-height 52.8px (leading-[1.1]) | letter-spacing -2.4px (tracking-[-0.05em]) | weight 600 (font-[600]) | color #000000 (text-black) | font Geist |
| Section H2 (Primary) | Section headline with negative letter-spacing |
| Card / Feature H3 | Subheading with crisp line-height |
| Body Copy (Paragraph) | 18px | line-height 28px (leading-[1.56]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #000000 (text-black) | font Geist |
| Monospace / Code Block | 13px–14px | line-height 1.5 (leading-relaxed) | font "Geist Mono", "Geist Mono Fallback" |
Spacing, radius, depth and motion
| Token family | Most frequent values (count on page) |
|---|---|
| Border radius | 18px ×48 · 19.6px ×24 · 6px 6px 0px 0px ×16 · 24px ×11 · 8px ×10 · 24px 24px 0px 0px ×10 |
| 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, oklab(0.145 -0.00000143796 0.00000340492 / 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px ×15 · 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) 0px 0px 0px 0px ×6 · 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, lab(2.75381 0 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px ×1 |
| Grid / flex gap | 8px ×63 · 6px ×34 · 4px ×24 · 12px ×23 · 20px ×14 · 14px ×13 |
| Container max-width | 896px ×2 · 1400px ×1 · 1600px ×1 |
| Section vertical padding | 80px / 48px ×1 |
| Easing | cubic-bezier(0.4, 0, 0.2, 1) ×86 · linear ×4 |
| Duration | 0.15s ×42 · 0.2s ×35 · 0.1s ×13 |
Component recipes
Buttons (10 distinct)
| Rendered | Height | Padding | Radius | Background / Text | Border | Font |
|---|---|---|---|---|---|---|
| Button | 32px | 8px 16px | 10px | #F5F5F5#000000 | none | 14px / 500 |
| Button | 32px | 0px 10px | 18px | #171717#FAFAFA | none | 14px / 500 |
| Secondary | 32px | 0px 12px | 18px | #F5F5F5#171717 | none | 14px / 500 |
| Outline | 32px | 0px 12px | 18px | #FFFFFF#0A0A0A | 1px solid #E5E5E5 | 14px / 500 |
| Button Group | 32px | 0px 12px | 18px 0px 0px 18px | #FFFFFF#0A0A0A | 1px solid #E5E5E5 | 14px / 500 |
Cards (3 distinct)
| # | Background | Border | Radius | Padding | Shadow |
|---|---|---|---|---|---|
| 1 | #FFFFFF | none | 24px | 20px 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, oklab(0.145 -0.00000143796 0.00000340492 / 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px |
| 2 | rgba(245, 245, 245, 0.5) | none | 18px | 14px 16px | none |
| 3 | rgba(229, 229, 229, 0.5) | none | 18px | 8px 10px | none |
Rules: what never to do in the shadcn/ui style
- NEVER substitute generic uncalibrated gray backgrounds for shadcn/ui’s exact
#FFFFFFcanvas and#F5F5F5surface pairing. - NEVER replace
Geistdisplay typography or ignore its signature scale (48px / -0.05em (w600)). - NEVER use thick opaque borders that clash with
#E5E5E5(1px solid #E5E5E5). - NEVER deviate from the signature button geometry (
8px / 10px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with
Geist Mono.
Copy-paste kit
CSS variables
:root {
/* shadcn/ui style — extracted from ui.shadcn.com by taste-skill */
--canvas: #FFFFFF;
--surface: #F5F5F5;
--text: #0A0A0A;
--text-muted: #737373;
--accent: #171717;
--border: #E5E5E5;
--font-heading: Geist, Inter, system-ui, -apple-system, sans-serif;
--font-body: Geist, Inter, system-ui, -apple-system, sans-serif;
--font-mono: 'Geist Mono', 'JetBrains Mono', ui-monospace, monospace;
--h1-size: 48px;
--h1-tracking: -0.05em;
--h1-weight: 600;
--radius-button: 10px;
--radius-common: 18px;
--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, oklab(0.145 -0.00000143796 0.00000340492 / 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px;
--ease: cubic-bezier(0.4, 0, 0.2, 1);
--duration: 0.15s;
}tailwind.config.js
// tailwind.config.js — shadcn/ui style tokens (taste-skill)
module.exports = {
theme: {
extend: {
colors: {
canvas: "#FFFFFF",
surface: "#F5F5F5",
ink: "#0A0A0A",
muted: "#737373",
accent: "#171717",
line: "#E5E5E5",
},
fontFamily: {
heading: ["Geist", 'Inter', 'system-ui', 'sans-serif'],
sans: ["Geist", 'Inter', 'system-ui', 'sans-serif'],
mono: ["Geist Mono", 'ui-monospace', 'monospace'],
},
fontSize: { display: ["48px", { letterSpacing: "-0.05em", fontWeight: "600" }] },
borderRadius: { button: "10px", card: "18px" },
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, oklab(0.145 -0.00000143796 0.00000340492 / 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.1) 0px 1px 2px -1px" },
transitionTimingFunction: { brand: "cubic-bezier(0.4, 0, 0.2, 1)" },
},
},
};.cursor/skills/shadcn-style/SKILL.md
--- name: shadcn-style description: Build UI in the shadcn/ui visual style (Zinc Monochrome Component Primitives & Zero-Distraction Craft). Use when the user asks for a shadcn/ui-like look. --- # shadcn/ui Style — Quick Rules (source: ui.shadcn.com, extracted by taste-skill) ## Tokens - canvasBg: #FFFFFF — Primary shadcn/ui page canvas - surfaceElevated: #F5F5F5 — Primary elevated card & bento surface - surfaceSecondary: rgba(245, 245, 245, 0.5) — Secondary interactive container / hover fill - borderPrimary: #E5E5E5 — Primary structural divider (1px solid #E5E5E5) - borderSecondary: #171717 — Secondary nested module or pill border - textPrimary: #0A0A0A — Hero H1, section H2 & high-contrast foreground - textMuted: #737373 — Lead paragraphs, descriptions & muted labels - accentPrimary: #171717 — Primary interactive CTA & brand highlight (8px / 10px) - accentSecondary: #F5F5F5 — Secondary badge, syntax or telemetry highlight ## Typography - Heading font: Geist; body: Geist; mono: Geist Mono - Hero H1: 48px | line-height 52.8px (leading-[1.1]) | letter-spacing -2.4px (tracking-[-0.05em]) | weight 600 (font-[600]) | color #000000 (text-black) | font Geist - Section H2 (Primary): Section headline with negative letter-spacing - Card / Feature H3: Subheading with crisp line-height - Body Copy (Paragraph): 18px | line-height 28px (leading-[1.56]) | letter-spacing 0px (tracking-[0em]) | weight 400 (font-[400]) | color #000000 (text-black) | font Geist ## Components - Primary button: height 32px, padding 8px 16px, radius 10px, bg #F5F5F5, text #000000, 14px / 500 - Card: bg #FFFFFF, border none, radius 24px, padding 20px 0px ## Never - NEVER substitute generic uncalibrated gray backgrounds for shadcn/ui’s exact #FFFFFF canvas and #F5F5F5 surface pairing. - NEVER replace Geist display typography or ignore its signature scale (48px / -0.05em (w600)). - NEVER use thick opaque borders that clash with #E5E5E5 (1px solid #E5E5E5). - NEVER deviate from the signature button geometry (8px / 10px) or introduce off-brand saturated gradients. - NEVER use default browser monospace when rendering code or telemetry—always pair with Geist Mono. Full 120-line spec: https://taste-skill.pages.dev/taste/shadcn/
Or install the full spec
npx taste-skill add shadcn
Related
shadcn/ui full token specshadcn/ui Buttonsshadcn/ui Cardsshadcn/ui Pricing TableTailwind CSS vs shadcn/ui
Similar styles
Get all 30 full SKILL.md specs (Cursor / Claude Code / Codex ready) plus the Pro growth skills.
See taste-skill Pro →