turash/bugulma/frontend/components/ui/Breadcrumbs.tsx
2025-12-15 10:06:41 +01:00

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>
);
};