const { useState, useEffect, useRef } = React;
// Pull shared atoms / icons from window (populated by shared.jsx)
const {
MV_Header: Header,
MV_Footer: Footer,
MV_BackToTop: BackToTop,
MV_SectionLabel: SectionLabelBase,
MV_Ornament: Ornament,
MV_Stat: Stat,
MV_PhoneFrame: PhoneFrame,
MV_FigCaption: FigCaptionBase,
MV_Lightbox: Lightbox,
MV_Zoomable: Zoomable,
MV_ArrowRight: ArrowRight,
MV_ArrowDown: ArrowDown,
MV_ArrowUpRight: ArrowUpRight,
MV_IconDownloadSmall: IconDownloadSmall,
MV_Check: Check,
MV_IconWebsite: IconWebsite,
MV_IconDownload: IconDownload,
MV_IconBook: IconBook,
MV_IconShield: IconShield,
MV_IconLock: IconLock,
MV_IconClock: IconClock,
} = window;
/* =========================================================================
TWEAKS
========================================================================= */
const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{
"accent": "gold",
"numbering": "arabic",
"conclusionTone": "cream",
"showFigCaptions": true
}/*EDITMODE-END*/;
const ACCENTS = {
gold: { name: "Or classique", c1: "#c9a55c", c2: "#e2c98a", c3: "#a8854a" },
champagne: { name: "Champagne", c1: "#d6b98a", c2: "#ead9b8", c3: "#b69a6d" },
rosegold: { name: "Or rosé", c1: "#d8a48a", c2: "#ecc9b8", c3: "#b8836a" },
};
// Wrap shared atoms with tweak-aware variants
function SectionLabel({ n, children }) {
const t = window._tw || TWEAK_DEFAULTS;
return {children};
}
function FigCaption({ children }) {
const t = window._tw || TWEAK_DEFAULTS;
return {children};
}
/* =========================================================================
1. HERO
========================================================================= */
function Hero() {
return (
Un service offert par votre agence funéraire
Pour que la mémoire
soit toujours vivante.
Un espace numérique d'hommage où famille, proches et connaissances
rassemblent — avant, pendant et après la cérémonie — les mots, photos
et souvenirs qui composent une vie.
);
}
/* =========================================================================
1bis. ORIGINE — Témoignage du fondateur
========================================================================= */
function Origine() {
return (
Le témoignage du fondateur
Comment est née Mémoire Vive
Lors des obsèques de mon cousin, l'église était pleine — et sa
famille proche ne connaissait pas la moitié des personnes présentes.
Tous, pourtant, avaient croisé sa vie. Certains avaient partagé un
moment fort, une anecdote, peut-être même une photo oubliée dans
un téléphone.
Après la cérémonie, chacun est reparti avec ces fragments. Des
souvenirs précieux que sa famille ne connaîtrait jamais.
J'ai compris qu'un hommage ne devait pas seulement servir à
déposer des condoléances. Il devait aussi aider à retrouver
tout ce que la vie d'une personne a semé chez les autres.
C'est ainsi qu'est née Mémoire Vive.
);
}
/* =========================================================================
2. EXPLICATION
========================================================================= */
function Explication() {
return (
Pourquoi Mémoire Vive
Le jour de la cérémonie,
tant de souvenirs restent à recueillir.
La famille ne connaît peut-être pas tous les participants aux obsèques.
Et pourtant chacun a probablement eu une histoire avec le défunt — une
anecdote à raconter, des photos enfouies dans la galerie d'un smartphone…
Il serait dommage de perdre tous ces témoignages, de ne jamais connaître
les événements marquants ou plus anecdotiques que l'on ignore de la vie
d'un proche.
Mémoire Vive permet aux proches, amis, collègues et connaissances
{" "}de partager un message, une photo, un souvenir — et même de contribuer
au parcours de vie du défunt.
Exclusivité Mémoire Vive
Avant, pendant, et même après la cérémonie.
);
}
/* =========================================================================
3. COMMENT ÇA MARCHE
========================================================================= */
function CommentCaMarche() {
return (
);
}
/* =========================================================================
4. DEMO
========================================================================= */
function Demo() {
return (
Démonstration
Découvrez Mémoire Vive
de vos propres yeux.
Pour vous faire une idée concrète, nous avons préparé deux
démonstrations à partir de l'hommage (fictif) rendu à
Juliette Armand.
);
}
/* =========================================================================
5. CONCLUSION
========================================================================= */
function Conclusion() {
const t = window._tw || TWEAK_DEFAULTS;
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] = useStateS(false);
const [submitError, setSubmitError] = useStateS(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),
});
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 (
);
}
/* =========================================================================
TWEAKS PANEL
========================================================================= */
function Tweaks() {
const [t, setTweak] = useTweaks(TWEAK_DEFAULTS);
useEffect(() => { window._tw = t; }, [t]);
useEffect(() => {
const a = ACCENTS[t.accent] || ACCENTS.gold;
const r = document.documentElement;
r.style.setProperty("--gold", a.c1);
r.style.setProperty("--gold-light", a.c2);
r.style.setProperty("--gold-dark", a.c3);
}, [t.accent]);
return (
setTweak("accent", v)} />
setTweak("numbering", v)} />
setTweak("conclusionTone", v)} />
setTweak("showFigCaptions", v)} />
);
}
/* =========================================================================
APP
========================================================================= */
function App() {
return (
);
}
ReactDOM.createRoot(document.getElementById("root")).render();