AppShell

Sticky-header + full-height side-nav + single-scroll-container layout with an animated, accessible nav toggle.

Category: layout · WCAG 2.2-AA · shell, layout, sidebar, navigation, drawer, responsive, sticky

States

Props

PropTypeDefaultDescription
headerReactNodeTop bar (typically a ShellHeader). If a React element, its onMenuClick/menuExpanded are bound to the nav toggle.
navReactNodeSide navigation (typically a SideNav). Fills full height and scrolls internally.
childrenReactNodeMain content, rendered inside the single scroll container.
footerReactNodeOptional footer pinned below the content area.
openbooleanControlled nav open/visible state. Omit for uncontrolled.
defaultOpenbooleanInitial open state when uncontrolled. Defaults open on desktop, closed on small screens.
onOpenChange(open: boolean) => voidFired when the nav requests open/close (burger, Escape, scrim).

Design tokens

When to use

When not to use

How to build an accessible AppShell in React →

Examples

Header + SideNav + content

The burger in ShellHeader toggles the SideNav automatically.

<AppShell
  header={<ShellHeader brand={{ name: 'Acme' }} />}
  nav={<SideNav items={items} />}
>
  <h1>Dashboard</h1>
</AppShell>

Controlled open

<AppShell header={header} nav={nav} open={open.value} onOpenChange={(v) => (open.value = v)}>
  …
</AppShell>

Related components

← Back to docs