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

shadcn/ui style · light
Ship the product, not the pixels.
Preview text rendered with the extracted shadcn/ui canvas, text, muted and accent tokens.
Button Button
Card on extracted card recipe
Accent link: #171717 · border #E5E5E5

Color palette (light mode)

RoleValueTailwindUsage
canvasBg#FFFFFFbg-whitePrimary shadcn/ui page canvas
surfaceElevated#F5F5F5bg-[#F5F5F5]Primary elevated card & bento surface
surfaceSecondaryrgba(245, 245, 245, 0.5)bg-[rgba(245,245,245,0.5)]Secondary interactive container / hover fill
borderPrimary#E5E5E5border-[#E5E5E5]Primary structural divider (1px solid #E5E5E5)
borderSecondary#171717border-[#171717]Secondary nested module or pill border
textPrimary#0A0A0Atext-[#0A0A0A]Hero H1, section H2 & high-contrast foreground
textMuted#737373text-[#737373]Lead paragraphs, descriptions & muted labels
accentPrimary#171717bg-[#171717]Primary interactive CTA & brand highlight (8px / 10px)
accentSecondary#F5F5F5text-[#F5F5F5]Secondary badge, syntax or telemetry highlight

Typography

Heading Geist · body Geist · mono Geist Mono

LevelComputed spec
Hero H148px | 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 H3Subheading 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 Block13px–14px | line-height 1.5 (leading-relaxed) | font "Geist Mono", "Geist Mono Fallback"

Spacing, radius, depth and motion

Token familyMost frequent values (count on page)
Border radius18px ×48 · 19.6px ×24 · 6px 6px 0px 0px ×16 · 24px ×11 · 8px ×10 · 24px 24px 0px 0px ×10
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, 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 gap8px ×63 · 6px ×34 · 4px ×24 · 12px ×23 · 20px ×14 · 14px ×13
Container max-width896px ×2 · 1400px ×1 · 1600px ×1
Section vertical padding80px / 48px ×1
Easingcubic-bezier(0.4, 0, 0.2, 1) ×86 · linear ×4
Duration0.15s ×42 · 0.2s ×35 · 0.1s ×13

Component recipes

Buttons (10 distinct)

RenderedHeightPaddingRadiusBackground / TextBorderFont
Button32px8px 16px10px#F5F5F5
#000000
none14px / 500
Button32px0px 10px18px#171717
#FAFAFA
none14px / 500
Secondary32px0px 12px18px#F5F5F5
#171717
none14px / 500
Outline32px0px 12px18px#FFFFFF
#0A0A0A
1px solid #E5E5E514px / 500
Button Group32px0px 12px18px 0px 0px 18px#FFFFFF
#0A0A0A
1px solid #E5E5E514px / 500

Cards (3 distinct)

#BackgroundBorderRadiusPaddingShadow
1#FFFFFFnone24px20px 0pxrgba(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
2rgba(245, 245, 245, 0.5)none18px14px 16pxnone
3rgba(229, 229, 229, 0.5)none18px8px 10pxnone

Rules: what never to do in the shadcn/ui style

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

Similar styles

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

See taste-skill Pro →