"use client"; import type { Variants } from "motion/react"; import { motion, useAnimation } from "motion/react"; import type { HTMLAttributes } from "react"; import { forwardRef, useCallback, useImperativeHandle, useRef } from "react"; import { cn } from "@/lib/utils"; export interface LayoutGridIconHandle { startAnimation: () => void; stopAnimation: () => void; } interface LayoutGridIconProps extends HTMLAttributes { size?: number; } const RECT_1_VARIANTS: Variants = { normal: { translateX: 0, translateY: 0 }, animate: { translateX: [0, 11, 11, 0], translateY: [0, 0, 0, 0], transition: { duration: 0.8, ease: "easeInOut", times: [0, 0.4, 0.6, 1] }, }, }; const RECT_2_VARIANTS: Variants = { normal: { translateX: 0, translateY: 0 }, animate: { translateX: [0, 0, 0, 0], translateY: [0, 11, 11, 0], transition: { duration: 0.8, ease: "easeInOut", times: [0, 0.4, 0.6, 1] }, }, }; const RECT_3_VARIANTS: Variants = { normal: { translateX: 0, translateY: 0 }, animate: { translateX: [0, -11, -11, 0], translateY: [0, 0, 0, 0], transition: { duration: 0.8, ease: "easeInOut", times: [0, 0.4, 0.6, 1] }, }, }; const RECT_4_VARIANTS: Variants = { normal: { translateX: 0, translateY: 0 }, animate: { translateX: [0, 0, 0, 0], translateY: [0, -11, -11, 0], transition: { duration: 0.8, ease: "easeInOut", times: [0, 0.4, 0.6, 1] }, }, }; const LayoutGridIcon = 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) { onMouseEnter?.(e); } else { controls.start("animate"); } }, [controls, onMouseEnter] ); const handleMouseLeave = useCallback( (e: React.MouseEvent) => { if (isControlledRef.current) { onMouseLeave?.(e); } else { controls.start("normal"); } }, [controls, onMouseLeave] ); return (
); } ); LayoutGridIcon.displayName = "LayoutGridIcon"; export { LayoutGridIcon };