App Sidebar
Organise a product's main navigation so users always know where they are, reach frequent places in one click, and keep their place on small screens.
6 states5 edge casesDesktop + Mobile
01The problem
SaaS products accumulate sections: dashboards, records, reports, settings, integrations. Without a deliberate structure, the sidebar becomes a long, flat list where everything has equal weight, users lose track of where they are, and the mobile version is an afterthought.
02When to use
Use when
- Products with more than ~5 top-level sections
- Users switch between sections many times a day
- Multi-workspace or multi-project products
Avoid when
- Content sites or simple tools with 3–4 destinations — a top bar is enough.
- Focused single-task flows such as checkout or onboarding — hide global navigation entirely.
03Recommended UX
Statecraft recommendation
Limit the sidebar to the places users visit daily, group the rest under a few labelled sections, and mark the current location with both position and a strong active style. Put workspace switching at the top and account settings at the bottom; never mix them with content navigation.
Every item added to a sidebar reduces the visibility of the others. Settings, billing and rarely used admin pages belong in a settings area, not the main nav.
Top = context (which workspace am I in?), middle = work, bottom = me. This stable layout lets users navigate without reading.
An active state that relies on a faint background tint fails on many screens. Use weight, a marker and colour together.
04Interaction flow
- 01
Land in app
Sidebar shows workspace, primary items, groups.
- 02
Scan
Active item marked; groups show what's inside.
- 03
Navigate
One click to any primary item; groups expand in place.
- 04
Collapse (optional)
Icon-only rail with tooltips; state remembered.
Result
- Arrived
- Switched workspace
05Desktop behaviour
On desktop the sidebar is persistent. Width is a trade-off: wide enough for full labels, with an optional collapsed rail for users who want more canvas.
Desktop rules
- Keep primary items to about 7; group the rest under 2–4 labelled sections.
- Workspace switcher at the top, account and settings at the bottom.
- Collapsed rail shows icons with tooltips and keeps the active marker visible; remember the user's choice.
- Show counts only when they demand action (e.g. 3 approvals waiting), never for totals.
06Mobile behaviour
A desktop sidebar squeezed into a drawer hides everything behind a hamburger. On mobile, promote the top destinations to a bottom tab bar and put the rest in a “More” screen.
Mobile rules
- Bottom tab bar with the 4 most used destinations plus More.
- More opens a full screen list with the remaining sections and settings.
- Workspace switcher moves to the top of the screen header.
- The active tab uses an icon fill and label, not colour only.
07States
Default
Full labels, groups expanded per saved preference.
Active item
Marker, stronger weight and background on the current section.
Nested active
Parent stays marked when a child page is open.
Collapsed rail
Icons only, tooltips on hover and focus.
Attention badge
Count when action is waiting: “Approvals 3”.
Unavailable
Sections outside the plan show a lock and lead to an explanation, or are hidden for members.
08Edge cases
EC-01
Deep pages
The user is on Settings › Billing › Invoice 1024.
Recommendation
Keep the nearest sidebar ancestor (Settings) active, and let breadcrumbs carry the depth.
EC-02
Too many workspaces
A consultant belongs to 40 workspaces.
Recommendation
Make the switcher searchable, show recent workspaces first, and support a keyboard shortcut.
EC-03
Role-specific items
Admins have 3 extra sections that members never use.
Recommendation
Hide items users can never access instead of disabling them. Show locked items only when an upgrade could unlock them.
EC-04
User-pinned items
Users want quick access to specific projects.
Recommendation
Offer a separate Favourites group they control, below primary items. Don't let personalisation reorder the main navigation.
EC-05
Long labels and translations
A German translation doubles label length.
Recommendation
Truncate with an ellipsis and show the full label in a tooltip; never wrap labels to two lines in the sidebar.
09Microcopy
Group label
Avoid
“Misc”
Prefer
“Reports”
Action badge
Avoid
“Approvals (124)”
Prefer
“Approvals 3 — only items waiting for you”
Locked item
Prefer
“Audit log — Business plan”
Collapse control
Prefer
“Collapse sidebar”
10Accessibility
- Wrap the sidebar in a nav landmark with a label and mark the current item with aria-current="page".
- Collapsible groups use buttons with aria-expanded.
- In the collapsed rail, every icon link keeps an accessible name, and tooltips also appear on keyboard focus.
- Provide a skip link to main content so keyboard users don't tab through the whole sidebar on every page.
11Developer notes
- 01
Define navigation as data (id, label, icon, href, group, permission, plan) and render it once for sidebar, mobile tabs and command palette.
- 02
Derive the active item from the route, matching the longest prefix, rather than storing it in state.
- 03
Persist collapsed state and group expansion per user.
- 04
Load badge counts separately so a slow count never delays the navigation.
12Implementation prompt
For Claude Code, Codex or Cursor
Implement the main application sidebar.
Requirements:
- Navigation defined as data: { id, label, icon, href, group, permission, plan }.
- Structure: workspace switcher (top), ~7 primary items, 2–4 labelled groups, account/settings (bottom).
- Active item derived from the route by longest prefix; parent stays active on nested pages; aria-current="page".
- Collapsible groups (buttons with aria-expanded) and a collapsible icon rail with tooltips on hover and focus; persist both per user.
- Action badges only for items needing attention; counts loaded asynchronously.
- Hide items the user can't access; show plan-locked items with a lock and an explanation.
- Searchable workspace switcher with recents.
- Mobile: bottom tab bar with 4 destinations + More (full-screen list); switcher moves to the header.
- Skip link to main content.
Do not redesign the existing interface.
Share the navigation config with other navigation surfaces.