Testimonial 60
Testimonials2 ColumnsText Align CenterBackground ImageCardsMultiple ImagesStar Rating

Code
relume-testimonial60.tsx
import { BackgroundCard } from "@/components/ui/card";
import { StarFull } from "relume-icons";
type ImageProps = {
src: string;
alt?: string;
};
type TestimonialProps = {
image: ImageProps;
description: string;
author: {
name: string;
position: string;
avatar: ImageProps;
};
};
type Props = {
heading: string;
description: string;
testimonials: TestimonialProps[];
};
export type Testimonial60Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const Testimonial60 = (props: Testimonial60Props) => {
const { heading, description, testimonials } = {
...Testimonial60Defaults,
...props,
};
return (
<section className="px-[5%] py-16 md:py-24 lg:py-28">
<div className="container">
<div className="mb-12 md:mb-18 lg:mb-20">
<div className="mx-auto w-full max-w-lg text-center">
<h2 className="mb-5 text-h2 font-bold md:mb-6">{heading}</h2>
<p className="text-medium">{description}</p>
</div>
</div>
<div className="grid grid-cols-1 gap-8 md:grid-cols-2">
{testimonials.map((testimonial, index) => (
<BackgroundCard
key={index}
className="relative flex min-h-[35rem] flex-col justify-end p-6 md:p-8"
>
<div className="absolute inset-0 z-0">
<div className="absolute inset-0 bg-neutral-darkest/40" />
<img
src={testimonial.image.src}
className="size-full object-cover"
alt={testimonial.image.alt}
/>
</div>
<div className="relative z-10">
<p className="text-medium text-white">"{testimonial.description}"</p>
<div className="mt-5 flex flex-col gap-4 md:mt-6 lg:flex-row lg:items-center lg:justify-between">
<div>
<p className="font-semibold text-white">{testimonial.author.name}</p>
<p className="text-white">{testimonial.author.position}</p>
</div>
<div className="flex items-center gap-1">
<StarFull className="size-6 text-white" />
<StarFull className="size-6 text-white" />
<StarFull className="size-6 text-white" />
<StarFull className="size-6 text-white" />
<StarFull className="size-6 text-white" />
</div>
</div>
</div>
</BackgroundCard>
))}
</div>
</div>
</section>
);
};
export const Testimonial60Defaults: Props = {
heading: "Customer testimonials",
description: "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
testimonials: [
{
image: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image",
},
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.",
author: {
name: "Name Surname",
position: "Position, Company name",
avatar: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image",
},
},
},
{
image: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image",
},
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat.",
author: {
name: "Name Surname",
position: "Position, Company name",
avatar: {
src: "https://d22po4pjz3o32e.cloudfront.net/placeholder-image.svg",
alt: "Relume placeholder image",
},
},
},
],
};npm i @hookform/resolvers@^3.10.0 @radix-ui/react-dialog @radix-ui/react-label @radix-ui/react-popover @radix-ui/react-select @radix-ui/react-slot class-variance-authority@0.7.1 clsx@^2.1.1 embla-carousel-react@^8.5.2 luxon@^3.5.0 react-day-picker@9.5.0 react-hook-form@^7.62.0 relume-icons@1.3.0 tailwind-merge@^2.2.2 zod@^3.24.1


