No apps yet
Nothing's been activated for this workspace. The bottom nav still works — browse the catalogue to add one.
The bottom nav is shell chrome, so its states are about never blocking navigation. The bar renders its static destinations instantly; only the app-registry-derived long tail (in the drawer) has data states. Navigation stays fail-open — Home / Orgs / More work even when the registry call fails. Plus the safe-area, touch-target, reduced-motion and long-label edges the shell must honour.
Loading · bar instant, drawer apps skeleton
Empty · no registered apps
Nothing's been activated for this workspace. The bottom nav still works — browse the catalogue to add one.
Error · registry failed, nav fail-open
Safe-area · notch + home indicator
The top bar pads below the notch (--safe-area-top); the bar
pads above the home indicator (--safe-area-bottom). Shown forced to 26/24px.
Nothing hidden under the notch or the bar.
Edge · long label truncates, ≥44px targets
A localized / long label never wraps or pushes a sibling — it ellipsizes. Each tab
keeps a ≥--touch-target (44px) hit area (dashed = measured).
[data-component='bottom-nav'][data-state='loaded'] is
present from first paint; only [data-panel='drawer'][data-state='loading'] shows skeletons
(aria-busy). The bar is not gated on the registry fetch.[data-empty] lives in the content, the bar still renders all
four tabs; the empty state offers [data-action='browse-apps'], not a dead end.[data-error] is confined to the drawer's Apps section
with [data-action='retry']; Home / Orgs / More and the Portal section stay usable.[data-safe-area='true'] — the bar's height is
calc(--bottom-nav-height + --safe-area-bottom) and content padding-bottom clears
it; the top bar pads --safe-area-top..bn-item is ≥--touch-target (44px, WCAG 2.5.5).prefers-reduced-motion.text-overflow: ellipsis) — never wrap or overflow the slot.Frame 03 / 03 · States & edges · 375px · tokens only