import React, { useCallback, useEffect } from "react"; import { motion, useMotionTemplate, useMotionValue } from "motion/react"; import { cn } from "@/lib/utils"; interface MagicCardProps { children?: React.ReactNode; className?: string; gradientSize?: number; gradientColor?: string; gradientOpacity?: number; gradientFrom?: string; gradientTo?: string; } export function MagicCard({ children, className, gradientSize = 200, gradientColor = "#262626", gradientOpacity = 0.8, gradientFrom = "#9E7AFF", gradientTo = "#FE8BBB", }: MagicCardProps) { const mouseX = useMotionValue(-gradientSize); const mouseY = useMotionValue(-gradientSize); const reset = useCallback(() => { mouseX.set(-gradientSize); mouseY.set(-gradientSize); }, [gradientSize, mouseX, mouseY]); const handlePointerMove = useCallback( (e: React.PointerEvent) => { const rect = e.currentTarget.getBoundingClientRect(); mouseX.set(e.clientX - rect.left); mouseY.set(e.clientY - rect.top); }, [mouseX, mouseY], ); useEffect(() => { reset(); }, [reset]); useEffect(() => { const handleGlobalPointerOut = (e: PointerEvent) => { if (!e.relatedTarget) { reset(); } }; const handleVisibility = () => { if (document.visibilityState !== "visible") { reset(); } }; window.addEventListener("pointerout", handleGlobalPointerOut); window.addEventListener("blur", reset); document.addEventListener("visibilitychange", handleVisibility); return () => { window.removeEventListener("pointerout", handleGlobalPointerOut); window.removeEventListener("blur", reset); document.removeEventListener("visibilitychange", handleVisibility); }; }, [reset]); return (
{children}
); }