Skip to content
Redpanda UI
Esc
↑↓navigate↵open⌘Jpreview
Made by shadcn
Edit on GitHub

Breadcrumb

Displays the path to the current resource using a hierarchy of links.

Powered by

Installation

bash
npx shadcn@latest add @redpanda/breadcrumb
bash
pnpm dlx shadcn@latest add @redpanda/breadcrumb
bash
yarn dlx shadcn@latest add @redpanda/breadcrumb
bash
bunx shadcn@latest add @redpanda/breadcrumb
bash
nubx shadcn@latest add @redpanda/breadcrumb
bash
aube dlx shadcn@latest add @redpanda/breadcrumb

Usage

tsx
import {  Breadcrumb,  BreadcrumbHeader,  BreadcrumbItem,  BreadcrumbLink,  BreadcrumbList,  BreadcrumbPage,  BreadcrumbSeparator,} from '@/components/ui/breadcrumb';
tsx
<Breadcrumb>  <BreadcrumbList>    <BreadcrumbItem>      <BreadcrumbLink href="/">Home</BreadcrumbLink>    </BreadcrumbItem>    <BreadcrumbSeparator />    <BreadcrumbItem>      <BreadcrumbLink href="/components">Components</BreadcrumbLink>    </BreadcrumbItem>    <BreadcrumbSeparator />    <BreadcrumbItem>      <BreadcrumbPage>Breadcrumb</BreadcrumbPage>    </BreadcrumbItem>  </BreadcrumbList></Breadcrumb>

When to use

Use Breadcrumb to help users understand their current location within a site hierarchy and navigate back to parent levels:

Use Breadcrumb when:

  • Site has 3 or more hierarchical levels
  • Users need to understand their current location
  • Content is organized in clear categories
  • Users frequently navigate between levels
  • Building e-commerce or documentation sites

Don’t use Breadcrumb when:

  • Site has flat structure (1-2 levels)
  • Navigation path is not hierarchical
  • Current page is the home/landing page
  • Users rarely need to backtrack
  • Primary navigation is sufficient

Anatomy

The Breadcrumb component creates a horizontal navigation trail with clear hierarchy:

plaintext
Breadcrumb Container┌─────────────────────────────────────────────────────────────┐│ BreadcrumbList (nav element)                                ││ ┌─────────────────────────────────────────────────────────┐ ││ │ BreadcrumbItem → BreadcrumbSeparator → BreadcrumbItem   │ ││ │ ┌─────────────┐   ┌───────────────┐   ┌───────────────┐ │ ││ │ │BreadcrumbLink│   │ ChevronRight  │   │BreadcrumbPage │ │ ││ │ │  (clickable) │   │  (separator)  │   │ (current page)│ │ ││ │ └─────────────┘   └───────────────┘   └───────────────┘ │ ││ └─────────────────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────────────┘
Advanced Patterns:- BreadcrumbEllipsis for collapsed long paths- DropdownMenu integration for category navigation- Responsive with Drawer on mobile

Component Hierarchy:

  1. Breadcrumb (Root): Main navigation wrapper with semantic meaning
  2. BreadcrumbHeader: Optional header wrapper for layout and spacing
  3. BreadcrumbList: Ordered list container for screen readers
  4. BreadcrumbItem: Individual breadcrumb step wrapper
  5. BreadcrumbLink: Clickable navigation link (for parent pages)
  6. BreadcrumbPage: Current page indicator (non-clickable)
  7. BreadcrumbSeparator: Visual divider between items
  8. BreadcrumbEllipsis: Collapsed state for long breadcrumbs

Key Features:

  • Semantic HTML: Uses <nav> and <ol> for accessibility
  • Keyboard Navigation: Full keyboard support for links
  • Screen Reader Support: Proper ARIA labels and structure
  • Customizable Separators: Icons or custom components
  • Responsive: Collapsible with ellipsis and dropdowns
  • Framework Integration: Works with Next.js Link and other routers

Examples

Custom separator

Use a custom component as children for <BreadcrumbSeparator /> to create a custom separator.

tsx
import { Slash } from "lucide-react"
...
<Breadcrumb>  <BreadcrumbList>    <BreadcrumbItem>      <BreadcrumbLink href="/">Home</BreadcrumbLink>    </BreadcrumbItem>    <BreadcrumbSeparator>      <Slash />    </BreadcrumbSeparator>    <BreadcrumbItem>      <BreadcrumbLink href="/components">Components</BreadcrumbLink>    </BreadcrumbItem>  </BreadcrumbList></Breadcrumb>

You can compose <BreadcrumbItem /> with a <DropdownMenu /> to create a dropdown in the breadcrumb.

tsx
import {  DropdownMenu,  DropdownMenuContent,  DropdownMenuItem,  DropdownMenuTrigger,} from "@/components/ui/dropdown-menu"
...
<BreadcrumbItem>  <DropdownMenu>    <DropdownMenuTrigger className="flex items-center gap-1">      Components      <ChevronDownIcon />    </DropdownMenuTrigger>    <DropdownMenuContent align="start">      <DropdownMenuItem>Documentation</DropdownMenuItem>      <DropdownMenuItem>Themes</DropdownMenuItem>      <DropdownMenuItem>GitHub</DropdownMenuItem>    </DropdownMenuContent>  </DropdownMenu></BreadcrumbItem>

Collapsed

We provide a <BreadcrumbEllipsis /> component to show a collapsed state when the breadcrumb is too long.

tsx
import { BreadcrumbEllipsis } from "@/components/ui/breadcrumb"
...
<Breadcrumb>  <BreadcrumbList>    {/* ... */}    <BreadcrumbItem>      <BreadcrumbEllipsis />    </BreadcrumbItem>    {/* ... */}  </BreadcrumbList></Breadcrumb>

Use the render prop on <BreadcrumbLink /> to supply a custom anchor or a routing library’s link component. Custom components must forward native anchor props and refs. The supplied element can own its children.

tsx
<Breadcrumb>  <BreadcrumbList>    <BreadcrumbItem>      <BreadcrumbLink render={<a href="/">Home</a>} />    </BreadcrumbItem>    {/* ... */}  </BreadcrumbList></Breadcrumb>

Card component

You can wrap the breadcrumbs in a Card component to make them stand out more.

tsx
<Card size="sm">  <CardContent>    <Breadcrumb>      <BreadcrumbList>        <BreadcrumbItem>          <BreadcrumbLink aria-label="Home" href="/">            <Home className="size-4" />          </BreadcrumbLink>        </BreadcrumbItem>        <BreadcrumbSeparator />        <BreadcrumbItem>          <BreadcrumbLink href="/">Components</BreadcrumbLink>        </BreadcrumbItem>        <BreadcrumbSeparator />        <BreadcrumbItem>          <BreadcrumbPage>Breadcrumb</BreadcrumbPage>        </BreadcrumbItem>      </BreadcrumbList>    </Breadcrumb>  </CardContent></Card>

Responsive

Here’s an example of a responsive breadcrumb that composes <BreadcrumbItem /> with <BreadcrumbEllipsis />, <DropdownMenu />, and <Drawer />.

It displays a dropdown on desktop and a drawer on mobile. Labels remain readable in full and wrap onto another row when needed, rather than being capped and truncated. Desktop menu destinations use DropdownMenuLinkItem so keyboard selection follows the native link.


Header wrapper

Use the <BreadcrumbHeader /> component to wrap your breadcrumb in a header with consistent layout and spacing. This is particularly useful when integrating breadcrumbs into layouts with collapsible sidebars.

tsx
import { BreadcrumbHeader } from "@/components/ui/breadcrumb"
...
<BreadcrumbHeader>  <Breadcrumb>    <BreadcrumbList>      <BreadcrumbItem>        <BreadcrumbLink href="/">Home</BreadcrumbLink>      </BreadcrumbItem>      <BreadcrumbSeparator />      <BreadcrumbItem>        <BreadcrumbLink href="/components">Components</BreadcrumbLink>      </BreadcrumbItem>      <BreadcrumbSeparator />      <BreadcrumbItem>        <BreadcrumbPage>Breadcrumb</BreadcrumbPage>      </BreadcrumbItem>    </BreadcrumbList>  </Breadcrumb></BreadcrumbHeader>

The header wrapper provides:

  • Fixed height (64px) with responsive behavior for collapsible sidebars (48px)
  • Flexbox layout with consistent gap spacing
  • Smooth width and height transitions

Leading icons

Compose an icon and text inside BreadcrumbLink or BreadcrumbPage. Both parts own their icon alignment and spacing; do not repeat flex or gap classes on them. Size the icon itself as needed.

tsx
<BreadcrumbLink href="/topics">  <Folder className="size-3.5" />  Topics</BreadcrumbLink>

Loading state


Copy resource ID

Credits

  • We take our inspiration from Shadcn UI for the breadcrumb style.

Recent changes

  • patchv1.2.0Pin shipped dependency floors to the version we develop against. Registry items now declare ranges like `^5.1.9` (the actual installed version) instead of collapsing to `^5.0.0`, so consumers start on the known-tested baseline while caret semantics still allow any compatible release within the same major.#133
  • minorv1.1.0Theme docs refresh, readability pass on semantic foregrounds, and consumer-facing Base UI regression fixes.#121
  • minorv1.0.0Post-Base-UI polish. Public API unchanged.#116
  • majorv1.0.0Migrate every Radix-based primitive to `@base-ui/react@^1.4.0` (Base UI).#114
  • patchv0.3.1## 🚧 Updated#112
See full history →

Last updated on

Was this page helpful?