gigafibre-fsm/apps/website-vue/src/components/sections/Pricing.vue
louispaulb 3c7f04870c portal: Vue 3 + Tailwind + shadcn-vue rewrite of www.gigafibre.ca (preview at /next)
Pixel-identical port of the React marketing site: Tailwind config, HSL theme
tokens, fonts (Plus Jakarta Sans / Space Grotesk) and custom utilities copied
verbatim; shadcn-vue (reka-ui) components; all 33 routes ported. Served at
www.gigafibre.ca/next (noindex) behind nginx, ahead of replacing the React site.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 21:52:14 -04:00

76 lines
2.6 KiB
Vue

<script setup lang="ts">
import { CheckCircle, ArrowRight } from "lucide-vue-next";
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;
}
withDefaults(defineProps<{
title?: string;
subtitle?: string;
tiers: PricingTier[];
}>(), {
title: "Nos forfaits",
subtitle: "Simple et transparent",
});
</script>
<template>
<section class="py-16 md:py-24 bg-muted/30">
<div class="container mx-auto px-4">
<div v-if="title || subtitle" class="text-center max-w-2xl mx-auto mb-12">
<h2 class="text-3xl md:text-4xl font-bold text-foreground mb-4 font-display">{{ title }}</h2>
<p class="text-muted-foreground">{{ subtitle }}</p>
</div>
<div class="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
<Card
v-for="(tier, index) in tiers"
:key="index"
:class="`relative ${tier.popular ? 'border-primary border-2 shadow-xl' : ''}`"
>
<span v-if="tier.popular" class="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 class="text-center pt-8">
<CardTitle class="text-2xl">{{ tier.name }}</CardTitle>
<CardDescription>{{ tier.description }}</CardDescription>
<div class="mt-4">
<span class="text-4xl font-bold text-primary">{{ tier.price }}</span>
<span class="text-muted-foreground text-sm">/mois</span>
</div>
</CardHeader>
<CardContent>
<ul class="space-y-3 mb-6">
<li v-for="(feature, i) in tier.features" :key="i" class="flex items-start gap-3 text-sm text-muted-foreground">
<CheckCircle class="w-5 h-5 text-primary flex-shrink-0" />
<span>{{ feature }}</span>
</li>
</ul>
<Button
class="w-full"
:variant="tier.popular ? 'default' : 'outline'"
as-child
>
<a href="/#contact">Choisir ce forfait <ArrowRight class="w-4 h-4 ml-2" /></a>
</Button>
<p v-if="tier.promo" class="text-xs text-primary text-center font-medium mt-4">
{{ tier.promo }}
</p>
</CardContent>
</Card>
</div>
</div>
</section>
</template>