Class defines role, attribute defines variant
Use layout classes for structural roles such as section, container, grid, stack and cluster. Use data attributes on those same elements to select padding, width, columns, gap or alignment variants.
Primitive layout tokens define the raw responsive references for the layout system: viewport range, breakpoints, site padding limits and container limits. Semantic layout tokens and layout classes should consume these values instead of hardcoding local measurements.
Reference viewport limits used when calculating responsive layout values.
--fluid-viewport-min20rem320px--fluid-viewport-max120rem1920pxViewport thresholds that define major layout changes.
--breakpoint-medium64rem1024px--breakpoint-small48rem768pxMinimum and maximum horizontal page padding before semantic fluid padding is calculated.
--site-padding-inline-minvar(--size-16)1rem / 16px--site-padding-inline-maxvar(--size-40)2.5rem / 40pxRaw max-width boundaries used by semantic container tokens.
--container-main-maxvar(--fluid-viewport-max)120rem / 1920px--container-small-max50rem800pxSemantic layout variables translate primitive viewport, padding and container values into reusable layout contracts. They are value contracts consumed by layout classes and data attributes, not the final public API by themselves.
Semantic page padding used by layout classes and page-level composition.
--site-padding-inlineclamp(var(--site-padding-inline-min), 0.5714rem + 2.1429vw, var(--site-padding-inline-max))16-40pxSemantic container width contracts consumed by layout container classes.
--container-mainmin(calc(100% - 2 * var(--site-padding-inline)), var(--container-main-max))Available width minus page padding up to 1920px--container-smallmin(calc(100% - 2 * var(--site-padding-inline)), var(--container-small-max))Available width up to 800px--container-full100%100%Semantic grid values for page composition and responsive column systems.
--site-grid-columns12 / 8 / 412 desktop, 8 tablet, 4 mobile--site-grid-column-gapclamp(var(--size-16), 0.9286rem + 0.3571vw, var(--size-20))16-20px--site-grid-column-widthcalc((var(--container-main) - var(--site-grid-column-gap) * (var(--site-grid-columns) - 1)) / var(--site-grid-columns))Calculated from container width, column count and grid gap--grid-auto-min-small14rem224px--grid-auto-min-card18rem288px--grid-auto-min-panel24rem384px--grid-auto-min-wide32rem512px--grid-breakout-edge-trackmax(0rem, calc((100vw - var(--container-main)) / 2 - var(--site-grid-column-gap)))Calculated edge tracks around the content gridThe grid system defines site composition, explicit columns, auto-fit wrapping and breakout layouts. Use .l-grid as the structural class, then select the grid behavior with data attributes.
The site grid uses responsive 12/8/4 columns. Breakout grids add edge tracks before and after the content columns for full-width media or composition.
Grid-specific attributes control grid mode, explicit columns, auto-fit minimum widths, gaps and child column spans.
.l-griddata-gridsite, columns, auto-fit, breakoutsite--site-grid-columns, --site-grid-column-gap, --grid-auto-min, --grid-breakout-edge-track.l-griddata-columnssite, 1, 2, 3, 4, 6, 12site--site-grid-columns.l-griddata-minsmall, card, panel, widecard--grid-auto-min-small, --grid-auto-min-card, --grid-auto-min-panel, --grid-auto-min-wide.l-griddata-gapsite, none, tiny, small, regular, medium, large, xlargesite--site-grid-column-gap, --gap-*.l-grid > *data-grid-span1-12, full, content, start, endautogrid-columnCopyable patterns for the three most important grid modes: site composition, auto-fit card grids and breakout grids.
<div class="l-grid" data-grid="site" data-gap="site">
<article data-grid-span="4">...</article>
<article data-grid-span="4">...</article>
<article data-grid-span="4">...</article>
</div><div class="l-grid" data-grid="auto-fit" data-min="card" data-gap="medium">
<article>...</article>
<article>...</article>
<article>...</article>
</div><section class="l-section" data-padding="large">
<div class="l-grid" data-grid="breakout">
<div data-grid-span="content">Content aligned to the site grid.</div>
<figure data-grid-span="full">Media can break out into edge tracks.</figure>
</div>
</section>Layout style classes are the public role-based interface for page composition. Classes define what a layout object is; attributes define its variant.
Base layout primitives for sections, containers, grids and grouped child flows.
.l-sectionblockwidth: 100%; padding-block: var(--section-padding-medium)--section-padding-medium.l-containerblockwidth: var(--container-main); margin-inline: auto--container-main.l-gridgridgrid-template-columns: repeat(var(--site-grid-columns), minmax(0, 1fr)); gap: var(--site-grid-column-gap)--site-grid-columns, --site-grid-column-gap.l-stackgridgap: var(--gap-regular)--gap-regular.l-clusterflexflex-wrap: wrap; align-items: center; gap: var(--gap-regular)--gap-regularLayout attributes are the variant API for layout primitives. Use them to change section padding, container width, grid columns, gaps and alignment without creating additional utility classes.
Variant controls for public layout classes. The class defines the role; the attribute defines the selected layout behavior.
.l-sectiondata-paddingnone, small, medium, large, hero-topmedium--section-padding-small, --section-padding-medium, --section-padding-large, --section-padding-hero-top.l-containerdata-containermain, small, fullmain--container-main, --container-small, --container-full.l-stackdata-gapnone, tiny, small, regular, medium, large, xlargeregular--gap-*.l-stackdata-alignstart, center, end, stretchstretchalign-items.l-clusterdata-gapnone, tiny, small, regular, medium, large, xlargeregular--gap-*.l-clusterdata-alignstart, center, end, stretchcenteralign-items.l-clusterdata-justifystart, center, end, betweenstartjustify-contentAgentic layout rules describe how AI should compose sections, containers, grids and child-flow groups using classes, attributes and semantic layout variables.
Operational rules for class-and-attribute layout composition.
Use layout classes for structural roles such as section, container, grid, stack and cluster. Use data attributes on those same elements to select padding, width, columns, gap or alignment variants.
Major page blocks should start with .l-section. Put .l-container inside it when content needs the main, small or full width contract. Do not replace this with one-off wrapper classes.
Use .l-grid when children need site composition, explicit columns, auto-fit wrapping or breakout behavior. If the only need is vertical rhythm, use .l-stack instead.
First choose data-grid as site, columns, auto-fit or breakout. Then add data-columns, data-min, data-gap or child data-grid-span only when that mode needs it. Do not use data-columns as the grid mode.
Use .l-stack for vertical groups of related children. Control the distance between children with data-gap instead of margins on individual children.
Use .l-cluster for action rows, metadata, filters and small inline groups that should wrap. Control wrapping distance with data-gap and alignment with data-align or data-justify.
Keep one-off component layout inside the component. Promote a local layout decision into global layout classes or attributes only when the same structural pattern repeats across sections or components.
Copyable markup patterns that show where classes and data attributes belong in semantic layout structure.
<section class="l-section" data-padding="large">
<div class="l-container" data-container="main">
<div class="l-stack" data-gap="medium">
<h2 class="heading-h2">System-first websites</h2>
<p class="body-large">Reusable structure, controlled values and clear AI-readable contracts.</p>
</div>
</div>
</section><section class="l-section" data-padding="medium">
<div class="l-container" data-container="main">
<div class="l-grid" data-grid="site" data-gap="site">
<article class="feature-card">...</article>
<article class="feature-card">...</article>
<article class="feature-card">...</article>
</div>
</div>
</section><div class="l-stack" data-gap="regular">
<h3 class="heading-h4">Design system audit</h3>
<p class="body-regular">Use stack for vertical rhythm and cluster for wrapped inline actions.</p>
<div class="l-cluster" data-gap="small" data-align="center" data-justify="start">
<a class="button" href="/design-system">Open docs</a>
<a class="button" href="/design-system/layout">View layout</a>
</div>
</div>