"use client"; import TextBox from "@/components/Textbox"; import MediaContent from "@/components/shared/MediaContent"; import HeroBackgrounds, { type HeroBackgroundVariantProps } from "@/components/background/HeroBackgrounds"; import LogoMarquee, { type MarqueeItem } from "@/components/shared/LogoMarquee"; import { cls } from "@/lib/utils"; import type { LucideIcon } from "lucide-react"; import type { ButtonConfig, ButtonAnimationType } from "@/types/button"; import type { Avatar } from "@/components/shared/AvatarGroup"; export interface CarouselMediaItem { imageSrc?: string; videoSrc?: string; imageAlt?: string; videoAriaLabel?: string; } type HeroSplitDoubleCarouselBackgroundProps = Extract< HeroBackgroundVariantProps, | { variant: "plain" } | { variant: "animated-grid" } | { variant: "canvas-reveal" } | { variant: "cell-wave" } | { variant: "downward-rays-animated" } | { variant: "downward-rays-animated-grid" } | { variant: "downward-rays-static" } | { variant: "downward-rays-static-grid" } | { variant: "glowing-orb" } | { variant: "gradient-bars" } | { variant: "radial-gradient" } | { variant: "rotated-rays-animated" } | { variant: "rotated-rays-animated-grid" } | { variant: "rotated-rays-static" } | { variant: "rotated-rays-static-grid" } | { variant: "sparkles-gradient" } >; interface HeroSplitDoubleCarouselProps { title: string; description: string; background: HeroSplitDoubleCarouselBackgroundProps; tag?: string; tagIcon?: LucideIcon; tagAnimation?: ButtonAnimationType; buttons?: ButtonConfig[]; buttonAnimation?: ButtonAnimationType; avatars?: Avatar[]; avatarText?: string; leftCarouselItems: CarouselMediaItem[]; rightCarouselItems: CarouselMediaItem[]; ariaLabel?: string; carouselPosition?: "left" | "right"; className?: string; containerClassName?: string; textBoxClassName?: string; titleClassName?: string; descriptionClassName?: string; tagClassName?: string; buttonContainerClassName?: string; buttonClassName?: string; buttonTextClassName?: string; carouselWrapperClassName?: string; carouselColumnClassName?: string; carouselItemClassName?: string; carouselImageClassName?: string; avatarGroupClassName?: string; marqueeItems?: MarqueeItem[]; marqueeSpeed?: number; showMarqueeCard?: boolean; marqueeClassName?: string; marqueeItemClassName?: string; marqueeCardClassName?: string; marqueeImageClassName?: string; marqueeTextClassName?: string; marqueeIconClassName?: string; } const HeroSplitDoubleCarousel = ({ title, description, background = { variant: "plain" }, tag, tagIcon, tagAnimation = "opacity", buttons = [], buttonAnimation = "slide-up", avatars, avatarText, leftCarouselItems, rightCarouselItems, ariaLabel = "Hero section", carouselPosition = "right", className = "", containerClassName = "", textBoxClassName = "", titleClassName = "", descriptionClassName = "", tagClassName = "", buttonContainerClassName = "", buttonClassName = "", buttonTextClassName = "", carouselWrapperClassName = "", carouselColumnClassName = "", carouselItemClassName = "", carouselImageClassName = "", avatarGroupClassName = "", marqueeItems, marqueeSpeed = 30, showMarqueeCard = true, marqueeClassName = "", marqueeItemClassName = "", marqueeCardClassName = "", marqueeImageClassName = "", marqueeTextClassName = "", marqueeIconClassName = "", }: HeroSplitDoubleCarouselProps) => { const duplicatedLeftItems = [...leftCarouselItems, ...leftCarouselItems, ...leftCarouselItems, ...leftCarouselItems]; const duplicatedRightItems = [...rightCarouselItems, ...rightCarouselItems, ...rightCarouselItems, ...rightCarouselItems]; const renderColumn = (items: CarouselMediaItem[], direction: "up" | "down") => (
{items.map((item, index) => (
))}
); const carouselContent = (
{renderColumn(duplicatedLeftItems, "up")} {renderColumn(duplicatedRightItems, "down")}
); return (
{carouselPosition === "left" && carouselContent}
{/* Mobile */} {/* Desktop */}
{carouselPosition === "right" && carouselContent}
{marqueeItems && marqueeItems.length > 0 && ( )}
); }; export default HeroSplitDoubleCarousel;