Usage
Navbar is the application-level top bar for operator consoles. It combines product identity, primary route destinations, optional app switching, and persistent utilities in one named navigation landmark. The mental model is "stable top chrome owned by the app": Navbar supplies structure and responsive behavior while the app owns routes, permissions, labels, counters, and selection state.
TabNav for route-backed links or Tabs for panels on one page.Sidebar.Toolbar.Navbar is constrained application chrome.Compose NavbarStart and NavbarEnd inside Navbar. Place NavbarBrand and NavbarTabs in the start region. Place selectors, account controls, and one or more NavbarGroups in the end region. NavbarGroup adds a full-height separator before a related action cluster.
NavbarTabs accepts an ordered app-owned model rather than arbitrary children. Visible tabs, the hidden measurement row, and the overflow menu share that model; custom renderTab output stays in the visible row, while measurement uses renderMeasurementTab or an inert default tab. A measurement stand-in can be any single element; overflow measures that node even when it is not an anchor.
Account menus are app composition, not a Navbar primitive. Compose an avatar, a visible name that truncates only after --pr-navbar-account-name-max-width (12rem default), and a decorative chevron that rotates when the menu is open. Include the visible name in the trigger accessible name, for example "Alex Rivera, Account." Click-open is the default. Hover-open is opt-in. Reserve ChevronUpDown for the app switcher; that icon path-morphs each arrow inward while the menu is open, which is a different motion from the single ChevronDown rotation on More and account triggers.
NavbarBrand and provide ariaLabel.variant="text" for a concise whitelabel or product name.multiApp and provide apps, currentApp, onSelectApp, and appMenuLabel. The current app appears beside the brand in a radio menu.overflow={false} only when the surrounding layout guarantees every destination fits.Navbar labels, tab labels, app names, counters, action names, overflowMenuLabel, and appMenuLabel at the call site.appMenuLabel as an action phrase such as "Switch app." The component combines it with the visible current app name so the accessible name preserves label-in-name.currentPath determines the active tab. Use extraRouteMatchers when one destination represents multiple nested routes.TabNav destinations. The menu opens on click by default. Set overflowMenuOpenOnHover only when the product explicitly wants hover-open; click remains available. The active destination remains visible when possible, and every hidden destination remains available from the menu. Hidden current destinations expose aria-current="page" on their menu row.onInteractingChange(true) while pointer or focus remains in the row or its portaled UI. Interaction ending alone does not dismiss More. Outside events are suppressed while interaction is active; onSelect, Escape, or a deferred hover dismiss closes the menu. Call onInteractingChange(false) when the interaction ends and during unmount cleanup. Wire onSelect to the in-menu NavMenuItem for destination activation; do not call it from portaled close actions. See the Prepared911TopNav and MultiApp Storybook examples for end-to-end overflow behavior.--pr-navbar-account-name-max-width so shorter names stay fully visible.navigate and remain responsible for route transitions, guards, and unsaved-work handling.currentApp, available destinations, and the active route together. Avoid leaving a tab selected that does not belong to the newly selected app.Do
Don't
Give every Navbar a product-language ariaLabel, every logo brand an ariaLabel, and every icon-only action a discernible name. Tabs remain real links, while the app switcher and overflow use keyboard-operable menus. See Accessibility for the full contract.