AgentSkillsCN

tailwind-patterns

面向常见网站组件的生产级 Tailwind CSS 模式:响应式布局、卡片、导航、表单、按钮与排版。涵盖间距比例、断点设置、移动端优先的设计模式,以及深色模式的支持。 无论是在构建 UI 组件、打造着陆页、美化表单、实现导航功能,还是修复响应式布局问题,此技能都能助您一臂之力。

SKILL.md
--- frontmatter
name: tailwind-patterns
description: |
  Production-ready Tailwind CSS patterns for common website components: responsive layouts, cards, navigation, forms, buttons, and typography. Includes spacing scale, breakpoints, mobile-first patterns, and dark mode support.

  Use when building UI components, creating landing pages, styling forms, implementing navigation, or fixing responsive layouts.

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:

UsageClassesOutput
Tight spacinggap-2 p-2 space-y-20.5rem (8px)
Standard spacinggap-4 p-4 space-y-41rem (16px)
Comfortablegap-6 p-6 space-y-61.5rem (24px)
Loosegap-8 p-8 space-y-82rem (32px)
Section spacingpy-16 sm:py-244rem/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):

BreakpointMin WidthPatternExample
Base0pxNo prefixtext-base
sm640pxsm:sm:text-lg
md768pxmd:md:grid-cols-2
lg1024pxlg:lg:px-8
xl1280pxxl:xl:max-w-7xl
2xl1536px2xl:2xl:text-6xl
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="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">{/* content */}</div>

Variations:

  • max-w-4xl - Narrow content (blog posts)
  • max-w-5xl - Medium content
  • max-w-6xl - Wide content
  • max-w-7xl - Full width (default)

Section Spacing

tsx
<section className="py-16 sm:py-24">
  <div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">{/* content */}</div>
</section>

Card Patterns

Basic Card

tsx
<div className="rounded-lg border border-border bg-card p-6 text-card-foreground">
  <h3 className="mb-2 text-lg font-semibold">Card Title</h3>
  <p className="text-muted-foreground">Card description goes here.</p>
</div>

Feature Card with Icon

tsx
<div className="rounded-lg border border-border bg-card p-6 text-card-foreground transition-shadow hover:shadow-lg">
  <div className="bg-primary/10 mb-4 flex h-12 w-12 items-center justify-center rounded-lg">
    {/* Icon */}
  </div>
  <h3 className="mb-2 text-lg font-semibold">Feature Title</h3>
  <p className="text-muted-foreground">Feature description.</p>
</div>

Pricing Card

tsx
<div className="relative rounded-lg border-2 border-border bg-card p-8 text-card-foreground">
  <div className="mb-2 text-sm font-semibold text-primary">Pro Plan</div>
  <div className="mb-1 text-4xl font-bold">
    $29<span className="text-lg text-muted-foreground">/mo</span>
  </div>
  <p className="mb-6 text-muted-foreground">For growing teams</p>
  <button className="hover:bg-primary/90 w-full rounded-md bg-primary py-2 text-primary-foreground">
    Get Started
  </button>
</div>

See references/card-patterns.md for more variants.


Grid Layouts

Auto-Responsive Grid

tsx
<div className="grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-3">
  {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 gap-6 space-y-6 md:columns-2 lg:columns-3">
  {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:

  • Small: px-3 py-1.5 text-sm
  • Default: px-4 py-2
  • Large: px-6 py-3 text-lg

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 rounded-md border border-border bg-background px-3 py-2 focus:outline-none focus:ring-2 focus:ring-primary"
    placeholder="you@example.com"
  />
</div>

Select Dropdown

tsx
<select className="w-full rounded-md border border-border bg-background px-3 py-2 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 rounded-md border border-destructive bg-background px-3 py-2 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="mr-2 mt-0.5 h-5 w-5 text-primary" />
    <span>Feature one</span>
  </li>
  <li className="flex items-start">
    <CheckIcon className="mr-2 mt-0.5 h-5 w-5 text-primary" />
    <span>Feature two</span>
  </li>
</ul>

See references/typography-patterns.md for complete guide.


Navigation Patterns

Header with Logo

tsx
<header className="bg-background/95 sticky top-0 z-50 w-full border-b border-border backdrop-blur">
  <div className="mx-auto max-w-7xl 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="text-xl font-bold">
          Brand
        </a>

        {/* Desktop Nav */}
        <nav className="hidden gap-6 md:flex">
          <a href="#" className="text-sm transition-colors hover:text-primary">
            Features
          </a>
          <a href="#" className="text-sm transition-colors hover:text-primary">
            Pricing
          </a>
          <a href="#" className="text-sm transition-colors hover:text-primary">
            About
          </a>
        </nav>
      </div>

      {/* CTA */}
      <button className="rounded-md bg-primary px-4 py-2 text-sm text-primary-foreground">
        Sign Up
      </button>
    </div>
  </div>
</header>

Footer

tsx
<footer className="bg-muted/50 border-t border-border">
  <div className="mx-auto max-w-7xl px-4 py-12 sm:px-6 lg:px-8">
    <div className="grid grid-cols-2 gap-8 md:grid-cols-4">
      <div>
        <h4 className="mb-4 font-semibold">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:

TokenLight ModeDark Mode
bg-backgroundWhiteDark gray
text-foregroundDark grayWhite
bg-cardWhiteSlightly lighter gray
text-muted-foregroundGrayLight gray
border-borderLight grayDark gray
bg-primaryBrand colorLighter brand color

Never use raw colors like bg-blue-500 - 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="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
    <h2 className="mb-12 text-center text-3xl font-bold sm:text-4xl">Section Title</h2>
    <div className="grid grid-cols-1 gap-6 md:grid-cols-3">{/* content */}</div>
  </div>
</section>

Centered Content

tsx
<div className="flex flex-col items-center justify-center text-center">
  <h1 className="mb-4 text-4xl font-bold">Centered Title</h1>
  <p className="max-w-2xl text-muted-foreground">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

  1. Use semantic color tokens (bg-card, text-foreground)
  2. Apply mobile-first responsive design (base → sm: → md:)
  3. Use consistent spacing scale (4, 6, 8, 12, 16, 24)
  4. Add transition-* classes for smooth interactions
  5. Test in both light and dark modes

❌ Never Do

  1. Use raw Tailwind colors (bg-blue-500 breaks themes)
  2. Skip responsive prefixes (mobile users suffer)
  3. Mix spacing scales randomly (creates visual chaos)
  4. Forget hover states on interactive elements
  5. Use fixed px values for text (text-base not text-[16px])

Template Components

Ready-to-use components in templates/components/:

  • 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

Detailed patterns in references/ directory:

  • layout-patterns.md - Containers, grids, flexbox layouts
  • card-patterns.md - All card variants and states
  • navigation-patterns.md - Headers, menus, breadcrumbs, footers
  • form-patterns.md - Complete form styling guide
  • button-patterns.md - All button variants and sizes
  • typography-patterns.md - Text styles and hierarchies
  • dark-mode-patterns.md - Theme switching implementation

Official Documentation


Last Updated: 2026-01-14 Skill Version: 1.0.0 Production: Tested across 10+ projects