the-tip-top-frontend/app/rules/page.tsx
soufiane 0ade13d50d feat: apply golden/beige theme across all pages and fix header layout
Design Updates:
- Apply consistent golden/beige color scheme to all pages
- Update client dashboard, contact, FAQ, history, game, lots, profile, rules, terms, and privacy pages
- Replace green/orange colors with golden palette (#d4a574, #c4956a)
- Add golden gradient backgrounds and borders throughout

Header Improvements:
- Fix button layout to maintain proper form when page is zoomed
- Remove hover:scale-105 effects that caused deformation
- Add whitespace-nowrap to prevent text wrapping
- Add flex-shrink-0 to prevent element shrinking
- Add gap-4 to main header container for proper spacing
- Fix user info card with text ellipsis for long names/emails
- Improve spacing between "Participer" button and user card

Profile Page Updates:
- Remove "Dernière modification" field
- Update all colors to golden theme

API Endpoints:
- Fix user profile endpoint from /user/profile to /users/profile

Statistics Icons:
- Update dashboard statistics icons with distinct colors
- Total Participations: blue
- Gains réclamés: green
- En attente: yellow
- Rejetés: red

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 23:44:49 +01:00

374 lines
21 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

'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 + 30 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 + 30 jours</div>
<p className="text-sm text-[#8a8a7a]">
Période de jeu + délai de réclamation
</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 jeu est ouvert à toute personne physique majeure résidant en France métropolitaine.</p>
<p className="font-semibold">Sont exclus de la participation :</p>
<ul className="list-disc list-inside space-y-2 ml-4">
<li>Les membres du personnel de Thé Tip Top et de ses prestataires</li>
<li>Les membres de leur famille (conjoint, ascendants, descendants)</li>
<li>Toute personne ayant participé à l'élaboration du jeu</li>
</ul>
<p>La participation au jeu implique l'acceptation pleine et entière du présent règlement.</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 le site www.thetiptop.fr</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. Calendrier et délais</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">📍 Période de participation</p>
<p>Du 1er janvier 2025 à 00h00 au 31 janvier 2025 à 23h59 (heure de Paris)</p>
</div>
<div>
<p className="font-semibold mb-2">📍 Délai de réclamation des lots</p>
<p>30 jours après la date de participation pour réclamer votre lot</p>
</div>
<div>
<p className="font-semibold mb-2">📍 Tirage final</p>
<p>Le tirage au sort pour le grand prix (1 an de thé - 360€) aura lieu le 15 février 2025 sous contrôle d'huissier de justice</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]"> À retenir</p>
<p className="text-[#5a5a4e]">Seules les participations enregistrées pendant la période officielle seront prises en compte.</p>
</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>Date : 15 février 2025</li>
<li>Lieu : Siège social de Thé Tip Top, Paris</li>
<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 pendant 12 mois consécutifs une livraison mensuelle de thé d'une valeur de 30€, soit un total 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>30 jours</strong> à compter de la date de participation.</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 mensuelle à 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 Avenue des Thés</p>
<p className="text-sm">75001 Paris, France</p>
<p className="text-sm text-[#8a8a7a]">SIRET: 12345678901234</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 Dupont</p>
<p className="text-sm">Office Notarial de Paris</p>
<p className="text-sm">456 Rue de la Justice</p>
<p className="text-sm">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 Dupont, huissier de justice à Paris.
</p>
</div>
</div>
</div>
</section>
</div>
);
}