Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Ctrl k
Search...
Sign up
Once UI Handbook
Beginner Guides
What is Once UI?
Install & config
Page skeleton
Your first page
Build And Launch
How to launch a portfolio site that actually gets you hired
How to build a documentation site with MDX and Next.js
How to ship a landing page and dashboard with authentication in Next.js
How to launch a social app with Next.js and Supabase
Vibe Coding
Introduction to vibe coding
Set up your local dev environment
Essential tools for vibe coding
Build your first Once UI app
Common Patterns
Hero section
Static panel
Form layout
Highlighted card
Responsive stacking
Decoration layers
Dialog & modal
Toast & feedback
Tables & lists
Loading states
App shell navigation
Dashboard & charts
Chat & messaging
Auth & verification
Settings & split panels
Data filters & toolbar
Command palette
Pricing & plans
Accordion & FAQ
Media & uploads
Empty & error states
SEO, Open Graph, and structured data
Documentation code blocks with live preview
Carousels, galleries, and before/after comparisons
Date pickers and scheduling
Context menus and dropdown actions
Tags, chips, and multi-value inputs
Roadmap & kanban
Form inputs & controls
Progress, status & badges
Scrolling & feeds
Profile, avatars & identity
Social proof & logo clouds
Masonry & media grids
Table pagination, search & bulk selection
Banners & announcements
Footer layouts
Onboarding & first run
Waitlist & coming soon
Design Tips
Color & surfaces
Harness overview
Row, Column & Grid
Spacing & rhythm
Icons & buttons
Reveal & motion
Theme tokens, FOUC-free init, and runtime style controls
Tooltips and hover cards
Block updates
Block updates changelog
Agent Resources
Column, not Flex
Semantics over CSS
Typography scale
Common gotchas
Block anchors
Validate generated code
Pro block registry
Match task bundles
TrademarkTrademark
Once UIDocumentationBlog
© Once UI. All rights reserved.
Built with Aveiro

App shell navigation

Sticky headers, MegaMenu, Kbar command palette, and Pro block app chrome.
Updated 19d ago
Loading states
Dashboard & charts
7 min · Pattern
Production apps need sticky headers, mega menus, and command palettes. Once UI ships Pro blocks and navigation modules that compose into a full app shell.

What an app shell is

An app shell is the persistent chrome around your content:
  • Sticky header with logo, nav, and user menu
  • Optional sidebar for section navigation
  • Command palette (⌘K) for power users
  • Mobile menu fallback when horizontal space runs out
Marketing pages use page skeleton patterns. App shells use navigation modules and Pro blocks.

Building blocks

Piece
Module
Role
Sticky headerRow as headerposition sticky, top 0, zIndex 2
Mega menuMegaMenuDropdown nav with grouped links
Command paletteKbarSearchable shortcuts (⌘K)
Mobile navMobileMegaMenuFull-screen menu on small screens
User menuUserMenuAvatar, account links, sign out
SidebarSidebar1–Sidebar5Section or channel navigation
Reference implementation: packages/core/ai/examples/blocks/Header1.tsx

Header anatomy

A production header is a sticky Row with three zones: logo, center nav, and actions.
<Row
  as="header"
  fillWidth
  minHeight="56"
  vertical="center"
  horizontal="between"
  paddingX="m"
  background="page"
  borderBottom="neutral-medium"
  position="sticky"
  top="0"
  zIndex={2}
>
  <Row gap="4" vertical="center">
  </Row>
  <Row gap="8" vertical="center">
    <Button size="s" variant="tertiary">Search</Button>
  </Row>
</Row>
Wire the left zone to Logo + NavIcon, the center to MegaMenu, and the right to Kbar + UserMenu. See Header1 for the full composition. Three responsive rules:
  • NavIcon — hidden on desktop, visible on mobile (hide s={{ hide: false }})
  • MegaMenu — hidden on mobile (m={{ hide: true }})
  • Kbar — hidden on mobile, shown from tablet up (m={{ hide: true }})

MegaMenu data shape

Each top-level item can have dropdown sections:
const nav = [
  {
    id: "products",
    label: "Products",
    suffixIcon: "chevronDown",
    sections: [
      {
        title: "Featured",
        links: [
          {
            label: "Analytics",
            href: "/analytics",
            icon: "chart",
            description: "Get insights into your data",
          },
        ],
      },
    ],
  },
  { id: "pricing", label: "Pricing", href: "/pricing" },
];
Use usePathname() to highlight the active route. Pass pathname to MegaMenu so the current page gets active styling.

Command palette (Kbar)

Kbar items are plain objects — no JSX:
Wrap the trigger in Kbar and pass items. On Mac, show ⌘ in the trigger; on Windows, Ctrl.

Sidebar + header composition

For dashboard-style apps, compose blocks instead of building from scratch:
Layout
Blocks
DashboardHeader1 + Sidebar1 + content
ChatSidebar4 + Feed3 + Sidebar5
SettingsSidebar2 + form content
Install Pro blocks via the CLI (see Pro block registry):

Agent note

The harness maps app-shell tasks in examples/blocks/manifest.json under byTask:
  • dashboard → Header1, Sidebar1, Dashboard1
  • chat → Sidebar4, Sidebar5, Chat1
  • settings → Sidebar2
Load the block manifest after resolving the task bundle — don't invent header markup from memory.

Related

→ Page skeleton → Responsive stacking → Match task bundles
const kbar = [
  {
    id: "dashboard",
    name: "Dashboard",
    icon: "home",
    section: "Navigation",
    keywords: "dashboard home overview",
    href: "/dashboard",
    shortcut: ["meta", "d"],
  },
];
npx once-ui add Header1 Sidebar1 Dashboard1