// ============================================================ // MONARCH AVOCAT — Site (React, single-page artifact) // ============================================================ const { useState, useEffect, useContext, createContext, Fragment } = React; const HERO_IMG = "assets/hero.webp"; const CAL_LINK = "hugo-groslambert/diagnostic1h"; const CAL_ORIGIN = "https://cal.eu"; const CAL_EMBED_JS = "https://app.cal.eu/embed/embed.js"; const CAL_URL = `${CAL_ORIGIN}/${CAL_LINK}`; // Charge le script d'embed Cal une seule fois et l'initialise (popup de réservation). function useCalEmbed() { useEffect(() => { if (window.__monarchCalInit) return; window.__monarchCalInit = true; (function (C, A, L) { let p = function (a, ar) {a.q.push(ar);}; let d = C.document; C.Cal = C.Cal || function () { let cal = C.Cal;let ar = arguments; if (!cal.loaded) {cal.ns = {};cal.q = cal.q || [];d.head.appendChild(d.createElement("script")).src = A;cal.loaded = true;} if (ar[0] === L) { const api = function () {p(api, arguments);}; const namespace = ar[1]; api.q = api.q || []; if (typeof namespace === "string") {cal.ns[namespace] = cal.ns[namespace] || api;p(cal.ns[namespace], ar);p(cal, ["initNamespace", namespace]);} else p(cal, ar); return; } p(cal, ar); }; })(window, CAL_EMBED_JS, "init"); try { window.Cal("init", { origin: CAL_ORIGIN }); window.Cal("ui", { hideEventTypeDetails: false, layout: "month_view" }); } catch (e) {} }, []); } // Ouvre la popup Cal ; repli sur l'ouverture d'onglet si le script n'est pas chargé. function openCal(e) { if (window.Cal) { if (e) e.preventDefault(); window.Cal("modal", { calLink: CAL_LINK, config: { layout: "month_view" } }); } // sinon : le lien href s'ouvre normalement (repli) } const C = { blanc: "#FFFFFF", albatre: "#FAF9F6", encre: "#1B1D1C", ardoise: "#5B7C99", ardoiseFonce: "#3D5468", sauge: "#5C6F5C", saugeFonce: "#48584A", gris: "#737373", grisClair: "#9A9A95", trait: "#E4E1DA" }; const FONTS = { serif: "'Fraunces', Georgia, serif", body: "'Archivo', system-ui, sans-serif", editorial: "'Spectral', Georgia, serif" }; // ---------- i18n ---------- const LANGS = ["fr", "en", "es", "it"]; const LangContext = createContext({ lang: "fr", setLang: () => {} }); function useT() { const { lang } = useContext(LangContext); return (key) => { const T = window.MONARCH_TRANSLATIONS || {}; const d = T[lang] || T.fr || {}; return d[key] ?? (T.fr && T.fr[key]) ?? key; }; } // Render translated HTML inline. tag defaults to span. function TT({ k, tag = "span", style, className }) { const t = useT(); return React.createElement(tag, { style, className, dangerouslySetInnerHTML: { __html: t(k) } }); } // Inject Google Fonts + keyframes once function useFonts() { useEffect(() => { const id = "monarch-fonts"; if (document.getElementById(id)) return; const link = document.createElement("link"); link.id = id; link.rel = "stylesheet"; link.href = "https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&family=Spectral:wght@400;500&family=Archivo:wght@300;400;500;600&display=swap"; document.head.appendChild(link); const style = document.createElement("style"); style.textContent = ` @keyframes monarchRise { from { opacity:0; transform:translateY(22px);} to {opacity:1; transform:translateY(0);} } @keyframes monarchFade { from { opacity:0;} to {opacity:1;} } html { scroll-behavior: smooth; } body { margin: 0; } .monarch-article-body p { font-size: 18px; line-height: 1.78; color: #2c2e2d; margin: 0 0 22px; } .monarch-article-body h2 { font-family: 'Fraunces', Georgia, serif; font-size: 26px; font-weight: 500; letter-spacing: -0.01em; margin: 40px 0 14px; } .monarch-article-body h3 { font-family: 'Fraunces', Georgia, serif; font-size: 21px; font-weight: 500; margin: 32px 0 10px; } .monarch-article-body ul, .monarch-article-body ol { font-size: 18px; line-height: 1.78; color: #2c2e2d; padding-left: 22px; margin: 0 0 22px; } .monarch-article-body li { margin-bottom: 8px; } .monarch-article-body blockquote { font-family: 'Fraunces', Georgia, serif; font-size: 24px; line-height: 1.4; font-weight: 500; color: #3D5468; border-left: 2px solid #5B7C99; margin: 30px 0; padding: 4px 0 4px 26px; } .monarch-article-body a { color: #3D5468; text-decoration: underline; text-underline-offset: 3px; } .monarch-article-body img { width: 100%; height: auto; margin: 24px 0; } `; document.head.appendChild(style); }, []); } // ---------- Small UI atoms ---------- function Eyebrow({ children, color }) { return ( {children} ); } function PrimaryBtn({ textKey, children, full, big, small, style }) { const t = useT(); const [hover, setHover] = useState(false); const label = textKey ? t(textKey) : children; return ( setHover(true)} onMouseLeave={() => setHover(false)} style={{ display: "inline-flex", alignItems: "center", gap: 10, fontFamily: FONTS.body, fontSize: big ? 16 : small ? 13.5 : 15, fontWeight: 600, letterSpacing: "0.01em", padding: big ? "19px 38px" : small ? "12px 20px" : "17px 30px", borderRadius: 2, background: hover ? C.saugeFonce : C.sauge, color: "#fff", cursor: "pointer", textDecoration: "none", transform: hover ? "translateY(-2px)" : "none", boxShadow: hover ? "0 14px 30px -12px rgba(76,88,74,.6)" : "none", transition: "all .35s cubic-bezier(.2,.7,.3,1)", width: full ? "100%" : "auto", justifyContent: full ? "center" : "flex-start", ...style }}> {label}{" "} ); } function MonarchSite() { useFonts(); useCalEmbed(); const [page, setPage] = useState("home"); const [slug, setSlug] = useState(null); const lang = "fr"; useEffect(() => { document.documentElement.setAttribute("lang", "fr"); }, []); const go = (p, s = null) => {setPage(p);setSlug(s);window.scrollTo({ top: 0 });}; return ( {} }}>
{page === "home" && } {page === "profil" && } {page === "blog" && } {page === "article" &&
} {page === "legal" && }
); } // ---------- Header ---------- function Header({ page, go }) { const t = useT(); const [scrolled, setScrolled] = useState(false); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 40); window.addEventListener("scroll", onScroll, { passive: true }); return () => window.removeEventListener("scroll", onScroll); }, []); const solid = scrolled || page !== "home"; const NavLink = ({ to, hash, children }) => ; return (
); } // ---------- HOME ---------- function Home() { return (
); } function Wrap({ children, style }) { return
{children}
; } function Hero() { const t = useT(); return (
{t("hero.eyebrow")}

{t("hero.h1.l1")}
{t("hero.h1.l2")}
{t("hero.h1.l3_italic")}

{t("hero.body")}

{t("hero.seemethod")} →
{t("hero.subnote")}
{t("hero.alt")}
); } function ConstatCta() { return (
); } function HeroCta() { const t = useT(); return (
{t("herocta.eyebrow")}

{t("herocta.text")}

); } function Chaos() { const t = useT(); const keys = ["chaos.item1", "chaos.item2", "chaos.item3", "chaos.item4"]; return (
{t("chaos.eyebrow")}

{t("chaos.title")}

{t("chaos.sub")}

{keys.map((k, i) =>
{String(i + 1).padStart(2, "0")}
)}
); } function Pivot() { const t = useT(); return (
{t("pivot.eyebrow")}
); } function Method() { const t = useT(); const pillars = [ { n: "01", tKey: "method.p1.t", bKey: "method.p1.b" }, { n: "02", tKey: "method.p2.t", bKey: "method.p2.b" }, { n: "03", tKey: "method.p3.t", bKey: "method.p3.b" }]; return (
{t("method.eyebrow")}

{t("method.title")}

{t("method.sub")}

{pillars.map((p, i) =>
{p.n}

{t(p.tKey)}

)}
); } function Process() { const t = useT(); const steps = [ { n: "01", tKey: "process.s1.t", bKey: "process.s1.b" }, { n: "02", tKey: "process.s2.t", bKey: "process.s2.b" }, { n: "03", tKey: "process.s3.t", bKey: "process.s3.b" }, { n: "04", tKey: "process.s4.t", bKey: "process.s4.b" }, { n: "05", tKey: "process.s5.t", bKey: "process.s5.b" }]; return (
{t("process.eyebrow")}

{t("process.title")}

{t("process.sub")}

{steps.map((s) =>
{s.n}

{t(s.tKey)}

{t(s.bKey)}

)}

{t("process.ctaText")}

); } function Domains() { const t = useT(); const ds = [ { nKey: "domains.d1.n", tKey: "domains.d1.t", bKey: "domains.d1.b" }, { nKey: "domains.d2.n", tKey: "domains.d2.t", bKey: "domains.d2.b" }, { nKey: "domains.d3.n", tKey: "domains.d3.t", bKey: "domains.d3.b" }]; return (
{t("domains.eyebrow")}

{t("domains.title")}

{ds.map((d, i) =>
{t(d.nKey)}

{t(d.tKey)}

{t(d.bKey)}

{t("domains.discuss")}
)}
{t("domains.cta.eyebrow")}

{t("domains.cta.text")}

); } function Doctrine() { const t = useT(); return (
{t("doctrine.eyebrow")}

{t("doctrine.sub")}

«  {t("doctrine.quote")}  »
{t("doctrine.attr")}
); } function FinalCta({ titleKey, textKey }) { const t = useT(); return (
{t("finalcta.eyebrow")}

{t(titleKey || "finalcta.title")}

{t(textKey || "finalcta.text")}

{t("finalcta.subnote")}
); } // ---------- PROFIL ---------- function Profil({ go }) { const t = useT(); return (
{t("profil.eyebrow")}
{t("profil.win3.v")} {t("profil.win3.unit")}} l={t("profil.win3.l")} />
{t("profil.midcta.eyebrow")}

{t("profil.midcta.text")}

{t("profil.h1")} {t("profil.h2")} {t("profil.h3")} {t("profil.h4")}
); } function ProseH({ children }) { return

{children}

; } function Win({ v, l }) { return (
{v}
{l}
); } // ---------- BLOG ---------- function Blog({ go }) { const t = useT(); const posts = (window.MONARCH_POSTS || []).slice().sort((a, b) => (b.iso || "").localeCompare(a.iso || "")); return (
{t("blog.eyebrow")}

{t("blog.h1")}

{t("blog.sub")}

{posts.length === 0 ?

{t("blog.empty")}

:
{posts.map((p) => go("article", p.slug)} /> )}
}
); } function PostRow({ post, onOpen }) { const [hover, setHover] = useState(false); return (
setHover(true)} onMouseLeave={() => setHover(false)} style={{ display: "grid", gridTemplateColumns: "160px 1fr 40px", gap: 40, padding: "38px 0", borderBottom: `1px solid ${C.trait}`, alignItems: "center", background: hover ? C.albatre : "transparent", transition: "background .3s", cursor: "pointer" }}>
{post.date}
{post.cat}

{post.title}

{post.excerpt &&

{post.excerpt}

}
); } // ---------- ARTICLE ---------- function Article({ slug, go }) { const t = useT(); const posts = window.MONARCH_POSTS || []; const post = posts.find((p) => p.slug === slug); if (!post) { return (

Article introuvable.

); } return (
{post.cat}

{post.title}

{post.date}
{post.cover && }

Une question sur votre situation ?

); } // ---------- LÉGAL ---------- function Legal({ go }) { const t = useT(); const H = ({ children }) =>

{children}

; const P = ({ children }) =>

{children}

; const Ph = ({ children }) => {children}; return (
{t("legal.eyebrow")}

{t("legal.h1")}

Éditeur du site

Le présent site est édité par Hugo Groslambert, avocat inscrit au Barreau de Toulouse.
Téléphone : +33 6 69 56 99 18 — Courriel : contact@monarch-avocat.fr
Directeur de la publication : Hugo Groslambert.

Profession et règles applicables

Avocat au Barreau de Toulouse, Maître Hugo Groslambert est soumis aux règles de la profession d'avocat : la loi n° 71-1130 du 31 décembre 1971, le décret n° 91-1197 du 27 novembre 1991, le Règlement Intérieur National (RIN) du Conseil National des Barreaux et le règlement intérieur du Barreau de Toulouse.
Le titre d'avocat est un titre professionnel français protégé. La structure relève de l'Ordre des Avocats du Barreau de Toulouse.

Médiation de la consommation

Conformément aux articles L.611-1 et suivants du Code de la consommation, le client consommateur peut recourir gratuitement au médiateur de la consommation de la profession d'avocat.

Hébergement

Le site est hébergé par Hostinger International Ltd., 61 Lordou Vironos Street, 6023 Larnaca, Chypre — www.hostinger.fr.

Propriété intellectuelle

L'ensemble des contenus (textes, articles, identité visuelle, photographies) est protégé par le droit d'auteur et reste la propriété de l'éditeur, sauf mention contraire. Toute reproduction ou réutilisation sans autorisation est interdite.

Données personnelles (RGPD)

Les informations transmises via le formulaire de prise de rendez-vous ou par courriel sont utilisées uniquement pour répondre à votre demande et ne sont pas cédées à des tiers. Conformément au RGPD et à la loi « Informatique et Libertés », vous disposez d'un droit d'accès, de rectification, d'effacement et d'opposition sur vos données, en écrivant à contact@monarch-avocat.fr. Réclamation possible auprès de la CNIL (www.cnil.fr).

Confidentialité

Les échanges avec un avocat sont couverts par le secret professionnel. Les informations diffusées sur ce site ont une vocation générale et d'information ; elles ne constituent pas une consultation juridique et ne sauraient engager la responsabilité de l'éditeur.

); } // ---------- Footer ---------- function Footer({ go }) { const t = useT(); return (
MONARCH
{t("footer.sub")}
); } // ---------- Mount ---------- ReactDOM.createRoot(document.getElementById("root")).render();