AppShell
AppFull-screen layout wrapper with logo, sidebar and topbar slots. Sidebar renders as an aside on desktop and opens via a drawer on mobile.
const [sidebarCollapsed, setSidebarCollapsed] = useState(false);
<AppShell
logo={<span className="font-black text-primary">Acme</span>}
compactLogo={<span className="font-black text-primary">A</span>}
sidebarCollapsed={sidebarCollapsed}
sidebar={
<AppSidebar
navGroups={navGroups}
activeId={activeId}
onSelect={setActiveId}
collapsed={sidebarCollapsed}
onCollapsedChange={setSidebarCollapsed}
searchable
footer={<Avatar name="Jane Doe" size="sm" status="online" />}
/>
}
topbar={
<AppTopBar>
<GlobalSearch onSearch={handleSearch} onSelect={handleSelect} className="flex-1 max-w-sm hidden sm:block" />
<div className="ml-auto flex items-center gap-1">
<Button variant="ghost" size="sm" iconOnly>🔔</Button>
<UserMenu user={currentUser} />
</div>
</AppTopBar>
}
>
{/* page content */}
</AppShell>Acme
<AppShell
topbar={
<AppTopBar logo={<span className="font-bold text-primary">Acme</span>}>
<div className="ml-auto flex items-center gap-2">
<Button variant="primary" size="sm">New project</Button>
<UserMenu user={currentUser} />
</div>
</AppTopBar>
}
>
{/* page content */}
</AppShell>