{"version":3,"file":"MouseAttractParticles.IfgDhToa.mjs","names":["useRef","useMemo","useCallback"],"sources":["https:/framerusercontent.com/modules/GK27hGj0mUvEUnEM632J/NkKyOZFtW2YHjRDbkjhv/MouseAttractParticles.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useInView}from\"framer-motion\";import{useCallback,useEffect,useMemo,useRef}from\"react\";/**\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function MouseAttractParticles(props){const{particleColor,count,particleSize,idleSpeed,attractionRadius,attractionStrength,opacity,style}=props;const isStatic=useIsStaticRenderer();const containerRef=useRef(null);const canvasRef=useRef(null);const rafIdRef=useRef(0);const particlesRef=useRef([]);const pointerRef=useRef({active:false,x:0,y:0});const sizeRef=useRef({width:0,height:0,dpr:1});const resizeObserverRef=useRef(null);const isInView=useInView(containerRef,{amount:.01});const tuned=useMemo(()=>({count:Math.max(1,Math.round(count)),particleSize:Math.max(.2,particleSize),idleSpeed:Math.max(0,idleSpeed),attractionRadius:Math.max(1,attractionRadius),attractionStrength:Math.max(0,attractionStrength),opacity:Math.max(0,Math.min(1,opacity))}),[count,particleSize,idleSpeed,attractionRadius,attractionStrength,opacity]);const createParticles=useCallback((width,height)=>{const particles=[];for(let i=0;i<tuned.count;i++){particles.push({x:Math.random()*width,y:Math.random()*height,vx:(Math.random()-.5)*.2,vy:(Math.random()-.5)*.2,driftPhase:Math.random()*Math.PI*2,driftScale:.3+Math.random()*.7});}particlesRef.current=particles;},[tuned.count]);const resizeCanvas=useCallback(()=>{const container=containerRef.current;const canvas=canvasRef.current;if(!container||!canvas)return;const rect=container.getBoundingClientRect();const width=Math.max(1,rect.width);const height=Math.max(1,rect.height);const dpr=typeof window!==\"undefined\"?Math.max(1,Math.min(2,window.devicePixelRatio||1)):1;canvas.width=Math.round(width*dpr);canvas.height=Math.round(height*dpr);canvas.style.width=`${width}px`;canvas.style.height=`${height}px`;sizeRef.current={width,height,dpr};createParticles(width,height);},[createParticles]);const drawFrame=useCallback(timeMs=>{const canvas=canvasRef.current;if(!canvas)return;const ctx=canvas.getContext(\"2d\");if(!ctx)return;const{width,height,dpr}=sizeRef.current;if(width<=0||height<=0)return;const t=timeMs*.001;const radiusSq=tuned.attractionRadius*tuned.attractionRadius;const damping=.94;ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,width,height);ctx.globalAlpha=tuned.opacity;ctx.fillStyle=particleColor;const particles=particlesRef.current;for(let i=0;i<particles.length;i++){const p=particles[i];const driftX=Math.cos(t*.7+p.driftPhase)*tuned.idleSpeed*.02*p.driftScale;const driftY=Math.sin(t*.9+p.driftPhase*1.13)*tuned.idleSpeed*.02*p.driftScale;let fx=driftX;let fy=driftY;if(pointerRef.current.active){const dx=pointerRef.current.x-p.x;const dy=pointerRef.current.y-p.y;const distSq=dx*dx+dy*dy;if(distSq<radiusSq){const dist=Math.sqrt(Math.max(distSq,1e-4));const nx=dx/dist;const ny=dy/dist;const normalized=dist/tuned.attractionRadius;const falloff=(1-normalized*normalized)**2;const attract=tuned.attractionStrength*falloff;fx+=nx*attract;fy+=ny*attract;}}p.vx=(p.vx+fx)*damping;p.vy=(p.vy+fy)*damping;p.x+=p.vx;p.y+=p.vy;if(p.x<0)p.x+=width;if(p.x>width)p.x-=width;if(p.y<0)p.y+=height;if(p.y>height)p.y-=height;ctx.beginPath();ctx.arc(p.x,p.y,tuned.particleSize,0,Math.PI*2);ctx.fill();}ctx.globalAlpha=1;},[particleColor,tuned.attractionRadius,tuned.attractionStrength,tuned.idleSpeed,tuned.opacity,tuned.particleSize]);useEffect(()=>{if(typeof window===\"undefined\")return;const container=containerRef.current;if(!container)return;const handlePointerMove=event=>{const rect=container.getBoundingClientRect();const isInside=event.clientX>=rect.left&&event.clientX<=rect.right&&event.clientY>=rect.top&&event.clientY<=rect.bottom;if(isInside){pointerRef.current.active=true;pointerRef.current.x=event.clientX-rect.left;pointerRef.current.y=event.clientY-rect.top;}else{pointerRef.current.active=false;}};const handlePointerExit=()=>{pointerRef.current.active=false;};window.addEventListener(\"pointermove\",handlePointerMove,{passive:true});window.addEventListener(\"pointerleave\",handlePointerExit);window.addEventListener(\"blur\",handlePointerExit);return()=>{window.removeEventListener(\"pointermove\",handlePointerMove);window.removeEventListener(\"pointerleave\",handlePointerExit);window.removeEventListener(\"blur\",handlePointerExit);};},[]);useEffect(()=>{if(typeof window===\"undefined\")return;resizeCanvas();if(typeof ResizeObserver!==\"undefined\"&&containerRef.current){resizeObserverRef.current=new ResizeObserver(()=>{resizeCanvas();});resizeObserverRef.current.observe(containerRef.current);}else{window.addEventListener(\"resize\",resizeCanvas);}return()=>{if(resizeObserverRef.current){resizeObserverRef.current.disconnect();resizeObserverRef.current=null;}else{window.removeEventListener(\"resize\",resizeCanvas);}};},[resizeCanvas]);useEffect(()=>{createParticles(sizeRef.current.width||1,sizeRef.current.height||1);},[createParticles,tuned.count]);useEffect(()=>{if(isStatic){drawFrame(0);return;}let mounted=true;const tick=time=>{if(!mounted)return;if(isInView){drawFrame(time);}rafIdRef.current=window.requestAnimationFrame(tick);};rafIdRef.current=window.requestAnimationFrame(tick);return()=>{mounted=false;if(rafIdRef.current){window.cancelAnimationFrame(rafIdRef.current);rafIdRef.current=0;}};},[drawFrame,isInView,isStatic]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",pointerEvents:\"none\",background:\"transparent\",...style},\"aria-hidden\":true,children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",display:\"block\",pointerEvents:\"none\",background:\"transparent\"}})});}addPropertyControls(MouseAttractParticles,{particleColor:{type:ControlType.Color,title:\"Color\",defaultValue:\"rgb(73, 86, 199)\"},count:{type:ControlType.Number,title:\"Count\",defaultValue:356,min:1,max:1200,step:1},particleSize:{type:ControlType.Number,title:\"Size\",defaultValue:1.5,min:.2,max:8,step:.1},idleSpeed:{type:ControlType.Number,title:\"Idle\",defaultValue:.5,min:0,max:4,step:.05},attractionRadius:{type:ControlType.Number,title:\"Radius\",defaultValue:220,min:10,max:800,step:1},attractionStrength:{type:ControlType.Number,title:\"Strength\",defaultValue:.08,min:0,max:1,step:.01},opacity:{type:ControlType.Number,title:\"Opacity\",defaultValue:.5,min:0,max:1,step:.01}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"MouseAttractParticles\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./MouseAttractParticles.map"],"mappings":"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"}