const { useState, useEffect, useRef } = React; /* ============ EXTERNAL LINKS ============ */ // Lien Zcal — diagnostic gratuit. // Remplacez le slug ci-dessous par votre vrai lien Zcal (ex: https://zcal.co/i/AbC123). const ZCAL_URL = "https://zcal.co/i/yHwsUipg"; /* ============ TWEAK DEFAULTS ============ */ const TWEAK_DEFAULTS = /*EDITMODE-BEGIN*/{ "accent": "#993C1D", "heroVariant": "editorial", "density": "regular", "showCockpit": true } /*EDITMODE-END*/; const ACCENTS = { "#993C1D": { deep: "#7A2F15", soft: "#D08768" }, // diwanat rust (brand) "#3A6E5C": { deep: "#2B5347", soft: "#8FB7A8" }, // sage "#2E4B7C": { deep: "#1F3454", soft: "#8AA3C4" }, // indigo "#7C5A3A": { deep: "#5B4128", soft: "#C2A287" } // ochre }; /* ============ SMALL UTILS ============ */ function useInView(threshold = 0.15) { const ref = useRef(null); const [inView, setInView] = useState(false); useEffect(() => { if (!ref.current) return; const obs = new IntersectionObserver( ([e]) => e.isIntersecting && setInView(true), { threshold } ); obs.observe(ref.current); return () => obs.disconnect(); }, []); return [ref, inView]; } function Reveal({ children, delay = 0, as: As = "div", ...rest }) { const [ref, inView] = useInView(); return ( {children} ); } function CountUp({ to, suffix = "", duration = 1400, prefix = "" }) { const [ref, inView] = useInView(); const [val, setVal] = useState(0); useEffect(() => { if (!inView) return; let raf, start; const step = (t) => { if (!start) start = t; const p = Math.min(1, (t - start) / duration); const eased = 1 - Math.pow(1 - p, 3); setVal(to * eased); if (p < 1) raf = requestAnimationFrame(step); }; raf = requestAnimationFrame(step); return () => cancelAnimationFrame(raf); }, [inView, to]); const display = Number.isInteger(to) ? Math.round(val) : val.toFixed(1); return {prefix}{display}{suffix}; } /* ============ HEADER ============ */ function DiwanatLogo({ height = 32, dotColor = "var(--accent)", className = "" }) { // Inline wordmark — text uses currentColor, dot uses dotColor. // Mirrors the brand SVG geometry (viewBox 1000×380). return ( Dıwanat ); } function Header() { const [active, setActive] = useState("hero"); useEffect(() => { const sections = ["hero", "offres", "methode", "manifeste", "contact"]; const obs = new IntersectionObserver( (entries) => { entries.forEach((e) => { if (e.isIntersecting) setActive(e.target.id); }); }, { rootMargin: "-40% 0px -55% 0px" } ); sections.forEach((id) => { const el = document.getElementById(id); if (el) obs.observe(el); }); return () => obs.disconnect(); }, []); const scrollTo = (e, id) => { e.preventDefault(); document.getElementById(id)?.scrollIntoView({ behavior: "smooth" }); }; const link = (id, label) => scrollTo(e, id)}> {label} ; return (
scrollTo(e, "hero")} aria-label="Diwanat"> Diwanat Demander un diagnostic gratuit
); } /* ============ COCKPIT (animated demo) ============ */ const COCKPIT_DATA = [ { label: "Marge brute par BU", sub: "S46 · cumul YTD", values: ["28,4 %", "29,1 %", "29,7 %", "30,2 %"], deltas: ["+0,7 pt", "+0,6 pt", "+0,5 pt"], delta: "up" }, { label: "DSO clients", sub: "rolling 30j", values: ["58 j", "55 j", "52 j", "49 j"], deltas: ["−3 j", "−3 j", "−3 j"], delta: "up" }, { label: "Charge industrielle", sub: "atelier 02 · prév.", values: ["94 %", "97 %", "102 %", "99 %"], deltas: ["seuil 100 %"], delta: "down" }, { label: "Trésorerie projetée", sub: "fin du mois", values: ["4,1 M€", "4,4 M€", "4,6 M€", "4,8 M€"], deltas: ["+0,7 M€"], delta: "up" }]; function Cockpit() { const [tick, setTick] = useState(0); useEffect(() => { const t = setInterval(() => setTick((x) => (x + 1) % 4), 1800); return () => clearInterval(t); }, []); return (
Cockpit S46
MAJ il y a 4 min
{COCKPIT_DATA.map((row, i) => { const v = row.values[tick % row.values.length]; const d = row.deltas[tick % row.deltas.length]; return (
{row.label} {row.sub}
{d}
{v}
); })}
Décision proposée Réallouer 180 k€ du budget marketing Q4 vers la BU industrie — gain de marge attendu : +0,4 pt sur la marge brute consolidée.
3 sources · ERP, CRM, trésorerie signé : DAF
); } /* ============ HERO ============ */ function Hero({ showCockpit }) { return (
); } /* ============ STATS ============ */ const STATS = [ { value: 73, suffix: "%", label: "des dirigeants d'ETI déclarent manquer de visibilité en temps réel sur leur performance opérationnelle.", src: "Bpifrance Le Lab — 2023" }, { value: 3, suffix: " sem.", label: "délai moyen pour consolider un reporting décisionnel dans une ETI sans outil dédié.", src: "Sage / IDC France — 2024" }, { value: 40, suffix: "%", label: "du temps d'un DAF consacré à produire de l'information plutôt qu'à la transformer en décision.", src: "DFCG / Deloitte — 2023" }, { value: 30, suffix: "%", prefix: "+", label: "de vitesse de décision dans les ETI ayant déployé un cockpit de pilotage unifié.", src: "McKinsey — 2023" }]; function Stats() { return (
Index — 02 / Constat
{STATS.map((s, i) =>

{s.label}

{s.src}
)}
); } /* ============ PROBLEM ============ */ function Problem() { return (
Index — 03 / Diagnostic

Vos données sont là, dans l'ERP, le CRM, les fichiers Excel, les comptes rendus de réunion. Mais elles n'arrivent jamais au bon moment, dans le bon format et au bon endroit, pour permettre la bonne décision.

Ce n'est pas un problème de personnes. C'est un problème de système.

{[ { tag: "Symptôme 01", h: "Les CODIR du lundi matin", p: "Trois directions, trois chiffres différents pour la même question. Les décisions sont reportées à la semaine suivante." }, { tag: "Symptôme 02", h: "Le temps de décision", p: "40 % du temps passé à consolider, 10 % à analyser, 0 % à arbitrer. La donnée existe, l'arbitrage manque." }, { tag: "Symptôme 03", h: "L'angle mort opérationnel", p: "Les dérives de marge sont identifiées après les faits, trop tard pour pouvoir être corrigées." }]. map((f, i) =>
{f.tag}

{f.h}

{f.p}

)}
); } /* ============ OFFERS ============ */ const OFFERS = [ { id: "01", title: "Business Decision", sub: "", desc: "Votre cockpit de pilotage activé en 5 semaines. Des agents spécialisés branchés sur vos systèmes existants, qui chaque jour vous livrent une décision chiffrée, sourcée, prête à signer .", cta: "Découvrir notre solution", featured: true }, { id: "02", title: "Conseil", sub: "Opérationnel & stratégique", desc: "Missions ciblées sur vos sujets prioritaires : Innovation, gouvernance, pilotage de la performance, organisation des directions.", cta: "En savoir plus" }, { id: "03", title: "Formation", sub: "Équipes de direction", desc: "Accompagnement personnalisé, formations et ateliers pour les dirigeants et membres du Codir, leadership, définition des cas d'usage prioritaires et transformatifs, éthique, alignement et gouvernance.", cta: "Voir les formations" }, { id: "04", title: "Études", sub: "Analyses & benchmarks ETI", desc: "Études sectorielles sur les ETI, performance, pratiques de pilotage, tendances de marché.", cta: "Voir les études" }]; function Offers() { return (
Index — 04 / Offres

Ce que nous faisons. Quatre modes d'engagement, un seul objectif : la décision.

{OFFERS.map((o) =>
{o.id}

{o.sub} {o.title}

{o.desc}

{ e.preventDefault(); document.getElementById("contact")?.scrollIntoView({ behavior: "smooth" }); } : undefined} className="o-cta"> {o.cta}
)}
); } /* ============ METHOD ============ */ const STEPS = [ { n: "01", days: "J+15", h: "Diagnostic", p: "Quinze jours d'immersion. Nous cartographions vos flux d'information, vos comités, vos décisions différées." }, { n: "02", days: "J+50", h: "Cockpit", p: "Nous connectons votre cockpit à vos systèmes (ERP, CRM, paie, trésorerie). Votre premier rapport de pilotage est livré." }, { n: "03", days: "Continu", h: "Décision", p: "Vos décisions chiffrées et sourcées chaque semaine sont partagées au CODIR. Vous arbitrez des recommandations plus que vous n'interprétez des tableaux de bord." }, { n: "04", days: "Continu", h: "Itération", p: "Vos agents s'adaptent à vos arbitrages, vos indicateurs évoluent avec votre stratégie." }]; function Method() { return (
Index — 05 / Méthode

Passer de l'ère de la donnée brute à celui de la décision éclairée.

{STEPS.map((s, i) =>
{s.n} {s.days}

{s.h}

{s.p}

)}
); } /* ============ MANIFESTO ============ */ function Manifesto() { return (
Index — 06 / Manifeste

Votre rôle de dirigeant n'est pas d'organiser l'information. C'est de l'utiliser.

Nous avons construit Diwanat avec une conviction simple. Les Entreprises de Taille Intermédiaire ont des besoins complexes, souvent traités avec des outils inadaptés ou simplement obsolètes.  Nous ne vendons pas un produit, nous installons votre système de décision.

Notre méthode s'ancre dans la réalité des flux d'une ETI — pas dans un modèle générique. Nous branchons directement sur vos systèmes existants, nous comprenons les arbitrages de votre CODIR, et nous construisons un système qui apprend de vos décisions. Nous nous concentrons sur les ETI parce que c'est là qu'une décision claire, prise au bon moment, peut radicalement transformer la trajectoire de l'entreprise.

Diwanat — Paris
); } /* ============ ZCAL EMBED (official embed.js inline widget) ============ */ function ZcalEmbed() { useEffect(() => { const SCRIPT_SRC = "https://static.zcal.co/embed/v1/embed.js"; // Zcal's embed.js auto-scans for .zcal-inline-widget on load. In an SPA we // (re)inject it so the widget mounts even after a client-side refresh. const existing = document.querySelector(`script[src="${SCRIPT_SRC}"]`); if (existing) existing.remove(); const s = document.createElement("script"); s.src = SCRIPT_SRC; s.async = true; document.body.appendChild(s); return () => {s.remove();}; }, []); return (
{/* Zcal inline embed — piloté par data-zcal-link */}
Réserver un diagnostic gratuit
); } function Contact() { return (
Index — 07 / Contact

Analyser votre situation.

Un diagnostic gratuit et sans engagement qui vous permet de faire le point sur l'existant et de détailler ce que nous pouvons concrètement vous proposer.

  • Réponse sous 24 heures ouvrables, par un associé.
  • Échange initial confidentiel — 45 minutes en visio.
); } /* ============ FOOTER ============ */ function Footer() { return ( ); } /* ============ APP ROOT ============ */ function App() { const [tweaks, setTweak] = useTweaks(TWEAK_DEFAULTS); // Apply tweaks useEffect(() => { const acc = ACCENTS[tweaks.accent] || ACCENTS["#993C1D"]; document.documentElement.style.setProperty("--accent", tweaks.accent); document.documentElement.style.setProperty("--accent-deep", acc.deep); document.documentElement.style.setProperty("--accent-soft", acc.soft); }, [tweaks.accent]); useEffect(() => { document.body.className = `density-${tweaks.density} hero-${tweaks.heroVariant}`; }, [tweaks.density, tweaks.heroVariant]); return ( <>