'use client'
import * as React from 'react'
import { mergeProps } from '@base-ui/react/merge-props'
import { useRender } from '@base-ui/react/use-render'
import { cn, focusableProps } from '../../internal/utils'
type BreadcrumbProps = React.ComponentPropsWithoutRef<'nav'>
function Breadcrumb({ className, ...props }: BreadcrumbProps) {
return (
)
}
type BreadcrumbListProps = React.ComponentPropsWithoutRef<'ol'>
function BreadcrumbList({ className, ...props }: BreadcrumbListProps) {
return (
)
}
type BreadcrumbItemProps = React.ComponentPropsWithoutRef<'li'>
function BreadcrumbItem({ className, ...props }: BreadcrumbItemProps) {
return (
)
}
type BreadcrumbLinkState = {
active: boolean
disabled: boolean
}
interface BreadcrumbLinkProps extends useRender.ComponentProps<'a', BreadcrumbLinkState> {
/**
* Mark the current page. Renders a non-interactive `` with `aria-current="page"`.
* @default false
*/
active?: boolean
/**
* Make the link non-interactive and dimmed.
* @default false
*/
disabled?: boolean
}
function BreadcrumbLink({ className, active = false, disabled = false, render, ...props }: BreadcrumbLinkProps) {
return useRender({
defaultTagName: active ? 'span' : 'a',
render,
state: { active, disabled } satisfies BreadcrumbLinkState,
props: mergeProps<'a'>(
{
'data-slot': 'breadcrumb-link',
'data-active': active || undefined,
'aria-current': active ? 'page' : undefined,
...focusableProps(active || disabled),
className: cn(
'inline-flex items-center gap-1.5 outline-ring',
'transition duration-250 motion-reduce:transition-none',
active
? 'text-foreground-intense pointer-events-none'
: 'hover:text-foreground-intense ease-[cubic-bezier(0.175,0.885,0.32,1.5)] active:scale-[0.97] active:duration-100 active:ease-in-out active:translate-y-px',
disabled && 'opacity-disabled pointer-events-none',
className,
),
} as unknown as React.AnchorHTMLAttributes,
props,
),
})
}
type BreadcrumbSeparatorProps = React.ComponentPropsWithoutRef<'li'>
function BreadcrumbSeparator({ className, children, ...props }: BreadcrumbSeparatorProps) {
return (
{children ?? }
)
}
function SeparatorIcon() {
return (
)
}
type BreadcrumbEllipsisProps = React.ComponentPropsWithoutRef<'span'>
function BreadcrumbEllipsis({ className, children, ...props }: BreadcrumbEllipsisProps) {
return (
{children ?? }
)
}
function EllipsisMark() {
return (
)
}
export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator, BreadcrumbEllipsis }
export type {
BreadcrumbProps,
BreadcrumbListProps,
BreadcrumbItemProps,
BreadcrumbLinkProps,
BreadcrumbSeparatorProps,
BreadcrumbEllipsisProps,
}