"use client" import React, { useEffect, useMemo, useState, type ComponentPropsWithoutRef, } from "react" import { AnimatePresence, motion, type MotionProps } from "motion/react" import { cn } from "@/lib/utils" export function AnimatedListItem({ children }: { children: React.ReactNode }) { const animations: MotionProps = { initial: { scale: 0, opacity: 0 }, animate: { scale: 1, opacity: 1, originY: 0 }, exit: { scale: 0, opacity: 0 }, transition: { type: "spring", stiffness: 350, damping: 40 }, } return ( {children} ) } export interface AnimatedListProps extends ComponentPropsWithoutRef<"div"> { children: React.ReactNode delay?: number } export const AnimatedList = React.memo( ({ children, className, delay = 1000, ...props }: AnimatedListProps) => { const [index, setIndex] = useState(0) const childrenArray = useMemo( () => React.Children.toArray(children), [children] ) useEffect(() => { let timeout: ReturnType | null = null if (index < childrenArray.length - 1) { timeout = setTimeout(() => { setIndex((prevIndex) => (prevIndex + 1) % childrenArray.length) }, delay) } return () => { if (timeout !== null) { clearTimeout(timeout) } } }, [index, delay, childrenArray.length]) const itemsToShow = useMemo(() => { const result = childrenArray.slice(0, index + 1).reverse() return result }, [index, childrenArray]) return (
{itemsToShow.map((item) => ( {item} ))}
) } ) AnimatedList.displayName = "AnimatedList"