-
Active Workstreams
-
${ws.active ?? 0}
-
${ws.blocked ?? 0} blocked
+const blockedTasks = summary.blocked_tasks ?? [];
+const wsById = Object.fromEntries((summary.open_workstreams ?? []).map(w => [w.id, w]));
+const todayCount = (summary.recent_progress ?? []).filter(e =>
+ e.created_at?.startsWith(new Date().toISOString().slice(0, 10))).length;
+const decCount = (decisions.open ?? 0) + (decisions.escalated ?? 0);
+
+const statusEl = html`
+
-
-
Blocking Decisions
-
${(decisions.open ?? 0) + (decisions.escalated ?? 0)}
-
${decisions.escalated ?? 0} escalated
+
+
+ ${blockedTasks.length === 0
+ ? html`
No tasks currently blocked.
`
+ : html`
${blockedTasks.map(t => {
+ const wsName = wsById[t.workstream_id]?.title ?? t.workstream_id?.slice(0,8) ?? "—";
+ return html`
+
${wsName}
+
${t.title}
+ ${t.blocking_reason ? html`
⊘ ${t.blocking_reason}
` : ""}
+
`;
+ })}
`
+ }
-
-
Blocked Tasks
-
${tasks.blocked ?? 0}
-
of ${tasks.total ?? 0} total
-
-
-
Events Today
-
${(summary.recent_progress ?? []).filter(e =>
- e.created_at?.startsWith(new Date().toISOString().slice(0,10))).length}
-
last 20 shown below
-
-
`);
+
`;
+
+statusEl.querySelector('[data-toggle="blocked-panel"]').addEventListener('click', () => {
+ const panel = statusEl.querySelector('#blocked-panel');
+ const isOpen = panel.style.display !== 'none';
+ panel.style.display = isOpen ? 'none' : 'block';
+ statusEl.querySelector('[data-toggle="blocked-panel"] small').textContent =
+ isOpen ? `of ${tasks.total ?? 0} total · click to expand` : `of ${tasks.total ?? 0} total · click to collapse`;
+});
+
+display(statusEl);
```
## What's next?
@@ -367,6 +398,13 @@ display(Inputs.table((summary.recent_progress ?? []).map(e => ({
.live-bar { font-size: 0.8rem; color: gray; text-align: right; margin-bottom: 0.5rem; }
.card { background: var(--theme-background-alt); border-radius: 8px; padding: 1rem; }
.card.warn { border: 2px solid orange; }
+.card-link { cursor: pointer; transition: box-shadow 0.15s, transform 0.1s; text-decoration: none; color: inherit; display: block; }
+.card-link:hover { box-shadow: 0 3px 10px rgba(0,0,0,0.13); transform: translateY(-1px); }
+.bt-list { display: flex; flex-direction: column; gap: 0.5rem; }
+.bt-row { background: var(--theme-background-alt); border-radius: 6px; padding: 0.6rem 0.9rem; border-left: 3px solid #ff7043; }
+.bt-meta { font-size: 0.7rem; color: gray; text-transform: uppercase; letter-spacing: 0.04em; margin-bottom: 0.15rem; }
+.bt-title { font-weight: 600; font-size: 0.9rem; }
+.bt-reason { font-size: 0.8rem; color: #b45309; margin-top: 0.25rem; }
.big-num { font-size: 2.5rem; font-weight: bold; margin: 0.25rem 0; }
.warning { background: #fff3cd; border: 1px solid #ffc107; border-radius: 4px; padding: 0.75rem; }
.hint-box { background: var(--theme-background-alt); border-left: 3px solid steelblue; border-radius: 4px; padding: 0.75rem 1rem; margin-top: 0.75rem; font-size: 0.9rem; }