Launch prototype

Patterns

Navigation

The sidebar shell's two nav pieces: a primary icon rail + contextual sidebar (side nav), and the persistent header bar above it (top nav).

Side nav

A 64px primary icon rail (one icon per top-level section, always visible) next to a 286px contextual sidebar (only the active section's own children), next to the page's main content. Clicking a rail icon either switches the contextual sidebar in place (a section with no page of its own yet) or navigates to that section's real page (Home, Projects) - see goToSection in app/pages/dashboard/page.tsx for the real logic this demo simplifies.

Side nav - anatomy

Main content for “Home”

A record page has no contextual sidebar

The deep dive of a collection (a project, an agreement, a nomination, a user, a role, a permission, a vocabulary, a report) uses the whole width beside the rail (contract section 3.7). Where you are is the breadcrumb, whose section crumb switches to another record of the collection; the record's actions are in its card. A list, and a create or edit form (whose sections are the contextual sidebar), keep it.

Items in the contextual sidebar

Every navigation item in the contextual sidebar carries an icon to the left of its label (contract section 3.11), so the column scans by shape as well as by word, and the same item has the same icon in the mobile menu.

Top nav

A 64px header: logo (37px, aspect ratio locked) + product name + breadcrumb on the left, primary actions + profile on the right. Every canonical page (/pages/dashboard, /pages/project-detail, /pages/observation-detail, ...) renders this same bar, just with its own section/current crumb. The right side is one Add menu (a project, a data licence request, a data sharing agreement - only what the persona can create), the global search, and the account control.

Top nav - anatomy

Shared shell components: a contract

The header and the icon rail are shared components, never rebuilt per screen, and they are the same for every persona (a guest differs only in its account controls). This is a non-negotiable design system contract, enforced by npm run check:contracts.

The breadcrumb on a deep-dive page

On a record page (a project, a report, a data licence request, an agreement, a nomination, a user, role or permission) the section crumb is a switcher: the section's name with an up-down caret, opening one popup so a person can move to another record of the same collection without going back to the list, searching, and clicking in. The crumb after it is the record's name. On the list page itself the crumb is plain.

Breadcrumb switcher (Projects)

Notes