// Page 1 — Dashboard // Only two blocks: alerts ribbon + Partitura (full-bleed timeline). // Quick stats live in the global StatusStrip; theme switcher in the footer. function AlertRibbonCard({ alert, onDismiss, onOpen }) { return (
{fmtAgo(alert.ts)}
{alert.ruleTitle}
PB-{alert.seq} · висит {fmtDuration(alert.durationMin)}
{alert.text}
); } function DashboardPage({ onNav, alerts, dismissAlert }) { const activeAlerts = alerts.filter(a => a.status === "active"); return (
{/* Block A — alerts ribbon */}

Активные алерты {activeAlerts.length} onNav("alerts")} style={{ cursor: "pointer", color: "var(--accent)", fontSize: 12, textTransform: "none", letterSpacing: 0 }}>Все алерты →

{activeAlerts.length === 0 ? (
● Алертов нет
Все агенты работают штатно.
) : (
{activeAlerts.map((a) => ( dismissAlert(a.id)} onOpen={() => onNav("alerts")} /> ))}
)} {/* Block B — Партитура смены (main content) */}

Партитура смены за 24 часа · клик по треку фильтрует панель справа

); } window.DashboardPage = DashboardPage;