Claude Code Plugins

Community-maintained marketplace

Feedback

Design token management for creating, organizing, and applying design tokens across projects. Supports multiple formats (CSS custom properties, Sass, JS, JSON). Use when setting up design systems or managing design tokens.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name design-tokens
description Design token management for creating, organizing, and applying design tokens across projects. Supports multiple formats (CSS custom properties, Sass, JS, JSON). Use when setting up design systems or managing design tokens.
allowed-tools Read, Write, Edit

Design Tokens Skill

This skill helps you create, organize, and manage design tokens for scalable design systems. I'll guide you through token architecture, naming conventions, and implementation across different formats.

What Are Design Tokens?

Design tokens are named entities that store visual design attributes. They create a single source of truth for design decisions and enable consistent styling across platforms and tools.

Token Hierarchy

Global Tokens (Foundation)
    ↓
Semantic Tokens (Purpose/Context)
    ↓
Component Tokens (Specific Usage)

Token Categories

Color Tokens

  • Brand colors
  • Semantic colors (success, error, warning)
  • Text colors
  • Background colors
  • Border colors
  • State colors (hover, active, disabled)

Spacing Tokens

  • Margin and padding scales
  • Gap values
  • Layout spacing
  • Component spacing

Typography Tokens

  • Font families
  • Font sizes
  • Font weights
  • Line heights
  • Letter spacing

Size Tokens

  • Width and height values
  • Min/max constraints
  • Breakpoints
  • Container sizes

Border Tokens

  • Border widths
  • Border radius values
  • Border styles

Shadow Tokens

  • Box shadows
  • Elevation levels
  • Text shadows

Animation Tokens

  • Durations
  • Timing functions
  • Delays

Token Naming Convention

Pattern: [category]-[property]-[variant]-[state]

/* Color tokens */
--color-primary          /* Brand primary */
--color-primary-hover    /* Hover state */
--color-primary-light    /* Variant */

--color-text-primary     /* Primary text */
--color-text-secondary   /* Secondary text */

--color-bg-primary       /* Primary background */
--color-bg-secondary     /* Secondary background */

/* Spacing tokens */
--spacing-1              /* Smallest */
--spacing-4              /* Base */
--spacing-8              /* Large */

/* Typography tokens */
--font-size-sm           /* Small */
--font-size-base         /* Base */
--font-size-lg           /* Large */

--font-weight-normal     /* 400 */
--font-weight-bold       /* 700 */

/* Component tokens */
--button-padding-x
--button-padding-y
--button-bg-primary
--button-text-primary

--card-padding
--card-radius
--card-shadow

Global Tokens (Foundation)

:root {
  /* Color primitives */
  --color-blue-50: #eff6ff;
  --color-blue-100: #dbeafe;
  --color-blue-200: #bfdbfe;
  --color-blue-300: #93c5fd;
  --color-blue-400: #60a5fa;
  --color-blue-500: #3b82f6;
  --color-blue-600: #2563eb;
  --color-blue-700: #1d4ed8;
  --color-blue-800: #1e40af;
  --color-blue-900: #1e3a8a;

  --color-gray-50: #f9fafb;
  --color-gray-100: #f3f4f6;
  --color-gray-200: #e5e7eb;
  --color-gray-300: #d1d5db;
  --color-gray-400: #9ca3af;
  --color-gray-500: #6b7280;
  --color-gray-600: #4b5563;
  --color-gray-700: #374151;
  --color-gray-800: #1f2937;
  --color-gray-900: #111827;

  /* Spacing scale (4px base) */
  --spacing-0: 0;
  --spacing-1: 0.25rem;   /* 4px */
  --spacing-2: 0.5rem;    /* 8px */
  --spacing-3: 0.75rem;   /* 12px */
  --spacing-4: 1rem;      /* 16px */
  --spacing-5: 1.25rem;   /* 20px */
  --spacing-6: 1.5rem;    /* 24px */
  --spacing-8: 2rem;      /* 32px */
  --spacing-10: 2.5rem;   /* 40px */
  --spacing-12: 3rem;     /* 48px */
  --spacing-16: 4rem;     /* 64px */

  /* Font sizes (modular scale 1.25) */
  --font-size-xs: 0.75rem;    /* 12px */
  --font-size-sm: 0.875rem;   /* 14px */
  --font-size-base: 1rem;     /* 16px */
  --font-size-lg: 1.125rem;   /* 18px */
  --font-size-xl: 1.25rem;    /* 20px */
  --font-size-2xl: 1.5rem;    /* 24px */
  --font-size-3xl: 1.875rem;  /* 30px */
  --font-size-4xl: 2.25rem;   /* 36px */
  --font-size-5xl: 3rem;      /* 48px */

  /* Font weights */
  --font-weight-thin: 100;
  --font-weight-light: 300;
  --font-weight-normal: 400;
  --font-weight-medium: 500;
  --font-weight-semibold: 600;
  --font-weight-bold: 700;
  --font-weight-black: 900;

  /* Line heights */
  --line-height-none: 1;
  --line-height-tight: 1.25;
  --line-height-snug: 1.375;
  --line-height-normal: 1.5;
  --line-height-relaxed: 1.625;
  --line-height-loose: 2;

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

  /* Shadows */
  --shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
  --shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
  --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);
  --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
  --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
  --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
  --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);

  /* Animation */
  --duration-fast: 150ms;
  --duration-base: 250ms;
  --duration-slow: 350ms;
  --duration-slower: 500ms;

  --ease-in: cubic-bezier(0.4, 0, 1, 1);
  --ease-out: cubic-bezier(0, 0, 0.2, 1);
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}

Semantic Tokens (Purpose)

:root {
  /* Color semantics */
  --color-primary: var(--color-blue-600);
  --color-primary-hover: var(--color-blue-700);
  --color-primary-active: var(--color-blue-800);
  --color-primary-light: var(--color-blue-50);

  --color-secondary: var(--color-gray-600);
  --color-success: var(--color-green-600);
  --color-warning: var(--color-yellow-600);
  --color-error: var(--color-red-600);
  --color-info: var(--color-blue-500);

  /* Text colors */
  --color-text-primary: var(--color-gray-900);
  --color-text-secondary: var(--color-gray-600);
  --color-text-tertiary: var(--color-gray-500);
  --color-text-disabled: var(--color-gray-400);
  --color-text-inverse: var(--color-white);

  /* Surface colors */
  --color-surface-primary: var(--color-white);
  --color-surface-secondary: var(--color-gray-50);
  --color-surface-tertiary: var(--color-gray-100);
  --color-surface-overlay: rgba(0, 0, 0, 0.5);

  /* Border colors */
  --color-border: var(--color-gray-300);
  --color-border-hover: var(--color-gray-400);
  --color-border-focus: var(--color-primary);

  /* Spacing semantics */
  --spacing-xs: var(--spacing-2);
  --spacing-sm: var(--spacing-3);
  --spacing-md: var(--spacing-4);
  --spacing-lg: var(--spacing-6);
  --spacing-xl: var(--spacing-8);

  /* Typography semantics */
  --text-xs: var(--font-size-xs);
  --text-sm: var(--font-size-sm);
  --text-base: var(--font-size-base);
  --text-lg: var(--font-size-lg);
  --text-xl: var(--font-size-xl);
}

Component Tokens (Specific)

:root {
  /* Button */
  --button-padding-x: var(--spacing-4);
  --button-padding-y: var(--spacing-2);
  --button-font-size: var(--font-size-base);
  --button-font-weight: var(--font-weight-semibold);
  --button-radius: var(--radius-md);
  --button-transition: var(--duration-base) var(--ease-in-out);

  --button-primary-bg: var(--color-primary);
  --button-primary-bg-hover: var(--color-primary-hover);
  --button-primary-text: var(--color-text-inverse);

  --button-secondary-bg: transparent;
  --button-secondary-border: var(--color-border);
  --button-secondary-text: var(--color-text-primary);

  /* Input */
  --input-padding-x: var(--spacing-3);
  --input-padding-y: var(--spacing-2);
  --input-font-size: var(--font-size-base);
  --input-border: 1px solid var(--color-border);
  --input-border-focus: 2px solid var(--color-border-focus);
  --input-radius: var(--radius-md);
  --input-bg: var(--color-surface-primary);

  /* Card */
  --card-padding: var(--spacing-6);
  --card-bg: var(--color-surface-primary);
  --card-border: 1px solid var(--color-border);
  --card-radius: var(--radius-lg);
  --card-shadow: var(--shadow-md);

  /* Modal */
  --modal-width: 32rem;
  --modal-padding: var(--spacing-6);
  --modal-bg: var(--color-surface-primary);
  --modal-radius: var(--radius-lg);
  --modal-shadow: var(--shadow-2xl);
  --modal-overlay-bg: var(--color-surface-overlay);
}

Multi-Format Token Output

CSS Custom Properties

/* tokens.css */
:root {
  --color-primary: #2563eb;
  --spacing-4: 1rem;
  --font-size-base: 1rem;
}

Sass Variables

// tokens.scss
$color-primary: #2563eb;
$spacing-4: 1rem;
$font-size-base: 1rem;

// Map format
$colors: (
  'primary': #2563eb,
  'secondary': #6b7280,
);

$spacing: (
  '4': 1rem,
  '6': 1.5rem,
);

JavaScript/TypeScript

// tokens.js
export const tokens = {
  color: {
    primary: '#2563eb',
    secondary: '#6b7280',
  },
  spacing: {
    4: '1rem',
    6: '1.5rem',
  },
  fontSize: {
    base: '1rem',
    lg: '1.125rem',
  },
};

// TypeScript
export interface Tokens {
  color: {
    primary: string;
    secondary: string;
  };
  spacing: {
    4: string;
    6: string;
  };
}

JSON

{
  "color": {
    "primary": {
      "value": "#2563eb",
      "type": "color"
    },
    "secondary": {
      "value": "#6b7280",
      "type": "color"
    }
  },
  "spacing": {
    "4": {
      "value": "1rem",
      "type": "dimension"
    }
  }
}

Theme Variations

Light & Dark Themes

:root {
  /* Light theme (default) */
  --color-bg: #ffffff;
  --color-text: #111827;
  --color-primary: #2563eb;
  --color-surface: #f9fafb;
  --color-border: #e5e7eb;
}

[data-theme="dark"] {
  /* Dark theme overrides */
  --color-bg: #111827;
  --color-text: #f9fafb;
  --color-primary: #60a5fa;
  --color-surface: #1f2937;
  --color-border: #374151;
}

[data-theme="high-contrast"] {
  /* High contrast theme */
  --color-bg: #000000;
  --color-text: #ffffff;
  --color-primary: #ffff00;
  --color-surface: #1a1a1a;
  --color-border: #ffffff;
}

Brand Themes

[data-brand="acme"] {
  --color-primary: #ff6b35;
  --font-family-display: "Montserrat", sans-serif;
  --radius-base: 0.5rem;
}

[data-brand="widgets-inc"] {
  --color-primary: #4caf50;
  --font-family-display: "Roboto", sans-serif;
  --radius-base: 0;
}

Token Documentation Template

## Color Tokens

### Primary
- **Token**: `--color-primary`
- **Value**: `#2563eb` (Blue 600)
- **Usage**: Primary actions, links, brand elements
- **Contrast**: 7.02:1 on white (AAA)
- **Related**:
  - `--color-primary-hover`: #1d4ed8
  - `--color-primary-light`: #eff6ff

### Text
- **Token**: `--color-text-primary`
- **Value**: `#111827` (Gray 900)
- **Usage**: Main body text, headings
- **Contrast**: 16.04:1 on white (AAA)

## Spacing Tokens

### Base Unit
- **Token**: `--spacing-4`
- **Value**: `1rem` (16px)
- **Usage**: Base spacing unit, component padding

## Component Tokens

### Button
- **Padding**: `--button-padding-x` (1rem), `--button-padding-y` (0.5rem)
- **Font**: `--button-font-size` (1rem), `--button-font-weight` (600)
- **Radius**: `--button-radius` (0.375rem)
- **Colors**:
  - Primary: `--button-primary-bg`, `--button-primary-text`
  - Secondary: `--button-secondary-border`, `--button-secondary-text`

Token Best Practices

✓ Do

  • Use hierarchical token structure
  • Name tokens by purpose, not value
  • Document all tokens with usage guidelines
  • Version tokens with design system
  • Test tokens in all themes
  • Provide fallback values
  • Group related tokens
  • Use semantic naming

❌ Don't

  • Name tokens by appearance (--color-blue)
  • Skip documentation
  • Create tokens for single-use values
  • Mix naming conventions
  • Hardcode values in components
  • Create too many token levels
  • Use inconsistent scales

Example: Complete Token System

:root {
  /* 1. GLOBAL TOKENS (Foundation) */

  /* Colors - Raw values */
  --color-blue-600: #2563eb;
  --color-gray-900: #111827;
  --color-white: #ffffff;

  /* Spacing - Base scale */
  --spacing-2: 0.5rem;
  --spacing-4: 1rem;

  /* 2. SEMANTIC TOKENS (Purpose) */

  /* Colors - Meaning */
  --color-primary: var(--color-blue-600);
  --color-text-primary: var(--color-gray-900);
  --color-surface: var(--color-white);

  /* Spacing - Context */
  --spacing-sm: var(--spacing-2);
  --spacing-md: var(--spacing-4);

  /* 3. COMPONENT TOKENS (Specific) */

  /* Button */
  --button-bg-primary: var(--color-primary);
  --button-text-primary: var(--color-surface);
  --button-padding-x: var(--spacing-md);
  --button-padding-y: var(--spacing-sm);
}

/* 4. USAGE */
.button--primary {
  background: var(--button-bg-primary);
  color: var(--button-text-primary);
  padding: var(--button-padding-y) var(--button-padding-x);
}

Just Ask!

Tell me what you need:

  • "Create a design token system"
  • "Generate spacing tokens"
  • "Set up color tokens"
  • "Create component tokens for buttons"
  • "Convert tokens to Sass format"
  • "Set up dark theme tokens"

I'll help you build scalable design token systems!