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 (
)}
ref={ref as React.ForwardedRef}
className={itemSeparator({ className: props.className })}
>
{props.children ?? }
)
})
BreadcrumbSeparatorItem.displayName = 'BreadcrumbSeparatorItem'
const BreadcrumbEllipsis = forwardRef<
HTMLSpanElement,
Merge<
React.ComponentPropsWithoutRef<'span'>,
{
iconProps?: React.ComponentProps
}
>
>(({ iconProps, ...props }, ref) => {
const { ellipsis, ellipsisIcon } = breadcrumb()
return (
More
)
})
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 }