'use client'; import { cn } from '@/lib/utils'; import { type Variants, motion, useAnimation } from 'motion/react'; import type { HTMLAttributes } from 'react'; import { forwardRef, useCallback, useImperativeHandle, useRef } from 'react'; export interface ChartScatterIconHandle { startAnimation: () => void; stopAnimation: () => void; } const dotVariants: Variants = { visible: (i: number) => ({ opacity: 1, transition: { delay: i * 0.15, duration: 0.3, }, }), hidden: { opacity: 0, transition: { duration: 0.2, }, }, default: { opacity: 1 }, }; const ChartScatterIcon = forwardRef< ChartScatterIconHandle, HTMLAttributes >(({ onMouseEnter, onMouseLeave, className, ...props }, ref) => { const controls = useAnimation(); const isControlledRef = useRef(false); useImperativeHandle(ref, () => { isControlledRef.current = true; return { startAnimation: async () => { await controls.start('hidden'); await controls.start('visible'); }, stopAnimation: async () => controls.start('default'), }; }); const handleMouseEnter = useCallback( async (e: React.MouseEvent) => { if (!isControlledRef.current) { await controls.start('hidden'); await controls.start('visible'); } else { onMouseEnter?.(e); } }, [controls, onMouseEnter] ); const handleMouseLeave = useCallback( async (e: React.MouseEvent) => { if (!isControlledRef.current) { await controls.start('default'); } else { onMouseLeave?.(e); } }, [controls, onMouseLeave] ); return (
); }); ChartScatterIcon.displayName = 'ChartScatterIcon'; export { ChartScatterIcon };