'use client'; import type { Transition, Variants } from 'motion/react'; import type { HTMLAttributes } from 'react'; import { forwardRef, useCallback, useImperativeHandle, useRef } from 'react'; import { motion, useAnimation } from 'motion/react'; import { cn } from '@/lib/utils'; export interface HomeIconHandle { startAnimation: () => void; stopAnimation: () => void; } interface HomeIconProps extends HTMLAttributes { size?: number; } const DEFAULT_TRANSITION: Transition = { duration: 0.6, opacity: { duration: 0.2 }, }; const PATH_VARIANTS: Variants = { normal: { pathLength: 1, opacity: 1, }, animate: { opacity: [0, 1], pathLength: [0, 1], }, }; const HomeIcon = forwardRef(({ onMouseEnter, onMouseLeave, className, size = 28, ...props }, ref) => { const controls = useAnimation(); const isControlledRef = useRef(false); useImperativeHandle(ref, () => { isControlledRef.current = true; return { startAnimation: () => controls.start('animate'), stopAnimation: () => controls.start('normal'), }; }); const handleMouseEnter = useCallback((e: React.MouseEvent) => { if (!isControlledRef.current) { controls.start('animate'); } else { onMouseEnter?.(e); } }, [controls, onMouseEnter]); const handleMouseLeave = useCallback((e: React.MouseEvent) => { if (!isControlledRef.current) { controls.start('normal'); } else { onMouseLeave?.(e); } }, [controls, onMouseLeave]); return (
); }); HomeIcon.displayName = 'HomeIcon'; export { HomeIcon };