);
}
/* =========================================================================
2. LE CONSTAT — respiration éditoriale, sur le modèle exact d'Origine
(fond --ink, colonne unique centrée, pas de SectionLabel/Ornament).
========================================================================= */
function Constat() {
return (
Le constat
L'avis papier a fait son temps
Un avis dans le journal coûte cher, disparaît en quelques jours, et
ne dit jamais tout : pas de plan, pas de rappel automatique, aucun
moyen de le partager simplement à ceux qui vivent loin. Résultat,
la famille passe des heures au téléphone à répéter les mêmes
informations.
);
}
/* =========================================================================
3. LA SOLUTION — bloc .step (texte en liste à gauche, visuel à droite)
========================================================================= */
function Solution() {
return (
La solution
Une page claire, pensée pour être partagée.
L'Avis de Décès Mémoire Vive rassemble en une seule page tout ce
qu'un proche a besoin de savoir : qui, quand, où — et surtout,
comment s'y rendre et ne pas oublier.
Le plan d'accès en un clic — pour chaque cérémonie (civile, religieuse, dispersion des cendres…)
L'ajout automatique à l'agenda — Google, Apple, Outlook
Et si la famille le souhaite, l'avis se connecte à l'Espace
Hommage : les proches peuvent y déposer un message, une
photo, un souvenir.
La fiche de Juliette Armand · cliquez pour agrandir
);
}
/* =========================================================================
4. POUR LA FAMILLE — liste légère à icônes (sur le modèle des .value
de la Conclusion d'app.jsx), fond --cream
========================================================================= */
function PourLaFamille() {
const items = [
{ title: "Un seul lien", text: "À partager par SMS, WhatsApp ou e-mail — plus besoin d'appeler chaque proche." },
{ title: "Le plan d'accès", text: "Intégré pour chaque lieu de cérémonie." },
{ title: "L'ajout à l'agenda", text: "En un clic, pour que personne n'oublie la date." },
{ title: "Une page qui reste en ligne", text: "Bien après la cérémonie — contrairement au journal qui disparaît en trois jours." },
{ title: "Une passerelle vers l'Espace Hommage", text: "Pour recueillir messages et photos si la famille le souhaite." },
];
return (
Pour la famille
Une charge en moins.
{items.map((it, i) => (
{it.title}
{it.text}
))}
L'agence ne publie un avis qu'avec l'accord de la famille.
);
}
/* =========================================================================
5. POUR VOTRE AGENCE — grille .mini-step à gauche, mockup navigateur
du dashboard Espace Pro à droite, fond --ink-2
========================================================================= */
function PourVotreAgence() {
const items = [
{ title: "Une seule communication", text: "Le lien de l'avis contient tout, plus besoin de rappeler chaque famille pour les horaires." },
{ title: "Une image d'agence actuelle", text: "Qui répond aux attentes numériques des familles." },
{ title: "Un vrai levier SEO local", text: "Vos avis sont trouvés par les moteurs de recherche et amènent du trafic vers votre propre site." },
{ title: "Une marque blanche totale", text: "Vos visiteurs restent chez vous, sans jamais voir Mémoire Vive." },
{ title: "Une complémentarité naturelle avec l'Espace Hommage", text: "Pour une offre funéraire numérique complète." },
];
return (
Pour votre agence
Un service moderne et complémentaire.
{items.map((it, i) => (
{String(i + 1).padStart(2, "0")}
{it.title}
{it.text}
))}
pro.memoire-vive.eu
Le tableau de bord de votre Espace Pro · cliquez pour agrandir
Un processus de consentement encadré, à chaque étape, pour la
tranquillité de vos équipes comme de la famille.
);
}
/* =========================================================================
6. UNE OFFRE FLEXIBLE — grille .mini-step 3 colonnes avec icônes,
fond --cream
========================================================================= */
function OffreFlexible() {
const items = [
{ title: "Avis seul", text: "Vous diffusez vos avis de décès en ligne, sans les espaces hommage.", icon: },
{ title: "Hommage seul", text: "Vous gardez votre solution actuelle pour les avis ; vos espaces hommage sont chez nous, et nous pouvons les connecter à vos avis existants.", icon: },
{ title: "Avis + Hommage", text: "L'offre complète : les deux se connectent automatiquement pour chaque famille.", icon: },
];
return (
Une offre flexible
Avis, Hommage, ou les deux — à vous de choisir.
{items.map((it, i) => (
{it.icon}
{String(i + 1).padStart(2, "0")}
{it.title}
{it.text}
))}
);
}
/* =========================================================================
7. CTA FINAL / CONTACT — fond --ink (dark), pour clore le parcours en
symétrie avec le Hero et éviter deux sections claires consécutives
après la section 6 (--cream)
========================================================================= */
function Contact() {
const [submitted, setSubmitted] = useState(false);
const empty = { nom: "", email: "", telephone: "", ville: "", agence: "", message: "", website: "" };
const [form, setForm] = useState(empty);
const set = (k) => (e) => setForm({ ...form, [k]: e.target.value });
const [submitting, setSubmitting] = useState(false);
const [submitError, setSubmitError] = useState(null);
const submit = async (e) => {
e.preventDefault();
if (submitting) return;
setSubmitting(true);
setSubmitError(null);
try {
const res = await fetch("/api/contact-site/famille", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ ...form, source: "avis-de-deces" }),
});
const data = await res.json().catch(() => ({}));
if (!res.ok || !data.success) {
throw new Error(data.error || "Erreur lors de l'envoi.");
}
setSubmitted(true);
} catch (err) {
setSubmitError(err.message || "Erreur réseau. Réessayez dans un instant.");
} finally {
setSubmitting(false);
}
};
return (
Contact
Parlons de votre projet.
Chaque agence a ses habitudes et ses outils. Contactez-nous pour
voir ensemble comment l'Avis de Décès peut s'intégrer à votre
activité.
);
}
/* =========================================================================
APP
========================================================================= */
function App() {
useEffect(() => {
if (!window.location.hash) return;
const id = window.location.hash.slice(1);
const timer = setTimeout(() => {
const el = document.getElementById(id);
if (el) {
el.scrollIntoView({ behavior: "smooth", block: "start" });
}
}, 100);
return () => clearTimeout(timer);
}, []);
return (