--- description: globs: alwaysApply: false --- # Tailwind CSS v4 Migration Guide ## **Key Changes in Tailwind CSS v4** - **No PostCSS dependency**: v4 has built-in CSS processing - **Simplified import**: Use `@import "tailwindcss"` instead of separate directives - **Vite plugin**: Use `@tailwindcss/vite` for Vite integration - **No config file needed**: Configuration through CSS custom properties ## **Complete Migration Steps** ### **1. Remove All v3 Dependencies** ```bash # Remove all Tailwind v3 and PostCSS packages npm uninstall tailwindcss @tailwindcss/postcss @tailwindcss/node @tailwindcss/oxide npm uninstall autoprefixer postcss postcss-import ``` ### **2. Install Tailwind CSS v4** ```bash # Install v4 packages npm install @tailwindcss/cli@next @tailwindcss/vite@next npm install tailwind-merge # For utility merging ``` ### **3. Update CSS Import** ```css /* ❌ DON'T: v3 style imports */ @tailwind base; @tailwind components; @tailwind utilities; /* ✅ DO: v4 single import */ @import "tailwindcss"; ``` ### **4. Update Vite Configuration** ```typescript // ❌ DON'T: v3 PostCSS setup import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "tailwindcss"; import autoprefixer from "autoprefixer"; export default defineConfig({ plugins: [react()], css: { postcss: { plugins: [tailwindcss(), autoprefixer()], }, }, }); // ✅ DO: v4 Vite plugin import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ plugins: [react(), tailwindcss()], }); ``` ### **5. Remove Configuration Files** ```bash # Delete these files (v4 doesn't need them) rm postcss.config.js rm tailwind.config.js ``` ## **v4 Configuration (Optional)** ### **CSS-based Configuration** ```css /* src/index.css */ @import "tailwindcss"; /* Custom theme configuration */ @theme { --color-primary: #3b82f6; --color-secondary: #64748b; --font-family-custom: "Inter", sans-serif; } ``` ### **Advanced Configuration** ```css @import "tailwindcss"; /* Custom utilities */ @utility { .scroll-smooth { scroll-behavior: smooth; } } /* Custom components */ @component { .btn { @apply px-4 py-2 rounded font-medium; } .btn-primary { @apply bg-blue-500 text-white hover:bg-blue-600; } } ``` ## **Migration Checklist** ### **Dependencies** - ✅ Remove: `tailwindcss`, `@tailwindcss/postcss`, `autoprefixer`, `postcss` - ✅ Install: `@tailwindcss/cli@next`, `@tailwindcss/vite@next` - ✅ Keep: `tailwind-merge`, `class-variance-authority`, `clsx` ### **Files** - ✅ Update: `src/index.css` - Use `@import "tailwindcss"` - ✅ Update: `vite.config.ts` - Use `@tailwindcss/vite` plugin - ✅ Delete: `postcss.config.js`, `tailwind.config.js` ### **Code Changes** - ✅ All existing Tailwind classes work the same - ✅ `tailwind-merge` still works for utility merging - ✅ Custom CSS can be added alongside Tailwind ## **Benefits of v4** - **Faster builds**: No PostCSS processing overhead - **Simpler setup**: Fewer configuration files - **Better performance**: Optimized CSS generation - **Modern architecture**: Built for current web standards ## **Troubleshooting** ### **Build Errors** ```bash # If you see PostCSS errors, ensure all PostCSS packages are removed npm ls | grep postcss # Should return nothing # Clean install if needed rm -rf node_modules package-lock.json npm install ``` ### **CSS Not Loading** ```css /* Ensure correct import in src/index.css */ @import "tailwindcss"; /* NOT these old imports */ /* @tailwind base; */ /* @tailwind components; */ /* @tailwind utilities; */ ``` ### **Vite Plugin Issues** ```typescript // Ensure correct plugin import import tailwindcss from "@tailwindcss/vite"; // Add to plugins array plugins: [react(), tailwindcss()] ``` ## **Best Practices** - **Test thoroughly**: Verify all Tailwind classes still work - **Update incrementally**: Migrate one component at a time if needed - **Monitor bundle size**: v4 should reduce overall CSS size - **Use CSS-in-CSS**: Leverage v4's CSS-based configuration for themes