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
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
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
CTO at Innovation Labs
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.
Radix flavor
npx shadcn add "https://ui.beste.co/r/testimonial1"Base UI flavor
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.
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.
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:
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}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Optional badge above the heading |
heading | string | – | Section heading |
description | string | – | Section intro text |
testimonials | TestimonialItem[] | – | Slides, in order (required prop) |
autoplay | boolean | true | Enables the Embla autoplay plugin |
autoplayDelay | number | 5000 | Milliseconds between autoplay advances |
className | string | – | Extra classes for the outer <section> |
type TestimonialItem = {
id: string;
text: string;
name: string;
role: string;
avatar?: { src: string; alt: string };
};null entirely when testimonials is empty or undefined, unlike most blocks in this batch which always render.stopOnInteraction: true, so any manual drag or dot click permanently stops autoplay for that page view; it does not resume.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.<Button variant="ghost"> elements wrapping a small circle, not bare <button> tags, so they pick up standard button focus and hover styling.testimonial25
Horizontally scrollable testimonial cards with full-bleed portraits, overlaid quote and author.
testimonial29
Sticky featured testimonial and rating beside a scrollable list of quote cards.
testimonial34
Two rows of monochrome quote cards scrolling in opposite directions with edge fades.