{"version":3,"file":"InteractiveWaveBackground_prod.B92sRral.mjs","names":["p","useRef"],"sources":["https:/framerusercontent.com/modules/yJCbmrzocnalcnR18FtX/jtMkiQXrxBOtnNiVuoBz/InteractiveWaveBackground_prod.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";// Simple 2D noise function for wave generation with seed support\nfunction createNoise2D(seed=.5){const F2=.5*(Math.sqrt(3)-1);const G2=(3-Math.sqrt(3))/6;const G22=(3-Math.sqrt(3))/3;const p=new Uint8Array(256);for(let i=0;i<256;i++){p[i]=i;}// Use seed to create deterministic random values\nconst seededRandom=index=>{const x=Math.sin(index*12.9898+seed*78.233)*43758.5453;return x-Math.floor(x);};// Shuffle the permutation table using seeded random\nfor(let i=255;i>0;i--){const n=Math.floor((i+1)*seededRandom(i));const q=p[i];p[i]=p[n];p[n]=q;}const perm=new Uint8Array(512);const permMod12=new Uint8Array(512);for(let i=0;i<512;i++){perm[i]=p[i&255];permMod12[i]=perm[i]%12;}const grad2=new Float64Array([1,1,-1,1,1,-1,-1,-1,1,0,-1,0,1,0,-1,0,0,1,0,-1,0,1,0,-1]);const fastFloor=x=>Math.floor(x)|0;return function noise2D(x,y){const s=(x+y)*F2;const i=fastFloor(x+s);const j=fastFloor(y+s);const t=(i+j)*G2;const x0=x-(i-t);const y0=y-(j-t);let i1,j1;if(x0>y0){i1=1;j1=0;}else{i1=0;j1=1;}const x1=x0-i1+G2;const y1=y0-j1+G2;const x2=x0-1+G22;const y2=y0-1+G22;const ii=i&255;const jj=j&255;const gi0=permMod12[ii+perm[jj]];const gi1=permMod12[ii+i1+perm[jj+j1]];const gi2=permMod12[ii+1+perm[jj+1]];let t0=.5-x0*x0-y0*y0;let n0;if(t0<0){n0=0;}else{t0*=t0;n0=t0*t0*(grad2[gi0*2]*x0+grad2[gi0*2+1]*y0);}let t1=.5-x1*x1-y1*y1;let n1;if(t1<0){n1=0;}else{t1*=t1;n1=t1*t1*(grad2[gi1*2]*x1+grad2[gi1*2+1]*y1);}let t2=.5-x2*x2-y2*y2;let n2;if(t2<0){n2=0;}else{t2*=t2;n2=t2*t2*(grad2[gi2*2]*x2+grad2[gi2*2+1]*y2);}return 70*(n0+n1+n2);};}/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n * @framerIntrinsicWidth 800\n * @framerIntrinsicHeight 600\n * @framerDisableUnlink\n */export default function InteractiveWaveBackground({strokeColor=\"#ffffff\",backgroundColor=\"transparent\",waveSpeed=.5,waveAmplitude=.5,mouseInfluence=.5,lineSpacing=.5,seed=.5,resolution=.5,preview=true}){const containerRef=useRef(null);const svgRef=useRef(null);const mouseRef=useRef({x:-10,y:0,lx:0,ly:0,sx:0,sy:0,v:0,vs:0,a:0,set:false});const pathsRef=useRef([]);const linesRef=useRef([]);const noiseRef=useRef(null);const rafRef=useRef(null);const boundingRef=useRef(null);const zoomProbeRef=useRef(null);const lastSizeRef=useRef({width:0,height:0,zoom:1});const isVisibleRef=useRef(true);const isCanvasRef=useRef(RenderTarget.current()===RenderTarget.canvas);// Initialization\nuseEffect(()=>{if(!containerRef.current||!svgRef.current)return;// Store canvas state\nisCanvasRef.current=RenderTarget.current()===RenderTarget.canvas;// Initialize noise generator\nnoiseRef.current=createNoise2D(seed);// Initialize size and lines\nsetSize();setLines();// Always compute initial wave shape (use time 0 for initial state)\nmovePoints(0);drawLines();// Bind events (resize is bound in a separate effect to always use latest props)\nwindow.addEventListener(\"mousemove\",onMouseMove);containerRef.current.addEventListener(\"touchmove\",onTouchMove,{passive:false});// Set up intersection observer for viewport detection\nconst observer=new IntersectionObserver(entries=>{entries.forEach(entry=>{isVisibleRef.current=entry.isIntersecting;});},{threshold:.1});observer.observe(containerRef.current);return()=>{window.removeEventListener(\"mousemove\",onMouseMove);containerRef.current?.removeEventListener(\"touchmove\",onTouchMove);observer.disconnect();};},[seed]);// Monitor size changes and re-render when component is resized\nuseEffect(()=>{if(!containerRef.current||!zoomProbeRef.current)return;let rafId=0;const TICK_MS=100// Check every 100ms\n;const EPSILON=1// 1px tolerance\n;const checkSize=()=>{const container=containerRef.current;const probe=zoomProbeRef.current;if(!container||!probe)return;const rawWidth=container.clientWidth||container.offsetWidth||1;const rawHeight=container.clientHeight||container.offsetHeight||1;const zoom=probe.getBoundingClientRect().width/20;const safeZoom=Math.max(zoom,1e-4);// Normalize sizes by zoom so editor zoom doesn't count as a resize\nconst width=rawWidth/safeZoom;const height=rawHeight/safeZoom;const lastSize=lastSizeRef.current;const sizeChanged=Math.abs(width-lastSize.width)>EPSILON||Math.abs(height-lastSize.height)>EPSILON;if(sizeChanged){lastSizeRef.current={width,height,zoom:safeZoom};setSize();setLines();// When preview is off or component not visible, initialize static wave positions immediately\n// When preview is on and visible, let the animation loop handle rendering (no interruption)\nconst shouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;if(!shouldAnimate){movePoints(0);drawLines();}}rafId=requestAnimationFrame(checkSize);};rafId=requestAnimationFrame(checkSize);return()=>{if(rafId)cancelAnimationFrame(rafId);};},[resolution,preview,lineSpacing,seed,waveSpeed,waveAmplitude,mouseInfluence]);// Keep window resize listener in sync with latest props/closures\nuseEffect(()=>{window.addEventListener(\"resize\",onResize);return()=>window.removeEventListener(\"resize\",onResize);},[lineSpacing,seed,resolution,preview,waveSpeed,waveAmplitude,mouseInfluence]);// Stroke color change should not rebuild geometry; only update stroke\nuseEffect(()=>{pathsRef.current.forEach(path=>{path.setAttribute(\"stroke\",strokeColor);});drawLines();},[strokeColor]);// Geometry-affecting controls: rebuild and redraw\nuseEffect(()=>{setLines();// Always draw at least one frame so lines aren't empty\nconst shouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;if(shouldAnimate){movePoints(performance.now());}else{movePoints(0);}drawLines();},[lineSpacing,seed,resolution,preview]);// Shape-affecting controls: recompute wave positions\nuseEffect(()=>{// Recompute wave shape\nconst shouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;if(shouldAnimate){movePoints(performance.now());}else{movePoints(0);}drawLines();},[waveSpeed,waveAmplitude,mouseInfluence]);// Restart animation loop when props change to ensure new values are used\nuseEffect(()=>{// Cancel existing animation\nif(rafRef.current){cancelAnimationFrame(rafRef.current);rafRef.current=null;}// Check if animation should run\n// In canvas mode: respect preview toggle\n// In production: always animate (ignore preview)\nconst shouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;// If animation is disabled (preview off in canvas), don't start the loop\n// Only render when props/size change, not every frame\nif(!shouldAnimate){return;}// Start new animation loop with updated props\nconst tick=time=>{// Check again in case visibility/preview changed\nconst stillShouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;// If animation should stop, cancel the loop\nif(!stillShouldAnimate){rafRef.current=null;return;}// Always schedule next frame to keep animation loop alive\nrafRef.current=requestAnimationFrame(tick);// Check if paths/lines have been recreated (e.g., during zoom)\n// If so, ensure we have valid data before animating\nif(!pathsRef.current||pathsRef.current.length===0||!linesRef.current||linesRef.current.length===0){return;}const{current:mouse}=mouseRef;// Smooth mouse movement\nmouse.sx+=(mouse.x-mouse.sx)*.1;mouse.sy+=(mouse.y-mouse.sy)*.1;// Mouse velocity\nconst dx=mouse.x-mouse.lx;const dy=mouse.y-mouse.ly;const d=Math.hypot(dx,dy);mouse.v=d;mouse.vs+=(d-mouse.vs)*.1;mouse.vs=Math.min(100,mouse.vs);// Previous mouse position\nmouse.lx=mouse.x;mouse.ly=mouse.y;// Mouse angle (not currently used but kept for potential future use)\nmouse.a=Math.atan2(dy,dx);movePoints(time);drawLines();};// Start animation loop\nrafRef.current=requestAnimationFrame(tick);return()=>{if(rafRef.current){cancelAnimationFrame(rafRef.current);rafRef.current=null;}};},[waveSpeed,waveAmplitude,mouseInfluence,seed,preview]);// Set SVG size using clientWidth/clientHeight for proper Framer canvas sizing\nconst setSize=()=>{if(!containerRef.current||!svgRef.current)return;const container=containerRef.current;const width=container.clientWidth||container.offsetWidth||1;const height=container.clientHeight||container.offsetHeight||1;// Store dimensions for mouse calculations\nboundingRef.current={width,height,left:0,top:0,right:width,bottom:height,x:0,y:0,toJSON:()=>({})};svgRef.current.style.width=`${width}px`;svgRef.current.style.height=`${height}px`;};// Setup lines - more points for smoother curves\nconst setLines=()=>{if(!svgRef.current||!boundingRef.current)return;const{width,height}=boundingRef.current;linesRef.current=[];// Clear existing paths\npathsRef.current.forEach(path=>{path.remove();});pathsRef.current=[];// Use configurable spacing based on lineSpacing prop\n// When lineSpacing = 1: xGap = 8 (dense, many lines)\n// When lineSpacing = 0: xGap = 167 (sparse, ~6 lines for typical width)\nconst baseSpacing=8;const xGap=baseSpacing+(1-lineSpacing)*159// Range: 8-167\n;// Use resolution to control point density (higher resolution = more points = smoother lines)\nconst baseYGap=4;const yGap=baseYGap+(1-resolution)*20// Range: 8-28 (lower resolution = bigger gaps = fewer points)\n;const oWidth=width+200;const oHeight=height+30;const totalLines=Math.ceil(oWidth/xGap);const totalPoints=Math.ceil(oHeight/yGap);const xStart=(width-xGap*totalLines)/2;const yStart=(height-yGap*totalPoints)/2;// Create vertical lines\nfor(let i=0;i<totalLines;i++){const points=[];for(let j=0;j<totalPoints;j++){const point={x:xStart+xGap*i,y:yStart+yGap*j,wave:{x:0,y:0},cursor:{x:0,y:0,vx:0,vy:0}};points.push(point);}// Create SVG path\nconst path=document.createElementNS(\"http://www.w3.org/2000/svg\",\"path\");path.classList.add(\"a__line\");path.classList.add(\"js-line\");path.setAttribute(\"fill\",\"none\");path.setAttribute(\"stroke\",strokeColor);path.setAttribute(\"stroke-width\",\"1\");svgRef.current.appendChild(path);pathsRef.current.push(path);// Add points\nlinesRef.current.push(points);}};// Resize handler\nconst onResize=()=>{const container=containerRef.current;const probe=zoomProbeRef.current;if(!container||!probe)return;const rawWidth=container.clientWidth||container.offsetWidth||1;const rawHeight=container.clientHeight||container.offsetHeight||1;const zoom=probe.getBoundingClientRect().width/20;const safeZoom=Math.max(zoom,1e-4);const width=rawWidth/safeZoom;const height=rawHeight/safeZoom;const EPSILON=1;const lastSize=lastSizeRef.current;const sizeChanged=Math.abs(width-lastSize.width)>EPSILON||Math.abs(height-lastSize.height)>EPSILON;if(!sizeChanged)return;lastSizeRef.current={width,height,zoom:safeZoom};setSize();setLines();// When preview is off or component not visible, initialize static wave positions immediately\n// When preview is on and visible, let the animation loop handle rendering (no interruption)\nconst shouldAnimate=(!isCanvasRef.current||preview)&&isVisibleRef.current;if(!shouldAnimate){movePoints(0);drawLines();}};// Mouse handler\nconst onMouseMove=e=>{updateMousePosition(e.pageX,e.pageY);};// Touch handler\nconst onTouchMove=e=>{e.preventDefault();const touch=e.touches[0];updateMousePosition(touch.clientX,touch.clientY);};// Update mouse position using proper container bounds\nconst updateMousePosition=(x,y)=>{if(!boundingRef.current||!containerRef.current)return;const mouse=mouseRef.current;const rect=containerRef.current.getBoundingClientRect();mouse.x=x-rect.left;mouse.y=y-rect.top+window.scrollY;if(!mouse.set){mouse.sx=mouse.x;mouse.sy=mouse.y;mouse.lx=mouse.x;mouse.ly=mouse.y;mouse.set=true;}};// Move points - smoother wave motion (optimized)\nconst movePoints=time=>{const{current:lines}=linesRef;const{current:mouse}=mouseRef;const{current:noise}=noiseRef;if(!noise)return;// Cache common calculations\nconst speedMultiplier=waveSpeed*.002;const amplitudeMultiplier=waveAmplitude*2;const influenceMultiplier=mouseInfluence*7e-4;const mouseSx=mouse.sx;const mouseSy=mouse.sy;const mouseVs=mouse.vs;const l=Math.max(175,mouseVs);for(let i=0;i<lines.length;i++){const points=lines[i];for(let j=0;j<points.length;j++){const p=points[j];// Wave movement\nconst baseMove=noise(p.x*.003,p.y*.002)*8;const move=waveSpeed>0?baseMove+time*speedMultiplier:baseMove;p.wave.x=Math.cos(move)*12*amplitudeMultiplier;p.wave.y=Math.sin(move)*6*amplitudeMultiplier;// Mouse effect - use direction from point to mouse\nconst dx=p.x-mouseSx;const dy=p.y-mouseSy;const d=Math.hypot(dx,dy);if(d<l){const s=1-d/l;const f=Math.cos(d*.001)*s*l*mouseVs*influenceMultiplier;const angleToPoint=Math.atan2(dy,dx);p.cursor.vx+=Math.cos(angleToPoint)*f;p.cursor.vy+=Math.sin(angleToPoint)*f;}// Spring restoration\np.cursor.vx+=-p.cursor.x*.01;p.cursor.vy+=-p.cursor.y*.01;// Damping\np.cursor.vx*=.95;p.cursor.vy*=.95;// Update position\np.cursor.x+=p.cursor.vx;p.cursor.y+=p.cursor.vy;// Clamp\np.cursor.x=Math.min(50,Math.max(-50,p.cursor.x));p.cursor.y=Math.min(50,Math.max(-50,p.cursor.y));}}};// Get moved point coordinates\nconst moved=(point,withCursorForce=true)=>{const coords={x:point.x+point.wave.x+(withCursorForce?point.cursor.x:0),y:point.y+point.wave.y+(withCursorForce?point.cursor.y:0)};return coords;};// Draw lines - using line segments (optimized with array join)\nconst drawLines=()=>{const{current:lines}=linesRef;const{current:paths}=pathsRef;for(let lIndex=0;lIndex<lines.length;lIndex++){const points=lines[lIndex];const path=paths[lIndex];if(!points||points.length<2||!path)continue;// Build path string with array (faster than string concatenation)\nconst pathParts=[];// First point\nconst firstPoint=moved(points[0],false);pathParts.push(`M ${firstPoint.x} ${firstPoint.y}`);// Connect points with lines\nfor(let i=1;i<points.length;i++){const current=moved(points[i]);pathParts.push(`L ${current.x} ${current.y}`);}path.setAttribute(\"d\",pathParts.join(\"\"));}};return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,style:{backgroundColor:backgroundColor||\"transparent\",position:\"relative\",margin:0,padding:0,width:\"100%\",height:\"100%\",overflow:\"hidden\"},children:[/*#__PURE__*/_jsx(\"svg\",{ref:svgRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",display:\"block\"},xmlns:\"http://www.w3.org/2000/svg\"}),/*#__PURE__*/_jsx(\"div\",{ref:zoomProbeRef,style:{position:\"absolute\",width:20,height:20,opacity:0,pointerEvents:\"none\"}}),/*#__PURE__*/_jsx(\"div\",{style:{position:\"relative\",width:boundingRef.current?.width||800,height:boundingRef.current?.height||600,opacity:0,pointerEvents:\"none\",zIndex:-1}})]});}// Property controls for Framer\naddPropertyControls(InteractiveWaveBackground,{preview:{type:ControlType.Boolean,title:\"Preview\",defaultValue:true},lineSpacing:{type:ControlType.Number,title:\"Amount\",min:0,max:1,step:.05,defaultValue:.5},waveSpeed:{type:ControlType.Number,title:\"Speed\",min:0,max:1,step:.1,defaultValue:.5},waveAmplitude:{type:ControlType.Number,title:\"Amplitude\",min:0,max:1,step:.1,defaultValue:.5},mouseInfluence:{type:ControlType.Number,title:\"Hover Force\",min:0,max:1,step:.1,defaultValue:.5},seed:{type:ControlType.Number,title:\"Seed\",min:0,max:1,step:.1,defaultValue:.5},resolution:{type:ControlType.Number,title:\"Resolution\",min:0,max:1,step:.1,defaultValue:.5},strokeColor:{type:ControlType.Color,title:\"Stroke\",defaultValue:\"#ffffff\"},backgroundColor:{type:ControlType.Color,optional:true,title:\"Background\",defaultValue:\"#000000\",description:\"More components at [Framer University](https://frameruni.link/cc).\"}});// Display name for Framer UI\nInteractiveWaveBackground.displayName=\"Interactive Wave Background\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"InteractiveWaveBackground\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"800\",\"framerIntrinsicHeight\":\"600\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerDisableUnlink\":\"\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./InteractiveWaveBackground_prod.map"],"mappings":"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"}