// =============================================================
// Screens — Inbox, PrototypesIndex, PrototypeDetail, SignalsIndex, DocView, BetasIndex, DecisionsIndex
// =============================================================
function Inbox({ onCapture }) {
const [draft, setDraft] = React.useState('');
return (
Recent · 7
↓ newest first
{INBOX.map(item => (
{item.ts}
{item.text}
{item.from}
))}
);
}
function PrototypeListCard({ p, onOpen }) {
const [hover, setHover] = React.useState(false);
return (
onOpen(p.id)}
onMouseEnter={() => setHover(true)}
onMouseLeave={() => setHover(false)}
style={{
background: 'var(--paper)',
border: '1px solid var(--border)',
borderRadius: 'var(--r-2)',
padding: '20px 22px',
display: 'flex',
flexDirection: 'column',
gap: 10,
position: 'relative',
cursor: 'pointer',
transition: 'border-color 120ms ease',
borderColor: hover ? 'var(--ink)' : 'var(--border)',
}}>
{hover && }
{p.id} · Prototype
{p.pitch}
Learning q.
{p.learning}
Smallest test
{p.test}
→ {p.target}
{p.signal} signal
);
}
function PrototypesIndex({ onOpen }) {
const [filter, setFilter] = React.useState('All');
const filters = ['All', 'Experiment', 'Signal review', 'Parked'];
const list = filter === 'All' ? PROTOTYPES : PROTOTYPES.filter(p => p.stageLabel === filter);
return (
New prototype}
/>
{filters.map(f => (
setFilter(f)}>{f}
))}
{list.length} of {PROTOTYPES.length}
);
}
function PrototypeDetail({ id, onBack }) {
const p = PROTOTYPES.find(p => p.id === id) || PROTOTYPES[0];
const stageIdx = { 'parked': 0, 'experiment': 3, 'signal': 4, 'experiment-active': 3 }[p.stage] ?? 3;
return (
Back to prototypes
}
/>
);
}
function Field({ label, value }) {
return (
);
}
function SidebarField({ label, value }) {
return (
);
}
function SignalsIndex() {
return (
Record signal}
/>
| ID |
Prototype |
Level |
What happened |
Source |
Date |
{SIGNALS.map(s => (
{s.id} |
{s.proto} |
|
{s.what} |
{s.source} |
{s.date} |
))}
);
}
function BetasIndex() {
return (
One beta plan in draft.
WNO-021 · Concierge triage · pending Binky approval
Open draft →
);
}
function DecisionsIndex() {
const decisions = [
{ id: 'DEC-001', title: 'Shorten organisation name from whywhynot to whynot.', status: 'Accepted', date: '2026-01-08' },
{ id: 'DEC-002', title: 'Maintain A1 Incubating until first prototype candidates review.', status: 'Open', date: '—' },
{ id: 'DEC-003', title: 'Initial promotion targets: Helix, Coulomb, Sloppers, Plenitude, Binky, Tegwick.', status: 'Open', date: '—' },
];
return (
{decisions.map(d => (
{d.id}
{d.title}
{d.status}
{d.date}
))}
);
}
Object.assign(window, { Inbox, PrototypesIndex, PrototypeDetail, SignalsIndex, BetasIndex, DecisionsIndex, Field, SidebarField, PrototypeListCard });