src/components/ui/breadcrumb.tsx (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
import { cn } from '@/lib/utils' import { ChevronRightIcon, DotsHorizontalIcon } from '@radix-ui/react-icons' import { Slot } from '@radix-ui/react-slot' import * as React from 'react' 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 ?? <ChevronRightIcon />} </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} > <DotsHorizontalIcon className="size-4" /> <span className="sr-only">More</span> </span> ) BreadcrumbEllipsis.displayName = 'BreadcrumbElipssis' export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } |