the-tip-top-frontend/app/faq/FAQContent.tsx
soufiane 54a15d392c fix(faq): remove brown colors and "Centre d'aide" badge
- Remove "Centre d'aide" badge from hero section
- Replace all brown/marron colors (#d4a574) with green (#4a7c6f)
- Update background to light green (#f0f5f3)
- Keep consistent green theme throughout the page

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 14:25:51 +01:00

310 lines
18 KiB
TypeScript

"use client";
import { useState } from "react";
import Link from "next/link";
interface FAQ {
category: string;
question: string;
answer: string;
icon: string;
}
const faqData: FAQ[] = [
{
category: "Participation",
question: "Comment participer au jeu-concours ?",
answer: "Pour participer, vous devez effectuer un achat de minimum 49€ dans une boutique Thé Tip Top participante, récupérer votre ticket de caisse avec le code unique, créer un compte sur notre site www.thetiptop.fr, vous connecter et saisir votre code pour découvrir instantanément votre gain.",
icon: "M15 5v2m0 4v2m0 4v2M5 5a2 2 0 00-2 2v3a2 2 0 110 4v3a2 2 0 002 2h14a2 2 0 002-2v-3a2 2 0 110-4V7a2 2 0 00-2-2H5z",
},
{
category: "Codes",
question: "Où trouver mon code de participation ?",
answer: "Votre code de participation se trouve sur votre ticket de caisse après chaque achat de minimum 49€ en magasin Thé Tip Top. Il est clairement indiqué et composé de 10 caractères alphanumériques.",
icon: "M7 20l4-16m2 16l4-16M6 9h14M4 15h14",
},
{
category: "Codes",
question: "Mon code ne fonctionne pas, que faire ?",
answer: "Vérifiez d'abord que vous avez bien saisi le code sans erreur (attention aux caractères similaires comme 0/O ou 1/I). Assurez-vous que le code n'a pas déjà été utilisé. Si le problème persiste, contactez notre service client via la page Contact avec une photo de votre ticket.",
icon: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z",
},
{
category: "Compte",
question: "Puis-je créer un compte avec mes réseaux sociaux ?",
answer: "Oui, vous pouvez créer un compte et vous connecter rapidement en utilisant votre compte Google ou Facebook. Cela permet une inscription plus rapide et sécurisée.",
icon: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z",
},
{
category: "Délais",
question: "Jusqu'à quand puis-je saisir mon code ?",
answer: "Vous pouvez saisir votre code pendant toute la durée du jeu-concours, soit du 1er janvier 2025 au 31 janvier 2025 à 23h59. Après cette date, les codes ne seront plus acceptés.",
icon: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z",
},
{
category: "Retrait",
question: "Comment récupérer mon lot ?",
answer: "Pour les petits lots (infuseurs, boîtes de thé), vous pouvez les récupérer directement en magasin en présentant votre confirmation de gain. Pour les coffrets, vous avez le choix entre le retrait en boutique ou la livraison à domicile offerte. Pour le grand prix, une livraison mensuelle sera organisée à l'adresse de votre choix.",
icon: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4",
},
{
category: "Retrait",
question: "Dans quelles boutiques puis-je récupérer mon lot ?",
answer: "Vous pouvez récupérer votre lot dans n'importe quelle boutique Thé Tip Top en France métropolitaine. Présentez simplement votre confirmation de gain (email ou capture d'écran) et une pièce d'identité.",
icon: "M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z M15 11a3 3 0 11-6 0 3 3 0 016 0z",
},
{
category: "Tirage final",
question: "Comment fonctionne le tirage final pour le grand prix ?",
answer: "À l'issue de la période de participation, un tirage au sort sera organisé le 15 février 2025 sous contrôle d'huissier de justice (Maître Dupont, Office Notarial de Paris) pour désigner le grand gagnant du prix principal : 1 an de thé offert d'une valeur de 360€. Tous les participants ayant validé au moins un code sont automatiquement inscrits au tirage.",
icon: "M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z",
},
{
category: "Données",
question: "Mes données personnelles sont-elles protégées ?",
answer: "Absolument. Nous prenons la protection de vos données très au sérieux conformément au RGPD. Toutes les informations sont cryptées et stockées de manière sécurisée. Vous disposez d'un droit d'accès, de rectification et d'effacement de vos données. Consultez notre Politique de Confidentialité pour plus de détails.",
icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z",
},
{
category: "Technique",
question: "Le site ne fonctionne pas, que faire ?",
answer: "Essayez de vider le cache de votre navigateur et de rafraîchir la page (Ctrl+F5 ou Cmd+Shift+R). Assurez-vous d'utiliser un navigateur récent (Chrome, Firefox, Safari, Edge). Vérifiez que JavaScript et les cookies sont activés. Si le problème persiste, contactez notre support technique à support@thetiptop.com.",
icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z M15 12a3 3 0 11-6 0 3 3 0 016 0z",
},
];
const categories = [
{ name: "Participation", icon: "M15 5v2m0 4v2m0 4v2M5 5a2 2 0 00-2 2v3a2 2 0 110 4v3a2 2 0 002 2h14a2 2 0 002-2v-3a2 2 0 110-4V7a2 2 0 00-2-2H5z" },
{ name: "Codes", icon: "M7 20l4-16m2 16l4-16M6 9h14M4 15h14" },
{ name: "Compte", icon: "M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z" },
{ name: "Délais", icon: "M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" },
{ name: "Retrait", icon: "M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4" },
{ name: "Tirage final", icon: "M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z" },
{ name: "Données", icon: "M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" },
{ name: "Technique", icon: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" },
];
export default function FAQContent() {
const [searchQuery, setSearchQuery] = useState("");
const [selectedCategory, setSelectedCategory] = useState<string | null>(null);
const [openQuestion, setOpenQuestion] = useState<number | null>(null);
const toggleQuestion = (index: number) => {
setOpenQuestion(openQuestion === index ? null : index);
};
const filteredFAQs = faqData.filter((faq) => {
const matchesSearch =
faq.question.toLowerCase().includes(searchQuery.toLowerCase()) ||
faq.answer.toLowerCase().includes(searchQuery.toLowerCase());
const matchesCategory = !selectedCategory || faq.category === selectedCategory;
return matchesSearch && matchesCategory;
});
const getCategoryIcon = (categoryName: string) => {
const cat = categories.find(c => c.name === categoryName);
return cat?.icon || "";
};
return (
<div className="min-h-screen bg-[#f0f5f3]">
{/* Hero Section */}
<section className="relative bg-gradient-to-br from-[#2d4a3e] to-[#1a2e25] py-16 md:py-24 overflow-hidden">
<div className="absolute inset-0 opacity-10">
<div className="absolute top-10 left-10 w-32 h-32 border border-white/20 rounded-full"></div>
<div className="absolute bottom-10 right-10 w-48 h-48 border border-white/20 rounded-full"></div>
<div className="absolute top-1/2 left-1/4 w-24 h-24 border border-white/20 rounded-full"></div>
</div>
<div className="container mx-auto px-4 relative z-10">
<div className="max-w-3xl mx-auto text-center">
<h1 className="text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-6">
Questions fréquentes
</h1>
<p className="text-lg md:text-xl text-white/70 mb-8">
Trouvez rapidement les réponses à vos questions sur notre jeu-concours Thé Tip Top.
</p>
{/* Search Bar */}
<div className="relative max-w-xl mx-auto">
<label htmlFor="faq-search" className="sr-only">Rechercher une question</label>
<input
id="faq-search"
type="text"
placeholder="Rechercher une question..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
className="w-full px-6 py-4 pl-14 bg-white/10 backdrop-blur-sm border border-white/20 rounded-2xl text-white placeholder-white/50 focus:outline-none focus:ring-2 focus:ring-[#4a7c6f] focus:border-transparent transition-all"
/>
<svg
className="absolute left-5 top-1/2 transform -translate-y-1/2 w-5 h-5 text-white/50"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z"
/>
</svg>
</div>
</div>
</div>
</section>
{/* Category Filters */}
<section className="py-8 bg-white border-b border-gray-100 sticky top-0 z-20 shadow-sm">
<div className="container mx-auto px-4">
<div className="max-w-5xl mx-auto">
<div className="flex flex-wrap justify-center gap-2 md:gap-3">
<button
onClick={() => setSelectedCategory(null)}
className={`px-4 py-2 rounded-xl text-sm font-medium transition-all flex items-center gap-2 ${
selectedCategory === null
? 'bg-[#2d4a3e] text-white shadow-lg'
: 'bg-gray-100 text-gray-600 hover:bg-gray-200'
}`}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M4 6h16M4 10h16M4 14h16M4 18h16" />
</svg>
Tout
</button>
{categories.map((category) => (
<button
key={category.name}
onClick={() => setSelectedCategory(
selectedCategory === category.name ? null : category.name
)}
className={`px-4 py-2 rounded-xl text-sm font-medium transition-all flex items-center gap-2 ${
selectedCategory === category.name
? 'bg-[#2d4a3e] text-white shadow-lg'
: 'bg-gray-100 text-gray-600 hover:bg-gray-200'
}`}
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d={category.icon} />
</svg>
{category.name}
</button>
))}
</div>
</div>
</div>
</section>
{/* FAQ Questions */}
<section className="py-12 md:py-16">
<div className="container mx-auto px-4">
<div className="max-w-3xl mx-auto space-y-4">
{filteredFAQs.length === 0 ? (
<div className="bg-white rounded-2xl shadow-sm p-12 text-center">
<div className="w-16 h-16 bg-[#2d4a3e]/10 rounded-full flex items-center justify-center mx-auto mb-4">
<svg className="w-8 h-8 text-[#2d4a3e]" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9.172 16.172a4 4 0 015.656 0M9 10h.01M15 10h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
</svg>
</div>
<h3 className="text-lg font-semibold text-gray-900 mb-2">Aucun résultat</h3>
<p className="text-gray-500">Aucune question ne correspond à votre recherche.</p>
</div>
) : (
filteredFAQs.map((faq, index) => (
<div
key={index}
className={`bg-white rounded-2xl shadow-sm overflow-hidden transition-all duration-300 ${
openQuestion === index ? 'ring-2 ring-[#2d4a3e] shadow-md' : 'hover:shadow-md'
}`}
>
<button
onClick={() => toggleQuestion(index)}
className="w-full flex items-center gap-4 p-6 text-left transition-colors"
aria-expanded={openQuestion === index}
>
<div className={`w-12 h-12 rounded-xl flex items-center justify-center flex-shrink-0 transition-colors ${
openQuestion === index ? 'bg-[#2d4a3e] text-white' : 'bg-[#2d4a3e]/10 text-[#2d4a3e]'
}`}>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d={getCategoryIcon(faq.category)} />
</svg>
</div>
<div className="flex-1 min-w-0">
<span className="text-xs font-semibold text-[#4a7c6f] uppercase tracking-wide">
{faq.category}
</span>
<h3 className="text-lg font-semibold text-gray-900 mt-1">{faq.question}</h3>
</div>
<div className={`w-10 h-10 rounded-full flex items-center justify-center flex-shrink-0 transition-all ${
openQuestion === index ? 'bg-[#2d4a3e] text-white rotate-180' : 'bg-gray-100 text-gray-400'
}`}>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M19 9l-7 7-7-7" />
</svg>
</div>
</button>
<div className={`overflow-hidden transition-all duration-300 ${
openQuestion === index ? 'max-h-96' : 'max-h-0'
}`}>
<div className="px-6 pb-6 pl-[88px]">
<p className="text-gray-600 leading-relaxed">
{faq.answer}
</p>
</div>
</div>
</div>
))
)}
</div>
</div>
</section>
{/* CTA Section */}
<section className="py-16 md:py-20">
<div className="container mx-auto px-4">
<div className="max-w-4xl mx-auto">
<div className="relative bg-gradient-to-br from-[#2d4a3e] to-[#1a2e25] rounded-3xl p-8 md:p-12 overflow-hidden">
<div className="absolute top-0 right-0 w-64 h-64 bg-[#4a7c6f]/20 rounded-full blur-3xl"></div>
<div className="absolute bottom-0 left-0 w-48 h-48 bg-[#4a7c6f]/20 rounded-full blur-3xl"></div>
<div className="relative z-10 text-center">
<div className="w-16 h-16 bg-white/10 rounded-2xl flex items-center justify-center mx-auto mb-6">
<svg className="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M8 12h.01M12 12h.01M16 12h.01M21 12c0 4.418-4.03 8-9 8a9.863 9.863 0 01-4.255-.949L3 20l1.395-3.72C3.512 15.042 3 13.574 3 12c0-4.418 4.03-8 9-8s9 3.582 9 8z" />
</svg>
</div>
<h2 className="text-2xl md:text-3xl font-bold text-white mb-4">
Vous ne trouvez pas votre réponse ?
</h2>
<p className="text-white/70 mb-8 max-w-xl mx-auto">
Notre équipe est pour vous aider ! Contactez-nous et nous vous répondrons dans les plus brefs délais.
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center">
<a
href="mailto:support@thetiptop.com"
className="inline-flex items-center justify-center gap-3 bg-white text-[#2d4a3e] hover:bg-gray-100 font-semibold px-8 py-4 rounded-xl transition-all shadow-lg hover:shadow-xl"
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
support@thetiptop.com
</a>
<Link
href="/contact"
className="inline-flex items-center justify-center gap-3 bg-white/10 hover:bg-white/20 backdrop-blur-sm text-white font-semibold px-8 py-4 rounded-xl transition-all border border-white/20 hover:border-white/40"
>
<svg className="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z" />
</svg>
Formulaire de contact
</Link>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
);
}