Breadcrumb
A trail of locations where the current page sits gently debossed and carries aria-current.
@emboss/breadcrumb
Installation
pnpm dlx shadcn@latest add @emboss/breadcrumbUsage
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from "@/components/ui/breadcrumb";
export function Example() {
return (
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">Bench</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Channel 3</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
);
}API reference
Breadcrumb / BreadcrumbList / BreadcrumbItem / BreadcrumbLink / BreadcrumbPage / BreadcrumbSeparator / BreadcrumbEllipsis
Semantic nav, ordered list, links, the latched current page, and presentation-only separators.
Source
View source — breadcrumb.tsxHide source — breadcrumb.tsx
import { ChevronRight, MoreHorizontal } from "lucide-react";
import { cn } from "@/lib/utils";
/**
* A trail of locations. The current page sits gently debossed — latched
* into the chassis — and carries aria-current.
*
* @example
* <Breadcrumb>
* <BreadcrumbList>
* <BreadcrumbItem><BreadcrumbLink href="/">Bench</BreadcrumbLink></BreadcrumbItem>
* <BreadcrumbSeparator />
* <BreadcrumbItem><BreadcrumbPage>Channel 3</BreadcrumbPage></BreadcrumbItem>
* </BreadcrumbList>
* </Breadcrumb>
*/
function Breadcrumb(props: React.ComponentProps<"nav">) {
return <nav data-slot="breadcrumb" aria-label="Breadcrumb" {...props} />;
}
function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
return (
<ol
data-slot="breadcrumb-list"
className={cn(
"flex flex-wrap items-center gap-1.5 text-sm text-ink-muted",
className,
)}
{...props}
/>
);
}
function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
return (
<li
data-slot="breadcrumb-item"
className={cn("inline-flex items-center gap-1.5", className)}
{...props}
/>
);
}
function BreadcrumbLink({
className,
children,
...props
}: React.ComponentProps<"a">) {
return (
<a
data-slot="breadcrumb-link"
className={cn(
"rounded-xs focus-ring transition-colors hover:text-ink",
className,
)}
{...props}
>
{children}
</a>
);
}
function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
return (
<span
data-slot="breadcrumb-page"
role="link"
aria-disabled="true"
aria-current="page"
className={cn(
"rounded-xs bg-well px-1.5 py-0.5 text-ink shadow-deboss-1",
className,
)}
{...props}
/>
);
}
function BreadcrumbSeparator({
children,
className,
...props
}: React.ComponentProps<"li">) {
return (
<li
data-slot="breadcrumb-separator"
role="presentation"
aria-hidden
className={cn("text-ink-faint [&>svg]:size-3.5", className)}
{...props}
>
{children ?? <ChevronRight />}
</li>
);
}
function BreadcrumbEllipsis({
className,
...props
}: React.ComponentProps<"span">) {
return (
<span
data-slot="breadcrumb-ellipsis"
role="presentation"
aria-hidden
className={cn("flex items-center justify-center", className)}
{...props}
>
<MoreHorizontal className="size-3.5" />
<span className="sr-only">More locations</span>
</span>
);
}
export {
Breadcrumb,
BreadcrumbList,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbPage,
BreadcrumbSeparator,
BreadcrumbEllipsis,
};