Skip to content
TrademarkTrademark
Docs
Components

Nav

Updated: October 20, 2026
View on GitHub
Soon
Not released yet. The published package does not include this yet, so it will not install today.

Nav, NavItem, NavSection and NavGroup take the same props as on the web. As a column (the default) they are a list of rows, for a drawer or a tablet sidebar. As a row (direction="row") they are the phone's bottom tab bar: the items share the width, each an icon over its label, with a line along the top and the home indicator's inset below. See the web Nav for the same components in the browser.

A bookings screen with a four-tab bar at the bottom

Bottom tab bar

Put the bar last in the screen's column, under a view with flex={1}. The current tab is selected and drawn in the brand colour. A number badge is a count on the icon (0 hides it, above 9 prints 9+); indicator is a dot.

With React Navigation or Expo Router, render the same Nav from the tab navigator's tabBar prop and call navigation.navigate in onPress.

Rows

As a column, density sets the row height (compact 32, normal 40, spacious 48) and variant how the current row stands out (solid fills it, subtle fills it and dims the others, minimal marks it by weight alone). NavSection adds a small heading over a block of rows; NavGroup folds a set of rows behind a header, with a rail down the side.

Differences from the web

  • Tab bar. A row Nav is a bottom tab bar on the phone. On the web a row Nav lays its rows side by side.
  • No links. A NavItem has no href: navigate in onPress (or core's onClick).
  • Sortable. Rows can't be dragged into a NavGroup.
  • Core 3.0 names. NavGroup also takes onOpenChange(open).

API reference

Prop
Type
Default
Description
direction"column" | "row""column"A list of rows, or a bottom tab bar.
density"compact" | "normal" | "spacious""normal"Row height and text size.
variant"solid" | "subtle" | "minimal""solid"How the current row stands out.
railbooleantrueThe line down an open NavGroup.

Nav also takes every Flex prop.

Prop
Type
Default
Description
labelReactNodeThe text. Required.
iconIconNameLeading icon, or the tab's icon.
selectedbooleanfalseThe current page or tab.
badgenumber | ReactNodeA count (0 hides it, above 9 prints 9+) or a short label.
indicatorbooleanA dot, for unread without a number.
disabledbooleanfalseDims the item and ignores presses.
onPress / onClick() => voidCalled on a tap.
Prop
Type
Default
Description
labelReactNodeThe heading over the rows.
actionReactNodeA control at the end of the heading.
Prop
Type
Default
Description
labelReactNodeThe header's text. Required.
iconIconNameLeading icon.
openbooleanOpen state, when you own it.
defaultOpenbooleanfalseStarting state when the group owns it.
onToggle() => voidCalled on the header.
onOpenChange(open: boolean) => voidCalled with the next state.
selectedbooleanfalseMarks the header itself as current.
Edit this page on GitHub