// mobile.jsx — AlphaSuite mobile screens (portfolio / score / chat)

// ────────────────────────────────────────────────────────────
// Portfolio notifications — alert events keyed to holdings
// ────────────────────────────────────────────────────────────
const NOTIFICATIONS = [
  { id: 1, co: 'Volta',      tag: 'COMM',  rag: 'red',   time: '2h ago',  read: false,
    title: 'Commercial Engine → Red',
    body:  'Q1 revenue missed by 22%. Pipeline cover at 0.8×. Requires board discussion.' },
  { id: 2, co: 'Smithfield', tag: 'TECH',  rag: 'green', time: '4h ago',  read: false,
    title: 'SOC2 Type II passed',
    body:  'Tech axis moved Green. API security solid. Series B diligence unblocked.' },
  { id: 3, co: 'Helix',      tag: 'AI',    rag: 'amber', time: '6h ago',  read: false,
    title: 'NHS integration delayed 6 months',
    body:  'Clinical validation pace governs timeline. AI compliance audit remains clean.' },
  { id: 4, co: 'Meridian',   tag: 'MKTG',  rag: 'green', time: '1d ago',  read: true,
    title: 'Series B term sheet signed',
    body:  'ABM motion compounding. Pipeline cover 3.4×. IP moat documented.' },
  { id: 5, co: 'Orbis',      tag: 'TECH',  rag: 'amber', time: '2d ago',  read: true,
    title: 'PSD3 compliance window: 90 days',
    body:  'Decision needed. PSD3 work is tracking but deadline pressure increasing.' },
];

// ────────────────────────────────────────────────────────────
// Status bar (custom — matches iOS 26 metrics, light on dark)
// ────────────────────────────────────────────────────────────
function MStatus({ color = 'var(--ink)' }) {
  return (
    <div style={{
      display: 'flex', justifyContent: 'flex-end', alignItems: 'center',
      padding: '14px 20px 0', height: 48, position: 'relative', zIndex: 5,
    }}>
      <svg width="20" height="20" viewBox="0 0 20 20" fill={color} style={{ opacity: 0.75 }}>
        <path d="M10 2a1 1 0 0 1 1 1v.28A6 6 0 0 1 16 9v2.5l1.4 2.1a.75.75 0 0 1-.62 1.15H3.22a.75.75 0 0 1-.62-1.15L4 11.5V9a6 6 0 0 1 5-5.72V3a1 1 0 0 1 1-1zM8.27 16.5a1.75 1.75 0 0 0 3.46 0H8.27z"/>
      </svg>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Home indicator
// ────────────────────────────────────────────────────────────
function MHomeBar({ color = 'rgba(255,255,255,0.7)' }) {
  return (
    <div style={{
      position: 'absolute', bottom: 8, left: 0, right: 0,
      display: 'flex', justifyContent: 'center', pointerEvents: 'none', zIndex: 80,
    }}>
      <div style={{ width: 134, height: 5, borderRadius: 3, background: color }} />
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Top-of-screen "instrument header" — kicker row + title
// ────────────────────────────────────────────────────────────
function MAppHeader({ kicker, right }) {
  return (
    <div style={{
      padding: '14px 24px 22px',
      display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start',
    }}>
      <div>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-appheader-kicker-letter-spacing)',
          textTransform: 'uppercase', color: 'var(--ink-2)' }}>
          {kicker}
        </div>
      </div>
      <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-header-letter-spacing)',
        textTransform: 'uppercase', color: 'var(--ink-3)', textAlign: 'right' }}>
        {right}
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Notifications panel — slides down from bell tap
// ────────────────────────────────────────────────────────────
function MNotificationsPanel({ notifs, onClose, onMarkRead }) {
  const unread = notifs.filter(n => !n.read).length;
  // Portal to document.body so overflow:hidden ancestors don't clip the panel
  return ReactDOM.createPortal(
    <div
      onClick={onClose}
      style={{
        position: 'fixed', inset: 0, zIndex: 200,
        background: 'rgba(0,0,0,0.55)',
      }}
    >
      <div
        onClick={e => e.stopPropagation()}
        style={{
          position: 'fixed', top: 0, left: 0, right: 0,
          background: 'var(--surface)',
          boxShadow: '0 8px 32px rgba(0,0,0,0.4)',
          maxHeight: '72vh', display: 'flex', flexDirection: 'column',
        }}
      >
        {/* Panel header */}
        <div style={{
          display: 'flex', justifyContent: 'space-between', alignItems: 'center',
          padding: '18px 20px 14px', borderBottom: '1px solid var(--elev-2)',
        }}>
          <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
            <span style={{ fontFamily: 'var(--mono)', fontSize: 11, letterSpacing: '0.18em',
              textTransform: 'uppercase', color: 'var(--ink-2)' }}>Alerts</span>
            {unread > 0 && (
              <span style={{
                background: 'var(--red)', color: '#fff',
                fontFamily: 'var(--mono)', fontSize: 9, letterSpacing: '0.1em',
                padding: '2px 6px', borderRadius: 2, fontWeight: 600,
              }}>{unread} new</span>
            )}
          </div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 16 }}>
            {unread > 0 && (
              <button onClick={onMarkRead} style={{
                background: 'none', border: 'none', cursor: 'pointer',
                fontFamily: 'var(--mono)', fontSize: 9, letterSpacing: '0.14em',
                textTransform: 'uppercase', color: 'var(--ink-3)',
              }}>Mark all read</button>
            )}
            <button onClick={onClose} style={{
              background: 'none', border: 'none', cursor: 'pointer',
              color: 'var(--ink-3)', padding: 4,
            }}>
              <svg width="14" height="14" viewBox="0 0 14 14" fill="none">
                <path d="M2 2 L12 12 M12 2 L2 12" stroke="currentColor" strokeWidth="1.5" strokeLinecap="square"/>
              </svg>
            </button>
          </div>
        </div>

        {/* Notification list */}
        <div style={{ overflowY: 'auto', flex: 1 }} className="no-scrollbar">
          {notifs.map((n, i) => {
            const ragColor = { red: 'var(--red)', amber: 'var(--amber)', green: 'var(--green)' }[n.rag];
            return (
              <div key={n.id} style={{
                padding: '14px 20px',
                borderBottom: i < notifs.length - 1 ? '1px solid var(--elev-1)' : 'none',
                background: n.read ? 'transparent' : 'var(--elev-1)',
                display: 'grid', gridTemplateColumns: '4px 1fr', gap: 14, alignItems: 'start',
              }}>
                <div style={{ width: 4, height: '100%', minHeight: 40, background: n.read ? 'transparent' : ragColor, marginTop: 2 }} />
                <div>
                  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', marginBottom: 4 }}>
                    <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
                      <span style={{ fontFamily: 'var(--mono)', fontSize: 9, letterSpacing: '0.18em',
                        textTransform: 'uppercase', color: ragColor }}>{n.tag}</span>
                      <span style={{ fontFamily: 'var(--mono)', fontSize: 9, letterSpacing: '0.14em',
                        textTransform: 'uppercase', color: 'var(--ink-3)' }}>· {n.co}</span>
                    </div>
                    <span style={{ fontFamily: 'var(--mono)', fontSize: 9, color: 'var(--ink-4)', letterSpacing: '0.1em' }}>{n.time}</span>
                  </div>
                  <div style={{ fontSize: 14, fontWeight: 500, color: 'var(--ink)', lineHeight: 1.25, marginBottom: 4 }}>
                    {n.title}
                  </div>
                  <div style={{ fontSize: 12, color: 'var(--ink-3)', lineHeight: 1.45 }}>
                    {n.body}
                  </div>
                </div>
              </div>
            );
          })}
        </div>
      </div>
    </div>,
    document.body
  );
}

// ────────────────────────────────────────────────────────────
// Portfolio screen — editorial "instrument list" of holdings
// ────────────────────────────────────────────────────────────
function MPortfolio({ goCompany }) {
  const ranked = [...COMPANIES].sort((a, b) => a.score - b.score);
  const [notifs, setNotifs] = React.useState(NOTIFICATIONS);
  const [notifOpen, setNotifOpen] = React.useState(false);
  const unreadCount = notifs.filter(n => !n.read).length;

  const markAllRead = () => setNotifs(ns => ns.map(n => ({ ...n, read: true })));

  return (
    <div data-screen="portfolio" style={{ background: 'var(--canvas)', minHeight: '100%', position: 'relative', animation: 'alpha-fade-up 200ms ease-out both' }}>
      {notifOpen && (
        <MNotificationsPanel
          notifs={notifs}
          onClose={() => setNotifOpen(false)}
          onMarkRead={markAllRead}
        />
      )}
      <MAppHeader
        kicker={<span className="wordmark" style={{ fontSize: 'var(--m-wordmark-size)' }}>AlphaSuite<span className="dot">.</span><span style={{ marginLeft: 'var(--m-wordmark-margin-left)', fontFamily: 'var(--mono)', fontSize: 'var(--m-wordmark-harlow-size)', letterSpacing: 'var(--m-wordmark-harlow-letter-spacing)', color: 'var(--ink-3)', fontStyle: 'normal' }}>HARLOW &amp; STONE</span></span>}
        right={
          <button
            onClick={() => setNotifOpen(o => !o)}
            style={{ background: 'none', border: 'none', cursor: 'pointer', padding: 0, position: 'relative', color: 'var(--ink)' }}
          >
            <svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor" style={{ opacity: notifOpen ? 1 : 0.6, display: 'block' }}>
              <path d="M10 2a1 1 0 0 1 1 1v.28A6 6 0 0 1 16 9v2.5l1.4 2.1a.75.75 0 0 1-.62 1.15H3.22a.75.75 0 0 1-.62-1.15L4 11.5V9a6 6 0 0 1 5-5.72V3a1 1 0 0 1 1-1zM8.27 16.5a1.75 1.75 0 0 0 3.46 0H8.27z"/>
            </svg>
            {unreadCount > 0 && (
              <span style={{
                position: 'absolute', top: -4, right: -5,
                background: 'var(--red)', color: '#fff',
                width: 14, height: 14, borderRadius: 7,
                display: 'flex', alignItems: 'center', justifyContent: 'center',
                fontFamily: 'var(--mono)', fontSize: 8, fontWeight: 700,
                lineHeight: 1,
              }}>{unreadCount}</span>
            )}
          </button>
        }
      />

      {/* Hero title */}
      <div style={{ padding: 'var(--m-hero-pad)' }}>
        <h1 className="display" style={{ fontSize: 'var(--m-heading-size)', fontWeight: 'var(--m-heading-weight)', lineHeight: 'var(--m-heading-line-height)' }}>
          Portfolio<br/>
          <em>ranked</em> by risk<span style={{ color: 'var(--ink)' }}>.</span>
        </h1>
      </div>

      {/* Index summary row */}
      <div style={{
        margin: 'var(--m-summary-margin)', display: 'grid',
        gridTemplateColumns: '1fr 1fr 1fr', gap: 0,
      }}>
        {[
          { k: 'HOLDINGS', v: '5' },
          { k: 'WEIGHTED AI', v: '708' },
          { k: 'ALPHA Δ / WK', v: '+17' },
        ].map((c, i) => (
          <div key={c.k} style={{
            padding: 'var(--m-summary-pad-v) var(--m-summary-pad-h)',
            paddingLeft: i === 0 ? 0 : 'var(--m-summary-pad-h)',
            borderLeft: i === 0 ? 'none' : '1px solid var(--elev-2)',
          }}>
            <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-stat-label-size)', letterSpacing: 'var(--m-stat-label-letter-spacing)',
              textTransform: 'uppercase', color: 'var(--ink-3)', marginBottom: 'var(--m-stat-label-margin-bottom)' }}>{c.k}</div>
            <div className="serif-num" style={{ fontSize: 'var(--m-stat-value-size)', color: 'var(--ink)' }}>{c.v}</div>
          </div>
        ))}
      </div>

      {/* Instrument rows */}
      <div>
        {ranked.map((c, i) => (
          <CompanyRow key={c.id} c={c} idx={i + 1} onClick={() => goCompany(c.id)} />
        ))}
      </div>

      {/* Signal feed teaser */}
      <div style={{ padding: 'var(--m-signal-feed-pad)' }}>
        <Kicker>What's Changed · 24 H</Kicker>
        <div style={{ marginTop: 'var(--m-signal-feed-margin-top)' }}>
          {[
            { c: 'Volta', t: 'Commercial Engine → Red · Q1 missed 22%', tag: 'COMM', tone: 'red' },
            { c: 'Smithfield', t: 'SOC2 Type II passed · Tech moved to Green', tag: 'TECH', tone: 'green' },
            { c: 'Helix', t: 'NHS integration delayed 6 months', tag: 'AI', tone: 'amber' },
          ].map((s, index) => (
            <div key={s.t} style={{
              padding: 'var(--m-signal-row-pad)', display: 'grid',
              gridTemplateColumns: '12px 1fr auto', gap: 'var(--m-signal-row-gap)', alignItems: 'start',
              borderTop: '1px solid var(--elev-1)',
              animation: 'alpha-fade-up 160ms ease-out both',
              animationDelay: (index * 40) + 'ms',
            }}>
              <RagDot rag={s.tone} size={6} style={{ marginTop: 7 }} />
              <div>
                <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-signal-label-size)', letterSpacing: 'var(--m-signal-label-letter-spacing)',
                  textTransform: 'uppercase', color: 'var(--ink-3)' }}>{s.c}</div>
                <div style={{ fontSize: 'var(--m-feed-text-size)', lineHeight: 'var(--m-signal-text-line-height)', color: 'var(--ink)', marginTop: 'var(--m-signal-text-margin-top)' }}>{s.t}</div>
              </div>
              <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-signal-label-size)', color: 'var(--ink-3)' }}>{s.tag}</span>
            </div>
          ))}
        </div>
      </div>

    </div>
  );
}

// One portfolio row — editorial "instrument" card
function CompanyRow({ c, idx, onClick }) {
  const ragColor = { red: 'var(--red)', amber: 'var(--amber)', green: 'var(--green)' }[c.rag];
  const negative = c.delta < 0;
  const [hovered, setHovered] = React.useState(false);
  return (
    <button onClick={onClick}
      onMouseEnter={() => setHovered(true)}
      onMouseLeave={() => setHovered(false)}
      style={{
        display: 'block', width: '100%', textAlign: 'left',
        background: 'transparent', border: 'none', padding: 0,
        cursor: 'pointer', color: 'var(--ink)',
        borderTop: '1px solid var(--elev-2)',
      }}>
      <div style={{
        padding: 'var(--m-row-pad-v) var(--m-row-pad-h)', position: 'relative',
        background: hovered ? 'var(--elev-1)' : 'var(--surface)',
        transition: 'background 80ms',
        animation: 'alpha-fade-up 180ms ease-out both',
        animationDelay: ((idx - 1) * 28) + 'ms',
      }}>
        {/* row 1: rank · sector · stage */}
        <div style={{
          display: 'flex', justifyContent: 'space-between', alignItems: 'baseline',
          fontFamily: 'var(--mono)', fontSize: 'var(--m-kicker-size)', letterSpacing: '0.14em',
          textTransform: 'uppercase', color: 'var(--ink-3)', marginBottom: 'var(--m-row-rank-margin-bottom)',
        }}>
          <span>
            <span style={{ color: 'var(--ink-2)' }}>{String(idx).padStart(2, '0')}</span>
            <span style={{ margin: 'var(--m-row-sep-margin)', color: 'var(--ink-4)' }}>/</span>
            <span>{c.sector} · {c.stage}</span>
          </span>
          {/* RAG badge */}
          <span style={{
            display: 'inline-flex', alignItems: 'center', gap: 'var(--m-row-rag-gap)',
            background: ragColor, color: '#000',
            fontFamily: 'var(--mono)', fontSize: 'var(--m-row-rag-font-size)', fontWeight: 'var(--m-row-rag-font-weight)',
            letterSpacing: 'var(--m-row-rag-letter-spacing)', textTransform: 'uppercase',
            padding: 'var(--m-row-rag-pad)',
          }}>
            {c.rag}
          </span>
        </div>

        {/* row 2: name · score */}
        <div style={{ display: 'grid', gridTemplateColumns: '1fr auto', gap: 'var(--m-row-meta-gap)', alignItems: 'baseline' }}>
          <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-row-name-size)', lineHeight: 'var(--m-row-name-line-height)',
            color: 'var(--ink)', letterSpacing: '-0.02em' }}>
            {c.name}
          </div>
          <div className="serif-num" style={{
            fontSize: 'var(--m-row-score-size)', lineHeight: 'var(--m-row-score-line-height)', color: ragColor, letterSpacing: '-0.04em',
            textAlign: 'right', flexShrink: 0, minWidth: 'var(--m-row-min-score-width)',
          }}>{c.score}</div>
        </div>

        {/* row 3: meta row */}
        <div style={{
          display: 'flex', justifyContent: 'space-between', alignItems: 'center',
          marginTop: 'var(--m-row-meta-margin-top)', fontFamily: 'var(--mono)', fontSize: 'var(--m-row-meta-size)', color: 'var(--ink-2)',
        }}>
          <span>ARR&nbsp;{c.arr}&nbsp;&nbsp;<span style={{ color: 'var(--ink-3)' }}>YoY&nbsp;{c.growth}</span></span>
          <span style={{ color: negative ? 'var(--red)' : 'var(--green)' }}>
            <Delta value={c.delta} />
            <span style={{ color: 'var(--ink-3)', marginLeft: 'var(--m-row-delta-margin-left)' }}>pts</span>
          </span>
        </div>

        {/* row 4: axis fingerprint — height controlled via --m-row-fingerprint-h */}
        <div style={{ marginTop: 'var(--m-row-fingerprint-margin-top)' }}>
          <AxisFingerprint company={c} size="xs"
            cellHeight={parseInt(getComputedStyle(document.documentElement).getPropertyValue('--m-row-fingerprint-h')) || 28} />
        </div>

      </div>
    </button>
  );
}

// ────────────────────────────────────────────────────────────
// Score screen — large hero + worst-first axis list
// ────────────────────────────────────────────────────────────
function MScore({ companyId, back, goChat, goNotebook }) {
  const c = COMPANIES.find(x => x.id === companyId);
  const order = worstFirst(c);
  const negDelta = c.delta < 0;
  const ragColor = { red: 'var(--red)', amber: 'var(--amber)', green: 'var(--green)' }[c.rag];
  return (
    <div data-screen="score" style={{ background: 'var(--canvas)', minHeight: '100%', paddingBottom: 'var(--m-score-pb)', animation: 'alpha-fade-up 200ms ease-out both' }}>
      {/* Compact header */}
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: 'var(--m-screen-header-pad)' }}>
        <button onClick={back} style={{
          display: 'inline-flex', alignItems: 'center', gap: 'var(--m-header-back-gap)',
          background: 'transparent', border: 'none', color: 'var(--ink-2)',
          fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-header-kicker-letter-spacing)',
          textTransform: 'uppercase', cursor: 'pointer', padding: 'var(--m-header-back-pad)',
        }}>
          <Chev /> Portfolio
        </button>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-header-letter-spacing)',
          textTransform: 'uppercase', color: 'var(--ink-3)' }}>
          12 MAY · 09:41
        </div>
      </div>

      {/* Title block */}
      <div style={{ padding: 'var(--m-score-title-pad)' }}>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-score-sector-size)', letterSpacing: 'var(--m-score-title-letter-spacing)',
          textTransform: 'uppercase', color: 'var(--ink-3)' }}>
          {c.sector} · {c.stage}
        </div>
        <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-score-name-size)', lineHeight: 'var(--m-score-name-line-height)',
          letterSpacing: 'var(--m-score-name-letter-spacing)', marginTop: 'var(--m-score-name-margin-top)' }}>
          {c.name}
        </div>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-score-meta-size)', color: 'var(--ink-2)', marginTop: 'var(--m-score-meta-margin-top)' }}>
          ARR {c.arr} · YoY {c.growth} · NRR {c.nrr} · {c.runway} runway
        </div>
      </div>

      {/* Hero score block */}
      <div style={{
        margin: 'var(--m-score-hero-margin)', padding: 'var(--m-score-hero-pad)',
        background: 'var(--surface)', position: 'relative',
        animation: 'alpha-scale-in 240ms ease-out 100ms both',
      }}>
        <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', overflow: 'hidden' }}>
          <div style={{ flex: 1, minWidth: 0 }}>
            <Kicker>Alpha Index · {c.weighting} Weighting</Kicker>
            <div className="serif-num" style={{
              fontSize: 'var(--m-score-hero-size)', lineHeight: 'var(--m-score-hero-line-height)', letterSpacing: 'var(--m-score-hero-letter-spacing)',
              color: ragColor, marginTop: 'var(--m-score-hero-margin-top)',
            }}>{c.score}</div>
            <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-score-out-of-size)', color: 'var(--ink-3)',
              letterSpacing: 'var(--m-score-out-of-letter-spacing)', textTransform: 'uppercase', marginTop: 'var(--m-score-out-of-margin-top)' }}>
              / 1000
            </div>
          </div>
          <div style={{ textAlign: 'right', flexShrink: 0 }}>
            <Kicker>Δ Week</Kicker>
            <div className="serif-num" style={{
              fontSize: 'var(--m-score-delta-size)', lineHeight: 'var(--m-score-delta-line-height)', color: negDelta ? 'var(--red)' : 'var(--green)',
              marginTop: 'var(--m-score-delta-margin-top)',
            }}>{negDelta ? '' : '+'}{c.delta}</div>
            <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-score-pts-size)', letterSpacing: 'var(--m-score-pts-letter-spacing)',
              textTransform: 'uppercase', color: 'var(--ink-3)', marginTop: 'var(--m-score-pts-margin-top)' }}>PTS</div>

            <div style={{ marginTop: 'var(--m-score-spark-margin-top)' }}>
              <Spark data={c.spark} w={120} h={36} color={negDelta ? 'var(--red)' : 'var(--green)'} />
            </div>
            <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-score-trail-size)', letterSpacing: 'var(--m-score-trail-letter-spacing)',
              textTransform: 'uppercase', color: 'var(--ink-3)', marginTop: 'var(--m-score-trail-margin-top)', textAlign: 'right' }}>
              10-week trail
            </div>
          </div>
        </div>

        {/* AI summary */}
        <div style={{ marginTop: 'var(--m-score-ai-margin-top)', paddingTop: 'var(--m-score-ai-padding-top)', borderTop: '1px solid var(--elev-2)' }}>
          <Kicker style={{ marginBottom: 'var(--m-score-ai-kicker-margin-bottom)' }}>AI Assessment</Kicker>
          <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-score-summary-size)', lineHeight: 'var(--m-score-summary-line-height)',
            color: 'var(--ink)', letterSpacing: 'var(--m-score-summary-letter-spacing)' }}>
            "{c.headline}"
          </div>
        </div>
      </div>

      {/* Tab strip */}
      <MTabStrip active="score" goChat={goChat} goNotebook={goNotebook} />

      {/* Axis list — worst first */}
      <div style={{ padding: '4px 0 0' }}>
        <div style={{ padding: 'var(--m-score-axes-header-pad)', display: 'flex', justifyContent: 'space-between' }}>
          <Kicker color="var(--ink-2)">Ten Axes · Worst First</Kicker>
          <Kicker>VC Weighting</Kicker>
        </div>
        {order.map((axisIdx, rank) => {
          const score = c.axes[axisIdx];
          const rag = ragOf(score);
          const axis = AXES[axisIdx];
          const note = AXIS_NOTES[c.id]?.[axisIdx] ?? '';
          return (
            <AxisRow key={axisIdx} rank={rank + 1} label={axis.label} score={score} rag={rag} note={note}
              onClick={() => goChat({ axis, score, rag })} />
          );
        })}
      </div>

      <div style={{ padding: 'var(--m-score-footer-pad)', fontFamily: 'var(--mono)', fontSize: 'var(--m-score-footer-size)',
        letterSpacing: 'var(--m-score-footer-letter-spacing)', textTransform: 'uppercase', color: 'var(--ink-3)' }}>
        Last ingest 12 May · 6 docs · 135 atoms ·{' '}
        <span style={{ color: 'var(--ink-2)' }}>Tap axis to interrogate →</span>
      </div>

    </div>
  );
}

function AxisRow({ rank, label, score, rag, note, onClick }) {
  const [hovered, setHovered] = React.useState(false);
  return (
    <div onClick={onClick}
      onMouseEnter={() => setHovered(true)}
      onMouseLeave={() => setHovered(false)}
      style={{
        padding: 'var(--m-axis-row-pad)', borderTop: '1px solid var(--elev-1)',
        display: 'grid', gridTemplateColumns: '1fr auto', gap: 'var(--m-axis-row-gap)', alignItems: 'start',
        cursor: onClick ? 'pointer' : 'default',
        background: hovered && onClick ? 'var(--elev-1)' : 'transparent',
        transition: 'background 80ms',
        animation: 'alpha-fade-up 180ms ease-out both',
        animationDelay: (rank * 28) + 'ms',
      }}>
      <div style={{ minWidth: 0 }}>
        <div style={{ display: 'flex', gap: 'var(--m-axis-rank-gap)', alignItems: 'baseline', marginBottom: 'var(--m-axis-rank-margin-bottom)' }}>
          <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-axis-rank-size)', color: 'var(--ink-3)',
            letterSpacing: 'var(--m-axis-rank-letter-spacing)' }}>{String(rank).padStart(2, '0')}</span>
          <RagDot rag={rag} size={7} />
          <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-axis-rag-size)', letterSpacing: 'var(--m-axis-rag-letter-spacing)',
            textTransform: 'uppercase', color: 'var(--ink-3)' }}>
            {rag}
          </span>
        </div>
        <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-axis-label-size)', lineHeight: 'var(--m-axis-label-line-height)',
          color: 'var(--ink)', letterSpacing: 'var(--m-axis-label-letter-spacing)' }}>
          {label}
        </div>
        <div style={{ fontSize: 'var(--m-axis-note-size)', color: 'var(--ink-2)', marginTop: 'var(--m-axis-note-margin-top)',
          lineHeight: 'var(--m-axis-note-line-height)', paddingRight: 'var(--m-axis-note-pad-right)' }}>
          {note}
        </div>
      </div>
      <div style={{ textAlign: 'right', minWidth: 64 }}>
        <div className="serif-num" style={{ fontSize: 'var(--m-axis-score-size)', lineHeight: 'var(--m-axis-score-line-height)', color: 'var(--ink)' }}>
          {score}
        </div>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-axis-slash-size)', color: 'var(--ink-3)',
          letterSpacing: 'var(--m-axis-slash-letter-spacing)', textTransform: 'uppercase', marginTop: 'var(--m-axis-slash-margin-top)' }}>/100</div>
        <div style={{ marginTop: 'var(--m-axis-bar-margin-top)', width: 'var(--m-axis-bar-width)' }}>
          <AxisBar score={score} rag={rag} h={3} />
        </div>
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Chat screen — intelligence briefing
// ────────────────────────────────────────────────────────────
function MChat({ companyId, chatContext, onContextConsumed, back, goScore, goNotebook }) {
  const c = COMPANIES.find(x => x.id === companyId);
  const [messages, setMessages] = React.useState(() => ([
    { role: 'user',
      text: 'What is the AI durability risk and how should I think about it ahead of Series B?',
      time: '09:38' },
    { role: 'alpha', time: '09:38', brief: RICH_BRIEF_AI },
  ]));
  const scrollRef = React.useRef(null);

  const onPickAxis = (axis, score, rag) => {
    const q = `What is the state of ${axis.label}?`;
    setMessages(m => [
      ...m,
      makeUserMsg(q, '09:42'),
      makeAlphaPlaceholder(axis.key, axis.label, score, rag, '09:42'),
    ]);
    setTimeout(() => scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' }), 60);
  };

  React.useEffect(() => {
    if (!chatContext) return;
    onPickAxis(chatContext.axis, chatContext.score, chatContext.rag);
    onContextConsumed?.();
  }, [chatContext]);

  const onSendText = async (text) => {
    const time = new Date().toTimeString().slice(0, 5);
    setMessages(m => [...m, makeUserMsg(text, time), {
      role: 'alpha', time, brief: {
        lead: `Querying Alpha Spine for "${text}"…`,
        signals: [{ t: 'Searching corpus…', src: 'Alpha Spine', ref: 0 }],
        citedAtoms: [], confidence: '—', atoms: 0, sources: 0,
      },
    }]);
    setTimeout(() => scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' }), 60);
    try {
      const resp = await fetch(`${window.BACKEND_URL}/query`, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ question: text, corpus_id: companyId, top_k: 6 }),
      });
      if (!resp.ok) throw new Error(`HTTP ${resp.status}`);
      const data = await resp.json();
      const cits = data.citations || [];
      setMessages(m => [...m.slice(0, -1), { role: 'alpha', time, brief: {
        lead: data.answer || 'No answer returned.',
        signals: cits.map((cit, i) => ({
          t: cit.text ? cit.text.slice(0, 200) : '',
          src: cit.title ? cit.title.slice(0, 28) : `Source ${i+1}`,
          ref: i + 1,
        })),
        citedAtoms: [],
        confidence: cits.length > 3 ? 'high' : cits.length > 1 ? 'medium' : 'low',
        atoms: data.atom_count || 0,
        sources: cits.length,
      }}]);
    } catch (err) {
      setMessages(m => [...m.slice(0, -1), { role: 'alpha', time, brief: {
        lead: `Could not reach Alpha Spine: ${err.message}`,
        signals: [], citedAtoms: [], confidence: '—', atoms: 0, sources: 0,
      }}]);
    }
    setTimeout(() => scrollRef.current?.scrollTo({ top: scrollRef.current.scrollHeight, behavior: 'smooth' }), 120);
  };

  return (
    <div data-screen="chat" style={{ background: 'var(--canvas)', height: '100%',
      display: 'flex', flexDirection: 'column', paddingBottom: 'var(--m-chat-pb)', animation: 'alpha-fade-up 200ms ease-out both' }}>

      {/* Dark chrome top — keeps the iPhone nav consistent */}
      <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between',
        padding: 'var(--m-screen-header-pad)' }}>
        <button onClick={back} style={{
          display: 'inline-flex', alignItems: 'center', gap: 'var(--m-header-back-gap)',
          background: 'transparent', border: 'none', color: 'var(--ink-2)',
          fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-header-kicker-letter-spacing)',
          textTransform: 'uppercase', cursor: 'pointer', padding: 'var(--m-header-back-pad)',
        }}>
          <Chev /> Portfolio
        </button>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-header-mono-size)', letterSpacing: 'var(--m-header-letter-spacing)',
          textTransform: 'uppercase', color: 'var(--ink-3)' }}>
          Ask α
        </div>
      </div>

      <div style={{ padding: 'var(--m-chat-title-pad)' }}>
        <Kicker>{c.sector} · {c.stage}</Kicker>
        <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-chat-company-size)', lineHeight: 'var(--m-chat-company-line-height)',
          letterSpacing: 'var(--m-chat-company-letter-spacing)', marginTop: 'var(--m-chat-company-margin-top)' }}>
          {c.name}{' '}
          <span style={{ color: 'var(--ink-3)', fontStyle: 'italic' }}>Digital</span>
        </div>
      </div>


      {/* LIGHT immersive chat surface */}
      <div className="chat-light" style={{
        flex: 1, display: 'flex', flexDirection: 'column',
        background: 'var(--canvas)', color: 'var(--ink)',
      }}>
        {/* Conversation + topic starters in scrollable area */}
        <div ref={scrollRef} style={{ flex: 1, overflowY: 'auto',
          padding: 'var(--m-chat-scroll-pad)' }} className="no-scrollbar">
          {/* Topic cards at top — scroll away as conversation grows */}
          <div style={{ paddingBottom: 'var(--m-chat-topics-pad-bottom)' }}>
            <div style={{ padding: 'var(--m-chat-topics-header-pad)', display: 'flex',
              justifyContent: 'space-between', alignItems: 'baseline' }}>
              <Kicker color="var(--ink-3)">Open a thread</Kicker>
              <Kicker color="var(--ink-3)">10 axes</Kicker>
            </div>
            <TopicCards companyId={companyId} onPick={onPickAxis} dense />
          </div>
          {messages.map((m, i) => m.role === 'user'
            ? <UserPrompt key={i} m={m} />
            : <ImmersiveBrief key={i} m={m} />
          )}
        </div>

        {/* Composer — dense single-line, like the proto */}
        <ImmersiveComposer onSend={onSendText} companyName={c.name} dense />
      </div>

    </div>
  );
}

function UserMsg({ m }) {
  return (
    <div style={{ padding: 'var(--m-chat-user-pad)' }}>
      <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-chat-user-label-size)', letterSpacing: 'var(--m-chat-user-label-letter-spacing)',
        textTransform: 'uppercase', color: 'var(--ink-3)', marginBottom: 'var(--m-chat-user-label-margin-bottom)' }}>
        You · {m.time}
      </div>
      <div style={{ fontSize: 'var(--m-chat-user-size)', lineHeight: 'var(--m-chat-user-line-height)', color: 'var(--ink)' }}>
        {m.text}
      </div>
    </div>
  );
}

function AlphaBrief({ m }) {
  const b = m.brief;
  return (
    <div style={{ padding: 'var(--m-brief-pad)', background: 'var(--surface)', marginTop: 'var(--m-brief-margin-top)' }}>
      <div style={{ padding: '0 24px', display: 'flex', justifyContent: 'space-between',
        alignItems: 'baseline', marginBottom: 'var(--m-brief-header-margin-bottom)' }}>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-alpha-size)', letterSpacing: 'var(--m-brief-alpha-letter-spacing)',
          textTransform: 'uppercase', color: 'var(--gold)' }}>
          α &nbsp;Briefing
        </div>
        <div style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-alpha-size)', letterSpacing: 'var(--m-brief-time-letter-spacing)',
          color: 'var(--ink-3)' }}>
          {m.time}
        </div>
      </div>

      {/* Lead */}
      <div style={{ padding: '0 24px' }}>
        <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-chat-lead-size)', lineHeight: 'var(--m-brief-lead-line-height)',
          color: 'var(--ink)', letterSpacing: 'var(--m-brief-lead-letter-spacing)' }}>
          {b.lead}
        </div>
      </div>

      {/* Inline axis card */}
      {b.axis && (
        <div style={{ padding: '0 24px' }}>
          <InlineAxisCard axis={b.axis.name} score={b.axis.score} rag={b.axis.rag} note={b.axis.note} />
        </div>
      )}

      {/* Signals */}
      {b.signals && b.signals.length > 0 && (
        <div style={{ marginTop: 'var(--m-brief-signals-margin-top)', padding: '0 24px' }}>
          <Kicker style={{ marginBottom: 'var(--m-brief-signals-margin-bottom)' }}>Signals · {b.signals.length}</Kicker>
          {b.signals.map((s, i) => (
            <div key={i} style={{
              padding: 'var(--m-brief-signal-row-pad)', borderTop: i === 0 ? '1px solid var(--elev-2)' : '1px solid var(--elev-1)',
              display: 'grid', gridTemplateColumns: 'auto 1fr auto', gap: 'var(--m-brief-signal-row-gap)', alignItems: 'start',
            }}>
              <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-signal-dash-size)', color: 'var(--ink-3)',
                paddingTop: 1 }}>—</span>
              <span style={{ fontSize: 'var(--m-chat-signal-size)', lineHeight: 'var(--m-brief-signal-line-height)', color: 'var(--ink)' }}>
                {s.t}
                {s.ref > 0 && (
                  <sup style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-cite-size)', color: 'var(--gold)',
                    marginLeft: 'var(--m-brief-cite-margin-left)' }}>[{s.ref}]</sup>
                )}
              </span>
              <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-signal-src-size)', letterSpacing: 'var(--m-brief-signal-src-letter-spacing)',
                color: 'var(--ink-3)', textTransform: 'uppercase' }}>{s.src.split(' ')[0]}</span>
            </div>
          ))}
        </div>
      )}

      {/* Inline atom cluster — visual proof of provenance */}
      {b.cluster && (
        <div style={{ padding: '0 24px' }}>
          <InlineAtomCluster atoms={b.cluster} width={Math.min(345, window.innerWidth - 48)} height={150} />
        </div>
      )}

      {/* Inline portfolio comparison */}
      {b.compareAxis && (
        <div style={{ padding: '0 24px' }}>
          <InlineComparison axisKey={b.compareAxis} focusCompanyId="smithfield"
            label={AXES.find(a => a.key === b.compareAxis)?.label} />
        </div>
      )}

      {/* Citation table */}
      {b.citedAtoms && (
        <div style={{ padding: '0 24px' }}>
          <InlineCitationTable atoms={b.citedAtoms} compact />
        </div>
      )}

      {/* Verdict */}
      {b.verdict && (
        <div style={{ marginTop: 'var(--m-brief-verdict-margin-top)', padding: 'var(--m-brief-verdict-pad)',
          background: 'var(--elev-2)' }}>
          <Kicker style={{ marginBottom: 'var(--m-brief-verdict-kicker-margin-bottom)' }}>Recommendation</Kicker>
          <div style={{ fontFamily: 'var(--serif)', fontSize: 'var(--m-brief-verdict-size)', lineHeight: 'var(--m-brief-verdict-line-height)', color: 'var(--ink)' }}>
            {b.verdict}
          </div>
        </div>
      )}

      {/* Footer */}
      <div style={{ marginTop: 'var(--m-brief-footer-margin-top)', padding: '0 24px',
        display: 'flex', justifyContent: 'space-between',
        fontFamily: 'var(--mono)', fontSize: 'var(--m-brief-footer-size)', letterSpacing: 'var(--m-brief-footer-letter-spacing)',
        textTransform: 'uppercase', color: 'var(--ink-3)' }}>
        <span>Confidence · <span style={{ color: 'var(--green)' }}>{b.confidence}</span></span>
        <span>{b.sources} docs · {b.atoms} atoms</span>
      </div>
    </div>
  );
}

function MComposer({ text, setText, onSend }) {
  return (
    <div style={{
      padding: 'var(--m-composer-pad)', background: 'var(--canvas)',
      borderTop: '1px solid var(--elev-1)',
    }}>
      <div style={{
        display: 'flex', alignItems: 'center', gap: 'var(--m-composer-inner-gap)',
        background: 'var(--elev-1)', padding: 'var(--m-composer-inner-pad)',
      }}>
        <span style={{ fontFamily: 'var(--mono)', fontSize: 'var(--m-composer-prompt-size)', color: 'var(--ink-3)' }}>›</span>
        <input
          value={text}
          onChange={(e) => setText(e.target.value)}
          onKeyDown={(e) => e.key === 'Enter' && onSend(text)}
          placeholder="Ask Alpha about Smithfield..."
          style={{
            flex: 1, background: 'transparent', border: 'none', outline: 'none',
            color: 'var(--ink)', fontFamily: 'var(--sans)', fontSize: 'var(--m-composer-input-size)',
          }}
        />
        <button onClick={() => onSend(text)} style={{
          background: 'transparent', border: 'none', color: 'var(--gold)',
          fontFamily: 'var(--mono)', fontSize: 'var(--m-composer-send-size)', letterSpacing: 'var(--m-composer-send-letter-spacing)',
          textTransform: 'uppercase', cursor: 'pointer',
        }}>Send →</button>
      </div>
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Sub-tab strip (Score / Chat / Signal) within the company view
// ────────────────────────────────────────────────────────────
function MTabStrip({ active, goChat, goScore, goNotebook }) {
  const tabs = [
    { id: 'score', label: 'Score', onClick: goScore },
    { id: 'chat',  label: 'Ask α', onClick: goChat },
  ];
  return (
    <div style={{ display: 'flex', gap: 'var(--m-tabstrip-gap)', padding: 'var(--m-tabstrip-pad)',
      borderBottom: '1px solid var(--elev-2)' }}>
      {tabs.map(t => (
        <button key={t.id} onClick={t.onClick} style={{
          background: 'transparent', border: 'none', padding: 'var(--m-tabstrip-btn-pad)',
          color: active === t.id ? 'var(--ink)' : 'var(--ink-3)',
          fontFamily: 'var(--mono)', fontSize: 'var(--m-tabstrip-size)', letterSpacing: 'var(--m-tabstrip-letter-spacing)',
          textTransform: 'uppercase', cursor: 'pointer', position: 'relative',
        }}>
          {t.label}
          {active === t.id && (
            <div style={{ position: 'absolute', left: 0, right: 0, bottom: -1,
              height: 'var(--m-tabstrip-indicator-height)', background: 'var(--ink)' }} />
          )}
        </button>
      ))}
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// Bottom tab bar (Index / Signal / Sources / Ask)
// ────────────────────────────────────────────────────────────
function MTabBar({ active, onTab }) {
  const tabs = [
    { id: 'index', label: 'Score' },
    { id: 'sources', label: 'Source' },
    { id: 'ask', label: 'Ask' },
  ];
  return (
    <div style={{
      position: 'fixed', bottom: 0, left: 0, right: 0, zIndex: 70,
      height: 'var(--m-tab-height)', background: 'var(--canvas)',
      borderTop: '1px solid var(--elev-1)',
      display: 'flex', alignItems: 'flex-start', padding: 'var(--m-tab-bar-pad)',
    }}>
      {tabs.map(t => (
        <button key={t.id} onClick={() => onTab && onTab(t.id)} style={{
          flex: 1, textAlign: 'center', fontFamily: 'var(--mono)',
          fontSize: 'var(--m-tab-label-size)', letterSpacing: '0.18em', textTransform: 'uppercase',
          color: active === t.id ? 'var(--ink)' : 'var(--ink-3)',
          background: 'transparent', border: 'none', cursor: 'pointer',
          padding: '0', display: 'flex', flexDirection: 'column',
          alignItems: 'center',
        }}>
          <div style={{
            width: 'var(--m-tab-dot-size)', height: 'var(--m-tab-dot-size)',
            background: active === t.id ? 'var(--ink)' : 'var(--ink-4)',
            marginBottom: 'var(--m-tab-dot-margin-bottom)',
          }} />
          <div>{t.label}</div>
        </button>
      ))}
    </div>
  );
}

// ────────────────────────────────────────────────────────────
// MobileApp — orchestrates screen state
// ────────────────────────────────────────────────────────────
function parseHash() {
  var h = location.hash.replace('#', '');
  var parts = h.split('/');
  return { screen: parts[0] || 'portfolio', company: parts[1] || 'smithfield' };
}

function MobileApp({ initial = 'portfolio', initialCompany = 'smithfield', initialQuery = null, toggleTheme, theme }) {
  var init = parseHash();
  const [screen, setScreenRaw] = React.useState(init.screen || initial);
  const [company, setCompany] = React.useState(init.company || initialCompany);
  const [chatContext, setChatContext] = React.useState(null);

  const setScreen = (s) => {
    setScreenRaw(s);
  };

  const activeTab = screen === 'chat' ? 'ask' : screen === 'notebook' ? 'sources' : 'index';

  // Sync hash whenever screen or company changes
  React.useEffect(() => {
    var newHash = screen === 'portfolio' ? '#portfolio' : '#' + screen + '/' + company;
    if (location.hash !== newHash) history.replaceState(null, '', newHash);
    document.documentElement.setAttribute('data-active-screen', screen);
  }, [screen, company]);

  // Back/forward support
  React.useEffect(() => {
    var handler = function() {
      var parsed = parseHash();
      setScreenRaw(parsed.screen || 'portfolio');
      setCompany(parsed.company || 'smithfield');
    };
    window.addEventListener('popstate', handler);
    return function() { window.removeEventListener('popstate', handler); };
  }, []);

  const handleTab = (id) => {
    if (id === 'index') setScreen('score');
    else if (id === 'ask') setScreen(company ? 'chat' : 'portfolio');
    else if (id === 'sources') setScreen(company ? 'notebook' : 'portfolio');
  };

  return (
    <div style={{
      width: '100vw', height: '100dvh', background: 'var(--canvas)',
      overflow: 'hidden', position: 'relative',
    }}>
      {/* All screens always in DOM so the picker's Sections tab can find [data-screen] elements */}
      <div style={{ position: 'absolute', inset: '0', overflowY: 'auto', display: screen === 'portfolio' ? 'block' : 'none' }} className="no-scrollbar">
        <MPortfolio goCompany={(id) => { setCompany(id); setScreenRaw('score'); }} />
      </div>
      <div style={{ position: 'absolute', inset: '0 0 78px', overflowY: 'auto', display: screen === 'score' ? 'block' : 'none' }} className="no-scrollbar">
        <MScore companyId={company}
          back={() => setScreen('portfolio')}
          goChat={(ctx) => { setChatContext(ctx || null); setScreen('chat'); }}
          goNotebook={() => setScreen('notebook')} />
      </div>
      <div style={{ position: 'absolute', inset: '0 0 78px', overflowY: 'auto', display: screen === 'chat' ? 'block' : 'none' }} className="no-scrollbar">
        <MChat companyId={company}
          chatContext={chatContext}
          onContextConsumed={() => setChatContext(null)}
          back={() => setScreen('portfolio')}
          goScore={() => setScreen('score')}
          goNotebook={() => setScreen('notebook')} />
      </div>
      <div style={{ position: 'absolute', inset: '0 0 78px', overflowY: 'auto', display: screen === 'notebook' ? 'block' : 'none' }} className="no-scrollbar">
        <MNotebook companyId={company}
          back={() => setScreen('portfolio')}
          goScore={() => setScreen('score')}
          goChat={() => setScreen('chat')} />
      </div>
      {screen !== 'portfolio' && <MTabBar active={activeTab} onTab={handleTab} />}
    </div>
  );
}

Object.assign(window, { MobileApp });
