|
import { Slot } from '@radix-ui/react-slot'; |
|
import { ChevronRight, MoreHorizontal } from 'lucide-react'; |
|
import * as React from '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]:w-3.5 [&>svg]:h-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, |
|
BreadcrumbEllipsis, |
|
BreadcrumbItem, |
|
BreadcrumbLink, |
|
BreadcrumbList, |
|
BreadcrumbPage, |
|
BreadcrumbSeparator, |
|
}; |
|
|