import * as React from "react" import { cn } from "@/lib/utils" interface HoverButtonProps extends React.ButtonHTMLAttributes { children: React.ReactNode } const HoverButton = React.forwardRef( ({ className, children, ...props }, ref) => { const buttonRef = React.useRef(null) const [isListening, setIsListening] = React.useState(false) const [circles, setCircles] = React.useState>([]) const lastAddedRef = React.useRef(0) const createCircle = React.useCallback((x: number, y: number) => { const buttonWidth = buttonRef.current?.offsetWidth || 0 const xPos = x / buttonWidth const color = `linear-gradient(to right, var(--circle-start) ${xPos * 100}%, var(--circle-end) ${ xPos * 100 }%)` setCircles((prev) => [ ...prev, { id: Date.now(), x, y, color, fadeState: null }, ]) }, []) const handlePointerMove = React.useCallback( (event: React.PointerEvent) => { if (!isListening) return const currentTime = Date.now() if (currentTime - lastAddedRef.current > 100) { lastAddedRef.current = currentTime const rect = event.currentTarget.getBoundingClientRect() const x = event.clientX - rect.left const y = event.clientY - rect.top createCircle(x, y) } }, [isListening, createCircle] ) const handlePointerEnter = React.useCallback(() => { setIsListening(true) }, []) const handlePointerLeave = React.useCallback(() => { setIsListening(false) }, []) React.useEffect(() => { circles.forEach((circle) => { if (!circle.fadeState) { setTimeout(() => { setCircles((prev) => prev.map((c) => c.id === circle.id ? { ...c, fadeState: "in" } : c ) ) }, 0) setTimeout(() => { setCircles((prev) => prev.map((c) => c.id === circle.id ? { ...c, fadeState: "out" } : c ) ) }, 1000) setTimeout(() => { setCircles((prev) => prev.filter((c) => c.id !== circle.id)) }, 2200) } }) }, [circles]) return ( ) } ) HoverButton.displayName = "HoverButton" export { HoverButton }