Skip to content

Now in the official shadcn registry directory.

Start free
Back to gallery
developer tools

Tailwind CSS

The utility-first framework explaining itself in its own grammar — high contrast, demo-scoped accent, its own type scale. Marketing and design system as a single artifact.

tailwindcss.comAdded 2026-06-23
Tailwind CSS - Desktop

Editorial disclaimer

Editorial note

This entry documents observable design-language patterns for educational transfer and AI-agent briefing. Screenshots and trademarks are property of their respective owners. AI2 Design is not affiliated with or endorsed by the featured brand. Inspiration here is about language and rhythm - do not reproduce brand identity, logo, product copy, or proprietary features.

Fair Use & Gallery Policy
FreePrompt kit

Copy the full design language into your agent

A typed, paste-ready design system brief - philosophy, tokens, rules, techniques, and fitness checks. Drop it into Claude, Cursor, v0 or any coding agent and it builds in Tailwind CSS’s language, not just a screenshot.

Paste into your agent. No signup, no cost.
Utility-first discipline rendered as a page. A pure black-on-white reading layer (#000000 text on #ffffff ground) does nearly all the surface work; Inter Variable carries prose and IBM Plex Mono carries code, stepped through a tight size ladder (13/14/16px body → 24/30/40px headings) with negative tracking on display (-2px at 40px). Structure is delivered through 1px solid hairlines and inset 1px ring shadows rather than drop shadows. Color is withheld from the chrome and spent only inside demo/gradient tiles. Motion is a single cubic-bezier(0.4, 0, 0.2, 1) curve at 0.15s. Restraint over decoration; a visible spacing rhythm over magic numbers.
Main prompt
Use this capture as a design language transfer brief for my project. Adopt the high-contrast monochrome reading layer (near-black foreground on white ground, color reserved for demo/code tiles only), the type system (Inter Variable for prose + IBM Plex Mono for code, with the stepped 13/14/16/24/30/40px size ladder and negative tracking on large headings), a visible multiplicative spacing rhythm anchored on 8/16/32px, border-first elevation (1px solid hairlines and inset 1px ring shadows before any drop shadow), the cubic-bezier(0.4, 0, 0.2, 1) motion curve at 0.15s, and lazy-by-default images across every page and component I ship. Treat this as my project's constitution — any new component should pass as if crafted in the same studio. Apply the language, not the source brand's specific copy or identity. When I ask you to build a page or component, enforce these rules by default and flag any decision that deviates.
Layout
Grid
Content width
Bounded
Framing
Flat
Grid strength
Strong

Near-monochrome by design. The only two high-confidence colors in the extraction are pure #000000 text (the dominant reading layer, ~427 occurrences) and #ffffff background (~102). There is no extracted accent swatch — Tailwind withholds color from the chrome entirely and spends it only inside demo and code tiles. Accent saturation (a sky/cyan family) was observed only inside gradient expressions, never as a standalone surface token, so this brief treats accent as demo-scoped, not chrome-scoped.

Mode strategylight-first
  • Pure #000000 text on #ffffff ground is the reading layer — maximum contrast, hierarchy carried by size and weight, not by color.
  • Backgrounds stay #ffffff (light-first); the page does not paint mood into the chrome.
  • Accent color (sky/cyan family) appears only inside demo/code/gradient tiles — keep saturation out of navigation, body text, and structural surfaces. Surface area effectively a few percent.
  • Borders and dividers use a single near-black hairline at 1px — no tinted strokes.
  • Do not invent an accent hex for chrome: the extraction surfaced none. If you need a system accent, derive it from the demo tiles and keep it scoped there.

Gradients (paste-ready)

radial-gradient(rgba(0, 0, 0, 0.05) 1px, rgba(0, 0, 0, 0) 0px)
linear-gradient(to right, oklab(0.6698 -0.583 0.195) 0%, oklab(0.707 -0.236 -0.459) 100%)
linear-gradient(to right, oklab(0.495 0.798 0.023) 0%, oklab(0.864 0.061 0.784) 100%)
  • Primary family: Inter Variable (self-hosted, preloaded, weight range 100–900, font-display: swap). Code/monospace: IBM Plex Mono (Regular/Medium/SemiBold, self-hosted).
  • Size ladder (observable): body 16px, UI/small 13–14px, code 13px mono; headings 24px, 30px, and 40px display.
  • Weight usage: 400 (reading + code) / 500 (UI labels, medium headings) / 600 (emphasis, semibold). Stay on this ladder — do not reach for 300 or 800 in the chrome.
  • Display tracking is negative: -2px on the 40px heading (the tightest captured); body and small sizes ride 'normal' tracking. Large type binds, small type breathes.
  • Line-height is a steady 24px on body/small/code (≈1.5 at 16px, looser at 13–14px); the 40px heading sits tight at 40px line-height (1.0); 30px heading at 36px (1.2).
  • Mono is for code, kbd, and tabular contexts only — IBM Plex Mono at 12–13px, line-height 16–24px. Never set prose in mono.
  • No italic for emphasis in the chrome — shift weight (400→500→600) instead. Italic reserved for editorial/quoted content.
  • 4px base unit with a multiplicative scale. Captured values: 2 / 4 / 6 / 8 / 10 / 12 / 16 / 20 / 24 / 28 / 32 / 36px — 8, 16 and 32 dominate (the visible Tailwind rhythm).
  • Padding clusters on 8px (most frequent), 16px, and 32px; gaps cluster on 8 / 16 / 24px (with a 44px grid gutter for wide feature rows).
  • Container max-widths observed: 320 / 512 / 576 / 768px for bounded content rails, up to ~1920px for full-bleed sections. Prefer a bounded reading rail; reserve the wide tier for hero/demo bands.
  • Section vertical rhythm draws from the larger steps (32 / 36px and multiples) — do not introduce magic numbers off the ladder.
  • The small steps (2 / 6 / 10 / 12px) exist for optical correction inside dense controls and code tiles — keep them; snapping everything to multiples of 8 alone coarsens the result.
Surface styleFlat
  • Primary elevation is an inset 1px ring shadow — the dominant captured shadow (shadow-xs, ~188 occurrences) is `0 0 0 1px inset` at ~10% black. Reach for this before any drop shadow.
  • Drop shadows, where present, are minimal: `0 1px 3px rgba(0,0,0,0.1), 0 1px 2px -1px rgba(0,0,0,0.1)` (the shadow-sm/xl tier). No blooms, no halos.
  • Structure is carried by 1px solid hairlines (border-width 1px ~104×, solid style ~8000×) — borders do most of the depth work, not stacked shadow.
  • Layering reads through border + background contrast (white surface on white ground delimited by a hairline), not through shadow stacking.

Techniques

Inset 1px ring as surface delimiter

Cards and inputs default to an inset 1px ring shadow — `box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1)` — which reads as a crisp hairline edge without occupying layout space. This is the page's most common elevation primitive; use it before drop shadow.

Hairline divider grid

Sections are delimited by 1px solid near-black borders rather than spacing alone, producing a visible structural grid. Solid only — dashed appears just a handful of times (≈4 occurrences) for intentional accent, never as the default divider.

Radii4 / 8 / 12 / 16 / 32Icon treatmentLinearIcon setsHeroicons, Lucide, Phosphor
  • Radius scale (observable): 4 / 8 / 12 / 16 / 32px. 8px is by far the most common (~36×), 16px next (~21×); 4px for tight chips, 32px for large feature cards.
  • Buttons and inputs default to 8px; cards 12–16px; large demo/feature tiles 16–32px. Pills (`rounded-full`) reserved for badges and avatars only.
  • Icons are stroke-based at ~1.5px weight (Heroicons outline being the native pairing); no filled or duotone variants in the chrome.
  • Borders default to 1px solid; reserve dashed strictly for intentional placeholder/empty-state accents.
  • button-primary
    backgroundColor
    #000000
    textColor
    #ffffff
    radius
    8px
    padding
    8px 16px
    border
    1px solid transparent
    boxShadow
    none
    fontWeight
    500
    fontSize
    14px
    lineHeight
    24px

    Tailwind

    inline-flex items-center gap-2 rounded-lg bg-black px-4 py-2 text-sm font-medium text-white transition-colors duration-150 ease-[cubic-bezier(0.4,0,0.2,1)] hover:bg-black/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black focus-visible:ring-offset-2
  • button-secondary
    backgroundColor
    #ffffff
    textColor
    #000000
    radius
    8px
    padding
    8px 16px
    border
    none
    boxShadow
    inset 0 0 0 1px rgba(0,0,0,0.1)
    fontWeight
    500
    fontSize
    14px
    lineHeight
    24px

    Tailwind

    inline-flex items-center gap-2 rounded-lg bg-white px-4 py-2 text-sm font-medium text-black shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)] transition-colors duration-150 ease-[cubic-bezier(0.4,0,0.2,1)] hover:shadow-[inset_0_0_0_1px_rgba(0,0,0,0.2)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black focus-visible:ring-offset-2
  • card-surface
    backgroundColor
    #ffffff
    textColor
    #000000
    radius
    12px
    padding
    24px
    border
    none
    boxShadow
    inset 0 0 0 1px rgba(0,0,0,0.1)

    Tailwind

    rounded-xl bg-white p-6 text-black shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)] transition-shadow duration-150 ease-[cubic-bezier(0.4,0,0.2,1)] hover:shadow-sm
  • input-field
    backgroundColor
    #ffffff
    textColor
    #000000
    radius
    8px
    padding
    8px 12px
    border
    none
    boxShadow
    inset 0 0 0 1px rgba(0,0,0,0.1)
    fontWeight
    400
    fontSize
    14px
    lineHeight
    24px

    Tailwind

    w-full rounded-lg bg-white px-3 py-2 text-sm leading-6 text-black shadow-[inset_0_0_0_1px_rgba(0,0,0,0.1)] placeholder:text-black/40 transition-shadow duration-150 ease-[cubic-bezier(0.4,0,0.2,1)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-black
  • code-tile
    backgroundColor
    #000000
    textColor
    #ffffff
    radius
    12px
    padding
    16px 24px
    fontFamily
    IBM Plex Mono
    fontWeight
    400
    fontSize
    13px
    lineHeight
    24px

    Tailwind

    rounded-xl bg-black px-6 py-4 font-mono text-[13px] leading-6 text-white [font-feature-settings:'liga'_0] overflow-x-auto
LevelsubtleDurations0.15s / 0.3s / 0.35s / 1s

Easings

cubic-bezier(0.4, 0, 0.2, 1)cubic-bezier(0, 0, 0.2, 1)cubic-bezier(0.4, 0, 1, 1)
Hovercolor / background-color / border-color shift (0.15s on cubic-bezier(0.4, 0, 0.2, 1)), opacity fade (0.15s on cubic-bezier(0.4, 0, 0.2, 1)), transform / scale on demo tiles (0.3s on cubic-bezier(0.4, 0, 0.2, 1))

Scroll patterns

  • Intersection-triggered reveals via Framer Motion (window.MotionIsMounted observed) at ~0.3s
  • Longer property transitions (0.35s) reserved for occasional radius / font-size / color demo morphs
  • No parallax; depth stays flat and structural
  • Primary easing: cubic-bezier(0.4, 0, 0.2, 1) — the standard ease-in-out, anchoring ~246 of the captured transitions. This single curve is the motion signature.
  • Dominant duration is 0.15s (~236 occurrences) for state changes; 0.3s (~7) for transform/reveal; 0.35s (~4) for occasional property morphs; 1s reserved for the lone `ping` loader.
  • Supporting easings cubic-bezier(0, 0, 0.2, 1) (ease-out) and cubic-bezier(0.4, 0, 1, 1) (ease-in) appear once each — for entrance/exit asymmetry only, not as general-purpose curves.
  • Framer Motion is present (window.MotionIsMounted) — use `whileInView` with `viewport={{ once: true }}` for reveals, constants only.
  • useReducedMotion mandatory: animations collapse to opacity-only or disable.
  • No springs in the chrome — deterministic cubic-bezier only. Spring is reserved (if ever) for playful demo tiles, not navigation or layout.
  • Tabs/segmented controls for switching code-sample views and responsive previews — the page teaches through side-by-side states, not toggles.
  • Hover reveals on demo tiles surface the underlying utility classes; the interaction is pedagogical, not decorative.
  • Tooltips on hover + focus for utility-name hints; dismiss instantly on blur.
  • Sticky nav at z-index 10 (observed) keeps primary navigation pinned; modals reserved for z-index 50 (rare).
  • Form validation inline below field on blur; never color-only signaling on a monochrome surface — pair with text.
  • Empty/placeholder states use a 1px dashed hairline accent (the only sanctioned dashed usage) plus a one-line caption.
  • Loading uses the `ping` animation (1s) or a skeleton; no full-page overlays.
Approachdesktop-first

Desktop-first because the audience is developers reading code samples on wide displays, and the page leans on multi-column demo grids that reflow down. Breakpoints are the literal Tailwind ladder (40rem / 48rem / 64rem etc.), so the framework's own responsive prefixes (sm:/md:/lg:) are the page's responsive grammar. Mobile adapts the same language — the demo tiles stack, the type ladder steps down — without a separate architecture.

  • Breakpoints (observable): sm 640 / md 768 / lg 1024 / xl 1280 / 2xl 1536 — the standard Tailwind ladder; media queries captured at 40rem / 48rem / 64rem.
  • Container rails step through 320 / 512 / 576 / 768px for bounded content; full-bleed bands extend toward ~1920px.
  • Demo grids reflow from multi-column to single-column at md; the type ladder steps down (40 → 30 → 24px headings) but never disappears.
  • Respect (hover: hover) and (max-width: 40rem) queries observed — pointer-only hover affordances must have a non-hover fallback on touch.
  • Tap targets minimum 44×44 on touch.
  • Contrast is the page's strongest a11y asset: #000000 on #ffffff = 21:1 (AAA). Do not erode it — keep body text at or near full black on white.
  • focus-visible: a 2px ring (`ring-2 ring-black ring-offset-2`) on every interactive element; on a monochrome surface, a visible focus ring is non-negotiable.
  • Never signal state with color alone — on a near-monochrome palette, pair any accent with text, icon, or weight change.
  • All interactive elements reachable via Tab in logical reading order; sticky nav must not trap focus.
  • ARIA labels on icon-only controls; aria-expanded on collapsible code/demo regions; aria-live='polite' on async status.
  • Motion respects prefers-reduced-motion — the 0.15s/0.3s transitions reduce to opacity-only or disable.
  • Decorative demo/gradient tiles get empty alt (alt=''); meaningful diagrams get descriptive alt.
  • Tap targets minimum 44×44 on touch; never rely on hover to expose actions (honor the captured (hover: hover) query).
Framer MotionNext/ImageHeroicons

Framer Motion is directly observable (window.MotionIsMounted). Images are served through a Next.js image pipeline (/_next/image with srcset + w/q params) and lazy-load by default — 35 of the captured images use loading='lazy', only the hero/above-fold tiles load eager. Icons are stroke-based outline (Heroicons being the native Tailwind pairing).

  • Framer Motion `whileInView` with `viewport={{ once: true }}` for reveals; ease `[0.4, 0, 0.2, 1]` and duration `0.15` (or 0.3) as constants only.
  • useReducedMotion guard wraps every animation primitive — no exceptions.
  • Next/Image with `sizes` always set and srcset for 1x/2x; `priority` only on above-fold hero tiles, lazy for everything below.
  • Self-host fonts (Inter Variable + IBM Plex Mono) with font-display: swap and preload — matches the captured /_next/static/media woff2 strategy.
  • No canvas, no WebGL, no Lottie observed — static-first, animation-discreet.
  • Keep the reading layer monochrome — near-black text on white, hierarchy from size and weight, color spent only inside demo/code tiles.
  • Reach for a 1px solid hairline or an inset 1px ring shadow before any drop shadow.
  • Anchor spacing on the visible 8 / 16 / 32px rhythm, keeping the small 2/4/6/10/12px steps for optical correction.
  • Pair Inter Variable (prose) with IBM Plex Mono (code) and stay on the 400/500/600 weight ladder.
  • Apply negative tracking on large display type (≈-2px at 40px); let small text ride normal tracking.
  • Default interactive transitions to cubic-bezier(0.4, 0, 0.2, 1) at 0.15s; pass every page through useReducedMotion.
  • Lazy-load every below-fold image; reserve eager/priority for the hero tiles only.
  • Never invent an accent hex for the chrome — the extraction surfaced only #000000 and #ffffff. Keep any accent scoped to demo/code tiles, where the source actually uses it.
  • Never let color carry meaning alone on this monochrome surface — always pair it with text, icon, or weight.
  • Never coarsen the spacing scale to 8-only — the small 2/4/6/10/12px steps are part of the rhythm.
  • Never substitute a drop-shadow bloom for the inset 1px ring elevation — that erases the hairline character.
  • Never set prose in IBM Plex Mono — mono is for code, kbd, and tabular numerics only.
  • Never introduce a second display family — Inter Variable + IBM Plex Mono is the boundary.
  • Never invent durations or easings outside the captured set {0.15, 0.3, 0.35, 1}s and {cubic-bezier(0.4,0,0.2,1), cubic-bezier(0,0,0.2,1), cubic-bezier(0.4,0,1,1)}.
  • Tailwind v4 @theme inline only — no runtime style concatenation, no CSS-in-JS.
  • Color: monochrome chrome (#000000 text / #ffffff ground); accent strictly demo-scoped — no extracted chrome accent exists.
  • Spacing scale: 2 / 4 / 6 / 8 / 10 / 12 / 16 / 20 / 24 / 28 / 32 / 36px; 8/16/32 dominant.
  • Container rails: 320 / 512 / 576 / 768px bounded, up to ~1920px full-bleed.
  • Typography: Inter Variable + IBM Plex Mono; weight ladder 400 / 500 / 600; size ladder 13/14/16/24/30/40px; -2px tracking at 40px.
  • Radius scale: 4 / 8 / 12 / 16 / 32px (8 dominant).
  • Elevation: 1px solid hairline + inset 1px ring shadow first; drop shadows minimal (≤ 0.1 opacity, ≤ 3px blur).
  • Motion: durations {0.15, 0.3, 0.35, 1}s, easings {cubic-bezier(0.4,0,0.2,1) primary, cubic-bezier(0,0,0.2,1), cubic-bezier(0.4,0,1,1)}. No springs in chrome.
  • Color audit: chrome surfaces use only #000000 / #ffffff (or their alpha variants); no accent hex leaks into navigation, body, or structural surfaces.
  • Contrast audit: body text on background reads ≥ 4.5:1 (the source achieves 21:1 black-on-white).
  • Spacing grep: no padding/gap/margin values outside the 2/4/6/8/10/12/16/20/24/28/32/36 ladder.
  • Font audit: Inter Variable for prose, IBM Plex Mono for code; only weights 400/500/600 appear; prose is never set in mono.
  • Tracking audit: large display type (≈40px) carries negative tracking near -2px; small text rides normal.
  • Radius grep: corner radii draw from {4, 8, 12, 16, 32}; buttons/inputs default to 8.
  • Shadow audit: every elevation uses a 1px solid hairline or inset 1px ring first; drop shadows ≤ 0.1 opacity and ≤ 3px blur.
  • Transition grep: timing-function values draw from {cubic-bezier(0.4,0,0.2,1), cubic-bezier(0,0,0.2,1), cubic-bezier(0.4,0,1,1)}; durations from {0.15s, 0.3s, 0.35s, 1s}; 0.15s carries most state changes.
  • Image audit: loading='lazy' on every below-fold image; priority only on hero/above-fold tiles.
  • Container audit: bounded content stays within the 320/512/576/768px rails; only hero/demo bands approach full-bleed.

Design tokens

Observed token system

Color, type, spacing, gradients, and stacking order captured from the live page and rendered here as living, paste-ready previews.

Inspector

Observable layers

Structure, breakpoints, motion, fonts, and images captured from the live page and kept paste-ready alongside the tokens.

Depth-first walk of the meaningful sections. 7 nodes across 7 levels, shallow to deep by color.

  • body1
    • div1
      • div1
        • div1
          • div (×2)1
            • div1
              • Section

Accessibility

Contrast matrix

2 combinations - 2 pass AA - 2 pass AAA. Each pair is previewed with its real foreground on background; APCA Lc sits alongside the WCAG 2.1 ratio for draft WCAG 3 awareness.

Normal text passes AAALarge text passes AAA
fg
#000000
bg
#FFFFFF
APCA Lc
+106
Use
foreground on background
Normal text passes AAALarge text passes AAA
fg
#FFFFFF
bg
#000000
APCA Lc
-108
Use
background on foreground

Images

Image strategy

Observable image posture - total count, lazy-loading ratio, and format mix. The hero image is measured above the fold.

Total images
30
Lazy loaded
35%
Format mix
  • png27 · 63%
  • unknown15 · 35%
  • jpg1 · 2%

Hero image

https://tailwindcss.com/_next/static/media/cover.0g8-x6e87bh6a.png
Format
PNG
Dimensions
384x384
Loading
auto
srcset
no
Industry
developer-tools
Theme
Light
Added
2026-06-23

FAQ

Questions people ask about Tailwind CSS

3questions

Answers are pulled from the curator verdict and design brief - the same text your AI agent sees when it paste-reads this page.

Compare this with