mirror of
https://github.com/SamyRai/turash.git
synced 2025-12-26 23:01:33 +00:00
75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import React from 'react';
|
|
import { clsx } from 'clsx';
|
|
import { ChevronRight, Home } from 'lucide-react';
|
|
import { Link } from 'react-router-dom';
|
|
|
|
export interface BreadcrumbItem {
|
|
label: string;
|
|
href?: string;
|
|
icon?: React.ReactNode;
|
|
}
|
|
|
|
export interface BreadcrumbsProps {
|
|
items: BreadcrumbItem[];
|
|
separator?: React.ReactNode;
|
|
showHome?: boolean;
|
|
className?: string;
|
|
}
|
|
|
|
/**
|
|
* Breadcrumbs navigation component
|
|
*/
|
|
export const Breadcrumbs = ({
|
|
items,
|
|
separator = <ChevronRight className="h-4 w-4 text-muted-foreground" />,
|
|
showHome = true,
|
|
className,
|
|
}: BreadcrumbsProps) => {
|
|
const allItems: BreadcrumbItem[] = showHome
|
|
? [{ label: 'Home', href: '/', icon: <Home className="h-4 w-4" /> }, ...items]
|
|
: items;
|
|
|
|
return (
|
|
<nav className={clsx('flex items-center gap-2 text-sm', className)} aria-label="Breadcrumb">
|
|
<ol className="flex items-center gap-2">
|
|
{allItems.map((item, index) => {
|
|
const isLast = index === allItems.length - 1;
|
|
|
|
return (
|
|
<li key={index} className="flex items-center gap-2">
|
|
{index > 0 && (
|
|
<span className="flex-shrink-0" aria-hidden="true">
|
|
{separator}
|
|
</span>
|
|
)}
|
|
|
|
{isLast ? (
|
|
<span
|
|
className="flex items-center gap-1.5 font-medium text-foreground"
|
|
aria-current="page"
|
|
>
|
|
{item.icon && <span className="flex-shrink-0">{item.icon}</span>}
|
|
{item.label}
|
|
</span>
|
|
) : item.href ? (
|
|
<Link
|
|
to={item.href}
|
|
className="flex items-center gap-1.5 text-muted-foreground hover:text-foreground transition-colors"
|
|
>
|
|
{item.icon && <span className="flex-shrink-0">{item.icon}</span>}
|
|
{item.label}
|
|
</Link>
|
|
) : (
|
|
<span className="flex items-center gap-1.5 text-muted-foreground">
|
|
{item.icon && <span className="flex-shrink-0">{item.icon}</span>}
|
|
{item.label}
|
|
</span>
|
|
)}
|
|
</li>
|
|
);
|
|
})}
|
|
</ol>
|
|
</nav>
|
|
);
|
|
};
|