import { Slot } from '@radix-ui/react-slot' import { IconChevronRight, IconDots } from '@tabler/icons-react' import { forwardRef } from 'react' import { tv } from 'tailwind-variants' import type { Merge } from 'type-fest' const breadcrumb = tv({ slots: { root: null, list: 'flex flex-wrap items-center gap-1.5 sm:gap-2.5', item: 'inline-flex items-center gap-1.5', ellipsis: 'flex items-center justify-center', ellipsisIcon: 'size-4', itemLink: 'break-words text-sm text-fg-weaker transition hover:text-fg-weaker--hover', itemPage: 'break-words text-sm text-fg', itemSeparator: 'size-3.5', }, }) const BreadcrumbRoot = forwardRef< React.ElementRef<'nav'>, Merge< React.ComponentPropsWithoutRef<'nav'>, { listProps?: React.ComponentProps<'ol'> } > >(({ listProps, children, ...props }, ref) => { const { root, list } = breadcrumb() return ( ) }) BreadcrumbRoot.displayName = 'BreadcrumbRoot' const BreadcrumbItem = forwardRef>( (props, ref) => { const { item } = breadcrumb() return
  • }, ) BreadcrumbItem.displayName = 'BreadcrumbItem' const BreadcrumbLinkItem = forwardRef< HTMLAnchorElement, Merge< React.ComponentPropsWithoutRef<'a'>, { itemProps?: React.ComponentProps asChild?: boolean } > >(({ itemProps, asChild, ...props }, ref) => { const { itemLink } = breadcrumb() const Comp = asChild ? Slot : 'a' return ( ) }) BreadcrumbLinkItem.displayName = 'BreadcrumbLinkItem' const BreadcrumbPageItem = forwardRef< HTMLSpanElement, Merge< React.ComponentPropsWithoutRef<'span'>, { itemProps?: React.ComponentProps asChild?: boolean } > >(({ itemProps, asChild, ...props }, ref) => { const { itemPage } = breadcrumb() const Comp = asChild ? Slot : 'span' return ( ) }) BreadcrumbPageItem.displayName = 'BreadcrumbPageItem' const BreadcrumbSeparatorItem = forwardRef< React.ComponentRef, Merge< React.ComponentPropsWithoutRef, { itemProps?: React.ComponentProps } > >(({ itemProps, ...props }, ref) => { const { itemSeparator } = breadcrumb() return ( ) }) BreadcrumbSeparatorItem.displayName = 'BreadcrumbSeparatorItem' const BreadcrumbEllipsis = forwardRef< HTMLSpanElement, Merge< React.ComponentPropsWithoutRef<'span'>, { iconProps?: React.ComponentProps } > >(({ iconProps, ...props }, ref) => { const { ellipsis, ellipsisIcon } = breadcrumb() return ( ) }) BreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis' const Breadcrumb = Object.assign(BreadcrumbRoot, { Item: Object.assign(BreadcrumbItem, { Ellipsis: BreadcrumbEllipsis, }), LinkItem: BreadcrumbLinkItem, PageItem: BreadcrumbPageItem, SeparatorItem: BreadcrumbSeparatorItem, }) export default Breadcrumb export { breadcrumb }