/* Vooice — Dashboard home (desktop, primary product surface) */ function Dashboard({ width = 1320, height = 880, onNavigate }) { const [tick, setTick] = React.useState(0); const go = (k) => onNavigate && onNavigate(k); React.useEffect(() => { const id = setInterval(() => setTick(t => t + 1), 1000); return () => clearInterval(id); }, []); return (
{/* Top bar — unified AppHeader */} {/* Sidebar */} {/* Main */}
{/* Headline strip */}
ON THE LINE NOW
Calling Bayview Hair Studio for you — booking Thu 2pm.
00:{(20 + (tick % 30)).toString().padStart(2,'0')} elapsed · 3 actions queued, awaiting confirmation
{/* Metrics row */}
{[ { v: '14', u: 'this week', l: 'CALLS HANDLED' }, { v: '6', u: 'avg/day', l: 'OUTBOUND' }, { v: '92', u: '%', l: 'SLOT READ‑BACK PASS' }, { v: '3', u: 'pending', l: 'NEEDS YOUR EYES' }, ].map((m, i) => (
))}
{/* Two-up: Activity timeline + Inbox */}
FILTER · ALL
go('outbound-call')} /> go('call-detail')} />
); } const btnDark = { padding: '8px 14px', background: VC_TOKENS.signal, color: VC_TOKENS.paper, border:'none', cursor:'pointer', fontFamily:"'JetBrains Mono', monospace", fontSize: 11, fontWeight: 700, letterSpacing:'.12em', }; const btnDarkOutline = { padding: '8px 14px', background: 'transparent', color: VC_TOKENS.paper, border:`1px solid ${VC_TOKENS.paper}`, cursor:'pointer', fontFamily:"'JetBrains Mono', monospace", fontSize: 11, fontWeight: 700, letterSpacing:'.12em', }; function NavGroup({ title, items }) { return (
{title}
{items.map(it => (
{it.label} {it.count != null && ( {it.count} )}
))}
); } function ActivityRow({ time, type, who, body, action, highlight, live, onClick }) { const typeColor = { inbound: VC_TOKENS.sage, outbound: VC_TOKENS.signal, email: VC_TOKENS.ink3, message: VC_TOKENS.ink3, reminder: VC_TOKENS.butter, }[type] || VC_TOKENS.ink3; return (
{time}
{who} {live && LIVE}
{body}
{action}
); } function ConfirmRow({ channel, head, body, meta, cta, last }) { return (
{channel} WAITING
{head}
{body}
{meta}
); } window.Dashboard = Dashboard;