home / skills / shipshitdev / library / tailwind-validator
This skill validates Tailwind v4 usage, enforces CSS-first @theme configuration, and flags v3 patterns to ensure migration.
npx playbooks add skill shipshitdev/library --skill tailwind-validatorReview the files below or copy the command above to add this skill to your agents.
---
name: tailwind-validator
description: Validate Tailwind CSS v4 configuration and detect/prevent Tailwind v3 patterns. Use this skill when setting up Tailwind, auditing CSS configuration, or when you suspect outdated Tailwind patterns are being used. Ensures CSS-first configuration with @theme blocks.
version: 1.0.0
tags:
- tailwind
- css
- validation
- frontend
- configuration
---
# Tailwind 4 Validator
Validates that a project uses Tailwind CSS v4 with proper CSS-first configuration. Detects and flags Tailwind v3 patterns that should be migrated.
## Purpose
**CRITICAL**: Claude and other AI assistants often default to Tailwind v3 patterns. This skill ensures:
- Projects use Tailwind v4 CSS-first configuration
- Old `tailwind.config.js` patterns are detected and flagged
- Proper `@theme` blocks are used instead of JS config
- Dependencies are v4+
## When to Use
- **Before any Tailwind work**: Run validation first
- **New project setup**: Ensure v4 is installed correctly
- **After AI generates Tailwind code**: Verify no v3 patterns snuck in
- **Auditing existing projects**: Check for migration needs
- **CI/CD pipelines**: Prevent v3 regressions
## Quick Start
```bash
# Validate current project
python3 ~/.claude/skills/tailwind-validator/scripts/validate.py --root .
# Validate with auto-fix suggestions
python3 ~/.claude/skills/tailwind-validator/scripts/validate.py --root . --suggest-fixes
# Strict mode (fail on any v3 pattern)
python3 ~/.claude/skills/tailwind-validator/scripts/validate.py --root . --strict
```
## What Gets Checked
### 1. Package Version
```json
// GOOD: v4+
"tailwindcss": "^4.0.0"
// BAD: v3
"tailwindcss": "^3.4.0"
```
### 2. CSS Configuration (v4 CSS-first)
**GOOD - Tailwind v4:**
```css
/* app.css or globals.css */
@import "tailwindcss";
@theme {
--color-primary: #3b82f6;
--color-secondary: #64748b;
--font-sans: "Inter", sans-serif;
--breakpoint-3xl: 1920px;
}
```
**BAD - Tailwind v3:**
```css
/* Old v3 directives */
@tailwind base;
@tailwind components;
@tailwind utilities;
```
### 3. Config Files
**BAD - Should not exist in v4:**
- `tailwind.config.js`
- `tailwind.config.ts`
- `tailwind.config.mjs`
- `tailwind.config.cjs`
**Note**: These files are deprecated in v4. All configuration should be in CSS using `@theme`.
### 4. PostCSS Configuration
**GOOD - v4:**
```js
// postcss.config.js (minimal or not needed)
export default {
plugins: {
'@tailwindcss/postcss': {},
},
};
```
**BAD - v3:**
```js
// postcss.config.js
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
```
### 5. Import Patterns
**GOOD:**
```css
@import "tailwindcss";
@import "tailwindcss/preflight";
@import "tailwindcss/utilities";
```
**BAD:**
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
## Validation Output
```
=== Tailwind 4 Validation Report ===
Package Version: [email protected] ✓
CSS Configuration:
✓ Found @import "tailwindcss" in src/app/globals.css
✓ Found @theme block with 12 custom properties
✗ Found @tailwind directive in src/styles/legacy.css (line 3)
Config Files:
✗ Found tailwind.config.ts - should migrate to CSS @theme
PostCSS:
✓ Using @tailwindcss/postcss plugin
Summary: 2 issues found
- Migrate tailwind.config.ts to @theme in CSS
- Remove @tailwind directives from src/styles/legacy.css
```
## Migration Guide
### From Tailwind v3 to v4
1. **Update package.json:**
```bash
bun remove tailwindcss autoprefixer
bun add tailwindcss@latest @tailwindcss/postcss
```
1. **Update postcss.config.js:**
```js
export default {
plugins: {
'@tailwindcss/postcss': {},
},
};
```
1. **Convert tailwind.config.js to CSS @theme:**
**Before (v3):**
```js
// tailwind.config.js
module.exports = {
theme: {
extend: {
colors: {
primary: '#3b82f6',
secondary: '#64748b',
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
};
```
**After (v4):**
```css
/* globals.css */
@import "tailwindcss";
@theme {
--color-primary: #3b82f6;
--color-secondary: #64748b;
--font-sans: "Inter", sans-serif;
}
```
1. **Replace @tailwind directives:**
**Before:**
```css
@tailwind base;
@tailwind components;
@tailwind utilities;
```
**After:**
```css
@import "tailwindcss";
```
1. **Delete old config files:**
```bash
rm tailwind.config.js tailwind.config.ts
```
## Common v3 Patterns to Avoid
| v3 Pattern | v4 Replacement |
|------------|----------------|
| `@tailwind base` | `@import "tailwindcss"` |
| `@tailwind utilities` | `@import "tailwindcss/utilities"` |
| `tailwind.config.js` | `@theme` block in CSS |
| `theme.extend.colors` | `--color-*` CSS variables |
| `theme.extend.spacing` | `--spacing-*` CSS variables |
| `theme.extend.fontFamily` | `--font-*` CSS variables |
| `content: ['./src/**/*.tsx']` | Not needed (auto-detected) |
| `plugins: [require('@tailwindcss/forms')]` | `@plugin "@tailwindcss/forms"` |
## v4 @theme Reference
```css
@import "tailwindcss";
@theme {
/* Colors */
--color-primary: #3b82f6;
--color-primary-50: #eff6ff;
--color-primary-900: #1e3a8a;
/* Typography */
--font-sans: "Inter", system-ui, sans-serif;
--font-mono: "JetBrains Mono", monospace;
/* Spacing (extends default scale) */
--spacing-128: 32rem;
/* Breakpoints */
--breakpoint-3xl: 1920px;
/* Animations */
--animate-fade-in: fade-in 0.3s ease-out;
/* Shadows */
--shadow-glow: 0 0 20px rgba(59, 130, 246, 0.5);
/* Border radius */
--radius-4xl: 2rem;
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
```
## Using with shadcn/ui
shadcn/ui v2+ supports Tailwind v4. After running the shadcn CLI:
1. Verify `components.json` uses CSS variables
2. Check that generated components use v4 patterns
3. Ensure `@theme` includes shadcn color tokens:
```css
@theme {
--color-background: hsl(0 0% 100%);
--color-foreground: hsl(222.2 84% 4.9%);
--color-card: hsl(0 0% 100%);
--color-card-foreground: hsl(222.2 84% 4.9%);
--color-popover: hsl(0 0% 100%);
--color-popover-foreground: hsl(222.2 84% 4.9%);
--color-primary: hsl(222.2 47.4% 11.2%);
--color-primary-foreground: hsl(210 40% 98%);
--color-secondary: hsl(210 40% 96.1%);
--color-secondary-foreground: hsl(222.2 47.4% 11.2%);
--color-muted: hsl(210 40% 96.1%);
--color-muted-foreground: hsl(215.4 16.3% 46.9%);
--color-accent: hsl(210 40% 96.1%);
--color-accent-foreground: hsl(222.2 47.4% 11.2%);
--color-destructive: hsl(0 84.2% 60.2%);
--color-destructive-foreground: hsl(210 40% 98%);
--color-border: hsl(214.3 31.8% 91.4%);
--color-input: hsl(214.3 31.8% 91.4%);
--color-ring: hsl(222.2 84% 4.9%);
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
}
```
## CI/CD Integration
Add to your CI pipeline:
```yaml
# .github/workflows/lint.yml
- name: Validate Tailwind v4
run: |
python3 ~/.claude/skills/tailwind-validator/scripts/validate.py \
--root . \
--strict \
--ci
```
## Troubleshooting
### "Found tailwind.config.js but using v4"
Some tools still generate v3 configs. Delete the file and use `@theme` instead.
### "@tailwind directives found"
Replace with `@import "tailwindcss"`. The old directives are not supported in v4.
### "autoprefixer in postcss.config"
Remove autoprefixer - it's built into `@tailwindcss/postcss`.
### "content array in config"
v4 auto-detects content files. Remove the `content` config entirely.
This skill validates Tailwind CSS v4 configuration and detects legacy Tailwind v3 patterns that should be migrated. It enforces a CSS-first configuration using @theme blocks, checks package and PostCSS setup, and flags deprecated config files or @tailwind directives. Use it to avoid accidental v3 regressions and ensure v4 best practices are followed.
The validator scans project files for package.json versions, PostCSS configuration, CSS imports and directives, and the presence of legacy Tailwind config files. It identifies v3 patterns such as @tailwind base/components/utilities, tailwind.config.* files, content arrays, and autoprefixer usage, then reports issues and suggests concrete fixes. Optional strict mode fails on any detected v3 pattern and a suggestions mode emits automated migration hints.
Will this tool auto-fix files?
It provides suggested fixes and migration steps; some fixes can be suggested automatically but manual review is recommended.
What if I still need a JS config for plugins?
Tailwind v4 moves configuration to CSS; use @plugin "@tailwindcss/.." and @theme variables instead of keeping tailwind.config.js.
Does v4 require PostCSS changes?
Yes. Use @tailwindcss/postcss plugin and remove autoprefixer from postcss config since it is included.