Spaces:
Running
Running
File size: 12,160 Bytes
5c05829 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 | import React, { useState, useEffect } from 'react';
import { motion, AnimatePresence } from 'framer-motion';
import { Card, CardContent } from '@/components/ui/card';
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar';
import { ChevronLeft, ChevronRight, Star, Award, ShoppingBag, Users, ThumbsUp, Check, Calendar } from 'lucide-react';
import { Button } from '@/components/ui/button';
import { Link } from 'react-router-dom';
const testimonials = [
{
name: "Deepa Patel",
title: "Professional Chef, Mumbai",
image: "https://images.pexels.com/photos/3764014/pexels-photo-3764014.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "After switching to Taste Rider's Premium Garam Masala, customer satisfaction at my restaurant increased by 27%. The depth of flavor is unmatched in the market - I've tried 8 different brands and nothing compares.",
rating: 5,
product: "Premium Garam Masala",
verified: true,
purchaseCount: 12,
date: "2 months ago"
},
{
name: "Vikram Singh",
title: "Culinary Instructor, Delhi",
image: "https://images.pexels.com/photos/775032/pexels-photo-775032.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "I recommend Taste Rider's Organic Kashmiri Saffron to all 200+ students in my cooking classes. The vibrant color and authentic aroma elevate every dish. My students report 90% better results compared to supermarket alternatives.",
rating: 5,
product: "Organic Kashmiri Saffron",
verified: true,
purchaseCount: 24,
date: "1 month ago"
},
{
name: "Sunita Rao",
title: "Award-Winning Home Chef, Bangalore",
image: "https://images.pexels.com/photos/5947033/pexels-photo-5947033.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "I've been cooking for 35+ years, and Taste Rider's Sambar Masala is the closest I've found to my mother's recipe. The freshness is evident - my family can taste the difference immediately. I'm now a loyal monthly subscriber.",
rating: 5,
product: "Authentic Sambar Masala",
verified: true,
purchaseCount: 18,
date: "2 weeks ago"
},
{
name: "Rajiv Mehta",
title: "Food Blogger & Influencer, Chennai",
image: "https://images.pexels.com/photos/2379005/pexels-photo-2379005.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1",
quote: "My followers constantly ask about the secret to my vibrant curries. The answer is simple: Taste Rider's spices. The freshness and purity make an incredible difference that even my viewers can see through their screens!",
rating: 5,
product: "Signature Curry Blend",
verified: true,
purchaseCount: 30,
date: "3 days ago"
},
];
// Testimonial stats for social proof
const testimonialStats = {
totalReviews: 10842,
averageRating: 4.8,
fiveStarPercentage: 92,
repeatCustomers: 78
};
const TestimonialsSection = () => {
const [currentIndex, setCurrentIndex] = useState(0);
const [autoplay, setAutoplay] = useState(true);
const handlePrev = () => {
setCurrentIndex((prevIndex) => (prevIndex - 1 + testimonials.length) % testimonials.length);
setAutoplay(false); // Pause autoplay when user interacts
};
const handleNext = () => {
setCurrentIndex((prevIndex) => (prevIndex + 1) % testimonials.length);
setAutoplay(false); // Pause autoplay when user interacts
};
useEffect(() => {
let timer;
if (autoplay) {
timer = setTimeout(handleNext, 7000);
}
return () => clearTimeout(timer);
}, [currentIndex, autoplay]);
return (
<section className="py-12 md:py-20 bg-gradient-to-b from-amber-50 to-amber-100/70">
<div className="container mx-auto px-4">
<motion.div
initial={{ opacity: 0, y: -20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
className="text-center mb-12 md:mb-16"
>
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold text-amber-800 mb-3 text-shadow-md">
Trusted by 2000 Culinary Enthusiasts
</h2>
<p className="text-lg text-stone-700 max-w-2xl mx-auto">
See why professional chefs and home cooks alike choose our premium spices for their most important dishes
</p>
{/* Review Stats Bar */}
<div className="mt-8 bg-white/80 backdrop-blur-sm rounded-xl shadow-md p-4 max-w-4xl mx-auto">
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.totalReviews.toLocaleString()}+</div>
<div className="text-sm text-stone-600">Verified Reviews</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700 flex items-center justify-center">
{testimonialStats.averageRating}
<Star className="h-5 w-5 ml-1 text-yellow-500 fill-yellow-500" />
</div>
<div className="text-sm text-stone-600">Average Rating</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.fiveStarPercentage}%</div>
<div className="text-sm text-stone-600">5-Star Reviews</div>
</div>
<div className="text-center">
<div className="text-2xl md:text-3xl font-bold text-amber-700">{testimonialStats.repeatCustomers}%</div>
<div className="text-sm text-stone-600">Repeat Customers</div>
</div>
</div>
</div>
</motion.div>
<div className="relative max-w-2xl lg:max-w-3xl mx-auto">
<AnimatePresence mode="wait">
<motion.div
key={currentIndex}
initial={{ opacity: 0, x: 50 }}
animate={{ opacity: 1, x: 0 }}
exit={{ opacity: 0, x: -50 }}
transition={{ duration: 0.5, ease: "easeInOut" }}
className="w-full"
>
<Card className="bg-white/90 backdrop-blur-md shadow-xl border-amber-300/50 p-6 md:p-8 lg:p-10 rounded-xl">
<CardContent className="text-center">
<div className="flex justify-center items-center gap-2 mb-2">
<span className="bg-green-100 text-green-800 text-xs font-medium px-2.5 py-0.5 rounded-full flex items-center">
<Award className="h-3 w-3 mr-1" /> Verified Purchase
</span>
<span className="bg-blue-100 text-blue-800 text-xs font-medium px-2.5 py-0.5 rounded-full flex items-center">
<Calendar className="h-3 w-3 mr-1" /> {testimonials[currentIndex].date}
</span>
</div>
<Avatar className="h-20 w-20 md:h-24 md:w-24 mx-auto mb-4 md:mb-6 border-4 border-amber-400 shadow-md">
<AvatarImage src={testimonials[currentIndex].image} alt={testimonials[currentIndex].name} />
<AvatarFallback className="text-amber-700 bg-amber-200 text-2xl md:text-3xl">
{testimonials[currentIndex].name.split(" ").map(n => n[0]).join("")}
</AvatarFallback>
</Avatar>
<p className="text-lg md:text-xl lg:text-2xl text-stone-700 italic mb-4 md:mb-6 leading-relaxed" style={{ fontFamily: "'Lato', sans-serif"}}>
"{testimonials[currentIndex].quote}"
</p>
<div className="flex justify-center mb-3 md:mb-4">
{[...Array(testimonials[currentIndex].rating)].map((_, i) => (
<Star key={i} className="h-5 w-5 md:h-6 md:w-6 text-yellow-500 fill-yellow-500" />
))}
{[...Array(5 - testimonials[currentIndex].rating)].map((_, i) => (
<Star key={i} className="h-5 w-5 md:h-6 md:w-6 text-yellow-300" />
))}
</div>
<h4 className="text-xl md:text-2xl font-semibold text-amber-700">{testimonials[currentIndex].name}</h4>
<p className="text-sm md:text-base text-stone-500 mb-3">{testimonials[currentIndex].title}</p>
<div className="flex items-center justify-center text-sm text-amber-600 mb-4">
<ShoppingBag className="h-4 w-4 mr-1" />
<span>Purchased {testimonials[currentIndex].product} {testimonials[currentIndex].purchaseCount}+ times</span>
</div>
{/* Product Link */}
<Link
to="/product-categories"
className="inline-block bg-amber-600 hover:bg-amber-700 text-white text-sm font-medium px-4 py-2 rounded-full transition-colors duration-300"
>
Shop {testimonials[currentIndex].product} Now
</Link>
</CardContent>
</Card>
</motion.div>
</AnimatePresence>
<Button
variant="ghost"
size="icon"
onClick={handlePrev}
className="absolute left-0 sm:-left-10 top-1/2 -translate-y-1/2 z-10 text-amber-600 hover:bg-amber-200/70 p-2 md:p-3"
>
<ChevronLeft className="h-6 w-6 md:h-8 md:w-8" />
</Button>
<Button
variant="ghost"
size="icon"
onClick={handleNext}
className="absolute right-0 sm:-right-10 top-1/2 -translate-y-1/2 z-10 text-amber-600 hover:bg-amber-200/70 p-2 md:p-3"
>
<ChevronRight className="h-6 w-6 md:h-8 md:w-8" />
</Button>
</div>
<div className="flex justify-center mt-8 space-x-2">
{testimonials.map((_, index) => (
<button
key={index}
onClick={() => {
setCurrentIndex(index);
setAutoplay(false);
}}
className={`h-2.5 w-2.5 md:h-3 md:w-3 rounded-full transition-all duration-300 ${
currentIndex === index ? 'bg-amber-500 scale-125' : 'bg-amber-300 hover:bg-amber-400'
}`}
aria-label={`Go to testimonial ${index + 1}`}
/>
))}
</div>
{/* Social Proof and CTA */}
<div className="mt-16 text-center">
<div className="flex items-center justify-center mb-6">
<Users className="h-5 w-5 text-amber-600 mr-2" />
<p className="text-amber-700 font-medium">Join thousands of satisfied customers who've transformed their cooking</p>
</div>
<Link to="/product-categories">
<Button className="bg-amber-600 hover:bg-amber-700 text-white px-8 py-3 rounded-full text-lg font-semibold shadow-lg hover:shadow-xl transition-all duration-300 transform hover:-translate-y-1">
<ThumbsUp className="mr-2 h-5 w-5" />
Discover Our Top-Rated Products
</Button>
</Link>
<div className="mt-6 flex flex-wrap justify-center gap-3">
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> Premium Quality
</span>
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> Authentic Flavors
</span>
<span className="bg-amber-100 text-amber-800 text-xs font-medium px-3 py-1 rounded-full flex items-center">
<Check className="h-3 w-3 mr-1" /> 30-Day Guarantee
</span>
{/* Removed free shipping badge */}
</div>
</div>
</div>
</section>
);
};
export default TestimonialsSection; |