From 889aa78589b3a98ef913b3dd605a023d2aad5053 Mon Sep 17 00:00:00 2001 From: ZDDC Date: Thu, 21 May 2026 12:19:40 -0500 Subject: [PATCH] refactor(browse): drop status-bar footer, route messages to toasts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The persistent #statusBar strip held whatever last-action message was written ("Loaded N items", "Created folder X", error text, …) and stuck around indefinitely, overlapping content while adding little value. Deleted the strip; existing statusInfo/statusError call sites now thunk through window.zddc.toast (the shared toast helper every tool already bundles). - Same function signatures: events.statusInfo / events.statusError keep working without touching the 70+ call sites across app.js, download.js, events.js, etc. - plan-review.js had its own private statusInfo/statusError pair (duplicated the DOM write); updated to route through zddc.toast as well. - statusClear becomes a no-op — toasts fade on their own (5s info, 8s error via cap-toast) and the toast helper's single-toast policy guarantees only the latest is visible. Removed: #statusBar div from template.html, .status-bar / .is-error / .is-info / --error / --info rules from base.css and tree.css. Zero remaining `statusBar` or `status-bar` references in the built browse.html. Full Playwright suite green (243/0/4). Co-Authored-By: Claude Opus 4.7 (1M context) --- browse/css/base.css | 15 --------------- browse/css/tree.css | 15 --------------- browse/js/events.js | 17 ++++++++++------- browse/js/plan-review.js | 18 ++++++++---------- browse/template.html | 2 -- 5 files changed, 18 insertions(+), 49 deletions(-) diff --git a/browse/css/base.css b/browse/css/base.css index 1179c70..0f45292 100644 --- a/browse/css/base.css +++ b/browse/css/base.css @@ -26,21 +26,6 @@ body { /* .hidden lives in shared/base.css; no per-tool override needed. */ -/* Status bar — shows transient errors/info */ -.status-bar { - padding: 0.4rem 1rem; - background: var(--bg-secondary); - border-top: 1px solid var(--border); - font-size: 0.85rem; - color: var(--text-muted); - min-height: 1.6rem; - line-height: 1.6rem; - flex-shrink: 0; -} - -.status-bar--error { color: #b00020; } -.status-bar--info { color: var(--primary); } - /* Read-only banner for the YAML editor — surfaced by preview-yaml.js when the listing's `writable` bit was false. CodeMirror's readOnly mode has no built-in visual signal beyond the disabled caret, so a diff --git a/browse/css/tree.css b/browse/css/tree.css index 397faf4..ca5726d 100644 --- a/browse/css/tree.css +++ b/browse/css/tree.css @@ -575,21 +575,6 @@ body { color: var(--text-muted); } -/* ── Status bar ──────────────────────────────────────────────────────────── */ - -.status-bar { - padding: 0.4rem 1rem; - background: var(--bg-secondary); - border-top: 1px solid var(--border); - font-size: 0.8rem; - color: var(--text-muted); - min-height: 1.6rem; - flex-shrink: 0; -} - -.status-bar.is-error { color: var(--danger); } -.status-bar.is-info { color: var(--text); } - /* ── Markdown plugin (right-pane internals when a .md is selected) ──────── */ /* CSS-Grid shell mirroring mdedit's layout: sidebar on the LEFT (front matter top + TOC bottom), content on the RIGHT (informational diff --git a/browse/js/events.js b/browse/js/events.js index bf85130..f6ba823 100644 --- a/browse/js/events.js +++ b/browse/js/events.js @@ -10,18 +10,21 @@ // call time, not at IIFE-eval time. function previewMod() { return window.app.modules.preview; } + // Notifications route through the shared toast helper (shared/ + // toast.js) — there's no persistent footer strip in browse. Same + // signatures as before so the 70+ existing call sites work + // unchanged; statusClear is a no-op (toasts fade on their own and + // single-toast policy guarantees only the latest is visible). function status(msg, kind) { - var el = document.getElementById('statusBar'); - if (!el) return; - el.textContent = msg || ''; - el.classList.remove('status-bar--error', 'status-bar--info'); - if (kind === 'error') el.classList.add('status-bar--error'); - if (kind === 'info') el.classList.add('status-bar--info'); + if (!msg) return; + if (!window.zddc || typeof window.zddc.toast !== 'function') return; + var level = kind === 'error' ? 'error' : 'info'; + window.zddc.toast(msg, level); } function statusError(msg) { status(msg, 'error'); } function statusInfo(msg) { status(msg, 'info'); } - function statusClear() { status('', null); } + function statusClear() { /* no-op — toasts fade on their own */ } async function pickLocalDir() { if (typeof window.showDirectoryPicker !== 'function') { diff --git a/browse/js/plan-review.js b/browse/js/plan-review.js index e688ced..c3e6312 100644 --- a/browse/js/plan-review.js +++ b/browse/js/plan-review.js @@ -32,19 +32,17 @@ var REVIEW_OFFSET_DAYS = 7; var RESPONSE_OFFSET_DAYS = 14; + // Notifications go through the shared toast helper — there's no + // persistent footer strip in browse anymore. function statusInfo(msg) { - var el = document.getElementById('statusBar'); - if (!el) return; - el.textContent = msg || ''; - el.classList.remove('status-bar--error'); - el.classList.add('status-bar--info'); + if (msg && window.zddc && typeof window.zddc.toast === 'function') { + window.zddc.toast(msg, 'info'); + } } function statusError(msg) { - var el = document.getElementById('statusBar'); - if (!el) return; - el.textContent = msg || ''; - el.classList.remove('status-bar--info'); - el.classList.add('status-bar--error'); + if (msg && window.zddc && typeof window.zddc.toast === 'function') { + window.zddc.toast(msg, 'error'); + } } // Compute today + N days as a YYYY-MM-DD string. diff --git a/browse/template.html b/browse/template.html index 2dea631..bfb2ace 100644 --- a/browse/template.html +++ b/browse/template.html @@ -98,8 +98,6 @@ -
-