{"version":3,"file":"CursorTracker.CAGEJtkB.mjs","names":["useState","useRef","useMemo","useCallback","_Fragment"],"sources":["https:/framerusercontent.com/modules/A0as57J11GuMy1Yi0gN0/k4BTCJtWJU3SsESidooW/CursorTracker.js"],"sourcesContent":["// Custom component for tracking cursor position and following it\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useState,useEffect,useCallback,useMemo,useRef}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";/**\n * Cursor Follower\n *\n * @framerIntrinsicWidth 100\n * @framerIntrinsicHeight 100\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function CursorTracker(props){const{color=\"#0099FF\",blur=20,opacity=.6,showTrail=false,trailLength=5,thickness=2}=props;const[position,setPosition]=useState({x:0,y:0});const[trail,setTrail]=useState([]);const[isMouseInside,setIsMouseInside]=useState(false);const isStatic=useIsStaticRenderer();const containerRef=useRef(null);const idCounterRef=useRef(0);const rafRef=useRef();// Memoize line styles to prevent recalculation\nconst lineStyle=useMemo(()=>({backgroundColor:color,filter:blur>0?`blur(${blur}px)`:\"none\",pointerEvents:\"none\",position:\"absolute\"}),[color,blur]);// Optimized mouse move handler with throttling\nconst handleMouseMove=useCallback(e=>{if(!containerRef.current)return;// Cancel previous RAF if pending\nif(rafRef.current){cancelAnimationFrame(rafRef.current);}rafRef.current=requestAnimationFrame(()=>{if(!containerRef.current)return;const rect=containerRef.current.getBoundingClientRect();const newX=e.clientX-rect.left;const newY=e.clientY-rect.top;// Check bounds\nif(newX>=0&&newX<=rect.width&&newY>=0&&newY<=rect.height){setPosition({x:newX,y:newY});setIsMouseInside(true);if(showTrail){setTrail(prev=>{const newPoint={x:newX,y:newY,id:idCounterRef.current++};return[newPoint,...prev.slice(0,trailLength-1)];});}}});},[showTrail,trailLength]);const handleMouseEnter=useCallback(()=>{setIsMouseInside(true);},[]);const handleMouseLeave=useCallback(()=>{setIsMouseInside(false);if(rafRef.current){cancelAnimationFrame(rafRef.current);}},[]);useEffect(()=>{if(isStatic||typeof window===\"undefined\"||!containerRef.current)return;const container=containerRef.current;container.addEventListener(\"mousemove\",handleMouseMove,{passive:true});container.addEventListener(\"mouseenter\",handleMouseEnter,{passive:true});container.addEventListener(\"mouseleave\",handleMouseLeave,{passive:true});return()=>{container.removeEventListener(\"mousemove\",handleMouseMove);container.removeEventListener(\"mouseenter\",handleMouseEnter);container.removeEventListener(\"mouseleave\",handleMouseLeave);if(rafRef.current){cancelAnimationFrame(rafRef.current);}};},[handleMouseMove,handleMouseEnter,handleMouseLeave,isStatic]);// Optimized line rendering with minimal DOM elements\nconst renderLines=useCallback((shapeOpacity,x,y)=>/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{style:{...lineStyle,left:0,top:y-thickness/2,width:\"100%\",height:thickness,opacity:shapeOpacity}}),/*#__PURE__*/_jsx(\"div\",{style:{...lineStyle,left:x-thickness/2,top:0,width:thickness,height:\"100%\",opacity:shapeOpacity}})]}),[lineStyle,thickness]);// Memoized trail rendering\nconst trailElements=useMemo(()=>{if(!showTrail||!isMouseInside||trail.length===0)return null;return trail.map((point,index)=>{const trailOpacity=opacity*(1-index/trailLength);return /*#__PURE__*/_jsx(\"div\",{style:{pointerEvents:\"none\"},children:renderLines(trailOpacity,point.x,point.y)},point.id);});},[showTrail,isMouseInside,trail,opacity,trailLength,renderLines]);if(isStatic){return /*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:\"#999\",fontSize:14,textAlign:\"center\"},children:\"Cursor follower preview\"});}return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",cursor:\"none\",contain:\"layout style paint\"},children:isMouseInside&&/*#__PURE__*/_jsxs(_Fragment,{children:[trailElements,/*#__PURE__*/_jsx(\"div\",{style:{pointerEvents:\"none\"},children:renderLines(opacity,position.x,position.y)})]})});}addPropertyControls(CursorTracker,{thickness:{type:ControlType.Number,title:\"Thickness\",defaultValue:2,min:1,max:10,step:1,unit:\"px\"},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#0099FF\"},blur:{type:ControlType.Number,title:\"Blur\",defaultValue:20,min:0,max:50,step:1,unit:\"px\"},opacity:{type:ControlType.Number,title:\"Opacity\",defaultValue:.6,min:0,max:1,step:.1},showTrail:{type:ControlType.Boolean,title:\"Show Trail\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},trailLength:{type:ControlType.Number,title:\"Trail Length\",defaultValue:5,min:2,max:20,step:1,hidden:({showTrail})=>!showTrail}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CursorTracker\",\"slots\":[],\"annotations\":{\"framerIntrinsicWidth\":\"100\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerIntrinsicHeight\":\"100\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CursorTracker.map"],"mappings":"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"}