| import * as React from "react"; |
| import { Slot } from "@radix-ui/react-slot"; |
| import { ChevronRight, MoreHorizontal } from "lucide-react"; |
|
|
| import { cn } from "@/lib/utils"; |
|
|
| const Breadcrumb = React.forwardRef< |
| HTMLElement, |
| React.ComponentPropsWithoutRef<"nav"> & { |
| separator?: React.ReactNode; |
| } |
| >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />); |
| Breadcrumb.displayName = "Breadcrumb"; |
|
|
| const BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<"ol">>( |
| ({ className, ...props }, ref) => ( |
| <ol |
| ref={ref} |
| className={cn( |
| "flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", |
| className, |
| )} |
| {...props} |
| /> |
| ), |
| ); |
| BreadcrumbList.displayName = "BreadcrumbList"; |
|
|
| const BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<"li">>( |
| ({ className, ...props }, ref) => ( |
| <li ref={ref} className={cn("inline-flex items-center gap-1.5", className)} {...props} /> |
| ), |
| ); |
| BreadcrumbItem.displayName = "BreadcrumbItem"; |
|
|
| const BreadcrumbLink = React.forwardRef< |
| HTMLAnchorElement, |
| React.ComponentPropsWithoutRef<"a"> & { |
| asChild?: boolean; |
| } |
| >(({ asChild, className, ...props }, ref) => { |
| const Comp = asChild ? Slot : "a"; |
|
|
| return <Comp ref={ref} className={cn("transition-colors hover:text-foreground", className)} {...props} />; |
| }); |
| BreadcrumbLink.displayName = "BreadcrumbLink"; |
|
|
| const BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<"span">>( |
| ({ className, ...props }, ref) => ( |
| <span |
| ref={ref} |
| role="link" |
| aria-disabled="true" |
| aria-current="page" |
| className={cn("font-normal text-foreground", className)} |
| {...props} |
| /> |
| ), |
| ); |
| BreadcrumbPage.displayName = "BreadcrumbPage"; |
|
|
| const BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<"li">) => ( |
| <li role="presentation" aria-hidden="true" className={cn("[&>svg]:size-3.5", className)} {...props}> |
| {children ?? <ChevronRight />} |
| </li> |
| ); |
| BreadcrumbSeparator.displayName = "BreadcrumbSeparator"; |
|
|
| const BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<"span">) => ( |
| <span |
| role="presentation" |
| aria-hidden="true" |
| className={cn("flex h-9 w-9 items-center justify-center", className)} |
| {...props} |
| > |
| <MoreHorizontal className="h-4 w-4" /> |
| <span className="sr-only">More</span> |
| </span> |
| ); |
| BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"; |
|
|
| export { |
| Breadcrumb, |
| BreadcrumbList, |
| BreadcrumbItem, |
| BreadcrumbLink, |
| BreadcrumbPage, |
| BreadcrumbSeparator, |
| BreadcrumbEllipsis, |
| }; |
|
|