Overview
The Tailwind v4 + Shadcn UI skill provides a production-tested setup pattern for Tailwind CSS v4 with shadcn/ui components. This skill implements the new CSS-first architecture using@theme inline patterns and prevents 8 documented errors that commonly occur during migration and setup.
Production-Tested: This skill is battle-tested in production at WordPress Auditor
What This Skill Does
The skill guides AI agents through the complete Tailwind v4 + shadcn/ui setup:- Four-Step Architecture - CSS variables → Tailwind mapping → base styles → automatic dark mode
- Prevents 8 Errors - Documented solutions for common setup failures
- Dark Mode Setup - Complete ThemeProvider and toggle implementation
- Migration Guide - v3 → v4 migration with community-tested patterns
- OKLCH Color Space - Modern color system with automatic fallbacks
- Built-in Features - Container queries, line-clamp (no plugins needed)
Location in TailStack Packages
The Tailwind v4 + Shadcn skill is available in the React package:Skill Structure
Skill Contents
Each skill directory contains:
- SKILL.md - Complete setup guide (666 lines)
- templates/ - Production-ready file templates
index.css- Complete CSS with color variablescomponents.json- shadcn/ui v4 configurationvite.config.ts- Vite + Tailwind plugin setuptheme-provider.tsx- Dark mode providerutils.ts- cn() utility function
- references/ - Deep dive documentation
architecture.md- Four-step pattern explanationdark-mode.md- Complete dark mode guidecommon-gotchas.md- Troubleshootingmigration-guide.md- v3 → v4 migration
- commands/ - Setup automation
setup.md- Installation commands
The Four-Step Architecture
Step 1: Define CSS Variables at Root
Define color variables at the root level (NOT inside
@layer base).Step 2: Map Variables to Tailwind Utilities
Use
@theme inline to generate utility classes.Without this step, utilities like
bg-background won’t exist.Common Errors Prevented
This skill prevents 8 documented errors:Error #1: tw-animate-css Import Error
Error #1: tw-animate-css Import Error
Error: “Cannot find module ‘tailwindcss-animate’”Solution:Add to
src/index.css:Error #2: Colors Not Working
Error #2: Colors Not Working
Error:
bg-primary doesn’t apply stylesCause: Missing @theme inline mappingSolution: Add the @theme inline block (Step 2 of the architecture)Error #3: Dark Mode Not Switching
Error #3: Dark Mode Not Switching
Error: Theme stays light or darkCause: Missing ThemeProviderSolution: Use the template from
templates/theme-provider.tsx and wrap your appError #4: Duplicate @layer base
Error #4: Duplicate @layer base
Error: “Duplicate @layer base” in consoleCause: shadcn init adds
@layer base - don’t add anotherSolution: Use single @layer base block for all base stylesError #5: Build Fails with tailwind.config.ts
Error #5: Build Fails with tailwind.config.ts
Error: “Unexpected config file”Cause: v4 doesn’t use All configuration happens in CSS using
tailwind.config.ts (v3 legacy)Solution:@theme directive.Error #6: @theme inline Breaks Multi-Theme
Error #6: @theme inline Breaks Multi-Theme
Issue: Dark mode doesn’t switch when using custom variantsCause:
@theme inline bakes VALUES at build timeSolution: Use @theme (without inline) for multi-theme setups:Error #7: @apply Breaking (v4 Change)
Error #7: @apply Breaking (v4 Change)
Error:
Cannot apply unknown utility classCause: v4 doesn’t support @apply with @layer base/componentsMigration:Error #8: @layer base Styles Not Applying
Error #8: @layer base Styles Not Applying
Issue: Base styles seem ignoredCause: v4 uses native CSS layers - if not ordered, utilities override baseSolution: Define layer order explicitly or don’t use
@layer baseQuick Setup Guide
Dark Mode Implementation
What’s New in Tailwind v4
OKLCH Color Space
Perceptually uniform colors
- Better gradients (no muddy middle)
- Wider color gamut
- Automatic sRGB fallbacks
- 93.1% browser support
Built-in Features
No plugins needed
- Container queries built-in
- Line clamp built-in
- Typography plugin available
- Forms plugin available
Container Queries (Built-in)
Line Clamp (Built-in)
Migration from v3
Key Changes
- Delete
tailwind.config.ts - Move theme to CSS with
@theme inline - Replace
tailwindcss-animatewithtw-animate-css - Update plugins:
require()→@plugin - Use Vite plugin instead of PostCSS (recommended)
Default Element Styles Removed
Tailwind v4 takes a minimal approach - headings, lists, buttons lose default styles. Solution 1: Typography pluginUsing with AI Agents
Claude Desktop & Claude.ai
Cursor
OpenCode
Setup Checklist
Pre-Flight Checklist
-
@tailwindcss/viteinstalled (NOT postcss) -
vite.config.tsusestailwindcss()plugin -
components.jsonhas"config": "" - NO
tailwind.config.tsexists -
src/index.cssfollows 4-step pattern:-
:root/.darkat root level (not in @layer) - Colors wrapped with
hsl() -
@theme inlinemaps all variables -
@layer baseuses unwrapped variables
-
- ThemeProvider wraps app
- Theme toggle works
Critical Rules
✅ Always Do
- Wrap colors with
hsl()in:root/.dark - Use
@theme inlineto map CSS variables - Set
"tailwind.config": ""in components.json - Delete
tailwind.config.ts - Use
@tailwindcss/viteplugin
❌ Never Do
- Put
:root/.darkinside@layer base - Use
.dark { @theme { } }pattern - Double-wrap:
hsl(var(--background)) - Use
tailwind.config.tsfor theme - Use
@applydirective (deprecated)
Official Documentation
Learn More
- Skills.sh: tailwind-v4-shadcn
- shadcn/ui Vite Setup: Official Guide
- shadcn/ui Tailwind v4: Migration Guide
- Tailwind v4 Docs: Official Documentation
Related Skills
- Vercel React Best Practices - For performance optimization
- Node.js Backend Patterns - For backend setup
Version Information
- Skill Version: 3.0.0
- Tailwind CSS: 4.1.18 (Latest)
- Production: WordPress Auditor
- Last Updated: January 20, 2026
- Browser Support: Chrome 111+, Firefox 113+, Safari 15.4+