// Apricus — hi-fi homepage · shared primitives, data & PhotoCluster
// Exposes: Button, Eyebrow, Icon, useReveal, PhotoCluster, RETREATS, ATELIERS, TEMOINS, FAQS, *_WASH

const SUN_WASH   = 'radial-gradient(120% 95% at 72% 8%, #FBE89A 0%, #F9D862 26%, #F4C20D 52%, #E09600 80%, #C8821B 100%)';
const OLIVE_WASH = 'radial-gradient(120% 95% at 30% 10%, #AFB78C 0%, #8A9560 40%, #6F7A45 72%, #4E5630 100%)';
const TERRA_WASH = 'radial-gradient(120% 95% at 70% 12%, #E7C3AE 0%, #D08C6B 42%, #C06A47 72%, #9E4E30 100%)';

// Lien Calendry (prise de rendez-vous "appel gratuit")
const CALENDLY_URL = 'https://calendly.com/marie-muratori/appel-gratuit';
function bookCall() {
  if (window.Calendly && window.Calendly.initPopupWidget) {
    window.Calendly.initPopupWidget({ url: CALENDLY_URL });
  } else {
    window.open(CALENDLY_URL, '_blank', 'noopener');
  }
}

// Streamline Freehand (hand-drawn) via Iconify + text glyphs for chrome
const F_MAP = {
  sun: 'smiley-blessed', heart: 'smiley-blessed', 'users-three': 'walking-symbol',
  walk: 'walking-symbol', swim: 'swimming-pool-person', book: 'book-bookmark',
  'map-pin': 'worldwide-web-location-pin', calendar: 'calendar-date', camera: 'camera',
  drink: 'party-alchoholic-drink', 'instagram-logo': 'camera', 'envelope-simple': 'envelope-letter-front',
  phone: 'phone-actions-call', leaf: 'plant-hand',
};
const TEXT_GLYPH = { 'arrow-right': '\u2192', 'arrow-left': '\u2190', x: '\u2715', check: '\u2713', quotes: '\u201C', star: '\u2605' };
const IMG_ICON = { lemon: 'assets/apricus-lemon.png', 'sun-motif': 'assets/sun-motif.svg' };
const Icon = ({ name, size = 22, color, style }) => {
  if (IMG_ICON[name]) return (
    <img src={IMG_ICON[name]} alt="" style={{ width: size, height: size, objectFit: 'contain', display: 'inline-flex', ...style }} />
  );
  if (TEXT_GLYPH[name]) return (
    <span style={{ fontSize: size, color: color || 'inherit', lineHeight: 1, display: 'inline-flex', ...style }}>{TEXT_GLYPH[name]}</span>
  );
  const ic = F_MAP[name] || name;
  return <iconify-icon icon={`streamline-freehand:${ic}`} style={{ fontSize: size, color: color || 'inherit', display: 'inline-flex', ...style }} />;
};

const Eyebrow = ({ children, color, style }) => (
  <div className="apr-eyebrow" style={{
    fontFamily: 'var(--font-body)', fontWeight: 700, fontSize: 13,
    textTransform: 'uppercase', letterSpacing: '0.22em',
    color: color || 'var(--apr-honey)', ...style
  }}>{children}</div>
);

const btnBase = {
  fontFamily: 'var(--font-body)', fontWeight: 500,
  background: 'transparent', cursor: 'pointer', borderRadius: 7,
  textTransform: 'uppercase', letterSpacing: '0.16em',
  display: 'inline-flex', alignItems: 'center', gap: 9,
  transition: 'color .18s var(--ease-out), border-color .18s var(--ease-out), box-shadow .18s var(--ease-out), transform .12s var(--ease-out)',
  textDecoration: 'none', whiteSpace: 'nowrap',
};

// Outline-only buttons (per the system). `glow` adds the citron CTA glow on hover.
function Button({ children, variant = 'primary', size = 'md', onClick, style, type, disabled, glow }) {
  const [hover, setHover] = React.useState(false);
  const [press, setPress] = React.useState(false);
  const sizes = {
    sm: { padding: '10px 18px', fontSize: 11 },
    md: { padding: '13px 24px', fontSize: 12 },
    lg: { padding: '16px 30px', fontSize: 13 },
  };
  const palette = {
    primary:   ['var(--apr-ink)', 'var(--apr-honey)'],
    secondary: ['var(--apr-honey)', 'var(--apr-clay)'],
    terra:     ['var(--apr-terracotta)', 'var(--apr-clay)'],
    cream:     ['var(--apr-cream)', '#FFFFFF'],
  };
  const ghost = variant === 'ghost';
  const [base, hov] = palette[variant] || palette.primary;
  const col = disabled ? 'var(--apr-ink-faint)' : (hover ? hov : base);
  return (
    <button type={type || 'button'} onClick={disabled ? undefined : onClick}
      onMouseEnter={() => setHover(true)} onMouseLeave={() => { setHover(false); setPress(false); }}
      onMouseDown={() => setPress(true)} onMouseUp={() => setPress(false)}
      style={{ ...btnBase, ...sizes[size], color: col,
        border: ghost ? '1px solid transparent' : `1px solid ${disabled ? 'var(--border-strong)' : col}`,
        boxShadow: glow && hover && !disabled ? 'var(--shadow-glow)' : 'none',
        transform: press && !disabled ? 'scale(0.97)' : 'none',
        cursor: disabled ? 'not-allowed' : 'pointer', ...style }}>
      {children}
    </button>
  );
}

// Scroll reveal — fail-safe (always reveals even if IO never fires in a scaled iframe)
function useReveal() {
  const ref = React.useRef(null);
  React.useEffect(() => {
    const el = ref.current; if (!el) return;
    const nodes = [...el.querySelectorAll('.apr-fade')];
    const revealAll = () => nodes.forEach(n => n.classList.add('in'));
    let io;
    if (typeof IntersectionObserver === 'function') {
      io = new IntersectionObserver((entries) => {
        entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); io.unobserve(e.target); } });
      }, { threshold: 0.12, rootMargin: '0px 0px -8% 0px' });
      nodes.forEach(n => io.observe(n));
    }
    const t = setTimeout(revealAll, 600);
    window.addEventListener('scroll', revealAll, { once: true, passive: true });
    return () => { clearTimeout(t); window.removeEventListener('scroll', revealAll); if (io) io.disconnect(); };
  }, []);
  return ref;
}

// Modern layered photo "incrustation": big arch image + smaller inset + optional sticker
function PhotoCluster({ main = 'paper-citron', inset = 'paper-olive', aspect = '4 / 5',
  sticker, label = 'Photographie · placeholder', insetLabel = 'détail', insetSide = 'right', arch = true, art, mainImg, insetImg, frame, shapeRadius, style }) {
  const insetPos = insetSide === 'left' ? { left: -26 } : { right: -26 };
  const mainBg = mainImg ? `url(${mainImg})` : `url(assets/textures/${main}.jpg)`;
  const radius = shapeRadius || (arch ? 'var(--radius-arch)' : 'var(--radius-xl)');
  return (
    <div style={{ position: 'relative', ...style }}>
      {frame ? (
        <div style={{ aspectRatio: aspect, borderRadius: radius, padding: 'clamp(14px, 3%, 22px)',
          background: '#FFFDF8',
          backgroundImage: 'radial-gradient(rgba(120,100,60,0.06) 1px, transparent 1.4px), radial-gradient(rgba(120,100,60,0.04) 1px, transparent 1.4px)',
          backgroundSize: '7px 7px, 11px 11px', backgroundPosition: '0 0, 3px 4px',
          boxShadow: 'var(--shadow-lg), inset 0 0 0 1px rgba(120,100,60,0.06)', position: 'relative', overflow: 'hidden', filter: 'url(#paperEdge)' }}>
          <div style={{ width: '100%', height: '100%', borderRadius: 'calc(var(--radius-xl) - 10px)',
            background: mainBg, backgroundSize: 'cover', backgroundPosition: 'center',
            boxShadow: 'inset 0 1px 6px rgba(40,30,10,0.18)' }}>
            {!mainImg && !art ? <span className="ph-label">{label}</span> : null}
            {art || null}
          </div>
        </div>
      ) : (
        <div style={{ aspectRatio: aspect, borderRadius: radius,
          background: mainBg, backgroundSize: 'cover', backgroundPosition: 'center',
          boxShadow: 'var(--shadow-lg)', position: 'relative', overflow: 'hidden' }}>
          {art ? art : (mainImg ? null : <span className="ph-label">{label}</span>)}
        </div>
      )}
      {inset ? (
        <div style={{ position: 'absolute', bottom: -26, width: '50%', aspectRatio: '1 / 1', ...insetPos,
          borderRadius: 'var(--radius-lg)', background: insetImg ? `url(${insetImg})` : `url(assets/textures/${inset}.jpg)`, backgroundSize: 'cover',
          backgroundPosition: 'center', border: '6px solid var(--apr-linen)', boxShadow: 'var(--shadow-lg)', overflow: 'hidden', filter: 'url(#paperEdge)' }}>
          {insetImg ? null : (insetLabel ? <span className="ph-label sm">{insetLabel}</span> : null)}
        </div>
      ) : null}
      {sticker && (
        <div style={{ position: 'absolute', top: -22, left: -22, width: 104, height: 104, borderRadius: '50%',
          background: 'var(--apr-citron)', border: '1.5px solid var(--apr-ink)', display: 'grid', placeItems: 'center',
          textAlign: 'center', lineHeight: 1.05, transform: 'rotate(-9deg)', boxShadow: 'var(--shadow-md)', zIndex: 3,
          fontFamily: 'var(--font-script)', fontSize: 21, color: 'var(--apr-ink)', padding: 8 }}
          dangerouslySetInnerHTML={{ __html: sticker }} />
      )}
    </div>
  );
}

// ---- Real Apricus content (Marie) ----
const RETREATS = [
  { id: 'provence2', name: 'Soleil de Provence', place: 'Provence · 2ᵉ édition', dates: '16 – 19 avril 2026',
    wash: SUN_WASH, texture: 'paper-citron', tags: ['Yoga', 'Dolce vita'],
    blurb: "Après le succès de la première édition, nous sommes retournées dans notre petit coin de paradis provençal. Entre créations de parfums, marché local, bons petits plats et nos classiques ateliers bien-être et yoga, quatre jours de déconnexion totale.",
    long: [
      "La magie Apricus, c'est aussi ça : sept femmes, certaines venues en groupe et d'autres en solo… et au bout d'une heure on ne savait plus qui était arrivée avec qui. Un groupe merveilleux qui s'est laissé porter au rythme des cigales, et grâce à qui le soleil de Provence a brillé un peu plus fort.",
      "Un séjour rempli d'émotions : des partages enrichissants, du dolce far niente, des découvertes, une nourriture extraordinaire cuisinée avec amour. Des rires, des larmes, et tout ce qu'il y a entre. Un espace hors du temps où chacune s'est sentie libre d'exister comme elle le souhaitait, où la sororité a ressourcé et réparé.",
    ],
    programme: [['sun', 'Yoga & souffle au lever du soleil'], ['leaf', "Atelier création de parfums"], ['walk', "Marché local & cuisine partagée"], ['heart', "Ateliers bien-être mental"]],
    inclus: ['Hébergement en mas provençal', 'Tous les repas du marché', 'Cours de yoga quotidiens', 'Ateliers & sorties culturelles'],
    gallery: ['paper-citron', 'paper-olive', 'paper-sand'],
    avis: [{ name: 'Anaïs', quote: "Ça a été ressourçant sur tellement de plans. Tous les détails, les attentions et le cœur que vous avez mis toutes les trois m'ont fait un bien fou. Je me sens chanceuse d'avoir pu participer à cela." },
           { name: 'Nadège', quote: "J'ai été dans une bulle pendant quatre jours ! La déconnexion était totale. Une bulle de bienveillance avec des femmes inspirantes — et des moments de rire si précieux." },
           { name: 'Lucie', quote: "Que dire de plus que c'était génial ? Le programme était varié, et chaque moment de la journée était parfaitement choisi pour son activité." }] },
  { id: 'biarritz', name: 'Biarritz × Apricus', place: 'Côte basque', dates: '9 – 12 octobre 2025',
    wash: TERRA_WASH, texture: 'paper-terracotta', tags: ['Océan', 'Surf'],
    blurb: "Imaginez quatre jours de ressourcement total au bord de l'océan, entourée de femmes inspirantes et de professionnelles de la santé. Une invitation à se reconnecter à soi et à savourer l'instant : la dolce vita au rythme des vagues et du soleil.",
    long: [
      "Rendez-vous dans le Pays basque, dans une villa avec piscine chauffée à moins de quinze minutes de l'océan. Entre sessions de surf, yoga et ateliers bien-être mental, un programme comme à son habitude riche mais entièrement flexible — et une bonne dose de dolce far niente.",
      "Nous avons eu la chance de bénéficier de la présence de Florence derrière les fourneaux, et les retours sont clairs : beaucoup ont découvert leur nouvelle cheffe préférée ! Le parfait équilibre entre cuisine locale, plats sains pour les sessions de surf et réconfortants pour récupérer.",
      "Pour profiter pleinement de cette bulle hors du temps, nous avons proposé d'éteindre les téléphones — mais là encore, c'était un choix : rien n'est obligatoire. L'objectif est simple : savourer la dolce vita à son propre rythme. Une véritable célébration de la féminité et de l'inspiration collective.",
    ],
    programme: [['swim', "Sessions de surf & bain d'océan"], ['sun', "Yoga face au soleil levant"], ['heart', "Ateliers bien-être mental"], ['book', "Temps de repos (dolce far niente)"]],
    inclus: ['Hébergement en villa avec piscine', 'Tous les repas & boissons', 'Sessions de surf encadrées', 'Ateliers et soins'],
    gallery: ['paper-terracotta', 'paper-sand', 'paper-blush'],
    avis: [{ name: 'Janelle', quote: "Un mélange du meilleur de toutes les retraites que j'ai faites. Plus de liberté, plus d'attention sur chacune, des repas vraiment bons, moins de chichi — on se sent responsabilisée sur ses propres besoins." },
           { name: 'Léa', quote: "Ces quelques jours m'ont fait un bien fou. Merci pour ces beaux moments d'échange, votre bienveillance, ces belles rencontres. J'en ressors ressourcée et enrichie." }] },
  { id: 'provence', name: 'Soleil de Provence', place: 'Provence · 1ʳᵉ édition', dates: '24 – 27 avril 2025',
    wash: OLIVE_WASH, texture: 'paper-olive', tags: ['Yoga', 'Cucina'],
    blurb: "Niché au cœur de la Provence, ce séjour avait pour objectif d'offrir à un petit groupe de femmes l'expérience de la dolce vita. Au programme : ateliers de bien-être, yoga, découverte de la culture locale, et surtout beaucoup de dolce far niente…",
    long: [
      "Imaginez quatre jours de douceur, de sérénité et de reconnexion, entourée de femmes inspirantes, dans l'enchantement de la Provence en pleine floraison. Une invitation à ralentir et à savourer l'instant présent.",
      "Un programme riche mais entièrement flexible : ateliers sur le bien-être mental, yoga, séances d'intégration psychosomatique, découverte de la culture locale. Chacune choisit ce qui lui parle et crée sa propre expérience. Rien n'est imposé.",
      "Le séjour a pris place dans une maison typique provençale pleine de charme : chambres élégantes, espaces baignés de lumière, jardins parfumés, grande piscine et chaises longues. Une cuisine saine, colorée et généreuse, inspirée des saveurs méditerranéennes, a nourri le corps autant que l'esprit.",
      "Une célébration de la féminité et de l'inspiration collective, dans une ambiance de partage et de respect, où chacune a fait de ce séjour un espace de détente, d'exploration et de bonheur pur et simple.",
    ],
    programme: [['sun', "Yoga & souffle dans l'oliveraie"], ['leaf', "Cuisine du marché méditerranéenne"], ['walk', "Découverte de la culture locale"], ['heart', "Ateliers bien-être mental"]],
    inclus: ['Hébergement en mas provençal', 'Tous les repas du marché', 'Cours de yoga quotidiens', 'Ateliers & sorties culturelles'],
    gallery: ['paper-citron', 'paper-olive', 'paper-sand'],
    avis: [{ name: 'Elsa', quote: "Un séjour doux et apaisant, des ateliers intéressants et du yoga super agréable. Marie et Fanny laissent une liberté de participation et d'expression qui fait du bien. Je n'en garderai que de bons souvenirs !" },
           { name: 'Lidia', quote: "J'ai adoré vivre hors du temps avec ce séjour ! C'étaient trois jours vécus comme une semaine remplie d'émotions et de plaisir gustatif." }] },
  { id: 'jura', name: 'Retour aux sources', place: 'Forêts du Jura', dates: '21 – 22 septembre 2024',
    wash: OLIVE_WASH, texture: 'paper-olive', tags: ['Forêt', 'Sororité'],
    blurb: "Au cœur des forêts jurassiennes, un petit groupe de femmes a partagé un week-end hors du temps : se ressourcer, explorer, rire, pleurer, et repartir plus inspirées que jamais par l'énergie magique de la sororité.",
    long: [
      "Dans un monde où tout s'accélère, prendre du temps pour soi n'est pas un luxe, mais une nécessité. C'est dans cet esprit que s'est tenu notre séjour au cœur des forêts jurassiennes : une parenthèse enchantée pour se recentrer, reprendre des forces et savourer les bienfaits de la nature.",
      "La puissance de la sororité — cette connexion profonde entre femmes qui se soutiennent et s'inspirent mutuellement — a été au cœur du séjour. L'énergie collective s'est construite à travers des moments de partage d'expériences, d'émotions et de joie. Un espace qui a accueilli chaque femme dans son authenticité.",
      "Chaque activité a été conçue pour nourrir le corps, l'esprit et l'âme. Des ateliers de divers formats — l'un sur les relations, un autre sur la rencontre avec son enfant intérieur — ont permis d'explorer des thématiques profondes. Fanny (The Harmony Box) a proposé de cultiver force et souplesse à travers le yoga.",
      "Forêt apaisante, rivière scintillante et paysages inspirants ont offert un cadre parfait. Ce séjour a été une véritable bouffée d'air frais, un moment suspendu pour se retrouver et se réinventer — une promesse tenue de transformation douce et profonde.",
    ],
    programme: [['walk', 'Bain de forêt & marche consciente'], ['users-three', "Cercle de sororité au coin du feu"], ['book', 'Journal et introspection guidée'], ['heart', "Atelier « Enfant intérieur »"]],
    inclus: ['Hébergement en pleine nature', 'Repas faits maison', 'Yoga avec The Harmony Box', 'Activités nature encadrées'],
    gallery: ['paper-olive', 'paper-sage', 'paper-sand'],
    avis: [{ name: 'Elisa', quote: "Une véritable parenthèse enchantée. Ce week-end m'a permis de me recentrer et de déconnecter pleinement, entourée de personnes formidables, dans un cadre magique." },
           { name: 'Mylène', quote: "Grâce à l'approche solaire et bienveillante de Marie, nous avons vécu un séjour magique — j'en repars avec une conviction renouvelée de mon pouvoir de femme !" }] },
];

const ATELIERS = [
  { icon: 'heart', title: 'Cycle menstruel', essence: 'Votre cycle, une force',
    full: "Être une femme est source de puissance, votre cycle une force, la sororité un cadeau. Un espace pour se concentrer sur nos forces, se nourrir de l'énergie de la sororité, et apprendre à harmoniser sa vie — alimentation, activité, vie sociale — au fil des phases de son cycle." },
  { icon: 'users-three', title: 'Relations', essence: 'À commencer par soi',
    full: "La qualité de vos relations détermine la qualité de votre vie. Saviez-vous que le manque de soutien perçu est un facteur de risque équivalent au tabagisme ? Échanges de groupe et pratiques individuelles pour explorer toutes vos relations — et la plus importante : celle que vous entretenez avec vous-même." },
  { icon: 'book', title: 'Identité', essence: 'Devenir qui vous êtes',
    full: "Votre réalité est façonnée par la façon dont vous vous percevez. Trop souvent oubliée des méthodes de changement, l'identité est ici au cœur d'un voyage transformateur vers la réussite de vos objectifs et l'expression de votre plein potentiel." },
  { icon: 'sun', title: 'Enfant intérieur', essence: 'Réécrire son histoire',
    full: "Vous n'êtes pas responsable de ce qui vous est arrivé enfant, mais vous avez aujourd'hui la chance de réécrire votre histoire. Guidée vers la rencontre avec votre enfant intérieur : amorcer le pardon, reconsidérer les attentes, et apprendre à vous donner ce dont vous auriez eu besoin." },
  { icon: 'lemon', title: '(Péri)ménopause', essence: 'La comprendre pour mieux la vivre',
    full: "Elle touche la moitié de la population mondiale, et pourtant personne n'en parle. Un espace de partage et d'information pour comprendre ce qui se passe dans son corps, échanger sur son vécu avec d'autres femmes, et repartir avec des astuces concrètes pour apaiser ses symptômes." },
];

const TEMOINS = [
  { name: 'Anaïs', context: 'Provence · 2ᵉ édition', icon: 'map-pin',
    quote: "Ça a été ressourçant sur tellement de plans. Tous les détails, les attentions et le cœur que vous avez mis toutes les trois dans ce séjour m'ont fait un bien fou. Vous êtes géniales et je me sens chanceuse d'avoir pu participer à cela." },
  { name: 'Elisa', context: 'Retour aux sources', icon: 'map-pin',
    quote: "Une véritable parenthèse enchantée. Ce week-end m'a permis de me recentrer et de déconnecter pleinement, entourée de personnes formidables, dans un cadre magique." },
  { name: 'Léa', context: 'Biarritz', icon: 'map-pin',
    quote: "Ces quelques jours m'ont fait un bien fou. Merci les filles pour ces beaux moments d'échange, votre bienveillance, ces belles rencontres, cette parenthèse hors du temps. J'en ressors ressourcée et enrichie." },
  { name: 'Janelle', context: 'Biarritz', icon: 'map-pin',
    quote: "Un mélange du meilleur de toutes les retraites que j'ai faites. Plus de liberté, plus d'attention sur chacune, des repas vraiment bons, moins de chichi — comme si on était plus responsabilisée sur nos besoins personnels." },
  { name: 'Nadège', context: 'Provence · 2ᵉ édition', icon: 'map-pin',
    quote: "J'ai été dans une bulle pendant quatre jours ! La déconnexion était totale. Une parenthèse hors du temps, une bulle de bienveillance avec des femmes inspirantes — et les moments de rire étaient si précieux." },
  { name: 'Elsa', context: 'Provence · 1ʳᵉ édition', icon: 'map-pin',
    quote: "Un séjour doux et apaisant, des ateliers intéressants et du yoga super agréable. Marie et Fanny laissent une liberté de participation et d'expression qui fait du bien !" },
  { name: 'Mylène', context: 'Retour aux sources', icon: 'map-pin',
    quote: "Grâce à l'approche solaire et bienveillante de Marie, nous avons vécu un séjour magique — j'en repars avec une conviction renouvelée de mon pouvoir de femme !" },
  { name: 'Lucie', context: 'Provence · 2ᵉ édition', icon: 'map-pin',
    quote: "Que dire de plus que c'était génial ? Le programme était varié, et chaque moment de la journée était parfaitement choisi pour son activité." },
  { name: 'Lidia', context: 'Provence · 1ʳᵉ édition', icon: 'map-pin',
    quote: "J'ai adoré vivre hors du temps avec ce séjour ! C'étaient trois jours vécus comme une semaine remplie d'émotions et de plaisir gustatif." },
  { name: 'Nadine', context: 'Provence · 2ᵉ édition', icon: 'map-pin',
    quote: "Merci mille fois pour tout, je n'ai pas les mots pour exprimer à quel point c'était génial et à quel point ça m'a fait du bien." },
  { name: 'Lucie', context: 'Provence · 2ᵉ édition', icon: 'map-pin',
    quote: "On se l'est dit cent fois, mais merci du fond du cœur les filles. C'est si précieux et beau ce que vous proposez. J'espère à très bientôt !" },
];

const FAQS = [
  ["L'accompagnement ménopause, comment se déroule-t-il ?", "Un parcours sur mesure qui mêle outils scientifiques et pratiques de bien-être, pour traverser cette transition avec sérénité et retrouver votre énergie — à votre rythme."],
  ['Sous quel format ont lieu les sessions de suivi individualisé ?', "Via une plateforme sécurisée de visioconférence, accessibles partout dans le monde. Le présentiel reste possible si nos localisations respectives le permettent."],
  ['Pour qui est prévu le suivi individualisé ?', "Toute femme en quête de développement personnel : pour faire face à un défi, mieux se comprendre, ou restructurer sa manière de penser. Quel que soit votre chemin."],
  ['Les ateliers peuvent-ils être dispensés hors des séjours ?', "Oui — ils s'adaptent à de nombreux contextes : retraites, team-building, événements. Écrivez-moi pour une offre personnalisée."],
];

// Fond vidéo cinématique réutilisable — à placer dans un conteneur position:relative;overflow:hidden.
// Détecte automatiquement le clip (si présent) sinon affiche le fond animé de remplacement.
function VideoBg({ src, label = true }) {
  const ref = React.useRef(null);
  const [hasVideo, setHasVideo] = React.useState(false);
  React.useEffect(() => {
    let cancelled = false;
    fetch(src, { method: 'HEAD' }).then(r => {
      if (!cancelled && r.ok) {
        const v = ref.current; if (!v) return;
        v.src = src;
        v.addEventListener('loadeddata', () => !cancelled && setHasVideo(true), { once: true });
        v.load();
      }
    }).catch(() => {});
    return () => { cancelled = true; };
  }, [src]);
  return (
    <React.Fragment>
      <div className="vbg-fallback" aria-hidden="true" />
      <video ref={ref} className="vbg-video" autoPlay muted loop playsInline preload="auto" style={{ opacity: hasVideo ? 1 : 0 }} />
      <div className="vbg-scrim" aria-hidden="true" />
      {label && !hasVideo && (
        <span className="vbg-label">Vidéo d'ambiance · déposez votre clip dans <b>{src}</b></span>
      )}
    </React.Fragment>
  );
}

Object.assign(window, { Icon, Eyebrow, Button, useReveal, PhotoCluster, VideoBg, bookCall, CALENDLY_URL, RETREATS, ATELIERS, TEMOINS, FAQS, SUN_WASH, OLIVE_WASH, TERRA_WASH });
