Leave a star on GitHub! ⭐


Docs
Testimonals

Testimonals

These components are used to build the social proof section of the website.

Testimonial Highlight

What our customers are saying

nexus.ai has revolutionized our security testing process. We're now able to identify and address vulnerabilities faster than ever before.

Google Logo

Alex Rivera

Head of Cybersecurity

With nexus.ai, we've significantly improved our security posture. It's like having an AI-powered ethical hacker working around the clock.

GitHub Logo

Samantha Lee

Chief Information Security Officer

The AI-driven insights from nexus.ai have transformed how we approach cybersecurity. It's a game-changer for our platform's security.

Amazon Logo

Raj Patel

VP of Engineering

nexus.ai's automated penetration testing has saved us countless hours and dramatically enhanced our security measures.

Netflix Logo

Emily Chen

Security Operations Manager

Implementing nexus.ai was seamless, and the results were immediate. We're now proactively addressing potential security issues before they become threats.

YouTube Logo

Michael Brown

Director of IT Security

The continuous monitoring capabilities of nexus.ai give us peace of mind. We're always one step ahead in protecting our users' data.

Instagram Logo

Linda Wu

Lead Security Architect

nexus.ai's compliance mapping feature has streamlined our security audit processes. It's an essential tool for maintaining trust with our users.

Spotify Logo

Carlos Gomez

Chief Technology Officer

Installation

pnpm add embla-carousel-react lucide-react

Copy and paste the following code of header into your project.

components/eldoraui/carousel.tsx

"use client";
 
import useEmblaCarousel, {
  type UseEmblaCarouselType,
} from "embla-carousel-react";
import { ArrowLeft, ArrowRight } from "lucide-react";
import * as React from "react";
 
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
 
type CarouselApi = UseEmblaCarouselType[1];
type UseCarouselParameters = Parameters<typeof useEmblaCarousel>;
type CarouselOptions = UseCarouselParameters[0];
type CarouselPlugin = UseCarouselParameters[1];
 
interface CarouselProps {
  opts?: CarouselOptions;
  plugins?: CarouselPlugin;
  orientation?: "horizontal" | "vertical";
  setApi?: (api: CarouselApi) => void;
}
 
type CarouselContextProps = {
  carouselRef: ReturnType<typeof useEmblaCarousel>[0];
  api: ReturnType<typeof useEmblaCarousel>[1];
  scrollPrev: () => void;
  scrollNext: () => void;
  canScrollPrev: boolean;
  canScrollNext: boolean;
} & CarouselProps;
 
const CarouselContext = React.createContext<CarouselContextProps | null>(null);
 
function useCarousel() {
  const context = React.useContext(CarouselContext);
 
  if (!context) {
    throw new Error("useCarousel must be used within a <Carousel />");
  }
 
  return context;
}
 
const Carousel = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement> & CarouselProps
>(
  (
    {
      orientation = "horizontal",
      opts,
      setApi,
      plugins,
      className,
      children,
      ...props
    },
    ref,
  ) => {
    const [carouselRef, api] = useEmblaCarousel(
      {
        ...opts,
        axis: orientation === "horizontal" ? "x" : "y",
      },
      plugins,
    );
    const [canScrollPrev, setCanScrollPrev] = React.useState(false);
    const [canScrollNext, setCanScrollNext] = React.useState(false);
 
    const onSelect = React.useCallback((api: CarouselApi) => {
      if (!api) {
        return;
      }
 
      setCanScrollPrev(api.canScrollPrev());
      setCanScrollNext(api.canScrollNext());
    }, []);
 
    const scrollPrev = React.useCallback(() => {
      api?.scrollPrev();
    }, [api]);
 
    const scrollNext = React.useCallback(() => {
      api?.scrollNext();
    }, [api]);
 
    const handleKeyDown = React.useCallback(
      (event: React.KeyboardEvent<HTMLDivElement>) => {
        if (event.key === "ArrowLeft") {
          event.preventDefault();
          scrollPrev();
        } else if (event.key === "ArrowRight") {
          event.preventDefault();
          scrollNext();
        }
      },
      [scrollPrev, scrollNext],
    );
 
    React.useEffect(() => {
      if (!api || !setApi) {
        return;
      }
 
      setApi(api);
    }, [api, setApi]);
 
    React.useEffect(() => {
      if (!api) {
        return;
      }
 
      onSelect(api);
      api.on("reInit", onSelect);
      api.on("select", onSelect);
 
      return () => {
        api?.off("select", onSelect);
      };
    }, [api, onSelect]);
 
    return (
      <CarouselContext.Provider
        value={{
          carouselRef,
          api,
          opts,
          orientation:
            orientation || (opts?.axis === "y" ? "vertical" : "horizontal"),
          scrollPrev,
          scrollNext,
          canScrollPrev,
          canScrollNext,
        }}
      >
        <div
          ref={ref}
          onKeyDownCapture={handleKeyDown}
          className={cn("relative", className)}
          role="region"
          aria-roledescription="carousel"
          {...props}
        >
          {children}
        </div>
      </CarouselContext.Provider>
    );
  },
);
Carousel.displayName = "Carousel";
 
const CarouselContent = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => {
  const { carouselRef, orientation } = useCarousel();
 
  return (
    <div ref={carouselRef} className="overflow-hidden">
      <div
        ref={ref}
        className={cn(
          "flex",
          orientation === "horizontal" ? "-ml-4" : "-mt-4 flex-col",
          className,
        )}
        {...props}
      />
    </div>
  );
});
CarouselContent.displayName = "CarouselContent";
 
const CarouselItem = React.forwardRef<
  HTMLDivElement,
  React.HTMLAttributes<HTMLDivElement>
>(({ className, ...props }, ref) => {
  const { orientation } = useCarousel();
 
  return (
    <div
      ref={ref}
      role="group"
      aria-roledescription="slide"
      className={cn(
        "min-w-0 shrink-0 grow-0 basis-full",
        orientation === "horizontal" ? "pl-4" : "pt-4",
        className,
      )}
      {...props}
    />
  );
});
CarouselItem.displayName = "CarouselItem";
 
const CarouselPrevious = React.forwardRef<
  HTMLButtonElement,
  React.ComponentProps<typeof Button>
>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
  const { orientation, scrollPrev, canScrollPrev } = useCarousel();
 
  return (
    <Button
      ref={ref}
      variant={variant}
      size={size}
      className={cn(
        "absolute  size-8 rounded-full",
        orientation === "horizontal"
          ? "bottom-0 left-1/2 -translate-x-16 translate-y-4"
          : "-top-12 right-1/2 -translate-x-1/2 rotate-90",
        className,
      )}
      disabled={!canScrollPrev}
      onClick={scrollPrev}
      {...props}
    >
      <ArrowLeft className="size-4" />
      <span className="sr-only">Previous slide</span>
    </Button>
  );
});
CarouselPrevious.displayName = "CarouselPrevious";
 
const CarouselNext = React.forwardRef<
  HTMLButtonElement,
  React.ComponentProps<typeof Button>
>(({ className, variant = "outline", size = "icon", ...props }, ref) => {
  const { orientation, scrollNext, canScrollNext } = useCarousel();
 
  return (
    <Button
      ref={ref}
      variant={variant}
      size={size}
      className={cn(
        "absolute size-8 rounded-full",
        orientation === "horizontal"
          ? "bottom-0 right-1/2 translate-x-16 translate-y-4"
          : "-bottom-12 left-1/2 -translate-x-1/2 rotate-90",
        className,
      )}
      disabled={!canScrollNext}
      onClick={scrollNext}
      {...props}
    >
      <ArrowRight className="size-4" />
      <span className="sr-only">Next slide</span>
    </Button>
  );
});
CarouselNext.displayName = "CarouselNext";
 
export {
  Carousel,
  CarouselContent,
  CarouselItem,
  CarouselNext,
  CarouselPrevious,
  type CarouselApi,
};

Update the import paths to match your project setup.

Testimonals Marquee

What People Are Saying

Don't just take our word for it. Here's what real people are saying about Eldora UI

Using EldoraUI has revolutionized our design process.Its reusable, animated components make it easy to deliver cutting-edge designs. A must-have for any design team.

Alex Rivera

Alex Rivera

UI/UX Lead at InnovateTech

EldoraUI's templates have drastically improved our development speed.We've reduced project timelines by 70%, delivering high-quality UIs effortlessly. Highly recommend it to fellow developers.

Samantha Lee

Samantha Lee

Frontend Engineer at NextGen Solutions

As a startup founder, I need tools that help us grow fast without sacrificing quality. EldoraUI's stunning designs and simple integration have made it an essential part of our workflow.Our clients love our modern interfaces.

Raj Patel

Raj Patel

Founder at Startup Studio

Using EldoraUI has revolutionized our design process.Its reusable, animated components make it easy to deliver cutting-edge designs. A must-have for any design team.

Alex Rivera

Alex Rivera

UI/UX Lead at InnovateTech

EldoraUI's templates have drastically improved our development speed.We've reduced project timelines by 70%, delivering high-quality UIs effortlessly. Highly recommend it to fellow developers.

Samantha Lee

Samantha Lee

Frontend Engineer at NextGen Solutions

As a startup founder, I need tools that help us grow fast without sacrificing quality. EldoraUI's stunning designs and simple integration have made it an essential part of our workflow.Our clients love our modern interfaces.

Raj Patel

Raj Patel

Founder at Startup Studio

Using EldoraUI has revolutionized our design process.Its reusable, animated components make it easy to deliver cutting-edge designs. A must-have for any design team.

Alex Rivera

Alex Rivera

UI/UX Lead at InnovateTech

EldoraUI's templates have drastically improved our development speed.We've reduced project timelines by 70%, delivering high-quality UIs effortlessly. Highly recommend it to fellow developers.

Samantha Lee

Samantha Lee

Frontend Engineer at NextGen Solutions

As a startup founder, I need tools that help us grow fast without sacrificing quality. EldoraUI's stunning designs and simple integration have made it an essential part of our workflow.Our clients love our modern interfaces.

Raj Patel

Raj Patel

Founder at Startup Studio

Using EldoraUI has revolutionized our design process.Its reusable, animated components make it easy to deliver cutting-edge designs. A must-have for any design team.

Alex Rivera

Alex Rivera

UI/UX Lead at InnovateTech

EldoraUI's templates have drastically improved our development speed.We've reduced project timelines by 70%, delivering high-quality UIs effortlessly. Highly recommend it to fellow developers.

Samantha Lee

Samantha Lee

Frontend Engineer at NextGen Solutions

As a startup founder, I need tools that help us grow fast without sacrificing quality. EldoraUI's stunning designs and simple integration have made it an essential part of our workflow.Our clients love our modern interfaces.

Raj Patel

Raj Patel

Founder at Startup Studio

EldoraUI's prebuilt components have made it so easy to create intuitive and compliant designs.It's perfect for tackling complex workflows with style. A must-have for any product designer.

Emily Chen

Emily Chen

Product Designer at Global Systems

EldoraUI's animations and design elements have elevated our fintech app's user experience.The feedback on our new design is phenomenal. It's a game-changer for user-centric applications.

Michael Brown

Michael Brown

Creative Director at FinTech Innovations

EldoraUI's component library has simplified web development for our logistics dashboard.Building custom layouts has never been this efficient.

Linda Wu

Linda Wu

Web Developer at LogiChain Solutions

EldoraUI's prebuilt components have made it so easy to create intuitive and compliant designs.It's perfect for tackling complex workflows with style. A must-have for any product designer.

Emily Chen

Emily Chen

Product Designer at Global Systems

EldoraUI's animations and design elements have elevated our fintech app's user experience.The feedback on our new design is phenomenal. It's a game-changer for user-centric applications.

Michael Brown

Michael Brown

Creative Director at FinTech Innovations

EldoraUI's component library has simplified web development for our logistics dashboard.Building custom layouts has never been this efficient.

Linda Wu

Linda Wu

Web Developer at LogiChain Solutions

EldoraUI's prebuilt components have made it so easy to create intuitive and compliant designs.It's perfect for tackling complex workflows with style. A must-have for any product designer.

Emily Chen

Emily Chen

Product Designer at Global Systems

EldoraUI's animations and design elements have elevated our fintech app's user experience.The feedback on our new design is phenomenal. It's a game-changer for user-centric applications.

Michael Brown

Michael Brown

Creative Director at FinTech Innovations

EldoraUI's component library has simplified web development for our logistics dashboard.Building custom layouts has never been this efficient.

Linda Wu

Linda Wu

Web Developer at LogiChain Solutions

EldoraUI's prebuilt components have made it so easy to create intuitive and compliant designs.It's perfect for tackling complex workflows with style. A must-have for any product designer.

Emily Chen

Emily Chen

Product Designer at Global Systems

EldoraUI's animations and design elements have elevated our fintech app's user experience.The feedback on our new design is phenomenal. It's a game-changer for user-centric applications.

Michael Brown

Michael Brown

Creative Director at FinTech Innovations

EldoraUI's component library has simplified web development for our logistics dashboard.Building custom layouts has never been this efficient.

Linda Wu

Linda Wu

Web Developer at LogiChain Solutions

EldoraUI's responsive designs have helped us create marketing sites that look amazing on every device.It's revolutionized how we approach branding online.

Carlos Gomez

Carlos Gomez

Digital Marketing Specialist at EcoTech

EldoraUI's beautifully crafted components have completely transformed our fashion storefront.Customers love the dynamic shopping experience.

Aisha Khan

Aisha Khan

E-commerce Product Manager at FashionForward

EldoraUI has made it easy to create user-friendly, accessible interfaces for our healthcare apps.It's a crucial part of our design system.

Tom Chen

Tom Chen

Healthcare App Designer at HealthTech Solutions

EldoraUI's responsive designs have helped us create marketing sites that look amazing on every device.It's revolutionized how we approach branding online.

Carlos Gomez

Carlos Gomez

Digital Marketing Specialist at EcoTech

EldoraUI's beautifully crafted components have completely transformed our fashion storefront.Customers love the dynamic shopping experience.

Aisha Khan

Aisha Khan

E-commerce Product Manager at FashionForward

EldoraUI has made it easy to create user-friendly, accessible interfaces for our healthcare apps.It's a crucial part of our design system.

Tom Chen

Tom Chen

Healthcare App Designer at HealthTech Solutions

EldoraUI's responsive designs have helped us create marketing sites that look amazing on every device.It's revolutionized how we approach branding online.

Carlos Gomez

Carlos Gomez

Digital Marketing Specialist at EcoTech

EldoraUI's beautifully crafted components have completely transformed our fashion storefront.Customers love the dynamic shopping experience.

Aisha Khan

Aisha Khan

E-commerce Product Manager at FashionForward

EldoraUI has made it easy to create user-friendly, accessible interfaces for our healthcare apps.It's a crucial part of our design system.

Tom Chen

Tom Chen

Healthcare App Designer at HealthTech Solutions

EldoraUI's responsive designs have helped us create marketing sites that look amazing on every device.It's revolutionized how we approach branding online.

Carlos Gomez

Carlos Gomez

Digital Marketing Specialist at EcoTech

EldoraUI's beautifully crafted components have completely transformed our fashion storefront.Customers love the dynamic shopping experience.

Aisha Khan

Aisha Khan

E-commerce Product Manager at FashionForward

EldoraUI has made it easy to create user-friendly, accessible interfaces for our healthcare apps.It's a crucial part of our design system.

Tom Chen

Tom Chen

Healthcare App Designer at HealthTech Solutions

EldoraUI's education-focused templates have doubled our platform's usability.It's tailor-made for addressing student and teacher needs.

Sofia Patel

Sofia Patel

EdTech Founder at EduSafe Innovations

EldoraUI's education-focused templates have doubled our platform's usability.It's tailor-made for addressing student and teacher needs.

Sofia Patel

Sofia Patel

EdTech Founder at EduSafe Innovations

EldoraUI's education-focused templates have doubled our platform's usability.It's tailor-made for addressing student and teacher needs.

Sofia Patel

Sofia Patel

EdTech Founder at EduSafe Innovations

EldoraUI's education-focused templates have doubled our platform's usability.It's tailor-made for addressing student and teacher needs.

Sofia Patel

Sofia Patel

EdTech Founder at EduSafe Innovations

Installation

pnpm add framer-motion lucide-react

Copy and paste the following code into your project.

components/eldoraui/testimonals.tsx

"use client";
 
import { cn } from "@/lib/utils";
import { motion } from "framer-motion";
import { Star } from "lucide-react";
import Image from "next/image";
import { Marquee } from "@/components/eldoraui/marquee";
 
export function Highlight({
  children,
  className,
}: {
  children: React.ReactNode;
  className?: string;
}) {
  return (
    <span
      className={cn(
        "bg-[#f0abfc] p-1 py-0.5 font-bold text-[#d946ef] dark:bg-[#f0abfc] dark:text-[#d946ef]",
        className,
      )}
    >
      {children}
    </span>
  );
}
 
export interface TestimonialCardProps {
  name: string;
  role: string;
  img?: string;
  description: React.ReactNode;
  className?: string;
  [key: string]: any;
}
 
export function TestimonialCard({
  description,
  name,
  img,
  role,
  className,
  ...props // Capture the rest of the props
}: TestimonialCardProps) {
  return (
    <div
      className={cn(
        "mb-4 flex w-full cursor-pointer break-inside-avoid flex-col items-center justify-between gap-6 rounded-xl p-4",
        // light styles
        " border border-neutral-200 bg-white",
        // dark styles
        "dark:bg-black dark:[border:1px_solid_rgba(255,255,255,.1)] dark:[box-shadow:0_-20px_80px_-20px_#ffffff1f_inset]",
        className,
      )}
      {...props}
    >
      <div className="select-none text-sm font-normal text-neutral-700 dark:text-neutral-400">
        {description}
        <div className="flex flex-row py-1">
          <Star className="size-4 fill-yellow-500 text-yellow-500" />
          <Star className="size-4 fill-yellow-500 text-yellow-500" />
          <Star className="size-4 fill-yellow-500 text-yellow-500" />
          <Star className="size-4 fill-yellow-500 text-yellow-500" />
          <Star className="size-4 fill-yellow-500 text-yellow-500" />
        </div>
      </div>
 
      <div className="flex w-full select-none items-center justify-start gap-5">
        <Image
          width={40}
          height={40}
          src={img || ""}
          alt={name}
          className="size-10 rounded-full ring-1 ring-border ring-offset-4"
        />
 
        <div>
          <p className="font-medium text-neutral-500">{name}</p>
          <p className="text-xs font-normal text-neutral-400">{role}</p>
        </div>
      </div>
    </div>
  );
}
const testimonials = [
  {
    name: "Alex Rivera",
    role: "UI/UX Lead at InnovateTech",
    img: "https://randomuser.me/api/portraits/men/91.jpg",
    description: (
      <p>
        Using EldoraUI has revolutionized our design process.
        <Highlight>
          Its reusable, animated components make it easy to deliver cutting-edge
          designs.
        </Highlight>{" "}
        A must-have for any design team.
      </p>
    ),
  },
  {
    name: "Samantha Lee",
    role: "Frontend Engineer at NextGen Solutions",
    img: "https://randomuser.me/api/portraits/women/12.jpg",
    description: (
      <p>
        EldoraUI&apos;s templates have drastically improved our development
        speed.
        <Highlight>
          We&apos;ve reduced project timelines by 70%, delivering high-quality
          UIs effortlessly.
        </Highlight>{" "}
        Highly recommend it to fellow developers.
      </p>
    ),
  },
  {
    name: "Raj Patel",
    role: "Founder at Startup Studio",
    img: "https://randomuser.me/api/portraits/men/45.jpg",
    description: (
      <p>
        As a startup founder, I need tools that help us grow fast without
        sacrificing quality. EldoraUI&apos;s stunning designs and simple
        integration have made it an essential part of our workflow.
        <Highlight>Our clients love our modern interfaces.</Highlight>
      </p>
    ),
  },
  {
    name: "Emily Chen",
    role: "Product Designer at Global Systems",
    img: "https://randomuser.me/api/portraits/women/83.jpg",
    description: (
      <p>
        EldoraUI&apos;s prebuilt components have made it so easy to create
        intuitive and compliant designs.
        <Highlight>
          It&apos;s perfect for tackling complex workflows with style.
        </Highlight>{" "}
        A must-have for any product designer.
      </p>
    ),
  },
  {
    name: "Michael Brown",
    role: "Creative Director at FinTech Innovations",
    img: "https://randomuser.me/api/portraits/men/1.jpg",
    description: (
      <p>
        EldoraUI&apos;s animations and design elements have elevated our fintech
        app&apos;s user experience.
        <Highlight>
          The feedback on our new design is phenomenal.
        </Highlight>{" "}
        It&apos;s a game-changer for user-centric applications.
      </p>
    ),
  },
  {
    name: "Linda Wu",
    role: "Web Developer at LogiChain Solutions",
    img: "https://randomuser.me/api/portraits/women/5.jpg",
    description: (
      <p>
        EldoraUI&apos;s component library has simplified web development for our
        logistics dashboard.
        <Highlight>
          Building custom layouts has never been this efficient.
        </Highlight>{" "}
      </p>
    ),
  },
  {
    name: "Carlos Gomez",
    role: "Digital Marketing Specialist at EcoTech",
    img: "https://randomuser.me/api/portraits/men/14.jpg",
    description: (
      <p>
        EldoraUI&apos;s responsive designs have helped us create marketing sites
        that look amazing on every device.
        <Highlight>
          It&apos;s revolutionized how we approach branding online.
        </Highlight>{" "}
      </p>
    ),
  },
  {
    name: "Aisha Khan",
    role: "E-commerce Product Manager at FashionForward",
    img: "https://randomuser.me/api/portraits/women/56.jpg",
    description: (
      <p>
        EldoraUI&apos;s beautifully crafted components have completely
        transformed our fashion storefront.
        <Highlight>
          Customers love the dynamic shopping experience.
        </Highlight>{" "}
      </p>
    ),
  },
  {
    name: "Tom Chen",
    role: "Healthcare App Designer at HealthTech Solutions",
    img: "https://randomuser.me/api/portraits/men/18.jpg",
    description: (
      <p>
        EldoraUI has made it easy to create user-friendly, accessible interfaces
        for our healthcare apps.
        <Highlight>
          It&apos;s a crucial part of our design system.
        </Highlight>{" "}
      </p>
    ),
  },
  {
    name: "Sofia Patel",
    role: "EdTech Founder at EduSafe Innovations",
    img: "https://randomuser.me/api/portraits/women/73.jpg",
    description: (
      <p>
        EldoraUI&apos;s education-focused templates have doubled our
        platform&apos;s usability.
        <Highlight>
          It&apos;s tailor-made for addressing student and teacher needs.
        </Highlight>{" "}
      </p>
    ),
  },
];
 
export function Testimonials() {
  return (
    <section id="testimonials" className="container py-10">
      <h2 className="mb-4 text-center text-5xl font-bold leading-[1.2] tracking-tighter text-foreground">
        What People Are Saying
      </h2>
      <h3 className="mx-auto mb-8 max-w-lg text-balance text-center text-lg font-medium tracking-tight text-foreground/80">
        Don&apos;t just take our word for it. Here&apos;s what{" "}
        <span className="bg-gradient bg-clip-text text-transparent">
          real people
        </span>{" "}
        are saying about{" "}
        <span className="from-fg-onAccent text-purple-600">Eldora UI</span>
      </h3>
      <div className="relative mt-6 max-h-screen overflow-hidden">
        <div className="gap-4 md:columns-2 xl:columns-3 2xl:columns-4">
          {Array(Math.ceil(testimonials.length / 3))
            .fill(0)
            .map((_, i) => (
              <Marquee
                vertical
                key={i}
                className={cn({
                  "[--duration:60s]": i === 1,
                  "[--duration:30s]": i === 2,
                  "[--duration:70s]": i === 3,
                })}
              >
                {testimonials.slice(i * 3, (i + 1) * 3).map((card, idx) => (
                  <motion.div
                    key={idx}
                    initial={{ opacity: 0 }}
                    whileInView={{ opacity: 1 }}
                    viewport={{ once: true }}
                    transition={{
                      delay: Math.random() * 0.8,
                      duration: 1.2,
                    }}
                  >
                    <TestimonialCard {...card} />
                  </motion.div>
                ))}
              </Marquee>
            ))}
        </div>
        <div className="pointer-events-none absolute inset-x-0 bottom-0 h-1/4 w-full bg-gradient-to-t from-background from-20%"></div>
        <div className="pointer-events-none absolute inset-x-0 top-0 h-1/4 w-full bg-gradient-to-b from-background from-20%"></div>
      </div>
    </section>
  );
}

Copy and paste the following code into your project.

components/eldoraui/marquee.tsx

import { cn } from "@/lib/utils";
 
interface MarqueeProps {
  className?: string;
  reverse?: boolean;
  pauseOnHover?: boolean;
  children?: React.ReactNode;
  vertical?: boolean;
  repeat?: number;
  [key: string]: any;
}
 
export function Marquee({
  className,
  reverse,
  pauseOnHover = false,
  children,
  vertical = false,
  repeat = 4,
  ...props
}: MarqueeProps) {
  return (
    <div
      {...props}
      className={cn(
        "group flex overflow-hidden p-2 [--duration:40s] [--gap:1rem] [gap:var(--gap)]",
        {
          "flex-row": !vertical,
          "flex-col": vertical,
        },
        className,
      )}
    >
      {Array(repeat)
        .fill(0)
        .map((_, i) => (
          <div
            key={i}
            className={cn("flex shrink-0 justify-around [gap:var(--gap)]", {
              "animate-marquee flex-row": !vertical,
              "animate-marquee-vertical flex-col": vertical,
              "group-hover:[animation-play-state:paused]": pauseOnHover,
              "[animation-direction:reverse]": reverse,
            })}
          >
            {children}
          </div>
        ))}
    </div>
  );
}

Update the import paths to match your project setup.

Update tailwind.config.js

Add the following animations to your tailwind.config.js file:

tailwind.config.js
/** @type {import('tailwindcss').Config} */
module.exports = {
  theme: {
    extend: {
      animation: {
        marquee: "marquee var(--duration) linear infinite",
        "marquee-vertical": "marquee-vertical var(--duration) linear infinite",
      },
      keyframes: {
        marquee: {
          from: { transform: "translateX(0)" },
          to: { transform: "translateX(calc(-100% - var(--gap)))" },
        },
        "marquee-vertical": {
          from: { transform: "translateY(0)" },
          to: { transform: "translateY(calc(-100% - var(--gap)))" },
        },
      },
    },
  },
};

Props

Prop NameTypeDefaultDescription
optsCarouselOptions-Options for the carousel, passed to useEmblaCarousel.
pluginsCarouselPlugin-Plugins for the carousel, passed to useEmblaCarousel.
orientation"horizontal" | "vertical""horizontal"Orientation of the carousel. Determines whether it's horizontal or vertical.
setApi(api: CarouselApi) => void-Function to set the API for controlling the carousel externally.

CarouselContent Props

Prop NameTypeDefaultDescription
classNamestring-Additional CSS classes to style the carousel content.
...propsReact.HTMLAttributes<HTMLDivElement>-Other props passed to the CarouselContent container.

CarouselItem Props

Prop NameTypeDefaultDescription
classNamestring-Additional CSS classes to style each carousel item.
...propsReact.HTMLAttributes<HTMLDivElement>-Other props passed to the CarouselItem.

CarouselPrevious Props

Prop NameTypeDefaultDescription
classNamestring-Additional CSS classes for styling the previous button.
variant"outline" | "solid""outline"The variant of the button, determines styling.
size"icon" | "sm" | "md""icon"The size of the button.
...propsReact.ComponentProps<typeof Button>-Other props passed to the Button component for previous action.

CarouselNext Props

Prop NameTypeDefaultDescription
classNamestring-Additional CSS classes for styling the next button.
variant"outline" | "solid""outline"The variant of the button, determines styling.
size"icon" | "sm" | "md""icon"The size of the button.
...propsReact.ComponentProps<typeof Button>-Other props passed to the Button component for next action.

useCarousel Hook Return Values

Prop NameTypeDescription
carouselRefReact.RefObject<HTMLDivElement>A reference to the carousel container.
apiCarouselApiThe API object used to control the carousel programmatically.
scrollPrev() => voidFunction to scroll to the previous item in the carousel.
scrollNext() => voidFunction to scroll to the next item in the carousel.
canScrollPrevbooleanIndicates if there is a previous item to scroll to.
canScrollNextbooleanIndicates if there is a next item to scroll to.

Highlight Props

Prop NameTypeDefaultDescription
childrenReact.ReactNode-The content to be highlighted inside the <span>.
classNamestring-Additional CSS classes to apply to the Highlight component.

TestimonialCard Props

Prop NameTypeDefaultDescription
namestring-Name of the person providing the testimonial.
rolestring-Role of the person providing the testimonial.
imgstring (optional)-URL of the image to display for the testimonial.
descriptionReact.ReactNode-The testimonial text content.
classNamestring (optional)-Additional CSS classes for styling the TestimonialCard.
[key: string]any-Capture any additional props passed to the TestimonialCard component.