{"version":3,"file":"InfiniteImageTunnel.BYGNwqzQ.mjs","names":["useMemo","useRef","useState","useCallback"],"sources":["https:/framerusercontent.com/modules/cVig2MojhKjPHxOU24h9/al6yucrFJM9FTwK1PmPJ/InfiniteImageTunnel.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useCallback,useEffect,useLayoutEffect,useMemo,useRef,useState}from\"react\";/* ========================== DEFAULT DATA ========================= *//**\n * A deliberately asymmetric, editorial composition.\n * Depths are normalised (0 = at the camera, 1 = far end) so the layout\n * scales with the Tunnel Depth property control.\n */const LAYOUT=[// ---------------------------- LEFT WALL ----------------------------\n{surface:\"left\",offset:-.34,cross:.3,span:.62,depth:.045,index:0},{surface:\"left\",offset:.36,cross:.22,span:.3,depth:.075,index:8},{surface:\"left\",offset:.06,cross:.4,span:.7,depth:.145,index:1},{surface:\"left\",offset:-.52,cross:.18,span:.42,depth:.205,index:9},{surface:\"left\",offset:.44,cross:.26,span:.52,depth:.255,index:2},{surface:\"left\",offset:-.18,cross:.34,span:.44,depth:.335,index:10},{surface:\"left\",offset:.2,cross:.3,span:.66,depth:.395,index:3},{surface:\"left\",offset:-.46,cross:.24,span:.36,depth:.475,index:4},{surface:\"left\",offset:.3,cross:.2,span:.3,depth:.535,index:11},{surface:\"left\",offset:-.1,cross:.36,span:.58,depth:.605,index:5},{surface:\"left\",offset:.48,cross:.22,span:.4,depth:.695,index:2},{surface:\"left\",offset:-.36,cross:.28,span:.5,depth:.775,index:6},{surface:\"left\",offset:.14,cross:.24,span:.34,depth:.865,index:6},{surface:\"left\",offset:-.28,cross:.3,span:.46,depth:.935,index:7},// --------------------------- RIGHT WALL ----------------------------\n{surface:\"right\",offset:.32,cross:.26,span:.44,depth:.03,index:4},{surface:\"right\",offset:-.24,cross:.36,span:.68,depth:.095,index:8},{surface:\"right\",offset:.5,cross:.18,span:.28,depth:.17,index:2},{surface:\"right\",offset:-.06,cross:.42,span:.56,depth:.23,index:9},{surface:\"right\",offset:.38,cross:.24,span:.38,depth:.31,index:10},{surface:\"right\",offset:-.44,cross:.22,span:.46,depth:.37,index:0},{surface:\"right\",offset:.1,cross:.34,span:.64,depth:.445,index:11},{surface:\"right\",offset:-.34,cross:.28,span:.34,depth:.52,index:3},{surface:\"right\",offset:.44,cross:.2,span:.42,depth:.585,index:1},{surface:\"right\",offset:-.14,cross:.32,span:.52,depth:.665,index:4},{surface:\"right\",offset:.26,cross:.24,span:.3,depth:.74,index:1},{surface:\"right\",offset:-.48,cross:.26,span:.48,depth:.82,index:6},{surface:\"right\",offset:.06,cross:.3,span:.4,depth:.9,index:5},// ----------------------------- CEILING -----------------------------\n{surface:\"ceiling\",offset:-.22,cross:.4,span:.7,depth:.115,index:2},{surface:\"ceiling\",offset:.34,cross:.28,span:.44,depth:.29,index:4},{surface:\"ceiling\",offset:-.06,cross:.46,span:.8,depth:.43,index:5},{surface:\"ceiling\",offset:.4,cross:.24,span:.36,depth:.61,index:6},{surface:\"ceiling\",offset:-.3,cross:.36,span:.6,depth:.78,index:9},{surface:\"ceiling\",offset:.18,cross:.3,span:.42,depth:.925,index:2},// ------------------------------ FLOOR ------------------------------\n{surface:\"floor\",offset:.3,cross:.26,span:.4,depth:.06,index:1},{surface:\"floor\",offset:-.34,cross:.3,span:.52,depth:.16,index:3},{surface:\"floor\",offset:.08,cross:.22,span:.3,depth:.245,index:5},{surface:\"floor\",offset:.42,cross:.24,span:.44,depth:.355,index:7},{surface:\"floor\",offset:-.2,cross:.34,span:.58,depth:.47,index:10},{surface:\"floor\",offset:.24,cross:.2,span:.28,depth:.56,index:3},{surface:\"floor\",offset:-.44,cross:.26,span:.46,depth:.68,index:0},{surface:\"floor\",offset:.12,cross:.3,span:.5,depth:.8,index:8},{surface:\"floor\",offset:-.16,cross:.24,span:.34,depth:.89,index:4},{surface:\"floor\",offset:.36,cross:.28,span:.42,depth:.96,index:11}];/** Mobile keeps every surface represented but thins the composition out. */const MOBILE_KEEP_EVERY=3;/**\n * Tiles read as thin slivers if their depth extent is only one bay — this\n * stretches them along the travel axis so they feel like real panels.\n */const DEPTH_SPAN_SCALE=2.2;/** How much faster the tunnel travels while the scene is long-pressed. */const BOOST_MAX=2.6;/** Ramp rate for the boost multiplier — lower is a slower, smoother build. */const BOOST_EASE=1.4;/* =========================== UTILITIES =========================== */function clamp(v,min,max){return v<min?min:v>max?max:v;}/** Framer's ResponsiveImage value or a plain URL string -> full image entry. */function resolveImage(value){if(!value)return{src:\"\",srcSet:\"\",alt:\"\"};if(typeof value===\"string\")return{src:value,srcSet:\"\",alt:\"\"};return{src:typeof value.src===\"string\"?value.src:\"\",// Carrying the srcSet through is what lets the browser download and\n// decode a panel-sized image instead of the full-resolution upload.\nsrcSet:typeof value.srcSet===\"string\"?value.srcSet:\"\",alt:typeof value.alt===\"string\"?value.alt:\"\"};}/**\n * Framer colour controls hand back hex, rgb(), rgba() or hsl() strings —\n * normalise any of them into a colour value carrying our own alpha.\n */function withAlpha(color,alpha){const c=(color||\"#FFFFFF\").trim();const a=clamp(alpha,0,1);if(c.startsWith(\"rgb\")){const parts=c.slice(c.indexOf(\"(\")+1,c.lastIndexOf(\")\")).split(/[,\\s/]+/).filter(Boolean).map(Number);const[r=255,g=255,b=255]=parts;const baseAlpha=parts.length>3&&!Number.isNaN(parts[3])?parts[3]:1;return`rgba(${r}, ${g}, ${b}, ${a*baseAlpha})`;}if(c.startsWith(\"hsl\")){const inner=c.slice(c.indexOf(\"(\")+1,c.lastIndexOf(\")\")).split(\"/\")[0];return`hsl(${inner.trim()} / ${a})`;}const clean=c.replace(\"#\",\"\");const full=clean.length===3?clean.split(\"\").map(ch=>ch+ch).join(\"\"):clean.slice(0,6);const int=parseInt(full,16);if(Number.isNaN(int))return`rgba(255, 255, 255, ${a})`;return`rgba(${int>>16&255}, ${int>>8&255}, ${int&255}, ${a})`;}/**\n * Perceived luminance (0 = black, 1 = white) of a colour string, used to\n * decide whether the theme reads as light or dark.\n */function luminanceOf(color){const c=(color||\"#000000\").trim();let r=0;let g=0;let b=0;if(c.startsWith(\"rgb\")){const parts=c.slice(c.indexOf(\"(\")+1,c.lastIndexOf(\")\")).split(/[,\\s/]+/).filter(Boolean).map(Number);[r=0,g=0,b=0]=parts;}else{const clean=c.replace(\"#\",\"\");const full=clean.length===3?clean.split(\"\").map(ch=>ch+ch).join(\"\"):clean.slice(0,6);const int=parseInt(full,16);if(!Number.isNaN(int)){r=int>>16&255;g=int>>8&255;b=int&255;}}return(.299*r+.587*g+.114*b)/255;}/** Base (depth-less) transform that glues an element to a tunnel plane. */function surfaceTransform(surface,geo,offset){switch(surface){case\"left\":return`translate3d(${-geo.halfWidth}px, ${offset*geo.halfHeight}px, 0px) rotateY(90deg)`;case\"right\":return`translate3d(${geo.halfWidth}px, ${offset*geo.halfHeight}px, 0px) rotateY(-90deg)`;case\"ceiling\":return`translate3d(${offset*geo.halfWidth}px, ${-geo.halfHeight}px, 0px) rotateX(-90deg)`;case\"floor\":default:return`translate3d(${offset*geo.halfWidth}px, ${geo.halfHeight}px, 0px) rotateX(90deg)`;}}/** Pixel footprint of a tile on its plane, in local (pre-rotation) space. */function tileSize(spec,geo,scale,gap){const isWall=spec.surface===\"left\"||spec.surface===\"right\";const acrossExtent=isWall?geo.halfHeight*2:geo.halfWidth*2;const across=acrossExtent*spec.cross*scale;const along=geo.bay*spec.span*scale*DEPTH_SPAN_SCALE;// Walls: local width runs along depth. Floor/ceiling: local height does.\nconst width=isWall?along:across;const height=isWall?across:along;return{width:Math.max(8,width-gap),height:Math.max(8,height-gap)};}function TunnelTile({spec,geo,scale,gap,image,placeholderColor,registerRef}){const{width,height}=tileSize(spec,geo,scale,gap);const style={position:\"absolute\",left:\"50%\",top:\"50%\",width,height,marginLeft:-width/2,marginTop:-height/2,transformStyle:\"preserve-3d\",overflow:\"hidden\",backgroundColor:placeholderColor};// Tiles near the camera are magnified by the perspective projection, so\n// ask for a slightly larger candidate than the layout width.\nconst sizes=`${Math.max(16,Math.round(width*1.6))}px`;return /*#__PURE__*/_jsx(\"div\",{ref:registerRef,style:style,children:image.src?/*#__PURE__*/_jsx(\"img\",{src:image.src,srcSet:image.srcSet||undefined,sizes:image.srcSet?sizes:undefined,alt:image.alt,draggable:false,loading:\"lazy\",decoding:\"async\",style:{width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\",borderRadius:0,pointerEvents:\"none\",userSelect:\"none\"}}):null});}/**\n * One wireframe ring. Drawn as four thin strips rather than a bordered\n * full-size box: visually identical to a border-box border, but the\n * compositor only ever rasterises the strips instead of a viewport-sized\n * texture per ring.\n */function TunnelFrame({geo,lineColor,thickness,registerRef}){const w=geo.halfWidth*2;const h=geo.halfHeight*2;const t=thickness;const sideHeight=Math.max(0,h-t*2);const bar=extra=>({position:\"absolute\",backgroundColor:lineColor,...extra});return /*#__PURE__*/_jsxs(\"div\",{ref:registerRef,style:{position:\"absolute\",left:\"50%\",top:\"50%\",width:w,height:h,marginLeft:-w/2,marginTop:-h/2,transformStyle:\"preserve-3d\",pointerEvents:\"none\"},children:[/*#__PURE__*/_jsx(\"div\",{style:bar({left:0,top:0,width:w,height:t})}),/*#__PURE__*/_jsx(\"div\",{style:bar({left:0,bottom:0,width:w,height:t})}),/*#__PURE__*/_jsx(\"div\",{style:bar({left:0,top:t,width:t,height:sideHeight})}),/*#__PURE__*/_jsx(\"div\",{style:bar({right:0,top:t,width:t,height:sideHeight})})]});}/** One longitudinal line running from the camera plane to the far end. */function TunnelSurfaceLine({surface,offset,geo,lineColor,thickness}){const isWall=surface===\"left\"||surface===\"right\";const width=isWall?geo.depth:thickness;const height=isWall?thickness:geo.depth;const base=surfaceTransform(surface,geo,offset);// After the plane rotation, local +x (walls) / +y (floor & ceiling) points\n// either into or out of the screen — flip the shift so every strip runs\n// away from the camera.\nconst dir=surface===\"left\"||surface===\"ceiling\"?1:-1;const shift=isWall?`translate3d(${dir*geo.depth/2}px, 0px, 0px)`:`translate3d(0px, ${dir*geo.depth/2}px, 0px)`;return /*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",left:\"50%\",top:\"50%\",width,height,marginLeft:-width/2,marginTop:-height/2,backgroundColor:lineColor,transform:`${base} ${shift}`,transformStyle:\"preserve-3d\",pointerEvents:\"none\"}});}function TunnelGrid({geo,frameCount,lineColor,thickness,registerFrame}){const frames=useMemo(()=>Array.from({length:frameCount},(_,i)=>i),[frameCount]);const lines=useMemo(()=>[{surface:\"left\",offset:-1},{surface:\"left\",offset:-.34},{surface:\"left\",offset:.34},{surface:\"left\",offset:1},{surface:\"right\",offset:-1},{surface:\"right\",offset:-.34},{surface:\"right\",offset:.34},{surface:\"right\",offset:1},{surface:\"ceiling\",offset:-.5},{surface:\"ceiling\",offset:.5},{surface:\"floor\",offset:-.5},{surface:\"floor\",offset:.5}],[]);return /*#__PURE__*/_jsxs(\"div\",{style:{position:\"absolute\",inset:0,transformStyle:\"preserve-3d\"},children:[lines.map((l,i)=>/*#__PURE__*/_jsx(TunnelSurfaceLine,{surface:l.surface,offset:l.offset,geo:geo,lineColor:lineColor,thickness:thickness},`line-${i}`)),frames.map(i=>/*#__PURE__*/_jsx(TunnelFrame,{geo:geo,lineColor:lineColor,thickness:thickness,registerRef:registerFrame(i)},`frame-${i}`))]});}function StartButton({label,visible,onStart,compact,invert}){return /*#__PURE__*/_jsx(\"button\",{type:\"button\",onClick:onStart,\"aria-hidden\":!visible,tabIndex:visible?0:-1,style:{position:\"absolute\",left:\"50%\",top:compact?\"34%\":\"31%\",width:compact?168:220,height:compact?54:70,transform:`translate(-50%, -50%) scale(${visible?1:.92})`,opacity:visible?1:0,pointerEvents:visible?\"auto\":\"none\",transition:\"opacity 700ms cubic-bezier(0.22,1,0.36,1), transform 700ms cubic-bezier(0.22,1,0.36,1)\",borderRadius:999,border:invert?\"1px solid rgba(0,0,0,0.12)\":\"none\",outline:\"none\",background:invert?\"#000000\":\"#FFFFFF\",color:invert?\"#FFFFFF\":\"#000000\",fontFamily:'Inter, \"Helvetica Neue\", Helvetica, -apple-system, BlinkMacSystemFont, sans-serif',fontSize:compact?18:24,fontWeight:450,letterSpacing:\"-0.01em\",cursor:\"pointer\",padding:0,zIndex:10,WebkitTapHighlightColor:\"transparent\"},children:label});}/* ========================== MAIN COMPONENT ======================= *//**\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 700\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerDisableUnlink\n */export default function InfiniteImageTunnel(props){const{images,startText,showStartButton,autoStart,animationSpeed,pauseOnHover,reducedMotion,clickToToggle,mouseParallax,perspective,tunnelDepth,backgroundColor,showGrid,gridColor,gridOpacity,gridThickness,tileGap,imageTileScale,style}=props;const isStatic=useIsStaticRenderer();const containerRef=useRef(null);const sceneRef=useRef(null);const tileRefs=useRef([]);const frameRefs=useRef([]);const[size,setSize]=useState({width:1200,height:700});const[started,setStarted]=useState(autoStart);const[paused,setPaused]=useState(false);/* ---------------------- measurement ---------------------- */// Cached container rect, invalidated on scroll/resize so pointer moves\n// don't force a layout flush against the whole 3D tree every event.\nconst rectRef=useRef(null);useLayoutEffect(()=>{const el=containerRef.current;if(!el||isStatic||typeof ResizeObserver===\"undefined\")return;const apply=()=>{const rect=el.getBoundingClientRect();rectRef.current=rect;if(rect.width>0&&rect.height>0){setSize(prev=>Math.abs(prev.width-rect.width)<1&&Math.abs(prev.height-rect.height)<1?prev:{width:rect.width,height:rect.height});}};apply();const ro=new ResizeObserver(apply);ro.observe(el);const invalidate=()=>{rectRef.current=null;};window.addEventListener(\"scroll\",invalidate,{passive:true});window.addEventListener(\"resize\",invalidate,{passive:true});return()=>{ro.disconnect();window.removeEventListener(\"scroll\",invalidate);window.removeEventListener(\"resize\",invalidate);};},[isStatic]);const isCompact=size.width<640;/* ------------------------ geometry ----------------------- */const depth=clamp(tunnelDepth,1e3,1e4);const frameCount=isCompact?14:20;const geo=useMemo(()=>({halfWidth:Math.max(120,size.width/2),halfHeight:Math.max(90,size.height/2),depth,bay:depth/frameCount}),[size.width,size.height,depth,frameCount]);const effectivePerspective=useMemo(()=>{const base=clamp(perspective,500,3e3);// Narrow viewports need a tighter perspective to keep the vanishing\n// point readable without crushing the walls.\nconst ratio=clamp(size.width/1400,.55,1);return Math.round(base*ratio);},[perspective,size.width]);/* ------------------------ tile data ---------------------- */const layout=useMemo(()=>isCompact?LAYOUT.filter((_,i)=>i%MOBILE_KEEP_EVERY!==1):LAYOUT,[isCompact]);const imageList=useMemo(()=>{return(images||[]).map(resolveImage).filter(e=>Boolean(e.src));},[images]);const emptyImage=useMemo(()=>({src:\"\",srcSet:\"\",alt:\"\"}),[]);/* --------------------- animated state -------------------- */// Depth values live in refs so frames never trigger React renders.\nconst tileZ=useRef(new Float64Array(0));const frameZ=useRef(new Float64Array(0));const baseTransforms=useRef([]);const rafRef=useRef(null);const lastTimeRef=useRef(0);const rampRef=useRef(autoStart?1:0);const boostRef=useRef(1);const holdRef=useRef(false);const pointerRef=useRef({x:0,y:0});const pointerTargetRef=useRef({x:0,y:0});// Last values actually written to the DOM, so identical styles are never\n// re-assigned (each assignment dirties a compositor layer).\nconst lastTileStyle=useRef([]);const lastFrameStyle=useRef([]);const lastSceneTransform=useRef({x:Number.NaN,y:Number.NaN});const startedRef=useRef(started);const pausedRef=useRef(paused);const hoverRef=useRef(false);const visibleRef=useRef(true);// Set by the animation effect; lets observers restart a torn-down loop.\nconst wakeRef=useRef(()=>{});startedRef.current=started;pausedRef.current=paused;/* Seed / reseed depths whenever the composition changes. */const seedDepths=useCallback(()=>{const t=new Float64Array(layout.length);for(let i=0;i<layout.length;i++)t[i]=layout[i].depth*depth;tileZ.current=t;const f=new Float64Array(frameCount);for(let i=0;i<frameCount;i++)f[i]=i/frameCount*depth;frameZ.current=f;lastTileStyle.current=[];lastFrameStyle.current=[];},[layout,depth,frameCount]);useEffect(()=>{seedDepths();},[seedDepths]);/* Cache the static part of every tile transform. */useEffect(()=>{baseTransforms.current=layout.map(spec=>{const base=surfaceTransform(spec.surface,geo,spec.offset);const spin=spec.rotate?` rotateZ(${spec.rotate}deg)`:\"\";return`${base}${spin}`;});lastTileStyle.current=[];},[layout,geo]);/* ----------------------- visibility ---------------------- */useEffect(()=>{const el=containerRef.current;if(!el||isStatic||typeof IntersectionObserver===\"undefined\")return;const io=new IntersectionObserver(entries=>{const next=entries.some(e=>e.isIntersecting);const was=visibleRef.current;visibleRef.current=next;// Coming back into view has to restart the loop, because\n// leaving the viewport tears it down completely.\nif(next&&!was)wakeRef.current();},{threshold:0});io.observe(el);return()=>io.disconnect();},[isStatic]);/* --------------------- pointer parallax ------------------ */useEffect(()=>{if(!mouseParallax||isStatic)return;const el=containerRef.current;if(!el)return;const onMove=e=>{let rect=rectRef.current;if(!rect){rect=el.getBoundingClientRect();rectRef.current=rect;}if(rect.width===0||rect.height===0)return;pointerTargetRef.current={x:clamp((e.clientX-rect.left)/rect.width-.5,-.5,.5),y:clamp((e.clientY-rect.top)/rect.height-.5,-.5,.5)};};const onLeave=()=>{pointerTargetRef.current={x:0,y:0};};el.addEventListener(\"pointermove\",onMove,{passive:true});el.addEventListener(\"pointerleave\",onLeave,{passive:true});return()=>{el.removeEventListener(\"pointermove\",onMove);el.removeEventListener(\"pointerleave\",onLeave);};},[mouseParallax,isStatic]);/* ---------------------- long-press boost ------------------ */useEffect(()=>{const el=containerRef.current;if(!el||isStatic)return;const release=()=>{holdRef.current=false;};const onDown=()=>{holdRef.current=true;};const opts={passive:true};el.addEventListener(\"pointerdown\",onDown,opts);el.addEventListener(\"pointerup\",release,opts);el.addEventListener(\"pointercancel\",release,opts);el.addEventListener(\"pointerleave\",release,opts);return()=>{el.removeEventListener(\"pointerdown\",onDown);el.removeEventListener(\"pointerup\",release);el.removeEventListener(\"pointercancel\",release);el.removeEventListener(\"pointerleave\",release);};},[isStatic]);/* ---------------------- animation loop ------------------- */const writeFrame=useCallback(()=>{const scene=sceneRef.current;if(scene&&mouseParallax){const p=pointerRef.current;const last=lastSceneTransform.current;// ±3.5° horizontal, ±2.5° vertical — cinematic, not gamey.\n// Skip the write once the easing has effectively settled.\nif(Number.isNaN(last.x)||Math.abs(p.x-last.x)>5e-4||Math.abs(p.y-last.y)>5e-4){scene.style.transform=`rotateY(${p.x*7}deg) rotateX(${-p.y*5}deg)`;last.x=p.x;last.y=p.y;}}const z=tileZ.current;const fadeStart=depth*.72;const fadeSpan=depth*.28;const tileCache=lastTileStyle.current;for(let i=0;i<z.length;i++){const el=tileRefs.current[i];if(!el)continue;const zi=z[i];const transform=`translate3d(0px, 0px, ${-zi}px) ${baseTransforms.current[i]||\"\"}`;const opacity=zi>fadeStart?String(clamp(1-(zi-fadeStart)/fadeSpan,0,1)):\"1\";const prev=tileCache[i];if(!prev){el.style.transform=transform;el.style.opacity=opacity;tileCache[i]={t:transform,o:opacity};continue;}if(prev.t!==transform){el.style.transform=transform;prev.t=transform;}if(prev.o!==opacity){el.style.opacity=opacity;prev.o=opacity;}}const fz=frameZ.current;const frameCache=lastFrameStyle.current;for(let i=0;i<fz.length;i++){const el=frameRefs.current[i];if(!el)continue;const zi=fz[i];const transform=`translate3d(0px, 0px, ${-zi}px)`;const opacity=zi>fadeStart?String(clamp(1-(zi-fadeStart)/fadeSpan,0,1)):\"1\";const prev=frameCache[i];if(!prev){el.style.transform=transform;el.style.opacity=opacity;frameCache[i]={t:transform,o:opacity};continue;}if(prev.t!==transform){el.style.transform=transform;prev.t=transform;}if(prev.o!==opacity){el.style.opacity=opacity;prev.o=opacity;}}},[depth,mouseParallax]);useEffect(()=>{if(isStatic){// Canvas / thumbnail render: paint one static frame, no RAF.\nwriteFrame();return;}const NEAR=-Math.max(200,geo.halfWidth*.4);const speedBase=320*clamp(animationSpeed,.1,5);/**\n         * Whether the loop is worth scheduling at all. Off-screen or in a\n         * hidden tab we draw nothing — this is what stops the component\n         * burning GPU for the whole lifetime of the page.\n         */const shouldSchedule=()=>{if(typeof document!==\"undefined\"&&document.hidden)return false;if(!visibleRef.current)return false;if(reducedMotion){// Keep ticking only until the ramp / boost / pointer easing\n// has settled, then idle completely.\nconst p=pointerRef.current;const t=pointerTargetRef.current;return rampRef.current>.001||Math.abs(boostRef.current-1)>.001||Math.abs(p.x-t.x)>.001||Math.abs(p.y-t.y)>.001;}return true;};const stop=()=>{if(rafRef.current!==null)cancelAnimationFrame(rafRef.current);rafRef.current=null;lastTimeRef.current=0;};const tick=time=>{const last=lastTimeRef.current||time;lastTimeRef.current=time;const dt=Math.min(.05,(time-last)/1e3);const hoverPause=pauseOnHover&&hoverRef.current;const running=startedRef.current&&!pausedRef.current&&!hoverPause&&!reducedMotion&&visibleRef.current;// Ease from the near-static idle drift into full travel.\nconst target=running?1:0;rampRef.current+=(target-rampRef.current)*Math.min(1,dt*2.4);// Ease the long-press speed boost in and back out smoothly.\nconst boostTarget=running&&holdRef.current?BOOST_MAX:1;boostRef.current+=(boostTarget-boostRef.current)*Math.min(1,dt*BOOST_EASE);const idle=reducedMotion?0:.035;const factor=idle+(1-idle)*rampRef.current;const delta=speedBase*factor*boostRef.current*dt;if(delta>0){const z=tileZ.current;for(let i=0;i<z.length;i++){let v=z[i]-delta;if(v<NEAR)v+=depth;z[i]=v;}const fz=frameZ.current;for(let i=0;i<fz.length;i++){let v=fz[i]-delta;if(v<NEAR)v+=depth;fz[i]=v;}}// Smoothed pointer easing.\nconst p=pointerRef.current;const t=pointerTargetRef.current;p.x+=(t.x-p.x)*Math.min(1,dt*3);p.y+=(t.y-p.y)*Math.min(1,dt*3);writeFrame();if(shouldSchedule()){rafRef.current=requestAnimationFrame(tick);}else{stop();}};const wake=()=>{if(rafRef.current!==null)return;if(!shouldSchedule())return;lastTimeRef.current=0;rafRef.current=requestAnimationFrame(tick);};wakeRef.current=wake;// Paint the current state once even if we're off-screen, so the\n// scene is correct the moment it scrolls into view.\nwriteFrame();wake();const onVisibilityChange=()=>{if(document.hidden)stop();else wake();};document.addEventListener(\"visibilitychange\",onVisibilityChange);return()=>{document.removeEventListener(\"visibilitychange\",onVisibilityChange);wakeRef.current=()=>{};stop();};},[isStatic,animationSpeed,depth,geo.halfWidth,pauseOnHover,reducedMotion,writeFrame]);/* --------------- external / prop-driven controls ---------- */useEffect(()=>{setStarted(autoStart);if(!autoStart)rampRef.current=0;},[autoStart]);const handleStart=useCallback(()=>{setStarted(true);setPaused(false);wakeRef.current();},[]);const handleSceneClick=useCallback(()=>{if(!clickToToggle||!startedRef.current)return;setPaused(p=>!p);wakeRef.current();},[clickToToggle]);/* ------------------------- styling ------------------------ */const lineColor=withAlpha(gridColor,gridOpacity);const thickness=clamp(gridThickness,.5,3);// Everything below adapts to the chosen background instead of assuming\n// a black scene, so a light/white theme doesn't show a stray dark disc\n// or a washed-out grid.\nconst isLightTheme=luminanceOf(backgroundColor)>.6;const vignetteColor=withAlpha(backgroundColor,.92);const vignetteTransparent=withAlpha(backgroundColor,0);const tilePlaceholderColor=isLightTheme?\"#EDEDED\":\"#050505\";const containerStyle={position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",backgroundColor:backgroundColor,perspective:`${effectivePerspective}px`,perspectiveOrigin:\"50% 50%\",touchAction:\"manipulation\",// Keeps the tunnel's paint and layout work from leaking into the\n// rest of the page.\ncontain:\"layout paint\",...style};return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,style:containerStyle,onPointerEnter:()=>{hoverRef.current=true;},onPointerLeave:()=>{hoverRef.current=false;wakeRef.current();},onClick:handleSceneClick,children:[/*#__PURE__*/_jsxs(\"div\",{ref:sceneRef,style:{position:\"absolute\",inset:0,transformStyle:\"preserve-3d\",willChange:\"transform\",pointerEvents:\"none\"},children:[/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",left:\"50%\",top:\"50%\",width:geo.halfWidth*2,height:geo.halfHeight*2,marginLeft:-geo.halfWidth,marginTop:-geo.halfHeight,transform:`translate3d(0px, 0px, ${-depth}px)`,backgroundColor:backgroundColor,transformStyle:\"preserve-3d\"}}),showGrid?/*#__PURE__*/_jsx(TunnelGrid,{geo:geo,frameCount:frameCount,lineColor:lineColor,thickness:thickness,registerFrame:i=>el=>{frameRefs.current[i]=el;}}):null,/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,transformStyle:\"preserve-3d\"},children:layout.map((spec,i)=>/*#__PURE__*/_jsx(TunnelTile,{spec:spec,geo:geo,scale:clamp(imageTileScale,.5,2),gap:clamp(tileGap,0,100),image:imageList.length>0?imageList[spec.index%imageList.length]:emptyImage,placeholderColor:tilePlaceholderColor,registerRef:el=>{tileRefs.current[i]=el;}},`${spec.surface}-${i}`))})]}),/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,pointerEvents:\"none\",background:`radial-gradient(circle at 50% 50%, ${vignetteColor} 0%, ${vignetteTransparent} 20%)`}}),showStartButton?/*#__PURE__*/_jsx(StartButton,{label:startText,visible:!started,onStart:handleStart,compact:isCompact,invert:isLightTheme}):null]});}/* ====================== PROPERTY CONTROLS ======================== */addPropertyControls(InfiniteImageTunnel,{images:{type:ControlType.Array,title:\"Images\",control:{type:ControlType.ResponsiveImage},defaultValue:[],maxCount:24},startText:{type:ControlType.String,title:\"Start Text\",defaultValue:\"Press to Start\",placeholder:\"Press to Start\",hidden:fields=>!fields.showStartButton},showStartButton:{type:ControlType.Boolean,title:\"Start Button\",defaultValue:true},autoStart:{type:ControlType.Boolean,title:\"Auto Start\",defaultValue:false},animationSpeed:{type:ControlType.Number,title:\"Animation Speed\",min:.1,max:5,step:.1,defaultValue:1,displayStepper:false},pauseOnHover:{type:ControlType.Boolean,title:\"Pause On Hover\",defaultValue:false},clickToToggle:{type:ControlType.Boolean,title:\"Click To Pause\",defaultValue:true},mouseParallax:{type:ControlType.Boolean,title:\"Mouse Parallax\",defaultValue:true},reducedMotion:{type:ControlType.Boolean,title:\"Reduced Motion\",defaultValue:false},perspective:{type:ControlType.Number,title:\"Perspective\",min:500,max:3e3,step:10,defaultValue:1800,unit:\"px\",displayStepper:false},tunnelDepth:{type:ControlType.Number,title:\"Tunnel Depth\",min:1e3,max:1e4,step:100,defaultValue:5e3,unit:\"px\",displayStepper:false},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"#000000\"},showGrid:{type:ControlType.Boolean,title:\"Show Grid\",defaultValue:true},gridColor:{type:ControlType.Color,title:\"Grid Color\",defaultValue:\"#FFFFFF\",hidden:fields=>!fields.showGrid},gridOpacity:{type:ControlType.Number,title:\"Grid Opacity\",min:0,max:1,step:.01,defaultValue:.25,displayStepper:false,hidden:fields=>!fields.showGrid},gridThickness:{type:ControlType.Number,title:\"Grid Width\",min:.5,max:3,step:.1,defaultValue:1,unit:\"px\",displayStepper:false,hidden:fields=>!fields.showGrid},tileGap:{type:ControlType.Number,title:\"Tile Gap\",min:0,max:100,step:1,defaultValue:12,unit:\"px\",displayStepper:false},imageTileScale:{type:ControlType.Number,title:\"Tile Scale\",min:.5,max:2,step:.05,defaultValue:1,displayStepper:false,description:\"Get more components from [Framerstacks](https://www.framerstacks.com/)\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"InfiniteImageTunnel\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any\",\"framerIntrinsicHeight\":\"700\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutHeight\":\"any\",\"framerIntrinsicWidth\":\"1200\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./InfiniteImageTunnel.map"],"mappings":"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AAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC,QAAQ,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC,QAAQ,OAAO,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,IAAI,MAAM,IAAI,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAM,IAAI,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,OAAO,OAAO,KAAK,MAAM,GAAG,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EACt5B,CAAC,QAAQ,QAAQ,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,QAAQ,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,KAAK,MAAM,CAAC,EAAE,CAAC,QAAQ,QAAQ,OAAO,GAAG,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,QAAQ,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC,QAAQ,QAAQ,OAAO,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI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"}