import * as React from "react"
import { ChevronRight, MoreHorizontal } from "lucide-react"
import { cn } from "../libs/utils"
import { Button } from "./button"
interface BreadcrumbProps {
label: string | React.ReactNode
href?: string
onClick?: () => void
}
interface BreadcrumbItemProps {
path: BreadcrumbProps[]
className?: string
maxItems?: number
separator?: React.ReactNode
}
export function Breadcrumbs({ path, maxItems = 3, className, separator }: BreadcrumbItemProps) {
const items = path || [];
const renderBreadcrumbItem = (item: BreadcrumbProps) => {
const shortenedLabel = typeof item.label === "string" && item.label.length > 20
? item.label.slice(0, 17) + "..."
: item.label;
if (item.onClick) {
return {shortenedLabel};
} else if (item.href) {
return {shortenedLabel};
} else {
return {shortenedLabel};
}
};
if (items.length <= maxItems) {
return (
{items.map((item, index) => (
{renderBreadcrumbItem(item)}
{index < items.length - 1 &&
{separator ?? }
}
))}
);
}
const lastThreeItems = items.slice(-(maxItems - 1));
return (
{separator ?? }
{lastThreeItems.map((item, index) => (
{renderBreadcrumbItem(item)}
{index < lastThreeItems.length - 1 && {separator ?? }
}
))}
);
}
const Breadcrumb = React.forwardRef<
HTMLElement,
React.ComponentPropsWithoutRef<"nav"> & {
separator?: React.ReactNode
}
>(({ ...props }, ref) => )
Breadcrumb.displayName = "Breadcrumb"
const BreadcrumbList = React.forwardRef<
HTMLOListElement,
React.ComponentPropsWithoutRef<"ol">
>(({ className, ...props }, ref) => (
))
BreadcrumbList.displayName = "BreadcrumbList"
const BreadcrumbItem = React.forwardRef<
HTMLLIElement,
React.ComponentPropsWithoutRef<"li">
>(({ className, ...props }, ref) => (
))
BreadcrumbItem.displayName = "BreadcrumbItem"
const BreadcrumbLink = React.forwardRef<
HTMLAnchorElement,
React.ComponentPropsWithoutRef<"a"> & {
asChild?: boolean
}
>(({ asChild, className, ...props }, ref) => {
return (
)
})
BreadcrumbLink.displayName = "BreadcrumbLink"
const BreadcrumbButton = React.forwardRef<
HTMLButtonElement,
React.ComponentPropsWithoutRef<"button"> & {
href?: string
}
>(({ className, href, onClick, ...props }, ref) => {
const handleClick = (e: React.MouseEvent) => {
e.preventDefault();
if (onClick) {
onClick(e);
}
};
return (
);
})
BreadcrumbButton.displayName = "BreadcrumbButton"
const BreadcrumbPage = React.forwardRef<
HTMLSpanElement,
React.ComponentPropsWithoutRef<"span">
>(({ className, ...props }, ref) => (
))
BreadcrumbPage.displayName = "BreadcrumbPage"
const BreadcrumbSeparator = ({
children,
className,
...props
}: React.ComponentProps<"li">) => (
svg]:w-3.5 [&>svg]:h-3.5", className)}
{...props}
>
{children ?? }
)
BreadcrumbSeparator.displayName = "BreadcrumbSeparator"
const BreadcrumbEllipsis = ({
className,
...props
}: React.ComponentProps<"span">) => (
More
)
BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis"