- Add reset-password page to handle password reset flow - Fix forgot-password to call real API - Update contest dates (validation: Dec 1-31, recovery: Dec 1 - Jan 31) - Update draw date to Feb 1, 2026 - Improve GamePeriod and GrandPrize components design - Remove "livré chez vous" text 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
360 lines
20 KiB
TypeScript
360 lines
20 KiB
TypeScript
'use client';
|
||
|
||
import type { Metadata } from "next";
|
||
import { useState } from "react";
|
||
|
||
export default function RulesPage() {
|
||
const [openSection, setOpenSection] = useState<number | null>(null);
|
||
|
||
const toggleSection = (index: number) => {
|
||
setOpenSection(openSection === index ? null : index);
|
||
};
|
||
|
||
return (
|
||
<div className="min-h-screen bg-gradient-to-br from-[#f5f5f0] via-[#faf9f5] to-[#f5f5f0]">
|
||
{/* Hero Section */}
|
||
<section className="bg-gradient-to-r from-white to-[#faf9f5] py-12 border-b-2 border-[#e5e4dc]">
|
||
<div className="container mx-auto px-4">
|
||
<div className="max-w-4xl mx-auto text-center">
|
||
<h1 className="text-4xl md:text-5xl font-bold text-[#5a5a4e] mb-4">
|
||
Règlement du jeu-concours
|
||
</h1>
|
||
<p className="text-lg text-[#8a8a7a]">
|
||
Toutes les conditions de participation à notre grand jeu-concours "Thé Tip Top"
|
||
pour l'ouverture de notre 10e boutique.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{/* Résumé Section */}
|
||
<section className="py-8">
|
||
<div className="container mx-auto px-4">
|
||
<div className="max-w-4xl mx-auto">
|
||
<div className="bg-white rounded-xl shadow-md p-6 mb-8 border border-[#e5e4dc]">
|
||
<div className="flex items-center gap-2 mb-6">
|
||
<span className="text-2xl">📋</span>
|
||
<h2 className="text-2xl font-bold text-[#5a5a4e]">Résumé du jeu-concours</h2>
|
||
</div>
|
||
|
||
<div className="grid md:grid-cols-3 gap-4">
|
||
{/* 100% gagnants */}
|
||
<div className="bg-gradient-to-br from-[#d4a574]/10 to-[#c4956a]/10 rounded-lg p-6 text-center border border-[#d4a574]/20 hover:shadow-lg transition-shadow">
|
||
<div className="w-16 h-16 mx-auto mb-4 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-3xl shadow-lg">🎯</div>
|
||
<div className="text-2xl font-bold text-[#5a5a4e] mb-2">100% gagnants</div>
|
||
<p className="text-sm text-[#8a8a7a]">
|
||
Chaque participant repart avec un lot garanti
|
||
</p>
|
||
</div>
|
||
|
||
{/* 30 + 60 jours */}
|
||
<div className="bg-gradient-to-br from-[#d4a574]/10 to-[#c4956a]/10 rounded-lg p-6 text-center border border-[#d4a574]/20 hover:shadow-lg transition-shadow">
|
||
<div className="w-16 h-16 mx-auto mb-4 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-3xl shadow-lg">🔄</div>
|
||
<div className="text-2xl font-bold text-[#5a5a4e] mb-2">30 + 60 jours</div>
|
||
<p className="text-sm text-[#8a8a7a]">
|
||
Validation tickets (30j) + récupération lots (60j)
|
||
</p>
|
||
</div>
|
||
|
||
{/* Grand prix 360€ */}
|
||
<div className="bg-gradient-to-br from-[#d4a574]/10 to-[#c4956a]/10 rounded-lg p-6 text-center border border-[#d4a574]/20 hover:shadow-lg transition-shadow">
|
||
<div className="w-16 h-16 mx-auto mb-4 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-3xl shadow-lg">🏆</div>
|
||
<div className="text-2xl font-bold text-[#5a5a4e] mb-2">Grand prix 360€</div>
|
||
<p className="text-sm text-[#8a8a7a]">
|
||
Tirage final sous contrôle d'huissier
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{/* Accordion Sections */}
|
||
<section className="py-8 pb-16">
|
||
<div className="container mx-auto px-4">
|
||
<div className="max-w-4xl mx-auto space-y-4">
|
||
|
||
{/* Section 1 - Conditions de participation */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(1)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">📋</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">1. Conditions de participation</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 1 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 1 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<p>Le concours est ouvert à toute personne majeure résidant en France métropolitaine ayant effectué un achat d'un montant minimum de 49€ TTC. Pour participer, le participant doit entrer un code unique obtenu lors d'un achat ou d'une opération marketing. </p>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
{/* Section 2 - Codes de participation */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(2)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">🎫</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">2. Codes de participation</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 2 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 2 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<p>Pour participer au jeu, le participant doit :</p>
|
||
<ol className="list-decimal list-inside space-y-2 ml-4">
|
||
<li>Effectuer un achat de minimum 49€ dans une boutique Thé Tip Top participante</li>
|
||
<li>Récupérer son ticket de caisse comportant un code unique à 10 caractères</li>
|
||
<li>Se rendre sur notre site </li>
|
||
<li>Créer un compte ou se connecter à son compte existant</li>
|
||
<li>Saisir le code figurant sur son ticket dans l'espace dédié</li>
|
||
<li>Découvrir instantanément son gain</li>
|
||
</ol>
|
||
<div className="bg-gradient-to-r from-[#d4a574]/10 to-[#c4956a]/10 border-l-4 border-[#d4a574] p-4 mt-4 rounded">
|
||
<p className="font-semibold text-[#5a5a4e]">⚠️ Important</p>
|
||
<p className="text-[#5a5a4e]">Chaque code ne peut être utilisé qu'une seule fois. Toute tentative de fraude entraînera l'exclusion du participant.</p>
|
||
</div>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
{/* Section 3 - Calendrier et délais */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(3)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">🎁</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">3. Lots à gagner</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 3 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 3 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<div>
|
||
<p className="font-semibold mb-2">Voici ce que tu peux gagner :</p>
|
||
</div>
|
||
<div>
|
||
<ul className="list list-inside space-y-2 ml-4">
|
||
<li>Infuseur à thé (60% des tickets)</li>
|
||
<li>Boîte de 100g de thé détox ou infusion (20% des tickets)</li>
|
||
<li>Boîte de 100g de thé signature (10% des tickets)</li>
|
||
<li>Coffret découverte (valeur 39€ - 6% des tickets)</li>
|
||
<li>Coffret découverte (valeur 69€ - 4% des tickets)</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
{/* Section 4 - Tirage final Grand Prix */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(4)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">🏆</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">4. Tirage final - Grand Prix</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 4 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 4 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<p className="font-semibold text-xl">Grand Prix : 1 an de thé offert (valeur 360€)</p>
|
||
<p>À l'issue de la période de participation, un tirage au sort sera organisé pour désigner le grand gagnant du prix principal.</p>
|
||
<div>
|
||
<p className="font-semibold mb-2">Conditions du tirage :</p>
|
||
<ul className="list-disc list-inside space-y-2 ml-4">
|
||
<li>Sous contrôle d'huissier de justice : Maître Dupont, Office Notarial de Paris</li>
|
||
<li>Tous les participants ayant validé au moins un code sont automatiquement inscrits</li>
|
||
</ul>
|
||
</div>
|
||
<div>
|
||
<p className="font-semibold mb-2">Le lot :</p>
|
||
<p>Le gagnant recevra Un an de thé d'une valeur de 360€ !</p>
|
||
|
||
</div>
|
||
<div className="bg-gradient-to-r from-[#d4a574]/10 to-[#c4956a]/10 border-l-4 border-[#d4a574] p-4 mt-4 rounded">
|
||
<p className="font-semibold text-[#5a5a4e]">🎁 Information</p>
|
||
<p className="text-[#5a5a4e]">Le gagnant sera contacté par email et par téléphone dans les 48h suivant le tirage.</p>
|
||
</div>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
{/* Section 5 - Retrait des lots */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(5)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">🎁</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">5. Retrait des lots</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 5 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 5 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<p>Les lots doivent être réclamés dans un délai de <strong>60 jours</strong> (du 1er décembre 2025 au 31 janvier 2026).</p>
|
||
<div>
|
||
<p className="font-semibold mb-2">Modalités de remise :</p>
|
||
<ul className="list-disc list-inside space-y-2 ml-4">
|
||
<li><strong>Infuseur, thé détox/signature :</strong> Retrait en boutique ou envoi postal (frais de port offerts)</li>
|
||
<li><strong>Coffrets découverte et prestige :</strong> Retrait en boutique ou livraison à domicile offerte</li>
|
||
<li><strong>Grand prix (1 an de thé) :</strong> Livraison à l'adresse de votre choix</li>
|
||
</ul>
|
||
</div>
|
||
<div className="bg-red-50 border-l-4 border-red-500 p-4 mt-4 rounded">
|
||
<p className="font-semibold text-red-900">⚠️ Attention</p>
|
||
<p className="text-red-800">Les lots non réclamés dans le délai imparti seront considérés comme abandonnés. Aucun lot ne peut être échangé, remboursé ou converti en espèces.</p>
|
||
</div>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
{/* Section 6 - Protection des données */}
|
||
<div className="bg-white rounded-xl shadow-md overflow-hidden border border-[#e5e4dc]">
|
||
<button
|
||
onClick={() => toggleSection(6)}
|
||
className="w-full flex items-center justify-between p-6 text-left hover:bg-gradient-to-r hover:from-[#d4a574]/5 hover:to-[#c4956a]/5 transition-colors"
|
||
>
|
||
<div className="flex items-center gap-3">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center text-xl shadow-md">🔒</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">6. Protection des données personnelles</h3>
|
||
</div>
|
||
<svg
|
||
className={`w-6 h-6 text-[#8a8a7a] transition-transform ${openSection === 6 ? 'rotate-180' : ''}`}
|
||
fill="none"
|
||
stroke="currentColor"
|
||
viewBox="0 0 24 24"
|
||
>
|
||
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
|
||
</svg>
|
||
</button>
|
||
{openSection === 6 && (
|
||
<div className="px-6 pb-6 space-y-4 text-[#5a5a4e]">
|
||
<p>Les données personnelles collectées dans le cadre du jeu font l'objet d'un traitement informatique destiné à gérer la participation au jeu et l'attribution des lots.</p>
|
||
<div>
|
||
<p className="font-semibold mb-2">Vos droits :</p>
|
||
<ul className="list-disc list-inside space-y-2 ml-4">
|
||
<li>Droit d'accès à vos données personnelles</li>
|
||
<li>Droit de rectification de vos données</li>
|
||
<li>Droit à l'effacement de vos données</li>
|
||
<li>Droit d'opposition au traitement</li>
|
||
<li>Droit à la portabilité des données</li>
|
||
</ul>
|
||
</div>
|
||
<p>Pour exercer vos droits, contactez-nous à : <a href="mailto:contact@thetiptop.fr" className="text-[#d4a574] underline hover:text-[#c4956a]">contact@thetiptop.fr</a></p>
|
||
<p>Pour plus d'informations, consultez notre <a href="/privacy" className="text-[#d4a574] underline hover:text-[#c4956a]">Politique de confidentialité</a>.</p>
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</section>
|
||
|
||
{/* Informations légales Section */}
|
||
<section className="py-16 bg-gradient-to-br from-[#f5f5f0] via-[#faf9f5] to-[#f5f5f0]">
|
||
<div className="container mx-auto px-4">
|
||
<div className="max-w-5xl mx-auto">
|
||
<div className="text-center mb-8">
|
||
<h2 className="text-3xl font-bold text-[#5a5a4e] mb-2">Informations légales</h2>
|
||
<p className="text-[#8a8a7a]">Détails officiels du jeu-concours</p>
|
||
</div>
|
||
|
||
<div className="grid md:grid-cols-2 gap-6 mb-6">
|
||
{/* Organisateur */}
|
||
<div className="bg-white rounded-xl shadow-lg p-6 border-2 border-[#e5e4dc] hover:shadow-xl transition-shadow">
|
||
<div className="flex items-center gap-3 mb-4">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center shadow-md">
|
||
<span className="text-xl">🏢</span>
|
||
</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">Organisateur</h3>
|
||
</div>
|
||
<div className="space-y-2 text-[#5a5a4e]">
|
||
<p className="font-semibold">Thé Tip Top</p>
|
||
<p className="text-sm">18 rue Léon Frot, 75011 Paris</p>
|
||
<p className="text-sm text-[#8a8a7a]">SIRET : 901 234 567 00015</p>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Huissier */}
|
||
<div className="bg-white rounded-xl shadow-lg p-6 border-2 border-[#e5e4dc] hover:shadow-xl transition-shadow">
|
||
<div className="flex items-center gap-3 mb-4">
|
||
<div className="w-12 h-12 bg-gradient-to-br from-[#d4a574] to-[#c4956a] rounded-full flex items-center justify-center shadow-md">
|
||
<span className="text-xl">⚖️</span>
|
||
</div>
|
||
<h3 className="text-xl font-bold text-[#5a5a4e]">Huissier</h3>
|
||
</div>
|
||
<div className="space-y-2 text-[#5a5a4e]">
|
||
<p className="font-semibold">Maître Arnaud Rick</p>
|
||
<p className="text-sm">Office Notarial de Paris</p>
|
||
<p className="text-sm">456 Rue de la Justice, 75002 Paris, France</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
{/* Note légale */}
|
||
<div className="bg-gradient-to-r from-[#d4a574] to-[#c4956a] rounded-xl shadow-lg p-6 text-white text-center">
|
||
<div className="flex items-center justify-center gap-2 mb-3">
|
||
<span className="text-2xl">📜</span>
|
||
<h3 className="text-lg font-semibold">Note légale</h3>
|
||
</div>
|
||
<p className="text-sm text-white/90 leading-relaxed">
|
||
Jeu-concours gratuit sans obligation d'achat, sauf pour l'acquisition du ticket donnant droit à participation.
|
||
Règlement déposé chez Maître Arnaud Rick, huissier de justice à Paris.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</section>
|
||
</div>
|
||
);
|
||
}
|