Layout

Flexbox, Grid, and Container utilities using semantic attributes

Overview

Shift CSS uses semantic attribute selectors for structural layout patterns. This creates a declarative API where attributes define the “skeleton” of your UI.

  • Structural layout → Attribute selectors (s-flex, s-grid, s-container)
  • Atomic utilities → Classes with s- prefix (.s-flex-1, .s-w-full)

Flexbox

Basic Flex Container

<div s-flex>Flex container</div>
<div s-flex="row">Horizontal (explicit)</div>
<div s-flex="col">Vertical stack</div>

Direction Variants

AttributeDescription
s-flexBasic flex container
s-flex="row"Horizontal (default)
s-flex="col"Vertical stack
s-flex="row-reverse"Horizontal reversed
s-flex="col-reverse"Vertical reversed

Common Patterns

<!-- Center everything -->
<div s-flex="center">Perfectly centered</div>

<!-- Space between with vertical centering -->
<div s-flex="between">
  <span>Left</span>
  <span>Right</span>
</div>

<!-- End-aligned -->
<div s-flex="end">
  <button>Action</button>
</div>

<!-- Vertical stack -->
<div s-flex="stack">
  <div>Item 1</div>
  <div>Item 2</div>
</div>

Flex Wrap

Use space-separated values to add wrap:

<div s-flex="row wrap">Wrapping flex row</div>
<div s-flex="col nowrap">Non-wrapping column</div>

Alignment Modifiers

Combine with alignment attributes for fine control:

<div s-flex s-justify="between" s-items="center">
  <span>Left</span>
  <span>Right</span>
</div>

Justify Content:

AttributeCSS Value
s-justify="start"flex-start
s-justify="end"flex-end
s-justify="center"center
s-justify="between"space-between
s-justify="around"space-around
s-justify="evenly"space-evenly

Align Items:

AttributeCSS Value
s-items="start"flex-start
s-items="end"flex-end
s-items="center"center
s-items="baseline"baseline
s-items="stretch"stretch

Flex Item Classes

For child element sizing, use atomic classes:

<div s-flex>
  <div class="s-flex-1">Grow equally</div>
  <div class="s-flex-1">Grow equally</div>
</div>

<div s-flex>
  <div class="s-flex-none">Fixed size</div>
  <div class="s-flex-auto">Grow and shrink</div>
</div>

<div s-flex>
  <div class="s-grow">Grow to fill</div>
  <div class="s-shrink-0">Don't shrink</div>
</div>
ClassCSS Value
.s-flex-1flex: 1 1 0%
.s-flex-autoflex: 1 1 auto
.s-flex-initialflex: 0 1 auto
.s-flex-noneflex: none
.s-growflex-grow: 1
.s-grow-0flex-grow: 0
.s-shrinkflex-shrink: 1
.s-shrink-0flex-shrink: 0

Self Alignment

<div s-flex="row">
  <div class="s-self-start">Top</div>
  <div class="s-self-center">Center</div>
  <div class="s-self-end">Bottom</div>
</div>

CSS Grid

Basic Grid

<div s-grid>Basic grid</div>
<div s-grid="3">3 equal columns</div>

Column Variants

AttributeDescription
s-gridBasic grid container
s-grid="1"1 column
s-grid="2"2 columns
s-grid="3"3 columns
s-grid="4"4 columns
s-grid="5"5 columns
s-grid="6"6 columns
s-grid="12"12 columns
s-grid="auto-fit"Responsive auto-fit
s-grid="auto-fill"Responsive auto-fill

Responsive Grid

The auto-fit variant creates a responsive grid without media queries:

<div s-grid="auto-fit" s-gap="md">
  <article s-card>Card 1</article>
  <article s-card>Card 2</article>
  <article s-card>Card 3</article>
</div>

Grid Rows

<div s-grid="2" s-grid-rows="3">
  <!-- 2 columns × 3 rows -->
</div>

Column & Row Span

<div s-grid="6">
  <div s-col-span="2">Spans 2 columns</div>
  <div s-col-span="4">Spans 4 columns</div>
  <div s-col-span="full">Full width</div>
</div>

<div s-grid="3" s-grid-rows="3">
  <div s-row-span="2">Spans 2 rows</div>
  <div s-row-span="full">Full height</div>
</div>

Gap (Spacing)

Semantic Gap (Designer’s Tool)

For consistent, design-system-aligned spacing:

<div s-flex s-gap="md">Consistent medium gap</div>
<div s-grid="3" s-gap="lg">Comfortable grid spacing</div>
AttributeValueUse Case
s-gap1remDefault (same as md)
s-gap="xs"0.25remExtra tight
s-gap="sm"0.5remCompact
s-gap="md"1remStandard
s-gap="lg"1.5remComfortable
s-gap="xl"2remSpacious
s-gap="none"0No gap

Atomic Gap (Developer’s Screwdriver)

For precise pixel-level control, use gap classes:

<div s-flex class="s-gap-4">Exact 1rem gap</div>
<div s-grid="3" class="s-gap-x-4 s-gap-y-2">Different row/column gaps</div>

Container

Basic Container

<div s-container>
  Centered with max-width and padding
</div>

Size Variants

AttributeMax Width
s-container80rem (1280px)
s-container="sm"40rem (640px)
s-container="md"48rem (768px)
s-container="lg"64rem (1024px)
s-container="xl"80rem (1280px)
s-container="full"100%
s-container="prose"65ch

Custom Container Width

:root {
  --s-container-max: 1400px;
}

Position

<div s-position="relative">
  <div s-position="absolute" s-inset="0">Overlay</div>
</div>

<header s-position="sticky">Sticky header</header>
<div s-position="fixed">Fixed element</div>

Display

For non-flex/grid display modes:

<span s-display="block">Block element</span>
<div s-display="inline">Inline element</div>
<div s-display="inline-block">Inline block</div>
<div s-display="contents">Contents (removes wrapper)</div>
<div s-display="inline-flex">Inline flex</div>
<div s-display="inline-grid">Inline grid</div>

Sizing Classes

Width

<div class="s-w-full">100% width</div>
<div class="s-w-screen">100vw width</div>
<div class="s-w-min">min-content</div>
<div class="s-w-max">max-content</div>
<div class="s-w-fit">fit-content</div>
<div class="s-w-auto">auto</div>

Height

<div class="s-h-full">100% height</div>
<div class="s-h-screen">100vh height</div>
<div class="s-h-screen-dvh">100dvh (dynamic viewport)</div>
<div class="s-h-min">min-content</div>
<div class="s-h-max">max-content</div>
<div class="s-h-fit">fit-content</div>

Min/Max Width

<div class="s-min-w-0">min-width: 0</div>
<div class="s-min-w-full">min-width: 100%</div>
<div class="s-max-w-md">max-width: 28rem</div>
<div class="s-max-w-prose">max-width: 65ch</div>

Aspect Ratio

<div class="s-aspect-square">1:1</div>
<div class="s-aspect-video">16:9</div>
<div class="s-aspect-4-3">4:3</div>

Z-Index

<div class="s-z-10">z-index: 10</div>
<div class="s-z-50">z-index: 50</div>
<div class="s-z-auto">z-index: auto</div>

Common Patterns

Centered Content

<div s-flex="center" class="s-min-h-screen">
  Perfectly centered
</div>
<div s-flex>
  <aside class="s-flex-none s-w-64">Sidebar</aside>
  <main class="s-flex-1">Main content</main>
</div>

Card Grid

<div s-grid="auto-fit" s-gap="md">
  <article s-card>Card 1</article>
  <article s-card>Card 2</article>
  <article s-card>Card 3</article>
</div>

Holy Grail Layout

<div s-flex="col" class="s-min-h-screen">
  <header class="s-flex-none">Header</header>
  <main class="s-flex-1">Content</main>
  <footer class="s-flex-none">Footer</footer>
</div>
<nav s-flex="between" s-gap="md" class="s-px-4 s-py-2">
  <a href="/">Logo</a>
  <div s-flex s-gap="sm">
    <a href="/about">About</a>
    <a href="/contact">Contact</a>
  </div>
</nav>
Search