Consistent design through tokens.
What Are Design Tokens?
css/* Design tokens as CSS variables */ :root { /* Colors */ --color-primary: #3b82f6; --color-primary-hover: #2563eb; --color-secondary: #6b7280; --color-danger: #ef4444; /* Spacing */ --spacing-xs: 0.25rem; --spacing-sm: 0.5rem; --spacing-md: 1rem; --spacing-lg: 1.5rem; --spacing-xl: 2rem; /* Typography */ --font-family: 'Inter', system-ui, sans-serif; --font-size-sm: 0.875rem; --font-size-md: 1rem; --font-size-lg: 1.25rem; /* Border radius */ --radius-sm: 0.25rem; --radius-md: 0.5rem; --radius-lg: 1rem; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1); }
TypeScript Tokens
tsx// tokens/index.ts export const colors = { primary: 'var(--color-primary)', secondary: 'var(--color-secondary)', danger: 'var(--color-danger)', } as const; export const spacing = { xs: 'var(--spacing-xs)', sm: 'var(--spacing-sm)', md: 'var(--spacing-md)', lg: 'var(--spacing-lg)', xl: 'var(--spacing-xl)', } as const; export type Color = keyof typeof colors; export type Spacing = keyof typeof spacing;
Theme Context
tsxtype Theme = 'light' | 'dark'; const ThemeContext = createContext<{ theme: Theme; setTheme: (theme: Theme) => void; } | null>(null); export function ThemeProvider({ children }: { children: React.ReactNode }) { const [theme, setTheme] = useState<Theme>(() => { if (typeof window !== 'undefined') { return localStorage.getItem('theme') as Theme || 'light'; } return 'light'; }); useEffect(() => { document.documentElement.dataset.theme = theme; localStorage.setItem('theme', theme); }, [theme]); return ( <ThemeContext.Provider value={{ theme, setTheme }}> {children} </ThemeContext.Provider> ); } export function useTheme() { const context = useContext(ThemeContext); if (!context) throw new Error('useTheme must be used within ThemeProvider'); return context; }
Dark Mode Tokens
css:root { --color-bg: #ffffff; --color-text: #1f2937; --color-border: #e5e7eb; } [data-theme='dark'] { --color-bg: #1f2937; --color-text: #f9fafb; --color-border: #374151; }
Tailwind Config with Tokens
js// tailwind.config.js module.exports = { theme: { extend: { colors: { primary: 'var(--color-primary)', secondary: 'var(--color-secondary)', }, spacing: { xs: 'var(--spacing-xs)', sm: 'var(--spacing-sm)', }, }, }, };