Marvia-07 · shell & navigation
One application. One shell. One navigation.
Pages and extensions never build chrome. They register schema — menu items, toolbar actions, breadcrumbs, commands, overlays — into a shell that stays identical everywhere.
Composition
Shell parts
Nine owned surfaces. No feature may replace one of them.
AppShell
Owns sidebar, header, toolbar, workspace context, notifications, command palette, prompt bar and the overlay manager. Never edited by a feature.
Sidebar
Schema-driven navigation with a workspace switcher, core links, extension links, recents and a profile/credits footer.
Header
Breadcrumb, page title, workspace context, global search, notifications, quick actions and the profile menu. No feature-specific headers.
Toolbar
Per-page actions resolved from the page schema: filters, refresh, search, export, import and bulk actions.
Command palette
CMD/CTRL+K over navigation, actions, settings, workspace management and future AI commands. Fully searchable.
Universal search
Asynchronous providers per scope; results merge into one ranked list.
Prompt bar
Persistent and bottom-fixed. Belongs to the shell so every page inherits AI interaction for free.
Notification centre
One inbox for workspace, extension and connector events, with read state and mentions.
Overlay manager
A single stack for dialogs, drawers, popovers, the palette and toasts. Escape always closes the top layer.
Sidebar registry
Primary navigation
Core navigation is data. Everything else belongs to an extension.
| Item | Group | Route | Permission |
|---|---|---|---|
| Workspace | workspace | /workspace | workspace.read |
| Projects | core | /projects | project.read |
| Marketplace | core | /marketplace | — |
| History | core | /history | activity.read |
| Extensions | footer | /extensions | extension.read |
| Learn | footer | /learn | — |
| Credits | footer | /credits | credit.read |
| Security | footer | /security | security.view |
| Settings | footer | /settings | settings.read |
Layout manager
Page layout registry
Thirteen layouts. Extensions reuse them; custom layouts are rejected.
dashboard
Metric grid plus activity rail.
report
Fixed report section order; not reorderable.
documentation
Table of contents plus reading column.
marketplace
Filterable catalogue with detail drawer.
settings
Namespaced sections with a sticky nav.
workspace
Workspace overview and membership.
learning
Course list and lesson reader.
chat
Thread with persistent prompt bar.
split
Two resizable panes.
inspector
Content with a right inspector panel.
blank
Shell chrome only.
modal
Focused task inside an overlay.
drawer
Side panel task surface.
Required page states — no blank screens
Command & search
Palette, scopes and shortcuts
CMD/CTRL+K opens everything; universal search runs asynchronously per scope.
Command groups
Search scopes
Keyboard
- ⌘K / Ctrl+KOpen the command palette
- ⌘/ / Ctrl+/Focus the prompt bar
- ⌘B / Ctrl+BCollapse or expand the sidebar
- ⌘⇧WOpen the workspace switcher
- G then PGo to Projects
- NOpen notifications
- EscapeClose the topmost overlay
Overlays & prompt
One stack, one prompt bar
Dialogs, drawers, popovers, the palette and toasts share a single manager.
Overlay kinds
Dialogs
Drawers
Prompt modes
Notification channels
Extension slots
Behaviour
Responsive, accessible, fast
Shell guarantees that pages inherit rather than reimplement.
Responsive
- desktop ≥ 1280px
Sidebar expanded, toolbar inline, prompt bar centred.
- tablet 768–1279px
Sidebar collapses to icons, toolbar overflows into a menu.
- mobile < 768px
Sidebar becomes a drawer, prompt bar stays fixed to the bottom.
Accessibility
- Keyboard-first: every shell action is reachable without a pointer.
- ARIA roles and labels on navigation, overlays and the prompt bar.
- Visible focus rings; focus is trapped inside overlays and restored on close.
- prefers-reduced-motion disables all shell transitions.
- Semantic landmarks: header, nav, main, footer on every page.
Performance
- Routes, layouts and extensions are code split and lazily loaded.
- Data refresh is explicit; no background polling by default.
- Long collections render through virtual lists.
- Shell state is memoised so navigation never re-renders the content tree.