Files
Claude e1bade3656 refactor: rewrite all homepage text content for clearer artisan messaging
- Hero: new H1 "Votre savoir-faire mérite d'être vu", updated subtitle and CTA to "Diagnostic Gratuit"
- Navbar: rename menu items to "Notre Méthode" and "Exemples"
- Problematique: rewrite pain points (temps perdu, invisibilité, complexité) + engagement block
- System: replace tech features with 3-step method (Trouve, Choisit, Contacte)
- DemosLive: simplify demo cards with concise descriptions per trade model
- AboutMe: replace stats with bullet points (interlocuteur unique, 100% géré, pas de surprise)
- FAQ: reduce to 3 focused questions (informatique, Facebook, coût)
- Contact: update CTA title to "sécuriser votre carnet de commandes"
- Footer: update tagline, remove plan du site link, trim intervention zone

https://claude.ai/code/session_01V8YAjpqRQ3bfBYsABYsEgo
2026-02-18 06:23:30 +00:00

98 lines
3.9 KiB
TypeScript

"use client";
import { useState } from "react";
import ScrollReveal from "@/components/animations/ScrollReveal";
const faqs = [
{
q: "Je n\u2019y connais rien en informatique, est-ce un probl\u00e8me\u00a0?",
a: "Absolument pas. C\u2019est mon travail. Vous continuez \u00e0 g\u00e9rer vos chantiers, je m\u2019occupe de tout ce qui est technique (s\u00e9curit\u00e9, mise en ligne, affichage sur mobile).",
},
{
q: "J\u2019ai d\u00e9j\u00e0 une page Facebook, \u00e7a suffit non\u00a0?",
a: "Facebook est utile, mais ce n\u2019est pas \u00e0 vous. Un site internet est votre propri\u00e9t\u00e9 et inspire beaucoup plus confiance pour signer des devis importants. C\u2019est la diff\u00e9rence entre un bricoleur et une entreprise \u00e9tablie.",
},
{
q: "Combien \u00e7a co\u00fbte\u00a0?",
a: "Chaque artisan a des besoins diff\u00e9rents. Je propose des forfaits clairs et adapt\u00e9s aux TPE. Pas de frais cach\u00e9s. Nous en parlerons de vive voix lors de l\u2019audit.",
},
];
export default function FAQ() {
const [openIndex, setOpenIndex] = useState<number | null>(null);
const faqJsonLd = {
"@context": "https://schema.org",
"@type": "FAQPage",
mainEntity: faqs.map((f) => ({
"@type": "Question",
name: f.q,
acceptedAnswer: { "@type": "Answer", text: f.a },
})),
};
return (
<section id="faq" className="py-16 md:py-24 bg-bg" aria-label="Questions fréquentes">
{/* JSON-LD for Google */}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(faqJsonLd) }}
/>
<div className="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
{/* Header */}
<ScrollReveal direction="up">
<div className="text-center mb-12">
<span className="inline-block px-3 py-1.5 bg-navy/5 border border-navy/10 rounded-full text-navy text-xs font-semibold mb-4">
FAQ
</span>
<h3 className="text-2xl md:text-3xl lg:text-4xl font-bold text-navy tracking-[-0.02em] mb-3">
Questions Franches
</h3>
</div>
</ScrollReveal>
{/* Accordion */}
<div className="space-y-3">
{faqs.map((faq, i) => (
<ScrollReveal key={i} direction="up" delay={i * 100}>
<div className="bg-bg-white border border-border rounded-xl overflow-hidden hover:border-orange/20 transition-colors duration-300">
<button
className="w-full flex items-center justify-between p-5 text-left cursor-pointer hover:bg-bg-muted/50 transition-colors"
onClick={() => setOpenIndex(openIndex === i ? null : i)}
aria-expanded={openIndex === i}
>
<span className="text-navy font-semibold text-sm sm:text-base pr-4">
{faq.q}
</span>
<svg
className={`w-5 h-5 text-text-muted shrink-0 transition-transform duration-300 ${
openIndex === i ? "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>
<div
className={`overflow-hidden transition-all duration-300 ${
openIndex === i ? "max-h-96 opacity-100" : "max-h-0 opacity-0"
}`}
>
<div className="px-5 pb-5">
<p className="text-text-light text-sm leading-relaxed">
{faq.a}
</p>
</div>
</div>
</div>
</ScrollReveal>
))}
</div>
</div>
</section>
);
}