{"version":3,"file":"AutoMarkdownScrollTag.BVDftTfK.mjs","names":["useRef","__legacyOverrideHOC_DataObserverContext","_jsx"],"sources":["https:/framerusercontent.com/modules/klamiCJYUz4NaD4Hq8N4/g35fOvnhVNIVYUJp9UsY/AutoMarkdownScrollTag.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";const OFFSET=120;function slugify(input){return input.toLowerCase().trim().replace(/['\"]/g,\"\").replace(/[^a-z0-9]+/g,\"-\").replace(/^-+|-+$/g,\"\");}function scrollToId(id){const el=document.getElementById(id);if(!el)return;el.style.scrollMarginTop=`${OFFSET}px`;const top=el.getBoundingClientRect().top+window.scrollY-OFFSET;window.scrollTo({top,behavior:\"smooth\"});}export function AddHeadingAnchorsFramer(){const ref=useRef(null);useEffect(()=>{const root=ref.current;if(!root)return;const applyAnchors=()=>{const used=new Map;const makeUnique=base=>{const count=used.get(base)??0;used.set(base,count+1);return count===0?base:`${base}-${count+1}`;};const headings=root.querySelectorAll(\"h1, h2, h3, h4, h5, h6\");headings.forEach(h=>{const text=(h.textContent??\"\").trim();if(!text)return;const base=slugify(text);if(!base)return;// If Framer re-renders, we may re-run; keep existing id if already set\nconst existing=h.getAttribute(\"id\");if(existing){h.style.scrollMarginTop=`${OFFSET}px`;return;}const id=makeUnique(base);h.setAttribute(\"id\",id);h.style.scrollMarginTop=`${OFFSET}px`;});};applyAnchors();// Re-apply if Framer re-renders the markdown content\nconst observer=new MutationObserver(()=>applyAnchors());observer.observe(root,{subtree:true,childList:true,characterData:true});// Intercept clicks early (capture phase) so Framer routing can’t swallow it\nconst onClickCapture=e=>{const target=e.target;const a=target?.closest(\"a\");if(!a)return;const hrefAttr=a.getAttribute(\"href\")??\"\";if(!hrefAttr.includes(\"#\"))return;// Handle both \"#section\" and \"/page#section\" (same-page hashes)\nconst url=new URL(hrefAttr,window.location.href);const samePage=url.pathname===window.location.pathname;const hash=url.hash;if(!samePage||!hash||hash===\"#\")return;const id=decodeURIComponent(hash.slice(1));if(!id)return;if(!document.getElementById(id))return;e.preventDefault();e.stopPropagation();// Keep URL in sync without the browser doing its own jump\nhistory.replaceState(null,\"\",hash);scrollToId(id);};document.addEventListener(\"click\",onClickCapture,true);// If the page loads with a hash, scroll after layout settles\nconst scrollInitialHash=()=>{const hash=window.location.hash;if(!hash||hash===\"#\")return;const id=decodeURIComponent(hash.slice(1));// Framer layout can settle a tick later; two RAFs is a reliable trick here\nrequestAnimationFrame(()=>{requestAnimationFrame(()=>{if(document.getElementById(id))scrollToId(id);});});};scrollInitialHash();// Also handle manual hash changes\nconst onHashChange=()=>scrollInitialHash();window.addEventListener(\"hashchange\",onHashChange);return()=>{observer.disconnect();document.removeEventListener(\"click\",onClickCapture,true);window.removeEventListener(\"hashchange\",onHashChange);};},[]);return{ref:node=>{ref.current=node;}};}import{useContext as __legacyOverrideHOC_useContext}from\"react\";import{DataObserverContext as __legacyOverrideHOC_DataObserverContext}from\"framer\";export function withAddHeadingAnchorsFramer(C){return props=>{__legacyOverrideHOC_useContext(__legacyOverrideHOC_DataObserverContext);return _jsx(C,{...props,...AddHeadingAnchorsFramer(props)});};}withAddHeadingAnchorsFramer.displayName=\"AddHeadingAnchorsFramer\";\nexport const __FramerMetadata__ = {\"exports\":{\"AddHeadingAnchorsFramer\":{\"type\":\"override\",\"name\":\"AddHeadingAnchorsFramer\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withAddHeadingAnchorsFramer\":{\"type\":\"reactHoc\",\"name\":\"withAddHeadingAnchorsFramer\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AutoMarkdownScrollTag.map"],"mappings":"gMAAgG,SAAS,EAAQ,EAAM,CAAC,OAAO,EAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,QAAQ,GAAG,CAAC,QAAQ,cAAc,IAAI,CAAC,QAAQ,WAAW,GAAG,CAAE,SAAS,EAAW,EAAG,CAAC,IAAM,EAAG,SAAS,eAAe,EAAG,CAAC,GAAG,CAAC,EAAG,OAAO,EAAG,MAAM,gBAAgB,GAAG,EAAO,IAAI,IAAM,EAAI,EAAG,uBAAuB,CAAC,IAAI,EAAO,QAAQ,EAAO,EAAO,SAAS,CAAC,MAAI,SAAS,SAAS,CAAC,CAAE,SAAgB,GAAyB,CAAC,IAAM,EAAIA,EAAO,KAAK,CAQrQ,OARsQ,MAAc,CAAC,IAAM,EAAK,EAAI,QAAQ,GAAG,CAAC,EAAK,OAAO,IAAM,MAAiB,CAAC,IAAM,EAAK,IAAI,IAAU,EAAW,GAAM,CAAC,IAAM,EAAM,EAAK,IAAI,EAAK,EAAE,EAAyB,OAAvB,EAAK,IAAI,EAAK,EAAM,EAAE,CAAQ,IAAQ,EAAE,EAAK,GAAG,EAAK,GAAG,EAAM,KAAqB,EAAK,iBAAiB,yBAAyB,CAAU,QAAQ,GAAG,CAAC,IAAM,GAAM,EAAE,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,EAAK,OAAO,IAAM,EAAK,EAAQ,EAAK,CAAC,GAAG,CAAC,EAAK,OACh2B,GAArB,EAAE,aAAa,KAAK,CAAa,CAAC,EAAE,MAAM,gBAAgB,GAAG,EAAO,IAAI,OAAQ,IAAM,EAAG,EAAW,EAAK,CAAC,EAAE,aAAa,KAAK,EAAG,CAAC,EAAE,MAAM,gBAAgB,GAAG,EAAO,KAAM,EAAG,GAAc,CAC1M,IAAM,EAAS,IAAI,qBAAqB,GAAc,CAAC,CAAC,EAAS,QAAQ,EAAK,CAAC,QAAQ,GAAK,UAAU,GAAK,cAAc,GAAK,CAAC,CAC/H,IAAM,EAAe,GAAG,CAAuB,IAAM,EAAf,EAAE,QAAuB,QAAQ,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,IAAM,EAAS,EAAE,aAAa,OAAO,EAAE,GAAG,GAAG,CAAC,EAAS,SAAS,IAAI,CAAC,OAC9J,IAAM,EAAI,IAAI,IAAI,EAAS,EAAO,SAAS,KAAK,CAAO,EAAS,EAAI,WAAW,EAAO,SAAS,SAAe,EAAK,EAAI,KAAK,GAAG,CAAC,GAAU,CAAC,GAAM,IAAO,IAAI,OAAO,IAAM,EAAG,mBAAmB,EAAK,MAAM,EAAE,CAAC,CAAK,GAAc,SAAS,eAAe,EAAG,GAAQ,EAAE,gBAAgB,CAAC,EAAE,iBAAiB,CACzS,QAAQ,aAAa,KAAK,GAAG,EAAK,CAAC,EAAW,EAAG,GAAG,SAAS,iBAAiB,QAAQ,EAAe,GAAK,CAC1G,IAAM,MAAsB,CAAC,IAAM,EAAK,EAAO,SAAS,KAAK,GAAG,CAAC,GAAM,IAAO,IAAI,OAAO,IAAM,EAAG,mBAAmB,EAAK,MAAM,EAAE,CAAC,CACnI,0BAA0B,CAAC,0BAA0B,CAAI,SAAS,eAAe,EAAG,EAAC,EAAW,EAAG,EAAG,EAAG,EAAG,GAAmB,CAC/H,IAAM,MAAiB,GAAmB,CAAoD,OAAnD,EAAO,iBAAiB,aAAa,EAAa,KAAW,CAAC,EAAS,YAAY,CAAC,SAAS,oBAAoB,QAAQ,EAAe,GAAK,CAAC,EAAO,oBAAoB,aAAa,EAAa,GAAK,EAAE,CAAC,CAAO,CAAC,IAAI,GAAM,CAAC,EAAI,QAAQ,GAAO,CAAqJ,SAAgB,EAA4B,EAAE,CAAC,MAAO,KAAQ,EAA+BC,EAAwC,CAAQC,EAAK,EAAE,CAAC,GAAG,EAAM,GAAG,EAAwB,EAAM,CAAC,CAAC,yBARvkB,IAAoC,IAQkW,CAR5V,EAAO,IAQ0hB,EAA4B,YAAY"}