{"version":3,"file":"ScrollingColumns.CsbNMLFy.mjs","names":["useRef","useState","useMemo","useCallback","AnimatedColumn","_Fragment"],"sources":["https:/framerusercontent.com/modules/vuhiNXAZvPDvYWUaebKD/wBm0KmLtERFP6gBItgCJ/ScrollingColumns.js"],"sourcesContent":["/**\n * ScrollingColumns - Multi-Column Scroll Effect for Fixed Overlays\n * by Swiss Themes\n * swissthemes.design\n *\n * Creates coordinated column scroll animations with scroll hijacking.\n * Works in fixed-position overlays. All columns share one scroll state.\n *\n * FEATURES:\n * - Works in fixed overlay (scroll hijacking, no document flow required)\n * - Coordinated column movement (single scroll state)\n * - Alternating up/down directions per column\n * - Physics-based momentum scrolling\n * - Two scroll modes:\n *   - Finite: Configurable scroll duration (vh), locks after completion\n *   - Infinite: Endless seamless looping with content wrapping\n * - Per-column offsets (px) for staggered reveal in infinite mode\n * - GPU-accelerated transforms\n *\n * USAGE:\n * 1. Add component to canvas in a fixed-position container\n * 2. Add columns via property controls\n * 3. Set directions for each column (up/down)\n * 4. Choose scroll mode:\n *    - Finite: Set scroll duration (vh) for animation distance\n *    - Infinite: Columns loop endlessly, use offsets for staggered reveal\n */import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{memo,useEffect,useLayoutEffect,useState,useRef,useMemo,useCallback,cloneElement,isValidElement}from\"react\";import{motion,useMotionValue,useTransform}from\"framer-motion\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";// Default directions (alternating)\nconst DEFAULT_DIRECTIONS=[\"up\",\"down\",\"up\",\"down\"];// Default offsets (no stagger)\nconst DEFAULT_OFFSETS=[0,0,0,0];// Physics constants (from ScrollAnimatorFinite)\nconst FRICTION=.95;const VELOCITY_THRESHOLD=.1;const WHEEL_SENSITIVITY=.05;const RESIZE_THROTTLE_MS=150;// Touch momentum constants\nconst TOUCH_VELOCITY_DAMPING=.75;const VELOCITY_MIN_THRESHOLD=.5;// Infinite scroll constants\nconst NUM_COPIES=3// Number of content copies for infinite scroll\n;/** Wraps scroll position for infinite scrolling */function wrapScroll(scroll,direction,contentHeight,maxScroll){if(direction===\"up\"&&scroll>maxScroll){return scroll-contentHeight;}if(direction===\"down\"&&scroll<0){return scroll+contentHeight;}return scroll;}// Canvas preview: how much content peeks in (px)\nconst CANVAS_PEEK_AMOUNT=50;// Default viewport height for canvas mode (before window is measured)\nconst DEFAULT_VIEWPORT_HEIGHT=800;// Static styles (avoid allocations per render)\nconst CONTAINER_STYLE={position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\",isolation:\"isolate\",perspective:1e3};const COLUMNS_CONTAINER_STYLE={display:\"flex\",width:\"100%\",height:\"100%\",pointerEvents:\"auto\",contain:\"layout style\"};/**\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 800\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function ScrollingColumns(props){const{columns=[],directions=DEFAULT_DIRECTIONS,columnGap=0,scrollMode=\"finite\",scrollDuration=200,offsets=DEFAULT_OFFSETS,style}=props;// Check canvas mode once at top\nconst isCanvas=RenderTarget.current()===RenderTarget.canvas;// Unified scroll state - shared by all columns\nconst scrollY=useMotionValue(0);const scrollStateRef=useRef({velocity:0,animationFrame:null,touchActive:false,previousTouchY:0,touchVelocityHistory:[]});// DOM refs\nconst containerRef=useRef(null);const columnsContainerRef=useRef(null);// State\nconst[columnHeights,setColumnHeights]=useState([]);const[viewportHeight,setViewportHeight]=useState(0);const[containerHeight,setContainerHeight]=useState(0);const[isResizing,setIsResizing]=useState(false);// Derived: ready when we have valid column measurements\nconst isReady=columnHeights.length>0&&columnHeights.some(h=>h>0);// Track viewport height (throttled, with resize state for hiding during resize)\nuseEffect(()=>{if(typeof window===\"undefined\")return;let resizeTimeout=null;const updateDimensions=()=>{// Hide immediately when resize starts\nsetIsResizing(true);if(resizeTimeout)clearTimeout(resizeTimeout);resizeTimeout=setTimeout(()=>{setViewportHeight(window.innerHeight);// Show after measurements settle\nsetIsResizing(false);},RESIZE_THROTTLE_MS);};setViewportHeight(window.innerHeight)// Initial\n;window.addEventListener(\"resize\",updateDimensions);return()=>{window.removeEventListener(\"resize\",updateDimensions);if(resizeTimeout)clearTimeout(resizeTimeout);};},[]);// Track container height for canvas preview only\nuseLayoutEffect(()=>{if(!isCanvas||!containerRef.current)return;const resizeObserver=new ResizeObserver(entries=>{setContainerHeight(entries[0].contentRect.height);});resizeObserver.observe(containerRef.current);return()=>resizeObserver.disconnect();},[isCanvas]);// Measure column heights\nuseLayoutEffect(()=>{if(!columnsContainerRef.current)return;let resizeTimeoutRef=null;const measureColumns=()=>{const columnElements=columnsContainerRef.current?.querySelectorAll(\"[data-column]\");if(!columnElements)return;const heights=Array.from(columnElements).map(el=>{// Measure the actual content height inside each column\nconst content=el.firstElementChild;return content?content.offsetHeight:el.offsetHeight;});if(heights.some(h=>h>0)){setColumnHeights(heights);}};// Throttled measurement\nconst throttledMeasure=()=>{if(resizeTimeoutRef)clearTimeout(resizeTimeoutRef);resizeTimeoutRef=setTimeout(measureColumns,RESIZE_THROTTLE_MS);};measureColumns();const resizeObserver=new ResizeObserver(throttledMeasure);resizeObserver.observe(columnsContainerRef.current);return()=>{resizeObserver.disconnect();if(resizeTimeoutRef)clearTimeout(resizeTimeoutRef);};},[columns.length]);// Calculate max scroll and tallest column height\nconst{maxScroll,maxColumnHeight}=useMemo(()=>{if(columnHeights.length===0){return{maxScroll:viewportHeight*2,maxColumnHeight:0};}const maxHeight=Math.max(...columnHeights);return{maxScroll:maxHeight+viewportHeight,maxColumnHeight:maxHeight};},[columnHeights,viewportHeight]);// Primary direction for wrapping (first column's direction)\nconst primaryDirection=directions[0]||\"up\";// Initialize scroll position for infinite mode\nuseLayoutEffect(()=>{if(scrollMode!==\"infinite\")return;if(maxColumnHeight===0)return;// Start at 0 - content positioning handles off-screen placement\nscrollY.set(0);},[scrollMode,maxColumnHeight,scrollY]);// Animation loop (Infinite mode only)\nconst animate=useCallback(()=>{const currentScroll=scrollY.get();// Apply friction when not touching\nif(!scrollStateRef.current.touchActive){scrollStateRef.current.velocity*=FRICTION;if(Math.abs(scrollStateRef.current.velocity)<VELOCITY_THRESHOLD){scrollStateRef.current.velocity=0;}}let newScroll=currentScroll+scrollStateRef.current.velocity;// Apply wrapping for infinite scroll\nnewScroll=wrapScroll(newScroll,primaryDirection,maxColumnHeight,maxScroll);// Clamp at the non-wrapping boundary only\nif(primaryDirection===\"up\"&&newScroll<0){newScroll=0;scrollStateRef.current.velocity=0;}else if(primaryDirection===\"down\"&&newScroll>maxScroll){newScroll=maxScroll;scrollStateRef.current.velocity=0;}scrollY.set(newScroll);// Continue loop if still moving or touch active\nif(scrollStateRef.current.touchActive||Math.abs(scrollStateRef.current.velocity)>0){scrollStateRef.current.animationFrame=requestAnimationFrame(animate);}else{scrollStateRef.current.animationFrame=null;}},[scrollY,maxScroll,primaryDirection,maxColumnHeight]);// Calculate page scroll progress for Finite mode based on scrollDuration\n// Progress is clamped at 1.0, causing columns to lock at end position\n// Animation completes after scrolling scrollDuration viewport heights\nconst calculateProgress=useCallback(()=>{const windowScrollY=window.scrollY||document.documentElement.scrollTop;const vh=window.innerHeight;// Convert scrollDuration (vh) to pixels\n// Example: 200vh = (200/100) * viewportHeight = 2 * viewportHeight\nconst scrollDistancePx=scrollDuration/100*vh;// Avoid division by zero\nif(scrollDistancePx<=0)return 0;// Calculate progress (0-1, clamped at 1.0 to lock animation)\nconst scrollProgress=Math.max(0,Math.min(1,windowScrollY/scrollDistancePx));return scrollProgress;},[scrollDuration]);// Finite mode: Bind to window scroll\nuseEffect(()=>{if(scrollMode!==\"finite\")return;if(typeof window===\"undefined\")return;if(isCanvas)return;const handleScroll=()=>{const progress=calculateProgress();scrollY.set(progress*maxScroll);};window.addEventListener(\"scroll\",handleScroll,{passive:true});window.addEventListener(\"resize\",handleScroll,{passive:true});handleScroll()// Initial calculation\n;return()=>{window.removeEventListener(\"scroll\",handleScroll);window.removeEventListener(\"resize\",handleScroll);};},[scrollMode,calculateProgress,maxScroll,scrollY,isCanvas]);// Event handlers (Infinite mode only)\nuseEffect(()=>{if(scrollMode!==\"infinite\")return;if(typeof window===\"undefined\")return;if(isCanvas)return;const handleWheel=e=>{// Apply velocity\nscrollStateRef.current.velocity+=e.deltaY*WHEEL_SENSITIVITY;// Start animation loop if not running\nif(!scrollStateRef.current.animationFrame){scrollStateRef.current.animationFrame=requestAnimationFrame(animate);}};const handleTouchStart=e=>{const currentY=e.touches[0].clientY;scrollStateRef.current.previousTouchY=currentY;scrollStateRef.current.touchActive=true;scrollStateRef.current.velocity=0;scrollStateRef.current.touchVelocityHistory=[{y:currentY,timestamp:Date.now()}];if(!scrollStateRef.current.animationFrame){scrollStateRef.current.animationFrame=requestAnimationFrame(animate);}};const handleTouchMove=e=>{if(!scrollStateRef.current.touchActive)return;const currentY=e.touches[0].clientY;const delta=scrollStateRef.current.previousTouchY-currentY;// Track velocity history\nconst now=Date.now();scrollStateRef.current.touchVelocityHistory.push({y:currentY,timestamp:now});// Keep only recent samples (in-place mutation to reduce GC pressure)\nconst history=scrollStateRef.current.touchVelocityHistory;let writeIndex=0;for(let i=0;i<history.length;i++){if(now-history[i].timestamp<100){history[writeIndex++]=history[i];}}history.length=writeIndex;const currentScrollVal=scrollY.get();// Apply movement with wrapping\nlet newScroll=currentScrollVal+delta;newScroll=wrapScroll(newScroll,primaryDirection,maxColumnHeight,maxScroll);scrollY.set(newScroll);scrollStateRef.current.previousTouchY=currentY;};const handleTouchEnd=()=>{scrollStateRef.current.touchActive=false;const history=scrollStateRef.current.touchVelocityHistory;// Calculate momentum from velocity history\nif(history.length>=2){const oldest=history[0];const newest=history[history.length-1];const time=newest.timestamp-oldest.timestamp;const dist=oldest.y-newest.y;if(time>0){const vel=dist/time*16.67// Scale to frame time\n;if(Math.abs(vel)>VELOCITY_MIN_THRESHOLD){scrollStateRef.current.velocity=vel*TOUCH_VELOCITY_DAMPING;}}}scrollStateRef.current.touchVelocityHistory=[];};window.addEventListener(\"wheel\",handleWheel,{passive:true});window.addEventListener(\"touchstart\",handleTouchStart,{passive:true});window.addEventListener(\"touchmove\",handleTouchMove,{passive:true});window.addEventListener(\"touchend\",handleTouchEnd,{passive:true});return()=>{window.removeEventListener(\"wheel\",handleWheel);window.removeEventListener(\"touchstart\",handleTouchStart);window.removeEventListener(\"touchmove\",handleTouchMove);window.removeEventListener(\"touchend\",handleTouchEnd);// Capture and cancel animation frame\nconst{animationFrame}=scrollStateRef.current;if(animationFrame){cancelAnimationFrame(animationFrame);scrollStateRef.current.animationFrame=null;}};},[animate,maxScroll,scrollY,scrollMode,isCanvas,primaryDirection,maxColumnHeight]);// Prepare columns with full width (memoized)\nconst preparedColumns=useMemo(()=>{return columns.map(content=>{if(content&&/*#__PURE__*/isValidElement(content)){return /*#__PURE__*/cloneElement(content,{style:{...content.props?.style||{},width:\"100%\"}});}return content;});},[columns]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...CONTAINER_STYLE,...style},children:/*#__PURE__*/_jsx(\"div\",{ref:columnsContainerRef,style:{...COLUMNS_CONTAINER_STYLE,gap:columnGap},children:preparedColumns.map((column,index)=>/*#__PURE__*/_jsx(AnimatedColumn,{scrollY:scrollY,direction:directions[index]||\"up\",columnHeight:columnHeights[index]||viewportHeight,viewportHeight:viewportHeight,containerHeight:containerHeight,maxScroll:maxScroll,isCanvas:isCanvas,isReady:isReady,isResizing:isResizing,scrollMode:scrollMode,offset:offsets[index]||0,children:column},index))})});}// Static column style (GPU-accelerated)\nconst COLUMN_STYLE={flex:1,minWidth:0,willChange:\"transform\",backfaceVisibility:\"hidden\",WebkitBackfaceVisibility:\"hidden\"};const AnimatedColumn=/*#__PURE__*/memo(function AnimatedColumn({scrollY,direction,columnHeight,viewportHeight,containerHeight,maxScroll,isCanvas,isReady,isResizing,scrollMode,offset,children}){const effectiveViewportHeight=viewportHeight||DEFAULT_VIEWPORT_HEIGHT;const totalContentHeight=columnHeight*NUM_COPIES;// Transform ranges only needed for finite mode\nconst{startY,endY}=useMemo(()=>{if(direction===\"up\"){return{startY:effectiveViewportHeight,endY:-columnHeight};}return{startY:-columnHeight,endY:effectiveViewportHeight};},[direction,columnHeight,effectiveViewportHeight]);// Transform shared scrollY to this column's Y position\nconst y=useTransform(scrollY,scroll=>{if(scrollMode===\"infinite\"){if(direction===\"up\"){return effectiveViewportHeight+offset-scroll;}return-totalContentHeight-offset+scroll;}// Finite mode: linear interpolation\nconst progress=scroll/maxScroll;return startY+(endY-startY)*progress;});// Canvas preview: show ~50px peeking in from the direction content comes from\nconst canvasY=useMemo(()=>{if(direction===\"up\"){return containerHeight-CANVAS_PEEK_AMOUNT;}const height=scrollMode===\"infinite\"?totalContentHeight:columnHeight;return-height+CANVAS_PEEK_AMOUNT;},[direction,columnHeight,containerHeight,scrollMode,totalContentHeight]);// Only show when ready and viewport measured\n// Hide during resize only near top (scroll < 10px) to prevent initial flash\nconst isVisible=isCanvas||isReady&&viewportHeight>0&&(scrollY.get()>10||!isResizing);return /*#__PURE__*/_jsx(motion.div,{\"data-column\":true,style:{...COLUMN_STYLE,y:isCanvas?canvasY:y,visibility:isVisible?\"visible\":\"hidden\"},children:scrollMode===\"infinite\"?// Render content 3 times for infinite scroll\n/*#__PURE__*/_jsxs(_Fragment,{children:[children,children,children]}):children});});addPropertyControls(ScrollingColumns,{columns:{type:ControlType.Array,title:\"Columns\",control:{type:ControlType.ComponentInstance},maxCount:8},directions:{type:ControlType.Array,title:\"Directions\",control:{type:ControlType.Enum,options:[\"up\",\"down\"],optionTitles:[\"Up\",\"Down\"],defaultValue:\"up\",displaySegmentedControl:true},defaultValue:DEFAULT_DIRECTIONS,maxCount:8},columnGap:{type:ControlType.Number,title:\"Gap\",defaultValue:0,min:0,max:100,step:1,unit:\"px\"},scrollMode:{type:ControlType.Enum,title:\"Scroll Mode\",defaultValue:\"finite\",options:[\"finite\",\"infinite\"],optionTitles:[\"Finite\",\"Infinite\"],displaySegmentedControl:true},scrollDuration:{type:ControlType.Number,title:\"Duration\",defaultValue:200,min:50,max:500,step:10,unit:\"vh\",displayStepper:true,hidden(props){return props.scrollMode!==\"finite\";}},offsets:{type:ControlType.Array,title:\"Offsets\",control:{type:ControlType.Number,defaultValue:0,min:0,max:2e3,step:10,unit:\"px\"},defaultValue:DEFAULT_OFFSETS,maxCount:8,hidden(props){return props.scrollMode!==\"infinite\";}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ScrollingColumns\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"800\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerIntrinsicWidth\":\"1200\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ScrollingColumns.map"],"mappings":"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"}