diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 0fefa1d..e7d9c95 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -107,3 +107,12 @@ input:focus { outline: 0; border-color: var(--accent); } font-variant-numeric: tabular-nums; color: var(--ink-dim); } .summary-row span:last-child { color: var(--ink); font-family: ui-monospace, monospace; } + +/* Planning: today's tasks as clickable seed chips */ +.tasklist { display: flex; flex-wrap: wrap; gap: 8px; } +.task-chip { + padding: 6px 10px; border: 1px solid var(--line); border-radius: 999px; + background: var(--bg); color: var(--ink); font: inherit; font-size: 13px; + cursor: pointer; text-align: left; +} +.task-chip:hover { border-color: var(--accent); color: var(--accent); } diff --git a/internal/web/static/app.js b/internal/web/static/app.js index b766f3e..001df47 100644 --- a/internal/web/static/app.js +++ b/internal/web/static/app.js @@ -136,11 +136,33 @@ function updatePlanningCoach(coach) { } } +// updatePlanningTasks renders today's Marvin tasks as clickable seed chips. +// Clicking a chip fills the intent field; the coach pipeline is unchanged. +// idle/error/empty render nothing; pending shows a quiet loading line. +function updatePlanningTasks(tasks) { + const el = document.getElementById('tasksBand'); + if (!el) return; + if (!tasks || tasks.status === 'idle' || tasks.status === 'error') { el.innerHTML = ''; return; } + if (tasks.status === 'pending') { el.innerHTML = `
`; return; } + const list = tasks.tasks || []; + if (!list.length) { el.innerHTML = ''; return; } + const chips = list.map((t, i) => + ``).join(''); + el.innerHTML = `