Breadcrumb
Location trail for the app header - a nav landmark with an ordered list, links, a current page and directional separators.
PreviewOpen ↗
Code
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator,} from "@fadymondy/nasaq/web";export function Trail() { return ( <Breadcrumb> <BreadcrumbList> <BreadcrumbItem> <BreadcrumbLink href="/">3x1</BreadcrumbLink> </BreadcrumbItem> <BreadcrumbSeparator /> <BreadcrumbItem> <BreadcrumbLink href="/projects">Projects</BreadcrumbLink> </BreadcrumbItem> <BreadcrumbSeparator /> <BreadcrumbItem> <BreadcrumbPage>Nasaq</BreadcrumbPage> </BreadcrumbItem> </BreadcrumbList> </Breadcrumb> );}Navigation · stable
Live examples and controls: Breadcrumb in the lab.
Install
npx shadcn@latest add https://docs.nasaqui.com/r/breadcrumb.jsonShows where the user is in a hierarchy (workspace, project, page) and lets them jump back up. It is a
set of small composable parts, not a data-driven component: you write one BreadcrumbItem per level.
It has no story of its own; it appears in the header of the App Shell pattern story.
When to use
- Hierarchies two or more levels deep, in the
AppHeader. - Pages the user can reach from several places, where "where am I" is not obvious.
When not to use
- Primary navigation: use
SidebarItems inAppShell. - Steps in a flow: use a stepper or tabs.
- One-level pages: use a page heading.
Import
import {
Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator,
} from "@fadymondy/nasaq/web";
// inside this monorepo: "@nasaq/web"Quick start
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@fadymondy/nasaq/web";
export function Trail() {
return (
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">3x1</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="/projects">Projects</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Nasaq</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);
}Anatomy
Breadcrumb data-slot="breadcrumb" <nav aria-label="Breadcrumb">
└─ BreadcrumbList data-slot="breadcrumb-list" <ol>
├─ BreadcrumbItem data-slot="breadcrumb-item" <li>
│ └─ BreadcrumbLink data-slot="breadcrumb-link" <a>
├─ BreadcrumbSeparator data-slot="breadcrumb-separator" <li role="presentation" aria-hidden>
└─ BreadcrumbItem
└─ BreadcrumbPage data-slot="breadcrumb-page" <span aria-current="page">API
Every part forwards its element's native props and merges className.
| Export | Element | Own props | Notes |
|---|---|---|---|
Breadcrumb | nav | aria-label (default "Breadcrumb") | Localise the label. |
BreadcrumbList | ol | none | Flex, wraps, gap-1.5, text-body-sm text-muted-foreground. |
BreadcrumbItem | li | none | inline-flex, truncates. |
BreadcrumbLink | a | none | Truncates; hover text-foreground. |
BreadcrumbPage | span | none | The current page: aria-current="page", text-foreground. Not a link. |
BreadcrumbSeparator | li | children?: ReactNode (default a directional chevron) | role="presentation", aria-hidden. Place between items, as a sibling of BreadcrumbItem. |
Examples
Hide the early levels on small screens
import { AppHeader, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, SidebarTrigger } from "@fadymondy/nasaq/web";
export const Header = () => (
<AppHeader>
<SidebarTrigger />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden sm:inline-flex">
<BreadcrumbLink href="/">3x1</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden sm:block" />
<BreadcrumbItem>
<BreadcrumbPage>Dashboard</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</AppHeader>
);Arabic, custom separator
import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator } from "@fadymondy/nasaq/web";
export const Trail = () => (
<Breadcrumb aria-label="مسار التنقل">
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">الرئيسية</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator>/</BreadcrumbSeparator>
<BreadcrumbItem>
<BreadcrumbPage>المشاريع</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);Accessibility
| Key | Action |
|---|---|
Tab | Moves through the links in order. |
Enter | Follows the focused link. |
<nav>landmark named byaria-label, with an ordered list. Separators arearia-hiddenso they are not read.BreadcrumbPagehasaria-current="page"and is not focusable; the current page is also shown by colour and by not being a link.- Links show a focus ring (
nq-focus). - Localise:
aria-labelonBreadcrumb(the default is English).
RTL & i18n
- The default separator is a
directionalchevron, so it flips in RTL and the trail reads right to left. - A custom
childrenseparator is not mirrored for you; use text like/or a directionalIcon. - Long names truncate; pass a
titleif the full text matters.
Styling & tokens
- Text
text-muted-foreground; current page and hovered linkstext-foreground; focus outlinenq-focus. - Target
[data-slot=breadcrumb-link],[data-slot=breadcrumb-page]. Extend throughclassName.
Do / Don't
- Do end with
BreadcrumbPage(the current page), never a link to itself. - Do collapse early levels on narrow screens with
hidden sm:...classes on both item and separator. - Don't put separators inside
BreadcrumbItem; they are siblings in the list. - Don't use breadcrumbs as the only navigation.
Related
- app-shell:
AppHeaderandSidebarTrigger
Lab
https://docs.nasaqui.com/?path=/docs/components-navigation-breadcrumb--docs