{"version":3,"file":"UseHideOnScroll.CYwyHpg-.mjs","names":["useSyncExternalStore"],"sources":["https:/framerusercontent.com/modules/MNUIIpNSxkmlPB58YaGE/u2MFOB9yYCf0yZmBBcQS/UseHideOnScroll.js"],"sourcesContent":["// HideOnScroll.tsx\n// Framer Code Override.\n// - withHideOnScroll: apply to the Banner only (hides on scroll down).\n// - withNavbarOffset: apply to the Navbar (always visible, shifts up\n//   smoothly to fill the space when the banner hides).\n// - withStickyOffset: apply to the sticky price/CTA element.\n// - withDynamicHeight: apply to the Hero section (fills remaining\n//   viewport height, stays in sync with the same store).\n//\n// All sticky/scroll behavior is disabled inside the Framer canvas\n// (RenderTarget.canvas), since position:sticky and direct DOM mutation\n// break under the canvas' internal transform/wrapper structure. Preview,\n// Open Preview, and the published/Live site are unaffected — they render\n// through the same code path as before.\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useSyncExternalStore}from\"react\";import{RenderTarget}from\"framer\";// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\nconst CONFIG={topOffset:100,hideThreshold:40,showThreshold:12,cooldownMs:200,// Material-style motion: decelerate on enter, accelerate on exit\nenterDuration:.3,enterEase:[0,0,.2,1],exitDuration:.22,exitEase:[.4,0,1,1]};function transitionFor(visible,property=\"top\"){const duration=visible?CONFIG.enterDuration:CONFIG.exitDuration;const ease=visible?CONFIG.enterEase:CONFIG.exitEase;return`${property} ${duration}s cubic-bezier(${ease.join(\",\")})`;}// Single source of truth for the sticky/desktop breakpoint (price/CTA\n// card and hero section both use this).\nconst STICKY_MIN_WIDTH=810;const STICKY_PADDING_BREAKPOINTS=[{minWidth:1200,padding:12},{minWidth:STICKY_MIN_WIDTH,padding:12},{minWidth:0,padding:0}];function getStickyPadding(width){const match=STICKY_PADDING_BREAKPOINTS.find(bp=>width>=bp.minWidth);return match?match.padding:0;}// ---------------------------------------------------------------------------\n// Shared store — one scroll/resize/height-tracking engine for the whole\n// page. Starts when the first override mounts, stops when the last one\n// unmounts.\n// ---------------------------------------------------------------------------\nlet state={visible:true,width:typeof window!==\"undefined\"?window.innerWidth:1200,height:typeof window!==\"undefined\"?window.innerHeight:800,bannerHeight:0,navbarHeight:0};const listeners=new Set;let stopEngine=null;function setState(patch){state={...state,...patch};listeners.forEach(fn=>fn());}function getSnapshot(){return state;}function subscribe(fn){listeners.add(fn);if(listeners.size===1&&typeof window!==\"undefined\"){stopEngine=startScrollEngine(setState);}return()=>{listeners.delete(fn);if(listeners.size===0&&stopEngine){stopEngine();stopEngine=null;}};}// Must not touch window/document — used during server rendering.\nconst SERVER_SNAPSHOT={visible:true,width:1200,height:800,bannerHeight:0,navbarHeight:0};function useScrollStore(selector){return useSyncExternalStore(subscribe,()=>selector(getSnapshot()),()=>selector(SERVER_SNAPSHOT));}// ---------------------------------------------------------------------------\n// Tracks the live height of whichever element matching `selector` is\n// currently visible on screen. Framer can keep multiple breakpoint\n// versions mounted at once (hidden via CSS), so we filter for the one\n// actually rendered.\n// ---------------------------------------------------------------------------\nfunction trackVisibleHeight(selector,onChange){let el=null;let observer=null;const getVisibleEl=()=>{const candidates=document.querySelectorAll(selector);for(const node of candidates){const c=node;if(c.offsetParent!==null&&c.getBoundingClientRect().height>0){return c;}}return null;};const attach=node=>{observer?.disconnect();observer=new ResizeObserver(()=>onChange(node.getBoundingClientRect().height));observer.observe(node);onChange(node.getBoundingClientRect().height);};el=getVisibleEl();if(el)attach(el);return{resolve:()=>{const next=getVisibleEl();if(next&&next!==el){el=next;attach(next);}else if(!next){el=null;onChange(0);}},disconnect:()=>observer?.disconnect()};}// ---------------------------------------------------------------------------\n// startScrollEngine — the only place in the file that touches window\n// scroll/resize listeners.\n// ---------------------------------------------------------------------------\nfunction startScrollEngine(update){// --- banner visibility (scroll direction/threshold) ---\nlet lastScrollY=window.scrollY;let accumulated=0;let direction=null;let lastToggleAt=0;let scrollTicking=false;let visible=true;const maxScroll=()=>document.documentElement.scrollHeight-window.innerHeight;const applyVisible=next=>{const now=performance.now();if(now-lastToggleAt<CONFIG.cooldownMs)return;if(next===visible)return;lastToggleAt=now;visible=next;update({visible});};const handleScroll=()=>{if(scrollTicking)return;scrollTicking=true;requestAnimationFrame(()=>{// Clamp for iOS rubber-banding (negative or over-max values)\nconst rawY=window.scrollY;const y=Math.min(Math.max(rawY,0),Math.max(maxScroll(),0));const delta=y-lastScrollY;lastScrollY=y;// Always visible near the top\nif(y<=CONFIG.topOffset){accumulated=0;direction=null;applyVisible(true);scrollTicking=false;return;}const currentDirection=delta>0?\"down\":delta<0?\"up\":null;if(!currentDirection){scrollTicking=false;return;}// Direction flip resets the accumulator so small back-and-forth\n// movements don't add up across opposite directions\nif(currentDirection!==direction){direction=currentDirection;accumulated=0;}accumulated+=Math.abs(delta);if(currentDirection===\"down\"&&accumulated>=CONFIG.hideThreshold){applyVisible(false);accumulated=0;}else if(currentDirection===\"up\"&&accumulated>=CONFIG.showThreshold){applyVisible(true);accumulated=0;}scrollTicking=false;});};// Ignore scroll events fired by resize (e.g. mobile keyboard) for ~150ms\nlet scrollResizing=false;let scrollResizeTimeout;const markScrollResizing=()=>{scrollResizing=true;clearTimeout(scrollResizeTimeout);scrollResizeTimeout=setTimeout(()=>scrollResizing=false,150);};const scrollListener=()=>{if(scrollResizing)return;handleScroll();};// --- viewport width/height ---\nlet widthTicking=false;const measureViewport=()=>update({width:window.innerWidth,height:window.innerHeight});// --- banner / navbar heights ---\nconst bannerTracker=trackVisibleHeight(\"[data-scroll-banner]\",h=>update({bannerHeight:h}));// const navbarTracker = trackVisibleHeight(\"[data-scroll-navbar]\", (h) =>\n//     update({ navbarHeight: h })\n// )\nconst navbarTracker=trackVisibleHeight('[data-framer-name=\"Wrapper [Nav] [Desktop]\"]',h=>update({navbarHeight:h}));// --- one resize listener drives width/height + banner/nav re-resolution ---\nconst handleResize=()=>{markScrollResizing();if(!widthTicking){widthTicking=true;requestAnimationFrame(()=>{measureViewport();widthTicking=false;});}bannerTracker.resolve();navbarTracker.resolve();};// iOS Safari can misreport window.innerWidth/innerHeight right after\n// first paint; re-measure a couple of times after mount to self-correct\nconst raf=requestAnimationFrame(()=>requestAnimationFrame(measureViewport));const settleTimeout=setTimeout(measureViewport,300);const vv=window.visualViewport;vv?.addEventListener(\"resize\",handleResize);window.addEventListener(\"resize\",handleResize,{passive:true});window.addEventListener(\"orientationchange\",handleResize,{passive:true});window.addEventListener(\"scroll\",scrollListener,{passive:true});return()=>{cancelAnimationFrame(raf);clearTimeout(settleTimeout);clearTimeout(scrollResizeTimeout);vv?.removeEventListener(\"resize\",handleResize);window.removeEventListener(\"resize\",handleResize);window.removeEventListener(\"orientationchange\",handleResize);window.removeEventListener(\"scroll\",scrollListener);bannerTracker.disconnect();navbarTracker.disconnect();};}// ---------------------------------------------------------------------------\n// useStickyBreakpointCSS — injects a media query that forces the sticky\n// price/CTA element to position:static below STICKY_MIN_WIDTH, using\n// !important. Evaluated synchronously by the browser at first layout, so\n// it can't race with React hydration or any JS timing.\n// ---------------------------------------------------------------------------\nfunction useStickyBreakpointCSS(){useEffect(()=>{const STYLE_ID=\"sticky-offset-breakpoint-override\";if(document.getElementById(STYLE_ID))return;const style=document.createElement(\"style\");style.id=STYLE_ID;style.textContent=`\n            @media (max-width: ${STICKY_MIN_WIDTH-1}px) {\n                [data-sticky-offset] {\n                    position: static !important;\n                    top: auto !important;\n                    transition: none !important;\n                }\n            }\n        `;document.head.appendChild(style);},[]);}// ---------------------------------------------------------------------------\n// useCollapseBannerWrapper — Framer auto-wraps component instances in a\n// sizing container div. CSS transform on the banner itself doesn't shrink\n// that wrapper's reserved height, which leaves a permanent gap the size\n// of the banner. This directly collapses the wrapper's real height in\n// sync with the same enter/exit timing, so the space actually closes.\n// Skipped entirely inside the canvas — the editor wraps instances in its\n// own internal containers, so `parentElement` there is not the real\n// layout wrapper and mutating it causes the banner/navbar overlap seen\n// only in canvas.\n// ---------------------------------------------------------------------------\nfunction useCollapseBannerWrapper(visible,bannerHeight,isCanvas){useEffect(()=>{if(isCanvas)return;const candidates=document.querySelectorAll(\"[data-scroll-banner]\");for(const node of candidates){const el=node;if(el.offsetParent===null)continue;// not the visible breakpoint instance\nconst wrapper=el.parentElement;if(!wrapper)continue;wrapper.style.overflow=\"hidden\";wrapper.style.transition=`height ${visible?CONFIG.enterDuration:CONFIG.exitDuration}s cubic-bezier(${(visible?CONFIG.enterEase:CONFIG.exitEase).join(\",\")})`;wrapper.style.height=visible?bannerHeight?`${bannerHeight}px`:\"auto\":\"0px\";}},[visible,bannerHeight,isCanvas]);}// ---------------------------------------------------------------------------\n// withHideOnScroll — apply to the Banner only\n// ---------------------------------------------------------------------------\nexport function withHideOnScroll(Component){return props=>{const isCanvas=RenderTarget.current()===RenderTarget.canvas;const visible=useScrollStore(s=>s.visible);const bannerHeight=useScrollStore(s=>s.bannerHeight);useCollapseBannerWrapper(visible,bannerHeight,isCanvas);return /*#__PURE__*/_jsx(Component,{...props,animate:isCanvas?undefined:{y:visible?0:\"-100%\",opacity:visible?1:.4},transition:isCanvas?undefined:{type:\"tween\",duration:visible?CONFIG.enterDuration:CONFIG.exitDuration,ease:visible?CONFIG.enterEase:CONFIG.exitEase},style:{...props.style,position:isCanvas?\"relative\":\"sticky\",top:isCanvas?undefined:0,willChange:isCanvas?undefined:\"transform\"},\"data-scroll-banner\":\"\"});};}// ---------------------------------------------------------------------------\n// withNavbarOffset — apply to the Navbar. Always visible, pinned to the\n// top. Once the banner wrapper's height actually collapses (see\n// useCollapseBannerWrapper), a fixed top:0 is enough — no dynamic offset\n// needed, the document flow handles it natively.\n// ---------------------------------------------------------------------------\nexport function withNavbarOffset(Component){return props=>{const isCanvas=RenderTarget.current()===RenderTarget.canvas;return /*#__PURE__*/_jsx(Component,{...props,\"data-scroll-navbar\":\"\",style:{...props.style,position:isCanvas?\"relative\":\"sticky\",top:isCanvas?undefined:0}});};}// ---------------------------------------------------------------------------\n// withStickyOffsetAlways — apply to the sticky element\n// ---------------------------------------------------------------------------\nexport function withStickyOffsetAlways(Component){return props=>{const isCanvas=RenderTarget.current()===RenderTarget.canvas;const visible=useScrollStore(s=>s.visible);const bannerHeight=useScrollStore(s=>s.bannerHeight);const navbarHeight=useScrollStore(s=>s.navbarHeight);const width=useScrollStore(s=>s.width);const padding=getStickyPadding(width);const offset=navbarHeight+(visible?bannerHeight:0)+padding;return /*#__PURE__*/_jsx(Component,{...props,style:{...props.style,position:isCanvas?\"relative\":\"sticky\",top:isCanvas?undefined:offset,transition:isCanvas?undefined:transitionFor(visible)}});};}// ---------------------------------------------------------------------------\n// withStickyOffset — apply to the sticky price/CTA element\n// ---------------------------------------------------------------------------\nexport function withStickyOffset(Component){return props=>{useStickyBreakpointCSS();const isCanvas=RenderTarget.current()===RenderTarget.canvas;const visible=useScrollStore(s=>s.visible);const bannerHeight=useScrollStore(s=>s.bannerHeight);const navbarHeight=useScrollStore(s=>s.navbarHeight);const width=useScrollStore(s=>s.width);const padding=getStickyPadding(width);const offset=navbarHeight+(visible?bannerHeight:0)+padding;return /*#__PURE__*/_jsx(Component,{...props,\"data-sticky-offset\":\"\",style:{...props.style,position:isCanvas?\"relative\":\"sticky\",top:isCanvas?undefined:offset,transition:isCanvas?undefined:transitionFor(visible)}});};}// ---------------------------------------------------------------------------\n// withDynamicHeight — apply to the Hero section. Fills the remaining\n// viewport height (100vh minus navbar + banner), staying in sync with\n// the same store as the banner/navbar/sticky overrides. Only active at\n// STICKY_MIN_WIDTH and above; below that, the component renders untouched.\n// In canvas, renders with no forced height so it doesn't fight the\n// editor's own sizing while the navbar/banner above are also static there.\n// ---------------------------------------------------------------------------\nconst HERO_MIN_CONTENT_HEIGHT=908;export function withDynamicHeight(Component){return props=>{const isCanvas=RenderTarget.current()===RenderTarget.canvas;const navbarHeight=useScrollStore(s=>s.navbarHeight);const bannerHeight=useScrollStore(s=>s.bannerHeight);const visible=useScrollStore(s=>s.visible);const width=useScrollStore(s=>s.width);const height=useScrollStore(s=>s.height);const isDesktop=width>=STICKY_MIN_WIDTH;if(!isDesktop||isCanvas){return /*#__PURE__*/_jsx(Component,{...props});}const totalHeight=navbarHeight+(visible?bannerHeight:0);const availableHeight=height-totalHeight;const justifyContent=availableHeight<HERO_MIN_CONTENT_HEIGHT?\"flex-start\":\"center\";return /*#__PURE__*/_jsx(Component,{...props,style:{...props.style,position:\"relative\",height:`calc(100vh - ${totalHeight}px)`,minHeight:`${HERO_MIN_CONTENT_HEIGHT}px`,justifyContent,transition:transitionFor(visible,\"height\")}});};}\nexport const __FramerMetadata__ = {\"exports\":{\"withStickyOffset\":{\"type\":\"reactHoc\",\"name\":\"withStickyOffset\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withNavbarOffset\":{\"type\":\"reactHoc\",\"name\":\"withNavbarOffset\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withStickyOffsetAlways\":{\"type\":\"reactHoc\",\"name\":\"withStickyOffsetAlways\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withHideOnScroll\":{\"type\":\"reactHoc\",\"name\":\"withHideOnScroll\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withDynamicHeight\":{\"type\":\"reactHoc\",\"name\":\"withDynamicHeight\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./UseHideOnScroll.map"],"mappings":"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"}