> ## Documentation Index
> Fetch the complete documentation index at: https://api.fanvue.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# BottomNavigation

> A fixed bottom bar of BottomNavigationAction items, for switching between the top-level sections of a mobile layout.

```tsx theme={null}
import { BottomNavigation, BottomNavigationAction } from "@fanvue/ui";
import type { BottomNavigationActionProps, BottomNavigationProps } from "@fanvue/ui";
```

## Examples

## Default

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-bottomnavigation--default&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="220" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="BottomNavigation — Default" />
</Frame>

```tsx theme={null}
import * as React from "react";
import {
  AddIcon,
  Avatar,
  BellIcon,
  BottomNavigation,
  BottomNavigationAction,
  Count,
  HomeIcon,
  MessageIcon,
} from "@fanvue/ui";

function Example() {
  const [value, setValue] = React.useState("home");
  return (
    <BottomNavigation value={value} onValueChange={setValue} aria-label="Main navigation">
      <BottomNavigationAction
        value="home"
        icon={<HomeIcon filled={value === "home"} />}
        label="Home"
      />
      <BottomNavigationAction
        value="notifications"
        icon={<BellIcon filled={value === "notifications"} />}
        label="Notifications"
        badge={
          <Count
            value={5}
            max={99}
            variant="default"
            size="24"
            className="ring-2 ring-background-primary"
          />
        }
      />
      <BottomNavigationAction value="create" icon={<AddIcon />} label="Create" />
      <BottomNavigationAction
        value="messages"
        icon={<MessageIcon filled={value === "messages"} />}
        label="Messages"
        badge={
          <Count
            value={1}
            max={99}
            variant="default"
            size="24"
            className="ring-2 ring-background-primary"
          />
        }
      />
      <BottomNavigationAction
        value="profile"
        icon={<Avatar size={32} alt="User" fallback="JD" />}
        label="Profile"
      />
    </BottomNavigation>
  );
}
```

## Selected State

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-bottomnavigation--selected-state&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="220" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="BottomNavigation — Selected State" />
</Frame>

```tsx theme={null}
import {
  BottomNavigation,
  BottomNavigationAction,
  HomeIcon,
  LoveIcon,
  SearchIcon,
  UserIcon,
} from "@fanvue/ui";

<BottomNavigation value="favorites" aria-label="Main navigation">
  <BottomNavigationAction value="home" icon={<HomeIcon />} label="Home" />
  <BottomNavigationAction value="search" icon={<SearchIcon />} label="Search" />
  <BottomNavigationAction value="favorites" icon={<LoveIcon filled />} label="Favorites" />
  <BottomNavigationAction value="profile" icon={<UserIcon />} label="Profile" />
</BottomNavigation>
```

## With Badges

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-bottomnavigation--with-badges&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="220" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="BottomNavigation — With Badges" />
</Frame>

```tsx theme={null}
import * as React from "react";
import {
  BottomNavigation,
  BottomNavigationAction,
  Count,
  HomeIcon,
  LoveIcon,
  SearchIcon,
  UserIcon,
} from "@fanvue/ui";

function Example() {
  const [value, setValue] = React.useState("home");
  return (
    <BottomNavigation value={value} onValueChange={setValue} aria-label="Main navigation">
      <BottomNavigationAction
        value="home"
        icon={<HomeIcon filled={value === "home"} />}
        label="Home"
      />
      <BottomNavigationAction
        value="search"
        icon={<SearchIcon filled={value === "search"} />}
        label="Search"
      />
      <BottomNavigationAction
        value="favorites"
        icon={<LoveIcon filled={value === "favorites"} />}
        label="Favorites"
        badge={
          <Count
            value={5}
            max={99}
            variant="alert"
            size="24"
            className="ring-2 ring-background-primary"
          />
        }
      />
      <BottomNavigationAction
        value="profile"
        icon={<UserIcon filled={value === "profile"} />}
        label="Profile"
      />
    </BottomNavigation>
  );
}
```

## Information Architecture Nav – Selected State

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-bottomnavigation--information-architecture-nav-selected&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="220" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="BottomNavigation — Information Architecture Nav – Selected State" />
</Frame>

```tsx theme={null}
import {
  BottomNavigation,
  BottomNavigationAction,
  HomeIcon,
  LoveIcon,
  SearchIcon,
  UserIcon,
} from "@fanvue/ui";

<BottomNavigation value="favorites" hasInformationArchitectureNav aria-label="Main navigation">
  <BottomNavigationAction value="home" icon={<HomeIcon />} label="Home" />
  <BottomNavigationAction value="search" icon={<SearchIcon />} label="Search" />
  <BottomNavigationAction value="favorites" icon={<LoveIcon filled />} label="Favorites" />
  <BottomNavigationAction value="profile" icon={<UserIcon />} label="Profile" />
</BottomNavigation>
```

## With asChild (Links)

<Frame>
  <iframe src={"https://main--697a1b6dd4dad73ee9c0e5f5.chromatic.com/iframe.html?id=components-bottomnavigation--with-as-child&viewMode=story&shortcuts=false&singleStory=true&globals=theme:light"} width="100%" height="220" style={{border: "none", borderRadius: "8px"}} loading="lazy" title="BottomNavigation — With asChild (Links)" />
</Frame>

```tsx theme={null}
import * as React from "react";
import {
  BottomNavigation,
  BottomNavigationAction,
  HomeIcon,
  LoveIcon,
  SearchIcon,
  UserIcon,
} from "@fanvue/ui";

function Example() {
  const [value, setValue] = React.useState("home");
  return (
    <BottomNavigation value={value} onValueChange={setValue} aria-label="Main navigation">
      <BottomNavigationAction
        value="home"
        icon={<HomeIcon filled={value === "home"} />}
        label="Home"
        asChild
      >
        {/* biome-ignore lint/a11y/useAnchorContent: content provided by Slot */}
        <a href="#home" aria-label="Home" />
      </BottomNavigationAction>
      <BottomNavigationAction
        value="search"
        icon={<SearchIcon filled={value === "search"} />}
        label="Search"
        asChild
      >
        {/* biome-ignore lint/a11y/useAnchorContent: content provided by Slot */}
        <a href="#search" aria-label="Search" />
      </BottomNavigationAction>
      <BottomNavigationAction
        value="favorites"
        icon={<LoveIcon filled={value === "favorites"} />}
        label="Favorites"
        asChild
      >
        {/* biome-ignore lint/a11y/useAnchorContent: content provided by Slot */}
        <a href="#favorites" aria-label="Favorites" />
      </BottomNavigationAction>
      <BottomNavigationAction
        value="profile"
        icon={<UserIcon filled={value === "profile"} />}
        label="Profile"
        asChild
      >
        {/* biome-ignore lint/a11y/useAnchorContent: content provided by Slot */}
        <a href="#profile" aria-label="Profile" />
      </BottomNavigationAction>
    </BottomNavigation>
  );
}
```

## Props

## BottomNavigation

<ParamField path="hasInformationArchitectureNav" type="boolean" default="false">
  When `true`, renders the information-architecture style with visible labels and a sliding active indicator.
</ParamField>

<ParamField path="hideOnDesktop" type="boolean" default="false">
  When `true`, the navigation bar is hidden on viewports wider than `md` (768 px).
</ParamField>

<ParamField path="onValueChange" type="((value: string) => void)">
  Called when the selected action changes.
</ParamField>

<ParamField path="value" type="string">
  The currently selected action value.
</ParamField>

## BottomNavigationAction

<ParamField path="icon" type="ReactElement<unknown, string | JSXElementConstructor<any>>" required>
  Icon element displayed in the action.
</ParamField>

<ParamField path="value" type="string" required>
  Unique value that identifies this action.
</ParamField>

<ParamField path="asChild" type="boolean" default="false">
  Merge props onto a child element instead of rendering a `<button>`.
</ParamField>

<ParamField path="badge" type="ReactNode">
  Optional badge element (e.g. `Count`) rendered at the top-end corner of the icon.
</ParamField>

<ParamField path="label" type="string">
  Accessible label applied as `aria-label`.
</ParamField>

## Exported types

Also exported from `@fanvue/ui`: `BottomNavigationActionProps`, `BottomNavigationProps`.

***

**Setup:** [Installation](/docs/ui/installation) · [Theming](/docs/ui/theming)
