Openstatus www.openstatus.dev
at main 115 lines 2.7 kB view raw
1import * as React from "react"; 2import { Slot } from "@radix-ui/react-slot"; 3import { ChevronRight, MoreHorizontal } from "lucide-react"; 4 5import { cn } from "../lib/utils"; 6 7const Breadcrumb = React.forwardRef< 8 HTMLElement, 9 React.ComponentPropsWithoutRef<"nav"> & { 10 separator?: React.ReactNode; 11 } 12>(({ ...props }, ref) => <nav ref={ref} aria-label="breadcrumb" {...props} />); 13Breadcrumb.displayName = "Breadcrumb"; 14 15const BreadcrumbList = React.forwardRef< 16 HTMLOListElement, 17 React.ComponentPropsWithoutRef<"ol"> 18>(({ className, ...props }, ref) => ( 19 <ol 20 ref={ref} 21 className={cn( 22 "flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5", 23 className 24 )} 25 {...props} 26 /> 27)); 28BreadcrumbList.displayName = "BreadcrumbList"; 29 30const BreadcrumbItem = React.forwardRef< 31 HTMLLIElement, 32 React.ComponentPropsWithoutRef<"li"> 33>(({ className, ...props }, ref) => ( 34 <li 35 ref={ref} 36 className={cn("inline-flex items-center gap-1.5", className)} 37 {...props} 38 /> 39)); 40BreadcrumbItem.displayName = "BreadcrumbItem"; 41 42const BreadcrumbLink = React.forwardRef< 43 HTMLAnchorElement, 44 React.ComponentPropsWithoutRef<"a"> & { 45 asChild?: boolean; 46 } 47>(({ asChild, className, ...props }, ref) => { 48 const Comp = asChild ? Slot : "a"; 49 50 return ( 51 <Comp 52 ref={ref} 53 className={cn("transition-colors hover:text-foreground", className)} 54 {...props} 55 /> 56 ); 57}); 58BreadcrumbLink.displayName = "BreadcrumbLink"; 59 60const BreadcrumbPage = React.forwardRef< 61 HTMLSpanElement, 62 React.ComponentPropsWithoutRef<"span"> 63>(({ className, ...props }, ref) => ( 64 <span 65 ref={ref} 66 role="link" 67 aria-disabled="true" 68 aria-current="page" 69 className={cn("font-normal text-foreground", className)} 70 {...props} 71 /> 72)); 73BreadcrumbPage.displayName = "BreadcrumbPage"; 74 75const BreadcrumbSeparator = ({ 76 children, 77 className, 78 ...props 79}: React.ComponentProps<"li">) => ( 80 <li 81 role="presentation" 82 aria-hidden="true" 83 className={cn("[&>svg]:w-3.5 [&>svg]:h-3.5", className)} 84 {...props} 85 > 86 {children ?? <ChevronRight />} 87 </li> 88); 89BreadcrumbSeparator.displayName = "BreadcrumbSeparator"; 90 91const BreadcrumbEllipsis = ({ 92 className, 93 ...props 94}: React.ComponentProps<"span">) => ( 95 <span 96 role="presentation" 97 aria-hidden="true" 98 className={cn("flex h-9 w-9 items-center justify-center", className)} 99 {...props} 100 > 101 <MoreHorizontal className="h-4 w-4" /> 102 <span className="sr-only">More</span> 103 </span> 104); 105BreadcrumbEllipsis.displayName = "BreadcrumbElipssis"; 106 107export { 108 Breadcrumb, 109 BreadcrumbList, 110 BreadcrumbItem, 111 BreadcrumbLink, 112 BreadcrumbPage, 113 BreadcrumbSeparator, 114 BreadcrumbEllipsis, 115};