Layout

Breakpoints, grid patterns, and responsive conventions. Fluid tokens are covered in Spacing.

Breakpoints

Standard Tailwind v4 breakpoints — no custom values. Mobile-first: styles apply from the breakpoint upward.

Breakpoints

Tailwind v4 defaults. Resize the window to see the active breakpoint.

base

Mobile

active

sm

Large phone

≥ 640px

md

Tablet

≥ 768px

lg

Laptop

≥ 1024px

xl

Desktop

≥ 1280px

2xl

Large desktop

≥ 1536px

Grid patterns

Two layout modes. Web blocks use a centered container with responsive column counts. App blocks use a sidebar + content split with the sidebar collapsing to a Sheet on mobile.

Web blocks

Centered container, responsive columns: 1 → 2 → 3

max-w-6xl centered
col
col
col
1 col mobile

App blocks

Sidebar + content area, sidebar hidden on mobile

sidebar
header
card
card
sidebar hidden mobilevisible md+

Responsive component sizing

Components with size props (Button, etc.) don't support responsive values. Use the dual render pattern: render both sizes, toggle visibility with breakpoint utilities.

Responsive button sizing

Dual render pattern — two elements, one hidden per breakpoint. No fragile className overrides.

Three tiers based on context:

sm

tight spaces

md

mobile default

lg

desktop hero/CTA

Pattern:

<Button size="md" className="sm:hidden">
  Get started <ArrowRight />
</Button>
<Button size="lg" className="hidden sm:inline-flex">
  Get started <ArrowRight />
</Button>

Aspect ratios

Placeholder is a ratio-locked primitive for media slots — hero visuals, blog thumbnails, team avatars, feature illustrations. Six presets, all pinned to the same baseline so the proportions are easy to compare. variant="dashed" reads as an empty / drop-zone state.

Placeholder ratios

Same height, width derived from the aspect ratio.

square1 / 1
portrait2 / 3
landscape3 / 2
classic4 / 3
video16 / 9
wide21 / 9

All conventions

Responsive conventions

allButton (app)size="sm" — toolbars, card footers, headers
base → smButton (web)size="md"
sm+Button (web)size="lg"
baseGrid (web)1 column
sm+Grid (web)2 columns
lg+Grid (web)3 columns
baseSidebar (app)Hidden (Sheet)
md+Sidebar (app)Visible
baseTabsListFull width, flex-1 triggers
sm+TabsListw-fit, hug content