150 lines
6.4 KiB
TypeScript
150 lines
6.4 KiB
TypeScript
import { motion } from 'motion/react';
|
|
import { Calendar, Star, Award, HeadphonesIcon } from 'lucide-react';
|
|
|
|
export function WhyChooseUsSection() {
|
|
const features = [
|
|
{
|
|
icon: Calendar,
|
|
title: "Ultimate flexibility",
|
|
description: "You're in control, with free cancellation and payment options to satisfy any plan or budget.",
|
|
gradient: "from-blue-500 to-cyan-500"
|
|
},
|
|
{
|
|
icon: Star,
|
|
title: "Memorable experiences",
|
|
description: "Browse and book tours and activities so incredible, you'll want to tell your friends.",
|
|
gradient: "from-purple-500 to-pink-500"
|
|
},
|
|
{
|
|
icon: Award,
|
|
title: "Quality at our core",
|
|
description: "High-quality standards. Millions of reviews. A tours company that's all about trust.",
|
|
gradient: "from-amber-500 to-orange-500"
|
|
},
|
|
{
|
|
icon: HeadphonesIcon,
|
|
title: "Award-winning support",
|
|
description: "New price? New plan? No problem. We're here to help, 24/7.",
|
|
gradient: "from-green-500 to-emerald-500"
|
|
}
|
|
];
|
|
|
|
return (
|
|
<section className="py-20 bg-white">
|
|
<div className="container mx-auto px-4">
|
|
{/* Heading */}
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 30 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
viewport={{ once: true }}
|
|
className="text-center mb-16"
|
|
>
|
|
<h2 className="font-merchant text-4xl md:text-5xl lg:text-6xl text-gray-900 mb-4">
|
|
<span className="font-light">Why Choose</span>{' '}
|
|
<span className="font-bold bg-gradient-to-r from-primary to-secondary bg-clip-text text-transparent">
|
|
Us?
|
|
</span>
|
|
</h2>
|
|
</motion.div>
|
|
|
|
{/* Features Grid */}
|
|
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8 lg:gap-12">
|
|
{features.map((feature, index) => {
|
|
const IconComponent = feature.icon;
|
|
|
|
return (
|
|
<motion.div
|
|
key={index}
|
|
initial={{ opacity: 0, y: 30 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: index * 0.1 }}
|
|
viewport={{ once: true }}
|
|
className="text-center group"
|
|
>
|
|
{/* Icon Container */}
|
|
<motion.div
|
|
whileHover={{ scale: 1.05, y: -5 }}
|
|
transition={{ duration: 0.3 }}
|
|
className="relative mb-6 mx-auto w-20 h-20 flex items-center justify-center"
|
|
>
|
|
{/* Background Shape */}
|
|
<div className={`absolute inset-0 bg-gradient-to-br ${feature.gradient} rounded-2xl opacity-10 group-hover:opacity-20 transition-opacity duration-300`}></div>
|
|
|
|
{/* Icon */}
|
|
<div className={`relative z-10 w-16 h-16 bg-gradient-to-br ${feature.gradient} rounded-xl flex items-center justify-center shadow-lg group-hover:shadow-xl transition-shadow duration-300`}>
|
|
<IconComponent className="w-8 h-8 text-white" />
|
|
</div>
|
|
|
|
{/* Glow Effect */}
|
|
<div className={`absolute inset-0 bg-gradient-to-br ${feature.gradient} rounded-2xl blur-xl opacity-0 group-hover:opacity-30 transition-opacity duration-300 -z-10`}></div>
|
|
</motion.div>
|
|
|
|
{/* Content */}
|
|
<motion.div
|
|
initial={{ opacity: 0 }}
|
|
whileInView={{ opacity: 1 }}
|
|
transition={{ duration: 0.6, delay: index * 0.1 + 0.2 }}
|
|
viewport={{ once: true }}
|
|
className="space-y-3"
|
|
>
|
|
<h3 className="font-merchant text-xl font-semibold text-gray-900 group-hover:text-gray-700 transition-colors duration-300">
|
|
{feature.title}
|
|
</h3>
|
|
|
|
<p className="text-gray-600 leading-relaxed max-w-xs mx-auto group-hover:text-gray-700 transition-colors duration-300">
|
|
{feature.description}
|
|
</p>
|
|
</motion.div>
|
|
|
|
{/* Hover Effect Indicator */}
|
|
<motion.div
|
|
initial={{ scaleX: 0 }}
|
|
whileInView={{ scaleX: 1 }}
|
|
transition={{ duration: 0.6, delay: index * 0.1 + 0.4 }}
|
|
viewport={{ once: true }}
|
|
className={`w-12 h-1 bg-gradient-to-r ${feature.gradient} mx-auto mt-4 rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-300`}
|
|
></motion.div>
|
|
</motion.div>
|
|
);
|
|
})}
|
|
</div>
|
|
|
|
{/* Bottom CTA */}
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 30 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: 0.6 }}
|
|
viewport={{ once: true }}
|
|
className="text-center mt-16"
|
|
>
|
|
<p className="font-poppins text-lg text-gray-600 mb-6 max-w-2xl mx-auto leading-relaxed font-normal">
|
|
Join millions of travelers who trust CityCards for their urban adventures.
|
|
Start exploring with confidence today.
|
|
</p>
|
|
|
|
<motion.button
|
|
whileHover={{ scale: 1.05, y: -2 }}
|
|
whileTap={{ scale: 0.95 }}
|
|
className="inline-flex items-center gap-3 bg-gradient-to-r from-primary to-secondary text-white px-8 py-4 rounded-full font-medium shadow-lg hover:shadow-xl transition-all duration-300 group"
|
|
>
|
|
<span>Discover CityCards</span>
|
|
<motion.div
|
|
animate={{ x: [0, 5, 0] }}
|
|
transition={{ duration: 1.5, repeat: Infinity, ease: "easeInOut" }}
|
|
className="group-hover:translate-x-1 transition-transform duration-300"
|
|
>
|
|
→
|
|
</motion.div>
|
|
</motion.button>
|
|
</motion.div>
|
|
</div>
|
|
|
|
{/* Background Decorations */}
|
|
<div className="absolute inset-0 overflow-hidden pointer-events-none">
|
|
<div className="absolute top-0 left-0 w-96 h-96 bg-gradient-to-br from-primary/5 to-transparent rounded-full blur-3xl transform -translate-x-1/2 -translate-y-1/2"></div>
|
|
<div className="absolute bottom-0 right-0 w-96 h-96 bg-gradient-to-tl from-secondary/5 to-transparent rounded-full blur-3xl transform translate-x-1/2 translate-y-1/2"></div>
|
|
</div>
|
|
</section>
|
|
);
|
|
} |