/* Storefront home — Frise « BrandJourney » (RAFFINÉ par Fable / Claude Design — depuis la v2).
   Source factuelle : PDF « The Journey So Far » p.14-15 (2014→2025) — années / produits / ordre
   INCHANGÉS, chemins d'images INCHANGÉS. Polish DS : frise sémantique (time[datetime]),
   ligne de vie continue, révélation au scroll, barre de progression + flèches (desktop & mobile),
   prefers-reduced-motion respecté. Tokens réels --mg-yellow (le seed pointait --mg-honey* fantômes).
   Zéro dépendance externe. CSS limité à .bj-*. window.BrandJourney. */
function BrandJourney() {
  const { useRef, useEffect, useState } = React;

  const STEPS = [
    { y: "2014", m: "Nov",     dt: "2014-11", t: "Le début du voyage",     d: "« Juste correct » ne suffit pas. L'histoire ne fait que commencer.", img: "journey-2014" },
    { y: "2016", m: "Déc",     dt: "2016-12", t: "Le Z70",                 d: "Notre tout premier kit clavier.",                             img: "journey-2016" },
    { y: "2017", m: "Juin",    dt: "2017-06", t: "Les keycaps MDA",        d: "Le premier profil MDA en Chine.",                             img: "journey-2017" },
    { y: "2018", m: "Juin",    dt: "2018-06", t: "Big Bang & la marque",   d: "Premier set ortho-linéaire au monde. MelGeek est lancé.",     img: "journey-2018" },
    { y: "2019", m: "Jan–Oct", dt: "2019-01", t: "Alu, sans fil, wow",     d: "MOJO60 + Ember : notre premier clavier sans fil.",            img: "journey-2019" },
    { y: "2020", m: "Mai–Oct", dt: "2020-05", t: "Pro & Plastic",          d: "MOJO75 Pro gasket-mount ; collab The Wandering Earth.",       img: "journey-2020" },
    { y: "2021", m: "Août",    dt: "2021-08", t: "Clear is the New Cool",  d: "MOJO68 — l'un des premiers claviers mécaniques transparents.", img: "journey-2021" },
    { y: "2022", m: "Juil–Oct", dt: "2022-07", t: "Function Meets Fun",     d: "MOJO84, puis Pixel — compatible briques.",                    img: "journey-2022" },
    { y: "2023", m: "Mai–Déc", dt: "2023-05", t: "MagneticLeap : Cyber01", d: "Notre premier clavier magnétique. Une nouvelle ère commence.", img: "journey-2023" },
    { y: "2024", m: "Avr–Mai", dt: "2024-04", t: "Game On",               d: "MADE68 magnétique à lightbox. Nos premiers tournois.",        img: "journey-2024" },
    { y: "2025", m: "Avr–Déc", dt: "2025-04", t: "Passage au niveau supérieur", d: "Centauri, notre clavier phare. Avec sa souris Horus.",    img: "journey-2025" },
    { y: "2026", m: "coming soon", dt: "2026", t: "Cap sur la France !",     d: "Notre toute première édition AZERTY. À suivre…",              img: "journey-2026" },
  ];

  const railRef = useRef(null);
  const [prog, setProg] = useState(0);
  const [edge, setEdge] = useState({ s: true, e: false });

  useEffect(() => {
    const el = railRef.current;
    if (!el) return;
    const onScroll = () => {
      const max = el.scrollWidth - el.clientWidth;
      setProg(max > 0 ? el.scrollLeft / max : 0);
      setEdge({ s: el.scrollLeft <= 2, e: el.scrollLeft >= max - 2 });
    };
    // Desktop souris : molette verticale → défilement horizontal (« glissez » ne marche pas à la souris).
    const onWheel = (e) => {
      if (el.scrollWidth <= el.clientWidth) return;
      if (Math.abs(e.deltaY) <= Math.abs(e.deltaX)) return; // laisse le trackpad horizontal natif
      el.scrollLeft += e.deltaY;
      e.preventDefault();
    };
    onScroll();
    el.addEventListener("scroll", onScroll, { passive: true });
    el.addEventListener("wheel", onWheel, { passive: false });
    window.addEventListener("resize", onScroll);
    return () => { el.removeEventListener("scroll", onScroll); el.removeEventListener("wheel", onWheel); window.removeEventListener("resize", onScroll); };
  }, []);

  useEffect(() => {
    const el = railRef.current;
    if (!el) return;
    const cards = el.querySelectorAll(".bj-card");
    const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
    if (reduce || !("IntersectionObserver" in window)) { cards.forEach((c) => c.classList.add("is-in")); return; }
    const io = new IntersectionObserver(
      (ents) => ents.forEach((e) => { if (e.isIntersecting) { e.target.classList.add("is-in"); io.unobserve(e.target); } }),
      { threshold: 0.2 }
    );
    cards.forEach((c) => io.observe(c));
    return () => io.disconnect();
  }, []);

  const nudge = (dir) => {
    const el = railRef.current;
    if (!el) return;
    const card = el.querySelector(".bj-card");
    const gap = parseFloat(getComputedStyle(el).columnGap || getComputedStyle(el).gap) || 18;
    const step = card ? card.getBoundingClientRect().width + gap : el.clientWidth * 0.8;
    const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
    el.scrollBy({ left: dir * step, behavior: reduce ? "auto" : "smooth" });
  };

  return (
    <section className="bj" aria-labelledby="bj-title">
      <style>{`
        .bj{position:relative;overflow:hidden;background:var(--mg-bg);color:var(--mg-fg);border-top:1px solid var(--mg-border)}
        .bj-glow{position:absolute;inset:0;pointer-events:none;background:radial-gradient(64% 42% at 50% 0%,var(--mg-kb-glow),transparent 60%)}
        .bj-tex{position:absolute;inset:0;pointer-events:none;opacity:.45;-webkit-mask-image:linear-gradient(180deg,#000,transparent 70%);mask-image:linear-gradient(180deg,#000,transparent 70%)}
        .bj-in{position:relative;padding:clamp(56px,7vw,96px) 0 clamp(60px,7vw,96px)}

        .bj-head{max-width:var(--mg-maxw);margin:0 auto;padding:0 var(--mg-gutter);display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--mg-space-3)}
        .bj-tag{font-family:var(--mg-font-mono);font-weight:500;font-size:var(--mg-step--2);letter-spacing:var(--mg-track-wide);color:var(--mg-kb-accent)}
        .bj-head h2{margin:0;font-family:var(--mg-font-display);font-weight:900;font-size:clamp(1.9rem,4.4vw,3rem);line-height:1.04;letter-spacing:var(--mg-track-display)}
        .bj-head p{margin:0;max-width:48ch;font-size:var(--mg-step-1);line-height:1.5;color:var(--mg-fg-muted);text-wrap:pretty}

        .bj-tools{max-width:var(--mg-maxw);margin:clamp(22px,2.6vw,32px) auto 0;padding:0 var(--mg-gutter);display:flex;justify-content:flex-end;gap:10px}
        .bj-nav{width:44px;height:44px;display:grid;place-items:center;border:1px solid var(--mg-border);border-radius:var(--mg-radius-2);background:var(--mg-kb-tint);color:var(--mg-fg);cursor:pointer;transition:border-color var(--mg-dur-1) var(--mg-ease),background var(--mg-dur-1) var(--mg-ease),color var(--mg-dur-1) var(--mg-ease)}
        .bj-nav:hover:not(:disabled){border-color:var(--mg-kb-accent);color:var(--mg-kb-accent);background:var(--mg-kb-tint)}
        .bj-nav:disabled{opacity:.32;cursor:default}
        .bj-nav svg{width:18px;height:18px}

        .bj-track{display:flex;gap:clamp(14px,2vw,26px);margin-top:clamp(16px,2vw,22px);padding:8px var(--mg-gutter) 4px;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity;-webkit-overflow-scrolling:touch;scrollbar-width:none;touch-action:pan-x}
        .bj-track::-webkit-scrollbar{display:none}
        .bj-card{position:relative;scroll-snap-align:center;flex:0 0 clamp(228px,74vw,268px);display:flex;flex-direction:column}

        .bj-shot{position:relative;height:clamp(122px,15vw,158px);display:flex;align-items:flex-end;justify-content:center;padding:0 8px 12px}
        .bj-shot::after{content:"";position:absolute;left:50%;bottom:6px;transform:translateX(-50%);width:70%;height:15px;border-radius:50%;background:radial-gradient(ellipse at center,rgba(0,0,0,.6),transparent 72%);filter:blur(5px)}
        .bj-shot img{position:relative;max-width:100%;max-height:100%;object-fit:contain;filter:drop-shadow(0 14px 22px rgba(0,0,0,.6));transition:transform var(--mg-dur-2) var(--mg-ease),filter var(--mg-dur-2) var(--mg-ease)}
        .bj-card:hover .bj-shot img{transform:translateY(-5px) scale(1.02);filter:drop-shadow(0 18px 26px rgba(0,0,0,.7)) drop-shadow(0 0 18px var(--mg-kb-glow))}

        .bj-node{position:relative;height:30px;margin-top:2px}
        .bj-node::before{content:"";position:absolute;top:50%;left:calc(-1 * clamp(7px,1vw,13px));right:calc(-1 * clamp(7px,1vw,13px));height:1px;background:var(--mg-border);transform:translateY(-50%)}
        .bj-card:first-child .bj-node::before{left:50%}
        .bj-card:last-child .bj-node::before{right:50%}
        .bj-dot{position:absolute;top:50%;left:50%;width:12px;height:12px;border-radius:50%;background:var(--mg-kb-accent);box-shadow:0 0 0 4px var(--mg-kb-glow),0 0 12px var(--mg-kb-glow);transform:translate(-50%,-50%);transition:transform var(--mg-dur-2) var(--mg-ease),box-shadow var(--mg-dur-2) var(--mg-ease)}
        .bj-card:hover .bj-dot{transform:translate(-50%,-50%) scale(1.3);box-shadow:0 0 0 5px var(--mg-kb-glow),0 0 18px var(--mg-kb-glow)}

        .bj-txt{display:flex;flex-direction:column;gap:6px;padding:12px 6px 0;text-align:center}
        .bj-y{display:flex;align-items:baseline;justify-content:center;gap:8px}
        .bj-y time{font-family:var(--mg-font-display);font-weight:700;font-size:1.5rem;line-height:1;letter-spacing:-.02em;color:var(--mg-fg)}
        .bj-m{font-family:var(--mg-font-mono);font-size:0.656rem;font-weight:600;letter-spacing:.08em;color:var(--mg-fg-muted)}
        .bj-t{margin:0;font-family:var(--mg-font-display);font-weight:600;font-size:var(--mg-step-0);line-height:1.16;letter-spacing:var(--mg-track-tight);color:var(--mg-kb-accent)}
        .bj-d{margin:0;font-family:var(--mg-font-mono);font-size:var(--mg-step--2);line-height:1.5;color:var(--mg-fg-muted);text-wrap:pretty}

        .bj-progress{max-width:var(--mg-maxw);margin:clamp(18px,2.4vw,28px) auto 0;padding:0 var(--mg-gutter);display:flex}
        .bj-progress i{position:relative;flex:1;height:3px;border-radius:99px;background:var(--mg-border);overflow:hidden}
        .bj-progress i::after{content:"";position:absolute;inset:0;border-radius:99px;background:linear-gradient(90deg,var(--mg-kb-accent),var(--mg-kb-accent));transform-origin:left center;transform:scaleX(var(--p,0));transition:transform .12s linear}
        .bj-foot{max-width:var(--mg-maxw);margin:14px auto 0;padding:0 var(--mg-gutter);display:flex;align-items:center;justify-content:space-between;font-family:var(--mg-font-mono);font-size:var(--mg-step--2);letter-spacing:.04em;color:var(--mg-fg-muted)}
        .bj-foot b{color:var(--mg-fg);font-weight:600}
        .bj-foot em{font-style:normal;display:inline-flex;align-items:center;gap:7px;letter-spacing:.06em;font-size:0.6875rem}

        .bj-reveal{opacity:0;transform:translateY(20px);transition:opacity .6s var(--mg-ease),transform .6s var(--mg-ease);transition-delay:calc(var(--i,0) * 55ms)}
        .bj-reveal.is-in{opacity:1;transform:none}

        @media (max-width:720px){.bj-tools{display:none}}
        @media (prefers-reduced-motion:reduce){
          .bj-track{scroll-behavior:auto}
          .bj-reveal{opacity:1;transform:none;transition:none}
          .bj-shot img,.bj-dot,.bj-nav{transition:none}
        }
      `}</style>

      <div className="bj-glow" aria-hidden="true"></div>
      <div className="bj-tex mg-honeycomb" aria-hidden="true"></div>

      <div className="bj-in">
        <div className="bj-head">
          <span className="bj-tag">〔 2014 → 2026 〕</span>
          <h2 id="bj-title" className="mg-grad-text">Le parcours jusqu'ici</h2>
          <p>D'une idée simple à une communauté mondiale de joueurs créatifs.</p>
        </div>

        <div className="bj-tools" aria-hidden="true">
          <button className="bj-nav" type="button" onClick={() => nudge(-1)} disabled={edge.s} aria-label="Jalon précédent">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M15 5l-7 7 7 7" /></svg>
          </button>
          <button className="bj-nav" type="button" onClick={() => nudge(1)} disabled={edge.e} aria-label="Jalon suivant">
            <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M9 5l7 7-7 7" /></svg>
          </button>
        </div>

        <div className="bj-track" ref={railRef} role="list" aria-label="Chronologie MelGeek 2014–2025">
          {STEPS.map((s, i) => (
            <article className="bj-card bj-reveal" role="listitem" key={s.y} style={{ "--i": i }}>
              <div className="bj-shot">
                <img src={"../../assets/img/journey/" + s.img + ".png"} alt={"MelGeek " + s.y + " — " + s.t} loading="lazy" />
              </div>
              <div className="bj-node"><span className="bj-dot" aria-hidden="true"></span></div>
              <div className="bj-txt">
                <div className="bj-y"><time dateTime={s.dt}>{s.y}</time><span className="bj-m">{s.m}</span></div>
                <h3 className="bj-t">{s.t}</h3>
                <p className="bj-d">{s.d}</p>
              </div>
            </article>
          ))}
        </div>

        <div className="bj-progress" aria-hidden="true"><i style={{ "--p": Math.max(prog, 0.06) }}></i></div>
        <div className="bj-foot">
          <b>2014</b>
          <em aria-hidden="true">
            <svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round" strokeLinejoin="round"><path d="M5 12h14M13 6l6 6-6 6" /></svg>
            Défilez pour en savoir plus
          </em>
          <b>2026</b>
        </div>
      </div>
    </section>
  );
}
window.BrandJourney = BrandJourney;
