Back to skills
extension
Category: Development & EngineeringNo API key required

color-palette

Generate complete, accessible color palettes from a single brand hex. Creates 11-shade scale (50-950), semantic tokens (background, foreground, card, muted), and dark mode variants. Includes WCAG contrast checking for text accessibility. Use when: setting up design system, creating Tailwind theme, building brand colors from single hex, converting designs to code, checking color accessibility.

personAuthor: jakexiaohubgithub

Color Palette Generation

Status: Production Ready ✅ Last Updated: 2026-01-14 Standard: Tailwind v4 @theme syntax


Quick Start

Generate complete palette from brand hex:

// Input: Brand hex
const brandColor = "#0D9488" // Teal-600

// Output: 11-shade scale + semantic tokens + dark mode
primary-50:  #F0FDFA (lightest)
primary-500: #14B8A6 (brand)
primary-950: #042F2E (darkest)

background: #FFFFFF
foreground: #0F172A
primary: #14B8A6

Use the reference files to generate shades, map semantics, and check contrast.


Color Scale Overview

Standard 11-Shade Scale

| Shade | Lightness | Use Case | |-------|-----------|----------| | 50 | 97% | Subtle backgrounds | | 100 | 94% | Hover states | | 200 | 87% | Borders, dividers | | 300 | 75% | Disabled states | | 400 | 62% | Placeholder text | | 500 | 48% | Brand color | | 600 | 40% | Primary actions | | 700 | 33% | Hover on primary | | 800 | 27% | Active states | | 900 | 20% | Text on light bg | | 950 | 10% | Darkest accents |

Key principle: Shade 500 represents your brand color. Other shades maintain hue/saturation while varying lightness.


Hex to HSL Conversion

Convert brand hex to HSL for shade generation:

// Example: #0D9488 → hsl(174, 84%, 29%)
// H (Hue): 174deg
// S (Saturation): 84%
// L (Lightness): 29%

Generate shades by keeping hue constant, adjusting lightness:

  • Lighter shades (50-400): Reduce saturation slightly
  • Mid shades (500-600): Full saturation
  • Darker shades (700-950): Full saturation

See references/shade-generation.md for conversion formula.


Semantic Token Mapping

Map shade scale to semantic tokens for components:

Light Mode

--background: white
--foreground: primary-950
--card: white
--card-foreground: primary-900
--muted: primary-50
--muted-foreground: primary-600
--border: primary-200
--primary: primary-600
--primary-foreground: white

Dark Mode

--background: primary-950
--foreground: primary-50
--card: primary-900
--card-foreground: primary-50
--muted: primary-800
--muted-foreground: primary-400
--border: primary-800
--primary: primary-500
--primary-foreground: white

Pattern: Invert lightness while preserving relationships. See references/semantic-mapping.md.


Dark Mode Pattern

Swap light and dark shades:

| Light Mode | Dark Mode | |------------|-----------| | 50 (97% L) | 950 (10% L) | | 100 (94% L) | 900 (20% L) | | 200 (87% L) | 800 (27% L) | | 500 (brand) | 500 (brand, slightly brighter) |

Preserve brand identity: Keep hue/saturation consistent, only invert lightness.

CSS pattern:

:root {
  --background: white;
  --foreground: hsl(var(--primary-950));
}

.dark {
  --background: hsl(var(--primary-950));
  --foreground: hsl(var(--primary-50));
}

Contrast Checking

WCAG minimum ratios:

  • Text (AA): 4.5:1 normal, 3:1 large (18px+)
  • UI Elements: 3:1 (buttons, borders)

Quick check pairs:

  • primary-600 text on white background
  • white text on primary-600 background
  • primary-900 text on primary-50 background

Formula:

contrast = (lighter + 0.05) / (darker + 0.05)
// Where lighter/darker are relative luminance values

See references/contrast-checking.md for full formula and fix patterns.


Quick Reference

Generate Complete Palette

  1. Convert brand hex to HSL
  2. Generate 11 shades (50-950) by varying lightness
  3. Map shades to semantic tokens
  4. Create dark mode variants (invert lightness)
  5. Check contrast for text pairs

Tailwind v4 Output

Use @theme directive:

@theme {
  --color-primary-50: #F0FDFA;
  --color-primary-500: #14B8A6;
  --color-primary-950: #042F2E;

  --color-background: #FFFFFF;
  --color-foreground: var(--color-primary-950);
}

Common Adjustments

  • Too vibrant at light shades: Reduce saturation by 10-20%
  • Poor contrast on primary: Use shade 700+ for text
  • Dark mode too dark: Use shade 900 instead of 950 for backgrounds
  • Brand color too light/dark: Adjust to shade 500-600 range

Resources

| File | Purpose | |------|---------| | references/shade-generation.md | Hex→HSL conversion, lightness values | | references/semantic-mapping.md | Token mapping for light/dark modes | | references/dark-mode-palette.md | Inversion patterns, shade swapping | | references/contrast-checking.md | WCAG formulas, quick check table | | templates/tailwind-colors.css | Complete CSS output template | | rules/color-palette.md | Common mistakes and corrections |


Token Efficiency

Without skill: ~8-12k tokens trial-and-error for palette generation With skill: ~3-4k tokens using references Savings: ~65%

Errors prevented:

  • Poor contrast ratios (accessibility violations)
  • Inconsistent shade scales
  • Broken dark mode (wrong lightness values)
  • Raw Tailwind colors instead of semantic tokens
  • Missing foreground pairs for backgrounds

Examples

Brand Color: Teal (#0D9488)

@theme {
  /* Shade scale */
  --color-primary-50: #F0FDFA;
  --color-primary-100: #CCFBF1;
  --color-primary-200: #99F6E4;
  --color-primary-300: #5EEAD4;
  --color-primary-400: #2DD4BF;
  --color-primary-500: #14B8A6;
  --color-primary-600: #0D9488;
  --color-primary-700: #0F766E;
  --color-primary-800: #115E59;
  --color-primary-900: #134E4A;
  --color-primary-950: #042F2E;

  /* Light mode semantics */
  --color-background: #FFFFFF;
  --color-foreground: var(--color-primary-950);
  --color-primary: var(--color-primary-600);
  --color-primary-foreground: #FFFFFF;
}

.dark {
  /* Dark mode overrides */
  --color-background: var(--color-primary-950);
  --color-foreground: var(--color-primary-50);
  --color-primary: var(--color-primary-500);
}

Brand Color: Purple (#7C3AED)

@theme {
  --color-primary-50: #FAF5FF;
  --color-primary-500: #A855F7;
  --color-primary-950: #3B0764;

  --color-background: #FFFFFF;
  --color-foreground: var(--color-primary-950);
  --color-primary: var(--color-primary-600);
}

Next Steps: Use references/shade-generation.md to convert your brand hex to HSL and generate the 11-shade scale.