/* PulseSections1.jsx — PULSE page · Header, Hero + HKI Radar, Footer, Problem
 * Loaded after Icons.jsx. Classic babel script: top-level consts/functions
 * are shared with the other PULSE section files. Names are PULSE-prefixed to
 * avoid collisions. Guardrails: copper/amber = PULSE active; cobalt/teal =
 * use-case/decision/evidence; green = status only; no invented metrics/IDs.
 */

/* ---------- responsive hook ----------
 * Single source of truth for the "mobile" layout switch. Reads the live
 * viewport (works standalone AND inside the design-canvas iframes, where the
 * frame width drives the media query). Keeps the <body> `is-mobile` class in
 * sync so CSS-only branches (workflow accordion, header chrome) match the JS
 * component branches (compact radar, platform accordion). Updates on resize.
 */
function usePulseMobile(query = '(max-width: 760px)') {
  const read = () => typeof window !== 'undefined' && window.matchMedia(query).matches;
  const [mobile, setMobile] = React.useState(read);
  React.useEffect(() => {
    const mq = window.matchMedia(query);
    const on = () => setMobile(mq.matches);
    on();
    if (mq.addEventListener) mq.addEventListener('change', on);else mq.addListener(on);
    return () => {if (mq.removeEventListener) mq.removeEventListener('change', on);else mq.removeListener(on);};
  }, [query]);
  React.useEffect(() => {
    document.body.classList.toggle('is-mobile', mobile);
  }, [mobile]);
  return mobile;
}

/* ---------- shared reveal hook ---------- */
function usePulseReveal(threshold = 0.2) {
  const ref = React.useRef(null);
  const [shown, setShown] = React.useState(false);
  React.useEffect(() => {
    if (!ref.current) return;
    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {setShown(true);return;}
    const io = new IntersectionObserver((es) => {
      es.forEach((e) => {if (e.isIntersecting) {setShown(true);io.disconnect();}});
    }, { threshold });
    io.observe(ref.current);
    return () => io.disconnect();
  }, [threshold]);
  return [ref, shown];
}

/* =========================================================
   HEADER  (1:1 with Novemcore homepage — dropdowns + mobile drawer)
   ========================================================= */
const PULSE_OPP_SCAN = "/de/pulse-opportunity-scan";
const PULSE_PLATFORM_PAGE = "pulse.html";
const PULSE_EXPERTISE = "/de/leistungen";
const PULSE_NAV = [
  { label: 'PULSE', sub: [
    { label: 'Plattform',        href: PULSE_PLATFORM_PAGE },
    { label: 'Opportunity Scan', href: PULSE_OPP_SCAN },
  ]},
  { label: 'Leistungen', href: '#' },
  { label: 'Fallstudien', href: '#' },
  { label: 'Ressourcen', sub: [
    { label: 'Fallstudien',   href: '#' },
    { label: 'Automations',   href: '#' },
    { label: 'Tools',         href: '#' },
    { label: 'Podcast',       href: '#' },
    { label: 'Newsletter',    href: '#' },
    { label: 'Blog & Papers', href: '#' },
  ]},
  { label: 'Über uns', sub: [
    { label: 'Unternehmen', href: '#' },
    { label: 'Karriere',    href: '#' },
    { label: 'Kontakt',     href: '#' },
  ]},
];

function PulseMobileMenu({ isOpen, onClose }) {
  React.useEffect(() => {
    document.body.style.overflow = isOpen ? 'hidden' : '';
    return () => { document.body.style.overflow = ''; };
  }, [isOpen]);
  return (
    <div className={'nc-mob-menu' + (isOpen ? ' is-open' : '')}>
      <div className="nc-mob-menu__backdrop" onClick={onClose} aria-hidden="true" />
      <nav className="nc-mob-menu__panel" role="navigation" aria-label="Mobile Navigation">
        <div className="nc-mob-menu__head">
          <img src="assets/logos/novemcore-black.svg" alt="Novemcore" className="nc-mob-menu__logo" />
          <button className="nc-mob-menu__close" onClick={onClose} aria-label="Menü schließen">
            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8" strokeLinecap="round"><path d="M18 6L6 18M6 6l12 12"/></svg>
          </button>
        </div>
        <div className="nc-mob-menu__links">
          {PULSE_NAV.map((n) =>
          <div key={n.label} className="nc-mob-item">
              <a href={n.href || (n.sub && n.sub[0].href) || '#'}
            className="nc-mob-item__link" onClick={onClose}>
                {n.label}
              </a>
              {n.sub &&
            <div className="nc-mob-item__sub">
                  {n.sub.map((s) =>
              <a key={s.label} href={s.href} className="nc-mob-item__sublink" onClick={onClose}>
                      {s.label}
                    </a>
              )}
                </div>
            }
            </div>
          )}
        </div>
        <div className="nc-mob-menu__cta">
          <a className="btn btn--pulse" href={PULSE_OPP_SCAN}
          style={{ width: '100%', justifyContent: 'center' }} onClick={onClose}>
            Scan buchen <Ico.arrowSm />
          </a>
        </div>
      </nav>
    </div>);

}

function PulseHeader() {
  const [lang, setLang] = React.useState('DE');
  const [menuOpen, setMenuOpen] = React.useState(false);
  // Nav + lang are always rendered and hidden by CSS at ≤1024px; the hamburger
  // is always rendered and shown by CSS at ≤1024px. This keeps the header
  // correct at every width — including the tablet frame — without JS branching.
  return (
    <>
      <header className="nc-header">
        <div className="nc-header__inner">
          <a href="index.html" className="nc-header__brand" aria-label="Novemcore">
            <img src="assets/logos/novemcore-black.svg" alt="Novemcore" />
          </a>
          <nav className="nc-header__nav" aria-label="Primary">
            {PULSE_NAV.map((n) =>
            <div key={n.label} className={'nc-nav-item' + (n.sub ? ' has-sub' : '')}>
                <a href={n.href || (n.sub && n.sub[0].href) || '#'} className="nc-header__navlink">
                  {n.label}
                  {n.sub && <span className="nc-nav-caret" aria-hidden="true"><Ico.chev /></span>}
                </a>
                {n.sub &&
              <div className="nc-dropdown" role="menu">
                    <div className="nc-dropdown__inner">
                      {n.sub.map((s) =>
                <a key={s.label} href={s.href} className="nc-dropdown__link" role="menuitem">{s.label}</a>
                )}
                    </div>
                  </div>
              }
              </div>
            )}
          </nav>
          <div className="nc-header__right">
            <div className="nc-header__lang" role="group" aria-label="Sprache">
              {['DE', 'EN'].map((l) =>
              <button key={l}
              className={'nc-header__langBtn' + (lang === l ? ' is-on' : '')}
              onClick={() => setLang(l)} aria-pressed={lang === l}>{l}</button>
              )}
            </div>
            <a className="btn btn--pulse" href={PULSE_OPP_SCAN}>Scan buchen <Ico.arrowSm /></a>
            <button className="nc-header__menu" aria-label="Menü öffnen" aria-expanded={menuOpen}
            onClick={() => setMenuOpen(true)}><Ico.menu /></button>
          </div>
        </div>
      </header>
      <PulseMobileMenu isOpen={menuOpen} onClose={() => setMenuOpen(false)} />
    </>);

}

/* =========================================================
   HUMAN KNOWLEDGE INTELLIGENCE RADAR  (hero visual)
   Sequence: center → 3 platform layers → primary use cases →
   additional use cases → final (center + layers held).
   Hover any node updates the caption. Reduced motion → final.
   ========================================================= */
const RADAR_LAYERS = [
{ key: 'agent', angle: -90, label: 'AI Interview Agent',
  cap: { h: 'AI Interview Agent', t: 'Führt strukturierte Interviews und fragt kontextbezogen nach.' },
  icon: 'msg' },
{ key: 'context', angle: 135, label: 'Knowledge & Context Layer',
  cap: { h: 'Knowledge & Context Layer', t: 'Verbindet Projektkontext, Wissensbasen, Dokumente und Anforderungen.' },
  icon: 'layers' },
{ key: 'analysis', angle: 45, label: 'Analysis Engine',
  cap: { h: 'Analysis Engine', t: 'Erkennt Muster, Widersprüche, Prioritäten, Risiken und Potenziale.' },
  icon: 'spark' }];


const RADAR_USECASES = [
{ key: 'process', angle: -67.5, strong: true, label: 'Process & Automation',
  cap: { h: 'Prozessrealität sichtbar machen', t: 'Erkennen, wo Arbeit stockt, manueller Aufwand entsteht und Automatisierung sinnvoll ansetzt.' }, icon: 'cog' },
{ key: 'reqs', angle: -22.5, strong: true, label: 'Requirements & Software',
  cap: { h: 'Anforderungen strukturiert verstehen', t: 'Stakeholderwissen, Prozesskontext, Fit-Gap-Fragen für bessere Entscheidungen bündeln.' }, icon: 'doc' },
{ key: 'transform', angle: -112.5, strong: true, label: 'Transformation & Strategy',
  cap: { h: 'Transformation überprüfbar machen', t: 'Barrieren, Risiken, Verständnis und Umsetzungsfähigkeit strukturiert erfassen.' }, icon: 'road' },
{ key: 'customer', angle: 22.5, strong: false, label: 'Kundenanalyse',
  cap: { h: 'Kundenwissen systematisch erheben', t: 'Kundenperspektiven strukturiert erfassen und wiederkehrend vergleichbar machen.' }, icon: 'users' },
{ key: 'risk', angle: 67.5, strong: false, label: 'Risikoerkennung',
  cap: { h: 'Risiken früher erkennen', t: 'Schwache Signale, Abhängigkeiten und kritische Wissenslücken sichtbar machen.' }, icon: 'warn' },
{ key: 'dd', angle: 112.5, strong: false, label: 'Due Diligence & Wertsteigerung',
  cap: { h: 'Schneller verstehen, wo Wert entsteht', t: 'Prozessrealität, Risiken und Verbesserungspotenziale für Value Creation strukturieren.' }, icon: 'shield' },
{ key: 'innovation', angle: 157.5, strong: false, label: 'Innovation & Wachstum',
  cap: { h: 'Wachstumshebel entdecken', t: 'Ideen, Marktimpulse und interne Perspektiven zu konkreten Chancen verdichten.' }, icon: 'zap' },
{ key: 'wikis', angle: 202.5, strong: false, label: 'Wissenssicherung / Wikis',
  cap: { h: 'Wissen sichern, bevor es verloren geht', t: 'Erfahrungswissen aus den Köpfen von Mitarbeitenden in nutzbare Wissensbasen überführen.' }, icon: 'book' }];


const RADAR_CENTER_CAP = { h: 'Menschliches Wissen wird zur nutzbaren Evidenz.',
  t: 'PULSE verbindet Interviews, Kontext und Analyse zu wiederverwendbarer Entscheidungsgrundlage.' };

function radarPos(angleDeg, r) {
  const a = angleDeg * Math.PI / 180;
  return { x: 50 + r * Math.cos(a), y: 50 + r * Math.sin(a) };
}

function PulseRadar({ compact }) {
  const R_IN = 30,R_OUT = 40;
  const [stage, setStage] = React.useState(0); // 0..4
  const [done, setDone] = React.useState(false);
  const [hover, setHover] = React.useState(null); // node key

  React.useEffect(() => {
    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
      setStage(4);setDone(true);return;
    }
    const ids = [
    setTimeout(() => setStage(1), 400), // center fades in + copper edge
    setTimeout(() => setStage(2), 1700), // three platform layers
    setTimeout(() => setStage(3), 3200), // primary use cases connect
    setTimeout(() => setStage(4), 4700), // secondary use cases, quieter
    setTimeout(() => setDone(true), 6000) // final held state
    ];
    return () => ids.forEach(clearTimeout);
  }, []);

  const layerVisible = stage >= 2;
  const strongVisible = stage >= 3;
  const allVisible = stage >= 4;

  // Resolve caption from hover or default center
  let cap = RADAR_CENTER_CAP,capCool = false;
  if (hover) {
    const L = RADAR_LAYERS.find((n) => n.key === hover);
    const U = RADAR_USECASES.find((n) => n.key === hover);
    if (L) {cap = L.cap;capCool = false;}
    if (U) {cap = U.cap;capCool = true;}
  }

  const allNodes = [
  ...RADAR_LAYERS.map((n) => ({ ...n, ring: 'in' })),
  ...RADAR_USECASES.map((n) => ({ ...n, ring: 'out' }))];


  // Touch-friendly: tap a chip to pin its caption, tap again to clear.
  const onPick = (key) => setHover((h) => h === key ? null : key);

  // ---- Mobile: compact list of use-case + layer chips around the center ----
  if (compact) {
    return (
      <div className="radarc">
        <div className={'radarc__center' + (stage >= 1 ? ' is-on' : '')}>
          <img src="assets/logos/pulse-mark.png" alt="" />
          <div className="radarc__centerLbl">Human Knowledge Intelligence</div>
          <div className="radarc__centerSub">PULSE</div>
        </div>
        <div className={'radar__caption' + (capCool ? ' radar__caption--cool' : '')} aria-live="polite">
          <span className="radar__capRule" aria-hidden="true" />
          <div className="radar__capBody" key={cap.h}>
            <div className="radar__capHead">{cap.h}</div>
            <div className="radar__capText">{cap.t}</div>
          </div>
        </div>
        <div className="radarc__group">
          <div className="radarc__groupLbl">Plattform-Schichten</div>
          <div className="radarc__chips">
            {RADAR_LAYERS.map((n) =>
            <button key={n.key} type="button"
            className={'radarc__chip radarc__chip--layer' + (hover === n.key ? ' is-sel' : '') + (layerVisible ? '' : ' is-hidden')}
            onClick={() => onPick(n.key)} aria-pressed={hover === n.key}>
                <span className="radarc__chipIco">{Ico[n.icon] && Ico[n.icon]()}</span>{n.label}
              </button>
            )}
          </div>
        </div>
        <div className="radarc__group">
          <div className="radarc__groupLbl">Anwendungsfelder</div>
          <div className="radarc__chips radarc__chips--uc">
            {RADAR_USECASES.map((n) => {
              const vis = n.strong ? strongVisible : allVisible;
              return (
                <button key={n.key} type="button"
                className={'radarc__chip radarc__chip--uc' + (n.strong ? ' is-strong' : '') + (hover === n.key ? ' is-sel' : '') + (vis ? '' : ' is-hidden')}
                onClick={() => onPick(n.key)} aria-pressed={hover === n.key}>
                  <span className="radarc__chipIco">{Ico[n.icon] && Ico[n.icon]()}</span>{n.label}
                </button>);

            })}
          </div>
        </div>
      </div>);

  }

  return (
    <div className={'radar' + (done ? ' radar--final' : '')}>
      <div className="radar__field">
        <svg className="radar__svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid meet" aria-hidden="true">
          {/* rings */}
          <circle cx="50" cy="50" r={R_IN} fill="none" stroke="rgba(217,119,87,0.22)"
          strokeWidth="0.4" strokeDasharray="0.6 1.6" vectorEffect="non-scaling-stroke"
          style={{ opacity: stage >= 2 ? 1 : 0, transition: 'opacity 500ms ease' }} />
          <circle cx="50" cy="50" r={R_OUT} fill="none" stroke="rgba(120,170,255,0.18)"
          strokeWidth="0.4" strokeDasharray="0.6 1.6" vectorEffect="non-scaling-stroke"
          style={{ opacity: stage >= 3 ? 1 : 0, transition: 'opacity 500ms ease' }} />
          {/* spokes to layers */}
          {RADAR_LAYERS.map((n) => {
            const p = radarPos(n.angle, R_IN);
            return <line key={n.key} x1="50" y1="50" x2={p.x} y2={p.y}
            stroke={hover === n.key ? 'rgba(232,153,104,0.85)' : 'rgba(217,119,87,0.32)'}
            strokeWidth="0.4" vectorEffect="non-scaling-stroke"
            style={{ opacity: layerVisible ? 1 : 0, transition: 'opacity 500ms ease, stroke 240ms ease' }} />;
          })}
          {/* spokes to use cases (from inner ring outward) */}
          {RADAR_USECASES.map((n) => {
            const pi = radarPos(n.angle, R_IN);
            const po = radarPos(n.angle, R_OUT);
            const vis = n.strong ? strongVisible : allVisible;
            return <line key={n.key} x1={pi.x} y1={pi.y} x2={po.x} y2={po.y}
            stroke={hover === n.key ? 'rgba(0,194,209,0.8)' : n.strong ? 'rgba(0,194,209,0.34)' : 'rgba(120,170,255,0.2)'}
            strokeWidth="0.4" vectorEffect="non-scaling-stroke"
            style={{ opacity: vis ? 1 : 0, transition: 'opacity 500ms ease, stroke 240ms ease' }} />;
          })}
        </svg>

        {/* center module */}
        <div className={'radar__center' + (stage >= 1 ? '' : ' is-hidden')}
        onMouseEnter={() => done && setHover(null)}>
          <img src="assets/logos/pulse-mark.png" alt="" className="radar__centerMark" />
          <div className="radar__centerLbl">Human Knowledge Intelligence</div>
          <div className="radar__centerSub">PULSE</div>
        </div>

        {/* nodes */}
        {allNodes.map((n) => {
          const r = n.ring === 'in' ? R_IN : R_OUT;
          const p = radarPos(n.angle, r);
          const vis = n.ring === 'in' ? layerVisible : n.strong ? strongVisible : allVisible;
          const cls = n.ring === 'in' ?
          'radar__node radar__layer' :
          'radar__node radar__uc' + (n.strong ? ' radar__uc--strong' : ' is-faint');
          return (
            <div key={n.key}
            className={cls + (vis ? '' : ' is-hidden')}
            style={{ left: p.x + '%', top: p.y + '%' }}
            onMouseEnter={() => done && setHover(n.key)}
            onMouseLeave={() => done && setHover(null)}
            onFocus={() => done && setHover(n.key)}
            onBlur={() => done && setHover(null)}
            tabIndex={done ? 0 : -1}
            role="button"
            aria-label={n.label}>
              <span className="radar__dot">{Ico[n.icon] && Ico[n.icon]()}</span>
              <span className={'radar__lbl' + (n.ring === 'in' ? ' radar__layerLbl--copper' : '')}>{n.label}</span>
            </div>);

        })}
      </div>

      {/* caption */}
      <div className={'radar__caption' + (capCool ? ' radar__caption--cool' : '')} aria-live="polite">
        <span className="radar__capRule" aria-hidden="true" />
        <div className="radar__capBody" key={cap.h}>
          <div className="radar__capHead">{cap.h}</div>
          <div className="radar__capText">{cap.t}</div>
        </div>
      </div>
    </div>);

}

/* =========================================================
   HERO  — Section 01
   ========================================================= */
function PulseHero({ mobile }) {
  return (
    <section className="phero" data-screen-label="01 Hero — PULSE">
      <div className="wrap wrap--wide">
        <div className="phero__inner">
          <div className="phero__left">
            <div className="eyebrow phero__eyebrow">PULSE HUMAN KNOWLEDGE INTELLIGENCE</div>
            <h1 className="phero__h1">
              <span className="acc-pulse">PULSE</span> macht Wissen für Entscheidungen nutzbar.
            </h1>
            <p className="phero__body">
              PULSE verbindet AI-gestützte Interviews, Kontextwissen und Analysen,
              um verborgenes Erfahrungswissen, Anforderungen, Prozessrealität und
              Potenziale sichtbar zu machen.
            </p>
            <div className="phero__ctas">
              <a className="btn btn--pulse btn--hero-cta" href={PULSE_OPP_SCAN}>Scan buchen <Ico.arrow /></a>
              <a className="btn btn--secondary-dark btn--hero-cta" href={PULSE_EXPERTISE}>Unsere Expertise <Ico.arrowSm /></a>
            </div>
          </div>
          <div className="phero__right">
            <PulseRadar compact={mobile} />
          </div>
        </div>
      </div>
    </section>);

}

/* =========================================================
   PROBLEM  — Section 02 · navy base, copper highlights
   Layered "Human Knowledge Below The Surface" visual: three
   knowledge layers (documented → lived reality → experience),
   a PULSE extraction beam, and the structured evidence it lifts
   out. Hovering a pain card highlights its source layer +
   evidence card; hovering a layer highlights its pain cards.
   ========================================================= */

/* Three depth layers. ev = the structured evidence PULSE lifts out. */
const PP_LAYERS = [
{ key: 'doc', depth: 'OBERFLÄCHE', name: 'Dokumentiertes Wissen',
  ex: ['SOPs', 'Prozessdokumente', 'Reports', 'Tickets', 'Vorhandene Daten'],
  ev: { icon: 'doc', t: 'Prozess-Soll', tag: 'STRUKTUR' } },
{ key: 'real', depth: 'DARUNTER', name: 'Gelebte Realität',
  ex: ['Ausnahmen', 'Übergaben', 'Manuelle Arbeit', 'Informelle Entscheidungen'],
  ev: { icon: 'flow', t: 'Reale Abläufe', tag: 'EVIDENZ' } },
{ key: 'exp', depth: 'TIEFENSCHICHT', name: 'Erfahrungswissen',
  ex: ['Risiken', 'Abhängigkeiten', 'Kundenwissen', 'Expertenwissen', 'Implizite Regeln'],
  ev: { icon: 'brain', t: 'Implizites Wissen', tag: 'EVIDENZ' } }];


/* Six pain cards. link = which layer/beam element they highlight. */
const PP_CARDS = [
{ t: 'Wissen geht verloren', icon: 'book', link: 'exp',
  d: 'Kritisches Erfahrungswissen bleibt in Köpfen und verschwindet, wenn Rollen wechseln oder Mitarbeitende ausscheiden.' },
{ t: 'Prozesse sind anders als Dokumente', icon: 'flow', link: 'real',
  d: 'SOPs zeigen selten Ausnahmen, Rückfragen, lokale Workarounds und tatsächliche Übergaben.' },
{ t: 'Daten zeigen nicht alles', icon: 'chart', link: 'doc',
  d: 'Process Mining und Systemdaten helfen nur dort, wo relevante Daten überhaupt verfügbar und interpretierbar sind.' },
{ t: 'Workshops verzerren Perspektiven', icon: 'users', link: 'real',
  d: 'Gruppendynamik, Hierarchie und Zeitdruck verhindern oft ehrliche, vergleichbare Einsichten.' },
{ t: 'Interviews skalieren schlecht', icon: 'msg', link: 'exp',
  d: 'Manuelle Interviewreihen sind aufwendig, inkonsistent und schwer über viele Stimmen hinweg auszuwerten.' },
{ t: 'Einmalige Erhebungen veralten', icon: 'clock', link: 'beam',
  d: 'Statische Analysen verlieren schnell an Wert, wenn Prozesse, Teams und Prioritäten sich verändern.' }];


function PulseProblem() {
  const [visRef, visShown] = usePulseReveal(0.2);
  const [gridRef, gridShown] = usePulseReveal(0.12);
  const [stage, setStage] = React.useState(0); // 0 → 5 reveal sequence
  const [hot, setHot] = React.useState(null); // 'doc' | 'real' | 'exp' | 'beam'

  React.useEffect(() => {
    if (!visShown) return;
    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {setStage(5);return;}
    const ids = [
    setTimeout(() => setStage(1), 140), // documented layer
    setTimeout(() => setStage(2), 420), // lived reality
    setTimeout(() => setStage(3), 700), // experience
    setTimeout(() => setStage(4), 1020), // extraction beam draws
    setTimeout(() => setStage(5), 1340) // structured evidence lifts out
    ];
    return () => ids.forEach(clearTimeout);
  }, [visShown]);

  return (
    <section className="psec pulse-problem" data-screen-label="02 Problem">
      <div className="wrap wrap--wide">
        <div className="pp-top">
          <div className="pp-copy">
            <div className="eyebrow eyebrow--cyan">DAS UNGENUTZTE WISSENSPOTENZIAL</div>
            <h2 className="psec__h2">Es gibt häufig kein Datenproblem,<br />sondern ein <span className="acc-pulse">unstrukturiertes Wissensproblem.</span></h2>
            <p className="psec__lead">Entscheidendes Wissen liegt nicht in Systemen, sondern bei bei den Mitarbeitenden, Kunden, in Routinen, Ausnahmen und Erfahrung. Es ist verteilt, implizit, schwer vergleichbar und oft nicht dort verfügbar, wo Entscheidungen vorbereitet werden.



            </p>
            <p className="pp-complement">PULSE verknüpft Wissen und Datenpunkte. Bisher verborgenes Wissen wird erstmals nutzbar und durch AI Kontext-Analysen erweitert. 


            </p>
          </div>

          {/* ---- Layered visual: knowledge below the surface ---- */}
          <div ref={visRef} className={'hkv stage-' + stage}>
            <div className="hkv__cap mono">Menschliches Wissen unter der Oberfläche</div>
            <div className="hkv__body">
              <div className="hkv__layers">
                {PP_LAYERS.map((L, i) =>
                <div key={L.key}
                className={'hkv__layer hkv__layer--' + L.key + (stage > i ? ' is-on' : '') + (hot === L.key ? ' is-hot' : '')}
                onMouseEnter={() => setHot(L.key)}
                onMouseLeave={() => setHot(null)}>
                    <div className="hkv__layerHead">
                      <span className="hkv__depth mono">{L.depth}</span>
                      <span className="hkv__layerName">{L.name}</span>
                    </div>
                    <div className="hkv__chips">
                      {L.ex.map((e) => <span key={e} className="hkv__chip">{e}</span>)}
                    </div>
                  </div>
                )}
              </div>

              {/* extraction beam */}
              <div className={'hkv__beam' + (stage >= 4 ? ' is-on' : '') + (hot === 'beam' ? ' is-hot' : '')}
              aria-hidden="true"
              onMouseEnter={() => setHot('beam')}
              onMouseLeave={() => setHot(null)}>
                <span className="hkv__beamLine" />
                <span className="hkv__beamNode"><img src="assets/logos/pulse-mark.png" alt="" /></span>
              </div>

              {/* structured evidence */}
              <div className="hkv__evidence">
                <div className={'hkv__evHead mono' + (stage >= 5 ? ' is-on' : '')}>Strukturierte Evidenz</div>
                {PP_LAYERS.map((L, i) =>
                <div key={L.key} style={{ '--ei': i }}
                className={'hkv__ev hkv__ev--' + L.key + (stage >= 5 ? ' is-on' : '') + (hot === L.key ? ' is-hot' : '')}
                onMouseEnter={() => setHot(L.key)}
                onMouseLeave={() => setHot(null)}>
                    <span className="hkv__evIco">{Ico[L.ev.icon]()}</span>
                    <span className="hkv__evText">{L.ev.t}</span>
                    <span className="hkv__evTag mono">{L.ev.tag}</span>
                  </div>
                )}
              </div>
            </div>
            <div className="hkv__mark mono">
              <img src="assets/logos/pulse-mark.png" alt="" />
              PULSE hebt strukturierte Evidenz aus allen Schichten
            </div>
          </div>
        </div>

        <div ref={gridRef} className={'pp-grid' + (gridShown ? ' is-shown' : '')}>
          {PP_CARDS.map((c, i) =>
          <div key={c.t} style={{ '--i': i }}
          className={'pp-card pp-card--' + c.link + (hot && hot === c.link ? ' is-hot' : '')}
          onMouseEnter={() => setHot(c.link)}
          onMouseLeave={() => setHot(null)}>
              <span className="pp-card__ico">{Ico[c.icon]()}</span>
              <h3 className="pp-card__title">{c.t}</h3>
              <p className="pp-card__body">{c.d}</p>
            </div>
          )}
        </div>
      </div>
    </section>);

}
