| name | tailwindcss |
| description | Tailwind CSS v4 utility-first styling patterns including responsive design, dark mode, and custom configuration. Use when styling with Tailwind, adding utility classes, configuring Tailwind, setting up dark mode, or customizing the theme. |
Tailwind CSS v4 Development Guidelines
Best practices for using Tailwind CSS v4 utility classes effectively.
Note: Tailwind CSS v4 (released January 2025) uses a CSS-first configuration approach. If you need v3 compatibility, tailwind.config.js is still supported.
Core Principles
- Utility-First: Use utility classes instead of custom CSS
- Mobile-First: Design for mobile, then scale up with responsive modifiers
- Component Extraction: Extract repeated patterns into components
- Consistent Spacing: Use Tailwind's spacing scale
- Custom Configuration: Extend the default theme for brand consistency
Basic Utilities
Layout
<div className="flex items-center justify-between gap-4">
<div className="flex-1">Content</div>
<div className="flex-shrink-0">Sidebar</div>
</div>
<div className="grid grid-cols-3 gap-4">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<div className="relative">
<div className="absolute top-0 right-0">Badge</div>
</div>
Spacing
<div className="p-4 m-2"> {}
<div className="px-6 py-4"> {}
<div className="mt-8 mb-4"> {}
<div className="space-y-4"> {}
<div>Item 1</div>
<div>Item 2</div>
</div>
Typography
<h1 className="text-4xl font-bold text-gray-900">Heading</h1>
<p className="text-base font-normal text-gray-600 leading-relaxed">
Paragraph text with comfortable line height.
</p>
<span className="text-sm font-medium text-blue-600">Label</span>
Colors
<p className="text-gray-900 dark:text-gray-100">Text</p>
<div className="bg-blue-500 hover:bg-blue-600">Button</div>
<div className="border border-gray-300">Box</div>
Responsive Design
Breakpoints
<div className="w-full md:w-1/2 lg:w-1/3">
{}
</div>
<h1 className="text-2xl md:text-4xl lg:text-6xl">
{/* Responsive text sizes */}
</h1>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
{/* Responsive grid */}
</div>
Component Patterns
Button
<button className="px-4 py-2 bg-blue-600 text-white font-medium rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors">
Click me
</button>
Card
<div className="bg-white rounded-lg shadow-md overflow-hidden">
<img src="/image.jpg" alt="" className="w-full h-48 object-cover" />
<div className="p-6">
<h2 className="text-xl font-semibold mb-2">Card Title</h2>
<p className="text-gray-600">Card content goes here.</p>
</div>
</div>
Form Input
<div className="space-y-2">
<label htmlFor="email" className="block text-sm font-medium text-gray-700">
Email
</label>
<input
type="email"
id="email"
className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent"
placeholder="you@example.com"
/>
</div>
State Variants
<button className="bg-blue-500 hover:bg-blue-600 active:bg-blue-700 focus:ring-2 focus:ring-blue-500">
Interactive Button
</button>
<div className="group">
<img src="/image.jpg" className="group-hover:opacity-75 transition-opacity" />
<p className="group-hover:text-blue-600">Hover the container</p>
</div>
<button className="disabled:opacity-50 disabled:cursor-not-allowed" disabled>
Disabled Button
</button>
Dark Mode
@import "tailwindcss";
@media (prefers-color-scheme: dark) {
}
<div className="bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100">
<h1 className="text-gray-900 dark:text-white">Title</h1>
<p className="text-gray-600 dark:text-gray-400">Description</p>
</div>
Tailwind v4: CSS-First Configuration
@import "tailwindcss";
@theme {
--color-brand-50: #eff6ff;
--color-brand-100: #dbeafe;
--color-brand-900: #1e3a8a;
--spacing-128: 32rem;
--font-family-sans: 'Inter', sans-serif;
--breakpoint-3xl: 1920px;
}
Best Practices
- Use Consistent Spacing: Stick to Tailwind's spacing scale
- Responsive by Default: Always consider mobile-first design
- Extract Components: Avoid repeating long class lists
- Use Theme Colors: Define custom colors in config, not arbitrary values
- Leverage @apply Sparingly: Prefer utility classes in JSX
- Enable Dark Mode: Plan for dark mode from the start