import React, { useEffect, useState } from 'react'; import { motion, useSpring, useMotionValue } from 'framer-motion'; export const CustomCursor: React.FC = () => { const cursorX = useMotionValue(-100); const cursorY = useMotionValue(-100); const [isHovering, setIsHovering] = useState(false); // Trailing Effect - Create 4 dots with staggered spring physics const trail1X = useSpring(cursorX, { damping: 20, stiffness: 200 }); const trail1Y = useSpring(cursorY, { damping: 20, stiffness: 200 }); const trail2X = useSpring(cursorX, { damping: 30, stiffness: 150 }); const trail2Y = useSpring(cursorY, { damping: 30, stiffness: 150 }); const trail3X = useSpring(cursorX, { damping: 40, stiffness: 100 }); const trail3Y = useSpring(cursorY, { damping: 40, stiffness: 100 }); useEffect(() => { const moveCursor = (e: MouseEvent) => { cursorX.set(e.clientX); cursorY.set(e.clientY); }; const handleMouseOver = (e: MouseEvent) => { const target = e.target as HTMLElement; const isClickable = target.closest('button, a, input, select, [role="button"]'); setIsHovering(!!isClickable); }; window.addEventListener('mousemove', moveCursor); window.addEventListener('mouseover', handleMouseOver); return () => { window.removeEventListener('mousemove', moveCursor); window.removeEventListener('mouseover', handleMouseOver); }; }, [cursorX, cursorY]); const trails = [ { x: trail1X, y: trail1Y, scale: 0.8, opacity: 0.6, delay: 0 }, { x: trail2X, y: trail2Y, scale: 0.6, opacity: 0.4, delay: 0.05 }, { x: trail3X, y: trail3Y, scale: 0.4, opacity: 0.2, delay: 0.1 }, ]; return ( <> {/* Trailing Dots (The "Dragging" effect) */} {trails.map((trail, i) => ( ))} {/* Main Lead Dot */} {/* Pulsing Outer Ring */} {/* Technical HUD Crosshair (Centered on lead) */}
); };