# Nexus authenticated UI contract `/dashboard` is the visual authority for authenticated Nexus surfaces. This contract keeps the remaining routes aligned without coupling presentation to stores, services, API contracts, route behavior, or domain state. ## Sources of truth - `frontend/src/assets/nexus-tokens.css` is the only source for Nexus color, surface, typography, radius, focus, status, and page-geometry tokens. - `frontend/src/assets/nexus-components.css` is the shared presentation layer for the authenticated legacy shell and route families. - `components/layout/AppSidebar.vue` is the single authenticated navigation component. Both `frontend/src/App.vue` and `frontend/src/layouts/NexusLayout.vue` render it. - `frontend/src/App.vue` with `components/layout/AppHeader.vue` and `frontend/src/layouts/NexusLayout.vue` with `components/layout/Topbar.vue` own the two content shells around that shared navigation. - `/dashboard` and `/login` retain their standalone content implementations; the dashboard no longer owns a separate sidebar implementation. Do not add raw color values to migrated views. Add or reuse a semantic token in `nexus-tokens.css`, then consume that token from the component or shared layer. Legacy variables must resolve to V2 tokens rather than introduce a second palette. ## Visual foundation | Concern | Contract | | --- | --- | | Background | Galaxy background over `--space-0` for authenticated routes | | Sidebar | `248px` desktop; overlay navigation at `900px` and below | | Topbar | `62px`, glass surface, persistent above route content | | Body type | Manrope, `12px` minimum for interface copy | | Page title | Space Grotesk, `24px / 30px`, weight `700` | | Metadata | JetBrains Mono, `11px` minimum | | Page inset | `20px` desktop, `14px` mobile | | Panel | `--glass`, `--line`, `14px` radius, controlled blur | | Standard page | `1180px` maximum | | Workspace | `1440px` maximum | | Reading/form surface | `880px` maximum | | Focus | Visible `:focus-visible` outline using `--a-blue` and `--focus-ring` | Blue-to-violet gradients and glows are reserved for active navigation, primary actions, and meaningful operational states. Neutral cards, inputs, metadata, empty states, and destructive confirmation surfaces use plain glass and semantic status colors. ## Navigation contract - Every authenticated sidebar presents the categories `Operations`, `Knowledge`, `Infrastructure`, and `Governance` in that order. - Render `components/layout/AppSidebar.vue`; do not introduce another authenticated sidebar component or duplicate its navigation data. - Settings remains a persistent footer destination below the scrollable category list on every authenticated route. - Use semantic RouterLinks for registered destinations and `aria-current` for the active item. Agent, Project, and Task details activate their parent navigation destination. - Keep counts, labels, permissions, registered route targets, and logout behavior owned by `AppSidebar` and its existing stores/props. ## Shared presentation vocabulary - Use `.nexus-page` for standard route roots. - Add `.nexus-page--workspace` only for horizontally or spatially dense work surfaces such as Task Board and Chat. - Add `.nexus-page--reading` for detail, form, and notification surfaces. - Use `.nexus-page-header` for route identity and local actions. - Use `.glass-panel` or the route-family rules in `nexus-components.css` for panels. - Keep loading, empty, error, warning, and success feedback inside the route frame. Existing copy and state guards remain authoritative. - Use Lucide icons already present in the project. Do not use emoji, text glyphs, handcrafted SVGs, or icon-like CSS drawings. ## Dashboard orchestration contract - Live-Orchestrierung is the primary dashboard surface and owns the remaining workspace after the `62px` topbar. - Iris Chat is closed by default. Open it only through the topbar `Iris Chat` action and render it as a modal dialog; do not restore a persistent rail. - Preserve the existing chat store, polling lifecycle, messages, send handler, error state, and thinking state when changing presentation. - Keep operational status in one compact row and prioritize active, planning, and blocker signals on narrow layouts. - Keep focus tasks in one compact row. Priority, state, title, and owner must remain visible or programmatically available. - At `680px` and below, agent nodes use the compact card variant. Auto-layout must not overlap or clip nodes at the supported breakpoints. - Modal close by pointer and Escape must restore focus to the connected Iris trigger. ## Responsive and accessibility rules - At `900px` and below, the sidebar becomes a keyboard-operable overlay and the topbar exposes the navigation toggle. - At `1024px` and below, multi-column detail and settings layouts collapse presentationally without changing source order. - At `767px` and below, headers and action rows stack and the page inset becomes `14px`. - The document must never overflow horizontally at `375`, `768`, `1024`, `1440`, or `1920px`. - Internal horizontal scrolling is allowed only for a domain-horizontal work surface, currently the Task Board columns. - Every icon-only control needs an accessible name. Interactive cards must use link/button semantics and offer Enter/Space keyboard equivalence as appropriate. - Preserve existing `v-model`, handlers, emits, navigation destinations, permissions, and state transitions. ## Route-family mapping | Family | Routes | | --- | --- | | List/detail | Memory, Docs, Incidents, Calendar, Security | | Grid/overview | Agents, Projects, Models, Activity, Notifications | | Detail/form | Agent Detail, Project Detail, Task Detail, Settings | | Workspace | Task Board, Chat | When adding a route, choose the closest family, apply the shared root class, verify loading/empty/error states, and test the registered destination at all required breakpoints before adding navigation.