{"version":3,"file":"ConsoleNav.mjs","names":[],"sources":["../../../src/dashboard/ConsoleNav/ConsoleNav.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown, Play } from 'lucide-react';\nimport { type ReactNode, useCallback, useEffect, useId, useRef, useState } from 'react';\n\nimport Tooltip from '@/base-ui/Tooltip';\nimport Icon from '@/Icon';\nimport ScrollShadow from '@/ScrollShadow';\n\nimport { useConsoleShellState } from '../ConsoleShell/context';\nimport { useLocalStorage, usePrefersReducedMotion } from '../hooks';\nimport { collectNavItems, findActiveBranch, resolveActiveHref } from './active';\nimport { styles } from './style';\nimport type { ConsoleNavGroup, ConsoleNavItem, ConsoleNavLinkProps, ConsoleNavProps } from './type';\n\nconst PANEL_TRANSITION_MS = 160;\nconst RAIL_TRANSITION_MS = 200;\n\ntype ExpandedOverrides = Record<string, boolean>;\n\n/** Older builds stored the closed group keys as an array. */\nfunction readOverrides(value: unknown): ExpandedOverrides {\n  if (Array.isArray(value)) {\n    return Object.fromEntries(value.map((key) => [String(key), false]));\n  }\n  return value && typeof value === 'object' ? (value as ExpandedOverrides) : {};\n}\n\nfunction scrollActiveIntoView(container: HTMLElement, behavior: ScrollBehavior = 'auto') {\n  const link =\n    container.querySelector<HTMLElement>('[aria-current=\"page\"]') ??\n    [...container.querySelectorAll<HTMLElement>('button[data-active=\"true\"]')].at(-1);\n  if (!link) return;\n  const containerRect = container.getBoundingClientRect();\n  const linkRect = link.getBoundingClientRect();\n  if (linkRect.top >= containerRect.top && linkRect.bottom <= containerRect.bottom) return;\n  container.scrollBy({\n    behavior,\n    top: linkRect.top - containerRect.top - (containerRect.height - linkRect.height) / 2,\n  });\n}\n\ninterface LinkContext {\n  onNavigate?: (href: string) => void;\n  renderLink?: ConsoleNavProps['renderLink'];\n}\n\nfunction renderAnchor(context: LinkContext, linkProps: ConsoleNavLinkProps, onFollow: () => void) {\n  if (context.renderLink) return context.renderLink(linkProps);\n  return (\n    <a\n      aria-current={linkProps['aria-current']}\n      aria-label={linkProps['aria-label']}\n      className={linkProps.className}\n      data-active={linkProps['data-active']}\n      data-collapsed={linkProps['data-collapsed']}\n      data-indent={linkProps['data-indent']}\n      href={linkProps.href}\n      rel={linkProps.external ? 'noreferrer' : undefined}\n      target={linkProps.external ? '_blank' : undefined}\n      title={linkProps.title}\n      onClick={(event) => {\n        if (context.onNavigate && !linkProps.external) event.preventDefault();\n        onFollow();\n      }}\n    >\n      {linkProps.children}\n    </a>\n  );\n}\n\nfunction NavLink({\n  active,\n  collapsed,\n  context,\n  href,\n  icon,\n  indent = 0,\n  item,\n  name,\n  overlay = false,\n}: {\n  active: boolean;\n  collapsed: boolean;\n  context: LinkContext;\n  href: string;\n  icon?: ConsoleNavItem['icon'];\n  indent?: number;\n  item?: ConsoleNavItem;\n  name: string;\n  overlay?: boolean;\n}) {\n  const shell = useConsoleShellState();\n  const label = item?.label ?? name;\n  const follow = () => {\n    context.onNavigate?.(href);\n    shell?.closeNavigation();\n  };\n  const linkProps: ConsoleNavLinkProps = {\n    'aria-current': active ? 'page' : undefined,\n    'aria-label': collapsed ? name : undefined,\n    'children': overlay ? null : (\n      <>\n        {icon ? <Icon icon={icon} size={18} /> : null}\n        <span className={styles.itemLabel}>{label}</span>\n        {item?.badge ? <span className={styles.badge}>{item.badge}</span> : null}\n        {item?.badge ? <span aria-hidden className={styles.dot} /> : null}\n      </>\n    ),\n    'className': overlay ? styles.railLink : styles.item,\n    'data-active': active,\n    'data-collapsed': collapsed,\n    'data-indent': indent,\n    'external': item?.external,\n    href,\n    'onClick': follow,\n    'title': collapsed ? undefined : label,\n  };\n\n  const link = renderAnchor(context, linkProps, follow);\n\n  if (!icon && !overlay) return link;\n  // Always mounted so toggling the rail keeps the same link element and its label can fade.\n  return (\n    <Tooltip disabled={!collapsed} placement=\"right\" title={name}>\n      {link}\n    </Tooltip>\n  );\n}\n\nfunction Fold({ children, folded }: { children: ReactNode; folded: boolean }) {\n  return (\n    <div\n      aria-hidden={folded || undefined}\n      className={styles.fold}\n      data-folded={folded}\n      inert={folded || undefined}\n    >\n      <div>{children}</div>\n    </div>\n  );\n}\n\nfunction ConsoleNav({\n  collapsed: collapsedProp,\n  defaultExpanded = 'all',\n  groups = [],\n  items = [],\n  label = 'Primary',\n  onNavigate,\n  pathname,\n  renderLink,\n  storageKey,\n}: ConsoleNavProps) {\n  const id = useId();\n  const navRef = useRef<HTMLDivElement>(null);\n  const shell = useConsoleShellState();\n  const collapsed = collapsedProp ?? shell?.collapsed ?? false;\n  const reducedMotion = usePrefersReducedMotion();\n  const [storedOverrides, setStoredOverrides] = useLocalStorage<unknown>(storageKey, {});\n  const overrides = readOverrides(storedOverrides);\n  const context: LinkContext = { onNavigate, renderLink };\n\n  const activeHref = resolveActiveHref(pathname, [...items, ...collectNavItems(groups)]);\n  const activeBranch = findActiveBranch(pathname, groups, activeHref);\n\n  // Arriving on a page reopens its branch even if it was closed by hand earlier.\n  const [trackedPathname, setTrackedPathname] = useState(pathname);\n  if (trackedPathname !== pathname) {\n    setTrackedPathname(pathname);\n    if (activeBranch.some((key) => overrides[key] === false)) {\n      const next = { ...overrides };\n      for (const key of activeBranch) delete next[key];\n      setStoredOverrides(next);\n    }\n  }\n\n  const isExpanded = (group: ConsoleNavGroup) =>\n    overrides[group.key] ??\n    (activeBranch.includes(group.key) || (group.defaultExpanded ?? defaultExpanded === 'all'));\n\n  const toggleGroup = useCallback(\n    (key: string, expanded: boolean) => {\n      setStoredOverrides((current: unknown) => ({ ...readOverrides(current), [key]: !expanded }));\n    },\n    [setStoredOverrides],\n  );\n\n  useEffect(() => {\n    const container = navRef.current;\n    if (!container) return;\n    scrollActiveIntoView(container);\n    if (reducedMotion) return;\n    const timer = window.setTimeout(() => scrollActiveIntoView(container), PANEL_TRANSITION_MS);\n    return () => window.clearTimeout(timer);\n  }, [activeHref, pathname, reducedMotion]);\n\n  useEffect(() => {\n    const container = navRef.current;\n    if (!container) return;\n    const timer = window.setTimeout(\n      () => scrollActiveIntoView(container, reducedMotion ? 'auto' : 'smooth'),\n      reducedMotion ? 0 : RAIL_TRANSITION_MS,\n    );\n    return () => window.clearTimeout(timer);\n  }, [collapsed, reducedMotion]);\n\n  // The rail folds rows out of this same tree instead of rendering its own, so icons stay put\n  // while the sidebar width animates.\n  const renderItems = (\n    list: ConsoleNavItem[],\n    indent: number,\n    groupLabel: string | undefined,\n    foldable: boolean,\n  ) =>\n    list.map((item) => {\n      const link = (\n        <NavLink\n          active={item.href === activeHref}\n          collapsed={collapsed}\n          context={context}\n          href={item.href}\n          icon={item.icon}\n          indent={item.icon ? Math.max(0, indent - 1) : indent}\n          item={item}\n          key={item.href}\n          name={groupLabel ? `${groupLabel} / ${item.label}` : item.label}\n        />\n      );\n      if (item.icon || !foldable) return link;\n      return (\n        <Fold folded={collapsed} key={item.href}>\n          {link}\n        </Fold>\n      );\n    });\n\n  const renderGroup = (\n    group: ConsoleNavGroup,\n    level: number,\n    indent: number,\n    underRailIcon: boolean,\n  ) => {\n    const expanded = isExpanded(group);\n    const panelId = `${id}-${group.key}`;\n    // Nested groups are headings over their items, so the items keep the same indent.\n    const childIndent = indent + (group.icon ? 1 : 0);\n    const active = activeBranch.includes(group.key);\n    const railIcon = level === 0 && Boolean(group.icon);\n    const onRail = collapsed && !underRailIcon;\n    const open = onRail ? !railIcon : expanded;\n    const railHref = railIcon ? (group.href ?? collectNavItems([group])[0]?.href) : undefined;\n    const railEmpty = !railIcon && !collectNavItems([group]).some((item) => item.icon);\n\n    const header = (\n      <button\n        aria-controls={panelId}\n        aria-expanded={open}\n        aria-hidden={(onRail && railIcon) || undefined}\n        className={styles.groupHeader}\n        data-active={active}\n        data-icon={Boolean(group.icon)}\n        data-indent={indent}\n        data-level={level}\n        tabIndex={onRail && railIcon ? -1 : undefined}\n        type=\"button\"\n        onClick={() => toggleGroup(group.key, expanded)}\n      >\n        {group.icon ? <Icon icon={group.icon} size={16} /> : null}\n        <span className={styles.itemLabel} data-label=\"\">\n          {group.label}\n        </span>\n        {level === 0 ? (\n          <Icon className={styles.chevron} data-expanded={expanded} icon={ChevronDown} size={14} />\n        ) : (\n          <span className={styles.indicator} data-expanded={expanded}>\n            <Play fill={'currentColor'} size={7} strokeWidth={1} />\n          </span>\n        )}\n      </button>\n    );\n\n    let head: ReactNode = header;\n    if (railIcon) {\n      head = (\n        <div className={styles.groupHead}>\n          {header}\n          {onRail && railHref ? (\n            <NavLink\n              collapsed\n              overlay\n              active={activeBranch[0] === group.key}\n              context={context}\n              href={railHref}\n              name={group.label}\n            />\n          ) : null}\n        </div>\n      );\n    } else if (!underRailIcon) {\n      head = <Fold folded={onRail}>{header}</Fold>;\n    }\n\n    return (\n      <div\n        className={styles.group}\n        data-icon={Boolean(group.icon)}\n        data-level={level}\n        data-rail-empty={railEmpty}\n        key={group.key}\n      >\n        {head}\n        <div\n          aria-hidden={!open}\n          className={styles.groupPanel}\n          data-expanded={open}\n          data-instant={reducedMotion}\n          id={panelId}\n          inert={open ? undefined : true}\n        >\n          <div className={styles.groupItems}>\n            {renderItems(group.items ?? [], childIndent, group.label, !(underRailIcon || railIcon))}\n            {(group.groups ?? []).map((child) =>\n              renderGroup(child, level + 1, childIndent, underRailIcon || railIcon),\n            )}\n          </div>\n        </div>\n      </div>\n    );\n  };\n\n  return (\n    <ScrollShadow\n      aria-label={label}\n      as={'nav'}\n      className={styles.nav}\n      data-collapsed={collapsed}\n      orientation={'vertical'}\n      ref={navRef}\n      size={4}\n    >\n      {items.length > 0 ? (\n        <div\n          className={styles.topItems}\n          data-divided={groups.length > 0}\n          data-rail-empty={!items.some((item) => item.icon)}\n        >\n          {renderItems(items, 0, undefined, true)}\n        </div>\n      ) : null}\n      {groups.map((group) => renderGroup(group, 0, 0, false))}\n    </ScrollShadow>\n  );\n}\n\nConsoleNav.displayName = 'ConsoleNav';\n\nexport default ConsoleNav;\n"],"mappings":"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"}