"use client"; import { motion, useMotionTemplate, useMotionValue } from "motion/react"; import React, { useCallback, useEffect, useRef } from "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 cardRef = useRef(null); const mouseX = useMotionValue(-gradientSize); const mouseY = useMotionValue(-gradientSize); const handleMouseMove = useCallback( (e: MouseEvent) => { if (cardRef.current) { const { left, top } = cardRef.current.getBoundingClientRect(); const clientX = e.clientX; const clientY = e.clientY; mouseX.set(clientX - left); mouseY.set(clientY - top); } }, [mouseX, mouseY], ); const handleMouseOut = useCallback( (e: MouseEvent) => { if (!e.relatedTarget) { document.removeEventListener("mousemove", handleMouseMove); mouseX.set(-gradientSize); mouseY.set(-gradientSize); } }, [handleMouseMove, mouseX, gradientSize, mouseY], ); const handleMouseEnter = useCallback(() => { document.addEventListener("mousemove", handleMouseMove); mouseX.set(-gradientSize); mouseY.set(-gradientSize); }, [handleMouseMove, mouseX, gradientSize, mouseY]); useEffect(() => { document.addEventListener("mousemove", handleMouseMove); document.addEventListener("mouseout", handleMouseOut); document.addEventListener("mouseenter", handleMouseEnter); return () => { document.removeEventListener("mousemove", handleMouseMove); document.removeEventListener("mouseout", handleMouseOut); document.removeEventListener("mouseenter", handleMouseEnter); }; }, [handleMouseEnter, handleMouseMove, handleMouseOut]); useEffect(() => { mouseX.set(-gradientSize); mouseY.set(-gradientSize); }, [gradientSize, mouseX, mouseY]); return (
{children}
); }