import { ChevronRightIcon, EllipsisHorizontalIcon } from '@heroicons/react/16/solid'; import { cn } from 'lib/utils'; import Link, { LinkProps } from 'next/link'; import { ComponentPropsWithoutRef, ReactNode, forwardRef } from 'react'; const Breadcrumb = forwardRef< HTMLElement, React.ComponentPropsWithoutRef<'nav'> & { separator?: React.ReactNode; } >(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />); Breadcrumb.displayName = 'Breadcrumb'; const BreadcrumbList = forwardRef<HTMLOListElement, ComponentPropsWithoutRef<'ol'>>( ({ className, ...props }, ref) => ( <ol ref={ref} className={cn( 'text-muted-foreground flex flex-wrap items-center gap-1.5 break-words text-sm sm:gap-2.5', className )} {...props} /> ) ); BreadcrumbList.displayName = 'BreadcrumbList'; const BreadcrumbItem = 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 = ({ className, children, ...props }: LinkProps & { className?: string; children: ReactNode }) => { return ( <Link className={cn('hover:text-foreground transition-colors', className)} {...props}> {children} </Link> ); }; BreadcrumbLink.displayName = 'BreadcrumbLink'; const BreadcrumbPage = forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>( ({ className, ...props }, ref) => ( <span ref={ref} role="link" aria-disabled="true" aria-current="page" className={cn('text-foreground font-normal', 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 ?? <ChevronRightIcon className="h-4 w-4" />} </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} > <EllipsisHorizontalIcon className="h-4 w-4" /> <span className="sr-only">More</span> </span> ); BreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis'; export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator };