Breadcrumb
A shadcn-style breadcrumb component built with Ark UI primitives.
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
const BreadcrumbDemo = () => (
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="#0">Docs</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="#0">Components</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);
export default BreadcrumbDemo;
Installation
npx shadcn@latest add @ark-cn/breadcrumbInstall the dependency required by this primitive:
npm install @ark-ui/react lucide-reactCopy the component source into your app:
TSXcomponents/ui/breadcrumb.tsx
"use client";
import { ark } from "@ark-ui/react/factory";
import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
import type { ComponentProps } from "react";
import { cn } from "@/lib/utils";
export const Breadcrumb = ({
className,
...props
}: ComponentProps<typeof ark.nav>) => (
<ark.nav
aria-label="breadcrumb"
data-slot="breadcrumb"
className={cn(className)}
{...props}
/>
);
export const BreadcrumbList = ({
className,
...props
}: ComponentProps<typeof ark.ol>) => (
<ark.ol
data-slot="breadcrumb-list"
className={cn(
"flex flex-wrap items-center gap-1.5 text-sm wrap-break-word text-muted-foreground",
className,
)}
{...props}
/>
);
export const BreadcrumbItem = ({
className,
...props
}: ComponentProps<typeof ark.li>) => (
<ark.li
data-slot="breadcrumb-item"
className={cn("inline-flex items-center gap-1", className)}
{...props}
/>
);
export const BreadcrumbLink = ({
className,
...props
}: ComponentProps<typeof ark.a>) => (
<ark.a
data-slot="breadcrumb-link"
className={cn("transition-colors hover:text-foreground", className)}
{...props}
/>
);
export const BreadcrumbPage = ({
className,
...props
}: ComponentProps<typeof ark.span>) => (
<ark.span
data-slot="breadcrumb-page"
role="link"
aria-disabled="true"
aria-current="page"
className={cn("font-normal text-foreground", className)}
{...props}
/>
);
export const BreadcrumbSeparator = ({
children,
className,
...props
}: ComponentProps<typeof ark.li>) => (
<ark.li
data-slot="breadcrumb-separator"
role="presentation"
aria-hidden="true"
className={cn("[&>svg]:size-3.5", className)}
{...props}
>
{children ?? <ChevronRightIcon className="rtl:rotate-180" />}
</ark.li>
);
export const BreadcrumbEllipsis = ({
className,
...props
}: ComponentProps<typeof ark.span>) => (
<ark.span
data-slot="breadcrumb-ellipsis"
role="presentation"
aria-hidden="true"
className={cn(
"flex size-5 items-center justify-center [&>svg]:size-4",
className,
)}
{...props}
>
<MoreHorizontalIcon />
<ark.span className="sr-only">More</ark.span>
</ark.span>
);
Update import aliases to match your project setup.
Usage
import * as Breadcrumb from "@/components/ui/breadcrumb"Read exported parts in src/components/ui/breadcrumb.tsx and compose the primitive according to the Ark UI pattern for this component.
Examples
Default
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
const BreadcrumbDemo = () => (
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="#0">Docs</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="#0">Components</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);
export default BreadcrumbDemo;
With custom separator
import { DotIcon } from "lucide-react";
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
const BreadcrumbCustomSeparatorDemo = () => (
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="#0">Settings</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator>
<DotIcon className="size-3" />
</BreadcrumbSeparator>
<BreadcrumbItem>
<BreadcrumbLink href="#0">Team</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator>
<DotIcon className="size-3" />
</BreadcrumbSeparator>
<BreadcrumbItem>
<BreadcrumbPage>Members</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);
export default BreadcrumbCustomSeparatorDemo;