Layout# Component <neo-layout> is a CSS-only Flexbox container whose attributes are CSS flex properties and whose values are CSS values: one element that covers stacks, rows, wrapping clusters, and centered boxes, with no utility classes and no build step. Per-child flex behaviour rides on namespaced neo-* attributes on any flex child. You write no media queries of your own: a row that wraps reflows on its own as its width changes, and children that grow or shrink (neo-flex-grow, neo-flex-shrink) take up or give back space. The row-to-column breakpoints it does have (collapse, neo-hide-below, neo-show-below) are CSS container queries keyed to the nearest container ancestor’s width, not the viewport, so the same markup adapts inside a sidebar, a drawer, or a full page. Everything on this page is built only from the kit with no page-specific CSS; resize the live example to simulate a narrower screen, or reshape it with the parameters.
The preview routes through the in-browser server simulator. Its current Settings (network latency, a non-200 response, or an unreachable server) are in effect, so the live preview can look like it is misbehaving. Adjust them in the Settings panel.
Projects
Overview
Activity
Reports
Filter
New
All
Active
Archived
6 of 18
Apollo
In progress
Alice Chen
Updated 2d ago
Open
Borealis
Blocked
Ben Ortiz
Updated 2d ago
Open
Cirrus
In review
Carla Mehta
Updated 2d ago
Open
Delta
Shipped
Dev Kumar
Updated 2d ago
Open
Equinox
Planning
Erin Park
Updated 2d ago
Open
Zephyr
Backlog
Zoe Lang
Updated 2d ago
Open
Helios
In progress
Hugo Diaz
Updated 2d ago
Open
Nimbus
In review
Nina Petrov
Updated 2d ago
Open
Orion
Blocked
Omar Said
Updated 2d ago
Open
Updated just now
Load more
HTML CSS
The selected state's markup and its scoped CSS. The CSS is wrapped in <style>@scope { ... }</style> and applies to the preview only. Edits change the preview above, applied live while Sync is on, or when you click Patch or Replace. Patch morphs the preview; Replace swaps it outright.
Signals
Datastar signals declared in the selected state's markup. Change a value to drive the preview, applied live while Sync is on, or when you click Patch.
<neo-layout
column
gap="md"
container
class="layout-overview-scroll"
neo-height="100%"
neo-min-height="0"
neo-min-width="0"
neo-overflow="auto"
neo-width="100%"
>
<neo-layout row align-items="center" justify-content="space-between" gap="md">
<neo-layout row align-items="center" gap="md">
<strong>Projects</strong>
<neo-layout row gap="md" neo-hide-below="md">
<a href="#">Overview</a>
<a href="#">Activity</a>
<a href="#">Reports</a>
</neo-layout>
</neo-layout>
<neo-input-group neo-flex-grow="1" neo-hide-below="sm" neo-min-width="0">
<neo-icon name="search"></neo-icon>
<neo-textinput placeholder="Search"></neo-textinput>
</neo-input-group>
<neo-layout row align-items="center" gap="sm">
<neo-layout row gap="sm" neo-hide-below="md">
<neo-button role="button" variant="ghost" tabindex="0">Filter</neo-button>
<neo-button role="button" variant="primary" tabindex="0">New</neo-button>
</neo-layout>
<neo-buttongroup
aria-label="Actions"
neo-hide-below="sm"
neo-show-below="md"
>
<neo-button aria-label="New">
<neo-icon name="plus"></neo-icon>
</neo-button>
<neo-button aria-label="Menu">
<neo-icon name="menu"></neo-icon>
</neo-button>
</neo-buttongroup>
<neo-buttongroup aria-label="Actions" neo-show-below="sm">
<neo-button aria-label="Search">
<neo-icon name="search"></neo-icon>
</neo-button>
<neo-button aria-label="New">
<neo-icon name="plus"></neo-icon>
</neo-button>
<neo-button aria-label="Menu">
<neo-icon name="menu"></neo-icon>
</neo-button>
</neo-buttongroup>
</neo-layout>
</neo-layout>
<neo-layout row align-items="center" justify-content="space-between" gap="sm">
<neo-layout row wrap gap="xs">
<neo-badge variant="outline">All</neo-badge>
<neo-badge variant="outline">Active</neo-badge>
<neo-badge variant="outline">Archived</neo-badge>
</neo-layout>
<small>6 of 18</small>
</neo-layout>
<neo-layout row wrap align-content="flex-start" gap="md">
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Apollo</strong>
<neo-badge variant="primary">In progress</neo-badge>
</neo-layout>
<small>Alice Chen</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Borealis</strong>
<neo-badge variant="danger">Blocked</neo-badge>
</neo-layout>
<small>Ben Ortiz</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Cirrus</strong>
<neo-badge variant="secondary">In review</neo-badge>
</neo-layout>
<small>Carla Mehta</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Delta</strong>
<neo-badge variant="outline">Shipped</neo-badge>
</neo-layout>
<small>Dev Kumar</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Equinox</strong>
<neo-badge variant="">Planning</neo-badge>
</neo-layout>
<small>Erin Park</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Zephyr</strong>
<neo-badge variant="">Backlog</neo-badge>
</neo-layout>
<small>Zoe Lang</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Helios</strong>
<neo-badge variant="primary">In progress</neo-badge>
</neo-layout>
<small>Hugo Diaz</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Nimbus</strong>
<neo-badge variant="secondary">In review</neo-badge>
</neo-layout>
<small>Nina Petrov</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
<neo-card class="layout-overview-card" neo-flex-grow="1">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
>
<strong>Orion</strong>
<neo-badge variant="danger">Blocked</neo-badge>
</neo-layout>
<small>Omar Said</small>
<neo-layout row align-items="center" justify-content="space-between">
<small>Updated 2d ago</small>
<neo-button role="button" variant="ghost" tabindex="0">Open</neo-button>
</neo-layout>
</neo-layout>
</div>
</neo-card>
</neo-layout>
<neo-layout row align-items="center" gap="sm">
<small>Updated just now</small>
<span neo-flex-grow="1"></span>
<neo-button role="button" variant="ghost" tabindex="0">Load more</neo-button>
</neo-layout>
</neo-layout> .layout-overview-card {
flex-basis: 16rem;
}
.layout-overview-scroll {
padding: var(--neo-space-sm);
}
<neo-layout row wrap gap="sm">
<neo-badge variant="outline">design</neo-badge>
<neo-badge variant="outline">frontend</neo-badge>
<neo-badge variant="outline">backend</neo-badge>
<neo-badge variant="outline">infra</neo-badge>
<neo-badge variant="outline">docs</neo-badge>
<neo-badge variant="outline">testing</neo-badge>
<neo-badge variant="outline">release</neo-badge>
</neo-layout> <neo-layout
row
wrap
align-content="flex-start"
gap="md"
neo-height="100%"
neo-min-height="0"
neo-min-width="0"
neo-overflow="auto"
neo-width="100%"
>
<neo-card
variant="outline"
class="layout-grid-card"
neo-flex-grow="1"
neo-min-width="0"
>
<div data-neo-card-inner><strong>Analytics</strong></div>
</neo-card>
<neo-card
variant="outline"
class="layout-grid-card"
neo-flex-grow="1"
neo-min-width="0"
>
<div data-neo-card-inner><strong>Automations</strong></div>
</neo-card>
<neo-card
variant="outline"
class="layout-grid-card"
neo-flex-grow="1"
neo-min-width="0"
>
<div data-neo-card-inner><strong>Customers</strong></div>
</neo-card>
<neo-card
variant="outline"
class="layout-grid-card"
neo-flex-grow="1"
neo-min-width="0"
>
<div data-neo-card-inner><strong>Reports</strong></div>
</neo-card>
</neo-layout> .layout-grid-card {
flex-basis: 16rem;
}
<neo-layout
row
align-items="center"
justify-content="space-between"
gap="sm"
container
neo-min-width="0"
neo-width="100%"
>
<strong>Projects</strong>
<span neo-hide-below="sm">3 active projects</span>
<span neo-show-below="sm">3 active</span>
<neo-button role="button" variant="primary" tabindex="0" neo-hide-below="sm">Create project</neo-button>
<neo-button
role="button"
variant="primary"
tabindex="0"
aria-label="Create project"
neo-show-below="sm"
>
<neo-icon name="plus"></neo-icon>
</neo-button>
</neo-layout> <neo-layout column container neo-min-width="0" neo-width="100%">
<neo-layout row gap="md" collapse="sm">
<neo-card variant="outline" neo-flex-grow="1" neo-min-width="0">
<div data-neo-card-inner><strong>Source</strong></div>
</neo-card>
<neo-card variant="outline" neo-flex-grow="1" neo-min-width="0">
<div data-neo-card-inner><strong>Build</strong></div>
</neo-card>
<neo-card variant="outline" neo-flex-grow="1" neo-min-width="0">
<div data-neo-card-inner><strong>Deploy</strong></div>
</neo-card>
</neo-layout>
</neo-layout> <neo-layout row wrap gap="lg" neo-flex-grow="1">
<neo-layout column gap="xs">
<code>flex-start</code>
<neo-layout
row
align-items="flex-start"
gap="sm"
class="layout-align-track"
>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>flex-end</code>
<neo-layout row align-items="flex-end" gap="sm" class="layout-align-track">
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>center</code>
<neo-layout row align-items="center" gap="sm" class="layout-align-track">
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>stretch</code>
<neo-layout row align-items="stretch" gap="sm" class="layout-align-track">
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>baseline</code>
<neo-layout row align-items="baseline" gap="sm" class="layout-align-track">
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
<div class="layout-align-box"></div>
</neo-layout>
</neo-layout>
</neo-layout> .layout-align-track {
height: 5rem;
padding: 0.4rem;
border: 1px dashed var(--muted);
border-radius: var(--page-radius);
}
.layout-align-box {
width: 2rem;
min-height: 2rem;
background: color-mix(in srgb, var(--accent) 15%, transparent);
border: 1px solid --accent;
border-radius: var(--page-radius);
line-height: 1.2;
white-space: nowrap;
}
<neo-layout column gap="lg" neo-flex-grow="1">
<neo-layout column gap="xs">
<code>flex-start</code>
<neo-layout
row
justify-content="flex-start"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>flex-end</code>
<neo-layout
row
justify-content="flex-end"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>center</code>
<neo-layout
row
justify-content="center"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-between</code>
<neo-layout
row
justify-content="space-between"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-around</code>
<neo-layout
row
justify-content="space-around"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-evenly</code>
<neo-layout
row
justify-content="space-evenly"
gap="sm"
class="layout-justify-track"
>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
<div class="layout-justify-box"></div>
</neo-layout>
</neo-layout>
</neo-layout> .layout-justify-track {
padding: 0.5rem;
border: 1px dashed var(--muted);
border-radius: var(--page-radius);
}
.layout-justify-box {
width: 2rem;
height: 2rem;
background: color-mix(in srgb, var(--accent) 15%, transparent);
border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
border-radius: var(--page-radius);
}
<neo-layout column wrap gap="lg" neo-flex-grow="1">
<neo-layout column gap="xs">
<code>flex-start</code>
<neo-layout
row
wrap
align-content="flex-start"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>flex-end</code>
<neo-layout
row
wrap
align-content="flex-end"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>center</code>
<neo-layout
row
wrap
align-content="center"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-between</code>
<neo-layout
row
wrap
align-content="space-between"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-around</code>
<neo-layout
row
wrap
align-content="space-around"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>space-evenly</code>
<neo-layout
row
wrap
align-content="space-evenly"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
<neo-layout column gap="xs">
<code>stretch</code>
<neo-layout
row
wrap
align-content="stretch"
gap="sm"
class="layout-align-content-track"
>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
<div class="layout-align-content-box"></div>
</neo-layout>
</neo-layout>
</neo-layout> .layout-align-content-track {
width: 100%;
height: 12rem;
padding: 0.4rem;
border: 1px dashed var(--muted);
border-radius: var(--page-radius);
}
.layout-align-content-box {
width: 2.5rem;
min-height: 2.5rem;
background: color-mix(in srgb, var(--accent) 15%, transparent);
border: 1px solid color-mix(in srgb, var(--accent) 35%, transparent);
border-radius: var(--page-radius);
}
<neo-layout
row
gap="sm"
neo-height="100%"
neo-min-height="0"
neo-min-width="0"
neo-width="100%"
>
<neo-card variant="outline" class="layout-shell-sidebar" neo-flex-shrink="0">
<div data-neo-card-inner>
<neo-layout column gap="sm">
<strong>Folders</strong>
<span>Inbox</span>
<span>Drafts</span>
</neo-layout>
</div>
</neo-card>
<neo-layout
column
gap="sm"
neo-flex-grow="1"
neo-min-height="0"
neo-min-width="0"
>
<neo-layout row align-items="center" gap="sm">
<strong neo-flex-grow="1" neo-min-width="0" neo-truncate>Quarterly planning and launch coordination</strong>
<neo-badge variant="outline" neo-flex-shrink="0">5 unread</neo-badge>
</neo-layout>
<neo-card neo-flex-grow="1" neo-min-height="0" neo-overflow="auto">
<div data-neo-card-inner>
<neo-layout column gap="md">
<strong>Launch checklist</strong>
<span>Design review notes and final assets</span>
<span>Engineering handoff and QA schedule</span>
<span>Documentation readiness review</span>
<span>Customer announcement draft</span>
<span>Post-launch monitoring plan</span>
</neo-layout>
</div>
</neo-card>
</neo-layout>
</neo-layout> .layout-shell-sidebar {
flex-basis: 8rem;
}
<neo-layout
row
align-items="center"
gap="sm"
neo-flex-grow="1"
neo-min-width="0"
>
<neo-button role="button" tabindex="0">Back</neo-button>
<strong>Page title</strong>
<span neo-flex-grow="1"></span>
<neo-button role="button" variant="primary" tabindex="0">Save</neo-button>
</neo-layout> <neo-layout row wrap column-gap="xs" row-gap="lg">
<neo-badge variant="outline">design</neo-badge>
<neo-badge variant="outline">frontend</neo-badge>
<neo-badge variant="outline">backend</neo-badge>
<neo-badge variant="outline">infra</neo-badge>
<neo-badge variant="outline">docs</neo-badge>
<neo-badge variant="outline">testing</neo-badge>
<neo-badge variant="outline">release</neo-badge>
<neo-badge variant="outline">staging</neo-badge>
</neo-layout> <neo-layout
row
wrap
align-items="center"
justify-content="center"
gap="xl"
neo-height="100%"
neo-min-height="0"
neo-min-width="0"
neo-width="100%"
>
<neo-layout column gap="sm">
<small>row-reverse</small>
<neo-layout row-reverse gap="sm">
<neo-badge variant="outline">1</neo-badge>
<neo-badge variant="outline">2</neo-badge>
<neo-badge variant="outline">3</neo-badge>
</neo-layout>
</neo-layout>
<neo-layout column gap="sm">
<small>column-reverse</small>
<neo-layout column-reverse gap="sm">
<neo-badge variant="outline">1</neo-badge>
<neo-badge variant="outline">2</neo-badge>
<neo-badge variant="outline">3</neo-badge>
</neo-layout>
</neo-layout>
</neo-layout> <p>
Status:
<neo-layout align-items="center" gap="xs" inline>
<neo-icon name="circle-check"></neo-icon>
<span>operational</span>
</neo-layout>
(all systems go).
</p> Reference# Attributes # Name Type Default Description row, row-reverse, column, column-reversebooleannone flex-direction, as a boolean attribute. Pick one; row is the default. nowrap, wrap, wrap-reversebooleannone flex-wrap, as a boolean attribute. Default nowrap. align-items"flex-start" | "flex-end" | "center" | "stretch" | "baseline"none Cross-axis alignment. Its value is the literal CSS keyword, so the attribute reads like the flex rule it emits. justify-content"flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly"none Main-axis distribution. Its value is the literal CSS keyword, so the attribute reads like the flex rule it emits. align-content"flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly" | "stretch"none Cross-axis distribution of wrapped lines; takes effect only with wrap. Its value is the literal CSS keyword, so the attribute reads like the flex rule it emits. gap"none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"none Spacing between children on both axes. column-gap and row-gap override it per axis. column-gap"none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"none Spacing between children along the row. Overrides gap on this axis. row-gap"none" | "xs" | "sm" | "md" | "lg" | "xl" | "2xl"none Spacing between wrapped lines. Overrides gap on this axis. min-height"100vh" | "100%"none Minimum-height preset. inlinebooleannone Use display: inline-flex. containerbooleannone Neo extension: make this a query container (container-type: inline-size) so a descendant's collapse reacts to this element's width. collapse"sm" | "md" | "lg"none Neo extension: fold a row to a column when the nearest container ancestor is narrower than the tier (40 / 48 / 64rem). Container-query based: reacts to the box, not the viewport.
Child attributes Namespaced neo-* attributes set on any flex child. Each is neo- plus the CSS property it sets.
Attributes # Name Type Default Description neo-flex-grow"0" | "1"none flex-grow. Set to 1 to fill; doubles as a spacer. neo-flex-shrink"0" | "1"none flex-shrink. Set to 0 to pin the size. neo-flex-basis"0" | "auto" | "100%"none flex-basis (CSS keywords only). For a fixed width set it via style (e.g. style="flex-basis: var(--neo-size-sidebar)"). neo-align-self"flex-start" | "flex-end" | "center" | "stretch" | "baseline"none Per-child align-self override. neo-width"100%"none Definite full width of the containing block. neo-height"100%"none Definite full height of the containing block. neo-min-width"0"none min-width:0, the flex min-size fix, in a row. neo-min-height"0"none min-height:0, the flex min-size fix, in a column. neo-overflow"visible" | "hidden" | "scroll" | "auto"none Overflow behaviour. neo-truncatebooleannone Neo extension: single-line ellipsis truncation. neo-hide-below"sm" | "md" | "lg"none Neo extension: hide the child while the nearest container is narrower than the tier (40 / 48 / 64rem). Container-query based. neo-show-below"sm" | "md" | "lg"none Neo extension: show the child only while the nearest container is narrower than the tier (hidden at or above it).
Examples# Composition# A whole dashboard nested several levels deep and filling the stage. The root is a container, so as you drag the corner the navbar morphs across three layouts (links → search-icon, full buttons → an icon group) via neo-hide-below / neo-show-below, the cards reflow 3 → 2 → 1, and the dashboard scrolls vertically when it overflows. All box-relative, no viewport media queries.
Projects Overview Activity Reports
Filter New
All Active Archived 6 of 18 Apollo In progress Alice Chen Updated 2d ago Open
Borealis Blocked Ben Ortiz Updated 2d ago Open
Cirrus In review Carla Mehta Updated 2d ago Open
Delta Shipped Dev Kumar Updated 2d ago Open
Equinox Planning Erin Park Updated 2d ago Open
Zephyr Backlog Zoe Lang Updated 2d ago Open
Helios In progress Hugo Diaz Updated 2d ago Open
Nimbus In review Nina Petrov Updated 2d ago Open
Orion Blocked Omar Said Updated 2d ago Open
Updated just now Load more
Wrapping cluster# A row with wrap flows its children onto new lines as the stage narrows: the "cluster" shape for tags, chips, and filters.
design frontend backend infra docs testing release
Responsive grid# Growing cards with a shared flex-basis form equal rows and wrap into fewer columns as the stage narrows. No breakpoints required.
Analytics
Automations
Customers
Reports
Responsive conditional rendering# Resize the stage below 40rem. The detailed label and text button hide, while compact replacements appear. The condition follows the nearest container, not the viewport.
Projects 3 active projects 3 active Create project
Responsive collapse# A row folds to a single column when its nearest container ancestor drops below a tier. Drag the stage under 40rem and the three panels reflow from a row into a stack via a container query, so it tracks the box, not the viewport.
align-items# Demonstrates all possible values for align-items.
flex-start
flex-end
center
stretch
baseline
justify-content# Demonstrates all possible values for justify-content.
flex-start
flex-end
center
space-between
space-around
space-evenly
align-content# Demonstrates all possible values for align-content.
flex-start
flex-end
center
space-between
space-around
space-evenly
stretch
Child attributes# Resize in both directions. The folder rail keeps its fixed basis, the main pane grows into the remaining space, its long title truncates instead of forcing the row wider, and the checklist scrolls when height runs out. Each behaviour comes from a neo-* attribute on the child that needs it.
Quarterly planning and launch coordination 5 unread Launch checklist Design review notes and final assets Engineering handoff and QA schedule Documentation readiness review Customer announcement draft Post-launch monitoring plan
Spacer# A spacer is just an empty child that grows: drop a child with neo-flex-grow="1" between two groups and it soaks up the leftover space, pinning whatever follows to the far edge. Here it keeps Save to the right while Back and the title stay on the left.
Split row and column gaps# column-gap spaces the children along the row; row-gap spaces the wrapped lines. Columns are tight (xs) and rows are loose (lg), so the chips stay close while wrapped lines get room. Narrow the stage to wrap them.
design frontend backend infra docs testing release staging
Reverse direction# row-reverse and column-reverse flip the main-axis order so the first child renders last; the DOM order (and tab order) stays intact. Both groups list 1, 2, 3 in source.
row-reverse 1 2 3 column-reverse 1 2 3
Inline flow# inline switches the container to display: inline-flex, so it sits in the text flow instead of forcing its own line, handy for an icon-and-label cluster inside running prose.
Status:
operational (all systems go).