buster/apps/web-tss/src/components/ui/breadcrumb/BreadcrumbBase.tsx

111 lines
3.0 KiB
TypeScript
Raw Normal View History

2025-08-17 05:54:18 +08:00
import { Slot } from '@radix-ui/react-slot';
import * as React from 'react';
import { cn } from '@/lib/utils';
import { ChevronRight, Dots } from '../icons';
const Breadcrumb = React.forwardRef<
HTMLElement,
React.ComponentPropsWithoutRef<'nav'> & {
separator?: React.ReactNode;
}
>(({ ...props }, ref) => (
<nav
ref={ref}
aria-label="breadcrumb"
{...props}
className={cn('flex flex-nowrap overflow-hidden', props.className)}
/>
));
Breadcrumb.displayName = 'Breadcrumb';
const BreadcrumbList = React.forwardRef<HTMLOListElement, React.ComponentPropsWithoutRef<'ol'>>(
({ className, ...props }, ref) => (
<ol
ref={ref}
className={cn(
'text-gray-dark flex flex-nowrap items-center gap-1.5 overflow-hidden text-base break-words sm:gap-2.5',
className
)}
{...props}
/>
)
);
BreadcrumbList.displayName = 'BreadcrumbList';
const BreadcrumbItem = React.forwardRef<HTMLLIElement, React.ComponentPropsWithoutRef<'li'>>(
({ className, ...props }, ref) => (
<li ref={ref} className={cn('inline-flex items-center gap-1.5', className)} {...props} />
)
);
BreadcrumbItem.displayName = 'BreadcrumbItem';
const BreadcrumbLink = React.forwardRef<
HTMLAnchorElement,
React.ComponentPropsWithoutRef<'a'> & {
asChild?: boolean;
}
>(({ asChild, children, className, ...props }, ref) => {
const Comp = asChild ? Slot : 'a';
return (
<Comp ref={ref} className={cn('hover:text-foreground transition-colors', className)} {...props}>
{children}
</Comp>
);
});
BreadcrumbLink.displayName = 'BreadcrumbLink';
const BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWithoutRef<'span'>>(
({ className, ...props }, ref) => (
2025-08-17 05:57:22 +08:00
// biome-ignore lint/a11y/useSemanticElements: I need to spend real time to fix this
2025-08-17 05:54:18 +08:00
<span
ref={ref}
role="link"
aria-disabled="true"
aria-current="page"
className={cn('text-foreground truncate font-normal', className)}
tabIndex={0}
{...props}
/>
)
);
BreadcrumbPage.displayName = 'BreadcrumbPage';
const BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<'li'>) => (
<li
role="presentation"
aria-hidden="true"
className={cn('text-icon-size [&>svg]:h-2.5 [&>svg]:w-2.5', className)}
2025-08-17 05:57:22 +08:00
{...props}
>
2025-08-17 05:54:18 +08:00
{children ?? <ChevronRight />}
</li>
);
BreadcrumbSeparator.displayName = 'BreadcrumbSeparator';
const BreadcrumbEllipsis = ({ className, ...props }: React.ComponentProps<'span'>) => (
<span
role="presentation"
aria-hidden="true"
className={cn('hover:text-foreground flex h-9 w-9 items-center justify-center', className)}
2025-08-17 05:57:22 +08:00
{...props}
>
2025-08-17 05:54:18 +08:00
<div className="text-icon-size flex">
<Dots />
</div>
<span className="sr-only">More</span>
</span>
);
BreadcrumbEllipsis.displayName = 'BreadcrumbElipssis';
export {
Breadcrumb,
BreadcrumbList,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbPage,
BreadcrumbSeparator,
2025-08-17 05:57:22 +08:00
BreadcrumbEllipsis,
2025-08-17 05:54:18 +08:00
};