/* Stethos — live, self-explanatory motion graphics for the landing page.
   DataFlowLive (3+2 sources → model → score), DivergeLive, BaselineLive, HardwareLive. */
const DSG = window.LatentHealthDesignSystem_2f3a71;
const { Badge: GBadge } = DSG;
const { useState, useEffect, useRef } = React;

/* Scales a fixed-size stage to its container width. */
function ScaledStage({ w, h, children, style, maxScale = 1 }) {
  const ref = useRef(null); const [scale, setScale] = useState(1);
  useEffect(() => {
    function fit() { if (ref.current) setScale(Math.min(maxScale, ref.current.clientWidth / w)); }
    fit(); window.addEventListener('resize', fit); return () => window.removeEventListener('resize', fit);
  }, []);
  return (
    <div ref={ref} style={{ width: '100%', ...style }}>
      <div style={{ height: h * scale }}>
        <div style={{ width: w, height: h, transform: `scale(${scale})`, transformOrigin: 'top left', position: 'relative' }}>{children}</div>
      </div>
    </div>
  );
}

/* ------------------------------------------------ DataFlowLive (3 left, 2 right) */
const FLOW_LEFT = [
  { n: 'Audio Intelligence', s: 'call-bell intercom mic', chips: ['prosody', 'distress', 'ambient'], tag: 'EXISTING' },
  { n: 'Request & Response', s: 'nurse-call system', chips: ['call freq', 'latency', 'repeats'], tag: 'EXISTING' },
  { n: 'Presence & Continuity', s: 'RTLS badges · door sensor', chips: ['visit cadence', 'continuity'], tag: 'EXISTING' },
];
const FLOW_RIGHT = [
  { n: 'Room Environment', s: 'one small sensor', chips: ['sleep', 'light', 'temp'], tag: 'NEW' },
  { n: 'Clinical Events', s: 'EMR · HL7/FHIR', chips: ['analgesia', 'meals', 'LOS'], tag: 'EXISTING' },
];
const WIRES = [
  'M 276 84 C 380 84 410 175 456 206',
  'M 276 226 C 370 226 410 224 452 224',
  'M 276 368 C 380 368 410 275 456 242',
  'M 724 154 C 620 154 592 190 548 210',
  'M 724 318 C 620 318 592 252 548 238',
];
function FlowBox({ d, hot, style, built = true, index = 0, fromLeft = true }) {
  return (
    <div style={{ position: 'absolute', width: 252, background: 'var(--surface-1)', border: `1px solid ${hot ? 'var(--cyan-tint-strong)' : 'var(--border)'}`, borderRadius: 'var(--radius-md)', padding: '12px 14px', boxShadow: hot ? 'var(--glow-cyan)' : 'var(--shadow-xs)', opacity: built ? 1 : 0, transform: built ? 'none' : `translateX(${fromLeft ? -40 : 40}px)`, transition: `opacity .6s var(--ease-out) ${index * 110}ms, transform .6s var(--ease-out) ${index * 110}ms, box-shadow .5s var(--ease-out), border-color .5s var(--ease-out)`, ...style }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
        <span style={{ width: 7, height: 7, borderRadius: '50%', background: hot ? 'var(--cyan-500)' : 'var(--text-disabled)', boxShadow: hot ? '0 0 9px 1px var(--cyan-glow)' : 'none', transition: 'all .5s var(--ease-out)', flex: 'none' }}></span>
        <span style={{ fontFamily: 'var(--font-display)', fontSize: 14.5, fontWeight: 500, color: 'var(--text-primary)', letterSpacing: '-0.01em', flex: 1 }}>{d.n}</span>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 9, letterSpacing: '0.1em', padding: '2px 6px', borderRadius: 999, color: d.tag === 'NEW' ? 'var(--cyan-300)' : 'var(--text-tertiary)', border: `1px solid ${d.tag === 'NEW' ? 'var(--cyan-tint-strong)' : 'var(--border-strong)'}`, background: d.tag === 'NEW' ? 'var(--cyan-tint)' : 'transparent' }}>{d.tag}</span>
      </div>
      <div style={{ fontFamily: 'var(--font-body)', fontSize: 12, color: 'var(--text-secondary)', marginTop: 4 }}>{d.s}</div>
      <div style={{ display: 'flex', gap: 5, flexWrap: 'wrap', marginTop: 7 }}>
        {d.chips.map((c, i) => <span key={i} style={{ fontFamily: 'var(--font-mono)', fontSize: 10, color: 'var(--text-tertiary)', padding: '2px 6px', borderRadius: 4, background: 'var(--surface-2)', border: '1px solid var(--border-faint)' }}>{c}</span>)}
      </div>
    </div>
  );
}
function DataFlowLive({ maxScale = 1.32 } = {}) {
  const [hot, setHot] = useState(0);
  const [score, setScore] = useState(0.86);
  const [built, setBuilt] = useState(0); // 0=nothing 1=nodes 2=wires 3=model 4=score 5=running
  useEffect(() => {
    const steps = [180, 900, 1500, 1900, 2400];
    const ids = steps.map((t, i) => setTimeout(() => setBuilt(i + 1), t));
    return () => ids.forEach(clearTimeout);
  }, []);
  useEffect(() => {
    if (built < 5) return;
    const a = setInterval(() => setHot(h => (h + 1) % 5), 950);
    const t0 = performance.now();
    const b = setInterval(() => {
      const p = ((performance.now() - t0) / 9000) % 1;
      setScore(Math.max(0.19, 0.86 - 0.74 * Math.pow(p, 1.4)));
    }, 90);
    return () => { clearInterval(a); clearInterval(b); };
  }, [built]);
  const flagged = score < 0.30;
  const nodesBuilt = built >= 1, wiresBuilt = built >= 2, modelBuilt = built >= 3, scoreBuilt = built >= 4, running = built >= 5;
  const lTops = [30, 172, 314], rTops = [100, 264];
  return (
    <ScaledStage w={1000} h={470} maxScale={maxScale}>
      {FLOW_LEFT.map((d, i) => <FlowBox key={i} d={d} hot={running && hot === i} built={nodesBuilt} index={i} fromLeft style={{ left: 24, top: lTops[i] }} />)}
      {FLOW_RIGHT.map((d, i) => <FlowBox key={i} d={d} hot={running && hot === 3 + i} built={nodesBuilt} index={i + 1} fromLeft={false} style={{ left: 724, top: rTops[i] }} />)}
      <svg width="1000" height="470" style={{ position: 'absolute', inset: 0, pointerEvents: 'none', overflow: 'visible' }}>
        {WIRES.map((w, i) => <path key={i} d={w} fill="none" stroke="rgba(77,163,255,0.16)" strokeWidth="1.2" strokeDasharray={420} strokeDashoffset={wiresBuilt ? 0 : 420} style={{ transition: `stroke-dashoffset .7s var(--ease-out) ${i * 90}ms` }} />)}
        {running && WIRES.map((w, i) => (
          <circle key={'p' + i} r={i === hot ? 4 : 2.6} fill="var(--cyan-500)">
            <animateMotion dur={`${1.6 + i * 0.35}s`} repeatCount="indefinite" begin={`${i * 0.4}s`} path={w} calcMode="spline" keyPoints="0;1" keyTimes="0;1" keySplines="0.16 1 0.3 1" />
            <animate attributeName="opacity" dur={`${1.6 + i * 0.35}s`} begin={`${i * 0.4}s`} repeatCount="indefinite" values="0;1;1;0" keyTimes="0;0.15;0.85;1" />
          </circle>
        ))}
        <line x1="500" y1="276" x2="500" y2="344" stroke="rgba(77,163,255,0.25)" strokeWidth="1.2" />
        {running && (
          <circle r="3" fill={flagged ? 'var(--status-flagged)' : 'var(--cyan-400)'}>
            <animateMotion dur="1.4s" repeatCount="indefinite" path="M 500 276 L 500 344" />
          </circle>
        )}
      </svg>
      <div style={{ position: 'absolute', left: 452, top: 174, width: 96, height: 96, borderRadius: '50%', border: '1px solid var(--cyan-tint-strong)', background: 'radial-gradient(circle at 50% 45%, rgba(77,163,255,0.35), rgba(77,163,255,0.06) 65%, transparent 74%)', display: 'flex', alignItems: 'center', justifyContent: 'center', opacity: modelBuilt ? 1 : 0, transform: modelBuilt ? 'scale(1)' : 'scale(0.5)', transition: 'opacity .6s var(--ease-out), transform .6s var(--ease-out)', animation: modelBuilt ? 'lhCorePulse 3.2s ease-in-out infinite' : 'none' }}>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.12em', color: 'var(--cyan-300)', textAlign: 'center', lineHeight: 1.4 }}>STETHOS<br />MODEL</span>
      </div>
      <div style={{ position: 'absolute', left: 360, top: 352, width: 280, padding: '12px 16px', borderRadius: 'var(--radius-lg)', background: 'var(--surface-2)', border: `1px solid ${flagged ? 'var(--red-tint-strong)' : 'var(--border-strong)'}`, boxShadow: flagged ? 'var(--glow-red)' : 'var(--shadow-card)', display: 'flex', alignItems: 'center', justifyContent: 'space-between', opacity: scoreBuilt ? 1 : 0, transform: scoreBuilt ? 'translateY(0)' : 'translateY(18px)', transition: 'opacity .55s var(--ease-out), transform .55s var(--ease-out), border-color .5s var(--ease-out), box-shadow .5s var(--ease-out)' }}>
        <div>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 9.5, letterSpacing: '0.12em', color: 'var(--text-tertiary)' }}>LIVE DISCHARGE SCORE</div>
          <div style={{ fontFamily: 'var(--font-mono)', fontSize: 30, fontWeight: 600, color: flagged ? 'var(--status-flagged)' : 'var(--cyan-400)', lineHeight: 1.15, fontVariantNumeric: 'tabular-nums', transition: 'color .4s var(--ease-out)' }}>{score.toFixed(2)}</div>
        </div>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.08em', color: flagged ? 'var(--status-flagged)' : 'var(--status-nominal)' }}>{flagged ? '⚠ FLAG' : '● NOMINAL'}</span>
      </div>
      <div style={{ position: 'absolute', left: 24, top: 444, fontFamily: 'var(--font-mono)', fontSize: 11, color: 'var(--text-tertiary)', letterSpacing: '0.03em', opacity: scoreBuilt ? 1 : 0, transition: 'opacity .6s var(--ease-out)' }}>
        Sixteen signals stream into one model, and out comes the number nobody else can see.
      </div>
    </ScaledStage>
  );
}

/* ------------------------------------------------ DivergeLive */
function DivergeLive() {
  const [p, setP] = useState(0);
  const raf = useRef(null);
  useEffect(() => {
    if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) { setP(1); return; }
    const DRAW = 7000, HOLD = 2600; const start = performance.now();
    function step(now) { const el = (now - start) % (DRAW + HOLD); setP(el < DRAW ? el / DRAW : 1); raf.current = requestAnimationFrame(step); }
    raf.current = requestAnimationFrame(step);
    return () => cancelAnimationFrame(raf.current);
  }, []);
  const W = 1100, H = 430, L = 56, R = 210, TOP = 30, BOT = 48, n = 64;
  const bell = [], risk = [];
  for (let i = 0; i < n; i++) { const t = i / (n - 1); bell.push(0.74 - 0.60 * Math.pow(t, 1.25)); risk.push(0.12 + 0.70 * Math.pow(t, 1.5)); }
  let cross = n - 1; for (let i = 0; i < n; i++) { if (risk[i] >= bell[i]) { cross = i; break; } }
  const x = i => L + (i / (n - 1)) * (W - L - R);
  const y = v => H - BOT - v * (H - TOP - BOT);
  const end = Math.max(1, Math.floor(p * (n - 1)));
  const pts = arr => arr.slice(0, end + 1).map((v, i) => `${x(i).toFixed(1)},${y(v).toFixed(1)}`).join(' ');
  return (
    <div style={{ background: 'var(--surface-1)', border: '1px solid var(--border)', borderRadius: 'var(--radius-xl)', boxShadow: 'var(--shadow-card)', padding: '20px 22px 10px' }}>
      <div style={{ display: 'flex', gap: 26, flexWrap: 'wrap', marginBottom: 6 }}>
        <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontFamily: 'var(--font-body)', fontSize: 14, color: 'var(--text-secondary)' }}><span style={{ width: 22, height: 3, background: 'var(--text-secondary)', borderRadius: 2 }}></span> Call-bell rate — what staff notice</span>
        <span style={{ display: 'inline-flex', alignItems: 'center', gap: 8, fontFamily: 'var(--font-body)', fontSize: 14, color: 'var(--text-secondary)' }}><span style={{ width: 22, height: 3, background: 'var(--status-flagged)', borderRadius: 2 }}></span> Risk of a bad stay — what is actually happening</span>
      </div>
      <svg viewBox={`0 0 ${W} ${H}`} style={{ width: '100%', height: 'auto', display: 'block' }}>
        <defs><filter id="dvl-g" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="3" result="b" /><feMerge><feMergeNode in="b" /><feMergeNode in="SourceGraphic" /></feMerge></filter></defs>
        {[0.25, 0.5, 0.75].map(v => <line key={v} x1={L} x2={W - R} y1={y(v)} y2={y(v)} stroke="var(--border-faint)" strokeWidth="1" />)}
        {end >= cross && (
          <g>
            <line x1={x(cross)} x2={x(cross)} y1={TOP} y2={H - BOT} stroke="var(--status-flagged)" strokeOpacity="0.35" strokeWidth="1" strokeDasharray="3 4" />
            <circle cx={x(cross)} cy={y(risk[cross])} r="6" fill="none" stroke="var(--status-flagged)" strokeWidth="1.5" />
            <text x={x(cross)} y={TOP - 8} textAnchor="middle" fontFamily="var(--font-mono)" fontSize="13" fill="var(--status-flagged)">she goes quiet, the lines cross</text>
          </g>
        )}
        <polyline points={pts(bell)} fill="none" stroke="var(--text-secondary)" strokeWidth="2.6" strokeLinejoin="round" strokeLinecap="round" />
        <polyline points={pts(risk)} fill="none" stroke="var(--status-flagged)" strokeWidth="3" strokeLinejoin="round" strokeLinecap="round" filter="url(#dvl-g)" />
        <circle cx={x(end)} cy={y(bell[end])} r="4.5" fill="var(--text-secondary)" />
        <circle cx={x(end)} cy={y(risk[end])} r="5.5" fill="var(--status-flagged)" filter="url(#dvl-g)" />
        {p > 0.82 && (
          <g fontFamily="var(--font-mono)" fontSize="14">
            <text x={x(n - 1) + 12} y={y(bell[n - 1]) + 5} fill="var(--text-secondary)">the bell falls silent</text>
            <text x={x(n - 1) + 12} y={y(risk[n - 1]) + 5} fill="var(--status-flagged)">the risk peaks</text>
          </g>
        )}
      </svg>
    </div>
  );
}

/* ------------------------------------------------ BaselineLive */
function BaselinePanel({ name, note, color, scoreColor, score, badge, step, raw }) {
  return (
    <div style={{ flex: 1, minWidth: 300, background: 'var(--surface-2)', border: '1px solid var(--border)', borderRadius: 'var(--radius-lg)', padding: '22px 24px' }}>
      <div style={{ display: 'flex', alignItems: 'baseline', justifyContent: 'space-between', gap: 12 }}>
        <span style={{ fontFamily: 'var(--font-display)', fontSize: 17, fontWeight: 500, color: 'var(--text-primary)', letterSpacing: '-0.01em' }}>{name}</span>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, color: 'var(--text-tertiary)' }}>{note}</span>
      </div>
      <div style={{ display: 'flex', alignItems: 'flex-end', gap: 7, height: 140, marginTop: 18 }}>
        {raw.map((v, i) => (
          <div key={i} style={{ flex: 1, height: step >= 1 ? `${v * 100}%` : '4%', background: color, borderRadius: 3, opacity: 0.9, transition: `height .9s var(--ease-out) ${i * 90}ms` }}></div>
        ))}
      </div>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', marginTop: 18, opacity: step === 2 ? 1 : 0, transform: step === 2 ? 'none' : 'translateY(8px)', transition: 'all .5s var(--ease-out)' }}>
        {badge}
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 26, fontWeight: 600, color: scoreColor, fontVariantNumeric: 'tabular-nums' }}>{score}</span>
      </div>
    </div>
  );
}
function BaselineLive() {
  const [step, setStep] = useState(0);
  useEffect(() => {
    let alive = true; let ids = [];
    function cycle() {
      if (!alive) return;
      setStep(1);
      ids = [setTimeout(() => alive && setStep(2), 1900), setTimeout(() => alive && setStep(0), 5600), setTimeout(cycle, 6400)];
    }
    cycle();
    return () => { alive = false; ids.forEach(clearTimeout); };
  }, []);
  const raw = [0.5, 0.7, 0.4, 0.8, 0.55, 0.75, 0.45, 0.65];
  return (
    <div>
      <div style={{ textAlign: 'center', fontFamily: 'var(--font-mono)', fontSize: 12, letterSpacing: '0.08em', textTransform: 'uppercase', color: 'var(--text-tertiary)', marginBottom: 18 }}>The exact same raw signal · two different verdicts</div>
      <div style={{ display: 'flex', gap: 20, flexWrap: 'wrap' }}>
        <BaselinePanel name="Margaret · 71" note="post-op: calls are expected" color="var(--cyan-500)" scoreColor="var(--status-nominal)" score="0.81" badge={<GBadge variant="nominal" dot>Nominal</GBadge>} step={step} raw={raw} />
        <BaselinePanel name="Eleanor · 78" note="stable: the same calls are an alarm" color="var(--status-flagged)" scoreColor="var(--status-flagged)" score="0.27" badge={<GBadge variant="flagged" dot>Flagged</GBadge>} step={step} raw={raw} />
      </div>
    </div>
  );
}

/* ------------------------------------------------ HardwareLive */
const HW_MODS = [
  { name: 'Audio Intelligence', src: 'call-bell intercom mic' },
  { name: 'Request & Response', src: 'nurse-call system' },
  { name: 'Presence & Continuity', src: 'RTLS badges' },
  { name: 'Room Environment', src: 'one small sensor' },
  { name: 'Clinical Events', src: 'EMR · HL7/FHIR' },
];
const HW_ORDER = [0, 1, 2, 4];
function HwCard({ d, state }) {
  if (state === 'empty') return (
    <div style={{ flex: 1, minWidth: 150, border: '1px dashed var(--border-strong)', borderRadius: 'var(--radius-md)', minHeight: 118, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', gap: 6 }}>
      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 18, color: 'var(--text-tertiary)' }}>+</span>
      <span style={{ fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.08em', color: 'var(--text-tertiary)' }}>ROOM SENSOR</span>
    </div>
  );
  const lit = state !== 'dim';
  const isNew = state === 'new';
  const isBlue = isNew || state === 'blue';
  const c = isBlue ? 'var(--cyan-400)' : 'var(--status-nominal)';
  return (
    <div style={{ flex: 1, minWidth: 150, background: 'var(--surface-2)', border: `1px solid ${lit ? (isBlue ? 'var(--cyan-tint-strong)' : 'rgba(70,185,138,0.35)') : 'var(--border)'}`, borderRadius: 'var(--radius-md)', padding: '13px 14px', minHeight: 118, opacity: lit ? 1 : 0.5, boxShadow: lit ? (isBlue ? 'var(--glow-cyan)' : '0 0 0 1px rgba(70,185,138,0.18), 0 0 22px rgba(70,185,138,0.16)') : 'none', transition: 'all .6s var(--ease-out)', animation: isNew ? 'lhSlideIn .8s var(--ease-out)' : 'none', display: 'flex', flexDirection: 'column', gap: 6 }}>
      <div style={{ display: 'flex', alignItems: 'center', gap: 7 }}>
        <span style={{ width: 7, height: 7, borderRadius: '50%', background: lit ? c : 'var(--text-disabled)', boxShadow: lit ? `0 0 9px 1px ${isNew ? 'var(--cyan-glow)' : 'rgba(70,185,138,0.5)'}` : 'none', transition: 'all .5s', flex: 'none' }}></span>
        <span style={{ fontFamily: 'var(--font-display)', fontSize: 13.5, fontWeight: 500, color: 'var(--text-primary)', letterSpacing: '-0.01em' }}>{d.name}</span>
      </div>
      <div style={{ fontFamily: 'var(--font-body)', fontSize: 11.5, color: 'var(--text-secondary)' }}>{d.src}</div>
      <div style={{ marginTop: 'auto', fontFamily: 'var(--font-mono)', fontSize: 10, letterSpacing: '0.08em', color: lit ? c : 'var(--text-tertiary)', transition: 'color .5s' }}>
        {lit ? (isNew ? '✓ ONLINE, NEW' : '✓ LIVE, ALREADY YOURS') : 'STANDBY'}
      </div>
    </div>
  );
}
function HardwareLive() {
  const [phase, setPhase] = useState(0);
  const [shine, setShine] = useState(false);
  useEffect(() => {
    let alive = true; let ids = [];
    function run() {
      if (!alive) return;
      setPhase(0);
      setShine(false);
      const steps = [[600, 1], [1250, 2], [1900, 3], [2550, 4], [3600, 5], [4900, 6]];
      ids = steps.map(([t, p]) => setTimeout(() => alive && setPhase(p), t));
      ids.push(setTimeout(() => alive && setShine(true), 4900));
      ids.push(setTimeout(() => alive && setShine(false), 4900 + 1600));
      ids.push(setTimeout(run, 8800));
    }
    run();
    return () => { alive = false; ids.forEach(clearTimeout); };
  }, []);
  const complete = phase >= 6;
  const litCount = Math.min(phase, 4);
  const caption = phase === 0 ? 'Here’s a hospital room, as it looks today.'
    : phase <= 4 ? 'We light up what’s already installed: the intercom, the nurse-call system, the badges, the EMR.'
    : phase === 5 ? 'The only hardware we add is one small room sensor.'
    : 'Once it’s live, sixteen signals stream continuously from a room that needed nothing new.';
  return (
    <div style={{ position: 'relative', border: `1px solid ${complete ? 'var(--cyan-tint-strong)' : 'var(--border)'}`, borderRadius: 'var(--radius-xl)', background: 'var(--surface-1)', boxShadow: complete ? 'var(--glow-cyan)' : 'var(--shadow-card)', padding: 22, overflow: 'hidden', transition: 'all .7s var(--ease-out)' }}>
      {shine && <div style={{ position: 'absolute', top: 0, bottom: 0, left: 0, width: 180, background: 'linear-gradient(105deg, transparent, rgba(77,163,255,0.10), transparent)', animation: 'lhShine 1.6s ease-out', pointerEvents: 'none' }}></div>}
      <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap' }}>
        {HW_MODS.map((d, i) => {
          if (i === 3) return <HwCard key={i} d={d} state={phase >= 5 ? 'new' : 'empty'} />;
          const k = HW_ORDER.indexOf(i);
          return <HwCard key={i} d={d} state={litCount > k ? (complete ? 'blue' : 'green') : 'dim'} />;
        })}
      </div>
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 16, marginTop: 18, flexWrap: 'wrap' }}>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 12, color: complete ? 'var(--cyan-300)' : 'var(--text-secondary)', letterSpacing: '0.02em', transition: 'color .5s' }}>{caption}</span>
        <span style={{ fontFamily: 'var(--font-mono)', fontSize: 11, letterSpacing: '0.1em', color: complete ? 'var(--cyan-300)' : 'var(--text-tertiary)', transition: 'all .5s' }}>{complete ? '● SYSTEM COMPLETE · 16 SIGNALS LIVE' : `${litCount}/4 EXISTING ONLINE`}</span>
      </div>
    </div>
  );
}

Object.assign(window, { ScaledStage, DataFlowLive, DivergeLive, BaselineLive, HardwareLive });
