JM Family Design System
Patterns

Navigation Shell

The persistent frame around an application: header, sidebar or drawer, active navigation state, breadcrumbs, search, and content region. The shell helps users understand where they are, where they can go, and what stays stable while pages change.

When to use it

Use the shell when a product has enough information architecture that users need a persistent frame, not just links inside page content.

Use a navigation shell when

  • The product has multiple related pagesUse a shell when users move between sections, detail pages, settings, reports, or workflows inside the same product area.
  • Users need persistent orientationThe current section, current page, and parent hierarchy should remain visible while the content changes.
  • Global actions need a stable homeSearch, theme, account, help, notifications, or create actions should live in a predictable frame rather than inside each page.

Use something else when

  • The task is a focused modal or wizardUse a dialog or wizard frame when users should stay inside one contained flow until they finish or cancel.
  • The experience is a single-purpose toolA calculator, upload drop zone, or embedded widget may need a compact toolbar instead of a full app frame.
  • The shell would duplicate a host productEmbedded tools should respect the surrounding product shell instead of nesting a second sidebar or header.

Anatomy

The shell owns global orientation. Page content owns the task inside the frame.

  • Header

    Required

    The persistent top bar contains product identity and global actions such as search, help, account, or theme.

    Keep global controls in the header; do not repeat them inside every page.

  • Primary navigation

    Required

    A sidebar or drawer lists major sections and exposes the active section and page.

    Use links for navigation destinations and buttons only for expand/collapse behavior.

  • Breadcrumb

    Conditional

    Use breadcrumbs when the current page sits under a parent or detail object. They should mirror hierarchy, not browser history.

    Do not show breadcrumbs for single-level pages where the sidebar already answers location.

  • Content region

    Required

    The main landmark holds page-specific content. The shell stays stable while this region changes.

    Use one main region and avoid nesting independent app shells inside it.

  • Responsive menu behavior

    Conditional

    On smaller screens, collapse primary navigation into a drawer controlled by a visible menu button.

    Manage focus when the drawer opens and closes, and preserve the same navigation labels across breakpoints.

Variants

The same navigation model adapts across desktop, mobile, and local detail contexts.

Desktop sidebar shell

A persistent header and left navigation for multi-section products.

Trigger: Desktop or tablet-wide products with stable information architecture and repeated cross-section navigation.

Job: Keep the current section visible, expose sibling destinations, and reserve the main area for page content.

Mobile drawer shell

A compact header with navigation behind a menu button.

Trigger: Small screens where a persistent sidebar would crowd the content.

Job: Keep global orientation available without shrinking the main task area.

Section with local navigation

A product shell plus local tabs or links for a detail area.

Trigger: A detail page has several sibling views, such as Summary, Activity, Documents, and Settings.

Job: Keep global navigation separate from local detail navigation.

Examples

The previews show the frame, the active location, and the relationship between global and local navigation.

Vendor portal

Vendor overview

The sidebar shows major product sections while the breadcrumb confirms the current page.

Vendor portal

Vendor overview

The sidebar shows major product sections while the breadcrumb confirms the current page.

HeaderGlobal search, create action, account, and theme controls.
SidebarSection navigation with one active page.
ContentThe page changes; the frame stays stable.

Mobile vendor portal

Vendor overview

The menu button opens the same navigation tree and returns focus when closed.

Vendor portal

Vendor overview

The menu button opens the same navigation tree and returns focus when closed.

HeaderMenu, product name, search, and utility actions.
DrawerTemporary navigation panel with focus management.
ContentPrimary task stays full width.

Vendor detail

Acme Services LLC

The shell shows global location; local tabs switch within the current vendor.

Vendor portal

Acme Services LLC

The shell shows global location; local tabs switch within the current vendor.

SummaryActivityDocumentsSettings
Global navMajor product sections.
Local navSibling views inside the current object.
ContentThe selected local view.

Active page state

Wrong

Vendors

The sidebar section is highlighted, but no child page has aria-current or visible active state.

Right

Vendor overview

The active page link is visibly selected and marked with aria-current="page."

Vendor overview

Users need to know the exact page they are on, not just the broad section.

Mobile navigation

Wrong

Hidden navigation

The sidebar disappears on mobile with no equivalent menu or focus behavior.

Right

Menu button opens navigation

The same navigation tree opens in a drawer, focus is managed, and labels remain consistent.

Open menu

Responsive behavior should preserve orientation, not remove it.

Voice and content

Navigation copy is product vocabulary. Keep labels stable enough that users can build a map of the product.

  • Use stable section labels

    Navigation labels should be short nouns or noun phrases: "Vendors," "Documents," "Settings." Avoid clever verbs or campaign language.

  • Match labels across surfaces

    Sidebar labels, breadcrumbs, page titles, and search results should use the same terms for the same destination.

  • Name the current page exactly

    The active navigation item should match the page heading or the nearest plain-language equivalent.

  • Keep utility actions separate

    Global utilities belong in the header. Page-specific actions belong near the page title or form actions.

Accessibility

Shell accessibility depends on landmarks, active state, expand/collapse semantics, and drawer focus management.

  • Use landmarks

    Header, navigation, main, and footer regions should be semantic so assistive technology users can jump between them.

  • Expose current location

    Use aria-current="page" on the active navigation link. Do not rely on color alone to mark the current page.

  • Wire expandable sections

    Expandable navigation groups use buttons with aria-expanded and aria-controls. Links remain links.

  • Manage mobile drawer focus

    When the drawer opens, focus moves into it. When it closes, focus returns to the menu button. Escape closes the drawer.

Implementation notes

The shell should be centralized. Every product area should not invent its own frame.

  • Use the existing shell components

    Compose Header, Sidebar, SidebarNav, and ShellLayout rather than rebuilding a new frame per product area.

    Primitives: Button, Link, Icon

  • Keep navigation data centralized

    Navigation labels and paths should come from one registry so the sidebar, breadcrumbs, and coming-soon routes do not drift.

  • Separate global and local navigation

    Global shell navigation answers where the user is in the product. Local tabs or links answer where they are inside the current object.

Review checklist

Use this as the acceptance gate before approving a navigation shell.

  • The shell has semantic header, navigation, and main regions.
  • The current page is visible and marked with aria-current="page."
  • Navigation labels are stable across sidebar, breadcrumbs, and page titles.
  • Buttons expand or collapse groups; links navigate.
  • Mobile drawer behavior preserves labels and manages focus.