AppTopBar
AppTop bar wrapper passed into AppShell's header slot. The logo slot anchors the left side while children (GlobalSearch, UserMenu, Button, etc.) are arranged in a flex row. Named regions `start` (after the logo) and `end` (pushed to the far end) take a node or ordered `{ id, node, order, hidden }` items, for controls other modules contribute.
<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 aria-label="Notifications">🔔</Button>
<Button variant="ghost" size="sm" iconOnly aria-label="Settings">⚙️</Button>
<UserMenu user={currentUser} />
</div>
</AppTopBar>Acme
<AppTopBar logo={<span className="font-black text-primary text-lg">Acme</span>}>
<div className="ml-auto flex items-center gap-2">
<Button variant="primary" size="sm">Upgrade</Button>
<UserMenu user={currentUser} />
</div>
</AppTopBar>Acme
Production
// Contributed controls arrive as ordered items; hidden ones are left out.
<AppTopBar
logo={<Logo />}
start={<EnvironmentBadge />}
end={[
{ id: 'notifications', order: 10, node: <NotificationBell /> },
{ id: 'calls', order: 20, node: <PresenceToggle />, hidden: !telephonyEnabled },
{ id: 'user', order: 100, node: <UserMenu user={currentUser} /> },
]}
/>