{"version":3,"file":"ScrollButtons.C2lSAP0M.mjs","names":["useRef","useState","__legacyOverrideHOC_DataObserverContext","_jsx"],"sources":["https:/framerusercontent.com/modules/WJn3IUXTYYCnZng7WZsR/gCG1mxDmf4lNQvfSFhu1/ScrollButtons.js"],"sourcesContent":["// scrollButtons.tsx\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState}from\"react\";let scrollRef=null;let subscribers=new Set;const notify=()=>subscribers.forEach(fn=>fn());function maxScrollX(el){return Math.max(0,el.scrollWidth-el.clientWidth);}function atLeft(el){return el.scrollLeft<=0;}function atRight(el){return el.scrollLeft>=maxScrollX(el)-1;}/** Fäst på din HORIZONTAL scrollcontainer */export function ScrollContainer(){const ref=useRef(null);useEffect(()=>{scrollRef=ref.current;const el=ref.current;if(!el)return;const onScrollOrResize=()=>notify();el.addEventListener(\"scroll\",onScrollOrResize,{passive:true});window.addEventListener(\"resize\",onScrollOrResize);// Kicka igång första läget\nonScrollOrResize();return()=>{el.removeEventListener(\"scroll\",onScrollOrResize);window.removeEventListener(\"resize\",onScrollOrResize);if(scrollRef===el)scrollRef=null;notify();};},[]);// Säkerställ horisontell scroll – skadar inte om du redan har satt detta i UI:t\nreturn{ref,style:{overflowX:\"auto\",overflowY:\"hidden\",whiteSpace:\"normal\"}};}/** Hook som håller koll på kant-läge (vänster/höger) */function useEdgeDisabled(which){const[disabled,setDisabled]=useState(which===\"left\");useEffect(()=>{const update=()=>{if(!scrollRef)return setDisabled(true);setDisabled(which===\"left\"?atLeft(scrollRef):atRight(scrollRef));};subscribers.add(update);// Fallback: uppdatera då och då om något i layouten ändras utanför scroll/resize\nconst iv=setInterval(update,250);update();return()=>{subscribers.delete(update);clearInterval(iv);};},[which]);return disabled;}/** Håll-för-scroll (kontinuerlig) + klick-”step” */function useHoldScroll(dxPerSecond,stepOnTap){const holdRef=useRef({raf:null,running:false});const start=dir=>{if(!scrollRef)return;if(holdRef.current.running)return;holdRef.current.running=true;let last=performance.now();const loop=t=>{if(!scrollRef||!holdRef.current.running){holdRef.current.raf=null;return;}const dt=(t-last)/1e3;last=t;const el=scrollRef;const edgeStop=dir<0?atLeft(el):atRight(el);if(edgeStop){stop();return;}const dx=dir*dxPerSecond*dt;el.scrollBy({left:dx,behavior:\"auto\"})// kontinuerlig, ej 'smooth' i loop\n;notify();holdRef.current.raf=requestAnimationFrame(loop);};holdRef.current.raf=requestAnimationFrame(loop);};const stop=()=>{holdRef.current.running=false;if(holdRef.current.raf)cancelAnimationFrame(holdRef.current.raf);holdRef.current.raf=null;};const tap=dir=>{if(!scrollRef)return;scrollRef.scrollBy({left:dir*stepOnTap,behavior:\"smooth\"});notify();};return{start,stop,tap};}/** Vänster knapp: håll-för-scroll vänster, klick = -300px */export function ScrollLeft(){const disabled=useEdgeDisabled(\"left\");const{start,stop,tap}=useHoldScroll(900,300)// 900 px/s, 300 px per klick\n;return{onPointerDown(){if(!disabled)start(-1);},onPointerUp(){stop();},onPointerCancel(){stop();},onPointerLeave(){stop();},onTap(){if(!disabled)tap(-1);},// Opacity + blockera klick när inaktiv\nstyle:{opacity:disabled?.3:1,pointerEvents:disabled?\"none\":\"auto\",transition:\"opacity 0.2s\"}};}/** Höger knapp: håll-för-scroll höger, klick = +300px */export function ScrollRight(){const disabled=useEdgeDisabled(\"right\");const{start,stop,tap}=useHoldScroll(900,300);return{onPointerDown(){if(!disabled)start(1);},onPointerUp(){stop();},onPointerCancel(){stop();},onPointerLeave(){stop();},onTap(){if(!disabled)tap(1);},style:{opacity:disabled?.3:1,pointerEvents:disabled?\"none\":\"auto\",transition:\"opacity 0.2s\"}};}import{useContext as __legacyOverrideHOC_useContext}from\"react\";import{DataObserverContext as __legacyOverrideHOC_DataObserverContext}from\"framer\";export function withScrollContainer(C){return props=>{__legacyOverrideHOC_useContext(__legacyOverrideHOC_DataObserverContext);return _jsx(C,{...props,...ScrollContainer(props)});};}withScrollContainer.displayName=\"ScrollContainer\";export function withScrollLeft(C){return props=>{__legacyOverrideHOC_useContext(__legacyOverrideHOC_DataObserverContext);return _jsx(C,{...props,...ScrollLeft(props)});};}withScrollLeft.displayName=\"ScrollLeft\";export function withScrollRight(C){return props=>{__legacyOverrideHOC_useContext(__legacyOverrideHOC_DataObserverContext);return _jsx(C,{...props,...ScrollRight(props)});};}withScrollRight.displayName=\"ScrollRight\";\nexport const __FramerMetadata__ = {\"exports\":{\"withScrollRight\":{\"type\":\"reactHoc\",\"name\":\"withScrollRight\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ScrollContainer\":{\"type\":\"override\",\"name\":\"ScrollContainer\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withScrollContainer\":{\"type\":\"reactHoc\",\"name\":\"withScrollContainer\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withScrollLeft\":{\"type\":\"reactHoc\",\"name\":\"withScrollLeft\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ScrollLeft\":{\"type\":\"override\",\"name\":\"ScrollLeft\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"ScrollRight\":{\"type\":\"override\",\"name\":\"ScrollRight\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ScrollButtons.map"],"mappings":"iMACkL,SAAS,EAAW,EAAG,CAAC,OAAO,KAAK,IAAI,EAAE,EAAG,YAAY,EAAG,WAAW,CAAE,CAAC,SAAS,EAAO,EAAG,CAAC,OAAO,EAAG,YAAY,CAAE,CAAC,SAAS,EAAQ,EAAG,CAAC,OAAO,EAAG,YAAY,EAAW,CAAE,EAAE,CAAE,CAA8C,SAAgB,GAAiB,CAAC,IAAM,EAAIA,EAAO,IAAI,EAE1c,OAF4c,MAAc,CAAC,EAAU,EAAI,QAAQ,IAAM,EAAG,EAAI,QAAQ,GAAG,CAAC,EAAG,OAAO,IAAM,MAAqB,EAAO,EACniB,OADqiB,EAAG,iBAAiB,SAAS,EAAiB,CAAC,QAAQ,EAAI,CAAC,EAAE,EAAO,iBAAiB,SAAS,CAAgB,EACvqB,EAAiB,MAAY,CAAC,EAAG,oBAAoB,SAAS,CAAgB,EAAE,EAAO,oBAAoB,SAAS,CAAgB,EAAK,IAAY,IAAG,EAAU,MAAK,EAAO,CAAE,CAAE,EAAE,CAAC,CAAC,EAChL,CAAC,MAAI,MAAM,CAAC,UAAU,OAAO,UAAU,SAAS,WAAW,QAAQ,CAAC,CAAE,CAAyD,SAAS,EAAgB,EAAM,CAAC,GAAK,CAAC,EAAS,GAAaC,EAAS,IAAQ,MAAM,EACzG,OAD2G,MAAc,CAAC,IAAM,MAAW,CAAC,GAAG,CAAC,EAAU,OAAO,EAAY,EAAI,EAAE,EAAY,IAAQ,OAAO,EAAO,CAAS,EAAE,EAAQ,CAAS,CAAC,CAAE,EAAE,EAAY,IAAI,CAAM,EAC3X,IAAM,EAAG,YAAY,EAAO,GAAG,EAAW,OAAT,EAAO,MAAY,CAAC,EAAY,OAAO,CAAM,EAAE,cAAc,CAAE,CAAE,CAAE,EAAE,CAAC,CAAK,CAAC,EAAS,CAAS,CAAqD,SAAS,EAAc,EAAY,EAAU,CAAC,IAAM,EAAQD,EAAO,CAAC,IAAI,KAAK,QAAQ,EAAK,CAAC,EAAQ,EAAM,GAAK,CAAsB,GAAlB,CAAC,GAAoB,EAAQ,QAAQ,QAAQ,OAAO,EAAQ,QAAQ,QAAQ,GAAK,IAAI,EAAK,YAAY,IAAI,EAAQ,EAAK,GAAG,CAAC,GAAG,CAAC,GAAW,CAAC,EAAQ,QAAQ,QAAQ,CAAC,EAAQ,QAAQ,IAAI,KAAK,MAAO,CAAC,IAAM,GAAI,EAAE,GAAM,IAAI,EAAK,EAAE,IAAM,EAAG,EAAsD,GAA7B,EAAI,EAAE,EAAO,CAAE,EAAE,EAAQ,CAAE,EAAc,CAAC,EAAK,EAAE,MAAO,CAAC,IAAM,EAAG,EAAI,EAAY,EAAG,EAAG,SAAS,CAAC,KAAK,EAAG,SAAS,MAAM,CAAC,EACnqB,EAAO,EAAE,EAAQ,QAAQ,IAAI,sBAAsB,CAAI,CAAE,EAAE,EAAQ,QAAQ,IAAI,sBAAsB,CAAI,CAAE,EAAQ,MAAS,CAAC,EAAQ,QAAQ,QAAQ,GAAS,EAAQ,QAAQ,KAAI,qBAAqB,EAAQ,QAAQ,GAAG,EAAE,EAAQ,QAAQ,IAAI,IAAK,EAA6G,MAAM,CAAC,QAAM,OAAK,IAAnH,GAAK,CAAK,IAAiB,EAAU,SAAS,CAAC,KAAK,EAAI,EAAU,SAAS,QAAQ,CAAC,EAAE,EAAO,EAAE,CAAuB,CAAE,CAA8D,SAAgB,GAAY,CAAC,IAAM,EAAS,EAAgB,MAAM,EAAO,CAAC,QAAM,OAAK,OAAK,EAAc,IAAI,GAAG,EACtiB,MAAM,CAAC,eAAe,CAAK,GAAS,EAAM,EAAE,CAAE,EAAE,aAAa,CAAC,EAAK,CAAE,EAAE,iBAAiB,CAAC,EAAK,CAAE,EAAE,gBAAgB,CAAC,EAAK,CAAE,EAAE,OAAO,CAAK,GAAS,EAAI,EAAE,CAAE,EAC1J,MAAM,CAAC,QAAQ,EAAS,GAAG,EAAE,cAAc,EAAS,OAAO,OAAO,WAAW,cAAc,CAAC,CAAE,CAA0D,SAAgB,GAAa,CAAC,IAAM,EAAS,EAAgB,OAAO,EAAO,CAAC,QAAM,OAAK,OAAK,EAAc,IAAI,GAAG,EAAE,MAAM,CAAC,eAAe,CAAK,GAAS,EAAM,CAAC,CAAE,EAAE,aAAa,CAAC,EAAK,CAAE,EAAE,iBAAiB,CAAC,EAAK,CAAE,EAAE,gBAAgB,CAAC,EAAK,CAAE,EAAE,OAAO,CAAK,GAAS,EAAI,CAAC,CAAE,EAAE,MAAM,CAAC,QAAQ,EAAS,GAAG,EAAE,cAAc,EAAS,OAAO,OAAO,WAAW,cAAc,CAAC,CAAE,CAAoJ,SAAgB,EAAoB,EAAE,CAAC,MAAO,KAAQ,EAA+BE,CAAuC,EAASC,EAAK,EAAE,CAAC,GAAG,EAAM,GAAG,EAAgB,CAAK,CAAC,CAAC,EAAI,CAAmD,SAAgB,EAAe,EAAE,CAAC,MAAO,KAAQ,EAA+BD,CAAuC,EAASC,EAAK,EAAE,CAAC,GAAG,EAAM,GAAG,EAAW,CAAK,CAAC,CAAC,EAAI,CAAyC,SAAgB,EAAgB,EAAE,CAAC,MAAO,KAAQ,EAA+BD,CAAuC,EAASC,EAAK,EAAE,CAAC,GAAG,EAAM,GAAG,EAAY,CAAK,CAAC,CAAC,EAAI,2BANltC,IAA6C,IAM8jB,EANzjB,EAAU,KAAS,EAAY,IAAI,IAAU,MAAW,EAAY,QAAQ,GAAI,EAAG,CAAC,EAM2pB,EAAoB,YAAY,kBAA6L,EAAe,YAAY,aAA0L,EAAgB,YAAY"}