design-system-manager

Design System Manager

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "design-system-manager" with this command: npx skills add deve1993/quickfy-website/deve1993-quickfy-website-design-system-manager

Design System Manager

Expert skill for creating and maintaining scalable design systems. Specializes in Tailwind CSS 4, design tokens, theming systems, color palettes, and typography scales.

Technology Stack (2025)

Styling

  • Tailwind CSS 4.0 - CSS-first config, cascade layers, @theme

  • CSS Variables - Runtime theming

  • oklch() - Perceptually uniform colors

  • @property - Registered custom properties

Tools

  • Style Dictionary 4 - Token transformation

  • Radix Colors - Accessible color system

  • colord - Color manipulation

  • Figma Tokens - Design-to-code sync

Tailwind CSS 4.0 Configuration

CSS-First Configuration

/* app.css */ @import "tailwindcss";

@theme { /* Colors using oklch for better interpolation */ --color-primary: oklch(0.7 0.15 250); --color-primary-hover: oklch(0.6 0.15 250); --color-secondary: oklch(0.65 0.12 280);

--color-background: oklch(0.99 0.005 250); --color-foreground: oklch(0.15 0.01 250);

--color-muted: oklch(0.95 0.01 250); --color-muted-foreground: oklch(0.45 0.02 250);

--color-accent: oklch(0.92 0.02 250); --color-accent-foreground: oklch(0.15 0.01 250);

--color-destructive: oklch(0.55 0.2 25); --color-destructive-foreground: oklch(0.98 0.01 250);

--color-success: oklch(0.6 0.18 145); --color-warning: oklch(0.75 0.18 85);

/* Typography */ --font-sans: "Inter Variable", system-ui, sans-serif; --font-mono: "JetBrains Mono", monospace;

--text-xs: 0.75rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.125rem; --text-xl: 1.25rem; --text-2xl: 1.5rem; --text-3xl: 1.875rem; --text-4xl: 2.25rem;

/* Spacing (4px grid) */ --spacing-0: 0; --spacing-1: 0.25rem; --spacing-2: 0.5rem; --spacing-3: 0.75rem; --spacing-4: 1rem; --spacing-5: 1.25rem; --spacing-6: 1.5rem; --spacing-8: 2rem; --spacing-10: 2.5rem; --spacing-12: 3rem; --spacing-16: 4rem;

/* Border Radius */ --radius-sm: 0.25rem; --radius-md: 0.375rem; --radius-lg: 0.5rem; --radius-xl: 0.75rem; --radius-2xl: 1rem; --radius-full: 9999px;

/* Shadows */ --shadow-sm: 0 1px 2px 0 oklch(0 0 0 / 0.05); --shadow-md: 0 4px 6px -1px oklch(0 0 0 / 0.1), 0 2px 4px -2px oklch(0 0 0 / 0.1); --shadow-lg: 0 10px 15px -3px oklch(0 0 0 / 0.1), 0 4px 6px -4px oklch(0 0 0 / 0.1);

/* Transitions */ --duration-fast: 150ms; --duration-normal: 200ms; --duration-slow: 300ms; --easing-default: cubic-bezier(0.4, 0, 0.2, 1); }

/* Dark Mode */ @media (prefers-color-scheme: dark) { @theme { --color-background: oklch(0.15 0.01 250); --color-foreground: oklch(0.95 0.01 250); --color-muted: oklch(0.25 0.01 250); --color-muted-foreground: oklch(0.65 0.02 250); --color-accent: oklch(0.25 0.02 250); --color-accent-foreground: oklch(0.95 0.01 250); } }

/* Class-based dark mode */ .dark { @theme { --color-background: oklch(0.15 0.01 250); --color-foreground: oklch(0.95 0.01 250); } }

Theme Provider (React 19)

// theme-provider.tsx 'use client'

import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'

type Theme = 'light' | 'dark' | 'system'

interface ThemeContextValue { theme: Theme setTheme: (theme: Theme) => void resolvedTheme: 'light' | 'dark' }

const ThemeContext = createContext<ThemeContextValue | null>(null)

export function useTheme() { const context = useContext(ThemeContext) if (!context) throw new Error('useTheme must be used within ThemeProvider') return context }

interface ThemeProviderProps { children: ReactNode defaultTheme?: Theme storageKey?: string }

export function ThemeProvider({ children, defaultTheme = 'system', storageKey = 'ui-theme', }: ThemeProviderProps) { const [theme, setTheme] = useState<Theme>(defaultTheme) const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>('light')

useEffect(() => { const stored = localStorage.getItem(storageKey) as Theme | null if (stored) setTheme(stored) }, [storageKey])

useEffect(() => { const root = document.documentElement

const applyTheme = (t: 'light' | 'dark') => {
  root.classList.remove('light', 'dark')
  root.classList.add(t)
  setResolvedTheme(t)
}

if (theme === 'system') {
  const media = window.matchMedia('(prefers-color-scheme: dark)')
  applyTheme(media.matches ? 'dark' : 'light')

  const handler = (e: MediaQueryListEvent) => applyTheme(e.matches ? 'dark' : 'light')
  media.addEventListener('change', handler)
  return () => media.removeEventListener('change', handler)
} else {
  applyTheme(theme)
}

}, [theme])

const handleSetTheme = (newTheme: Theme) => { setTheme(newTheme) localStorage.setItem(storageKey, newTheme) }

return ( <ThemeContext value={{ theme, setTheme: handleSetTheme, resolvedTheme }}> {children} </ThemeContext> ) }

Color System

Color Palette Generator

// 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(), 950: base.darken(0.45).toHex(), } }

export function checkContrast(foreground: string, background: string) { const contrast = colord(foreground).contrast(background)

return { ratio: contrast.toFixed(2), passesAA: contrast >= 4.5, passesAAA: contrast >= 7, passesAALarge: contrast >= 3, } }

OKLCH Color Utilities

// oklch-utils.ts export function oklch(l: number, c: number, h: number, a = 1) { return oklch(${l} ${c} ${h}${a &#x3C; 1 ? / ${a} : ''}) }

export const colors = { primary: { DEFAULT: 'var(--color-primary)', hover: 'var(--color-primary-hover)', }, background: 'var(--color-background)', foreground: 'var(--color-foreground)', muted: { DEFAULT: 'var(--color-muted)', foreground: 'var(--color-muted-foreground)', }, }

Typography System

Fluid Typography with clamp()

@theme { /* Fluid type scale */ --text-fluid-xs: clamp(0.69rem, 0.66rem + 0.16vw, 0.75rem); --text-fluid-sm: clamp(0.83rem, 0.78rem + 0.24vw, 0.94rem); --text-fluid-base: clamp(1rem, 0.93rem + 0.36vw, 1.19rem); --text-fluid-lg: clamp(1.2rem, 1.09rem + 0.53vw, 1.48rem); --text-fluid-xl: clamp(1.44rem, 1.29rem + 0.75vw, 1.86rem); --text-fluid-2xl: clamp(1.73rem, 1.52rem + 1.05vw, 2.33rem); --text-fluid-3xl: clamp(2.07rem, 1.78rem + 1.47vw, 2.91rem); }

Text Styles

// text-styles.ts export const textStyles = { h1: 'text-4xl font-bold tracking-tight', h2: 'text-3xl font-semibold tracking-tight', h3: 'text-2xl font-semibold', h4: 'text-xl font-semibold', body: 'text-base', small: 'text-sm text-muted-foreground', code: 'font-mono text-sm', }

Spacing System

4px Grid System

@theme { --spacing-px: 1px; --spacing-0: 0; --spacing-0.5: 0.125rem; /* 2px / --spacing-1: 0.25rem; / 4px / --spacing-1.5: 0.375rem; / 6px / --spacing-2: 0.5rem; / 8px / --spacing-2.5: 0.625rem; / 10px / --spacing-3: 0.75rem; / 12px / --spacing-3.5: 0.875rem; / 14px / --spacing-4: 1rem; / 16px / --spacing-5: 1.25rem; / 20px / --spacing-6: 1.5rem; / 24px / --spacing-7: 1.75rem; / 28px / --spacing-8: 2rem; / 32px / --spacing-9: 2.25rem; / 36px / --spacing-10: 2.5rem; / 40px / --spacing-12: 3rem; / 48px / --spacing-14: 3.5rem; / 56px / --spacing-16: 4rem; / 64px / --spacing-20: 5rem; / 80px / --spacing-24: 6rem; / 96px */ }

Component Tokens

// component-tokens.ts export const componentTokens = { button: { sm: 'h-9 px-3 text-sm', md: 'h-10 px-4', lg: 'h-11 px-8', icon: 'h-10 w-10', }, input: { height: 'h-10', padding: 'px-3 py-2', border: 'border border-input', focus: 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring', }, card: { padding: 'p-6', border: 'border rounded-lg', shadow: 'shadow-sm', }, }

Best Practices

Design Tokens

  • Three-Tier System: Primitive → Semantic → Component

  • Meaningful Names: color-primary not color-blue

  • Single Source of Truth: Define once, use everywhere

  • CSS Variables: For runtime theming

Tailwind CSS 4

  • CSS-First Config: Use @theme directive

  • OKLCH Colors: Better color interpolation

  • Cascade Layers: Proper specificity control

  • Container Queries: Component-level responsive

Accessibility

  • Color Contrast: WCAG AA minimum (4.5:1)

  • Focus States: Visible focus indicators

  • Motion: Respect prefers-reduced-motion

  • Font Size: Minimum 16px for body

When to Use This Skill

Activate when you need to:

  • Set up design system

  • Create design tokens

  • Implement theming

  • Define color palettes

  • Create typography system

  • Set up spacing system

  • Ensure design consistency

  • Improve accessibility

Output Format

Provide:

  • Token Files: Complete token definitions

  • Theme Configuration: CSS variables and theme provider

  • Usage Examples: How to use tokens

  • Accessibility Report: WCAG compliance

  • Documentation: Usage guidelines

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Coding

ui-component-builder

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

library-bundler

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

component-documenter

No summary provided by upstream source.

Repository SourceNeeds Review
Coding

component-tester

No summary provided by upstream source.

Repository SourceNeeds Review