{"version":3,"file":"ScrollButtons.CT2ecbfM.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":"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"}