98 lines
3.5 KiB
TypeScript
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 told my board we'd be powering the main stage with poop. They laughed. Then they saw the energy bill savings. Nobody's laughing now — well, actually we all are.",
|
|
name: "Sarah Chen",
|
|
role: "Director, SunBurst Music Festival",
|
|
},
|
|
{
|
|
quote:
|
|
"Our attendees kept asking where the generators were. When we told them the electricity was coming from the toilets, it became the most-shared fact on social media all weekend.",
|
|
name: "Marcus Johnson",
|
|
role: "Operations Lead, GreenFields Festival",
|
|
},
|
|
{
|
|
quote:
|
|
"PortaPower's units are the cleanest festival bathrooms I've ever seen. The fact that they also power our food court is just... *chef's kiss*. Literally.",
|
|
name: "Priya Patel",
|
|
role: "Founder, EchoVibe Music Fest",
|
|
},
|
|
{
|
|
quote:
|
|
"We went from 14 diesel generators to 3 after bringing PortaPower on. The noise reduction alone was worth it. The sustainability angle made our sponsors ecstatic.",
|
|
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't just take our word for it (but seriously, it's
|
|
poop-powered electricity — how cool is that?)
|
|
</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">
|
|
“{testimonial.quote}”
|
|
</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>
|
|
);
|
|
}
|