"use client"; import * as React from "react"; import { cn } from "./lib/utils"; export interface SidebarV2Item { id: string; label: string; badge?: string | number; children?: { id: string; label: string }[]; } export interface SidebarV2Props extends React.HTMLAttributes { items: SidebarV2Item[]; activeId?: string; onNavigate?: (id: string) => void; title?: string; } /** Two-level collapsible sidebar v2. */ export function SidebarV2({ items, activeId, onNavigate, title = "Menu", className, ...props }: SidebarV2Props) { const [expanded, setExpanded] = React.useState>(new Set()); const [active, setActive] = React.useState(activeId ?? items[0]?.id); const toggle = (id: string) => { setExpanded((prev) => { const next = new Set(prev); if (next.has(id)) next.delete(id); else next.add(id); return next; }); }; const renderItems = (list: SidebarV2Item[], depth: number): React.ReactNode => list.map((item, idx) => { const hasChildren = item.children && item.children.length > 0; const isOpen = expanded.has(item.id); const isActive = active === item.id; return (
  • {hasChildren && isOpen && (
      {renderChildren(item.children!, depth + 1)}
    )}
  • ); }); const renderChildren = (children: NonNullable, depth: number): React.ReactNode => children.map((child) => (
  • )); return ( ); }