110 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
import * as React from "react"
 | 
						|
import { Slot } from "@radix-ui/react-slot"
 | 
						|
import { ChevronRight, MoreHorizontal } from "lucide-react"
 | 
						|
 | 
						|
import { cn } from "~/lib/utils"
 | 
						|
 | 
						|
function Breadcrumb({ ...props }: React.ComponentProps<"nav">) {
 | 
						|
  return <nav aria-label="breadcrumb" data-slot="breadcrumb" {...props} />
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbList({ className, ...props }: React.ComponentProps<"ol">) {
 | 
						|
  return (
 | 
						|
    <ol
 | 
						|
      data-slot="breadcrumb-list"
 | 
						|
      className={cn(
 | 
						|
        "text-muted-foreground flex flex-wrap items-center gap-1.5 text-sm break-words sm:gap-2.5",
 | 
						|
        className
 | 
						|
      )}
 | 
						|
      {...props}
 | 
						|
    />
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbItem({ className, ...props }: React.ComponentProps<"li">) {
 | 
						|
  return (
 | 
						|
    <li
 | 
						|
      data-slot="breadcrumb-item"
 | 
						|
      className={cn("inline-flex items-center gap-1.5", className)}
 | 
						|
      {...props}
 | 
						|
    />
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbLink({
 | 
						|
  asChild,
 | 
						|
  className,
 | 
						|
  ...props
 | 
						|
}: React.ComponentProps<"a"> & {
 | 
						|
  asChild?: boolean
 | 
						|
}) {
 | 
						|
  const Comp = asChild ? Slot : "a"
 | 
						|
 | 
						|
  return (
 | 
						|
    <Comp
 | 
						|
      data-slot="breadcrumb-link"
 | 
						|
      className={cn("hover:text-foreground transition-colors", className)}
 | 
						|
      {...props}
 | 
						|
    />
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbPage({ className, ...props }: React.ComponentProps<"span">) {
 | 
						|
  return (
 | 
						|
    <span
 | 
						|
      data-slot="breadcrumb-page"
 | 
						|
      role="link"
 | 
						|
      aria-disabled="true"
 | 
						|
      aria-current="page"
 | 
						|
      className={cn("text-foreground font-normal", className)}
 | 
						|
      {...props}
 | 
						|
    />
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbSeparator({
 | 
						|
  children,
 | 
						|
  className,
 | 
						|
  ...props
 | 
						|
}: React.ComponentProps<"li">) {
 | 
						|
  return (
 | 
						|
    <li
 | 
						|
      data-slot="breadcrumb-separator"
 | 
						|
      role="presentation"
 | 
						|
      aria-hidden="true"
 | 
						|
      className={cn("[&>svg]:size-3.5", className)}
 | 
						|
      {...props}
 | 
						|
    >
 | 
						|
      {children ?? <ChevronRight />}
 | 
						|
    </li>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
function BreadcrumbEllipsis({
 | 
						|
  className,
 | 
						|
  ...props
 | 
						|
}: React.ComponentProps<"span">) {
 | 
						|
  return (
 | 
						|
    <span
 | 
						|
      data-slot="breadcrumb-ellipsis"
 | 
						|
      role="presentation"
 | 
						|
      aria-hidden="true"
 | 
						|
      className={cn("flex size-9 items-center justify-center", className)}
 | 
						|
      {...props}
 | 
						|
    >
 | 
						|
      <MoreHorizontal className="size-4" />
 | 
						|
      <span className="sr-only">More</span>
 | 
						|
    </span>
 | 
						|
  )
 | 
						|
}
 | 
						|
 | 
						|
export {
 | 
						|
  Breadcrumb,
 | 
						|
  BreadcrumbList,
 | 
						|
  BreadcrumbItem,
 | 
						|
  BreadcrumbLink,
 | 
						|
  BreadcrumbPage,
 | 
						|
  BreadcrumbSeparator,
 | 
						|
  BreadcrumbEllipsis,
 | 
						|
}
 |