import { motion, useMotionTemplate, useMotionValue } from 'motion/react' import React, { useCallback, useEffect } 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 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}
) }