diff --git a/web/public/app.js b/web/public/app.js index b1a378f..5cb56ff 100644 --- a/web/public/app.js +++ b/web/public/app.js @@ -183,7 +183,13 @@ function renderBoard() { if (e.target.closest('.switch')) return; card.classList.toggle('collapsed'); }); - card.querySelector('.cat-toggle').addEventListener('change', (e) => { + const catToggle = card.querySelector('.cat-toggle'); + // A partial selection (some but not all agents on) must look "partial", + // not "off" — an unchecked master switch reads as "category disabled" + // even when most of its agents are still on. Indeterminate = the middle + // state; clicking it from there selects everything (browser default). + catToggle.indeterminate = selCount > 0 && selCount < group.agents.length; + catToggle.addEventListener('change', (e) => { const on = e.target.checked; for (const a of group.agents) { if (on) state.selected.add(a.id); else state.selected.delete(a.id); } renderBoard(); diff --git a/web/public/style.css b/web/public/style.css index 6fd1956..2fd4336 100644 --- a/web/public/style.css +++ b/web/public/style.css @@ -253,6 +253,9 @@ textarea { resize: vertical; min-height: 72px; } .switch .thumb { position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; border-radius: 50%; background: var(--surface); transition: transform .15s; box-shadow: 0 1px 2px rgba(0,0,0,.25); } .switch input:checked + .track { background: var(--accent); } .switch input:checked + .track + .thumb { transform: translateX(13px); } +/* partial selection (some agents on, not all) — reads as "partial", not "off" */ +.switch input:indeterminate + .track { background: var(--border-strong); } +.switch input:indeterminate + .track + .thumb { transform: translateX(7px); background: var(--accent); } .custom-leads { display: flex; flex-direction: column; gap: var(--sp-2); } .custom-lead-chip { display: flex; align-items: center; gap: var(--sp-2); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px var(--sp-3); font-size: 12px; background: var(--surface-2); }