import type { ReactNode } from 'react'; import type { SidebarProps, NavItem, NavSection } from './types.js'; function isNavSections(nav: NavItem[] | NavSection[]): nav is NavSection[] { return nav.length > 0 && 'items' in nav[0]; } function NavLink({ item, active, collapsed, onNavigate, }: { item: NavItem; active: boolean; collapsed: boolean; onNavigate?: (href: string) => void; }): ReactNode { if (item.hidden) return null; const handleClick = (e: React.MouseEvent) => { if (onNavigate) { e.preventDefault(); onNavigate(item.href); } }; return ( {item.icon && ( {item.icon} )} {!collapsed && {item.label}} {!collapsed && item.badge !== undefined && ( {item.badge} )} ); } export function Sidebar({ productName, logo, version, nav, pathname, features = {}, onNavigate, footer, collapsed = false, onToggleCollapse, }: SidebarProps): ReactNode { const sections: NavSection[] = isNavSections(nav) ? nav : [{ items: nav }]; const isActive = (href: string) => pathname === href || pathname.startsWith(href + '/'); // Add built-in settings nav if enabled and not already present const hasSettings = features.settings !== false; const allItems = sections.flatMap(s => s.items); const settingsExists = allItems.some(i => i.href === '/settings'); return ( ); }