aether-rides / PricingPage.tsx
lattmamb's picture
Upload 32 files (#1)
a1a9b91 verified
import { useState } from 'react';
import { Link } from 'react-router-dom';
import { Check } from 'lucide-react';
interface Plan {
id: string;
name: string;
description: string;
pricing: {
monthly: number;
annually: number;
};
features: string[];
isPopular?: boolean;
}
const plans: Plan[] = [
{
id: 'basic',
name: 'Basic',
description: 'For occasional drivers who need a car for a few days per month.',
pricing: {
monthly: 399,
annually: 4199,
},
features: [
'Up to 3 days per month',
'Access to Model 3 and Model Y',
'Basic insurance coverage',
'Charging included',
'Mileage limit: 1,000 miles/month',
'Roadside assistance',
],
},
{
id: 'premium',
name: 'Premium',
description: 'For regular drivers who need more flexibility and premium vehicles.',
pricing: {
monthly: 799,
annually: 8599,
},
features: [
'Up to 9 days per month',
'Access to all Tesla models',
'Full insurance coverage',
'Charging included',
'Mileage limit: 2,500 miles/month',
'Roadside assistance',
'Priority customer support',
'Flexible scheduling',
],
isPopular: true,
},
{
id: 'unlimited',
name: 'Unlimited',
description: 'For those who want unrestricted access to our entire fleet.',
pricing: {
monthly: 1499,
annually: 15999,
},
features: [
'Unlimited access (30 days/month)',
'Access to all Tesla models including Cybertruck',
'Full insurance coverage',
'Unlimited charging',
'Unlimited mileage',
'Roadside assistance',
'Premium customer support',
'Flexible scheduling',
'Vehicle delivery and pickup',
'Exclusive event invitations',
],
},
];
const faqItems = [
{
question: 'How does the subscription work?',
answer: 'Our subscription plans give you access to Tesla vehicles for a fixed monthly or annual fee. Choose your plan based on how often you need a car, select your preferred vehicle, and we'll handle the rest.'
},
{
question: 'Can I switch between different Tesla models?',
answer: 'Yes! Depending on your plan, you can switch between different Tesla models. Premium and Unlimited members have access to our entire fleet and can change vehicles up to twice per month.'
},
{
question: 'What does the insurance cover?',
answer: 'Our basic insurance covers liability and collision with a deductible. Premium and Unlimited plans include comprehensive coverage with a lower deductible, protecting you from almost any incident.'
},
{
question: 'Is charging included in the subscription?',
answer: 'Yes, charging is included in all subscription plans. Basic and Premium plans include charging at Tesla Superchargers and partner network stations, while Unlimited includes home charging equipment installation.'
},
{
question: 'How do I cancel my subscription?',
answer: 'You can cancel your subscription anytime through your account dashboard. Monthly subscriptions can be canceled with a 7-day notice, while annual subscriptions can be canceled with a 30-day notice with prorated refunds.'
}
];
const PricingPage = () => {
const [billingCycle, setBillingCycle] = useState<'monthly' | 'annually'>('monthly');
const [expandedFaqIndex, setExpandedFaqIndex] = useState<number | null>(null);
const toggleFaq = (index: number) => {
setExpandedFaqIndex(expandedFaqIndex === index ? null : index);
};
return (
<div className="bg-[#0a0a0a] text-white min-h-screen">
<div className="container mx-auto px-4 py-16">
{/* Header */}
<div className="max-w-3xl mx-auto text-center mb-12">
<h1 className="text-4xl md:text-5xl font-bold mb-4">Choose Your Membership Plan</h1>
<p className="text-gray-300 text-lg">
Flexible plans designed to fit your lifestyle. Subscribe monthly or annually for the best value.
</p>
</div>
{/* Billing Toggle */}
<div className="flex justify-center mb-12">
<div className="bg-[#161617] inline-flex rounded-lg p-1">
<button
onClick={() => setBillingCycle('monthly')}
className={`px-4 py-2 rounded-md text-sm font-medium transition-all ${
billingCycle === 'monthly'
? 'bg-blue-600 text-white'
: 'text-gray-400 hover:text-white'
}`}
>
Monthly
</button>
<button
onClick={() => setBillingCycle('annually')}
className={`px-4 py-2 rounded-md text-sm font-medium transition-all ${
billingCycle === 'annually'
? 'bg-blue-600 text-white'
: 'text-gray-400 hover:text-white'
}`}
>
Annually
<span className="ml-2 bg-green-600/20 text-green-500 px-1.5 py-0.5 text-xs rounded-sm">
Save 10%
</span>
</button>
</div>
</div>
{/* Pricing Cards */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-8 mb-16">
{plans.map((plan) => (
<div
key={plan.id}
className={`bg-[#161617] rounded-lg overflow-hidden border ${
plan.isPopular ? 'border-blue-600' : 'border-gray-800'
} relative`}
>
{plan.isPopular && (
<div className="absolute top-0 right-0 bg-blue-600 text-xs font-bold uppercase px-3 py-1 rotate-0">
Most Popular
</div>
)}
<div className="p-6">
<h3 className="text-xl font-bold mb-2">{plan.name}</h3>
<p className="text-gray-400 text-sm mb-6">{plan.description}</p>
<div className="mb-6">
<span className="text-4xl font-bold">
${billingCycle === 'monthly' ? plan.pricing.monthly : plan.pricing.annually}
</span>
<span className="text-gray-400 text-sm">
/{billingCycle === 'monthly' ? 'month' : 'year'}
</span>
</div>
<Link
to={`/pricing/${plan.id}`}
className={`block text-center py-3 px-4 rounded-md font-medium transition-colors ${
plan.isPopular
? 'bg-blue-600 hover:bg-blue-700 text-white'
: 'bg-gray-800 hover:bg-gray-700 text-white'
}`}
>
Choose Plan
</Link>
</div>
<div className="border-t border-gray-800 p-6">
<h4 className="font-medium mb-4">What's included:</h4>
<ul className="space-y-3">
{plan.features.map((feature, index) => (
<li key={index} className="flex items-start gap-2">
<div className="flex-shrink-0 w-5 h-5 rounded-full bg-green-600/20 flex items-center justify-center mt-0.5">
<Check className="text-green-500 w-3 h-3" />
</div>
<span className="text-sm text-gray-300">{feature}</span>
</li>
))}
</ul>
</div>
</div>
))}
</div>
{/* FAQ Section */}
<div className="max-w-3xl mx-auto">
<h2 className="text-2xl font-bold mb-8 text-center">Frequently Asked Questions</h2>
<div className="divide-y divide-gray-800">
{faqItems.map((faq, index) => (
<div key={index} className="py-5">
<button
onClick={() => toggleFaq(index)}
className="flex justify-between items-center w-full text-left font-medium"
>
<span>{faq.question}</span>
<span className="ml-6 flex-shrink-0">
{expandedFaqIndex === index ? (
<svg className="h-5 w-5 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 15l7-7 7 7" />
</svg>
) : (
<svg className="h-5 w-5 text-gray-400" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
)}
</span>
</button>
{expandedFaqIndex === index && (
<div className="mt-2 text-gray-400 text-sm">
<p>{faq.answer}</p>
</div>
)}
</div>
))}
</div>
</div>
</div>
</div>
);
};
export default PricingPage;