@humain/ui 2.1.60 → 2.1.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"hf-app-sidebar.js","names":["__iconNode","__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/panel-left-close.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/panel-left-open.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/users.mjs","../../src/components/templates/AppSidebar/AppSidebar.tsx","../../src/wc/hf-app-sidebar.ts"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m16 15-3-3 3-3\", key: \"14y99z\" }]\n];\nconst PanelLeftClose = createLucideIcon(\"panel-left-close\", __iconNode);\n\nexport { __iconNode, PanelLeftClose as default };\n//# sourceMappingURL=panel-left-close.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m14 9 3 3-3 3\", key: \"8010ee\" }]\n];\nconst PanelLeftOpen = createLucideIcon(\"panel-left-open\", __iconNode);\n\nexport { __iconNode, PanelLeftOpen as default };\n//# sourceMappingURL=panel-left-open.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"path\", { d: \"M16 3.128a4 4 0 0 1 0 7.744\", key: \"16gr8j\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }]\n];\nconst Users = createLucideIcon(\"users\", __iconNode);\n\nexport { __iconNode, Users as default };\n//# sourceMappingURL=users.mjs.map\n","/** biome-ignore-all lint/a11y/noNoninteractiveTabindex: ChatList uses tabIndex on scrollable div for keyboard scrolling */\n/** biome-ignore-all lint/a11y/useSemanticElements: NavSection uses role=\"separator\" on inner <div>; ChatList uses role=\"list\" on scrollable div */\n/** biome-ignore-all lint/a11y/useFocusableInteractive: Non-focusable separator per WAI-ARIA spec for decorative separators */\n/** biome-ignore-all lint/a11y/useAriaPropsForRole: Non-focusable separators don't require aria-valuenow per WAI-ARIA spec */\n/** biome-ignore-all lint/a11y/noNoninteractiveElementToInteractiveRole: role=\"separator\" on <div> inside list items for semantic section boundaries */\n\n'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n ChevronRight,\n MessageCircle,\n PanelLeftClose,\n PanelLeftOpen,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Badge } from '@/components/atoms/display/Badge';\nimport { Separator } from '@/components/atoms/layout/Separator';\nimport { Avatar } from '@/components/molecules/data/Avatar';\nimport { BrandIcon } from '@/components/molecules/data/BrandIcon';\nimport {\n PopoverPopup,\n PopoverRoot,\n PopoverTrigger,\n} from '@/components/organisms/overlays/Popover';\nimport {\n Sidebar,\n SidebarAccountSkeleton,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarNavSkeleton,\n SidebarProvider,\n SidebarTrigger,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { Tooltip, TooltipPopup, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\n\nfunction formatAccessibleLabel(\n label: string,\n badge?: string | number | null,\n): string {\n if (badge == null) return label;\n return `${label}, ${typeof badge === 'number' ? `${badge} ${badge === 1 ? 'item' : 'items'}` : badge}`;\n}\n\nfunction getSidebarBgClass(\n isCollapsed: boolean,\n sidebarBgColor?: string,\n): string {\n return isCollapsed ? 'bg-transparent' : (sidebarBgColor ?? 'bg-muted');\n}\n\nfunction getSkeletonCount(count: number | undefined, fallback: number): number {\n return typeof count === 'number' && Number.isFinite(count) && count >= 0\n ? Math.floor(count)\n : fallback;\n}\n\n// ============================================\n// Slot Distribution Hook\n// ============================================\n\nconst APP_SIDEBAR_IMPLICIT_SLOT = Symbol('AppSidebarImplicitSlot');\n\ntype AppSidebarImplicitSlot = 'header' | 'content' | 'footer';\n\ninterface AppSidebarImplicitSlotComponent {\n [APP_SIDEBAR_IMPLICIT_SLOT]: AppSidebarImplicitSlot;\n}\n\ninterface AppSidebarWrappedComponent {\n type?: unknown;\n render?: unknown;\n}\n\nfunction markAppSidebarImplicitSlot<Component extends object>(\n component: Component,\n slot: AppSidebarImplicitSlot,\n): Component & AppSidebarImplicitSlotComponent {\n const slottedComponent = component as Component &\n AppSidebarImplicitSlotComponent;\n slottedComponent[APP_SIDEBAR_IMPLICIT_SLOT] = slot;\n return slottedComponent;\n}\n\nfunction isAppSidebarImplicitSlotComponent(\n value: unknown,\n): value is AppSidebarImplicitSlotComponent {\n return (\n (typeof value === 'function' ||\n (typeof value === 'object' && value !== null)) &&\n APP_SIDEBAR_IMPLICIT_SLOT in value\n );\n}\n\nfunction getAppSidebarImplicitSlot(\n childType: unknown,\n): AppSidebarImplicitSlot | undefined {\n if (isAppSidebarImplicitSlotComponent(childType)) {\n return childType[APP_SIDEBAR_IMPLICIT_SLOT];\n }\n\n if (typeof childType === 'object' && childType !== null) {\n const wrappedComponent = childType as AppSidebarWrappedComponent;\n return (\n getAppSidebarImplicitSlot(wrappedComponent.type) ??\n getAppSidebarImplicitSlot(wrappedComponent.render)\n );\n }\n\n return undefined;\n}\n\ntype SlotResult = {\n header: React.ReactNode[];\n content: React.ReactNode[];\n footer: React.ReactNode[];\n explicitHeader: React.ReactElement | null;\n explicitContent: React.ReactElement | null;\n explicitFooter: React.ReactElement | null;\n};\n\nfunction useSlotChildren(children: React.ReactNode): SlotResult {\n return React.useMemo(() => {\n const result: SlotResult = {\n header: [],\n content: [],\n footer: [],\n explicitHeader: null,\n explicitContent: null,\n explicitFooter: null,\n };\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const childType = child.type;\n\n // Check for explicit slot components\n if (childType === AppSidebarHeader) {\n result.explicitHeader = child;\n return;\n }\n if (childType === AppSidebarContent) {\n result.explicitContent = child;\n return;\n }\n if (childType === AppSidebarFooter) {\n result.explicitFooter = child;\n return;\n }\n\n // Distribute to slots based on explicit component-owned slot markers.\n const implicitSlot = getAppSidebarImplicitSlot(childType);\n if (implicitSlot === 'header') {\n result.header.push(child);\n } else if (implicitSlot === 'content') {\n result.content.push(child);\n } else if (implicitSlot === 'footer') {\n result.footer.push(child);\n } else {\n // Unknown children go to content by default\n result.content.push(child);\n }\n });\n\n return result;\n }, [children]);\n}\n\ntype AppSidebarSide = 'left' | 'right';\ntype AppSidebarDirection = 'ltr' | 'rtl';\n\nconst AppSidebarLayoutContext = React.createContext<{ side: AppSidebarSide }>({\n side: 'left',\n});\n\nfunction useAppSidebarLayout() {\n return React.useContext(AppSidebarLayoutContext);\n}\n\nfunction getAppSidebarDirection(\n element: HTMLElement | null,\n): AppSidebarDirection {\n const win = element?.ownerDocument.defaultView;\n if (!element || !win) return 'ltr';\n return win.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\nfunction normalizeAppSidebarDirection(\n dir: string | undefined,\n): AppSidebarDirection | undefined {\n return dir === 'rtl' || dir === 'ltr' ? dir : undefined;\n}\n\nfunction getAppSidebarSideFromDirection(\n direction: AppSidebarDirection,\n): AppSidebarSide {\n return direction === 'rtl' ? 'right' : 'left';\n}\n\nfunction getAppSidebarDirectionTargets(element: HTMLElement): Element[] {\n const targets = new Set<Element>();\n let current: Element | null = element;\n\n while (current) {\n targets.add(current);\n if (current === element.ownerDocument.documentElement) break;\n current = current.parentElement;\n }\n\n targets.add(element.ownerDocument.documentElement);\n if (element.ownerDocument.body) targets.add(element.ownerDocument.body);\n\n return Array.from(targets);\n}\n\nfunction useResolvedAppSidebarSide({\n containerRef,\n explicitDir,\n explicitSide,\n}: {\n containerRef: React.RefObject<HTMLDivElement | null>;\n explicitDir?: string;\n explicitSide?: AppSidebarSide;\n}): AppSidebarSide {\n const [detectedDirection, setDetectedDirection] =\n React.useState<AppSidebarDirection>(\n () => normalizeAppSidebarDirection(explicitDir) ?? 'ltr',\n );\n\n React.useEffect(() => {\n if (explicitSide) return;\n\n const normalizedExplicitDir = normalizeAppSidebarDirection(explicitDir);\n if (normalizedExplicitDir) {\n setDetectedDirection((current) =>\n current === normalizedExplicitDir ? current : normalizedExplicitDir,\n );\n return;\n }\n\n const container = containerRef.current;\n const win = container?.ownerDocument.defaultView;\n if (!container || !win) return;\n\n const detectDirection = () => {\n const nextDirection = getAppSidebarDirection(container);\n setDetectedDirection((current) =>\n current === nextDirection ? current : nextDirection,\n );\n };\n\n detectDirection();\n\n const Observer = win.MutationObserver;\n if (!Observer) return;\n\n const observer = new Observer(detectDirection);\n for (const target of getAppSidebarDirectionTargets(container)) {\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['dir', 'class', 'style'],\n });\n }\n\n return () => observer.disconnect();\n }, [containerRef, explicitDir, explicitSide]);\n\n return explicitSide ?? getAppSidebarSideFromDirection(detectedDirection);\n}\n\n// ============================================\n// Sidebar Logo\n// ============================================\n\nexport interface AppSidebarLogoProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** Logo image or element */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Subtext displayed below the logo (e.g., \"Dashboard\"). Hidden when collapsed. */\n subtext?: string;\n}\n\nconst DEFAULT_COMPACTED_LOGO = <BrandIcon icon=\"mark\" size=\"lg\" />;\n\nfunction AppSidebarLogo({\n logo,\n compactedLogo,\n subtext,\n className,\n ...props\n}: AppSidebarLogoProps) {\n const { state, toggleSidebar } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const effectiveCompactedLogo = compactedLogo ?? DEFAULT_COMPACTED_LOGO;\n\n if (isCollapsed) {\n return (\n <div\n data-slot=\"app-sidebar-logo\"\n className={cn('flex items-center justify-center', className)}\n {...props}\n dir=\"ltr\"\n >\n <button\n type=\"button\"\n onClick={toggleSidebar}\n className=\"group/logo relative flex min-h-11 min-w-11 items-center justify-center rounded-md p-1 transition-colors duration-200 ease-smooth hover:bg-background focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none\"\n aria-label=\"Expand sidebar\"\n >\n <span className=\"transition-opacity duration-200 ease-smooth group-hover/logo:opacity-0 motion-reduce:transition-none\">\n {effectiveCompactedLogo}\n </span>\n <PanelLeftOpen className=\"absolute size-5 opacity-0 transition-opacity duration-200 ease-smooth group-hover/logo:opacity-100 motion-reduce:transition-none\" />\n </button>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"app-sidebar-logo\"\n className={cn('flex items-center justify-between px-3', className)}\n {...props}\n dir=\"ltr\"\n >\n <div className=\"flex flex-col gap-0\">\n <div className=\"flex items-center gap-2\">\n {logo || (\n <>\n <BrandIcon icon=\"mark\" size=\"lg\" />\n <span className=\"text-lg font-semibold tracking-tight text-foreground\">\n HUMAIN\n </span>\n </>\n )}\n </div>\n {subtext && (\n <p className=\"text-sm text-sidebar-foreground\">{subtext}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={toggleSidebar}\n className=\"relative flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors duration-200 ease-smooth hover:bg-background hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none after:absolute after:-inset-2\"\n aria-label=\"Collapse sidebar\"\n >\n <PanelLeftClose aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n}\n\nAppSidebarLogo.displayName = 'AppSidebar.Logo';\n\n// ============================================\n// Slot Components (Header, Content, Footer)\n// ============================================\n\nexport interface AppSidebarSlotProps {\n children?: React.ReactNode;\n className?: string;\n}\n\nfunction AppSidebarHeader({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-header\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarHeader.displayName = 'AppSidebar.Header';\n\nfunction AppSidebarContent({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-content\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarContent.displayName = 'AppSidebar.Content';\n\nfunction AppSidebarFooter({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-footer\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarFooter.displayName = 'AppSidebar.Footer';\n\n// ============================================\n// Nav Component\n// ============================================\n\nexport interface AppSidebarNavProps {\n children?: React.ReactNode;\n /** Accessible label for the nav landmark (useful when multiple Nav instances exist) */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction AppSidebarNav({\n children,\n 'aria-label': ariaLabel = 'Sidebar navigation',\n className,\n}: AppSidebarNavProps) {\n const menuContent = (\n <SidebarMenu className=\"gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-2\">\n {React.Children.map(children, (child) => (\n <SidebarMenuItem>{child}</SidebarMenuItem>\n ))}\n </SidebarMenu>\n );\n\n return (\n <SidebarGroup\n data-slot=\"app-sidebar-nav\"\n className={cn(\n 'shrink-0 p-0 group-data-[collapsible=icon]:w-auto',\n className,\n )}\n >\n <SidebarGroupContent>\n <nav aria-label={ariaLabel}>{menuContent}</nav>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarNav.displayName = 'AppSidebar.Nav';\nmarkAppSidebarImplicitSlot(AppSidebarNav, 'content');\n\n// ============================================\n// Nav Section (Group Label / Divider)\n// ============================================\n\nexport interface AppSidebarNavSectionProps {\n /** Section label shown when sidebar is expanded */\n label: string;\n /** Additional className */\n className?: string;\n}\n\nfunction AppSidebarNavSection({ label, className }: AppSidebarNavSectionProps) {\n return (\n <div\n data-slot=\"app-sidebar-nav-section\"\n role=\"separator\"\n aria-label={label}\n className={cn('py-2', className)}\n >\n <div className=\"flex h-8 items-center px-2 group-data-[collapsible=icon]:hidden\">\n <span className=\"text-xs font-medium text-sidebar-foreground/80\">\n {label}\n </span>\n </div>\n <div className=\"hidden py-2 group-data-[collapsible=icon]:block\">\n <span className=\"sr-only\">{label}</span>\n <Separator className=\"mx-auto w-8\" />\n </div>\n </div>\n );\n}\n\nAppSidebarNavSection.displayName = 'AppSidebar.NavSection';\n\n// ============================================\n// Nav Item Component\n// ============================================\n\nconst navItemVariants = cva(\n 'relative flex w-full items-center gap-1.5 rounded-md px-2 py-2 text-sm font-normal transition-[color,background-color] duration-200 ease-smooth motion-reduce:transition-none',\n {\n variants: {\n state: {\n default: 'text-sidebar-foreground hover:bg-background',\n active: 'bg-primary/10 text-sidebar-foreground',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n },\n);\n\nexport interface AppSidebarNavItemProps {\n icon: React.ReactNode;\n label: string;\n isActive?: boolean;\n badge?: string | number;\n onClick?: () => void;\n href?: string;\n className?: string;\n /** Sub-navigation children (AppSidebar.NavSub items). When present, renders as collapsible parent. */\n children?: React.ReactNode;\n}\n\nfunction AppSidebarNavItem({\n icon,\n label,\n isActive = false,\n badge,\n onClick,\n href,\n className,\n children,\n}: AppSidebarNavItemProps) {\n const { state, containerRef } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const hasChildren = React.Children.count(children) > 0;\n const [isOpen, setIsOpen] = React.useState(isActive && hasChildren);\n const subNavId = React.useId();\n const floatingSide = sidebarSide === 'right' ? 'left' : 'right';\n const flyoutPanelBackground =\n 'linear-gradient(108deg, var(--opacity-white-87) 0.5219%, var(--opacity-white-75) 98.419%)';\n const flyoutFrameEdgeClassName =\n sidebarSide === 'right'\n ? 'justify-end rounded-l-xl rounded-r-none'\n : 'justify-start rounded-r-xl rounded-l-none';\n const flyoutPanelEdgeClassName =\n sidebarSide === 'right' ? 'rounded-l-xl' : 'rounded-r-xl';\n const flyoutAnchor = React.useMemo(\n () => ({\n getBoundingClientRect: () => {\n const container = containerRef.current;\n const rect = container?.getBoundingClientRect();\n const win = container?.ownerDocument.defaultView;\n const viewportHeight = win?.innerHeight ?? rect?.height ?? 0;\n const x = rect ? (sidebarSide === 'right' ? rect.left : rect.right) : 0;\n\n return {\n x,\n y: 0,\n top: 0,\n right: x,\n bottom: viewportHeight,\n left: x,\n width: 0,\n height: viewportHeight,\n };\n },\n }),\n [containerRef, sidebarSide],\n );\n\n React.useEffect(() => {\n if (isActive && hasChildren) setIsOpen(true);\n }, [isActive, hasChildren]);\n\n const accessibleLabel = formatAccessibleLabel(label, badge);\n\n const iconElement = (\n <span\n data-slot=\"nav-icon\"\n className=\"flex shrink-0 items-center p-0.5 [&>svg]:size-4\"\n >\n {icon}\n </span>\n );\n\n const labelElement = (\n <span className=\"flex-1 text-start group-data-[collapsible=icon]:hidden\">\n {label}\n </span>\n );\n\n const badgeElement = badge != null && (\n <Badge\n size=\"sm\"\n variant=\"soft\"\n color={isActive ? 'secondary' : 'primary'}\n className=\"group-data-[collapsible=icon]:hidden\"\n aria-hidden=\"true\"\n >\n {badge}\n </Badge>\n );\n\n const chevronElement = hasChildren && (\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-4 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth group-data-[collapsible=icon]:hidden motion-reduce:transition-none',\n isOpen ? 'rotate-90' : 'rtl:rotate-180',\n isActive && isOpen && 'text-primary',\n )}\n />\n );\n\n const itemClassName = cn(\n navItemVariants({ state: isActive ? 'active' : 'default' }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'min-h-11 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:py-2 group-data-[collapsible=icon]:w-11 group-data-[collapsible=icon]:h-11',\n className,\n );\n\n const ariaProps = isActive ? { 'aria-current': 'page' as const } : {};\n\n // --- Collapsed: icon-only with tooltip, flyout popover for children ---\n if (isCollapsed) {\n const collapsedIconElement = (\n <span\n data-slot=\"nav-icon\"\n className=\"flex shrink-0 items-center justify-center p-0.5 [&>svg]:size-4\"\n >\n {icon}\n </span>\n );\n\n const triggerElement = href ? (\n <a\n href={href}\n className={cn(itemClassName)}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={hasChildren ? () => setIsOpen(!isOpen) : onClick}\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </button>\n );\n\n if (!hasChildren) {\n if (!label) return triggerElement;\n return (\n <Tooltip>\n <TooltipTrigger render={triggerElement} />\n <TooltipPopup side={floatingSide} sideOffset={8}>\n {label}\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <PopoverRoot>\n <PopoverTrigger\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </PopoverTrigger>\n <PopoverPopup\n side={floatingSide}\n align=\"start\"\n sideOffset={0}\n alignOffset={0}\n anchor={flyoutAnchor}\n collisionAvoidance={{\n side: 'none',\n align: 'none',\n fallbackAxisSide: 'none',\n }}\n positionMethod=\"fixed\"\n aria-label={`${label} sub-navigation`}\n style={\n {\n '--app-sidebar-flyout-panel-bg': flyoutPanelBackground,\n } as React.CSSProperties\n }\n className={cn(\n 'flex h-[var(--anchor-height)] w-[276px] border-0 bg-transparent p-0 ring-0 shadow-none',\n 'overflow-clip',\n flyoutFrameEdgeClassName,\n )}\n >\n <div\n className={cn(\n 'flex h-full w-64 flex-col gap-0.5 overflow-y-auto p-3 shadow-[var(--shadow-hover-card)]',\n 'supports-backdrop-filter:backdrop-blur-[60px] [background-image:var(--app-sidebar-flyout-panel-bg)] delight-tooltip-stagger',\n flyoutPanelEdgeClassName,\n )}\n data-slot=\"app-sidebar-nav-flyout-panel\"\n role=\"group\"\n aria-label={label}\n >\n <p\n className=\"px-2 pb-2 pt-1 text-xs font-semibold text-primary opacity-70\"\n aria-hidden=\"true\"\n >\n {label}\n </p>\n {children}\n </div>\n </PopoverPopup>\n </PopoverRoot>\n );\n }\n\n // --- Expanded: full item with optional inline sub-nav ---\n const handleClick = () => {\n if (hasChildren) {\n setIsOpen(!isOpen);\n }\n onClick?.();\n };\n\n const mainElement =\n href && !hasChildren ? (\n <a\n href={href}\n className={itemClassName}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {iconElement}\n {labelElement}\n {badgeElement}\n {chevronElement}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-controls={hasChildren ? subNavId : undefined}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {iconElement}\n {labelElement}\n {badgeElement}\n {chevronElement}\n </button>\n );\n\n if (!hasChildren) return mainElement;\n\n return (\n <>\n {mainElement}\n {isOpen && (\n <ul\n id={subNavId}\n role=\"group\"\n aria-label={`${label} sub-navigation`}\n className=\"flex flex-col items-start py-1 pl-6\"\n >\n {children}\n </ul>\n )}\n </>\n );\n}\n\nAppSidebarNavItem.displayName = 'AppSidebar.NavItem';\n\n// ============================================\n// Nav Sub Component\n// ============================================\n\nexport interface AppSidebarNavSubProps {\n label: string;\n badge?: string | number;\n isActive?: boolean;\n href?: string;\n onClick?: () => void;\n className?: string;\n}\n\nfunction AppSidebarNavSub({\n label,\n badge,\n isActive = false,\n href,\n onClick,\n className,\n}: AppSidebarNavSubProps) {\n const accessibleLabel = formatAccessibleLabel(label, badge);\n\n const itemClassName = cn(\n navItemVariants({ state: isActive ? 'active' : 'default' }),\n 'min-h-11 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'transition-[color,background-color,transform] ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0',\n className,\n );\n\n const ariaProps = isActive ? { 'aria-current': 'page' as const } : {};\n\n const content = (\n <>\n <span className=\"flex-1 text-start\">{label}</span>\n {badge != null && (\n <Badge\n size=\"sm\"\n variant=\"soft\"\n color={isActive ? 'secondary' : 'primary'}\n aria-hidden=\"true\"\n >\n {badge}\n </Badge>\n )}\n </>\n );\n\n if (href) {\n return (\n <a\n href={href}\n className={itemClassName}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-sub\"\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(itemClassName, 'cursor-pointer delight-selection-press')}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-sub\"\n >\n {content}\n </button>\n );\n}\nAppSidebarNavSub.displayName = 'AppSidebar.NavSub';\n\n// ============================================\n// Nav Skeleton\n// ============================================\n\nexport interface AppSidebarNavSkeletonProps {\n /** Number of skeleton items to show */\n count?: number;\n className?: string;\n}\n\nfunction AppSidebarNavSkeleton({\n count = 3,\n className,\n}: AppSidebarNavSkeletonProps) {\n const skeletonCount = getSkeletonCount(count, 3);\n\n return (\n <SidebarGroup\n className={cn(\n 'shrink-0 p-0 group-data-[collapsible=icon]:w-auto',\n className,\n )}\n >\n <SidebarGroupContent>\n <SidebarMenu className=\"gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-2\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <SidebarMenuItem key={`nav-skeleton-${i}`}>\n <SidebarNavSkeleton />\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarNavSkeleton.displayName = 'AppSidebar.NavSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarNavSkeleton, 'content');\n\n// ============================================\n// Chat List Component\n// ============================================\n\nexport interface AppSidebarChatListProps {\n /** Section label */\n label?: string;\n children?: React.ReactNode;\n className?: string;\n}\n\nfunction AppSidebarChatList({\n label = 'Recent Chats',\n children,\n className,\n}: AppSidebarChatListProps) {\n const { state } = useSidebar();\n const isCollapsed = state === 'collapsed';\n\n // Collapsed state doesn't show chat list\n if (isCollapsed) {\n return null;\n }\n\n return (\n <SidebarGroup\n data-slot=\"app-sidebar-chat-list\"\n className={cn('mt-4 flex min-h-0 flex-1 flex-col p-0', className)}\n >\n <SidebarGroupLabel className=\"shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground\">\n {label}\n </SidebarGroupLabel>\n <SidebarGroupContent className=\"flex-1 overflow-hidden\">\n <div\n className=\"flex h-full flex-col overflow-y-auto pb-5 rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n tabIndex={0}\n role=\"list\"\n aria-label={label}\n >\n {children}\n </div>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarChatList.displayName = 'AppSidebar.ChatList';\nmarkAppSidebarImplicitSlot(AppSidebarChatList, 'content');\n\n// ============================================\n// Chat Item Component\n// ============================================\n\nconst chatItemVariants = cva(\n 'flex w-full items-center justify-between gap-2 rounded-md px-3 py-2 min-h-11 transition-[color,background-color,transform] duration-200 ease-smooth cursor-pointer motion-reduce:transition-none ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0',\n {\n variants: {\n state: {\n default: 'hover:bg-muted',\n hover: 'bg-muted',\n selected: 'bg-primary/10',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n },\n);\n\nexport interface AppSidebarChatItemProps\n extends VariantProps<typeof chatItemVariants> {\n /** Chat title */\n title: string;\n /** Time indicator (e.g., \"12h ago\") */\n time?: string;\n /** Icon for collapsed view (defaults to chat bubble) */\n icon?: React.ReactNode;\n /** Whether this chat is selected */\n isSelected?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Context menu handler (right-click) */\n onContextMenu?: (event: React.MouseEvent) => void;\n /** Additional className */\n className?: string;\n}\n\nfunction AppSidebarChatItem({\n title,\n time,\n icon,\n isSelected = false,\n onClick,\n onContextMenu,\n className,\n}: AppSidebarChatItemProps) {\n const { state } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const tooltipSide = sidebarSide === 'right' ? 'left' : 'right';\n\n if (isCollapsed) {\n const collapsedButton = (\n <button\n type=\"button\"\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-slot=\"app-sidebar-chat-item\"\n aria-label={title || undefined}\n className={cn(\n 'flex size-11 items-center justify-center rounded-md transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n isSelected ? 'bg-primary/10' : 'hover:bg-muted',\n className,\n )}\n >\n {icon || <MessageCircle className=\"size-5 text-secondary-foreground\" />}\n </button>\n );\n\n if (!title && !time) {\n return collapsedButton;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger render={collapsedButton} />\n <TooltipPopup side={tooltipSide} sideOffset={8}>\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{title}</span>\n {time && (\n <span className=\"text-xs text-muted-foreground\">{time}</span>\n )}\n </div>\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <div role=\"listitem\">\n <button\n type=\"button\"\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-slot=\"app-sidebar-chat-item\"\n aria-label={title}\n className={cn(\n chatItemVariants({ state: isSelected ? 'selected' : 'default' }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n <span className=\"text-base font-semibold text-secondary-foreground truncate\">\n {title}\n </span>\n {time && (\n <span className=\"text-xs font-normal text-muted-foreground shrink-0\">\n {time}\n </span>\n )}\n </button>\n </div>\n );\n}\n\nAppSidebarChatItem.displayName = 'AppSidebar.ChatItem';\n\n// ============================================\n// Chat List Skeleton\n// ============================================\n\nexport interface AppSidebarChatListSkeletonProps {\n /** Number of skeleton items to show */\n count?: number;\n /** Section label */\n label?: string;\n className?: string;\n}\n\nfunction AppSidebarChatListSkeleton({\n count = 5,\n label = 'Recent Chats',\n className,\n}: AppSidebarChatListSkeletonProps) {\n const skeletonCount = getSkeletonCount(count, 5);\n\n return (\n <SidebarGroup\n className={cn(\n 'mt-4 flex min-h-0 flex-1 flex-col p-0 group-data-[collapsible=icon]:hidden',\n className,\n )}\n >\n <SidebarGroupLabel className=\"shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground\">\n {label}\n </SidebarGroupLabel>\n <SidebarGroupContent className=\"flex-1 overflow-hidden\">\n <div className=\"flex h-full flex-col overflow-y-auto pb-5\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <SidebarMenuSkeleton key={`chat-skeleton-${i}`} />\n ))}\n </div>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarChatListSkeleton.displayName = 'AppSidebar.ChatListSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarChatListSkeleton, 'content');\n\n// ============================================\n// Account Component\n// ============================================\n\nexport interface AppSidebarAccountProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** User's name */\n name: string;\n /** Subtitle text (e.g., email, role) */\n subtitle?: string;\n /** User's avatar URL */\n avatarSrc?: string;\n /** Whether user is online */\n isOnline?: boolean;\n /** Click handler for the expand button */\n onExpand?: () => void;\n}\n\nfunction AppSidebarAccount({\n name,\n subtitle,\n avatarSrc,\n isOnline = false,\n onExpand,\n className,\n}: AppSidebarAccountProps) {\n const { state } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const tooltipSide = sidebarSide === 'right' ? 'left' : 'right';\n\n if (isCollapsed) {\n const avatarButton = (\n <button\n type=\"button\"\n onClick={onExpand}\n data-slot=\"app-sidebar-account\"\n aria-label={name ? `${name} account menu` : 'Account menu'}\n aria-haspopup=\"true\"\n className={cn(\n 'flex items-center justify-center rounded-lg transition-opacity duration-200 ease-smooth hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n className,\n )}\n >\n <Avatar\n src={avatarSrc}\n alt={name}\n fallback={name}\n size=\"sm\"\n indicator={isOnline ? 'online' : undefined}\n />\n </button>\n );\n\n if (!name && !subtitle) return avatarButton;\n\n return (\n <Tooltip>\n <TooltipTrigger render={avatarButton} />\n <TooltipPopup side={tooltipSide} sideOffset={8}>\n <div className=\"flex flex-col\">\n {name && <span className=\"font-medium\">{name}</span>}\n {subtitle && (\n <span className=\"text-xs text-muted-foreground\">{subtitle}</span>\n )}\n </div>\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onExpand}\n data-slot=\"app-sidebar-account\"\n aria-label={name ? `${name} account menu` : 'Account menu'}\n aria-haspopup=\"true\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md p-2 transition-colors duration-200 ease-smooth hover:bg-background focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n className,\n )}\n >\n <Avatar\n src={avatarSrc}\n alt={name}\n fallback={name}\n size=\"sm\"\n indicator={isOnline ? 'online' : undefined}\n />\n <div className=\"flex flex-1 flex-col items-start overflow-hidden\">\n <span className=\"w-full truncate text-start text-sm font-medium text-sidebar-foreground\">\n {name}\n </span>\n {subtitle && (\n <span className=\"w-full truncate text-start text-xs font-light text-sidebar-foreground\">\n {subtitle}\n </span>\n )}\n </div>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 text-muted-foreground rtl:rotate-180\"\n />\n </button>\n );\n}\n\nAppSidebarAccount.displayName = 'AppSidebar.Account';\nmarkAppSidebarImplicitSlot(AppSidebarAccount, 'footer');\n\n// ============================================\n// Account Skeleton\n// ============================================\n\nfunction AppSidebarAccountSkeleton({ className }: { className?: string }) {\n return <SidebarAccountSkeleton className={className} />;\n}\n\nAppSidebarAccountSkeleton.displayName = 'AppSidebar.AccountSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarAccountSkeleton, 'footer');\n\n// ============================================\n// Full Sidebar Skeleton\n// ============================================\n\nexport interface AppSidebarSkeletonProps {\n /** Number of nav skeleton items */\n navCount?: number;\n /** Number of chat skeleton items */\n chatCount?: number;\n /** Logo element */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Collapsible mode */\n collapsible?: 'offcanvas' | 'icon' | 'none';\n /** Side of the screen */\n side?: 'left' | 'right';\n /** Whether to round sidebar corners */\n rounded?: boolean;\n /** Custom background color class for the sidebar (e.g., 'bg-card') */\n sidebarBgColor?: string;\n className?: string;\n}\n\nfunction AppSidebarSkeleton({\n navCount = 4,\n chatCount = 5,\n logo,\n compactedLogo,\n collapsible = 'icon',\n side,\n rounded = false,\n sidebarBgColor,\n className,\n}: AppSidebarSkeletonProps) {\n const { state, containerRef } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const resolvedSide = useResolvedAppSidebarSide({\n containerRef,\n explicitSide: side,\n });\n\n const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);\n\n return (\n <Sidebar\n collapsible={collapsible}\n side={resolvedSide}\n rounded={rounded}\n className={cn(bgClass, className)}\n >\n <SidebarHeader className=\"gap-4 pb-0 pt-6 group-data-[collapsible=icon]:px-4\">\n <AppSidebarLogo logo={logo} compactedLogo={compactedLogo} />\n </SidebarHeader>\n\n <SidebarContent className=\"flex flex-col gap-0 overflow-hidden px-3 py-4 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n <AppSidebarNavSkeleton count={navCount} />\n <AppSidebarChatListSkeleton count={chatCount} />\n </SidebarContent>\n\n <SidebarFooter className=\"gap-4 px-4 pb-6 pt-0 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n <AppSidebarAccountSkeleton />\n </SidebarFooter>\n </Sidebar>\n );\n}\n\nAppSidebarSkeleton.displayName = 'AppSidebar.Skeleton';\n\n// ============================================\n// Main App Sidebar\n// ============================================\n\nexport interface AppSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Logo element or configuration */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Subtext displayed below the logo (e.g., \"Dashboard\"). Hidden when collapsed. */\n logoSubtext?: string;\n /** Collapsible mode - 'icon' shows only icons when collapsed, 'none' disables collapsing */\n collapsible?: 'offcanvas' | 'icon' | 'none';\n /** Side of the screen. When omitted, resolves from the nearest DOM direction. */\n side?: 'left' | 'right';\n /** Whether to round sidebar corners */\n rounded?: boolean;\n /** Custom background color class for the sidebar (e.g., 'bg-card'). Defaults to bg-muted when expanded, bg-transparent when collapsed. */\n sidebarBgColor?: string;\n /** Children (compound components) */\n children?: React.ReactNode;\n}\n\n/**\n * AppSidebar is a full-featured application sidebar with navigation, chat list, and account sections.\n * Supports collapsible modes with a unified logo toggle and loading skeletons.\n *\n * @llms Full-featured app sidebar with nav, chat list, account, collapsible modes\n * @example\n * ```tsx\n * <AppSidebar logo={<Logo />} collapsible=\"icon\">\n * <AppSidebar.Nav>\n * <AppSidebar.NavItem icon={<Home />} label=\"Home\" isActive />\n * </AppSidebar.Nav>\n * <AppSidebar.ChatList>\n * <AppSidebar.ChatItem title=\"Chat 1\" />\n * </AppSidebar.ChatList>\n * <AppSidebar.Account name=\"User\" subtitle=\"user@example.com\" />\n * </AppSidebar>\n * ```\n */\nfunction AppSidebarRoot({\n logo,\n compactedLogo,\n logoSubtext,\n collapsible = 'icon',\n side,\n rounded = false,\n sidebarBgColor,\n className,\n children,\n dir,\n ...props\n}: AppSidebarProps) {\n const { state, containerRef } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const resolvedSide = useResolvedAppSidebarSide({\n containerRef,\n explicitDir: dir,\n explicitSide: side,\n });\n\n const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);\n\n const slots = useSlotChildren(children);\n\n return (\n <AppSidebarLayoutContext.Provider value={{ side: resolvedSide }}>\n <Sidebar\n collapsible={collapsible}\n side={resolvedSide}\n rounded={rounded}\n dir={dir}\n className={cn(bgClass, className)}\n {...props}\n >\n <SidebarHeader className=\"gap-4 pb-0 pt-6 group-data-[collapsible=icon]:px-4\">\n <AppSidebarLogo\n logo={logo}\n compactedLogo={compactedLogo}\n subtext={logoSubtext}\n />\n </SidebarHeader>\n\n <SidebarContent className=\"flex flex-col gap-0 overflow-hidden px-3 py-4 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n {slots.explicitContent\n ? (slots.explicitContent.props as AppSidebarSlotProps).children\n : slots.content}\n </SidebarContent>\n\n <SidebarFooter className=\"gap-4 px-4 pb-6 pt-0 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n {slots.explicitFooter\n ? (slots.explicitFooter.props as AppSidebarSlotProps).children\n : slots.footer}\n </SidebarFooter>\n </Sidebar>\n </AppSidebarLayoutContext.Provider>\n );\n}\n\nAppSidebarRoot.displayName = 'AppSidebar';\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const AppSidebar = Object.assign(AppSidebarRoot, {\n Header: AppSidebarHeader,\n Content: AppSidebarContent,\n Footer: AppSidebarFooter,\n Nav: AppSidebarNav,\n NavSection: AppSidebarNavSection,\n NavItem: AppSidebarNavItem,\n NavSub: AppSidebarNavSub,\n NavSkeleton: AppSidebarNavSkeleton,\n ChatList: AppSidebarChatList,\n ChatItem: AppSidebarChatItem,\n ChatListSkeleton: AppSidebarChatListSkeleton,\n Account: AppSidebarAccount,\n AccountSkeleton: AppSidebarAccountSkeleton,\n Skeleton: AppSidebarSkeleton,\n});\n\n// ============================================\n// Type Exports\n// ============================================\n\n// Re-export mobile detection utilities for client use\nexport { MOBILE_BREAKPOINT, useIsMobile } from '@/hooks/use-mobile';\nexport type {\n AppSidebarAccountProps as AccountProps,\n AppSidebarChatItemProps as ChatItemProps,\n AppSidebarChatListProps as ChatListProps,\n AppSidebarChatListSkeletonProps as ChatListSkeletonProps,\n AppSidebarNavItemProps as NavItemProps,\n AppSidebarNavProps as NavProps,\n AppSidebarNavSectionProps as NavSectionProps,\n AppSidebarNavSkeletonProps as NavSkeletonProps,\n AppSidebarNavSubProps as NavSubProps,\n AppSidebarSkeletonProps as SkeletonProps,\n AppSidebarSlotProps as SlotProps,\n};\n// Re-export sidebar primitives for custom compositions\nexport {\n chatItemVariants,\n navItemVariants,\n // Re-export base components for advanced usage\n Sidebar,\n SidebarAccountSkeleton,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarNavSkeleton,\n SidebarProvider,\n SidebarTrigger,\n useSidebar,\n};\n","/**\n * Web Component wrapper for AppSidebar (hand-crafted WC adapter).\n * Custom element: <hf-app-sidebar>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport {\n Calendar,\n Circle,\n FileText,\n Home,\n type LucideIcon,\n MessageCircle,\n Settings,\n Users,\n Workflow,\n} from 'lucide-react';\nimport React from 'react';\nimport { AppSidebar } from '../components';\nimport { SidebarInset, SidebarProvider } from '../components/ui/sidebar';\nimport {\n asArray,\n BaseCompoundWC,\n camelToKebab,\n dispatchEvent,\n installPropAccessors,\n type PropDefs,\n portalNode,\n registerWC,\n} from './_shared';\n\nconst PROP_DEFS: PropDefs = {\n navItems: 'json',\n activeNavItemId: 'string',\n account: 'json',\n logo: 'json',\n collapsible: 'string',\n connected: 'boolean',\n defaultOpen: 'boolean',\n side: 'string',\n compactedLogo: 'string',\n sidebarBgColor: 'string',\n rounded: 'boolean',\n logoSubtext: 'string',\n};\n\ntype NavSubItemDef = {\n label: string;\n badge?: string | number;\n href?: string;\n isActive?: boolean;\n};\n\ntype NavItemDef = {\n type?: 'item';\n id: string;\n icon?: string;\n label: string;\n isActive?: boolean;\n badge?: string | number;\n href?: string;\n children?: NavSubItemDef[];\n};\n\ntype NavSectionDef = {\n type: 'section';\n id?: string;\n label: string;\n};\n\ntype NavEntryDef = NavItemDef | NavSectionDef;\n\ntype LogoDef = {\n src?: string;\n alt?: string;\n};\n\nconst SIDEBAR_ICON_COMPONENTS: Record<string, LucideIcon> = {\n home: Home,\n users: Users,\n calendar: Calendar,\n 'file-text': FileText,\n settings: Settings,\n 'message-circle': MessageCircle,\n workflow: Workflow,\n};\n\nconst warnedUnsupportedIconNames = new Set<string>();\n\nfunction normalizeIconName(iconName: string | undefined): string | undefined {\n const normalizedIconName = iconName\n ?.trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n return normalizedIconName || undefined;\n}\n\nfunction renderNavIcon(iconName: string | undefined): React.ReactElement {\n const normalizedIconName = normalizeIconName(iconName);\n\n if (normalizedIconName) {\n const Icon = SIDEBAR_ICON_COMPONENTS[normalizedIconName];\n\n if (Icon) {\n return React.createElement(Icon, { 'aria-hidden': true });\n }\n\n if (!warnedUnsupportedIconNames.has(normalizedIconName)) {\n warnedUnsupportedIconNames.add(normalizedIconName);\n console.warn(\n `[hf-app-sidebar] Unsupported nav item icon \"${normalizedIconName}\". Falling back to \"circle\".`,\n );\n }\n }\n\n return React.createElement(Circle, { 'aria-hidden': true });\n}\n\nfunction isNavSection(item: NavEntryDef): item is NavSectionDef {\n return item.type === 'section';\n}\n\nfunction renderLogoImage(\n logo: LogoDef | undefined,\n fallbackAlt: string,\n): React.ReactElement | null | undefined {\n if (!logo) {\n return undefined;\n }\n\n if (!logo.src) {\n return null;\n }\n\n return React.createElement('img', {\n src: logo.src,\n alt: logo.alt || fallbackAlt,\n });\n}\n\nclass AppSidebarWC extends BaseCompoundWC {\n get propDefs() {\n return PROP_DEFS;\n }\n\n static get observedAttributes() {\n return Object.keys(PROP_DEFS).map(camelToKebab);\n }\n\n protected _renderReact(): React.ReactElement {\n const props = this._readAllProps();\n const contentSlot = this._getSlot('content');\n\n const navItems = asArray<NavEntryDef>(props.navItems);\n\n const account = props.account as\n | {\n name: string;\n subtitle: string;\n avatarSrc?: string;\n isOnline?: boolean;\n }\n | undefined;\n\n const logo = props.logo as LogoDef | undefined;\n const compactedLogo = props.compactedLogo\n ? renderLogoImage(\n { src: String(props.compactedLogo), alt: logo?.alt },\n logo?.alt || 'Logo',\n )\n : undefined;\n const host = this;\n\n function handleNavItemClick(item: { id: string; label: string }): void {\n dispatchEvent(host, 'nav-item-click', item);\n }\n\n function handleOpenChange(open: boolean): void {\n dispatchEvent(host, 'open-change', open);\n }\n\n const sidebarChildren: React.ReactElement[] = [];\n\n sidebarChildren.push(\n React.createElement(\n AppSidebar,\n {\n key: 'sidebar',\n collapsible:\n (props.collapsible as 'offcanvas' | 'icon' | 'none') || 'icon',\n side: (props.side as 'left' | 'right') || 'left',\n rounded: props.rounded as boolean,\n sidebarBgColor: props.sidebarBgColor as string,\n logoSubtext: props.logoSubtext as string,\n logo: renderLogoImage(logo, 'Logo'),\n compactedLogo,\n },\n navItems.length > 0 &&\n React.createElement(\n AppSidebar.Nav,\n { key: 'nav' },\n ...navItems.map((item, index) => {\n if (isNavSection(item)) {\n return React.createElement(AppSidebar.NavSection, {\n key: item.id || `section-${index}`,\n label: item.label,\n });\n }\n\n return React.createElement(\n AppSidebar.NavItem,\n {\n key: item.id,\n icon: renderNavIcon(item.icon),\n label: item.label,\n isActive: item.isActive || item.id === props.activeNavItemId,\n badge: item.badge,\n href: item.href,\n onClick: () => handleNavItemClick(item),\n },\n ...(item.children\n ? item.children.map((child, idx) =>\n React.createElement(AppSidebar.NavSub, {\n key: `${item.id}-sub-${idx}`,\n label: child.label,\n badge: child.badge,\n href: child.href,\n isActive: child.isActive,\n }),\n )\n : []),\n );\n }),\n ),\n account &&\n React.createElement(AppSidebar.Account, {\n key: 'account',\n name: account.name,\n subtitle: account.subtitle,\n avatarSrc: account.avatarSrc,\n isOnline: account.isOnline,\n }),\n ),\n );\n\n if (contentSlot) {\n sidebarChildren.push(\n React.createElement(\n SidebarInset,\n { key: 'inset', connected: props.connected as boolean },\n portalNode(contentSlot),\n ),\n );\n }\n\n return React.createElement(\n SidebarProvider,\n {\n defaultOpen: (props.defaultOpen as boolean) ?? false,\n onOpenChange: handleOpenChange,\n connected: props.connected as boolean,\n },\n ...sidebarChildren,\n );\n }\n}\n\ninstallPropAccessors(AppSidebarWC, PROP_DEFS);\nregisterWC('hf-app-sidebar', AppSidebarWC);\n\nexport { AppSidebarWC };\nexport default AppSidebarWC;\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"hf-app-sidebar.js","names":["__iconNode","__iconNode"],"sources":["../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/panel-left-close.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/panel-left-open.mjs","../../../../../../../../../../../Users/akarim/Documents/test/humain_foundation_ui/node_modules/.bun/lucide-react@1.25.0+0f58469d5b3bd39f/node_modules/lucide-react/dist/esm/icons/users.mjs","../../src/components/templates/AppSidebar/AppSidebar.tsx","../../src/wc/hf-app-sidebar.ts"],"sourcesContent":["/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m16 15-3-3 3-3\", key: \"14y99z\" }]\n];\nconst PanelLeftClose = createLucideIcon(\"panel-left-close\", __iconNode);\n\nexport { __iconNode, PanelLeftClose as default };\n//# sourceMappingURL=panel-left-close.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M9 3v18\", key: \"fh3hqa\" }],\n [\"path\", { d: \"m14 9 3 3-3 3\", key: \"8010ee\" }]\n];\nconst PanelLeftOpen = createLucideIcon(\"panel-left-open\", __iconNode);\n\nexport { __iconNode, PanelLeftOpen as default };\n//# sourceMappingURL=panel-left-open.mjs.map\n","/**\n * @license lucide-react v1.25.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\", key: \"1yyitq\" }],\n [\"path\", { d: \"M16 3.128a4 4 0 0 1 0 7.744\", key: \"16gr8j\" }],\n [\"path\", { d: \"M22 21v-2a4 4 0 0 0-3-3.87\", key: \"kshegd\" }],\n [\"circle\", { cx: \"9\", cy: \"7\", r: \"4\", key: \"nufk8\" }]\n];\nconst Users = createLucideIcon(\"users\", __iconNode);\n\nexport { __iconNode, Users as default };\n//# sourceMappingURL=users.mjs.map\n","/** biome-ignore-all lint/a11y/noNoninteractiveTabindex: ChatList uses tabIndex on scrollable div for keyboard scrolling */\n/** biome-ignore-all lint/a11y/useSemanticElements: NavSection uses role=\"separator\" on inner <div>; ChatList uses role=\"list\" on scrollable div */\n/** biome-ignore-all lint/a11y/useFocusableInteractive: Non-focusable separator per WAI-ARIA spec for decorative separators */\n/** biome-ignore-all lint/a11y/useAriaPropsForRole: Non-focusable separators don't require aria-valuenow per WAI-ARIA spec */\n/** biome-ignore-all lint/a11y/noNoninteractiveElementToInteractiveRole: role=\"separator\" on <div> inside list items for semantic section boundaries */\n\n'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n ChevronRight,\n MessageCircle,\n PanelLeftClose,\n PanelLeftOpen,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { Badge } from '@/components/atoms/display/Badge';\nimport { Separator } from '@/components/atoms/layout/Separator';\nimport { Avatar } from '@/components/molecules/data/Avatar';\nimport { BrandIcon } from '@/components/molecules/data/BrandIcon';\nimport {\n PopoverPopup,\n PopoverRoot,\n PopoverTrigger,\n} from '@/components/organisms/overlays/Popover';\nimport {\n Sidebar,\n SidebarAccountSkeleton,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarNavSkeleton,\n SidebarProvider,\n SidebarTrigger,\n useSidebar,\n} from '@/components/ui/sidebar';\nimport { Tooltip, TooltipPopup, TooltipTrigger } from '@/components/ui/tooltip';\nimport { cn } from '@/lib/utils';\n\nfunction formatAccessibleLabel(\n label: string,\n badge?: string | number | null,\n): string {\n if (badge == null) return label;\n return `${label}, ${typeof badge === 'number' ? `${badge} ${badge === 1 ? 'item' : 'items'}` : badge}`;\n}\n\nfunction getSidebarBgClass(\n isCollapsed: boolean,\n sidebarBgColor?: string,\n): string {\n return isCollapsed ? 'bg-transparent' : (sidebarBgColor ?? 'bg-muted');\n}\n\nfunction getSkeletonCount(count: number | undefined, fallback: number): number {\n return typeof count === 'number' && Number.isFinite(count) && count >= 0\n ? Math.floor(count)\n : fallback;\n}\n\n// ============================================\n// Slot Distribution Hook\n// ============================================\n\nconst APP_SIDEBAR_IMPLICIT_SLOT = Symbol('AppSidebarImplicitSlot');\n\ntype AppSidebarImplicitSlot = 'header' | 'content' | 'footer';\n\ninterface AppSidebarImplicitSlotComponent {\n [APP_SIDEBAR_IMPLICIT_SLOT]: AppSidebarImplicitSlot;\n}\n\ninterface AppSidebarWrappedComponent {\n type?: unknown;\n render?: unknown;\n}\n\nfunction markAppSidebarImplicitSlot<Component extends object>(\n component: Component,\n slot: AppSidebarImplicitSlot,\n): Component & AppSidebarImplicitSlotComponent {\n const slottedComponent = component as Component &\n AppSidebarImplicitSlotComponent;\n slottedComponent[APP_SIDEBAR_IMPLICIT_SLOT] = slot;\n return slottedComponent;\n}\n\nfunction isAppSidebarImplicitSlotComponent(\n value: unknown,\n): value is AppSidebarImplicitSlotComponent {\n return (\n (typeof value === 'function' ||\n (typeof value === 'object' && value !== null)) &&\n APP_SIDEBAR_IMPLICIT_SLOT in value\n );\n}\n\nfunction getAppSidebarImplicitSlot(\n childType: unknown,\n): AppSidebarImplicitSlot | undefined {\n if (isAppSidebarImplicitSlotComponent(childType)) {\n return childType[APP_SIDEBAR_IMPLICIT_SLOT];\n }\n\n if (typeof childType === 'object' && childType !== null) {\n const wrappedComponent = childType as AppSidebarWrappedComponent;\n return (\n getAppSidebarImplicitSlot(wrappedComponent.type) ??\n getAppSidebarImplicitSlot(wrappedComponent.render)\n );\n }\n\n return undefined;\n}\n\ntype SlotResult = {\n header: React.ReactNode[];\n content: React.ReactNode[];\n footer: React.ReactNode[];\n explicitHeader: React.ReactElement | null;\n explicitContent: React.ReactElement | null;\n explicitFooter: React.ReactElement | null;\n};\n\nfunction useSlotChildren(children: React.ReactNode): SlotResult {\n return React.useMemo(() => {\n const result: SlotResult = {\n header: [],\n content: [],\n footer: [],\n explicitHeader: null,\n explicitContent: null,\n explicitFooter: null,\n };\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n\n const childType = child.type;\n\n // Check for explicit slot components\n if (childType === AppSidebarHeader) {\n result.explicitHeader = child;\n return;\n }\n if (childType === AppSidebarContent) {\n result.explicitContent = child;\n return;\n }\n if (childType === AppSidebarFooter) {\n result.explicitFooter = child;\n return;\n }\n\n // Distribute to slots based on explicit component-owned slot markers.\n const implicitSlot = getAppSidebarImplicitSlot(childType);\n if (implicitSlot === 'header') {\n result.header.push(child);\n } else if (implicitSlot === 'content') {\n result.content.push(child);\n } else if (implicitSlot === 'footer') {\n result.footer.push(child);\n } else {\n // Unknown children go to content by default\n result.content.push(child);\n }\n });\n\n return result;\n }, [children]);\n}\n\ntype AppSidebarSide = 'left' | 'right';\ntype AppSidebarDirection = 'ltr' | 'rtl';\n\nconst AppSidebarLayoutContext = React.createContext<{ side: AppSidebarSide }>({\n side: 'left',\n});\n\nfunction useAppSidebarLayout() {\n return React.useContext(AppSidebarLayoutContext);\n}\n\nfunction getAppSidebarDirection(\n element: HTMLElement | null,\n): AppSidebarDirection {\n const win = element?.ownerDocument.defaultView;\n if (!element || !win) return 'ltr';\n return win.getComputedStyle(element).direction === 'rtl' ? 'rtl' : 'ltr';\n}\n\nfunction normalizeAppSidebarDirection(\n dir: string | undefined,\n): AppSidebarDirection | undefined {\n return dir === 'rtl' || dir === 'ltr' ? dir : undefined;\n}\n\nfunction getAppSidebarSideFromDirection(\n direction: AppSidebarDirection,\n): AppSidebarSide {\n return direction === 'rtl' ? 'right' : 'left';\n}\n\nfunction getAppSidebarDirectionTargets(element: HTMLElement): Element[] {\n const targets = new Set<Element>();\n let current: Element | null = element;\n\n while (current) {\n targets.add(current);\n if (current === element.ownerDocument.documentElement) break;\n current = current.parentElement;\n }\n\n targets.add(element.ownerDocument.documentElement);\n if (element.ownerDocument.body) targets.add(element.ownerDocument.body);\n\n return Array.from(targets);\n}\n\nfunction useResolvedAppSidebarSide({\n containerRef,\n explicitDir,\n explicitSide,\n}: {\n containerRef: React.RefObject<HTMLDivElement | null>;\n explicitDir?: string;\n explicitSide?: AppSidebarSide;\n}): AppSidebarSide {\n const [detectedDirection, setDetectedDirection] =\n React.useState<AppSidebarDirection>(\n () => normalizeAppSidebarDirection(explicitDir) ?? 'ltr',\n );\n\n React.useEffect(() => {\n if (explicitSide) return;\n\n const normalizedExplicitDir = normalizeAppSidebarDirection(explicitDir);\n if (normalizedExplicitDir) {\n setDetectedDirection((current) =>\n current === normalizedExplicitDir ? current : normalizedExplicitDir,\n );\n return;\n }\n\n const container = containerRef.current;\n const win = container?.ownerDocument.defaultView;\n if (!container || !win) return;\n\n const detectDirection = () => {\n const nextDirection = getAppSidebarDirection(container);\n setDetectedDirection((current) =>\n current === nextDirection ? current : nextDirection,\n );\n };\n\n detectDirection();\n\n const Observer = win.MutationObserver;\n if (!Observer) return;\n\n const observer = new Observer(detectDirection);\n for (const target of getAppSidebarDirectionTargets(container)) {\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['dir', 'class', 'style'],\n });\n }\n\n return () => observer.disconnect();\n }, [containerRef, explicitDir, explicitSide]);\n\n return explicitSide ?? getAppSidebarSideFromDirection(detectedDirection);\n}\n\n// ============================================\n// Sidebar Logo\n// ============================================\n\nexport interface AppSidebarLogoProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** Logo image or element */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Subtext displayed below the logo (e.g., \"Dashboard\"). Hidden when collapsed. */\n subtext?: string;\n}\n\nconst DEFAULT_COMPACTED_LOGO = <BrandIcon icon=\"mark\" size=\"lg\" />;\n\nfunction AppSidebarLogo({\n logo,\n compactedLogo,\n subtext,\n className,\n ...props\n}: AppSidebarLogoProps) {\n const { state, toggleSidebar } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const effectiveCompactedLogo = compactedLogo ?? DEFAULT_COMPACTED_LOGO;\n\n if (isCollapsed) {\n return (\n <div\n data-slot=\"app-sidebar-logo\"\n className={cn('flex items-center justify-center', className)}\n {...props}\n dir=\"ltr\"\n >\n <button\n type=\"button\"\n onClick={toggleSidebar}\n className=\"group/logo relative flex min-h-11 min-w-11 items-center justify-center rounded-md p-1 transition-colors duration-200 ease-smooth hover:bg-background focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none\"\n aria-label=\"Expand sidebar\"\n >\n <span className=\"transition-opacity duration-200 ease-smooth group-hover/logo:opacity-0 motion-reduce:transition-none\">\n {effectiveCompactedLogo}\n </span>\n <PanelLeftOpen className=\"absolute size-5 opacity-0 transition-opacity duration-200 ease-smooth group-hover/logo:opacity-100 motion-reduce:transition-none\" />\n </button>\n </div>\n );\n }\n\n return (\n <div\n data-slot=\"app-sidebar-logo\"\n className={cn('flex items-center justify-between px-3', className)}\n {...props}\n dir=\"ltr\"\n >\n <div className=\"flex flex-col gap-0\">\n <div className=\"flex items-center gap-2\">\n {logo || (\n <>\n <BrandIcon icon=\"mark\" size=\"lg\" />\n <span className=\"text-lg font-semibold tracking-tight text-foreground\">\n HUMAIN\n </span>\n </>\n )}\n </div>\n {subtext && (\n <p className=\"text-sm text-sidebar-foreground\">{subtext}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={toggleSidebar}\n className=\"relative flex size-7 items-center justify-center rounded-md text-muted-foreground transition-colors duration-200 ease-smooth hover:bg-background hover:text-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none after:absolute after:-inset-2\"\n aria-label=\"Collapse sidebar\"\n >\n <PanelLeftClose aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n );\n}\n\nAppSidebarLogo.displayName = 'AppSidebar.Logo';\n\n// ============================================\n// Slot Components (Header, Content, Footer)\n// ============================================\n\nexport interface AppSidebarSlotProps {\n children?: React.ReactNode;\n className?: string;\n}\n\nfunction AppSidebarHeader({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-header\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarHeader.displayName = 'AppSidebar.Header';\n\nfunction AppSidebarContent({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-content\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarContent.displayName = 'AppSidebar.Content';\n\nfunction AppSidebarFooter({ children, className }: AppSidebarSlotProps) {\n return (\n <div data-slot=\"app-sidebar-footer\" className={className}>\n {children}\n </div>\n );\n}\nAppSidebarFooter.displayName = 'AppSidebar.Footer';\n\n// ============================================\n// Nav Component\n// ============================================\n\nexport interface AppSidebarNavProps {\n children?: React.ReactNode;\n /** Accessible label for the nav landmark (useful when multiple Nav instances exist) */\n 'aria-label'?: string;\n className?: string;\n}\n\nfunction AppSidebarNav({\n children,\n 'aria-label': ariaLabel = 'Sidebar navigation',\n className,\n}: AppSidebarNavProps) {\n const menuContent = (\n <SidebarMenu className=\"gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-2\">\n {React.Children.map(children, (child) => (\n <SidebarMenuItem>{child}</SidebarMenuItem>\n ))}\n </SidebarMenu>\n );\n\n return (\n <SidebarGroup\n data-slot=\"app-sidebar-nav\"\n className={cn(\n 'shrink-0 p-0 group-data-[collapsible=icon]:w-auto',\n className,\n )}\n >\n <SidebarGroupContent>\n <nav aria-label={ariaLabel}>{menuContent}</nav>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarNav.displayName = 'AppSidebar.Nav';\nmarkAppSidebarImplicitSlot(AppSidebarNav, 'content');\n\n// ============================================\n// Nav Section (Group Label / Divider)\n// ============================================\n\nexport interface AppSidebarNavSectionProps {\n /** Section label shown when sidebar is expanded */\n label: string;\n /** Additional className */\n className?: string;\n}\n\nfunction AppSidebarNavSection({ label, className }: AppSidebarNavSectionProps) {\n return (\n <div\n data-slot=\"app-sidebar-nav-section\"\n role=\"separator\"\n aria-label={label}\n className={cn('py-2 group-data-[collapsible=icon]:w-8', className)}\n >\n <div className=\"flex h-8 items-center px-2 group-data-[collapsible=icon]:hidden\">\n <span className=\"text-xs font-medium text-sidebar-foreground/80\">\n {label}\n </span>\n </div>\n <div className=\"hidden py-2 group-data-[collapsible=icon]:block\">\n <span className=\"sr-only\">{label}</span>\n <Separator className=\"mx-auto w-8\" />\n </div>\n </div>\n );\n}\n\nAppSidebarNavSection.displayName = 'AppSidebar.NavSection';\n\n// ============================================\n// Nav Item Component\n// ============================================\n\nconst navItemVariants = cva(\n 'relative flex w-full items-center gap-1.5 rounded-md px-2 py-2 text-sm font-normal transition-[color,background-color] duration-200 ease-smooth motion-reduce:transition-none',\n {\n variants: {\n state: {\n default: 'text-sidebar-foreground hover:bg-background',\n active: 'bg-primary/10 text-sidebar-foreground',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n },\n);\n\nexport interface AppSidebarNavItemProps {\n icon: React.ReactNode;\n label: string;\n isActive?: boolean;\n badge?: string | number;\n onClick?: () => void;\n href?: string;\n className?: string;\n /** Sub-navigation children (AppSidebar.NavSub items). When present, renders as collapsible parent. */\n children?: React.ReactNode;\n}\n\nfunction AppSidebarNavItem({\n icon,\n label,\n isActive = false,\n badge,\n onClick,\n href,\n className,\n children,\n}: AppSidebarNavItemProps) {\n const { state, containerRef } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const hasChildren = React.Children.count(children) > 0;\n const [isOpen, setIsOpen] = React.useState(isActive && hasChildren);\n const subNavId = React.useId();\n const floatingSide = sidebarSide === 'right' ? 'left' : 'right';\n const flyoutPanelBackground =\n 'linear-gradient(108deg, var(--opacity-white-87) 0.5219%, var(--opacity-white-75) 98.419%)';\n const flyoutFrameEdgeClassName =\n sidebarSide === 'right'\n ? 'justify-end rounded-l-xl rounded-r-none'\n : 'justify-start rounded-r-xl rounded-l-none';\n const flyoutPanelEdgeClassName =\n sidebarSide === 'right' ? 'rounded-l-xl' : 'rounded-r-xl';\n const flyoutAnchor = React.useMemo(\n () => ({\n getBoundingClientRect: () => {\n const container = containerRef.current;\n const rect = container?.getBoundingClientRect();\n const win = container?.ownerDocument.defaultView;\n const viewportHeight = win?.innerHeight ?? rect?.height ?? 0;\n const x = rect ? (sidebarSide === 'right' ? rect.left : rect.right) : 0;\n\n return {\n x,\n y: 0,\n top: 0,\n right: x,\n bottom: viewportHeight,\n left: x,\n width: 0,\n height: viewportHeight,\n };\n },\n }),\n [containerRef, sidebarSide],\n );\n\n React.useEffect(() => {\n if (isActive && hasChildren) setIsOpen(true);\n }, [isActive, hasChildren]);\n\n const accessibleLabel = formatAccessibleLabel(label, badge);\n\n const iconElement = (\n <span\n data-slot=\"nav-icon\"\n className=\"flex shrink-0 items-center p-0.5 [&>svg]:size-4\"\n >\n {icon}\n </span>\n );\n\n const labelElement = (\n <span className=\"flex-1 text-start group-data-[collapsible=icon]:hidden\">\n {label}\n </span>\n );\n\n const badgeElement = badge != null && (\n <Badge\n size=\"sm\"\n variant=\"soft\"\n color={isActive ? 'secondary' : 'primary'}\n className=\"group-data-[collapsible=icon]:hidden\"\n aria-hidden=\"true\"\n >\n {badge}\n </Badge>\n );\n\n const chevronElement = hasChildren && (\n <ChevronRight\n aria-hidden=\"true\"\n className={cn(\n 'size-4 shrink-0 text-muted-foreground transition-transform duration-200 ease-smooth group-data-[collapsible=icon]:hidden motion-reduce:transition-none',\n isOpen ? 'rotate-90' : 'rtl:rotate-180',\n isActive && isOpen && 'text-primary',\n )}\n />\n );\n\n const itemClassName = cn(\n navItemVariants({ state: isActive ? 'active' : 'default' }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'min-h-11 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:px-0 group-data-[collapsible=icon]:py-2 group-data-[collapsible=icon]:w-11 group-data-[collapsible=icon]:h-11',\n className,\n );\n\n const ariaProps = isActive ? { 'aria-current': 'page' as const } : {};\n\n // --- Collapsed: icon-only with tooltip, flyout popover for children ---\n if (isCollapsed) {\n const collapsedIconElement = (\n <span\n data-slot=\"nav-icon\"\n className=\"flex shrink-0 items-center justify-center p-0.5 [&>svg]:size-4\"\n >\n {icon}\n </span>\n );\n\n const triggerElement = href ? (\n <a\n href={href}\n className={cn(itemClassName)}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={hasChildren ? () => setIsOpen(!isOpen) : onClick}\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </button>\n );\n\n if (!hasChildren) {\n if (!label) return triggerElement;\n return (\n <Tooltip>\n <TooltipTrigger render={triggerElement} />\n <TooltipPopup side={floatingSide} sideOffset={8}>\n {label}\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <PopoverRoot>\n <PopoverTrigger\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n data-slot=\"app-sidebar-nav-item\"\n >\n {collapsedIconElement}\n </PopoverTrigger>\n <PopoverPopup\n side={floatingSide}\n align=\"start\"\n sideOffset={0}\n alignOffset={0}\n anchor={flyoutAnchor}\n collisionAvoidance={{\n side: 'none',\n align: 'none',\n fallbackAxisSide: 'none',\n }}\n positionMethod=\"fixed\"\n aria-label={`${label} sub-navigation`}\n style={\n {\n '--app-sidebar-flyout-panel-bg': flyoutPanelBackground,\n } as React.CSSProperties\n }\n className={cn(\n 'flex h-[var(--anchor-height)] w-[276px] border-0 bg-transparent p-0 ring-0 shadow-none',\n 'overflow-clip',\n flyoutFrameEdgeClassName,\n )}\n >\n <div\n className={cn(\n 'flex h-full w-64 flex-col gap-0.5 overflow-y-auto p-3 shadow-[var(--shadow-hover-card)]',\n 'supports-backdrop-filter:backdrop-blur-[60px] [background-image:var(--app-sidebar-flyout-panel-bg)] delight-tooltip-stagger',\n flyoutPanelEdgeClassName,\n )}\n data-slot=\"app-sidebar-nav-flyout-panel\"\n role=\"group\"\n aria-label={label}\n >\n <p\n className=\"px-2 pb-2 pt-1 text-xs font-semibold text-primary opacity-70\"\n aria-hidden=\"true\"\n >\n {label}\n </p>\n {children}\n </div>\n </PopoverPopup>\n </PopoverRoot>\n );\n }\n\n // --- Expanded: full item with optional inline sub-nav ---\n const handleClick = () => {\n if (hasChildren) {\n setIsOpen(!isOpen);\n }\n onClick?.();\n };\n\n const mainElement =\n href && !hasChildren ? (\n <a\n href={href}\n className={itemClassName}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {iconElement}\n {labelElement}\n {badgeElement}\n {chevronElement}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={handleClick}\n className={cn(itemClassName, 'cursor-pointer')}\n aria-label={accessibleLabel}\n aria-expanded={hasChildren ? isOpen : undefined}\n aria-controls={hasChildren ? subNavId : undefined}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-item\"\n >\n {iconElement}\n {labelElement}\n {badgeElement}\n {chevronElement}\n </button>\n );\n\n if (!hasChildren) return mainElement;\n\n return (\n <>\n {mainElement}\n {isOpen && (\n <ul\n id={subNavId}\n role=\"group\"\n aria-label={`${label} sub-navigation`}\n className=\"flex flex-col items-start py-1 pl-6\"\n >\n {children}\n </ul>\n )}\n </>\n );\n}\n\nAppSidebarNavItem.displayName = 'AppSidebar.NavItem';\n\n// ============================================\n// Nav Sub Component\n// ============================================\n\nexport interface AppSidebarNavSubProps {\n label: string;\n badge?: string | number;\n isActive?: boolean;\n href?: string;\n onClick?: () => void;\n className?: string;\n}\n\nfunction AppSidebarNavSub({\n label,\n badge,\n isActive = false,\n href,\n onClick,\n className,\n}: AppSidebarNavSubProps) {\n const accessibleLabel = formatAccessibleLabel(label, badge);\n\n const itemClassName = cn(\n navItemVariants({ state: isActive ? 'active' : 'default' }),\n 'min-h-11 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n 'transition-[color,background-color,transform] ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0',\n className,\n );\n\n const ariaProps = isActive ? { 'aria-current': 'page' as const } : {};\n\n const content = (\n <>\n <span className=\"flex-1 text-start\">{label}</span>\n {badge != null && (\n <Badge\n size=\"sm\"\n variant=\"soft\"\n color={isActive ? 'secondary' : 'primary'}\n aria-hidden=\"true\"\n >\n {badge}\n </Badge>\n )}\n </>\n );\n\n if (href) {\n return (\n <a\n href={href}\n className={itemClassName}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-sub\"\n >\n {content}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(itemClassName, 'cursor-pointer delight-selection-press')}\n aria-label={accessibleLabel}\n {...ariaProps}\n data-slot=\"app-sidebar-nav-sub\"\n >\n {content}\n </button>\n );\n}\nAppSidebarNavSub.displayName = 'AppSidebar.NavSub';\n\n// ============================================\n// Nav Skeleton\n// ============================================\n\nexport interface AppSidebarNavSkeletonProps {\n /** Number of skeleton items to show */\n count?: number;\n className?: string;\n}\n\nfunction AppSidebarNavSkeleton({\n count = 3,\n className,\n}: AppSidebarNavSkeletonProps) {\n const skeletonCount = getSkeletonCount(count, 3);\n\n return (\n <SidebarGroup\n className={cn(\n 'shrink-0 p-0 group-data-[collapsible=icon]:w-auto',\n className,\n )}\n >\n <SidebarGroupContent>\n <SidebarMenu className=\"gap-0.5 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:gap-2\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <SidebarMenuItem key={`nav-skeleton-${i}`}>\n <SidebarNavSkeleton />\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarNavSkeleton.displayName = 'AppSidebar.NavSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarNavSkeleton, 'content');\n\n// ============================================\n// Chat List Component\n// ============================================\n\nexport interface AppSidebarChatListProps {\n /** Section label */\n label?: string;\n children?: React.ReactNode;\n className?: string;\n}\n\nfunction AppSidebarChatList({\n label = 'Recent Chats',\n children,\n className,\n}: AppSidebarChatListProps) {\n const { state } = useSidebar();\n const isCollapsed = state === 'collapsed';\n\n // Collapsed state doesn't show chat list\n if (isCollapsed) {\n return null;\n }\n\n return (\n <SidebarGroup\n data-slot=\"app-sidebar-chat-list\"\n className={cn('mt-4 flex min-h-0 flex-1 flex-col p-0', className)}\n >\n <SidebarGroupLabel className=\"shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground\">\n {label}\n </SidebarGroupLabel>\n <SidebarGroupContent className=\"flex-1 overflow-hidden\">\n <div\n className=\"flex h-full flex-col overflow-y-auto pb-5 rounded-md focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n tabIndex={0}\n role=\"list\"\n aria-label={label}\n >\n {children}\n </div>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarChatList.displayName = 'AppSidebar.ChatList';\nmarkAppSidebarImplicitSlot(AppSidebarChatList, 'content');\n\n// ============================================\n// Chat Item Component\n// ============================================\n\nconst chatItemVariants = cva(\n 'flex w-full items-center justify-between gap-2 rounded-md px-3 py-2 min-h-11 transition-[color,background-color,transform] duration-200 ease-smooth cursor-pointer motion-reduce:transition-none ltr:hover:translate-x-0.5 rtl:hover:-translate-x-0.5 motion-reduce:ltr:hover:translate-x-0 motion-reduce:rtl:hover:translate-x-0',\n {\n variants: {\n state: {\n default: 'hover:bg-muted',\n hover: 'bg-muted',\n selected: 'bg-primary/10',\n },\n },\n defaultVariants: {\n state: 'default',\n },\n },\n);\n\nexport interface AppSidebarChatItemProps\n extends VariantProps<typeof chatItemVariants> {\n /** Chat title */\n title: string;\n /** Time indicator (e.g., \"12h ago\") */\n time?: string;\n /** Icon for collapsed view (defaults to chat bubble) */\n icon?: React.ReactNode;\n /** Whether this chat is selected */\n isSelected?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Context menu handler (right-click) */\n onContextMenu?: (event: React.MouseEvent) => void;\n /** Additional className */\n className?: string;\n}\n\nfunction AppSidebarChatItem({\n title,\n time,\n icon,\n isSelected = false,\n onClick,\n onContextMenu,\n className,\n}: AppSidebarChatItemProps) {\n const { state } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const tooltipSide = sidebarSide === 'right' ? 'left' : 'right';\n\n if (isCollapsed) {\n const collapsedButton = (\n <button\n type=\"button\"\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-slot=\"app-sidebar-chat-item\"\n aria-label={title || undefined}\n className={cn(\n 'flex size-11 items-center justify-center rounded-md transition-colors duration-200 ease-smooth motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n isSelected ? 'bg-primary/10' : 'hover:bg-muted',\n className,\n )}\n >\n {icon || <MessageCircle className=\"size-5 text-secondary-foreground\" />}\n </button>\n );\n\n if (!title && !time) {\n return collapsedButton;\n }\n\n return (\n <Tooltip>\n <TooltipTrigger render={collapsedButton} />\n <TooltipPopup side={tooltipSide} sideOffset={8}>\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{title}</span>\n {time && (\n <span className=\"text-xs text-muted-foreground\">{time}</span>\n )}\n </div>\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <div role=\"listitem\">\n <button\n type=\"button\"\n onClick={onClick}\n onContextMenu={onContextMenu}\n data-slot=\"app-sidebar-chat-item\"\n aria-label={title}\n className={cn(\n chatItemVariants({ state: isSelected ? 'selected' : 'default' }),\n 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring',\n className,\n )}\n >\n <span className=\"text-base font-semibold text-secondary-foreground truncate\">\n {title}\n </span>\n {time && (\n <span className=\"text-xs font-normal text-muted-foreground shrink-0\">\n {time}\n </span>\n )}\n </button>\n </div>\n );\n}\n\nAppSidebarChatItem.displayName = 'AppSidebar.ChatItem';\n\n// ============================================\n// Chat List Skeleton\n// ============================================\n\nexport interface AppSidebarChatListSkeletonProps {\n /** Number of skeleton items to show */\n count?: number;\n /** Section label */\n label?: string;\n className?: string;\n}\n\nfunction AppSidebarChatListSkeleton({\n count = 5,\n label = 'Recent Chats',\n className,\n}: AppSidebarChatListSkeletonProps) {\n const skeletonCount = getSkeletonCount(count, 5);\n\n return (\n <SidebarGroup\n className={cn(\n 'mt-4 flex min-h-0 flex-1 flex-col p-0 group-data-[collapsible=icon]:hidden',\n className,\n )}\n >\n <SidebarGroupLabel className=\"shrink-0 px-3 py-1 text-xs font-bold text-muted-foreground\">\n {label}\n </SidebarGroupLabel>\n <SidebarGroupContent className=\"flex-1 overflow-hidden\">\n <div className=\"flex h-full flex-col overflow-y-auto pb-5\">\n {Array.from({ length: skeletonCount }).map((_, i) => (\n <SidebarMenuSkeleton key={`chat-skeleton-${i}`} />\n ))}\n </div>\n </SidebarGroupContent>\n </SidebarGroup>\n );\n}\n\nAppSidebarChatListSkeleton.displayName = 'AppSidebar.ChatListSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarChatListSkeleton, 'content');\n\n// ============================================\n// Account Component\n// ============================================\n\nexport interface AppSidebarAccountProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /** User's name */\n name: string;\n /** Subtitle text (e.g., email, role) */\n subtitle?: string;\n /** User's avatar URL */\n avatarSrc?: string;\n /** Whether user is online */\n isOnline?: boolean;\n /** Click handler for the expand button */\n onExpand?: () => void;\n}\n\nfunction AppSidebarAccount({\n name,\n subtitle,\n avatarSrc,\n isOnline = false,\n onExpand,\n className,\n}: AppSidebarAccountProps) {\n const { state } = useSidebar();\n const { side: sidebarSide } = useAppSidebarLayout();\n const isCollapsed = state === 'collapsed';\n const tooltipSide = sidebarSide === 'right' ? 'left' : 'right';\n\n if (isCollapsed) {\n const avatarButton = (\n <button\n type=\"button\"\n onClick={onExpand}\n data-slot=\"app-sidebar-account\"\n aria-label={name ? `${name} account menu` : 'Account menu'}\n aria-haspopup=\"true\"\n className={cn(\n 'flex items-center justify-center rounded-lg transition-opacity duration-200 ease-smooth hover:opacity-80 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n className,\n )}\n >\n <Avatar\n src={avatarSrc}\n alt={name}\n fallback={name}\n size=\"sm\"\n indicator={isOnline ? 'online' : undefined}\n />\n </button>\n );\n\n if (!name && !subtitle) return avatarButton;\n\n return (\n <Tooltip>\n <TooltipTrigger render={avatarButton} />\n <TooltipPopup side={tooltipSide} sideOffset={8}>\n <div className=\"flex flex-col\">\n {name && <span className=\"font-medium\">{name}</span>}\n {subtitle && (\n <span className=\"text-xs text-muted-foreground\">{subtitle}</span>\n )}\n </div>\n </TooltipPopup>\n </Tooltip>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onExpand}\n data-slot=\"app-sidebar-account\"\n aria-label={name ? `${name} account menu` : 'Account menu'}\n aria-haspopup=\"true\"\n className={cn(\n 'flex w-full items-center gap-2 rounded-md p-2 transition-colors duration-200 ease-smooth hover:bg-background focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring motion-reduce:transition-none',\n className,\n )}\n >\n <Avatar\n src={avatarSrc}\n alt={name}\n fallback={name}\n size=\"sm\"\n indicator={isOnline ? 'online' : undefined}\n />\n <div className=\"flex flex-1 flex-col items-start overflow-hidden\">\n <span className=\"w-full truncate text-start text-sm font-medium text-sidebar-foreground\">\n {name}\n </span>\n {subtitle && (\n <span className=\"w-full truncate text-start text-xs font-light text-sidebar-foreground\">\n {subtitle}\n </span>\n )}\n </div>\n <ChevronRight\n aria-hidden=\"true\"\n className=\"size-4 shrink-0 text-muted-foreground rtl:rotate-180\"\n />\n </button>\n );\n}\n\nAppSidebarAccount.displayName = 'AppSidebar.Account';\nmarkAppSidebarImplicitSlot(AppSidebarAccount, 'footer');\n\n// ============================================\n// Account Skeleton\n// ============================================\n\nfunction AppSidebarAccountSkeleton({ className }: { className?: string }) {\n return <SidebarAccountSkeleton className={className} />;\n}\n\nAppSidebarAccountSkeleton.displayName = 'AppSidebar.AccountSkeleton';\nmarkAppSidebarImplicitSlot(AppSidebarAccountSkeleton, 'footer');\n\n// ============================================\n// Full Sidebar Skeleton\n// ============================================\n\nexport interface AppSidebarSkeletonProps {\n /** Number of nav skeleton items */\n navCount?: number;\n /** Number of chat skeleton items */\n chatCount?: number;\n /** Logo element */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Collapsible mode */\n collapsible?: 'offcanvas' | 'icon' | 'none';\n /** Side of the screen */\n side?: 'left' | 'right';\n /** Whether to round sidebar corners */\n rounded?: boolean;\n /** Custom background color class for the sidebar (e.g., 'bg-card') */\n sidebarBgColor?: string;\n className?: string;\n}\n\nfunction AppSidebarSkeleton({\n navCount = 4,\n chatCount = 5,\n logo,\n compactedLogo,\n collapsible = 'icon',\n side,\n rounded = false,\n sidebarBgColor,\n className,\n}: AppSidebarSkeletonProps) {\n const { state, containerRef } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const resolvedSide = useResolvedAppSidebarSide({\n containerRef,\n explicitSide: side,\n });\n\n const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);\n\n return (\n <Sidebar\n collapsible={collapsible}\n side={resolvedSide}\n rounded={rounded}\n className={cn(bgClass, className)}\n >\n <SidebarHeader className=\"gap-4 pb-0 pt-6 group-data-[collapsible=icon]:px-4\">\n <AppSidebarLogo logo={logo} compactedLogo={compactedLogo} />\n </SidebarHeader>\n\n <SidebarContent className=\"flex flex-col gap-0 overflow-hidden px-3 py-4 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n <AppSidebarNavSkeleton count={navCount} />\n <AppSidebarChatListSkeleton count={chatCount} />\n </SidebarContent>\n\n <SidebarFooter className=\"gap-4 px-4 pb-6 pt-0 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n <AppSidebarAccountSkeleton />\n </SidebarFooter>\n </Sidebar>\n );\n}\n\nAppSidebarSkeleton.displayName = 'AppSidebar.Skeleton';\n\n// ============================================\n// Main App Sidebar\n// ============================================\n\nexport interface AppSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Logo element or configuration */\n logo?: React.ReactNode;\n /** Icon to show when sidebar is compacted. Defaults to Humain logomark. */\n compactedLogo?: React.ReactNode;\n /** Subtext displayed below the logo (e.g., \"Dashboard\"). Hidden when collapsed. */\n logoSubtext?: string;\n /** Collapsible mode - 'icon' shows only icons when collapsed, 'none' disables collapsing */\n collapsible?: 'offcanvas' | 'icon' | 'none';\n /** Side of the screen. When omitted, resolves from the nearest DOM direction. */\n side?: 'left' | 'right';\n /** Whether to round sidebar corners */\n rounded?: boolean;\n /** Custom background color class for the sidebar (e.g., 'bg-card'). Defaults to bg-muted when expanded, bg-transparent when collapsed. */\n sidebarBgColor?: string;\n /** Children (compound components) */\n children?: React.ReactNode;\n}\n\n/**\n * AppSidebar is a full-featured application sidebar with navigation, chat list, and account sections.\n * Supports collapsible modes with a unified logo toggle and loading skeletons.\n *\n * @llms Full-featured app sidebar with nav, chat list, account, collapsible modes\n * @example\n * ```tsx\n * <AppSidebar logo={<Logo />} collapsible=\"icon\">\n * <AppSidebar.Nav>\n * <AppSidebar.NavItem icon={<Home />} label=\"Home\" isActive />\n * </AppSidebar.Nav>\n * <AppSidebar.ChatList>\n * <AppSidebar.ChatItem title=\"Chat 1\" />\n * </AppSidebar.ChatList>\n * <AppSidebar.Account name=\"User\" subtitle=\"user@example.com\" />\n * </AppSidebar>\n * ```\n */\nfunction AppSidebarRoot({\n logo,\n compactedLogo,\n logoSubtext,\n collapsible = 'icon',\n side,\n rounded = false,\n sidebarBgColor,\n className,\n children,\n dir,\n ...props\n}: AppSidebarProps) {\n const { state, containerRef } = useSidebar();\n const isCollapsed = state === 'collapsed';\n const resolvedSide = useResolvedAppSidebarSide({\n containerRef,\n explicitDir: dir,\n explicitSide: side,\n });\n\n const bgClass = getSidebarBgClass(isCollapsed, sidebarBgColor);\n\n const slots = useSlotChildren(children);\n\n return (\n <AppSidebarLayoutContext.Provider value={{ side: resolvedSide }}>\n <Sidebar\n collapsible={collapsible}\n side={resolvedSide}\n rounded={rounded}\n dir={dir}\n className={cn(bgClass, className)}\n {...props}\n >\n <SidebarHeader className=\"gap-4 pb-0 pt-6 group-data-[collapsible=icon]:px-4\">\n <AppSidebarLogo\n logo={logo}\n compactedLogo={compactedLogo}\n subtext={logoSubtext}\n />\n </SidebarHeader>\n\n <SidebarContent className=\"flex flex-col gap-0 overflow-hidden px-3 py-4 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n {slots.explicitContent\n ? (slots.explicitContent.props as AppSidebarSlotProps).children\n : slots.content}\n </SidebarContent>\n\n <SidebarFooter className=\"gap-4 px-4 pb-6 pt-0 group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:px-4\">\n {slots.explicitFooter\n ? (slots.explicitFooter.props as AppSidebarSlotProps).children\n : slots.footer}\n </SidebarFooter>\n </Sidebar>\n </AppSidebarLayoutContext.Provider>\n );\n}\n\nAppSidebarRoot.displayName = 'AppSidebar';\n\n// ============================================\n// Compound Component Export\n// ============================================\n\nexport const AppSidebar = Object.assign(AppSidebarRoot, {\n Header: AppSidebarHeader,\n Content: AppSidebarContent,\n Footer: AppSidebarFooter,\n Nav: AppSidebarNav,\n NavSection: AppSidebarNavSection,\n NavItem: AppSidebarNavItem,\n NavSub: AppSidebarNavSub,\n NavSkeleton: AppSidebarNavSkeleton,\n ChatList: AppSidebarChatList,\n ChatItem: AppSidebarChatItem,\n ChatListSkeleton: AppSidebarChatListSkeleton,\n Account: AppSidebarAccount,\n AccountSkeleton: AppSidebarAccountSkeleton,\n Skeleton: AppSidebarSkeleton,\n});\n\n// ============================================\n// Type Exports\n// ============================================\n\n// Re-export mobile detection utilities for client use\nexport { MOBILE_BREAKPOINT, useIsMobile } from '@/hooks/use-mobile';\nexport type {\n AppSidebarAccountProps as AccountProps,\n AppSidebarChatItemProps as ChatItemProps,\n AppSidebarChatListProps as ChatListProps,\n AppSidebarChatListSkeletonProps as ChatListSkeletonProps,\n AppSidebarNavItemProps as NavItemProps,\n AppSidebarNavProps as NavProps,\n AppSidebarNavSectionProps as NavSectionProps,\n AppSidebarNavSkeletonProps as NavSkeletonProps,\n AppSidebarNavSubProps as NavSubProps,\n AppSidebarSkeletonProps as SkeletonProps,\n AppSidebarSlotProps as SlotProps,\n};\n// Re-export sidebar primitives for custom compositions\nexport {\n chatItemVariants,\n navItemVariants,\n // Re-export base components for advanced usage\n Sidebar,\n SidebarAccountSkeleton,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInset,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarNavSkeleton,\n SidebarProvider,\n SidebarTrigger,\n useSidebar,\n};\n","/**\n * Web Component wrapper for AppSidebar (hand-crafted WC adapter).\n * Custom element: <hf-app-sidebar>\n *\n * @generated by scripts/generate-wc-components.ts\n * DO NOT EDIT MANUALLY\n */\n\nimport {\n Calendar,\n Circle,\n FileText,\n Home,\n type LucideIcon,\n MessageCircle,\n Settings,\n Users,\n Workflow,\n} from 'lucide-react';\nimport React from 'react';\nimport { AppSidebar } from '../components';\nimport { SidebarInset, SidebarProvider } from '../components/ui/sidebar';\nimport {\n asArray,\n BaseCompoundWC,\n camelToKebab,\n dispatchEvent,\n installPropAccessors,\n type PropDefs,\n portalNode,\n registerWC,\n} from './_shared';\n\nconst PROP_DEFS: PropDefs = {\n navItems: 'json',\n activeNavItemId: 'string',\n account: 'json',\n logo: 'json',\n collapsible: 'string',\n connected: 'boolean',\n defaultOpen: 'boolean',\n side: 'string',\n compactedLogo: 'string',\n sidebarBgColor: 'string',\n rounded: 'boolean',\n logoSubtext: 'string',\n};\n\ntype NavSubItemDef = {\n label: string;\n badge?: string | number;\n href?: string;\n isActive?: boolean;\n};\n\ntype NavItemDef = {\n type?: 'item';\n id: string;\n icon?: string;\n label: string;\n isActive?: boolean;\n badge?: string | number;\n href?: string;\n children?: NavSubItemDef[];\n};\n\ntype NavSectionDef = {\n type: 'section';\n id?: string;\n label: string;\n};\n\ntype NavEntryDef = NavItemDef | NavSectionDef;\n\ntype LogoDef = {\n src?: string;\n alt?: string;\n};\n\nconst SIDEBAR_ICON_COMPONENTS: Record<string, LucideIcon> = {\n home: Home,\n users: Users,\n calendar: Calendar,\n 'file-text': FileText,\n settings: Settings,\n 'message-circle': MessageCircle,\n workflow: Workflow,\n};\n\nconst warnedUnsupportedIconNames = new Set<string>();\n\nfunction normalizeIconName(iconName: string | undefined): string | undefined {\n const normalizedIconName = iconName\n ?.trim()\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[\\s_]+/g, '-')\n .toLowerCase();\n\n return normalizedIconName || undefined;\n}\n\nfunction renderNavIcon(iconName: string | undefined): React.ReactElement {\n const normalizedIconName = normalizeIconName(iconName);\n\n if (normalizedIconName) {\n const Icon = SIDEBAR_ICON_COMPONENTS[normalizedIconName];\n\n if (Icon) {\n return React.createElement(Icon, { 'aria-hidden': true });\n }\n\n if (!warnedUnsupportedIconNames.has(normalizedIconName)) {\n warnedUnsupportedIconNames.add(normalizedIconName);\n console.warn(\n `[hf-app-sidebar] Unsupported nav item icon \"${normalizedIconName}\". Falling back to \"circle\".`,\n );\n }\n }\n\n return React.createElement(Circle, { 'aria-hidden': true });\n}\n\nfunction isNavSection(item: NavEntryDef): item is NavSectionDef {\n return item.type === 'section';\n}\n\nfunction renderLogoImage(\n logo: LogoDef | undefined,\n fallbackAlt: string,\n): React.ReactElement | null | undefined {\n if (!logo) {\n return undefined;\n }\n\n if (!logo.src) {\n return null;\n }\n\n return React.createElement('img', {\n src: logo.src,\n alt: logo.alt || fallbackAlt,\n });\n}\n\nclass AppSidebarWC extends BaseCompoundWC {\n get propDefs() {\n return PROP_DEFS;\n }\n\n static get observedAttributes() {\n return Object.keys(PROP_DEFS).map(camelToKebab);\n }\n\n protected _renderReact(): React.ReactElement {\n const props = this._readAllProps();\n const contentSlot = this._getSlot('content');\n\n const navItems = asArray<NavEntryDef>(props.navItems);\n\n const account = props.account as\n | {\n name: string;\n subtitle: string;\n avatarSrc?: string;\n isOnline?: boolean;\n }\n | undefined;\n\n const logo = props.logo as LogoDef | undefined;\n const compactedLogo = props.compactedLogo\n ? renderLogoImage(\n { src: String(props.compactedLogo), alt: logo?.alt },\n logo?.alt || 'Logo',\n )\n : undefined;\n const host = this;\n\n function handleNavItemClick(item: { id: string; label: string }): void {\n dispatchEvent(host, 'nav-item-click', item);\n }\n\n function handleOpenChange(open: boolean): void {\n dispatchEvent(host, 'open-change', open);\n }\n\n const sidebarChildren: React.ReactElement[] = [];\n\n sidebarChildren.push(\n React.createElement(\n AppSidebar,\n {\n key: 'sidebar',\n collapsible:\n (props.collapsible as 'offcanvas' | 'icon' | 'none') || 'icon',\n side: (props.side as 'left' | 'right') || 'left',\n rounded: props.rounded as boolean,\n sidebarBgColor: props.sidebarBgColor as string,\n logoSubtext: props.logoSubtext as string,\n logo: renderLogoImage(logo, 'Logo'),\n compactedLogo,\n },\n navItems.length > 0 &&\n React.createElement(\n AppSidebar.Nav,\n { key: 'nav' },\n ...navItems.map((item, index) => {\n if (isNavSection(item)) {\n return React.createElement(AppSidebar.NavSection, {\n key: item.id || `section-${index}`,\n label: item.label,\n });\n }\n\n return React.createElement(\n AppSidebar.NavItem,\n {\n key: item.id,\n icon: renderNavIcon(item.icon),\n label: item.label,\n isActive: item.isActive || item.id === props.activeNavItemId,\n badge: item.badge,\n href: item.href,\n onClick: () => handleNavItemClick(item),\n },\n ...(item.children\n ? item.children.map((child, idx) =>\n React.createElement(AppSidebar.NavSub, {\n key: `${item.id}-sub-${idx}`,\n label: child.label,\n badge: child.badge,\n href: child.href,\n isActive: child.isActive,\n }),\n )\n : []),\n );\n }),\n ),\n account &&\n React.createElement(AppSidebar.Account, {\n key: 'account',\n name: account.name,\n subtitle: account.subtitle,\n avatarSrc: account.avatarSrc,\n isOnline: account.isOnline,\n }),\n ),\n );\n\n if (contentSlot) {\n sidebarChildren.push(\n React.createElement(\n SidebarInset,\n { key: 'inset', connected: props.connected as boolean },\n portalNode(contentSlot),\n ),\n );\n }\n\n return React.createElement(\n SidebarProvider,\n {\n defaultOpen: (props.defaultOpen as boolean) ?? false,\n onOpenChange: handleOpenChange,\n connected: props.connected as boolean,\n },\n ...sidebarChildren,\n );\n }\n}\n\ninstallPropAccessors(AppSidebarWC, PROP_DEFS);\nregisterWC('hf-app-sidebar', AppSidebarWC);\n\nexport { AppSidebarWC };\nexport default AppSidebarWC;\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -1,14 +1,14 @@
1
1
  import { d as E, f } from "./_shared.js";
2
2
  import { t as D } from "./createLucideIcon.js";
3
- import { t as L } from "./check.js";
4
- import { t as V } from "./chevron-down.js";
5
- import { t as $ } from "./chevron-right.js";
3
+ import { t as A } from "./check.js";
4
+ import { t as L } from "./chevron-down.js";
5
+ import { t as V } from "./chevron-right.js";
6
6
  import { t as M } from "./circle-alert.js";
7
7
  import { t as F } from "./react.js";
8
8
  import { t as P } from "./AnimatePresence.js";
9
9
  import { t as _ } from "./use-reduced-motion.js";
10
10
  import { t as j } from "./dist.js";
11
- import * as l from "react";
11
+ import * as c from "react";
12
12
  import { Fragment as B, jsx as t, jsxs as g } from "react/jsx-runtime";
13
13
  var K = [
14
14
  ["path", {
@@ -100,7 +100,14 @@ function X(e, r) {
100
100
  return e.length === r.length && e.every((a, n) => a === r[n]);
101
101
  }
102
102
  function Y(e) {
103
- return e < 1e3 ? `${e}ms` : `${(e / 1e3).toFixed(1)}s`;
103
+ if (e < 1e3) return `${e}ms`;
104
+ if (e < 6e4) return `${(e / 1e3).toFixed(1)}s`;
105
+ const r = Math.floor(e / 1e3), a = Math.floor(r / 3600), n = Math.floor(r % 3600 / 60), s = r % 60;
106
+ return [
107
+ a > 0 ? `${a}h` : null,
108
+ n > 0 ? `${n}m` : null,
109
+ s > 0 ? `${s}s` : null
110
+ ].filter((l) => l !== null).join(" ");
104
111
  }
105
112
  function Z(e) {
106
113
  return typeof e == "object" && e !== null && Symbol.iterator in e && typeof e[Symbol.iterator] == "function";
@@ -111,15 +118,15 @@ function ee(e) {
111
118
  var W = /* @__PURE__ */ new WeakMap();
112
119
  function te(e, r) {
113
120
  const a = [];
114
- let n = !1, d = !Array.isArray(e);
115
- for (let c = r.next(); !c.done; c = r.next()) {
116
- const u = R(c.value);
117
- a.push(u.content), n ||= u.hasRenderableContent, d ||= u.changed;
121
+ let n = !1, s = !Array.isArray(e);
122
+ for (let l = r.next(); !l.done; l = r.next()) {
123
+ const u = R(l.value);
124
+ a.push(u.content), n ||= u.hasRenderableContent, s ||= u.changed;
118
125
  }
119
126
  return {
120
- content: d ? a : e,
127
+ content: s ? a : e,
121
128
  hasRenderableContent: n,
122
- changed: d
129
+ changed: s
123
130
  };
124
131
  }
125
132
  function R(e) {
@@ -133,15 +140,15 @@ function R(e) {
133
140
  hasRenderableContent: !0,
134
141
  changed: !1
135
142
  };
136
- if (l.isValidElement(e)) {
137
- if (e.type !== l.Fragment) return {
143
+ if (c.isValidElement(e)) {
144
+ if (e.type !== c.Fragment) return {
138
145
  content: e,
139
146
  hasRenderableContent: !0,
140
147
  changed: !1
141
148
  };
142
149
  const r = R(e.props.children);
143
150
  return {
144
- content: r.changed ? l.cloneElement(e, void 0, r.content) : e,
151
+ content: r.changed ? c.cloneElement(e, void 0, r.content) : e,
145
152
  hasRenderableContent: r.hasRenderableContent,
146
153
  changed: r.changed
147
154
  };
@@ -149,8 +156,8 @@ function R(e) {
149
156
  if (Z(e)) {
150
157
  const r = e[Symbol.iterator](), a = ee(r) ? r : null;
151
158
  if (a !== null) {
152
- const d = W.get(a);
153
- if (d !== void 0) return d;
159
+ const s = W.get(a);
160
+ if (s !== void 0) return s;
154
161
  }
155
162
  const n = te(e, r);
156
163
  return a !== null && W.set(a, n), n;
@@ -180,7 +187,7 @@ function ne(e) {
180
187
  return E(e);
181
188
  }
182
189
  }
183
- function q({ status: e, index: r, className: a }) {
190
+ function $({ status: e, index: r, className: a }) {
184
191
  const n = f(J({ status: e }), a);
185
192
  switch (e) {
186
193
  case "pending":
@@ -208,7 +215,7 @@ function q({ status: e, index: r, className: a }) {
208
215
  return /* @__PURE__ */ t("div", {
209
216
  "data-slot": "workflow-step-icon",
210
217
  className: f(n, "delight-check-bounce motion-reduce:!animate-none"),
211
- children: /* @__PURE__ */ t(L, { className: "size-3" })
218
+ children: /* @__PURE__ */ t(A, { className: "size-3" })
212
219
  });
213
220
  case "error":
214
221
  return /* @__PURE__ */ t("div", {
@@ -220,10 +227,10 @@ function q({ status: e, index: r, className: a }) {
220
227
  return E(e);
221
228
  }
222
229
  }
223
- q.displayName = "WorkflowStepStatusIcon";
224
- function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot: d = "workflow-step-item", expandable: c = !0, expanded: u, active: k = !1, onExpandedChange: S }) {
225
- const y = l.useId(), i = l.useId(), p = R(e.content), C = p.hasRenderableContent, h = re(e.error), m = h !== void 0, v = C || m, w = v && c, I = _(), x = Q[n], s = { duration: I ? 0 : 0.2 }, o = /* @__PURE__ */ g(B, { children: [
226
- /* @__PURE__ */ t(q, {
230
+ $.displayName = "WorkflowStepStatusIcon";
231
+ function q({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot: s = "workflow-step-item", expandable: l = !0, expanded: u, active: k = !1, onExpandedChange: S }) {
232
+ const y = c.useId(), d = c.useId(), p = R(e.content), C = p.hasRenderableContent, h = re(e.error), m = h !== void 0, v = C || m, w = v && l, I = _(), x = Q[n], i = { duration: I ? 0 : 0.2 }, o = /* @__PURE__ */ g(B, { children: [
233
+ /* @__PURE__ */ t($, {
227
234
  status: e.status,
228
235
  index: r
229
236
  }),
@@ -252,11 +259,11 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
252
259
  }),
253
260
  w && /* @__PURE__ */ t("div", {
254
261
  className: "shrink-0",
255
- children: u ? /* @__PURE__ */ t(V, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ t($, { className: "size-4 text-muted-foreground rtl:rotate-180" })
262
+ children: u ? /* @__PURE__ */ t(L, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ t(V, { className: "size-4 text-muted-foreground rtl:rotate-180" })
256
263
  })
257
264
  ] });
258
265
  return /* @__PURE__ */ g("div", {
259
- "data-slot": d,
266
+ "data-slot": s,
260
267
  "data-step-status": e.status,
261
268
  "data-appearance": n,
262
269
  className: f(x.rootClassName, x.hasDivider && !a && "border-b border-border"),
@@ -267,12 +274,12 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
267
274
  "aria-current": k ? "step" : void 0,
268
275
  "aria-expanded": u,
269
276
  "aria-controls": y,
270
- "aria-describedby": m ? i : void 0,
277
+ "aria-describedby": m ? d : void 0,
271
278
  className: f(z({ status: e.status }), "w-full cursor-pointer hover:bg-muted focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-ring"),
272
279
  children: o
273
280
  }) : /* @__PURE__ */ t("div", {
274
281
  "aria-current": k ? "step" : void 0,
275
- "aria-describedby": m ? i : void 0,
282
+ "aria-describedby": m ? d : void 0,
276
283
  className: f(z({ status: e.status }), "w-full"),
277
284
  children: o
278
285
  }),
@@ -293,7 +300,7 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
293
300
  height: 0,
294
301
  opacity: 0
295
302
  },
296
- transition: s,
303
+ transition: i,
297
304
  className: "overflow-hidden motion-reduce:transition-none",
298
305
  children: /* @__PURE__ */ g("div", {
299
306
  className: "px-4 pb-3 ps-12",
@@ -314,7 +321,7 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
314
321
  })
315
322
  }),
316
323
  m && /* @__PURE__ */ t("span", {
317
- id: i,
324
+ id: d,
318
325
  className: "sr-only",
319
326
  children: h
320
327
  }),
@@ -326,46 +333,46 @@ function A({ step: e, index: r, isLast: a, appearance: n = "contained", itemSlot
326
333
  ]
327
334
  });
328
335
  }
329
- A.displayName = "WorkflowStepItem";
330
- function ae({ steps: e, appearance: r = "contained", itemSlot: a = "workflow-step-item", expandable: n = !0, activeStepId: d, expandedStepIds: c, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: k, className: S, renderItems: y = !0 }) {
331
- const i = c !== void 0, p = i ? [...c] : void 0, [C, h] = l.useState(() => N(u, e)), m = l.useRef(p ?? []), v = l.useRef(i), w = N(i ? c : C, e), I = new Set(w);
332
- l.useLayoutEffect(() => {
336
+ q.displayName = "WorkflowStepItem";
337
+ function ae({ steps: e, appearance: r = "contained", itemSlot: a = "workflow-step-item", expandable: n = !0, activeStepId: s, expandedStepIds: l, defaultExpandedStepIds: u = [], onExpandedStepIdsChange: k, className: S, renderItems: y = !0 }) {
338
+ const d = l !== void 0, p = d ? [...l] : void 0, [C, h] = c.useState(() => N(u, e)), m = c.useRef(p ?? []), v = c.useRef(d), w = N(d ? l : C, e), I = new Set(w);
339
+ c.useLayoutEffect(() => {
333
340
  p !== void 0 && (m.current = p);
334
- }, [p]), l.useLayoutEffect(() => {
335
- const s = v.current;
336
- v.current = i, !i && h((o) => {
337
- const b = N(s ? m.current : o, e);
341
+ }, [p]), c.useLayoutEffect(() => {
342
+ const i = v.current;
343
+ v.current = d, !d && h((o) => {
344
+ const b = N(i ? m.current : o, e);
338
345
  return X(b, o) ? o : b;
339
346
  });
340
- }, [i, e]);
341
- const x = (s) => {
347
+ }, [d, e]);
348
+ const x = (i) => {
342
349
  const o = new Set(w);
343
- o.has(s) ? o.delete(s) : o.add(s);
350
+ o.has(i) ? o.delete(i) : o.add(i);
344
351
  const b = N([...o], e);
345
- i || h([...b]), k?.([...b]);
352
+ d || h([...b]), k?.([...b]);
346
353
  };
347
354
  return y ? /* @__PURE__ */ t("ol", {
348
355
  "data-slot": "workflow-step-list",
349
356
  "data-appearance": r,
350
357
  className: f("m-0 list-none p-0", S),
351
- children: e.map((s, o) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(A, {
352
- step: s,
358
+ children: e.map((i, o) => /* @__PURE__ */ t("li", { children: /* @__PURE__ */ t(q, {
359
+ step: i,
353
360
  index: o,
354
361
  isLast: o === e.length - 1,
355
362
  appearance: r,
356
363
  itemSlot: a,
357
364
  expandable: n,
358
- expanded: I.has(s.id),
359
- active: d === s.id,
360
- onExpandedChange: () => x(s.id)
361
- }) }, s.id))
365
+ expanded: I.has(i.id),
366
+ active: s === i.id,
367
+ onExpandedChange: () => x(i.id)
368
+ }) }, i.id))
362
369
  }) : null;
363
370
  }
364
371
  ae.displayName = "WorkflowStepRenderer";
365
372
  export {
366
373
  ae as n,
367
- q as r,
368
- A as t
374
+ $ as r,
375
+ q as t
369
376
  };
370
377
 
371
378
  //# sourceMappingURL=workflow-step-renderer.js.map