'use client'; import { useEffect, useRef, useState } from 'react'; type Props = { color?: string; size?: number; className?: string; }; export function CursorSpotlight({ color = 'rgba(94, 94, 94, 0.18)', size = 520, className = '' }: Props) { const ref = useRef(null); const [pos, setPos] = useState<{ x: number; y: number } | null>(null); const [enabled, setEnabled] = useState(false); useEffect(() => { const finePointer = window.matchMedia('(pointer: fine)').matches; const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (!finePointer || reduced) return; setEnabled(true); const el = ref.current?.parentElement; if (!el) return; let raf = 0; const onMove = (e: MouseEvent) => { const rect = el.getBoundingClientRect(); const x = e.clientX - rect.left; const y = e.clientY - rect.top; cancelAnimationFrame(raf); raf = requestAnimationFrame(() => setPos({ x, y })); }; const onLeave = () => setPos(null); el.addEventListener('mousemove', onMove); el.addEventListener('mouseleave', onLeave); return () => { el.removeEventListener('mousemove', onMove); el.removeEventListener('mouseleave', onLeave); cancelAnimationFrame(raf); }; }, []); if (!enabled) return null; return (
); }