figma guide

Designing navigation and tabs in Figma: patterns, states, and handoff

Design nav bars, sidebars, and tab bars in Figma with correct states, auto layout, safe areas, and Dev Mode specs engineers can implement without guessing.

Published
Updated
Jun 05, 2026
Read time
6 min
Level
Intermediate

Quick answer

Navigation in Figma should be a published component set—top bar, side rail, or bottom tabs—with variants for item state (default, hover, active, disabled) and density (compact vs comfortable). Use auto layout for item rows, bind semantic color tokens for active indicators, and document which item is “current” in Dev Mode descriptions (URL, route id, or section name). On mobile, design inside frames with safe areas and minimum 44px touch targets. Pair with mobile frame presets, interactive component states, and the Figma guides hub.


Who this is for

  • Product designers shipping app shells, settings areas, and marketing site headers.
  • Design system teams standardizing nav primitives before dozens of feature files diverge.
  • Engineers who need clear active-state rules, not screenshots of five similar tab bars.

Choose the right navigation pattern

PatternBest forAvoid when
Top app barWeb apps, Android-style primary actionsMore than ~5 primary destinations
Side navigationDense dashboards, admin tools, docsMobile-first products without a collapsed drawer spec
Bottom tab bariOS/Android primary destinations (3–5)Desktop-only workflows
Segmented control / tabsSwitching views within one screenReplacing global app navigation
BreadcrumbsDeep hierarchies, enterpriseFlat single-level apps

Verdict: pick one primary global pattern per platform (web vs mobile) and reuse it—do not redesign navigation per feature squad.


Component anatomy: nav item

LayerRoleHandoff note
ContainerHit area, paddingMin height 44px on touch
Icon (optional)RecognitionUse instance swap property
LabelTextTruncate rules in description
Active indicatorBar, pill, or boldToken: nav/indicator/active
Badge (optional)CountsDocument max digits (99+)

Structure as a component set Nav / Item with variants state=default | hover | active | disabled and density=compact | default.


Top navigation bar (web)

  1. Frame: full width, horizontal auto layout, height 56–64px, padding horizontal 16–24px.
  2. Left cluster: logo instance + primary links (horizontal auto layout, gap 8–16px).
  3. Right cluster: search, notifications, avatar—push apart with auto layout space between on the parent or a spacer frame.
  4. Active link: underline or text/weight-semibold + semantic color—never color alone (accessibility plugins).

Sticky header spec

Document in description: position: sticky; top: 0; z-index: nav and whether content scrolls under or below the bar.


Side navigation (dashboard)

SectionLayout tip
Brand / product switcherFixed top, 48–56px tall
Primary itemsVertical auto layout, gap 4px
Secondary (settings, help)Pin to bottom with spacer flex-grow pattern
Collapsed railIcon-only variant width ~56px; show tooltips in spec

Use layout grids on the content area beside the rail—not on the rail itself unless you align icons to an 8pt grid.

Nested items: indent 16px per level; show expand/collapse as a boolean component property, not a detached chevron per row.


Bottom tab bar (mobile)

Design on a 390×844 (or your team standard) frame with safe area padding for home indicator.

RuleValue
Tab count3–5 primary destinations
Icon + labelLabel optional only if icons are universally understood—document exceptions
Active stateFilled icon + label color token
FAB overlapIf FAB exists, document center tab or raised FAB z-index

Prototype tab switches with component properties or separate frames per tab root—link to prototype basics.


Tabs (in-page, not global nav)

Segmented tabs sit below the page title and control panel content on the same route.

Tabs / Segmented
├── Variant: size=sm | md
├── Variant: state=default | hover | active | disabled
├── Slot: panel (swap instance or show/hide via property)
MistakeFix
Tabs look like bottom navDifferent height, no safe-area inset, label style text/tab
8+ tabs in one rowScrollable tab row variant or dropdown “More”
No empty panelDesign panel=empty and panel=loading

Pair with sections for flows so each tab maps to a named section in the file.


States and interaction

StateVisualPrototype
DefaultMuted label/icon
HoverSubtle background (web)On click → navigate
Active / currentIndicator + emphasisStarting frame for section
DisabledReduced opacity, no pointerOmit from prototype hotspots
Focus (keyboard)Visible ringDescribe in Dev Mode; do not hide

Use interactive components for hover/press on nav items, not on the entire bar.


Responsive behavior

Document breakpoints in a small spec table on the handoff page:

ViewportNavigation behavior
≥1024pxSide rail expanded
768–1023pxSide rail collapsed (icons only)
<768pxBottom tabs or hamburger → drawer

Cross-link responsive design in Figma for constraint vs auto layout decisions on the content frame beside nav.


Comparison: native components vs UI kits

ApproachBest forRisk
Native component setLong-term productUpfront build time
Kit nav blockMVP speedToken mismatch with your code
Detached frames per screenNeverUnmaintainable active states

Verdict: import UI kits as reference, then rebuild one nav set on your semantic tokens.


Handoff checklist

DeliverableWhere
Active item logicComponent description (match route /segment)
Icon setPublished library, 24px grid
SpacingAuto layout gaps = spacing tokens
OverflowTruncate vs wrap rules for long product names
Z-indexNav above content, below modals

Run the same pass as Dev Mode for designers before review.


Common mistakes

MistakeConsequenceFix
Active state only on colorFails a11yIndicator + weight or underline
Different nav per fileInconsistent IAPublish Nav/* from team library (team libraries)
6 bottom tabsCrowded, rejects App Store patternsMerge destinations or use “More”
No collapsed drawer specBroken tablet layoutShip collapsed variant
Prototype without real labelsEngineers guess truncationUse realistic copy widths

FAQ

Should logo be part of the nav component?

Yes for product apps; no for white-label systems where marketing owns the header separately.

How do I show “current page” in Figma?

Use the active variant on the correct item instance, and add a description on the nav frame listing the route. Do not rely on prototype highlight color alone.

Tabs vs accordion on mobile?

Tabs for 2–5 peer views of equal weight; accordion for long settings lists—see forms patterns for dense settings.

Do nav items need variants for dark mode?

Yes—bind to dark mode tokens or mode-aware variables on the same component set.


Bottom line

Ship one nav system per platform: component sets for items, clear active treatment, and written routing rules in Dev Mode. Use auto layout for alignment, safe areas on mobile, and keep everything in the team library so active states stay honest across files. Next: forms, modals, and the tutorials hub.

Share on X

§ Keep reading

Related guides.