portapower-website/components/testimonials-section.tsx

98 lines
3.5 KiB
TypeScript

"use client";
import { useInView } from "@/hooks/use-in-view";
import { Card, CardContent } from "@/components/ui/card";
import { Quote } from "lucide-react";
const testimonials = [
{
quote:
"I pitched 'poop-powered main stage' to our board. Dead silence. Then I showed them the energy bill comparison. Now it's the centerpiece of our sustainability report.",
name: "Sarah Chen",
role: "Director, SunBurst Music Festival",
},
{
quote:
"Our attendees kept asking where the diesel generators were. When we told them the toilets were generating the electricity, it became the most-shared story of the entire weekend.",
name: "Marcus Johnson",
role: "Operations Lead, GreenFields Festival",
},
{
quote:
"Cleanest festival bathrooms I've ever experienced in 15 years of event production. The fact that they also powered our food court is a genuinely brilliant bonus.",
name: "Priya Patel",
role: "Founder, EchoVibe Music Fest",
},
{
quote:
"We cut from 14 diesel generators to 3. The noise reduction alone transformed the attendee experience. Our sustainability sponsors couldn't write checks fast enough.",
name: "Jake Morrison",
role: "Festival Manager, ToneFest",
},
];
export function TestimonialsSection() {
const { ref, isInView } = useInView(0.1);
return (
<section className="py-24 px-4" ref={ref}>
<div className="mx-auto max-w-6xl">
<div className="text-center mb-16">
<h2
className={`text-3xl sm:text-4xl md:text-5xl font-bold mb-4 ${
isInView ? "animate-fade-in-up" : "opacity-0"
}`}
>
What Festival Organizers{" "}
<span className="text-neon">Say</span>
</h2>
<p
className={`text-cream-dim text-lg max-w-2xl mx-auto ${
isInView ? "animate-fade-in-up" : "opacity-0"
}`}
style={{ animationDelay: "0.1s" }}
>
Don&apos;t just take our word for it. Here&apos;s what festival
organizers say after making the switch.
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{testimonials.map((testimonial, index) => (
<Card
key={testimonial.name}
className={`card-hover ${
isInView ? "animate-fade-in-up" : "opacity-0"
}`}
style={{ animationDelay: `${0.2 + index * 0.1}s` }}
>
<CardContent className="pt-6">
<Quote className="h-8 w-8 text-neon/40 mb-4" />
<p className="text-cream-dim leading-relaxed mb-6 italic">
&ldquo;{testimonial.quote}&rdquo;
</p>
<div className="flex items-center gap-3">
<div className="h-10 w-10 rounded-full bg-neon/20 flex items-center justify-center text-neon font-bold text-sm">
{testimonial.name
.split(" ")
.map((n) => n[0])
.join("")}
</div>
<div>
<p className="font-bold text-cream text-sm">
{testimonial.name}
</p>
<p className="text-cream-dim text-xs">
{testimonial.role}
</p>
</div>
</div>
</CardContent>
</Card>
))}
</div>
</div>
</section>
);
}