2. Navigation
The hierarchy of orientation — top nav for global, sidebar for section, breadcrumbs for path, tabs for view. Four primitives, one rule: each level of navigation must have a distinct job. If two levels overlap, drop one.
Gallery
Four primitives, shown in isolation. Active state on each uses aria-current="page"; .is-active is supported for non-routing toggles.
.nav-item.sidebar-item + .sidebar-section-label.tabs + .tab.breadcrumbWhen to use each
Three decisions: which primary nav, when tabs are tabs, and whether breadcrumbs earn their keep.
Workspace preferences and account management.
Drift to avoid
Seven named anti-patterns. Navigation drift is especially insidious because users learn the navigation — every inconsistency taxes their muscle memory.
- Don't show all four nav primitives on one pagePrinciple 1Top nav + sidebar + breadcrumb + tabs is visual overload. Pick the levels the page needs. A shallow page might be top nav + sidebar only. A deep detail page might be top nav + breadcrumb + tabs (no sidebar). Not every page needs every level.
- Don't use tabs to switch resourcesUXIf clicking a tab changes which thing you're viewing — not the view of one thing — that's routing, not tabs. "Methods / Resources / Devices" as tabs misleads: those are three different concepts, not three views of one. Use top nav or sidebar.
- Don't put twenty items in a flat sidebarPrinciple 1A long flat list defeats scanning. Group with
.sidebar-section-labelheaders; collapse the least-used items behind an overflow; or move secondary items to a different surface (a settings page, a contextual menu). The sidebar is for primary section navigation, not everything you might possibly want. - Don't duplicate the page title in the breadcrumbPrinciple 1Breadcrumb shows the path to the current page; the
.breadcrumb-currentat the end repeats the h1 below it. That's two adjacent labels saying the same thing. Either drop the last breadcrumb item or drop the breadcrumb entirely if the title is enough. - Don't make hover state and active state look alikePrinciple 4The user must be able to tell at a glance which item is selected versus which item they're hovering. Hover is a subtle tint (
--color-bg-hover); active is the saturated state (--color-primary-subtle+ primary text). Same rule as table rows. - Don't hide nav items based on stateUXUsers build muscle memory for where items live. Items shouldn't appear or disappear unpredictably between page loads. If an action isn't available, disable the item (with a tooltip explaining why) instead of removing it. Stability beats minimalism.
- Don't make the brand element link somewhere unexpectedUXConvention: clicking the brand returns to the app home (dashboard or root). Pointing it at a marketing page, a random destination, or nothing at all surprises users who expect the universal escape hatch.
Composition — workcell page
A real page with all four primitives working together. Top nav for global app sections, sidebar for section navigation, breadcrumb for path, tabs for view. Each level has a distinct job; none of them compete.
Workcell stations
Station list and configuration controls live in the page body.