{"version":3,"sources":["../../src/docs/DocsSidebar.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport Link from 'next/link';\nimport { ChevronRight } from 'lucide-react';\nimport type { DocGroup } from './types';\n\ninterface DocsSidebarProps {\n  groups: DocGroup[];\n  currentHref: string;\n  /**\n   * localStorage key for persisting open-group state. Default is\n   * \"docs-sidebar-open-groups\" — pass a product-scoped key if multiple\n   * docs instances share an origin.\n   */\n  storageKey?: string;\n}\n\n/**\n * Fixed-height scrollable sidebar with collapsible groups. Styling\n * mirrors the dashboard sidebar so docs and portal feel like one\n * product. Groups containing the active route auto-open on first load\n * AND on every hydration thereafter (defensive against stale storage).\n */\nexport function DocsSidebar({\n  groups,\n  currentHref,\n  storageKey = 'docs-sidebar-open-groups',\n}: DocsSidebarProps) {\n  const initialOpen = () => {\n    const set = new Set<string>();\n    for (const g of groups) {\n      if (g.items.some((i) => i.href === currentHref)) {\n        set.add(g.heading);\n      }\n    }\n    return set;\n  };\n  const [open, setOpen] = useState<Set<string>>(initialOpen);\n  const [hydrated, setHydrated] = useState(false);\n\n  useEffect(() => {\n    setHydrated(true);\n    try {\n      const raw = localStorage.getItem(storageKey);\n      if (raw) {\n        const arr = JSON.parse(raw) as string[];\n        const next = new Set(arr);\n        for (const g of groups) {\n          if (g.items.some((i) => i.href === currentHref)) next.add(g.heading);\n        }\n        setOpen(next);\n      }\n    } catch {\n      /* ignore corrupted storage */\n    }\n  }, [currentHref, groups, storageKey]);\n\n  useEffect(() => {\n    if (!hydrated) return;\n    try {\n      localStorage.setItem(storageKey, JSON.stringify(Array.from(open)));\n    } catch {\n      /* ignore */\n    }\n  }, [open, hydrated, storageKey]);\n\n  function toggle(heading: string) {\n    setOpen((prev) => {\n      const next = new Set(prev);\n      if (next.has(heading)) next.delete(heading);\n      else next.add(heading);\n      return next;\n    });\n  }\n\n  return (\n    <nav className=\"grid gap-4\" aria-label=\"Docs sidebar\">\n      {groups.map((g) => {\n        const isOpen = open.has(g.heading);\n        const groupHasActive = g.items.some((i) => i.href === currentHref);\n        return (\n          <div key={g.heading}>\n            <button\n              type=\"button\"\n              onClick={() => toggle(g.heading)}\n              className=\"group flex w-full items-center justify-between px-2.5 pb-1.5 text-left\"\n              aria-expanded={isOpen}\n            >\n              <span\n                className={\n                  'font-mono text-[10.5px] uppercase tracking-[0.12em] font-semibold ' +\n                  (groupHasActive\n                    ? 'text-foreground'\n                    : 'text-muted-foreground/70 group-hover:text-foreground')\n                }\n              >\n                {g.heading}\n              </span>\n              <ChevronRight\n                className={\n                  'h-3 w-3 text-muted-foreground/70 transition-transform ' +\n                  (isOpen ? 'rotate-90' : '')\n                }\n                aria-hidden\n              />\n            </button>\n            {isOpen && (\n              <ul className=\"grid gap-px\">\n                {g.items.map((item) => {\n                  const active = item.href === currentHref;\n                  return (\n                    <li key={item.href}>\n                      <Link\n                        href={item.href}\n                        className={\n                          'flex items-center gap-2.5 rounded-lg py-[7px] px-2.5 text-[13.5px] transition-colors ' +\n                          (active\n                            ? 'bg-primary/10 text-primary font-semibold'\n                            : 'text-muted-foreground hover:text-foreground hover:bg-muted/60')\n                        }\n                      >\n                        {item.title}\n                      </Link>\n                    </li>\n                  );\n                })}\n              </ul>\n            )}\n          </div>\n        );\n      })}\n    </nav>\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAmFY;AAjFZ,mBAAoC;AACpC,kBAAiB;AACjB,0BAA6B;AAoBtB,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,aAAa;AACf,GAAqB;AACnB,QAAM,cAAc,MAAM;AACxB,UAAM,MAAM,oBAAI,IAAY;AAC5B,eAAW,KAAK,QAAQ;AACtB,UAAI,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,GAAG;AAC/C,YAAI,IAAI,EAAE,OAAO;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,QAAM,CAAC,MAAM,OAAO,QAAI,uBAAsB,WAAW;AACzD,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAE9C,8BAAU,MAAM;AACd,gBAAY,IAAI;AAChB,QAAI;AACF,YAAM,MAAM,aAAa,QAAQ,UAAU;AAC3C,UAAI,KAAK;AACP,cAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,cAAM,OAAO,IAAI,IAAI,GAAG;AACxB,mBAAW,KAAK,QAAQ;AACtB,cAAI,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW,EAAG,MAAK,IAAI,EAAE,OAAO;AAAA,QACrE;AACA,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,aAAa,QAAQ,UAAU,CAAC;AAEpC,8BAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,QAAI;AACF,mBAAa,QAAQ,YAAY,KAAK,UAAU,MAAM,KAAK,IAAI,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,MAAM,UAAU,UAAU,CAAC;AAE/B,WAAS,OAAO,SAAiB;AAC/B,YAAQ,CAAC,SAAS;AAChB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,OAAO,EAAG,MAAK,OAAO,OAAO;AAAA,UACrC,MAAK,IAAI,OAAO;AACrB,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SACE,4CAAC,SAAI,WAAU,cAAa,cAAW,gBACpC,iBAAO,IAAI,CAAC,MAAM;AACjB,UAAM,SAAS,KAAK,IAAI,EAAE,OAAO;AACjC,UAAM,iBAAiB,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACjE,WACE,6CAAC,SACC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAS,MAAM,OAAO,EAAE,OAAO;AAAA,UAC/B,WAAU;AAAA,UACV,iBAAe;AAAA,UAEf;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,WACE,wEACC,iBACG,oBACA;AAAA,gBAGL,YAAE;AAAA;AAAA,YACL;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,WACE,4DACC,SAAS,cAAc;AAAA,gBAE1B,eAAW;AAAA;AAAA,YACb;AAAA;AAAA;AAAA,MACF;AAAA,MACC,UACC,4CAAC,QAAG,WAAU,eACX,YAAE,MAAM,IAAI,CAAC,SAAS;AACrB,cAAM,SAAS,KAAK,SAAS;AAC7B,eACE,4CAAC,QACC;AAAA,UAAC,YAAAA;AAAA,UAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WACE,2FACC,SACG,6CACA;AAAA,YAGL,eAAK;AAAA;AAAA,QACR,KAXO,KAAK,IAYd;AAAA,MAEJ,CAAC,GACH;AAAA,SA7CM,EAAE,OA+CZ;AAAA,EAEJ,CAAC,GACH;AAEJ;","names":["Link"]}