Skip to content

Layouts ​

Layouts (the templates layer of Atomic Design) structure a page or a section: they place areas, exposed as slots, and draw nothing else. Colors, cards and typography belong to the components you put inside them.

Choosing a layout ​

Page typeUse caseComponent
Single columnArticles, blogs, forms, mobileSingleColumnLayout
Two columnDocs, dashboards, adminSidebarLayout
Split screenImage + pitch, A vs BSplitLayout
AsymmetricalPortfolios, bold campaignsSplitLayout with ratio="3:2" or "2:1"
Holy GrailApps: nav, content, extrasHolyGrailLayout
MagazineNews sites ranking storiesMagazineLayout
GridProduct lists, galleries, dashboardsGridLayout
MasonryMixed-height media feedsMasonryLayout
HeroProduct launches, signupsHeroLayout
Full screenStories, one idea per screenFullScreenLayout

What about F and Z patterns? ​

They are reading patterns, not structures: you build them with the layouts above.

  • F-pattern (pages people scan): a SingleColumnLayout whose headings, subheadings and lists put key information at the start of lines.
  • Z-pattern (landing page with one CTA): a HeroLayout, then SplitLayout rows alternating reverse so the eye moves from side to side.

Shared principles ​

Mobile first ​

Every layout starts stacked in a single column, then adds columns when there is room. Nothing is needed for mobile.

Driven by container width ​

Columns appear based on the width of the layout itself (container queries), not the screen. A layout placed in a narrow panel or a dashboard column stays stacked, even on a large screen.

ThresholdContainer width
sm640px
md768px
lg1024px
xl1280px

Demos on these pages sit in a frame that simulates a 375px (Mobile), 768px (Tablet) or 1024px (Desktop) container. The frame is scaled down on screen to fit the page, without changing the width the layouts see.

Reading order ​

DOM order follows visual order: screen reader reading and keyboard navigation stay consistent. The one documented exception is SplitLayout's reverse, which only flips the column display.

Gaps ​

Every layout accepts gap: none, sm (8px), md (16px), lg (24px) or xl (32px). The value is also exposed in CSS as --su-layout-gap, reusable in your own grids.

Nesting ​

Layouts combine: a SidebarLayout inside a HolyGrailLayout content area, a MasonryLayout inside a SplitLayout pane… Each one adapts to the space it gets.

vue
<SuHolyGrailLayout>
  <template #header>…</template>
  <template #nav>…</template>

  <SuSidebarLayout sidebar-position="end" sidebar-tag="nav" sidebar-label="On this page">
    <template #sidebar>Table of contents</template>
    Article
  </SuSidebarLayout>
</SuHolyGrailLayout>

Publié sous licence MIT.