Compare commits

..

No commits in common. "a6cb847f2f49eca68d66b6265bdeba9a6d2931c0" and "0a6f9fe60a6c811b023b2ae8d40b9d42ca3cd8e9" have entirely different histories.

5 changed files with 49 additions and 23 deletions

View file

@ -26,6 +26,21 @@ body {
/* .hidden lives in shared/base.css; no per-tool override needed. */ /* .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 /* Read-only banner for the YAML editor surfaced by preview-yaml.js
when the listing's `writable` bit was false. CodeMirror's readOnly when the listing's `writable` bit was false. CodeMirror's readOnly
mode has no built-in visual signal beyond the disabled caret, so a mode has no built-in visual signal beyond the disabled caret, so a

View file

@ -244,11 +244,6 @@ body {
.preview-pane__body { .preview-pane__body {
flex: 1; flex: 1;
min-height: 0; /* critical: lets the flex child shrink to fit
the viewport instead of growing to its
content's natural size (which clips the
YAML editor's bottom when there are many
lines, even with the editor's own scroll) */
overflow: auto; overflow: auto;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -580,6 +575,21 @@ body {
color: var(--text-muted); 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) ──────── */ /* ── Markdown plugin (right-pane internals when a .md is selected) ──────── */
/* CSS-Grid shell mirroring mdedit's layout: sidebar on the LEFT /* CSS-Grid shell mirroring mdedit's layout: sidebar on the LEFT
(front matter top + TOC bottom), content on the RIGHT (informational (front matter top + TOC bottom), content on the RIGHT (informational

View file

@ -10,21 +10,18 @@
// call time, not at IIFE-eval time. // call time, not at IIFE-eval time.
function previewMod() { return window.app.modules.preview; } 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) { function status(msg, kind) {
if (!msg) return; var el = document.getElementById('statusBar');
if (!window.zddc || typeof window.zddc.toast !== 'function') return; if (!el) return;
var level = kind === 'error' ? 'error' : 'info'; el.textContent = msg || '';
window.zddc.toast(msg, level); 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');
} }
function statusError(msg) { status(msg, 'error'); } function statusError(msg) { status(msg, 'error'); }
function statusInfo(msg) { status(msg, 'info'); } function statusInfo(msg) { status(msg, 'info'); }
function statusClear() { /* no-op — toasts fade on their own */ } function statusClear() { status('', null); }
async function pickLocalDir() { async function pickLocalDir() {
if (typeof window.showDirectoryPicker !== 'function') { if (typeof window.showDirectoryPicker !== 'function') {

View file

@ -32,17 +32,19 @@
var REVIEW_OFFSET_DAYS = 7; var REVIEW_OFFSET_DAYS = 7;
var RESPONSE_OFFSET_DAYS = 14; var RESPONSE_OFFSET_DAYS = 14;
// Notifications go through the shared toast helper — there's no
// persistent footer strip in browse anymore.
function statusInfo(msg) { function statusInfo(msg) {
if (msg && window.zddc && typeof window.zddc.toast === 'function') { var el = document.getElementById('statusBar');
window.zddc.toast(msg, 'info'); if (!el) return;
} el.textContent = msg || '';
el.classList.remove('status-bar--error');
el.classList.add('status-bar--info');
} }
function statusError(msg) { function statusError(msg) {
if (msg && window.zddc && typeof window.zddc.toast === 'function') { var el = document.getElementById('statusBar');
window.zddc.toast(msg, 'error'); if (!el) return;
} el.textContent = msg || '';
el.classList.remove('status-bar--info');
el.classList.add('status-bar--error');
} }
// Compute today + N days as a YYYY-MM-DD string. // Compute today + N days as a YYYY-MM-DD string.

View file

@ -98,6 +98,8 @@
</div> </div>
</main> </main>
<div id="statusBar" class="status-bar"></div>
<!-- Help Panel --> <!-- Help Panel -->
<aside id="help-panel" class="help-panel" hidden aria-labelledby="help-panel-title"> <aside id="help-panel" class="help-panel" hidden aria-labelledby="help-panel-title">
<div class="help-panel__header"> <div class="help-panel__header">