"use client"; import { cn } from "@/lib/utils"; import React, { useEffect, useState } from "react"; export const InfiniteMovingCards = ({ items, direction = "left", speed = "fast", pauseOnHover = true, className, }: { items: { src: string; alt: string; }[]; direction?: "left" | "right"; speed?: "fast" | "normal" | "slow"; pauseOnHover?: boolean; className?: string; }) => { const containerRef = React.useRef<HTMLDivElement>(null); const scrollerRef = React.useRef<HTMLUListElement>(null); useEffect(() => { addAnimation(); }, []); const [start, setStart] = useState(false); function addAnimation() { if (containerRef.current && scrollerRef.current) { const scrollerContent = Array.from(scrollerRef.current.children); // Duplicate items for infinite scrolling effect scrollerContent.forEach((item) => { const duplicatedItem = item.cloneNode(true); if (scrollerRef.current) { scrollerRef.current.appendChild(duplicatedItem); } }); getDirection(); getSpeed(); setStart(true); } } const getDirection = () => { if (containerRef.current) { containerRef.current.style.setProperty( "--animation-direction", direction === "left" ? "forwards" : "reverse" ); } }; const getSpeed = () => { if (containerRef.current) { const durationMap: Record<string, string> = { fast: "20s", normal: "40s", slow: "80s", }; containerRef.current.style.setProperty("--animation-duration", durationMap[speed]); } }; return ( <div ref={containerRef} className={cn( "scroller relative z-20 max-w-7xl overflow-hidden [mask-image:linear-gradient(to_right,transparent,white_20%,white_80%,transparent)]", className )} > <ul ref={scrollerRef} className={cn( "flex min-w-full shrink-0 gap-4 py-4 w-max flex-nowrap", start && "animate-scroll ", pauseOnHover && "hover:[animation-play-state:paused]" )} > {items.map((item, idx) => ( <li className="w-[120px] max-w-full relative flex-shrink-0" key={item.alt} // Use alt text as key for uniqueness > <img src={item.src} alt={item.alt} className="w-full h-auto rounded-md" style={{ background: "linear-gradient(180deg, var(--slate-800), var(--slate-900))", }} /> </li> ))} </ul> </div> ); };