---
name: tailwind-css
description: |
Use when styling UI components or layouts with Tailwind CSS - mobile-first design, responsive utilities, custom themes, or component styling.
NOT when plain CSS, CSS-in-JS (styled-components), or non-Tailwind frameworks are involved.
Triggers: "style component", "responsive design", "mobile-first", "dark theme", "tailwind classes", "dashboard grid".
---
# Tailwind CSS Skill
## Overview
Expert guidance for Tailwind CSS styling with mobile-first responsive design, custom themes, and utility-first approach. Focuses on accessibility, dark mode, and performance optimization.
## When This Skill Applies
This skill triggers when users request:
- **Styling**: "Style this KPI card", "Button component style", "Design a form"
- **Responsive**: "Mobile-first layout", "Responsive dashboard", "Grid with breakpoints"
- **Themes**: "Custom dark theme", "Extend tailwind theme", "Color scheme"
- **Layouts**: "Dashboard grid", "Card layout", "Flexible container"
## Core Rules
### 1. Mobile-First Design
```jsx
// ✅ GOOD: Mobile-first progressive enhancement
// Breakpoints:
// sm: 640px - Small tablets/phones
// md: 768px - Tablets
// lg: 1024px - Desktops
// xl: 1280px - Large screens
// 2xl: 1536px - Extra large screens
```
**Requirements:**
- Base styles for mobile (no prefix)
- Progressive enhancement with `sm:`, `md:`, `lg:` prefixes
- Start with mobile layout, enhance for larger screens
- Use responsive breakpoints: `sm:640px`, `md:768px`, `lg:1024px`
### 2. Responsive Utilities
```jsx
// ✅ GOOD: Fluid responsive layouts
{items.map(item => )}
// ✅ GOOD: Responsive spacing
Content
// ✅ GOOD: Container queries (if needed)
Nested responsive content
```
**Requirements:**
- Use fluid utilities (`w-full`, `flex-1`) for mobile
- Add breakpoints (`sm:`, `md:`, `lg:`) for larger screens
- Consider container queries for nested responsive components
- Test layouts at multiple breakpoints (375px, 768px, 1024px, 1440px)
### 3. Custom Themes
```typescript
// tailwind.config.ts
export default {
darkMode: 'class', // or 'media'
content: ['./src/**/*.{ts,tsx}'],
theme: {
extend: {
colors: {
primary: {
50: '#eff6ff',
100: '#dbeafe',
500: '#3b82f6',
900: '#1e3a8a',
},
erp: {
'card': '#ffffff',
'card-dark': '#1f2937',
},
},
spacing: {
'18': '4.5rem',
'88': '22rem',
},
fontFamily: {
sans: ['Inter', 'sans-serif'],
},
},
},
plugins: [],
};
```
**Requirements:**
- Extend theme in `tailwind.config.ts`, don't override
- Use semantic names (`primary`, `secondary`, `accent`)
- Define custom colors, fonts, spacing in theme
- Support CSS variables for dynamic theming
- Use `darkMode: 'class'` for manual dark mode toggle
### 4. Component Styling
```jsx
// ✅ GOOD: Utility-first approach
export const Button = ({ variant, size, children }) => (
);
// ✅ GOOD: CVA or class-variance-authority for variants
import { cva } from 'class-variance-authority';
const buttonVariants = cva(
'font-semibold rounded-lg transition-colors',
{
variants: {
variant: {
primary: 'bg-blue-500 text-white hover:bg-blue-600',
secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300',
},
size: {
sm: 'px-3 py-1 text-sm',
md: 'px-4 py-2',
},
},
}
);
```
**Requirements:**
- Prefer inline utility classes over custom CSS
- Use `@apply` sparingly (only for repeated patterns)
- Extract complex variants with CVA or similar libraries
- Follow shadcn/ui patterns for consistent styling
- Use template literals for conditional classes
## Output Requirements
### Code Files
1. **Component Styling**:
- Inline utility classes in JSX/TSX
- Conditional classes for variants (dark/light, sizes)
- Focus states and transitions
2. **Configuration**:
- `tailwind.config.ts` updates for custom themes
- `globals.css` for global styles and directives
3. **Dark Mode Support**:
```jsx
Content with dark mode
```
### Integration Requirements
- **shadcn/ui**: Follow shadcn design tokens and patterns
- **Accessibility**: WCAG 2.1 AA compliant colors, focus-visible states
- **Performance**: Enable JIT mode, purge unused classes
- **i18n**: Support RTL layouts when needed
### Documentation
- **PHR**: Create Prompt History Record for styling decisions
- **ADR**: Document theme decisions (color schemes, breakpoints)
- **Comments**: Document non-obvious utility combinations
## Workflow
1. **Analyze Layout Requirements**
- Identify mobile breakpoints
- Determine responsive needs
- Check dark mode requirements
2. **Apply Mobile-First Styles**
- Base styles without breakpoints
- Progressive enhancement for larger screens
- Test on mobile viewport (375px)
3. **Add Responsive Breakpoints**
- `sm:` for tablets (640px)
- `md:` for tablets (768px)
- `lg:` for desktops (1024px)
- Test at each breakpoint
4. **Apply Dark Mode**
- Add `dark:` variants for colors/backgrounds
- Test in both light and dark modes
- Ensure contrast ratios in both modes
5. **Validate Accessibility**
- Check color contrast ratios (4.5:1 minimum)
- Add focus-visible states for interactive elements
- Ensure touch targets are 44px+ on mobile
## Quality Checklist
Before completing any styling:
- [ ] **No Horizontal Scroll Mobile**: Layout fits 375px without horizontal scroll
- [ ] **Touch Targets**: All interactive elements 44px+ on mobile
- [ ] **Dark/Light Variants**: Dark mode support with `dark:` classes
- [ ] **Utility-First**: Minimal custom CSS, use Tailwind utilities
- [ ] **Purge Unused**: No unused utility classes in production
- [ ] **Focus States**: `focus-visible` or `focus:ring` on all interactive elements
- [ ] **Contrast Ratios**: WCAG 2.1 AA compliant colors (4.5:1 for text)
- [ ] **Responsive Breakpoints**: Tested at sm/md/lg breakpoints
- [ ] **Consistent Spacing**: Use Tailwind's spacing scale (0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64)
- [ ] **Transitions**: Add `transition-*` classes for smooth state changes
## Common Patterns
### KPI Card (Mobile-First)
```jsx
export const KPICard = ({ title, value, trend, loading }) => (
{loading ? (
) : (
<>
{title}
{value}
{trend && (
0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'}
`}>
{trend > 0 ? '↑' : '↓'} {Math.abs(trend)}%
)}
>
)}
);
```
### Responsive Dashboard Grid
```jsx
export const DashboardGrid = ({ children }) => (
{children}
);
```
### Form with Responsive Layout
```jsx
export const ResponsiveForm = () => (
);
```
### Dark Mode Toggle Button
```jsx
export const DarkModeToggle = ({ isDark, onToggle }) => (
);
```
## Tailwind Configuration Best Practices
### Breakpoint Strategy
```typescript
// Recommended breakpoint configuration
screens: {
'xs': '475px', // Extra small phones
'sm': '640px', // Small tablets/phones
'md': '768px', // Tablets
'lg': '1024px', // Desktops
'xl': '1280px', // Large screens
'2xl': '1536px', // Extra large screens
}
```
### Color System
```typescript
// Semantic color naming
colors: {
primary: { 50: '...', 500: '...', 900: '...' },
success: { 50: '...', 500: '...', 900: '...' },
warning: { 50: '...', 500: '...', 900: '...' },
error: { 50: '...', 500: '...', 900: '...' },
}
```
### Spacing Scale
```typescript
// Use Tailwind's scale: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64, 72, 80, 96
// 1 = 0.25rem (4px), 4 = 1rem (16px), 8 = 2rem (32px)
spacing: {
'128': '32rem',
'144': '36rem',
}
```
## Accessibility Guidelines
- **Color Contrast**: Minimum 4.5:1 for text, 3:1 for large text
- **Focus States**: Always include `focus:ring-2` or `focus-visible`
- **Touch Targets**: Minimum 44x44px for mobile interactive elements
- **Skip Links**: Add `sr-only` skip links for keyboard users
- **ARIA Labels**: Use `aria-label` for icon-only buttons
## Performance Optimization
1. **JIT Mode**: Enabled by default in Tailwind CSS 3+
2. **Purge Unused**: Only used classes in production
3. **CSS Minification**: Tailwind CLI or PostCSS optimization
4. **Inline Critical CSS**: Extract critical CSS for above-fold content
5. **Lazy Load Components**: Code split heavy components
## References
- Tailwind CSS Documentation: https://tailwindcss.com/docs
- Tailwind UI Patterns: https://tailwindui.com
- shadcn/ui Components: https://ui.shadcn.com
- Web Content Accessibility Guidelines (WCAG 2.1): https://www.w3.org/WAI/WCAG21/quickref/