Carousel Testimonials

Testimonials

Loved by teams worldwide

Hear from the people who use our platform every day to build amazing things.

This platform has completely transformed how our team collaborates. The intuitive interface and powerful features have made us more productive than ever.

Sarah Chen

Sarah Chen

Engineering Manager at TechCorp

I've tried many similar tools, but nothing comes close. The attention to detail and customer support are unmatched in the industry.

Marcus Johnson

Marcus Johnson

Product Designer at Startup Inc

We reduced our development time by 40% after switching. It's not just a tool, it's a game changer for our entire workflow.

Emily Rodriguez

Emily Rodriguez

CTO at Innovation Labs

About this block

Carousel TestimonialsFREE

Full-width swipeable testimonial carousel with autoplay and dot navigation. Perfect for highlighting multiple customer quotes on landing pages.

A full-width, single-slide-per-view Embla carousel of customer quotes with optional autoplay and dot navigation: each slide centers a large quote, a circular avatar, the person's name, and their role.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/testimonial1"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/testimonial1"

This installs the block to components/beste/block/testimonial1.tsx, its embla-carousel-react and embla-carousel-autoplay npm dependencies, and the badge and button shadcn/ui primitives it depends on.

Quick start

The installed file exports testimonial1Demo alongside the block: the exact props behind the preview above. Spread it to get a working carousel in one line.

tsx
import { Testimonial1, testimonial1Demo } from "@/components/beste/block/testimonial1";

export default function LandingPage() {
  return <Testimonial1 {...testimonial1Demo} />;
}

Then replace the demo with your own props. Written out, the same setup looks like this:

tsx
import { Testimonial1 } from "@/components/beste/block/testimonial1";

export default function LandingPage() {
  return (
    <Testimonial1
      heading="Loved by teams worldwide"
      description="Hear from the people who use our platform every day."
      testimonials={[
        {
          id: "testimonial-1",
          text: "This platform completely transformed how our team collaborates.",
          name: "Sarah Chen",
          role: "Engineering Manager at TechCorp",
          avatar: {
            src: "https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop",
            alt: "Sarah Chen",
          },
        },
        {
          id: "testimonial-2",
          text: "We reduced our development time by 40% after switching.",
          name: "Emily Rodriguez",
          role: "CTO at Innovation Labs",
        },
      ]}
      autoplay
      autoplayDelay={4000}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional badge above the heading
headingstringSection heading
descriptionstringSection intro text
testimonialsTestimonialItem[]Slides, in order (required prop)
autoplaybooleantrueEnables the Embla autoplay plugin
autoplayDelaynumber5000Milliseconds between autoplay advances
classNamestringExtra classes for the outer <section>
ts
type TestimonialItem = {
  id: string;
  text: string;
  name: string;
  role: string;
  avatar?: { src: string; alt: string };
};

Behavior notes

  • Returns null entirely when testimonials is empty or undefined, unlike most blocks in this batch which always render.
  • Autoplay uses Embla's stopOnInteraction: true, so any manual drag or dot click permanently stops autoplay for that page view; it does not resume.
  • Slides are configured loop: true with align: "center", each occupying the full row width (flex-[0_0_100%]), so dragging past the last slide wraps back to the first.
  • The dot navigation controls are real <Button variant="ghost"> elements wrapping a small circle, not bare <button> tags, so they pick up standard button focus and hover styling.
  • The dot row only renders when there is more than one testimonial; a single-item array shows the quote with no pagination controls.

More Testimonial blocks

View all Testimonial
PRO

testimonial25

Testimonial Carousel

Horizontally scrollable testimonial cards with full-bleed portraits, overlaid quote and author.

PRO

testimonial28

Marquee Quotes

Two opposing auto-scrolling marquee rows of testimonial cards.

PRO

testimonial29

Sticky Quote List

Sticky featured testimonial and rating beside a scrollable list of quote cards.

PRO

testimonial34

Testimonial Marquee

Two rows of monochrome quote cards scrolling in opposite directions with edge fades.

PRO

testimonial50

Three Voices

A rotating testimonial: a portrait on the left and a large serif quote on the right blur out and in together every six seconds, pause on hover, and can be chosen directly from a row of round portrait buttons, with a pill action beneath.

PRO

testimonial32

Scrolling Testimonial Wall

Centered header above three vertically auto-scrolling columns of rated review cards with fade masks, pause-on-hover, and a closing CTA.