diff --git a/zddc/internal/apps/embedded/archive.html b/zddc/internal/apps/embedded/archive.html index e713d6b..f13ef68 100644 --- a/zddc/internal/apps/embedded/archive.html +++ b/zddc/internal/apps/embedded/archive.html @@ -2717,7 +2717,7 @@ td[data-field="trackingNumber"] {
ZDDC Archive - v0.0.27-beta · 2026-06-15 14:57:53 · 8473ed3 + v0.0.27-beta · 2026-06-16 04:53:19 · 2b32ace
diff --git a/zddc/internal/apps/embedded/browse.html b/zddc/internal/apps/embedded/browse.html index db8d2bf..405fd16 100644 --- a/zddc/internal/apps/embedded/browse.html +++ b/zddc/internal/apps/embedded/browse.html @@ -2824,7 +2824,7 @@ li.CodeMirror-hint-active {
ZDDC Browse - v0.0.27-beta · 2026-06-15 14:57:53 · 8473ed3 + v0.0.27-beta · 2026-06-16 04:53:19 · 2b32ace
@@ -14444,8 +14444,12 @@ window.__ZDDC_SCHEMA__ = { box.querySelector('#acc-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + // Close on a genuine backdrop click only — not when a drag that began + // inside the dialog (selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); document.addEventListener('keydown', onKeydown); @@ -14762,8 +14766,10 @@ window.__ZDDC_SCHEMA__ = { box.querySelector('#stage-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); box.querySelector('#stage-submit').addEventListener('click', function () { var sel = box.querySelector('input[name="stage-target"]:checked'); @@ -14813,8 +14819,10 @@ window.__ZDDC_SCHEMA__ = { box.querySelector('#unstage-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); box.querySelector('#unstage-submit').addEventListener('click', function () { var target = input.value.trim(); @@ -15410,8 +15418,12 @@ window.__ZDDC_SCHEMA__ = { box.querySelector('#ct-cancel').addEventListener('click', function () { close(); reject(new Error('cancelled')); }); + // Close on a genuine backdrop click only — not when a drag that began + // inside the dialog (selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); overlay.addEventListener('click', function (e) { - if (e.target === overlay) { close(); reject(new Error('cancelled')); } + if (e.target === overlay && pressedBackdrop) { close(); reject(new Error('cancelled')); } }); document.addEventListener('keydown', onKeydown); submit.addEventListener('click', function () { @@ -16318,7 +16330,11 @@ window.__ZDDC_SCHEMA__ = { function close() { if (overlay.parentNode) overlay.parentNode.removeChild(overlay); } function cancel() { close(); resolve(null); } box.querySelector('#pp-cancel').addEventListener('click', cancel); - overlay.addEventListener('click', function (e) { if (e.target === overlay) cancel(); }); + // Close on a genuine backdrop click only — NOT when a drag that began + // inside the dialog (e.g. selecting text in an input) ends out here. + var pressedBackdrop = false; + overlay.addEventListener('mousedown', function (e) { pressedBackdrop = (e.target === overlay); }); + overlay.addEventListener('click', function (e) { if (e.target === overlay && pressedBackdrop) cancel(); }); box.querySelector('#pp-submit').addEventListener('click', function () { var sel = box.querySelector('input[name="pp-party"]:checked'); if (!sel) { statusError('Pick a party.'); return; } diff --git a/zddc/internal/apps/embedded/classifier.html b/zddc/internal/apps/embedded/classifier.html index b68d291..4fd0992 100644 --- a/zddc/internal/apps/embedded/classifier.html +++ b/zddc/internal/apps/embedded/classifier.html @@ -1402,7 +1402,7 @@ body.is-elevated::after { /* Folder Item */ .folder-item { display: flex; - align-items: center; + align-items: flex-start; /* toggle/icon sit on the name line; count drops below */ padding: 0.5rem; cursor: pointer; border-radius: var(--radius); @@ -1487,8 +1487,15 @@ body.is-elevated::after { color: var(--text-muted); } -.folder-name { +/* Name + count stacked vertically (count below the name, not right-aligned). */ +.folder-namebox { flex: 1; + min-width: 0; + display: flex; + flex-direction: column; +} + +.folder-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -1497,7 +1504,6 @@ body.is-elevated::after { .folder-count { font-size: 11px; color: var(--text-muted); - margin-left: 0.5rem; } .folder-children { @@ -1919,7 +1925,15 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o .trev__inner .tcell__name { color: var(--primary); } .tcell__preview { text-decoration: none; cursor: pointer; } .tcell__preview:hover { text-decoration: underline; } -.ttable__cell:hover .tnode__actions, .ttable__rev:hover .tnode__actions { opacity: 1; } +/* The hover-only node controls must NOT reserve column width (they're invisible + normally). Float them over the right of the cell instead of leaving them in + flow — .tcell__inner is sticky, so it's the positioning context — so each + column sizes to its value alone. */ +.ttable .tnode__actions { + position: absolute; right: 0.25rem; top: 50%; transform: translateY(-50%); + margin-left: 0; padding-left: 0.25rem; background: var(--bg); pointer-events: none; +} +.ttable__cell:hover .tnode__actions, .ttable__rev:hover .tnode__actions { opacity: 1; pointer-events: auto; } .ttable .drop-hover { outline: 2px solid var(--primary); outline-offset: -2px; } .ttable__file { padding: 0.1rem 0.4rem; } .ttable__drop { color: var(--text-muted); font-style: italic; font-size: 0.75rem; } @@ -1936,6 +1950,36 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o .tfile__badge--ok { color: var(--success, #16a34a); } .tfile__badge--err { color: var(--danger); } +/* ── By-tracking flat editable grid (one row per file) ──────────────────── */ +.ttable--grid { width: auto; } +.ttable--grid td.tg-td { padding: 0.1rem 0.35rem; vertical-align: middle; } +.ttable--grid th.tg-th { white-space: nowrap; } /* .column-resizer (spreadsheet.css) sits in the sticky th */ +.tg-input { + width: 100%; min-width: 4rem; box-sizing: border-box; + padding: 0.12rem 0.3rem; border: 1px solid transparent; border-radius: var(--radius); + background: transparent; color: var(--text); font: inherit; font-size: 0.8rem; +} +.tg-input:hover { border-color: var(--border); } +.tg-input:focus { border-color: var(--primary); background: var(--bg); outline: none; } +.tg-tn .tg-input { font-family: var(--mono, monospace); } +.tg-input.is-warn { border-color: var(--warning, #b8860b); } +.tg-orig__link { color: var(--text-muted); white-space: nowrap; text-decoration: none; cursor: pointer; } +.tg-orig__link:hover { text-decoration: underline; } +.tg-status, .tg-x { text-align: center; } +.tg-x__btn { opacity: 0.5; } +.tg-row:hover .tg-x__btn { opacity: 1; } +.tg-row--err .tg-status { color: var(--danger); } +.tg-drop-hover { outline: 2px dashed var(--primary); outline-offset: -3px; background: var(--primary-light); } + +/* "Columns ▾" chooser menu */ +.col-chooser { + position: fixed; z-index: 9600; background: var(--bg); + border: 1px solid var(--border); border-radius: var(--radius); + box-shadow: 0 6px 18px rgba(0,0,0,0.18); padding: 0.3rem; min-width: 11rem; +} +.col-chooser__item { display: flex; align-items: center; gap: 0.4rem; padding: 0.25rem 0.4rem; font-size: 0.83rem; cursor: pointer; border-radius: var(--radius); } +.col-chooser__item:hover { background: var(--bg-hover); } + /** * Spreadsheet Styles * Table, cells, editing, and row states @@ -2421,7 +2465,7 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o
ZDDC Classifier - v0.0.27-beta · 2026-06-15 14:57:53 · 8473ed3 + v0.0.27-beta · 2026-06-16 04:53:19 · 2b32ace
@@ -2579,11 +2623,11 @@ input.tfile__name:focus { border-color: var(--primary); background: var(--bg); o
- - Folders join with “-” into the tracking number; the leaf folder is the revision — name it like “A (IFR)”. + + Drag files in, then type each one’s tracking number, revision (e.g. “A (IFR)”), and title. A file that’s already ZDDC-named fills in automatically. Columns are hideable + resizable.
+ placeholder="Filter the grid…" aria-label="Filter the tracking grid">
diff --git a/zddc/internal/apps/embedded/transmittal.html b/zddc/internal/apps/embedded/transmittal.html index 8543b11..3ee875f 100644 --- a/zddc/internal/apps/embedded/transmittal.html +++ b/zddc/internal/apps/embedded/transmittal.html @@ -2770,7 +2770,7 @@ dialog.modal--narrow {
ZDDC Transmittal - v0.0.27-beta · 2026-06-15 14:57:52 · 8473ed3 + v0.0.27-beta · 2026-06-16 04:53:19 · 2b32ace
JavaScript not available