Testimonial 62
Testimonials2 ColumnsText Align CenterBackground ImageCardsMultiple ImagesLogos

Code
relume-testimonial62.tsx
import { BackgroundCard } from "@/components/ui/card";
type ImageProps = {
src: string;
alt?: string;
};
type TestimonialProps = {
image: ImageProps;
description: string;
author: {
name: string;
position: string;
};
logo: ImageProps;
};
type Props = {
heading: string;
description: string;
testimonials: TestimonialProps[];
};
export type Testimonial62Props = React.ComponentPropsWithoutRef<"section"> & Partial<Props>;
export const Testimonial62 = (props: Testimonial62Props) => {
const { heading, description, testimonials } = {
...Testimonial62Defaults,
...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>
<img
src={testimonial.logo.src}
alt={testimonial.logo.alt}
className="max-h-12 text-white"
/>
</div>
</div>
</div>
</BackgroundCard>
))}
</div>
</div>
</section>
);
};
export const Testimonial62Defaults: 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",
},
logo: {
src: "https://d22po4pjz3o32e.cloudfront.net/relume-logo-white.svg",
alt: "Relume logo 1",
},
},
{
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",
},
logo: {
src: "https://d22po4pjz3o32e.cloudfront.net/webflow-logo-white.svg",
alt: "Webflow logo 1",
},
},
],
};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


