- fg
#000000- bg
#FFFFFF- APCA Lc
- +106
- Use
- foreground on background
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.

Editorial disclaimer
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 PolicyCopy 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.
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.
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.
- 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.
- 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.
- 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
Easings
cubic-bezier(0.4, 0, 0.2, 1)cubic-bezier(0, 0, 0.2, 1)cubic-bezier(0.4, 0, 1, 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.
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 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.
- 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.
- 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
3questionsAnswers 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



