Tailwind CSS Component Patterns
Status: Production Ready ✅
Last Updated: 2026-01-14
Tailwind Compatibility: v3.x and v4.x
Source: Production projects, shadcn/ui patterns
Quick Start
Essential Patterns
tsx
// Section Container
<section className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-16 sm:py-24">
{/* content */}
</section>
// Card Base
<div className="bg-card text-card-foreground rounded-lg border border-border p-6">
{/* content */}
</div>
// Button Primary
<button className="bg-primary text-primary-foreground px-4 py-2 rounded-md hover:bg-primary/90 transition-colors">
Click me
</button>
// Responsive Grid
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{/* items */}
</div>
Spacing Scale
Consistent spacing prevents design drift:
| Usage | Classes | Output |
|---|
| Tight spacing | | 0.5rem (8px) |
| Standard spacing | | 1rem (16px) |
| Comfortable | | 1.5rem (24px) |
| Loose | | 2rem (32px) |
| Section spacing | | 4rem/6rem (64px/96px) |
Standard Pattern: Use increments of 4 (4, 6, 8, 12, 16, 24)
Responsive Breakpoints
Mobile-first approach (base styles = mobile, add larger breakpoints):
| Breakpoint | Min Width | Pattern | Example |
|---|
| Base | 0px | No prefix | |
| sm | 640px | | |
| md | 768px | | |
| lg | 1024px | | |
| xl | 1280px | | |
| 2xl | 1536px | | |
tsx
// Mobile: 1 column, Tablet: 2 columns, Desktop: 3 columns
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
Container Patterns
Standard Page Container
tsx
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* content */}
</div>
Variations:
- - Narrow content (blog posts)
- - Medium content
- - Wide content
- - Full width (default)
Section Spacing
tsx
<section className="py-16 sm:py-24">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
{/* content */}
</div>
</section>
Card Patterns
Basic Card
tsx
<div className="bg-card text-card-foreground rounded-lg border border-border p-6">
<h3 className="text-lg font-semibold mb-2">Card Title</h3>
<p className="text-muted-foreground">Card description goes here.</p>
</div>
Feature Card with Icon
tsx
<div className="bg-card text-card-foreground rounded-lg border border-border p-6 hover:shadow-lg transition-shadow">
<div className="h-12 w-12 rounded-lg bg-primary/10 flex items-center justify-center mb-4">
{/* Icon */}
</div>
<h3 className="text-lg font-semibold mb-2">Feature Title</h3>
<p className="text-muted-foreground">Feature description.</p>
</div>
Pricing Card
tsx
<div className="bg-card text-card-foreground rounded-lg border-2 border-border p-8 relative">
<div className="text-sm font-semibold text-primary mb-2">Pro Plan</div>
<div className="text-4xl font-bold mb-1">$29<span className="text-lg text-muted-foreground">/mo</span></div>
<p className="text-muted-foreground mb-6">For growing teams</p>
<button className="w-full bg-primary text-primary-foreground py-2 rounded-md hover:bg-primary/90">
Get Started
</button>
</div>
See
references/card-patterns.md
for more variants.
Grid Layouts
Auto-Responsive Grid
tsx
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
{items.map(item => <Card key={item.id} {...item} />)}
</div>
Auto-Fit Grid (Dynamic Columns)
tsx
<div className="grid grid-cols-[repeat(auto-fit,minmax(280px,1fr))] gap-6">
{/* Automatically adjusts columns based on available space */}
</div>
Masonry-Style Grid
tsx
<div className="columns-1 md:columns-2 lg:columns-3 gap-6 space-y-6">
{items.map(item => (
<div key={item.id} className="break-inside-avoid">
<Card {...item} />
</div>
))}
</div>
Button Patterns
tsx
// Primary
<button className="bg-primary text-primary-foreground px-4 py-2 rounded-md hover:bg-primary/90 transition-colors">
Primary
</button>
// Secondary
<button className="bg-secondary text-secondary-foreground px-4 py-2 rounded-md hover:bg-secondary/80">
Secondary
</button>
// Outline
<button className="border border-border bg-transparent px-4 py-2 rounded-md hover:bg-accent">
Outline
</button>
// Ghost
<button className="bg-transparent px-4 py-2 rounded-md hover:bg-accent hover:text-accent-foreground">
Ghost
</button>
// Destructive
<button className="bg-destructive text-destructive-foreground px-4 py-2 rounded-md hover:bg-destructive/90">
Delete
</button>
Size Variants:
See
references/button-patterns.md
for full reference.
Form Patterns
Input Field
tsx
<div className="space-y-2">
<label htmlFor="email" className="text-sm font-medium">
Email
</label>
<input
id="email"
type="email"
className="w-full px-3 py-2 bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary"
placeholder="you@example.com"
/>
</div>
Select Dropdown
tsx
<select className="w-full px-3 py-2 bg-background border border-border rounded-md focus:outline-none focus:ring-2 focus:ring-primary">
<option>Option 1</option>
<option>Option 2</option>
</select>
Checkbox
tsx
<div className="flex items-center space-x-2">
<input
id="terms"
type="checkbox"
className="h-4 w-4 rounded border-border text-primary focus:ring-2 focus:ring-primary"
/>
<label htmlFor="terms" className="text-sm">
I agree to the terms
</label>
</div>
Error State
tsx
<div className="space-y-2">
<label htmlFor="password" className="text-sm font-medium">
Password
</label>
<input
id="password"
type="password"
className="w-full px-3 py-2 bg-background border border-destructive rounded-md focus:outline-none focus:ring-2 focus:ring-destructive"
/>
<p className="text-sm text-destructive">Password must be at least 8 characters</p>
</div>
See
references/form-patterns.md
for complete patterns.
Typography Patterns
Headings
tsx
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-bold">
Page Title
</h1>
<h2 className="text-3xl sm:text-4xl font-bold">
Section Title
</h2>
<h3 className="text-2xl sm:text-3xl font-semibold">
Subsection
</h3>
<h4 className="text-xl font-semibold">
Card Title
</h4>
Body Text
tsx
<p className="text-base text-muted-foreground">
Regular paragraph text.
</p>
<p className="text-lg text-muted-foreground leading-relaxed">
Larger body text with comfortable line height.
</p>
<p className="text-sm text-muted-foreground">
Small supporting text or captions.
</p>
Lists
tsx
<ul className="space-y-2 text-muted-foreground">
<li className="flex items-start">
<CheckIcon className="h-5 w-5 text-primary mr-2 mt-0.5" />
<span>Feature one</span>
</li>
<li className="flex items-start">
<CheckIcon className="h-5 w-5 text-primary mr-2 mt-0.5" />
<span>Feature two</span>
</li>
</ul>
See
references/typography-patterns.md
for complete guide.
Navigation Patterns
Header with Logo
tsx
<header className="sticky top-0 z-50 w-full border-b border-border bg-background/95 backdrop-blur">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex h-16 items-center justify-between">
<div className="flex items-center gap-8">
{/* Logo */}
<a href="/" className="font-bold text-xl">Brand</a>
{/* Desktop Nav */}
<nav className="hidden md:flex gap-6">
<a href="#" className="text-sm hover:text-primary transition-colors">Features</a>
<a href="#" className="text-sm hover:text-primary transition-colors">Pricing</a>
<a href="#" className="text-sm hover:text-primary transition-colors">About</a>
</nav>
</div>
{/* CTA */}
<button className="bg-primary text-primary-foreground px-4 py-2 rounded-md text-sm">
Sign Up
</button>
</div>
</div>
</header>
Footer
tsx
<footer className="border-t border-border bg-muted/50">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div className="grid grid-cols-2 md:grid-cols-4 gap-8">
<div>
<h4 className="font-semibold mb-4">Product</h4>
<ul className="space-y-2 text-sm text-muted-foreground">
<li><a href="#" className="hover:text-primary">Features</a></li>
<li><a href="#" className="hover:text-primary">Pricing</a></li>
</ul>
</div>
{/* More columns */}
</div>
</div>
</footer>
See
references/navigation-patterns.md
for mobile menus and dropdowns.
Dark Mode Support
All patterns use semantic color tokens that automatically adapt:
| Token | Light Mode | Dark Mode |
|---|
| White | Dark gray |
| Dark gray | White |
| White | Slightly lighter gray |
| Gray | Light gray |
| Light gray | Dark gray |
| Brand color | Lighter brand color |
Never use raw colors like
- always use semantic tokens.
See
references/dark-mode-patterns.md
for theme toggle implementation.
Common Class Combinations
Section with Heading
tsx
<section className="py-16 sm:py-24">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<h2 className="text-3xl sm:text-4xl font-bold text-center mb-12">
Section Title
</h2>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* content */}
</div>
</div>
</section>
Centered Content
tsx
<div className="flex flex-col items-center justify-center text-center">
<h1 className="text-4xl font-bold mb-4">Centered Title</h1>
<p className="text-muted-foreground max-w-2xl">Centered description</p>
</div>
Hover Effects
tsx
// Lift on hover
<div className="transition-transform hover:scale-105">
// Shadow on hover
<div className="transition-shadow hover:shadow-lg">
// Color change on hover
<button className="transition-colors hover:bg-primary/90">
Critical Rules
✅ Always Do
- Use semantic color tokens (, )
- Apply mobile-first responsive design ()
- Use consistent spacing scale (4, 6, 8, 12, 16, 24)
- Add classes for smooth interactions
- Test in both light and dark modes
❌ Never Do
- Use raw Tailwind colors ( breaks themes)
- Skip responsive prefixes (mobile users suffer)
- Mix spacing scales randomly (creates visual chaos)
- Forget hover states on interactive elements
- Use fixed px values for text ( not )
Template Components
Ready-to-use components in
:
- hero-section.tsx - Responsive hero with CTA
- feature-grid.tsx - 3-column feature grid with icons
- contact-form.tsx - Full form with validation styles
- footer.tsx - Multi-column footer with links
Copy and customize for your project.
Reference Documentation
Resume Matcher Design System (Swiss International Style)
This project uses Swiss International Style (Brutalist) design. For project-specific patterns:
- style-guide.md - Core Swiss style rules, colors, typography
- design-system.md - Extended spacing, shadows, tokens
- swiss-design-system-prompt.md - AI prompt for generating Swiss-style UI
Key Swiss Style Overrides:
tsx
// NO rounded corners - use rounded-none
<button className="rounded-none border-2 border-black">
// Hard shadows instead of soft
<div className="shadow-[4px_4px_0px_0px_#000000]">
// Hover: translate into shadow space
<button className="hover:translate-y-[1px] hover:translate-x-[1px] hover:shadow-none">
Swiss Color Palette:
| Color | Hex | Usage |
|---|
| Canvas | | Background |
| Ink | | Text, borders |
| Hyper Blue | | Primary actions |
| Signal Green | | Success |
| Alert Orange | | Warning |
| Alert Red | | Danger |
Official Documentation
Last Updated: 2026-01-14
Skill Version: 1.0.0
Production: Tested across 10+ projects