gigafibre-fsm/src/components/sections/Pricing.tsx
louispaulb 88dc3714a1 Initial deploy: gigafibre.ca website with self-hosted address search
React/Vite/shadcn-ui site for Gigafibre ISP.
Address qualification via PostgreSQL (5.2M AQ addresses, pg_trgm fuzzy search).
No Supabase dependency for address search.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 14:37:50 -04:00

84 lines
3.7 KiB
TypeScript

import { CheckCircle, ArrowRight } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
interface PricingTier {
name: string;
price: string;
description: string;
features: string[];
popular?: boolean;
promo?: string;
}
interface PricingProps {
title?: string;
subtitle?: string;
tiers: PricingTier[];
}
const Pricing = ({ title = "Nos forfaits", subtitle = "Simple et transparent", tiers }: PricingProps) => {
return (
<section className="py-16 md:py-24 bg-muted/30">
<div className="container mx-auto px-4">
{(title || subtitle) && (
<div className="text-center max-w-2xl mx-auto mb-12">
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4 font-display">{title}</h2>
<p className="text-muted-foreground">{subtitle}</p>
</div>
)}
<div className="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
{tiers.map((tier, index) => (
<Card
key={index}
className={`relative ${tier.popular ? "border-primary border-2 shadow-xl" : ""}`}
>
{tier.popular && (
<span className="absolute -top-3 left-1/2 -translate-x-1/2 bg-primary text-primary-foreground px-4 py-1 rounded-full text-sm font-medium">
Recommandé
</span>
)}
<CardHeader className="text-center pt-8">
<CardTitle className="text-2xl">{tier.name}</CardTitle>
<CardDescription>{tier.description}</CardDescription>
<div className="mt-4">
<span className="text-4xl font-bold text-primary">{tier.price}</span>
<span className="text-muted-foreground text-sm">/mois</span>
</div>
</CardHeader>
<CardContent>
<ul className="space-y-3 mb-6">
{tier.features.map((feature, i) => (
<li key={i} className="flex items-start gap-3 text-sm text-muted-foreground">
<CheckCircle className="w-5 h-5 text-primary flex-shrink-0" />
<span>{feature}</span>
</li>
))}
</ul>
<Button
className="w-full"
variant={tier.popular ? "default" : "outline"}
asChild
>
<a href="/#contact">Choisir ce forfait <ArrowRight className="w-4 h-4 ml-2" /></a>
</Button>
{tier.promo && (
<p className="text-xs text-primary text-center font-medium mt-4">
{tier.promo}
</p>
)}
</CardContent>
</Card>
))}
</div>
</div>
</section>
);
};
export default Pricing;