"use client"; import { memo, Children } from "react"; import Marquee from "react-fast-marquee"; import CardStackTextBox from "../../CardStackTextBox"; import { cls } from "@/lib/utils"; import { AutoCarouselProps } from "../../types"; import { useCardAnimation } from "../../hooks/useCardAnimation"; const AutoCarousel = ({ children, uniformGridCustomHeightClasses, animationType, containerStyle = "default", speed = 50, title, titleSegments, description, tag, tagIcon, buttons, textboxLayout = "default", useInvertedBackground, className = "", containerClassName = "", carouselClassName = "", itemClassName = "", textBoxClassName = "", titleClassName = "", titleImageWrapperClassName = "", titleImageClassName = "", descriptionClassName = "", tagClassName = "", buttonContainerClassName = "", buttonClassName = "", buttonTextClassName = "", ariaLabel, showTextBox = true, dualMarquee = false, topMarqueeDirection = "left", bottomCarouselClassName = "", marqueeGapClassName = "", }: AutoCarouselProps) => { const childrenArray = Children.toArray(children); const heightClasses = uniformGridCustomHeightClasses || "min-h-80 2xl:min-h-90"; const { itemRefs } = useCardAnimation({ animationType, itemCount: childrenArray.length }); // Bottom marquee direction is opposite of top const bottomMarqueeDirection = topMarqueeDirection === "left" ? "right" : "left"; // Reverse order for bottom marquee to avoid alignment with top const bottomChildren = dualMarquee ? [...childrenArray].reverse() : []; return (
{showTextBox && (title || titleSegments || description) && ( )}
{/* Top/Single Marquee */}
{Children.map(childrenArray, (child, index) => (
{ itemRefs.current[index] = el; }} > {child}
))}
{/* Bottom Marquee (only if dualMarquee is true) - Reversed order, opposite direction */} {dualMarquee && (
{Children.map(bottomChildren, (child, index) => (
{child}
))}
)}
); }; AutoCarousel.displayName = "AutoCarousel"; export default memo(AutoCarousel);