// Milestone detail — scope, cone, issues; forecasts stay ranges function MilestoneScreen({ onBack, onOpenIssue }) { const DS = window.CommiTeaDesignSystem_20e63b; const { Card, Tag, Badge, Button, Icon } = DS; const cols = window.CT_DATA.columns; const byState = (ids) => cols.flatMap((c) => c.issues.map((i) => ({ ...i, col: c.label }))).filter((i) => ids.includes(i.id)); const groups = [ { label: 'Steeping', issues: byState([87, 84]) }, { label: 'In review', issues: byState([92]) }, { label: 'Queued', issues: byState([102, 103, 99, 96, 78]) }, { label: 'Done', issues: byState([71, 69, 65]), muted: true }, ]; const Stat = ({ label, value, tone }) => (
{label}
{value}
); return (

milestone · due Mar 15 · soft — scope may flex

Beta

ahead of forecast 80% Mar 3–12
{/* stats strip */}
Drift · 7d
−2d · cone narrowed
80% this lands Mar 3–12} jade>

Comfortably ahead. Beta needs #87 more than it needs my commentary.

{groups.map((g) => (
{g.label} {g.issues.length}
{g.issues.map((i) => (
onOpenIssue({ id: i.id, title: i.title, labels: i.labels, days: i.days })} style={{ display: 'flex', alignItems: 'center', gap: 8, padding: '7px 20px', cursor: 'pointer', opacity: g.muted ? 0.6 : 1, }} onMouseEnter={(e) => { e.currentTarget.style.background = 'var(--paper-2)'; }} onMouseLeave={(e) => { e.currentTarget.style.background = 'transparent'; }} > #{i.id} {i.title} {(i.labels || []).filter((l) => l.startsWith('est/')).map((l) => )}
))}
))}
); } Object.assign(window, { MilestoneScreen });