{"version":3,"file":"Smooth_Scroll.CdjGsZGS.mjs","names":["useRef","useState","_Fragment","__esmMin","window","init_ssg_sandbox_shims","init_npm_react_18_3_1","l","_e","p","c","init_jsx_runtime","ce","de","navigator","addPropertyControls","init_framer_DymZktPS","ControlType","OptimizedSmoothScroll","props","lenisRef","isLenisLoaded","setIsLenisLoaded","rafRef","isTouchDevice","setIsTouchDevice","isOverlayOpen","setIsOverlayOpen","isInitialLoadRef","lastScrollPosition","checkTouchDevice","shouldActivate","enabled","disableOnTouch","addInitialStyles","styleEl","existingStyle","isMounted","Lenis","intensity","t","raf","time","error","saveScrollPosition","interval","checkOverlayState","overlayElement","hasChildren","savedPosition","observer","htmlElement","bodyObserver","init_Smooth_Scroll"],"sources":["https:/framerusercontent.com/modules/d1dpbpF7eWnaDMhbXZFR/hsIceIG7b82ewTahN4HO/Smooth_Scroll.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{useEffect,useRef,useState}from\"react\";/**\n * @framerDisableUnlink\n */export default function OptimizedSmoothScroll(props){// Destructure props at the top level\nconst{intensity=10,enabled=true,disableOnTouch=true}=props;// Component state\nconst lenisRef=useRef(null);const[isLenisLoaded,setIsLenisLoaded]=useState(false);const rafRef=useRef(null);const[isTouchDevice,setIsTouchDevice]=useState(false);const[isOverlayOpen,setIsOverlayOpen]=useState(false);const isInitialLoadRef=useRef(true);const lastScrollPosition=useRef(0);// Check if the device is a touch device - function defined outside hooks\nconst checkTouchDevice=()=>{if(typeof window!==\"undefined\"){return\"ontouchstart\"in window||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0;}return false;};// Set touch device state on first render\nuseEffect(()=>{setIsTouchDevice(checkTouchDevice());},[]);// Determine if smooth scroll should be active\n// Now it also considers if an overlay is open\nconst shouldActivate=enabled&&!(disableOnTouch&&isTouchDevice)&&!isOverlayOpen;// Priority load styles to ensure smooth scroll is active from the start\nuseEffect(()=>{const addInitialStyles=()=>{// Add initial styles to ensure smooth scrolling is active from the start\nconst styleEl=document.createElement(\"style\");styleEl.id=\"lenis-initial-styles\";styleEl.innerHTML=`\n                html.lenis {\n                    height: auto;\n                }\n                \n                .lenis.lenis-smooth {\n                    scroll-behavior: auto !important;\n                }\n                \n                .lenis.lenis-smooth [data-lenis-prevent] {\n                    overscroll-behavior: contain;\n                }\n                \n                .lenis.lenis-stopped {\n                    overflow: hidden;\n                }\n                \n                .lenis.lenis-scrolling iframe {\n                    pointer-events: none;\n                }\n            `;document.head.appendChild(styleEl);return()=>{const existingStyle=document.getElementById(\"lenis-initial-styles\");if(existingStyle){existingStyle.remove();}};};// If we should activate, add styles right away\nif(shouldActivate){return addInitialStyles();}},[shouldActivate]);// Dynamically load Lenis to avoid issues during initial rendering\nuseEffect(()=>{if(!shouldActivate)return;let isMounted=true;// Load Lenis dynamically\nconst loadLenis=async()=>{try{// Use dynamic import to load Lenis only when needed\nconst Lenis=(await import(\"@studio-freight/lenis\")).default;if(isMounted){// Initialize Lenis with smoother settings\nlenisRef.current=new Lenis({duration:intensity/10,smoothWheel:true,syncTouch:!disableOnTouch,touchMultiplier:2,wheelMultiplier:1.5,orientation:\"vertical\",gestureOrientation:\"vertical\",smoothTouch:!disableOnTouch,easing:t=>Math.min(1,1.001-Math.pow(2,-10*t)),immediate:false});// Start the lenis instance immediately\nlenisRef.current.start();// Make sure to set up RAF loop immediately\nconst raf=time=>{if(lenisRef.current){lenisRef.current.raf(time);}rafRef.current=requestAnimationFrame(raf);};rafRef.current=requestAnimationFrame(raf);setIsLenisLoaded(true);}}catch(error){console.warn(\"Failed to load Lenis:\",error);}};// Load Lenis with higher priority\nsetTimeout(loadLenis,0);return()=>{isMounted=false;// Proper cleanup\nif(lenisRef.current){lenisRef.current.destroy();lenisRef.current=null;}if(rafRef.current){cancelAnimationFrame(rafRef.current);rafRef.current=null;}setIsLenisLoaded(false);};},[shouldActivate,intensity,disableOnTouch]);// Set up animation loop only when Lenis is loaded - Now this is handled in the initialization\nuseEffect(()=>{// Only handle stopping the RAF loop here, starting is done in the init\nif(!isLenisLoaded||!shouldActivate)return;return()=>{if(rafRef.current){cancelAnimationFrame(rafRef.current);rafRef.current=null;}};},[isLenisLoaded,shouldActivate]);// Only reset scroll position on initial load, not when closing overlay\nuseEffect(()=>{if(lenisRef.current&&isLenisLoaded){if(isInitialLoadRef.current){lenisRef.current.scrollTo(0,{immediate:true});isInitialLoadRef.current=false;}}},[isLenisLoaded]);// Save scroll position periodically\nuseEffect(()=>{if(!shouldActivate)return;const saveScrollPosition=()=>{lastScrollPosition.current=window.scrollY;};// Save position every 300ms\nconst interval=setInterval(saveScrollPosition,300);// Also save on scroll\nwindow.addEventListener(\"scroll\",saveScrollPosition,{passive:true});return()=>{clearInterval(interval);window.removeEventListener(\"scroll\",saveScrollPosition);};},[shouldActivate]);// Handle overlays and modals - Enhanced version\nuseEffect(()=>{// Function to check if overlay is open\nconst checkOverlayState=()=>{const overlayElement=document.getElementById(\"overlay\");if(overlayElement){// Check if the overlay has children (which means it's active)\nconst hasChildren=overlayElement.children.length>0;// Only update if the state actually changed to prevent unnecessary effects\nif(hasChildren!==isOverlayOpen){setIsOverlayOpen(hasChildren);if(hasChildren){// If overlay is opened, save current position first\nlastScrollPosition.current=window.scrollY;// Then stop Lenis\nif(lenisRef.current){lenisRef.current.stop();}}else if(enabled&&!(disableOnTouch&&isTouchDevice)){// If overlay is closed and should be active, restart Lenis\nif(lenisRef.current){// Get saved position before restart\nconst savedPosition=lastScrollPosition.current;lenisRef.current.start();// After a small delay, restore position\nsetTimeout(()=>{window.scrollTo({top:savedPosition,behavior:\"auto\"});},10);}}}}};// Run the check immediately\ncheckOverlayState();// Observe changes to the overlay element\nconst overlayElement=document.getElementById(\"overlay\");if(overlayElement){const observer=new MutationObserver(()=>{checkOverlayState();});observer.observe(overlayElement,{childList:true});return()=>{observer.disconnect();};}// Also observe the HTML element for overflow changes\n// This catches modals that might not use the overlay element\nconst htmlElement=document.documentElement;const bodyObserver=new MutationObserver(()=>{const isOverflowHidden=window.getComputedStyle(htmlElement).overflow===\"hidden\";if(isOverflowHidden){// Save position before stopping\nlastScrollPosition.current=window.scrollY;if(lenisRef.current){lenisRef.current.stop();}}else if(enabled&&!(disableOnTouch&&isTouchDevice)&&!isOverlayOpen){if(lenisRef.current){// Get saved position\nconst savedPosition=lastScrollPosition.current;lenisRef.current.start();// Restore position\nsetTimeout(()=>{window.scrollTo({top:savedPosition,behavior:\"auto\"});},10);}}});bodyObserver.observe(htmlElement,{attributes:true,attributeFilter:[\"style\"]});return()=>{bodyObserver.disconnect();};},[isOverlayOpen,enabled,disableOnTouch,isTouchDevice]);// Debug info for development purposes\nconst debugInfo=process.env.NODE_ENV===\"development\"?/*#__PURE__*/_jsxs(\"div\",{style:{display:\"none\"},children:[`Touch device: ${isTouchDevice?\"Yes\":\"No\"}`,`Smooth scroll active: ${shouldActivate?\"Yes\":\"No\"}`,`Overlay open: ${isOverlayOpen?\"Yes\":\"No\"}`,`Last scroll position: ${lastScrollPosition.current}`]}):null;return /*#__PURE__*/_jsxs(_Fragment,{children:[debugInfo,isLenisLoaded&&shouldActivate&&/*#__PURE__*/_jsx(\"style\",{children:`\n                    html.lenis {\n                        height: auto;\n                    }\n                    \n                    .lenis.lenis-smooth {\n                        scroll-behavior: auto !important;\n                    }\n                    \n                    .lenis.lenis-smooth [data-lenis-prevent] {\n                        overscroll-behavior: contain;\n                    }\n                    \n                    .lenis.lenis-stopped {\n                        overflow: hidden;\n                    }\n                    \n                    .lenis.lenis-scrolling iframe {\n                        pointer-events: none;\n                    }\n                    `})]});}OptimizedSmoothScroll.displayName=\"Smooth Scroll\";addPropertyControls(OptimizedSmoothScroll,{intensity:{title:\"Intensity\",type:ControlType.Number,defaultValue:10,min:1,max:20,step:1},enabled:{title:\"Enabled\",type:ControlType.Boolean,defaultValue:true},disableOnTouch:{title:\"Disable on touch devices\",type:ControlType.Boolean,defaultValue:true,description:\"Smooth Scroll v4 automatically disables smooth scrolling on phones and tablets and is now enhanced to disable automatically when overlays are open.\\n\\nBy [Andr\\xe9s Marciales](https://www.x.com/aamarciales)\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"OptimizedSmoothScroll\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Smooth_Scroll.map"],"mappings":"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"}