| name | design-tokens |
| description | Generate a design tokens file (CSS variables or Tailwind config) based on a chosen aesthetic philosophy, with light and dark mode palettes, spacing scale, type ramp, and component-level tokens. Use when starting a new project, establishing a visual system, setting up tokens, or mentions "tokens" or "design system". |
This skill generates the foundational design tokens for a project. Run this after the design brief and before building any components. Every component built after this references these tokens instead of hardcoding values.
Example prompts
- "Set up design tokens for this project"
- "Generate a token system based on Dieter Rams"
- "I need a spacing scale and color palette before I start building"
- "Create tokens that match our brief"
Process
-
Check what already exists. Before generating anything, scan the codebase for:
- CSS variable definitions (
:root, [data-theme], custom property files)
- Tailwind config (
tailwind.config.js, tailwind.config.ts) and any theme extensions
- Theme provider files (Material UI
createTheme, Chakra extendTheme, shadcn globals.css)
- Design token JSON files (Style Dictionary format, Figma token exports)
- Any
tokens.css, variables.css, theme.css, or similarly named files
package.json for UI framework dependencies (tailwindcss, @mui/material, @chakra-ui/react, etc.)
If tokens already exist, extend them rather than replacing. Identify gaps (missing dark mode, incomplete spacing scale, no motion tokens) and fill those.
-
Read the brief. Look for a design brief at .design/*/DESIGN_BRIEF.md. If multiple subfolders exist, use the most recently modified one, or ask the user which feature they are working on. If a philosophy is named, use the parameters from /frontend-design to derive token values. If no brief exists, ask the user what direction they want.
-
Generate tokens in the format that matches the project's tech stack:
- Tailwind project → extend
tailwind.config.js and write to globals.css
- CSS/HTML project → write to a
tokens.css file
- CSS-in-JS project → write to a
theme.ts or theme.js file
- If unclear, default to CSS custom properties (most portable)
-
Always generate both light and dark mode palettes. Use [data-theme="dark"] or prefers-color-scheme media query. Both palettes should feel intentional for the chosen philosophy, not just inverted values.
Token Categories
Color
--color-bg-primary:
--color-bg-secondary:
--color-bg-tertiary:
--color-bg-inverse:
--color-text-primary:
--color-text-secondary:
--color-text-tertiary:
--color-text-inverse:
--color-text-link:
--color-border-primary:
--color-border-secondary:
--color-border-focus:
--color-accent-primary:
--color-accent-primary-hover:
--color-accent-primary-active:
--color-accent-secondary:
--color-status-success:
--color-status-warning:
--color-status-error:
--color-status-info:
--color-surface-overlay:
Spacing
Generate a consistent scale. The base unit should match the philosophy:
- Tight philosophies (Brutalist, Swiss): 4px base
- Balanced philosophies (Rams, Scandinavian): 4px or 8px base
- Spacious philosophies (Japanese Minimalism, Editorial): 8px base with larger multipliers
--space-0: 0;
--space-1:
--space-2:
--space-3:
--space-4:
--space-5:
--space-6:
--space-7:
--space-8:
--space-9:
--space-10:
--space-11:
--space-12:
Typography
--font-family-display:
--font-family-body:
--font-family-mono:
--font-size-xs:
--font-size-sm:
--font-size-base:
--font-size-md:
--font-size-lg:
--font-size-xl:
--font-size-2xl:
--font-size-3xl:
--font-size-4xl:
--font-weight-normal:
--font-weight-medium:
--font-weight-semibold:
--font-weight-bold:
--line-height-tight:
--line-height-normal:
--line-height-relaxed:
--letter-spacing-tight:
--letter-spacing-normal:
--letter-spacing-wide:
Layout
--max-width-content:
--max-width-wide:
--max-width-page:
--border-radius-sm:
--border-radius-md:
--border-radius-lg:
--border-radius-full:
--shadow-sm:
--shadow-md:
--shadow-lg:
--shadow-focus:
Motion
--duration-instant: 50ms;
--duration-fast: 150ms;
--duration-normal: 250ms;
--duration-slow: 400ms;
--duration-slower: 600ms;
--easing-default: cubic-bezier(0.4, 0, 0.2, 1);
--easing-in: cubic-bezier(0.4, 0, 1, 1);
--easing-out: cubic-bezier(0, 0, 0.2, 1);
--easing-bounce: cubic-bezier(0.34, 1.56, 0.64, 1);
Responsive Breakpoints
--breakpoint-sm: 375px;
--breakpoint-md: 768px;
--breakpoint-lg: 1024px;
--breakpoint-xl: 1280px;
--breakpoint-2xl: 1536px;
Dark Mode
Always generate dark mode tokens alongside light mode. Rules:
- Do not simply invert colors. Dark backgrounds should be warm or cool depending on the philosophy.
- Reduce contrast slightly in dark mode (pure white text on pure black is harsh).
- Shadows should use darker, more transparent values in dark mode, not the same shadows as light.
- Accent colors may need lightness adjustments to maintain contrast ratios.
- Include a
prefers-color-scheme media query AND a [data-theme="dark"] attribute selector so the user can support both system preference and manual toggle.
:root {
}
[data-theme="dark"] {
}
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
}
}
Output
Save the tokens file in the appropriate location for the project's tech stack. State which philosophy the tokens are derived from and note any deviations or choices made.