// Home / Command Center v2 — Core 2.0 material

// ---------- Focus Now ----------
function FocusNow({ hero, list }) {
  return (
    <div className="focus-wrap">
      {/* Hero card */}
      <div className="hero">
        <div style={{ display: 'flex', alignItems: 'flex-start', gap: 22, position: 'relative', flexWrap: 'wrap' }}>
          <div style={{ flex: '1 1 340px', minWidth: 0 }}>
            <span className="hero-tag">
              <Icon name="circleAlert" size={12} strokeWidth={2} />
              {hero.tag} · Feature
            </span>
            <div className="hero-title">{hero.title}</div>
            <p className="hero-context">{hero.context}</p>

            <div className="hero-meta">
              <div className="m">
                <Avatar name={hero.owner} size="sm" />
                <span><b>{hero.owner}</b></span>
              </div>
              <div className="m">
                <Icon name="clock" size={15} strokeWidth={1.75} />
                <span>Due <b>{hero.due}</b></span>
              </div>
              <div className="m">
                <Icon name="gitBranch" size={15} strokeWidth={1.75} />
                <span>{hero.dep}</span>
              </div>
              <Label tone="orange" dot>Blocker · {hero.blocker}</Label>
            </div>

            <div className="hero-actions">
              <button className="btn btn-primary">
                <span>Open feature</span>
                <Icon name="arrowRight" size={16} strokeWidth={2} />
              </button>
              <button className="btn btn-white">
                <Icon name="message" size={16} strokeWidth={1.75} />
                <span>Message owner</span>
              </button>
              <button className="btn btn-stroke">
                <Icon name="eye" size={16} strokeWidth={1.75} />
                <span>Watch</span>
              </button>
            </div>
          </div>

          {/* Right stats */}
          <div className="hero-side">
            <div>
              <div className="lbl">Progress</div>
              <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginTop: 10 }}>
                <Ring percent={hero.progress} color="var(--warn)" size={56} />
                <div style={{ fontSize: 13, color: 'var(--t-secondary)', lineHeight: 1.4, letterSpacing: '-0.015em' }}>
                  <div><b style={{ color: 'var(--t-primary)', fontWeight: 600 }}>{hero.stage}</b></div>
                  <div>3 open sub-tasks</div>
                </div>
              </div>
            </div>

            <div>
              <div className="lbl">Contributors</div>
              <div style={{ marginTop: 10, display: 'flex', alignItems: 'center', gap: 10 }}>
                <AvatarStack names={hero.contributors} max={4} size="md" />
                <span style={{ fontSize: 12, color: 'var(--t-tertiary)', letterSpacing: '-0.02em' }}>{hero.contributors.length} people</span>
              </div>
            </div>
          </div>
        </div>
      </div>

      {/* Mini list */}
      <div className="focus-list">
        <div className="focus-list-head">
          <span className="lbl">Also on your desk</span>
          <a className="link" style={{ fontSize: 13, fontWeight: 600, color: 'var(--t-secondary)', padding: '6px 10px', borderRadius: 10, cursor: 'pointer' }}>See all 12 →</a>
        </div>
        <div>
          {list.map((it, i) => (
            <div className="focus-item" key={i}>
              <div className={`focus-pri p${it.p}`}>{it.p}</div>
              <div style={{ minWidth: 0 }}>
                <div className="t1 truncate">{it.title}</div>
                <div className="t2">{it.ctx}</div>
              </div>
              <span className="kind-tag">{['Decision','Project','Document','Milestone'][it.p-1]}</span>
              <Icon name="chevronRight" size={14} style={{ color: 'var(--t-tertiary)' }} strokeWidth={2} />
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

// ---------- Needs Review ----------
function NeedsReview({ items }) {
  const kindMap = {
    feature:  { tone: 'kind-lav',   icon: 'features' },
    decision: { tone: 'kind-peach', icon: 'decisions' },
    research: { tone: 'kind-mint',  icon: 'book' },
    approval: { tone: 'kind-cream', icon: 'check' },
  };
  return (
    <Card>
      <CardHead
        title="Needs Review"
        icon={<Icon name="inbox" size={18} style={{ color: 'var(--t-primary)' }} strokeWidth={1.75} />}
        right={<a className="link">Open inbox</a>}
      />
      <div className="review-hero">
        <span className="n tabular">{items.length}</span>
        <span className="lbl">items waiting on you</span>
      </div>
      <div>
        {items.map((it, i) => {
          const km = kindMap[it.kind] || kindMap.feature;
          return (
            <div className="review-item" key={i}>
              <div className={`kind-square ${km.tone}`}>
                <Icon name={km.icon} size={16} strokeWidth={1.75} />
              </div>
              <div className="review-middle">
                <div className="t1 truncate">{it.title}</div>
                <div className="t2 truncate">{it.meta}</div>
              </div>
              <div className="review-right">
                <button className="review-btn">Review</button>
                <span className="rt">{it.time} ago</span>
              </div>
            </div>
          );
        })}
      </div>
    </Card>
  );
}

// ---------- Active Work ----------
function ActiveWork({ items }) {
  const kindMap = {
    feature: { tone: 'kind-lav',   icon: 'features' },
    project: { tone: 'kind-sky',   icon: 'projects' },
  };
  const toneMap = {
    'At risk':   { label: 'red',    prog: 'red' },
    'In review': { label: 'blue',   prog: 'blue' },
    'Building':  { label: 'yellow', prog: 'warn' },
    'Blocked':   { label: 'red',    prog: 'red' },
    'Design':    { label: 'purple', prog: 'purple' },
    'On track':  { label: 'green',  prog: 'green' },
  };
  return (
    <Card>
      <CardHead
        title="Active Work"
        count={items.length}
        right={
          <div style={{ display: 'flex', gap: 6, alignItems: 'center' }}>
            <button className="btn btn-white btn-sm">
              <Icon name="filter" size={14} strokeWidth={1.75} />
              <span>Filter</span>
            </button>
            <a className="link">View all</a>
          </div>
        }
      />
      <div style={{ padding: 4 }}>
        {items.map((it, i) => {
          const km = kindMap[it.kind];
          const tm = toneMap[it.status];
          return (
            <div className="work-row" key={i}>
              <div className="lead">
                <div className={`kind-square ${km.tone}`}>
                  <Icon name={km.icon} size={16} strokeWidth={1.75} />
                </div>
                <div className="name">
                  <div className="n1 truncate">{it.name}</div>
                  <div className="n2 truncate">{it.sub}</div>
                </div>
              </div>
              <div className="col-avatars">
                <AvatarStack names={it.owners} max={3} size="sm" />
              </div>
              <div className="col-status">
                <Label tone={tm.label} dot size="sm">{it.status}</Label>
              </div>
              <div className="col-progress progress-wrap">
                <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
                  <span className="p-num">{it.progress}%</span>
                  <span className={`due${it.dueLate ? ' late' : ''}`}>{it.due}</span>
                </div>
                <ProgressBar value={it.progress} tone={tm.prog} />
              </div>
              <Icon name="chevronRight" size={14} className="col-chev" strokeWidth={2} />
            </div>
          );
        })}
      </div>
    </Card>
  );
}

// ---------- Recent Decisions ----------
function RecentDecisions({ items }) {
  return (
    <Card>
      <CardHead title="Recent Decisions" right={<a className="link">All decisions</a>} />
      <div style={{ padding: 4 }}>
        {items.map((it, i) => (
          <div className="dec-item" key={i}>
            <div className="dec-head">
              <Label tone={it.tone === 'green' ? 'green' : it.tone === 'yellow' ? 'yellow' : 'red'} dot size="sm">{it.status}</Label>
              <span className="when">{it.when}</span>
            </div>
            <div className="dec-title">{it.title}</div>
            <div className="dec-ctx">{it.ctx}</div>
            <div className="dec-meta">
              <AvatarStack names={it.participants} max={3} size="sm" />
              <span className="owner">{it.owner}</span>
            </div>
          </div>
        ))}
      </div>
    </Card>
  );
}

// ---------- Product Journey ----------
function ProductJourney({ journey }) {
  const { phases, ticks, youAt, quarter } = journey;
  return (
    <Card>
      <div className="journey">
        <div className="journey-header">
          <div className="title">
            <Icon name="target" size={20} style={{ color: 'var(--primary-01)' }} strokeWidth={1.75} />
            <span>Product Journey</span>
            <span className="qtr">{quarter}</span>
          </div>
          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
            <button className="btn btn-white btn-sm">This quarter</button>
            <a className="link">Open roadmap →</a>
          </div>
        </div>

        <div className="journey-track">
          <div className="journey-line" />
          <div className="journey-line-fill" style={{ width: `${youAt * 100}%` }} />

          {ticks.map((t, i) => (
            <div
              key={i}
              className={`jp-tick${t.state === 'done' ? ' done' : ''}`}
              style={{ left: `calc(${(t.at * 100).toFixed(2)}% - 4px)` }}
              title={t.label}
            />
          ))}

          <div className="journey-phases">
            {phases.map((p) => (
              <div className="journey-phase" key={p.key}>
                <span className={`jp-label ${p.state}`}>{p.label}</span>
                <div className={`jp-node ${p.state}`}>
                  {p.state === 'done' && <Icon name="check" size={16} strokeWidth={2.5} />}
                  {p.state === 'now' && (
                    <span style={{
                      width: 8, height: 8, background: 'white', borderRadius: '50%',
                      boxShadow: '0 0 0 3px rgba(255,255,255,0.35)'
                    }} />
                  )}
                </div>
                <div className="jp-title">{p.title}</div>
                <div className="jp-date">{p.date}</div>
              </div>
            ))}
          </div>

          <div className="you-here" style={{ left: `calc(${youAt * 100}% - 46px)` }}>
            <span className="pulse" />
            You are here
          </div>
        </div>

        <div className="journey-footer">
          <span className="lg"><i className="legend-dot" style={{ background: 'linear-gradient(180deg,#10B372,#00A656)' }} /> Completed</span>
          <span className="lg"><i className="legend-dot" style={{ background: 'linear-gradient(180deg,#5AA0FF,#2A85FF)' }} /> In progress</span>
          <span className="lg"><i className="legend-dot" style={{ background: 'var(--shade-08)' }} /> Upcoming</span>
          <span className="note">
            Attention shifting to <b>Launch — GA to Team & Enterprise</b> in ~3 weeks
          </span>
        </div>
      </div>
    </Card>
  );
}

// ---------- Recent Changes ----------
function RecentChanges({ groups }) {
  const toneMap = { brand: 'lav', blue: 'lav', green: 'mint', red: 'peach', orange: 'cream', purple: 'lav' };
  return (
    <Card>
      <CardHead title="Recent Changes" right={<a className="link">Activity log</a>} />
      <div style={{ padding: '0 4px 8px' }}>
        {groups.map((g, i) => (
          <div key={i}>
            <div className="act-day-label">{g.day}</div>
            {g.items.map((it, j) => (
              <div className="act-item" key={j}>
                <div className={`act-ico ${toneMap[it.tone] || 'peach'}`}>
                  <Icon name={it.ico} size={16} strokeWidth={1.75} />
                </div>
                <div className="act-text">
                  <b>{it.a}</b> <span className="a-ctx">{it.v}</span>{' '}
                  <b>{it.what}</b><span className="a-ctx">{it.extra}</span>
                </div>
                <div className="act-time">{it.time}</div>
              </div>
            ))}
          </div>
        ))}
      </div>
    </Card>
  );
}

// ---------- File thumbnails ----------
function ThumbPreview({ kind }) {
  if (kind === 'doc') {
    return (
      <div className="thumb-preview" style={{
        background: `
          radial-gradient(60% 80% at 0% 0%, rgba(202,189,255,0.35), transparent 60%),
          linear-gradient(180deg, #F9F5FF 0%, #F1EDF9 100%)
        `,
      }}>
        <div style={{ position: 'absolute', inset: '18px 22px', display: 'flex', flexDirection: 'column', gap: 6 }}>
          <div style={{ height: 8, width: '65%', background: 'rgba(23,23,15,0.28)', borderRadius: 3 }} />
          <div style={{ height: 5, width: '50%', background: 'rgba(23,23,15,0.14)', borderRadius: 2 }} />
          <div style={{ height: 5, width: '90%', background: 'rgba(23,23,15,0.10)', borderRadius: 2, marginTop: 8 }} />
          <div style={{ height: 5, width: '82%', background: 'rgba(23,23,15,0.10)', borderRadius: 2 }} />
          <div style={{ height: 5, width: '72%', background: 'rgba(23,23,15,0.10)', borderRadius: 2 }} />
          <div style={{ height: 5, width: '86%', background: 'rgba(23,23,15,0.10)', borderRadius: 2, marginTop: 6 }} />
          <div style={{ height: 5, width: '58%', background: 'rgba(23,23,15,0.10)', borderRadius: 2 }} />
        </div>
        <div className="thumb-badge">Research</div>
      </div>
    );
  }
  if (kind === 'diagram') {
    return (
      <div className="thumb-preview" style={{
        background: `
          radial-gradient(50% 80% at 100% 0%, rgba(177,229,252,0.45), transparent 60%),
          linear-gradient(180deg, #F5FAFE 0%, #EEF6FC 100%)
        `,
      }}>
        <svg viewBox="0 0 260 138" width="100%" height="100%" preserveAspectRatio="none" style={{ position: 'absolute', inset: 0 }}>
          <rect x="18" y="30" width="66" height="30" rx="8" fill="white" stroke="rgba(23,23,15,0.14)" strokeWidth="1.5" />
          <rect x="102" y="12" width="66" height="30" rx="8" fill="white" stroke="rgba(23,23,15,0.14)" strokeWidth="1.5" />
          <rect x="102" y="54" width="66" height="30" rx="8" fill="#2A85FF" stroke="rgba(42,133,255,0.55)" strokeWidth="1.5" />
          <rect x="102" y="96" width="66" height="30" rx="8" fill="white" stroke="rgba(23,23,15,0.14)" strokeWidth="1.5" />
          <rect x="186" y="54" width="60" height="30" rx="8" fill="white" stroke="rgba(23,23,15,0.14)" strokeWidth="1.5" />
          <path d="M84 45 L102 27" stroke="rgba(23,23,15,0.28)" strokeWidth="1.5" fill="none" strokeLinecap="round"/>
          <path d="M84 45 L102 69" stroke="#2A85FF" strokeWidth="1.75" fill="none" strokeLinecap="round"/>
          <path d="M84 45 L102 111" stroke="rgba(23,23,15,0.28)" strokeWidth="1.5" fill="none" strokeLinecap="round"/>
          <path d="M168 69 L186 69" stroke="#2A85FF" strokeWidth="1.75" fill="none" strokeLinecap="round"/>
          <rect x="26" y="40" width="34" height="4" fill="rgba(23,23,15,0.35)" rx="1.5" />
          <rect x="110" y="22" width="34" height="4" fill="rgba(23,23,15,0.35)" rx="1.5" />
          <rect x="110" y="64" width="34" height="4" fill="rgba(255,255,255,0.9)" rx="1.5" />
          <rect x="110" y="106" width="34" height="4" fill="rgba(23,23,15,0.35)" rx="1.5" />
          <rect x="194" y="64" width="34" height="4" fill="rgba(23,23,15,0.35)" rx="1.5" />
        </svg>
        <div className="thumb-badge">Architecture</div>
      </div>
    );
  }
  if (kind === 'frames') {
    return (
      <div className="thumb-preview" style={{
        background: `
          radial-gradient(60% 60% at 0% 100%, rgba(255,188,153,0.4), transparent 60%),
          linear-gradient(180deg, #FFF7F0 0%, #F8ECDF 100%)
        `,
        padding: 14, display: 'flex', gap: 8,
      }}>
        {[0,1,2].map(i => (
          <div key={i} style={{
            flex: 1, background: 'white',
            border: '1.5px solid rgba(23,23,15,0.08)',
            borderRadius: 10, padding: 8, display: 'flex', flexDirection: 'column', gap: 4,
            boxShadow: '0 2px 4px rgba(23,23,15,0.04)',
          }}>
            <div style={{ height: 5, width: '65%', background: 'rgba(23,23,15,0.24)', borderRadius: 2 }} />
            <div style={{ height: 3, width: '92%', background: 'rgba(23,23,15,0.10)', borderRadius: 2 }} />
            <div style={{ height: 3, width: '72%', background: 'rgba(23,23,15,0.10)', borderRadius: 2 }} />
            <div style={{
              flex: 1,
              background: i === 1
                ? 'linear-gradient(180deg,#E9F1FF,#D6E4FF)'
                : 'rgba(23,23,15,0.04)',
              borderRadius: 4, marginTop: 4,
              display: 'flex', alignItems: 'flex-end', padding: 3,
            }}>
              {i === 1 && <div style={{ height: 6, width: 24, background: '#2A85FF', borderRadius: 2 }} />}
            </div>
          </div>
        ))}
        <div className="thumb-badge">Design</div>
      </div>
    );
  }
  if (kind === 'chart') {
    return (
      <div className="thumb-preview" style={{
        background: `
          radial-gradient(60% 60% at 100% 100%, rgba(181,228,202,0.5), transparent 60%),
          linear-gradient(180deg, #F5FBF7 0%, #ECF6EF 100%)
        `,
      }}>
        <svg viewBox="0 0 260 138" width="100%" height="100%" preserveAspectRatio="none" style={{ position: 'absolute', inset: 0 }}>
          {[35,68,101].map(y => (<line key={y} x1="14" y1={y} x2="246" y2={y} stroke="rgba(23,23,15,0.06)" strokeWidth="1"/>))}
          {[42,58,50,74,66,92,80,102,88,116,104,124].map((h, i) => (
            <rect key={i} x={18 + i*19} y={126 - h} width="11" height={h} rx="3" fill="rgba(42,133,255,0.18)" />
          ))}
          <path
            d="M23 90 L42 76 L61 82 L80 58 L99 66 L118 40 L137 50 L156 26 L175 34 L194 14 L213 24 L232 12"
            stroke="#00A656" strokeWidth="2" fill="none" strokeLinecap="round" strokeLinejoin="round"
          />
          {[[23,90],[42,76],[80,58],[137,50],[194,14],[232,12]].map(([x,y], i) => (
            <circle key={i} cx={x} cy={y} r="2.5" fill="white" stroke="#00A656" strokeWidth="1.5" />
          ))}
        </svg>
        <div className="thumb-badge">Data</div>
      </div>
    );
  }
  return <div className="thumb-preview" />;
}

function RecentFiles({ files }) {
  return (
    <Card>
      <CardHead title="Recent Research & Files" right={<a className="link">All files</a>} />
      <div className="thumb-grid">
        {files.map((f, i) => (
          <div className="thumb" key={i}>
            <ThumbPreview kind={f.preview} />
            <div className="thumb-meta">
              <div className="thumb-title">{f.title}</div>
              <div className="thumb-sub">
                <span>{f.kind}</span>
                <span>·</span>
                <span className="truncate">{f.meta}</span>
              </div>
            </div>
          </div>
        ))}
      </div>
    </Card>
  );
}

// ---------- Home Hero (Phase 22) ----------
// Signature MY GENI visual moment. Editorial hero banner using the generated
// visual family + the personalised greeting + today's operating focus.
function HomeHero({ data }) {
  const user = (window.MYGENI_PEOPLE && window.MYGENI_PEOPLE.currentUser()) || {};
  const firstName = (user.displayName || data.user.name || 'there').split(' ')[0];
  const hour = new Date().getHours();
  const timeOfDay = hour < 5 ? 'evening' : hour < 12 ? 'morning' : hour < 17 ? 'afternoon' : 'evening';
  const inboxNeeds = (data.inboxItems || []).filter(i => i.state === 'needs-action').length;
  const overdueWork = (data.workItems || []).filter(w => w.dueBucket === 'overdue' && w.status !== 'done').length;
  const inFlight = (data.workItems || []).filter(w => w.status === 'in-progress').length;

  return (
    <div className="mg-home-hero" data-screen-label="Home Hero">
      <div className="mg-home-hero-img" role="img" aria-label="MY GENI signature visual" />
      <div className="mg-home-hero-body">
        <div className="mg-home-hero-eyebrow">
          <span className="mg-hh-dot" />
          <span>MY GENI · Product Operating System</span>
        </div>
        <h1 className="mg-home-hero-greet">
          Good {timeOfDay}, {firstName}.
        </h1>
        <p className="mg-home-hero-sub">
          {inboxNeeds + overdueWork > 0
            ? <>Today: <b>{inboxNeeds + overdueWork}</b> {inboxNeeds + overdueWork === 1 ? 'item needs' : 'items need'} your attention, and <b>{inFlight}</b> {inFlight === 1 ? 'thread is' : 'threads are'} in flight across the product.</>
            : <>Nothing needs your attention right now. <b>{inFlight}</b> {inFlight === 1 ? 'thread is' : 'threads are'} moving forward across the product.</>
          }
        </p>
        <div className="mg-home-hero-stats">
          <a href="#/inbox" className="mg-hh-stat">
            <div className="v">{inboxNeeds}</div>
            <div className="k">In your inbox</div>
          </a>
          <a href="#/my-work" className="mg-hh-stat">
            <div className="v">{overdueWork}</div>
            <div className="k">Overdue</div>
          </a>
          <a href="#/my-work/work" className="mg-hh-stat">
            <div className="v">{inFlight}</div>
            <div className="k">In flight</div>
          </a>
          <a href="#/decisions" className="mg-hh-stat">
            <div className="v">{(data.decisions || []).filter(d => d.status === 'open').length}</div>
            <div className="k">Open decisions</div>
          </a>
        </div>
      </div>
    </div>
  );
}

// ---------- Home page ----------
function Home({ data }) {
  const user = (window.MYGENI_PEOPLE && window.MYGENI_PEOPLE.currentUser()) || {};
  const firstName = (user.displayName || data.user.name || 'there').split(' ')[0];
  return (
    <main className="main" data-screen-label="01 Home">
      <HomeHero data={data} />
      <div className="page-header-row">
        <div>
          <h1 className="greeting">Focus, {firstName}.</h1>
          <div className="date-line">
            {data.today} · <b>4 things need your attention today</b>
          </div>
        </div>
        <div style={{ display: 'flex', gap: 10 }}>
          <button className="btn btn-white btn-sm">
            <Icon name="presentation" size={15} strokeWidth={1.75} />
            <span>Weekly review</span>
          </button>
          <button className="btn btn-white btn-sm">
            <Icon name="zap" size={15} strokeWidth={1.75} />
            <span>Ask Geni</span>
          </button>
        </div>
      </div>

      <div className="grid g-cols-3-1">
        <FocusNow hero={data.focusHero} list={data.focusList} />
        <NeedsReview items={data.needsReview} />
      </div>

      <div className="grid g-cols-3-1" style={{ marginTop: 12 }}>
        <ActiveWork items={data.activeWork} />
        <RecentDecisions items={data.decisions} />
      </div>

      <div style={{ marginTop: 12 }}>
        <ProjectMomentum pdata={window.MYGENI_PROJECT_DATA['p-mh-portal']} />
      </div>

      <div className="grid g-cols-1-1" style={{ marginTop: 12 }}>
        <RecentChanges groups={data.changes} />
        <RecentFiles files={data.files} />
      </div>
    </main>
  );
}

// ---------- Project Momentum (Phase 8) ----------
// Replaces the smaller ProductJourney tile. Combines the horizontal
// stage journey with two Core 2.0-style charts: planned vs actual
// progress + workstream readiness. Used on Home and re-used on the
// project Overview as the "momentum band".
function ProjectMomentum({ pdata }) {
  // Defensive: this panel is used on Home + Overview and receives whatever
  // project data is available. Any missing piece should degrade gracefully.
  if (!pdata) return null;
  const stages = (pdata.stages || []).map(s => ({
    n: s.n,
    name: s.name,
    status: s.status,
  }));
  const momentum = pdata.momentum || { weekly: [], workstreams: [], state: 'on-track', stateNote: '' };
  const currentStage = (pdata.stages || []).find(s => s.status === 'now');

  return (
    <div className="momentum" data-screen-label="ProjectMomentum">
      <div className="momentum-head">
        <h3>
          <Icon name="stages" size={15} strokeWidth={1.75} style={{ color: 'var(--primary-01)' }} />
          Project Momentum
          <span className="m-sub" style={{ marginLeft: 8 }}>· {pdata.name}</span>
        </h3>
        <span className={`momentum-state ${momentum.state}`}>
          <span className="dot" />
          <span>
            {momentum.state === 'on-track' && 'On track'}
            {momentum.state === 'slipping' && 'Slipping'}
            {momentum.state === 'ahead' && 'Ahead of schedule'}
          </span>
        </span>
      </div>

      <div className="momentum-journey">
        <HorizontalStages stages={stages} dense={true} active={currentStage?.n} />
      </div>

      <div className="momentum-body">
        <div className="momentum-block">
          <h4>
            <span>Planned vs Actual · cumulative %</span>
            <span className="h4-meta">Week {pdata.execution?.elapsedWeeks || 3} of {pdata.execution?.totalWeeksHi || 12}</span>
          </h4>
          <BarPair data={momentum.weekly.map(w => ({ label: w.label, planned: w.planned, actual: w.actual ?? 0 }))} />
          <div className="chart-legend" style={{ marginTop: 8 }}>
            <span className="k"><span className="sw" style={{ background: 'var(--chart-min)' }}/> Planned</span>
            <span className="k"><span className="sw" style={{ background: 'var(--chart-blue)' }}/> Actual</span>
            <span style={{ marginLeft: 'auto', color: 'var(--text-secondary)', fontWeight: 500 }}>{momentum.stateNote}</span>
          </div>
        </div>

        <div className="momentum-block">
          <h4>
            <span>Workstream readiness</span>
            <a href={`#/projects/${pdata.id}/plan`} className="link h4-meta" style={{ color: 'var(--text-secondary)' }}>Open plan →</a>
          </h4>
          <StackedProgressList rows={momentum.workstreams.slice(0, 7)} />
        </div>
      </div>
    </div>
  );
}

Object.assign(window, {
  FocusNow, NeedsReview, ActiveWork, RecentDecisions, ProductJourney, ProjectMomentum, RecentChanges, RecentFiles, Home
});
