"use client"; import { motion, useMotionTemplate, useMotionValue, useSpring } from "motion/react"; import { useEffect, useRef, useState } from "react"; /** * Cursor-following radial gradient. Mount as absolute child inside a Slide * (Slide already renders this for variant="feature"). Hover devices only. */ export function Spotlight() { const ref = useRef(null); const [enabled, setEnabled] = useState(false); const mx = useMotionValue(0.5); const my = useMotionValue(0.5); const sx = useSpring(mx, { stiffness: 100, damping: 24, mass: 0.6 }); const sy = useSpring(my, { stiffness: 100, damping: 24, mass: 0.6 }); const background = useMotionTemplate`radial-gradient(560px circle at ${sx}% ${sy}%, rgba(250,204,13,0.10), rgba(250,204,13,0) 65%)`; useEffect(() => { if (typeof window === "undefined") return; if (!window.matchMedia("(hover: hover)").matches) return; setEnabled(true); const onMove = (e: PointerEvent) => { const el = ref.current; if (!el) return; const rect = el.getBoundingClientRect(); mx.set(((e.clientX - rect.left) / rect.width) * 100); my.set(((e.clientY - rect.top) / rect.height) * 100); }; window.addEventListener("pointermove", onMove); return () => window.removeEventListener("pointermove", onMove); }, [mx, my]); if (!enabled) return null; return ( ); }