'use client'; import * as React from 'react'; import { type HTMLMotionProps, motion } from 'motion/react'; import { cn } from '@workspace/ui/lib/utils'; type FrameDot = [number, number]; type Frame = FrameDot[]; type Frames = Frame[]; type MotionGridProps = { gridSize: [number, number]; frames: Frames; duration?: number; animate?: boolean; cellClassName?: string; cellProps?: HTMLMotionProps<'div'>; cellActiveClassName?: string; cellInactiveClassName?: string; } & React.ComponentProps<'div'>; const MotionGrid = ({ gridSize, frames, duration = 200, animate = true, cellClassName, cellProps, cellActiveClassName, cellInactiveClassName, className, style, ...props }: MotionGridProps) => { const [index, setIndex] = React.useState(0); const intervalRef = React.useRef(null); React.useEffect(() => { if (!animate || frames.length === 0) return; intervalRef.current = setInterval( () => setIndex((i) => (i + 1) % frames.length), duration, ); return () => clearInterval(intervalRef.current!); }, [frames.length, duration, animate]); const [cols, rows] = gridSize; const active = new Set( frames[index]?.map(([x, y]) => y * cols + x) ?? [], ); return (
{Array.from({ length: cols * rows }).map((_, i) => ( ))}
); }; export { MotionGrid, type MotionGridProps, type FrameDot, type Frame, type Frames, };