About shadcn-theming
A theming skill for shadcn/ui projects, intended for developers configuring design tokens and color modes. It covers CSS variables, OKLCH, dark and light themes, and Tailwind v4 integration across Base UI, Radix, and React Aria bases.
Key features
- 01CSS custom-property design tokens
- 02OKLCH color values
- 03Dark and light mode setup
- 04Tailwind v4 @theme integration
- 05Theme presets and base colors
- 06Token hierarchy and validation
Use cases
- 01Setting up dark and light themes
- 02Defining semantic color tokens
- 03Applying or changing theme presets
- 04Checking themes for missing overrides
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ fusengine/ claude-plugins --skill shadcn-themingAfter installing, type/shadcn-themingin Claude Code to confirm it loaded.
Details
From the project README
Design tokens and theming for shadcn/ui: CSS custom properties (`--background`, `--primary`, etc.), OKLCH wide-gamut colors, dark/light mode via the `.dark` class or `prefers-color-scheme`, and Tailwind v4 `@theme` directive integration — identical for the Base UI, Radix and React Aria bases. Also covers the 7 base colors, presets (`init --preset`, `apply --preset --only theme,font`), `migrate base-color`, `shadcn/tailwind.css` / `eject`, and shadcn/typeset for rendered markdown.
Documents the token hierarchy (component → semantic → primitive OKLCH values) and the validation checklist (dark-mode overrides, chart/sidebar variables, no hard-coded hex).
shadcn Theming
Agent Workflow (MANDATORY)
Before theming work, spawn agents in parallel, one Agent call each with a name:
- fuse-ai-pilot:explore-codebase - Find existing theme tokens
- fuse-ai-pilot:research-expert - Verify OKLCH patterns via Context7
After: Run fuse-ai-pilot:sniper for validation.
Overview
| Feature | Description |
|---|---|
| CSS Variables | --background, --foreground, --primary |
| OKLCH Colors | Wide-gamut P3 color space |
| Dark Mode | .dark class or prefers-color-scheme |
| Tailwind v4 | @theme inline directive integration + @custom-variant dark |
| Base colors | tailwind.baseColor: neutral, stone, zinc, mauve, olive, mist, taupe (set at init; switch with migrate base-color --to <c>) |
| Presets | Short code bundling style, base color, theme, chart color, icons, fonts, radius, menu color/accent (build on ui.shadcn.com/create) |
| Radius scale | --radius drives --radius-sm ... --radius-4xl via @theme inline |
Theme CLI (verified on shadcn 4.21.0)
{runner} shadcn@latest init --preset <code> # new project from a preset
{runner} shadcn@latest apply --preset <code> # switch preset: reinstalls components, keeps base + RTL
{runner} shadcn@latest apply --preset <code> --only theme # or --only font, --only theme,font
{runner} shadcn@latest preset decode <code> # also: resolve (current project), url, open
{runner} shadcn@latest migrate base-color --to zinc --yes # rewrite theme CSS vars + baseColor
{runner} shadcn@latest init --no-css-variables # inline utilities instead of tokens (install-time only)
{runner} shadcn@latest init --pointer # cursor: pointer on buttons (not part of presets)
{runner} shadcn@latest eject # inline shadcn/tailwind.css, drop the shadcn dependency
Critical Rules
- ALWAYS use OKLCH color space for all tokens
- ALWAYS define dark mode overrides for every token
- NEVER hard-code hex or rgb in components
- USE @theme inline directive for Tailwind v4 integration
- MAP semantic tokens to primitive OKLCH values
Architecture
app/
├── globals.css # :root + .dark token definitions
└── tailwind.config.ts # Optional (v3) or @theme (v4)
-> See theme-setup.md for complete theme
Token Hierarchy
Component: --card, --card-foreground, --button-*
↑
Semantic: --primary, --secondary, --accent, --muted
↑
Primitive: oklch(55% 0.20 260), oklch(98% 0.01 260)
Validation Checklist
[ ] CSS variables defined in :root
[ ] Dark mode overrides in .dark
[ ] OKLCH color space used
[ ] Chart variables (--chart-1 to --chart-5)
[ ] Sidebar variables if applicable
[ ] New tokens defined in :root + .dark AND exposed in @theme inline (--color-*)
[ ] No hard-coded hex in components
Best Practices
DO
- Use OKLCH for all colors
- Define semantic tokens mapped to primitives
- Provide dark mode overrides for all tokens
- Use
@theme inlinefor Tailwind v4 integration
DON'T
- Hard-code hex or rgb values
- Skip dark mode definitions
- Mix color spaces (hex + oklch)
- Define tokens only in Tailwind config
Reference Guide
Concepts
| Topic | Reference | When to Consult |
|---|---|---|
| Theming Guide | theming-guide.md | CSS variables, OKLCH, base colors, new tokens, typeset |
Templates
| Template | When to Use |
|---|---|
| theme-setup.md | Complete theme configuration |
Comments
Markdown supported