{"version":3,"sources":["../../src/docs/DocsToc.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { TocEntry } from './types';\n\ninterface Props {\n  entries: TocEntry[];\n}\n\n/**\n * Right-rail \"On this page\" navigator with scroll-spy.\n *\n * Uses IntersectionObserver to track which heading is currently in the\n * viewport's top band and highlights the matching TOC entry. Falls back\n * to the last heading above the viewport when nothing is in view so the\n * TOC never blanks at the bottom of a long page.\n *\n * rootMargin tuned to `0 0 -65% 0` — heading becomes active when it\n * enters the top 35% of the viewport. That feels natural for reading\n * speed without ping-ponging at chapter boundaries.\n */\nexport function DocsToc({ entries }: Props) {\n  const [active, setActive] = useState<string | null>(null);\n\n  useEffect(() => {\n    if (entries.length === 0) return;\n    const targets = entries\n      .map((e) => document.getElementById(e.slug))\n      .filter((el): el is HTMLElement => el !== null);\n    if (targets.length === 0) return;\n\n    const visible = new Map<string, number>();\n    const observer = new IntersectionObserver(\n      (mutations) => {\n        for (const m of mutations) {\n          const id = m.target.id;\n          if (m.isIntersecting) {\n            visible.set(id, m.boundingClientRect.top);\n          } else {\n            visible.delete(id);\n          }\n        }\n        if (visible.size > 0) {\n          const topmost = [...visible.entries()].sort((a, b) => a[1] - b[1])[0][0];\n          setActive(topmost);\n          return;\n        }\n        let lastAbove: string | null = null;\n        for (const target of targets) {\n          if (target.getBoundingClientRect().top < 100) {\n            lastAbove = target.id;\n          }\n        }\n        if (lastAbove) setActive(lastAbove);\n      },\n      { rootMargin: '0px 0px -65% 0px', threshold: 0 },\n    );\n    targets.forEach((t) => observer.observe(t));\n    return () => observer.disconnect();\n  }, [entries]);\n\n  if (entries.length === 0) return null;\n\n  return (\n    <>\n      <p className=\"mb-3 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground\">\n        On this page\n      </p>\n      <ul className=\"space-y-1.5\">\n        {entries.map((entry) => {\n          const isActive = active === entry.slug;\n          return (\n            <li key={entry.slug} className={entry.depth === 3 ? 'pl-3' : ''}>\n              <a\n                href={`#${entry.slug}`}\n                className={\n                  isActive\n                    ? 'block border-l-2 border-primary pl-2 text-xs font-medium leading-snug text-foreground transition-colors -ml-[2px]'\n                    : 'block border-l-2 border-transparent pl-2 text-xs leading-snug text-muted-foreground transition-colors hover:text-foreground -ml-[2px]'\n                }\n              >\n                {entry.text}\n              </a>\n            </li>\n          );\n        })}\n      </ul>\n    </>\n  );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgEI;AA9DJ,mBAAoC;AAmB7B,SAAS,QAAQ,EAAE,QAAQ,GAAU;AAC1C,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAwB,IAAI;AAExD,8BAAU,MAAM;AACd,QAAI,QAAQ,WAAW,EAAG;AAC1B,UAAM,UAAU,QACb,IAAI,CAAC,MAAM,SAAS,eAAe,EAAE,IAAI,CAAC,EAC1C,OAAO,CAAC,OAA0B,OAAO,IAAI;AAChD,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,UAAU,oBAAI,IAAoB;AACxC,UAAM,WAAW,IAAI;AAAA,MACnB,CAAC,cAAc;AACb,mBAAW,KAAK,WAAW;AACzB,gBAAM,KAAK,EAAE,OAAO;AACpB,cAAI,EAAE,gBAAgB;AACpB,oBAAQ,IAAI,IAAI,EAAE,mBAAmB,GAAG;AAAA,UAC1C,OAAO;AACL,oBAAQ,OAAO,EAAE;AAAA,UACnB;AAAA,QACF;AACA,YAAI,QAAQ,OAAO,GAAG;AACpB,gBAAM,UAAU,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACvE,oBAAU,OAAO;AACjB;AAAA,QACF;AACA,YAAI,YAA2B;AAC/B,mBAAW,UAAU,SAAS;AAC5B,cAAI,OAAO,sBAAsB,EAAE,MAAM,KAAK;AAC5C,wBAAY,OAAO;AAAA,UACrB;AAAA,QACF;AACA,YAAI,UAAW,WAAU,SAAS;AAAA,MACpC;AAAA,MACA,EAAE,YAAY,oBAAoB,WAAW,EAAE;AAAA,IACjD;AACA,YAAQ,QAAQ,CAAC,MAAM,SAAS,QAAQ,CAAC,CAAC;AAC1C,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,SACE,4EACE;AAAA,gDAAC,OAAE,WAAU,iFAAgF,0BAE7F;AAAA,IACA,4CAAC,QAAG,WAAU,eACX,kBAAQ,IAAI,CAAC,UAAU;AACtB,YAAM,WAAW,WAAW,MAAM;AAClC,aACE,4CAAC,QAAoB,WAAW,MAAM,UAAU,IAAI,SAAS,IAC3D;AAAA,QAAC;AAAA;AAAA,UACC,MAAM,IAAI,MAAM,IAAI;AAAA,UACpB,WACE,WACI,sHACA;AAAA,UAGL,gBAAM;AAAA;AAAA,MACT,KAVO,MAAM,IAWf;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;","names":[]}