Skip to content

App shell / scaffold

In review
Live · web
Platform
Nav
Surface
NockerlDashboard

dizyx · nockerl-design

Streaming · 2 tools running

nockerl-design · docs site

Designing the app-shell scaffold to the token standard.

Web · mix · nav Expanded · viewing Chat. The brand sits ONCE (the nav for web/Voice, the top bar for Android), never duplicated; bottom-nav is retired. Tab in, arrow-key the destinations, the facet drifts behind. Live.

// Web: React, consuming @dizyx/nockerl-tokens. (Web is the laggard platform. Spec + live demo,
// not yet exported from @dizyx/nockerl-react; promotion is tracked.)
export function App() {
const [section, setSection] = useState('chat');
return (
<AppShell
preset="web" // 'web' | 'android' | 'voice' (platform chrome preset)
title="Chat"
layout="expanded" // 'expanded' | 'rail'; bottom nav retired (preset sets the default)
destinations={[
{ id: 'chat', label: 'Chat', icon: <ChatIcon />, dot: 'streaming' },
{ id: 'tasks', label: 'Tasks', icon: <TasksIcon />, dot: 'attention' },
{ id: 'files', label: 'Files', icon: <FilesIcon /> },
{ id: 'cluster', label: 'Cluster', icon: <ClusterIcon /> },
]}
selected={section}
onSelect={setSection}
actions={<><ClusterButton /><InboxButton count={3} /><NockerlAvatar /></>}
>
<SectionContent section={section} /> {/* the content region, over the facet field */}
</AppShell>
);
}
PropTypeDefaultDescription
titlestringTitle shown in the top bar (the active destination on small widths).
destinations *ShellDestination[]Nav entries: { id, label, icon, dot? }. Each renders as one focusable button.
selected *stringActive destination id. Drives the selected indicator + which content shows.
onSelect *(id: string) => voidFired when a destination is activated (click / Enter / Space).
preset'web' | 'android' | 'voice''web'Platform chrome preset. web: top bar + expanded nav · android: top bar (owns the brand) + icon rail · voice: left nav only, no title bar. Sets the default layout and where the brand sits.
layout'expanded' | 'rail'preset defaultNav presentation: full sidebar or icon rail. Defaults from the preset; bottom navigation is retired.
actionsReactNodeTrailing top-bar controls (cluster, inbox, avatar). Rendered after the title.
children *ReactNodeThe content region, rendered transparent so the facet field shows behind it.