home / skills / deve1993 / quickfy-website / design-system-manager
/.claude/skills-main/skills-main/new_skills/design-system-manager
npx playbooks add skill deve1993/quickfy-website --skill design-system-managerReview the files below or copy the command above to add this skill to your agents.
---
name: design-system-manager
description: Create and manage design systems with design tokens, theming (light/dark mode), standardized spacing, colors, typography, and component registry
allowed-tools:
- Read
- Write
- Edit
- Bash
- Glob
- Grep
- Task
---
# Design System Manager
Expert skill for creating and maintaining scalable design systems. Specializes in design tokens, theming systems, color palettes, typography scales, spacing systems, and component documentation.
## Core Capabilities
### 1. Design Tokens
- Color tokens (primitive, semantic, component-specific)
- Spacing tokens (scale system)
- Typography tokens (font families, sizes, weights, line heights)
- Shadow tokens (elevation system)
- Border radius tokens
- Animation tokens (duration, easing)
- Z-index tokens (layering system)
### 2. Theming System
- Light/dark mode support
- Custom theme creation
- Theme switching mechanism
- CSS variables strategy
- Scoped theming
- Theme inheritance
- RTL (Right-to-Left) support
### 3. Color System
- Color palette generation
- Semantic color naming
- Accessibility compliance (WCAG contrast)
- Color scales (50-900)
- Alpha variants
- State colors (hover, active, disabled)
- Status colors (success, warning, error, info)
### 4. Typography System
- Type scale generation
- Font stack management
- Line height ratios
- Letter spacing
- Font weight system
- Responsive typography
- Web font loading strategies
### 5. Spacing System
- Spacing scale (4pt/8pt grid)
- Consistent padding/margin
- Component spacing
- Layout spacing
- Responsive spacing
- Negative spacing
### 6. Component Registry
- Component catalog
- Variant documentation
- Usage guidelines
- Prop documentation
- Anatomy diagrams
- Do's and Don'ts
## Workflow
### Phase 1: Foundation Setup
1. **Define Design Principles**
- Visual identity
- Brand personality
- Design philosophy
- Constraints and guidelines
2. **Create Token Structure**
- Primitive tokens (base values)
- Semantic tokens (meaningful names)
- Component tokens (specific usage)
- Decision tree for token usage
3. **Set Up Tooling**
- Token management (Style Dictionary)
- CSS-in-JS solution
- Build pipeline
- Documentation platform
### Phase 2: Token Creation
1. **Color Tokens**
- Define color palette
- Create semantic mappings
- Generate scales
- Ensure accessibility
2. **Spacing Tokens**
- Define spacing scale
- Create consistent system
- Document usage patterns
3. **Typography Tokens**
- Define type scale
- Set font families
- Create text styles
- Define responsive behavior
4. **Other Tokens**
- Shadows and elevation
- Border radius
- Animation timing
- Breakpoints
### Phase 3: Theme Implementation
1. **Create Theme System**
- Define theme structure
- Implement switching mechanism
- Set up CSS variables
- Handle SSR (Server-Side Rendering)
2. **Build Theme Variants**
- Light mode
- Dark mode
- Custom themes
- Brand variations
3. **Test Themes**
- Visual consistency
- Accessibility in all themes
- Performance impact
- Cross-browser compatibility
## Design Token Patterns
### Token Naming Convention
```typescript
// Primitive tokens (base values)
const primitive = {
color: {
blue: {
50: '#eff6ff',
100: '#dbeafe',
// ... through 900
900: '#1e3a8a',
},
},
}
// Semantic tokens (meaningful names)
const semantic = {
color: {
primary: primitive.color.blue[600],
'primary-hover': primitive.color.blue[700],
'primary-active': primitive.color.blue[800],
background: primitive.color.white,
'background-subtle': primitive.color.gray[50],
text: primitive.color.gray[900],
'text-subtle': primitive.color.gray[600],
},
}
// Component tokens (specific usage)
const component = {
button: {
primary: {
background: semantic.color.primary,
text: primitive.color.white,
border: semantic.color.primary,
},
},
}
```
### Style Dictionary Configuration
```javascript
// style-dictionary.config.js
module.exports = {
source: ['tokens/**/*.json'],
platforms: {
css: {
transformGroup: 'css',
buildPath: 'dist/css/',
files: [
{
destination: 'variables.css',
format: 'css/variables',
},
],
},
js: {
transformGroup: 'js',
buildPath: 'dist/js/',
files: [
{
destination: 'tokens.js',
format: 'javascript/es6',
},
],
},
ts: {
transformGroup: 'js',
buildPath: 'dist/ts/',
files: [
{
destination: 'tokens.ts',
format: 'typescript/es6-declarations',
},
],
},
},
}
```
### Token Files Structure
```
tokens/
├── global/
│ ├── color.json
│ ├── spacing.json
│ ├── typography.json
│ ├── shadow.json
│ └── radius.json
├── semantic/
│ ├── light.json
│ └── dark.json
└── component/
├── button.json
├── input.json
└── card.json
```
### Color Token Example
```json
{
"color": {
"brand": {
"primary": {
"value": "#3b82f6",
"type": "color"
}
},
"gray": {
"50": { "value": "#f9fafb", "type": "color" },
"100": { "value": "#f3f4f6", "type": "color" },
"200": { "value": "#e5e7eb", "type": "color" }
}
}
}
```
## Theming Implementation
### CSS Variables Theme
```css
/* tokens/light.css */
:root {
/* Colors */
--color-background: 255 255 255; /* RGB for alpha variants */
--color-foreground: 0 0 0;
--color-primary: 59 130 246;
--color-secondary: 139 92 246;
/* Spacing */
--spacing-1: 0.25rem;
--spacing-2: 0.5rem;
--spacing-4: 1rem;
--spacing-8: 2rem;
/* Typography */
--font-sans: system-ui, -apple-system, sans-serif;
--font-mono: 'JetBrains Mono', monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
/* Shadows */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1);
/* Radius */
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
}
/* tokens/dark.css */
[data-theme="dark"] {
--color-background: 0 0 0;
--color-foreground: 255 255 255;
--color-primary: 96 165 250;
--color-secondary: 167 139 250;
}
/* Usage with alpha */
.card {
background-color: rgb(var(--color-background));
color: rgb(var(--color-foreground));
box-shadow: var(--shadow-md);
border-radius: var(--radius-lg);
}
.overlay {
background-color: rgb(var(--color-background) / 0.8);
}
```
### TypeScript Theme Provider
```typescript
// theme-provider.tsx
import { createContext, useContext, useEffect, useState } from 'react'
type Theme = 'light' | 'dark' | 'system'
interface ThemeContextValue {
theme: Theme
setTheme: (theme: Theme) => void
resolvedTheme: 'light' | 'dark'
}
const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)
export function ThemeProvider({
children,
defaultTheme = 'system',
storageKey = 'ui-theme',
}: ThemeProviderProps) {
const [theme, setTheme] = useState<Theme>(
() => (localStorage.getItem(storageKey) as Theme) || defaultTheme
)
const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light')
useEffect(() => {
const root = window.document.documentElement
root.classList.remove('light', 'dark')
if (theme === 'system') {
const systemTheme = window.matchMedia('(prefers-color-scheme: dark)')
.matches
? 'dark'
: 'light'
root.classList.add(systemTheme)
setResolvedTheme(systemTheme)
} else {
root.classList.add(theme)
setResolvedTheme(theme)
}
}, [theme])
useEffect(() => {
localStorage.setItem(storageKey, theme)
}, [theme, storageKey])
return (
<ThemeContext.Provider value={{ theme, setTheme, resolvedTheme }}>
{children}
</ThemeContext.Provider>
)
}
export function useTheme() {
const context = useContext(ThemeContext)
if (!context) {
throw new Error('useTheme must be used within ThemeProvider')
}
return context
}
```
### Tailwind CSS Integration
```javascript
// tailwind.config.js
module.exports = {
darkMode: ['class'],
theme: {
extend: {
colors: {
background: 'rgb(var(--color-background) / <alpha-value>)',
foreground: 'rgb(var(--color-foreground) / <alpha-value>)',
primary: {
DEFAULT: 'rgb(var(--color-primary) / <alpha-value>)',
foreground: 'rgb(var(--color-primary-foreground) / <alpha-value>)',
},
secondary: {
DEFAULT: 'rgb(var(--color-secondary) / <alpha-value>)',
foreground: 'rgb(var(--color-secondary-foreground) / <alpha-value>)',
},
},
spacing: {
1: 'var(--spacing-1)',
2: 'var(--spacing-2)',
4: 'var(--spacing-4)',
8: 'var(--spacing-8)',
},
fontSize: {
xs: 'var(--text-xs)',
sm: 'var(--text-sm)',
base: 'var(--text-base)',
lg: 'var(--text-lg)',
},
boxShadow: {
sm: 'var(--shadow-sm)',
md: 'var(--shadow-md)',
},
borderRadius: {
sm: 'var(--radius-sm)',
md: 'var(--radius-md)',
lg: 'var(--radius-lg)',
},
},
},
}
```
## Color System
### Color Palette Generator
```typescript
// color-utils.ts
import { colord, extend } from 'colord'
import a11yPlugin from 'colord/plugins/a11y'
extend([a11yPlugin])
export function generateColorScale(baseColor: string) {
const base = colord(baseColor)
return {
50: base.lighten(0.45).toHex(),
100: base.lighten(0.4).toHex(),
200: base.lighten(0.3).toHex(),
300: base.lighten(0.2).toHex(),
400: base.lighten(0.1).toHex(),
500: baseColor,
600: base.darken(0.1).toHex(),
700: base.darken(0.2).toHex(),
800: base.darken(0.3).toHex(),
900: base.darken(0.4).toHex(),
}
}
export function checkContrast(foreground: string, background: string) {
const contrast = colord(foreground).contrast(background)
return {
contrast,
passesAA: contrast >= 4.5,
passesAAA: contrast >= 7,
passesAALarge: contrast >= 3,
}
}
```
### Semantic Color Mapping
```typescript
// colors.ts
export const colors = {
// Primitive colors
blue: generateColorScale('#3b82f6'),
green: generateColorScale('#10b981'),
red: generateColorScale('#ef4444'),
gray: generateColorScale('#6b7280'),
// Semantic colors
primary: {
DEFAULT: 'var(--color-primary)',
hover: 'var(--color-primary-hover)',
active: 'var(--color-primary-active)',
disabled: 'var(--color-primary-disabled)',
},
// Status colors
success: {
DEFAULT: 'var(--color-success)',
background: 'var(--color-success-bg)',
border: 'var(--color-success-border)',
},
error: {
DEFAULT: 'var(--color-error)',
background: 'var(--color-error-bg)',
border: 'var(--color-error-border)',
},
warning: {
DEFAULT: 'var(--color-warning)',
background: 'var(--color-warning-bg)',
border: 'var(--color-warning-border)',
},
info: {
DEFAULT: 'var(--color-info)',
background: 'var(--color-info-bg)',
border: 'var(--color-info-border)',
},
}
```
## Typography System
### Type Scale
```typescript
// typography.ts
export const typography = {
fontFamily: {
sans: ['Inter', 'system-ui', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace'],
},
fontSize: {
xs: ['0.75rem', { lineHeight: '1rem' }],
sm: ['0.875rem', { lineHeight: '1.25rem' }],
base: ['1rem', { lineHeight: '1.5rem' }],
lg: ['1.125rem', { lineHeight: '1.75rem' }],
xl: ['1.25rem', { lineHeight: '1.75rem' }],
'2xl': ['1.5rem', { lineHeight: '2rem' }],
'3xl': ['1.875rem', { lineHeight: '2.25rem' }],
'4xl': ['2.25rem', { lineHeight: '2.5rem' }],
'5xl': ['3rem', { lineHeight: '1' }],
},
fontWeight: {
normal: '400',
medium: '500',
semibold: '600',
bold: '700',
},
letterSpacing: {
tighter: '-0.05em',
tight: '-0.025em',
normal: '0',
wide: '0.025em',
wider: '0.05em',
},
}
```
### Text Styles
```typescript
// text-styles.ts
export const textStyles = {
h1: {
fontSize: 'var(--text-5xl)',
fontWeight: 'var(--font-bold)',
lineHeight: '1',
letterSpacing: 'var(--tracking-tight)',
},
h2: {
fontSize: 'var(--text-4xl)',
fontWeight: 'var(--font-bold)',
lineHeight: '1.1',
},
h3: {
fontSize: 'var(--text-3xl)',
fontWeight: 'var(--font-semibold)',
lineHeight: '1.2',
},
body: {
fontSize: 'var(--text-base)',
fontWeight: 'var(--font-normal)',
lineHeight: '1.5',
},
caption: {
fontSize: 'var(--text-sm)',
fontWeight: 'var(--font-normal)',
lineHeight: '1.25',
color: 'var(--color-text-subtle)',
},
}
```
### Responsive Typography
```css
/* Fluid typography using clamp() */
:root {
--text-xs: clamp(0.69rem, 0.66rem + 0.16vw, 0.75rem);
--text-sm: clamp(0.83rem, 0.78rem + 0.24vw, 0.94rem);
--text-base: clamp(1rem, 0.93rem + 0.36vw, 1.19rem);
--text-lg: clamp(1.2rem, 1.09rem + 0.53vw, 1.48rem);
--text-xl: clamp(1.44rem, 1.29rem + 0.75vw, 1.86rem);
}
```
## Spacing System
### Spacing Scale (8pt Grid)
```typescript
// spacing.ts
export const spacing = {
0: '0',
0.5: '0.125rem', // 2px
1: '0.25rem', // 4px
1.5: '0.375rem', // 6px
2: '0.5rem', // 8px
2.5: '0.625rem', // 10px
3: '0.75rem', // 12px
3.5: '0.875rem', // 14px
4: '1rem', // 16px
5: '1.25rem', // 20px
6: '1.5rem', // 24px
7: '1.75rem', // 28px
8: '2rem', // 32px
9: '2.25rem', // 36px
10: '2.5rem', // 40px
12: '3rem', // 48px
16: '4rem', // 64px
20: '5rem', // 80px
24: '6rem', // 96px
}
```
### Component Spacing Patterns
```typescript
// spacing-patterns.ts
export const componentSpacing = {
button: {
paddingX: {
sm: 'var(--spacing-3)',
md: 'var(--spacing-4)',
lg: 'var(--spacing-6)',
},
paddingY: {
sm: 'var(--spacing-1.5)',
md: 'var(--spacing-2)',
lg: 'var(--spacing-2.5)',
},
gap: 'var(--spacing-2)',
},
card: {
padding: {
sm: 'var(--spacing-4)',
md: 'var(--spacing-6)',
lg: 'var(--spacing-8)',
},
gap: 'var(--spacing-4)',
},
input: {
paddingX: 'var(--spacing-3)',
paddingY: 'var(--spacing-2)',
},
}
```
## Component Registry
### Component Metadata
```typescript
// component-registry.ts
export interface ComponentMetadata {
name: string
category: 'form' | 'layout' | 'navigation' | 'feedback' | 'data-display'
status: 'stable' | 'beta' | 'deprecated'
accessibility: {
roles: string[]
keyboard: string[]
screenReader: string
}
variants: Array<{
name: string
props: Record<string, any>
}>
examples: Array<{
title: string
code: string
}>
}
export const componentRegistry: Record<string, ComponentMetadata> = {
Button: {
name: 'Button',
category: 'form',
status: 'stable',
accessibility: {
roles: ['button'],
keyboard: ['Enter', 'Space'],
screenReader: 'Announces as button with label',
},
variants: [
{ name: 'primary', props: { variant: 'primary' } },
{ name: 'secondary', props: { variant: 'secondary' } },
{ name: 'outline', props: { variant: 'outline' } },
],
examples: [
{
title: 'Primary Button',
code: '<Button variant="primary">Click me</Button>',
},
],
},
}
```
## Best Practices
### Design Tokens
1. **Three-Tier System**: Primitive → Semantic → Component tokens
2. **Meaningful Names**: Use semantic names, not descriptive ones
- ✅ `color-primary`, `color-error`
- ❌ `color-blue`, `color-red`
3. **Single Source of Truth**: Define once, reference everywhere
4. **Platform Agnostic**: Export to CSS, JS, iOS, Android
5. **Versioning**: Track token changes with semantic versioning
### Theming
1. **CSS Variables**: Use for runtime theme switching
2. **SSR Support**: Handle hydration correctly
3. **System Preference**: Respect user's OS theme preference
4. **Persistence**: Save theme choice to localStorage
5. **Smooth Transitions**: Animate theme changes subtly
### Color System
1. **Accessibility First**: Ensure WCAG AA/AAA compliance
2. **Consistent Scales**: Generate color scales systematically
3. **Semantic Mapping**: Primary, secondary, success, error, etc.
4. **Alpha Variants**: Support transparency with RGB values
5. **Dark Mode**: Test all colors in both themes
### Typography
1. **Type Scale**: Use consistent ratio (1.25, 1.333, 1.5)
2. **Line Height**: Appropriate for text length (1.5 for body, 1.2 for headings)
3. **Font Loading**: Optimize web font loading (swap, preload)
4. **Responsive**: Use clamp() for fluid typography
5. **Hierarchy**: Clear visual hierarchy through size and weight
### Spacing
1. **Consistent System**: Use 4pt or 8pt grid
2. **Relative Units**: Use rem for scalability
3. **Component Spacing**: Define spacing patterns per component
4. **Responsive**: Adjust spacing for different screen sizes
5. **Negative Spacing**: Support when needed
## Tools & Resources
### Essential Tools
- **Style Dictionary**: Token transformation platform
- **colord**: Color manipulation and contrast checking
- **Radix Colors**: Accessible color system
- **Tailwind CSS**: Utility-first CSS framework
- **Figma Tokens**: Sync tokens between Figma and code
### Typography Tools
- **Modern Font Stacks**: System font stacks
- **Google Fonts**: Web font library
- **Fontsource**: Self-hosted fonts via NPM
- **Type Scale Calculator**: Generate type scales
### Color Tools
- **Coolors**: Color palette generator
- **Adobe Color**: Color wheel and schemes
- **Contrast Checker**: WCAG contrast validation
- **oklch.css**: Perceptually uniform color space
## When to Use This Skill
Activate this skill when you need to:
- Set up a new design system
- Create design tokens
- Implement theming (light/dark mode)
- Define color palettes
- Create typography system
- Set up spacing system
- Document component patterns
- Ensure design consistency
- Improve accessibility
- Migrate to design tokens
- Audit existing design system
## Output Format
When working with design systems, provide:
1. **Token Files**: Complete token definitions
2. **Theme Configuration**: CSS variables and theme provider
3. **Usage Examples**: How to use tokens in components
4. **Accessibility Report**: WCAG compliance status
5. **Documentation**: Guidelines for using the design system
6. **Migration Guide**: If updating existing system
Always prioritize consistency, accessibility, and scalability in design system implementation.