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.
);
}
/* =========================================================================
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: "" };
const [form, setForm] = useState(empty);
const set = (k) => (e) => setForm({ ...form, [k]: e.target.value });
const submit = (e) => { e.preventDefault(); setSubmitted(true); };
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();