shadcn primitives and layout route breadcrumbs for dashboard shells, i18n, and detail pages.
Breadcrumbs help users orient themselves in nested apps. Feature Kits ships two layers:
uiBreadcrumb*— accessible primitives (list, links, current page, separator, ellipsis).layoutBreadcrumbs— route-derived trail for dashboard headers (compression, tooltips, copy URL, dynamic?name=labels).
Patterns below mirror production apps (dashboard headers, settings, data tables, auth, and mobile nav).
Installation
Registry CLI
Requires a one-time components.json registry entry for @feature-kit/breadcrumb.
pnpm dlx shadcn@latest add https://feature-kits.vercel.app/r/breadcrumb.jsonNamespaced: npx shadcn@latest add @feature-kit/breadcrumb
Manual installation
Monorepo consumers can depend on workspace:* packages instead of the registry CLI.
pnpm add layout uiDependencies
// apps/your-app/package.json
"dependencies": {
"layout": "workspace:*"
"ui": "workspace:*"
}Transpile (Next.js)
// next.config.ts
transpilePackages: ["layout", "ui"]Import
import { Breadcrumbs, BreadcrumbsSkeleton } from "layout"
import {
Breadcrumb,
BreadcrumbEllipsis,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb"Mount Breadcrumbs in a client layout with next-intl messages for breadcrumb.* keys.
Anatomy
import {
Breadcrumb,
BreadcrumbEllipsis,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/packages/ui/components/breadcrumb"
import { Breadcrumbs, BreadcrumbsSkeleton } from "layout"
import { compressBreadcrumbs, generateBreadcrumbs, resolveCrumbLabel } from "layout/breadcrumb"<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Current</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
{/* App shell */}
<DashboardHeader showBreadcrumbs actions={actions} />Examples
Basic
Custom separator
With icons
Collapsed / ellipsis (deep paths)
Dropdown on ellipsis
Hidden segments open in a menu (same pattern as the layout Breadcrumbs component).
Current page
- Accounts
- Acme Corp
Responsive truncation (mobile)
- Home
- Reports and analytics
- North America
Use cases
Route-based breadcrumbs in the dashboard shell
Mount DashboardHeader in DashboardShell — crumbs read the active pathname (bad-money / ai-chat style).
Dynamic segments (?name=)
Detail routes use resolveCrumbLabel so /accounts/[id] shows the account name from ?name=.
Loading skeleton
Swap in BreadcrumbsSkeleton while the entity name resolves.
i18n ([lang] prefixes)
Pass locale so the home crumb targets /en (or your next-intl prefix).
Nested settings
Long settings paths stay readable; compression kicks in after three segments.
Data table → detail → edit
List
Detail
Edit
Auth routes (hidden)
Disable crumbs on sign-in and marketing auth layouts.
Mobile nav truncation
Use display="inline" and min-w-0 inside the sheet header.
Mobile sheet header: crumbs use min-w-0 and truncate inside the nav bar.
Live path on this page
Component API
Breadcrumb (ui)
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Optional nav wrapper classes. |
| ...props | React.ComponentProps<'nav'> | — | Forwarded to the root <nav>. |
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | List layout; default flex wrap with gap-1.5. |
| ...props | React.ComponentProps<'ol'> | — | Ordered list of items. |
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Inline flex item wrapper. |
| ...props | React.ComponentProps<'li'> | — | Single crumb cell. |
| Prop | Type | Default | Description |
|---|---|---|---|
| asChild | boolean | false | Compose with next/link or router Link. |
| className | string | — | Hover styles for ancestors. |
| ...props | React.ComponentProps<'a'> | — | Anchor props when asChild is false. |
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Current page text styles. |
| ...props | React.ComponentProps<'span'> | — | Sets aria-current="page" on the current crumb. |
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | — | Custom separator; defaults to ChevronRightIcon. |
| className | string | — | Separator spacing. |
| ...props | React.ComponentProps<'li'> | — | role="presentation" aria-hidden. |
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Ellipsis control for collapsed menus. |
| ...props | React.ComponentProps<'span'> | — | MoreHorizontal icon with sr-only "More". |
Breadcrumbs (layout)
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Applied to BreadcrumbList (truncate, flex-1). |
| locale | string | — | Locale prefix for home href (e.g. en → /en). |
| pathname | string | — | Override pathname for tests/docs; defaults to usePathname(). |
| searchParams | SearchParamsLike | — | Override search params when using pathname. |
| display | "header" | "inline" | header | header hides below md; inline always shows (mobile nav). |
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | — | Skeleton bar matching header crumb height. |
| Prop | Type | Default | Description |
|---|---|---|---|
| showBreadcrumbs | boolean | true | Set false on auth/marketing routes. |
| showSidebarTrigger | boolean | true | Sidebar trigger + separator. |
| actions | ReactNode | — | Right-side header actions (theme, user menu). |
| className | string | — | Shell header classes. |
Route helpers (layout/breadcrumb)
| Prop | Type | Default | Description |
|---|---|---|---|
| pathname | string | — | Current pathname (leading slash). |
| searchParams | SearchParamsLike | null | — | Optional query for ?name= labels. |
| Prop | Type | Default | Description |
|---|---|---|---|
| items | Crumb[] | — | Returns visible nodes plus hidden crumbs for the ellipsis menu. |
| Prop | Type | Default | Description |
|---|---|---|---|
| segment | string | — | URL segment. |
| options | { segmentIndex, segments, searchParams? } | — | Resolves ?name= on entity segments. |
Accessibility
- The root
Breadcrumbrenders<nav aria-label="breadcrumb">(shadcn default). BreadcrumbPagesetsaria-current="page"on the current crumb only; ancestors remain links.- Separators and ellipsis use
role="presentation"andaria-hidden="true"so screen readers hear the list, not punctuation. - Icon-only home uses
sr-onlytext; copy-URL exposesaria-labelfrombreadcrumb.copyUrlmessages. - Prefer a single breadcrumb region per page; hide the shell trail on auth with
showBreadcrumbs={false}.