import * as React from "react"; import { cn } from "../../lib/utils"; import { Button, ButtonProps } from "./button"; interface RippleState { id: number; x: number; y: number; size: number; } const RIPPLE_DURATION_MS = 600; export const RippleButton = React.forwardRef( ({ children, className, onPointerDown, ...props }, ref) => { const [ripples, setRipples] = React.useState([]); const nextId = React.useRef(0); const handlePointerDown = React.useCallback( (e: React.PointerEvent) => { const rect = e.currentTarget.getBoundingClientRect(); const size = Math.max(rect.width, rect.height) * 2; const x = e.clientX - rect.left - size / 2; const y = e.clientY - rect.top - size / 2; const id = nextId.current++; setRipples((rs) => [...rs, { id, x, y, size }]); window.setTimeout( () => setRipples((rs) => rs.filter((r) => r.id !== id)), RIPPLE_DURATION_MS, ); onPointerDown?.(e); }, [onPointerDown], ); return ( ); }, ); RippleButton.displayName = "RippleButton";