7.7 KiB
Design Token Architecture
Purpose: Core principles for separating semantic structure from visual style.
Referenced by: All component-type instructions
Core Principle
Separate semantic structure from visual style.
HTML/Structure = Meaning (what it is)
Design Tokens = Appearance (how it looks)
They should be independent!
The Problem
Bad Practice:
<h2 class="text-4xl font-bold text-blue-600">Heading</h2>
Issues:
- Visual styling mixed with semantic HTML
- Can't change h2 appearance without changing all h2s
- h2 means "second-level heading" but looks like "display large"
- Breaks separation of concerns
The Solution
Good Practice:
HTML (Semantic):
<h2 class="heading-section">Heading</h2>
Design Tokens (Visual):
.heading-section {
font-size: var(--text-4xl);
font-weight: var(--font-bold);
color: var(--color-primary-600);
}
Benefits:
- Semantic HTML stays semantic
- Visual style is centralized
- Can change appearance without touching HTML
- Clear separation of concerns
Token Hierarchy
Level 1: Raw Values
--spacing-4: 1rem;
--color-blue-600: #2563eb;
--font-size-4xl: 2.25rem;
Level 2: Semantic Tokens
--text-heading-large: var(--font-size-4xl);
--color-primary: var(--color-blue-600);
--spacing-section: var(--spacing-4);
Level 3: Component Tokens
--button-padding-x: var(--spacing-section);
--button-color-primary: var(--color-primary);
--heading-size-section: var(--text-heading-large);
Use Level 2 or 3 in components, never Level 1 directly.
Application to WDS
In Page Specifications
Specify semantic structure:
Page Structure:
- Section Heading (h2)
- Body text (p)
- Primary button (button)
NOT visual styling:
# ❌ Don't do this
Page Structure:
- Large blue bold text
- 16px gray text
- Blue rounded button
In Design System
Specify visual styling:
Section Heading:
html_element: h2
design_token: heading-section
Design Token Definition:
heading-section:
font-size: text-4xl
font-weight: bold
color: primary-600
Component-Type Instructions
Text Heading Example
When specifying a heading:
-
Identify semantic level (h1-h6)
- h1 = Page title
- h2 = Section heading
- h3 = Subsection heading
- etc.
-
Map to design token
- h1 → display-large
- h2 → heading-section
- h3 → heading-subsection
-
Store separately
- Page spec:
<h2>(semantic) - Design system:
heading-sectiontoken (visual)
- Page spec:
Example Output:
Page Spec:
Hero Section:
heading:
element: h2
token: heading-section
content: 'Welcome to Our Product'
Design System:
Tokens:
heading-section:
font-size: 2.25rem
font-weight: 700
line-height: 1.2
color: gray-900
Button Example
When specifying a button:
-
Identify semantic element
<button>for actions<a>for navigation (even if styled as button)
-
Map to component
- Action → Button component
- Navigation → Link component (button variant)
-
Store separately
- Page spec:
<button>+ purpose - Design system: Button component styling
- Page spec:
Example Output:
Page Spec:
Login Form:
submit_button:
element: button
type: submit
component: Button.primary
label: 'Log in'
Design System:
Button Component:
variants:
primary:
background: primary-600
color: white
padding: spacing-2 spacing-4
border-radius: radius-md
Input Field Example
When specifying an input:
-
Identify semantic type
<input type="text">for text<input type="email">for email<input type="password">for password
-
Map to component
- Text input → Input Field component
- Email input → Input Field.email variant
-
Store separately
- Page spec: Input type + validation + labels
- Design system: Input Field styling
Example Output:
Page Spec:
Login Form:
email_field:
element: input
type: email
component: InputField.email
label: 'Email address'
placeholder: 'you@example.com'
required: true
validation: email_format
Design System:
Input Field Component:
base_styling:
height: 2.5rem
padding: spacing-2 spacing-3
border: 1px solid gray-300
border-radius: radius-md
font-size: text-base
variants:
email:
icon: envelope
autocomplete: email
Why This Matters
For Designers
✅ Consistency: All h2s can look the same without manual styling ✅ Flexibility: Change all section headings by updating one token ✅ Clarity: Semantic meaning preserved ✅ Scalability: Easy to maintain as design system grows
For Developers
✅ Semantic HTML: Proper HTML structure ✅ Accessibility: Screen readers understand structure ✅ Maintainability: Styling centralized ✅ Performance: Reusable styles
For Design Systems
✅ Single Source of Truth: Tokens define appearance ✅ Easy Updates: Change tokens, not components ✅ Consistency: Automatic consistency across pages ✅ Documentation: Clear token → component mapping
Common Mistakes
Mistake 1: Mixing Structure and Style
❌ Bad:
Page:
- "Large blue heading" (h2)
✅ Good:
Page:
- Section heading (h2 → heading-section token)
Mistake 2: Hardcoding Visual Values
❌ Bad:
Button:
background: #2563eb
padding: 16px
✅ Good:
Button:
background: primary-600
padding: spacing-4
Mistake 3: Using Visual Names for Semantic Elements
❌ Bad:
<h2 class="big-blue-text">
✅ Good:
<h2 class="section-heading">
Token Naming Conventions
Colors
--color-{category}-{shade}
--color-primary-600
--color-gray-900
--color-success-500
Typography
--text-{size}
--text-base
--text-lg
--text-4xl
Spacing
--spacing-{scale}
--spacing-2
--spacing-4
--spacing-8
Component-Specific
--{component}-{property}-{variant}
--button-padding-primary
--input-border-error
--card-shadow-elevated
Implementation in WDS
Phase 4: Page Specification
Agent specifies:
- Semantic HTML elements
- Component references
- Content and labels
Agent does NOT specify:
- Exact colors
- Exact sizes
- Exact spacing
Phase 5: Design System
Agent specifies:
- Design tokens
- Component styling
- Visual properties
Agent does NOT specify:
- Page-specific content
- Semantic structure
Integration
Page spec references design system:
Hero:
heading:
element: h2
token: heading-hero ← Reference to design system
content: 'Welcome'
Design system defines token:
Tokens:
heading-hero:
font-size: 3rem
font-weight: 800
color: gray-900
Company Customization
Companies can fork WDS and customize tokens:
Company Fork:
├── data/design-system/
│ ├── token-architecture.md (this file - keep principles)
│ ├── company-tokens.md (company-specific token values)
│ └── token-mappings.md (h2 → company-heading-large)
Result: Every project uses company's design tokens automatically.
Further Reading
- Naming Conventions:
naming-conventions.md - Component Boundaries:
component-boundaries.md - State Management:
state-management.md
This is a core principle. Reference this document from all component-type instructions.