- Docs
- Components
- Breadcrumb
Breadcrumb
Breadcrumbs display a hierarchy of links to the current page or resource in an application.
Preview
Code
- Docs
- Components
- Breadcrumb
Installation
CLI
Manual
Copy and paste the following code into your project.
"use client";
import {
Breadcrumb as BreadcrumbPrimitive,
Breadcrumbs as BreadcrumbsPrimitive,
} from "react-aria-components";
import { Link } from "../link/link";
import { BreadcrumbStyles } from "./styles";
const Icons = {
ChevronRight: (props) => (
<svg
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
width={24}
height={24}
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
strokeWidth={2}
strokeLinecap="round"
strokeLinejoin="round"
{...props}
>
<path d="M9 18l6-6-6-6" />
</svg>
),
DotsHorizontal: (props) => (
<svg
aria-hidden="true"
xmlns="http://www.w3.org/2000/svg"
width={32}
height={32}
viewBox="0 0 15 15"
{...props}
>
<path
fill="currentColor"
fillRule="evenodd"
d="M3.625 7.5a1.125 1.125 0 11-2.25 0 1.125 1.125 0 012.25 0m5 0a1.125 1.125 0 11-2.25 0 1.125 1.125 0 012.25 0M12.5 8.625a1.125 1.125 0 100-2.25 1.125 1.125 0 000 2.25"
clipRule="evenodd"
/>
</svg>
),
} as const satisfies Record<
string,
(props: React.ComponentProps<"svg">) => React.JSX.Element
>;
export interface BreadcrumbRootProps<T extends object>
extends React.ComponentProps<typeof BreadcrumbsPrimitive<T>> {}
export function BreadcrumbRoot<T extends object>({
className,
...props
}: BreadcrumbRootProps<T>) {
return (
<BreadcrumbsPrimitive
{...props}
className={BreadcrumbStyles.Root({ className })}
/>
);
}
export interface BreadcrumbItemProps
extends React.ComponentProps<typeof BreadcrumbPrimitive> {}
export function BreadcrumbItem({ className, ...props }: BreadcrumbItemProps) {
return (
<BreadcrumbPrimitive
{...props}
className={(values) =>
BreadcrumbStyles.Item({
className:
typeof className === "function" ? className(values) : className,
})
}
/>
);
}
export interface BreadcrumbLinkProps
extends React.ComponentProps<typeof Link> {}
export function BreadcrumbLink(props: BreadcrumbLinkProps) {
return <Link variant="default" {...props} />;
}
export interface BreadcrumbPageProps extends React.ComponentProps<"span"> {}
export function BreadcrumbPage({ className, ...props }: BreadcrumbPageProps) {
return (
<span
role="link"
tabIndex={-1}
aria-disabled
aria-current="page"
{...props}
className={BreadcrumbStyles.Page({ className })}
/>
);
}
export interface BreadcrumbSeparatorProps
extends React.ComponentProps<typeof BreadcrumbPrimitive> {}
export function BreadcrumbSeparator({
children,
...props
}: BreadcrumbSeparatorProps) {
return (
<BreadcrumbPrimitive {...props}>
{children ?? <Icons.ChevronRight className="size-3.5" />}
</BreadcrumbPrimitive>
);
}
export interface BreadcrumbEllipsisProps
extends Omit<React.ComponentProps<"span">, "children"> {}
export function BreadcrumbEllipsis({
className,
...props
}: BreadcrumbEllipsisProps) {
return (
<span
role="presentation"
aria-hidden
aria-label="More"
{...props}
className={BreadcrumbStyles.Ellipsis({ className })}
>
<Icons.DotsHorizontal className="size-4" />
</span>
);
}
export * from "./breadcrumb";
export * as Breadcrumb from "./namespace";
export * from "./styles";
export {
BreadcrumbRoot as Root,
BreadcrumbItem as Item,
BreadcrumbLink as Link,
BreadcrumbPage as Page,
BreadcrumbSeparator as Separator,
BreadcrumbEllipsis as Ellipsis,
} from "./breadcrumb";
import { cva } from "~/lib/cva";
export const BreadcrumbStyles = {
Root: cva({
base: [
"flex flex-wrap items-center gap-1.5 break-words text-muted-fg text-sm",
"sm:gap-2.5",
],
}),
Item: cva({
base: ["inline-flex items-center gap-1.5"],
}),
Page: cva({
base: ["font-normal text-fg"],
}),
Ellipsis: cva({
base: ["grid size-9 place-content-center"],
}),
};
Update the import paths to match your project setup.
Usage
Single import
import { Breadcrumb } from "~/components/ui/breadcrumb";
<Breadcrumb.Root>
<Breadcrumb.Item>
<Breadcrumb.Link />
</Breadcrumb.Item>
<Breadcrumb.Separator />
<Breadcrumb.Item>
<Breadcrumb.Ellipsis />
</Breadcrumb.Item>
<Breadcrumb.Separator />
<Breadcrumb.Item>
<Breadcrumb.Page />
</Breadcrumb.Item>
</Breadcrumb.Root>
Multiple imports
import {
BreadcrumbRoot,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbSeparator,
BreadcrumbEllipsis,
BreadcrumbPage,
} from "~/components/ui/breadcrumb";
<BreadcrumbRoot>
<BreadcrumbItem>
<BreadcrumbLink />
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbEllipsis />
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage />
</BreadcrumbItem>
</BreadcrumbRoot>
Examples
Default
Preview
Code
- Docs
- Components
- Breadcrumb
Custom Separator
Use a custom component as children
for <BreadcrumbSeparator />{:tsx}
to create a custom separator.
Preview
Code
- Home
- Components
- Breadcrumb
import { Breadcrumb } from "~/components/ui/breadcrumb";
import { Icons } from "~/components/ui/icons";
<Breadcrumb.Root>
{/* ... */}
<Breadcrumb.Separator>
<Icons.Slash className="size-4" />
</Breadcrumb.Separator>
{/* ... */}
</Breadcrumb.Root>;
Dropdown
You can compose <BreadcrumbItem />{:tsx}
with a <DropdownMenu />{:tsx}
to create a dropdown in the breadcrumb.
Preview
Code
- Docs
- Breadcrumb
import { Button } from "react-aria-components";
import { Breadcrumb } from "~/components/ui/breadcrumb";
import { DropdownMenu } from "~/components/ui/dropdown-menu";
import { LinkStyles } from "~/components/ui/link";
import { Popover } from "~/components/ui/popover";
<Breadcrumb.Root>
{/* ... */}
<Breadcrumb.Item>
<DropdownMenu.Root>
<Button className={LinkStyles({ variant: "default" })}>Components</Button>
<Popover.Content>
<Popover.Arrow />
<DropdownMenu.Content>
<DropdownMenu.Item>Documentation</DropdownMenu.Item>
<DropdownMenu.Item>Themes</DropdownMenu.Item>
<DropdownMenu.Item>GitHub</DropdownMenu.Item>
</DropdownMenu.Content>
</Popover.Content>
</DropdownMenu.Root>
</Breadcrumb.Item>
{/* ... */}
</Breadcrumb.Root>;
Collapsed
There's a <BreadcrumbEllipsis />{:tsx}
component to show a collapsed state when the breadcrumb is too long.
Preview
Code
- Home
- Components
- Breadcrumb
import { Breadcrumb } from "~/components/ui/breadcrumb";
<Breadcrumb.Root>
{/* ... */}
<Breadcrumb.Item>
<Breadcrumb.Ellipsis className="size-4" />
</Breadcrumb.Item>
{/* ... */}
</Breadcrumb.Root>;