Design System
Establish the foundational design language: tokens, color, typography, spacing, and motion philosophy.
Core principle: One coherent system, applied consistently. Design decisions made once, expressed everywhere.
When to Use
- Starting a new product or major redesign
- Choosing color palette, typography, or spacing system
- Creating design tokens for a codebase
- Writing DESIGN.md to codify design decisions
- Evaluating whether UI is consistent with its design system
When NOT to Use
- Building specific UI components (use ui-components skill)
- Reviewing visual quality of existing UI (use ui-components skill)
- Performance optimization of UI (use frontend-performance skill)
Phase 1: Product Context Assessment
Before proposing a design system, answer:
- What is the product? — Productivity tool, consumer app, developer tool, marketing site
- Who is the user? — Enterprise knowledge worker, consumer, developer, creative professional
- What industry? — Finance (trust, precision), Health (clarity, calm), Creative (expression, energy)
- What density? — Information-dense dashboard vs. content-first editorial vs. e-commerce
Phase 2: Visual Theme Axes
Rate on three axes to anchor all design decisions:
| Axis |
Scale |
Description |
| Density |
1-10 |
1-3: Art Gallery Airy; 4-6: Balanced; 7-10: Cockpit Dense |
| Variance |
1-10 |
1-3: Predictable Symmetric; 7-10: Asymmetric Offset |
| Motion |
1-10 |
1-3: Static Restrained; 7-10: Cinematic Choreography |
Design Preset Archetypes
When clients ask for a direction ("make it modern", "premium", "bold"), anchor to one of these named presets:
| Preset |
Signature Traits |
Best For |
| Minimalist Modern |
Whitespace-dominant, single accent, max 2 fonts, subtle 0-10% opacity shadows |
SaaS, productivity, professional tools |
| Bold Brutalist |
High contrast (black/white/red), raw typography 700-900 weight, zero border-radius, no decorative elements |
Creative agencies, portfolios, bold brands |
| Soft Neumorphic |
Inner shadows (light + dark), muted pastel palette, subtle depth, rounded 12-20px corners |
Health, wellness, meditation apps |
| Glass Aesthetic |
backdrop-blur + transparency, 1px inner border border-white/10, vivid single accent, layered surfaces |
Fintech, premium dashboards, iOS-style apps |
| Timeless Classic |
Serif display font, editorial grid, conservative 3-4 color palette, WCAG AAA accessible |
Enterprise, government, accessibility-first |
| Bleeding Edge Experimental |
Kinetic type, asymmetric layout, motion-first, unconventional grid (2fr 1fr), scroll-driven reveals |
Tech showcases, innovation labs, creative portfolios |
Phase 3: Color Palette
60-30-10 Color Rule
Every palette must allocate by visual weight:
- 60% dominant neutral — backgrounds, surfaces, containers
- 30% secondary — body text, borders, inactive states, supporting UI
- 10% accent — CTAs, interactive focus, highlights, brand moments
Mandatory Constraints
- Maximum 1 accent color — saturation below 80%
- Absolute neutral bases — Zinc/Slate/Stone (no warm/cool gray fluctuation)
- One palette for the entire product — no per-section themes
- Never pure black (
#000000) — use Zinc-950, Off-Black, or Charcoal
- No neon AI aesthetic — purple/indigo gradients, oversaturated accents banned
WCAG 2.1 AA Minimum Contrast
| Text Type |
Minimum Ratio |
| Normal text (<18pt) |
4.5:1 |
| Large text (18pt+ or 14pt bold) |
3:1 |
| UI components and icons |
3:1 |
Palette Structure
Neutral scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
Accent scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950
Semantic roles: background, foreground, muted, border, primary, error, warning, success
Phase 4: Typography
Font Selection
Prefer distinctive fonts over generic defaults for premium contexts:
- Display/Editorial: Geist, Cabinet Grotesk, Satoshi, Outfit
- UI/Product: Inter, Geist, Plus Jakarta Sans
- Monospace: Geist Mono, JetBrains Mono, Fira Code
Generic fonts (Arial, Helvetica, system-ui` alone) are acceptable only for developer tools or ultra-minimal contexts.
Type Scale
Use consistent increments:
12px — caption, label, badge
14px — body small, helper text
16px — body default (minimum on mobile)
18px — body large, lead text
24px — heading small (h3)
32px — heading medium (h2)
48px — heading large (h1)
64px — display
Use clamp() for responsive scaling:
font-size: clamp(1.5rem, 3vw, 2rem); /* scales between 24px and 32px */
Typography Rules
| Element |
Rule |
| Display/Headlines |
Track-tight (letter-spacing: -0.02em), weight for hierarchy not just size |
| Body text |
Leading 1.5-1.75, max 65 characters per line |
| Mobile body |
Minimum 16px (prevents browser zoom on iOS) |
| Heading hierarchy |
h1→h2→h3 — no level skips |
Phase 5: Spacing System
- 8pt grid — canonical scale: 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64px
- Use the 8pt grid as default; 4pt for fine-tuning within components
- Proximity principle: related elements 8-16px apart; section breaks 32-48px; page-level sections 64px+
- CSS Grid over Flexbox calc hacks
- Max-width containment: 1400px centered for content
- Touch targets minimum 44px on mobile
Phase 6: Motion Philosophy
| Rule |
Value |
| Default physics |
Spring: stiffness 100, damping 20 |
| Micro-interaction duration |
150-300ms |
| Maximum duration |
500ms |
| Animate only |
transform and opacity — never top, left, width, height |
| Exit vs enter |
Exit = 60-70% of enter duration |
| Reduced motion |
Always respect prefers-reduced-motion |
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
}
}
Phase 7: Design Token Architecture
Three layers — never use raw values in components:
Primitive (raw values): --color-blue-600: #2563EB
Semantic (purpose): --color-action-primary: var(--color-blue-600)
Component (specific): --button-bg: var(--color-action-primary)
Name tokens by role, not color value:
❌ --color-blue-500 (describes the color — breaks when brand changes)
✅ --color-action-primary (Primary Action color — survives brand pivots)
✅ --color-feedback-error (Error state — meaningful without knowing it's red)
✅ --color-surface-raised (Elevated surface — not "white" or "gray-50")
@layer base {
:root {
/* Primitives */
--color-zinc-950: #09090b;
--color-zinc-50: #fafafa;
--color-blue-600: #2563eb;
/* Semantic */
--background: var(--color-zinc-50);
--foreground: var(--color-zinc-950);
--primary: var(--color-blue-600);
--muted: 210 40% 96.1%; /* HSL for Tailwind compatibility */
}
.dark {
--background: var(--color-zinc-950);
--foreground: var(--color-zinc-50);
}
}
DESIGN.md Output
# Design System: [Project Title]
## 1. Visual Theme & Atmosphere
- Density: X/10 — [description]
- Variance: X/10 — [description]
- Motion: X/10 — [description]
## 2. Color Palette & Roles
- Neutral base: Zinc/Slate/Stone [chosen scale]
- Accent: [color name, hex, usage]
- Semantic roles: background, foreground, primary, muted, error, success, warning
## 3. Typography
- Display: [font name], track-tight
- Body: [font name], 1.6 leading, max 65ch
- Scale: 12/14/16/18/24/32/48px
## 4. Spacing
- System: 4pt base (4/8/12/16/24/32/48/64px)
- Max content width: 1400px
## 5. Motion
- Physics: spring(100, 20)
- Duration: 150-300ms
- Properties: transform + opacity only
## 6. Anti-Patterns (Banned)
- [Specific things that are never allowed in this product]
Verification Checklist
1---2name: design-system3description: Use when establishing a design system, choosing color palettes, defining typography, creating design tokens, setting spacing standards, writing a DESIGN.md document, or making foundational visual design decisions for a product. Triggers: "design system", "color palette", "typography", "design tokens", "brand", "visual design", "DESIGN.md", "spacing system", "what colors should I use", "font choice", "design language", "visual theme".4---56# Design System78Establish the foundational design language: tokens, color, typography, spacing, and motion philosophy.910**Core principle:** One coherent system, applied consistently. Design decisions made once, expressed everywhere.1112## When to Use1314- Starting a new product or major redesign15- Choosing color palette, typography, or spacing system16- Creating design tokens for a codebase17- Writing DESIGN.md to codify design decisions18- Evaluating whether UI is consistent with its design system1920## When NOT to Use2122- Building specific UI components (use ui-components skill)23- Reviewing visual quality of existing UI (use ui-components skill)24- Performance optimization of UI (use frontend-performance skill)2526---2728## Phase 1: Product Context Assessment2930Before proposing a design system, answer:31321. **What is the product?** — Productivity tool, consumer app, developer tool, marketing site332. **Who is the user?** — Enterprise knowledge worker, consumer, developer, creative professional343. **What industry?** — Finance (trust, precision), Health (clarity, calm), Creative (expression, energy)354. **What density?** — Information-dense dashboard vs. content-first editorial vs. e-commerce3637---3839## Phase 2: Visual Theme Axes4041Rate on three axes to anchor all design decisions:4243| Axis | Scale | Description |44|------|-------|-------------|45| **Density** | 1-10 | 1-3: Art Gallery Airy; 4-6: Balanced; 7-10: Cockpit Dense |46| **Variance** | 1-10 | 1-3: Predictable Symmetric; 7-10: Asymmetric Offset |47| **Motion** | 1-10 | 1-3: Static Restrained; 7-10: Cinematic Choreography |4849---5051## Design Preset Archetypes5253When clients ask for a direction ("make it modern", "premium", "bold"), anchor to one of these named presets:5455| Preset | Signature Traits | Best For |56|--------|-----------------|----------|57| **Minimalist Modern** | Whitespace-dominant, single accent, max 2 fonts, subtle 0-10% opacity shadows | SaaS, productivity, professional tools |58| **Bold Brutalist** | High contrast (black/white/red), raw typography 700-900 weight, zero border-radius, no decorative elements | Creative agencies, portfolios, bold brands |59| **Soft Neumorphic** | Inner shadows (light + dark), muted pastel palette, subtle depth, rounded 12-20px corners | Health, wellness, meditation apps |60| **Glass Aesthetic** | `backdrop-blur` + transparency, 1px inner border `border-white/10`, vivid single accent, layered surfaces | Fintech, premium dashboards, iOS-style apps |61| **Timeless Classic** | Serif display font, editorial grid, conservative 3-4 color palette, WCAG AAA accessible | Enterprise, government, accessibility-first |62| **Bleeding Edge Experimental** | Kinetic type, asymmetric layout, motion-first, unconventional grid (2fr 1fr), scroll-driven reveals | Tech showcases, innovation labs, creative portfolios |6364---6566## Phase 3: Color Palette6768### 60-30-10 Color Rule6970Every palette must allocate by visual weight:71- **60% dominant neutral** — backgrounds, surfaces, containers72- **30% secondary** — body text, borders, inactive states, supporting UI73- **10% accent** — CTAs, interactive focus, highlights, brand moments7475### Mandatory Constraints7677- Maximum **1 accent color** — saturation below 80%78- **Absolute neutral bases** — Zinc/Slate/Stone (no warm/cool gray fluctuation)79- **One palette** for the entire product — no per-section themes80- **Never pure black** (`#000000`) — use Zinc-950, Off-Black, or Charcoal81- **No neon AI aesthetic** — purple/indigo gradients, oversaturated accents banned8283### WCAG 2.1 AA Minimum Contrast8485| Text Type | Minimum Ratio |86|-----------|--------------|87| Normal text (<18pt) | 4.5:1 |88| Large text (18pt+ or 14pt bold) | 3:1 |89| UI components and icons | 3:1 |9091### Palette Structure9293```94Neutral scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 95095Accent scale: 50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 95096Semantic roles: background, foreground, muted, border, primary, error, warning, success97```9899---100101## Phase 4: Typography102103### Font Selection104105Prefer distinctive fonts over generic defaults for premium contexts:106- **Display/Editorial:** Geist, Cabinet Grotesk, Satoshi, Outfit107- **UI/Product:** Inter, Geist, Plus Jakarta Sans108- **Monospace:** Geist Mono, JetBrains Mono, Fira Code109110Generic fonts (`Arial`, `Helvetica`, system-ui` alone) are acceptable only for developer tools or ultra-minimal contexts.111112### Type Scale113114Use consistent increments:115116```11712px — caption, label, badge11814px — body small, helper text11916px — body default (minimum on mobile)12018px — body large, lead text12124px — heading small (h3)12232px — heading medium (h2)12348px — heading large (h1)12464px — display125```126127Use `clamp()` for responsive scaling:128```css129font-size: clamp(1.5rem, 3vw, 2rem); /* scales between 24px and 32px */130```131132### Typography Rules133134| Element | Rule |135|---------|------|136| Display/Headlines | Track-tight (`letter-spacing: -0.02em`), weight for hierarchy not just size |137| Body text | Leading 1.5-1.75, max 65 characters per line |138| Mobile body | Minimum 16px (prevents browser zoom on iOS) |139| Heading hierarchy | h1→h2→h3 — no level skips |140141---142143## Phase 5: Spacing System144145- **8pt grid — canonical scale:** 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64px146- Use the 8pt grid as default; 4pt for fine-tuning within components147- **Proximity principle:** related elements 8-16px apart; section breaks 32-48px; page-level sections 64px+148- CSS Grid over Flexbox calc hacks149- Max-width containment: 1400px centered for content150- Touch targets minimum 44px on mobile151152---153154## Phase 6: Motion Philosophy155156| Rule | Value |157|------|-------|158| Default physics | Spring: stiffness 100, damping 20 |159| Micro-interaction duration | 150-300ms |160| Maximum duration | 500ms |161| Animate only | `transform` and `opacity` — never `top`, `left`, `width`, `height` |162| Exit vs enter | Exit = 60-70% of enter duration |163| Reduced motion | Always respect `prefers-reduced-motion` |164165```css166@media (prefers-reduced-motion: reduce) {167 *, *::before, *::after {168 animation-duration: 0.01ms !important;169 transition-duration: 0.01ms !important;170 }171}172```173174---175176## Phase 7: Design Token Architecture177178Three layers — never use raw values in components:179180```181Primitive (raw values): --color-blue-600: #2563EB182Semantic (purpose): --color-action-primary: var(--color-blue-600)183Component (specific): --button-bg: var(--color-action-primary)184```185186**Name tokens by role, not color value:**187188```189❌ --color-blue-500 (describes the color — breaks when brand changes)190✅ --color-action-primary (Primary Action color — survives brand pivots)191✅ --color-feedback-error (Error state — meaningful without knowing it's red)192✅ --color-surface-raised (Elevated surface — not "white" or "gray-50")193```194195```css196@layer base {197 :root {198 /* Primitives */199 --color-zinc-950: #09090b;200 --color-zinc-50: #fafafa;201 --color-blue-600: #2563eb;202203 /* Semantic */204 --background: var(--color-zinc-50);205 --foreground: var(--color-zinc-950);206 --primary: var(--color-blue-600);207 --muted: 210 40% 96.1%; /* HSL for Tailwind compatibility */208 }209210 .dark {211 --background: var(--color-zinc-950);212 --foreground: var(--color-zinc-50);213 }214}215```216217---218219## DESIGN.md Output220221```markdown222# Design System: [Project Title]223224## 1. Visual Theme & Atmosphere225- Density: X/10 — [description]226- Variance: X/10 — [description]227- Motion: X/10 — [description]228229## 2. Color Palette & Roles230- Neutral base: Zinc/Slate/Stone [chosen scale]231- Accent: [color name, hex, usage]232- Semantic roles: background, foreground, primary, muted, error, success, warning233234## 3. Typography235- Display: [font name], track-tight236- Body: [font name], 1.6 leading, max 65ch237- Scale: 12/14/16/18/24/32/48px238239## 4. Spacing240- System: 4pt base (4/8/12/16/24/32/48/64px)241- Max content width: 1400px242243## 5. Motion244- Physics: spring(100, 20)245- Duration: 150-300ms246- Properties: transform + opacity only247248## 6. Anti-Patterns (Banned)249- [Specific things that are never allowed in this product]250```251252---253254## Verification Checklist255256- [ ] Max 1 accent color, saturation <80%257- [ ] No pure black (#000000) anywhere258- [ ] Neutral base consistent (no warm/cool gray mixing)259- [ ] WCAG 2.1 AA contrast verified (4.5:1 text, 3:1 UI)260- [ ] Type scale uses consistent increments261- [ ] Mobile body text ≥16px262- [ ] Spacing system documented (4pt grid)263- [ ] Motion only uses transform + opacity264- [ ] `prefers-reduced-motion` respected265- [ ] Design tokens follow primitive → semantic → component hierarchy266- [ ] No raw hex values in component code267- [ ] DESIGN.md written and covers all 6 sections