From ecef9138378efaf1cd2ec3da2dbb1d3d1cd28b1d Mon Sep 17 00:00:00 2001 From: mARTin-B78 Date: Tue, 26 May 2026 12:02:44 +0200 Subject: [PATCH] Tags: comma-separated + DB autocomplete; collapsible opt-groups; reorder voice list pane MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tags: - Comma-separated input (tag1, tag2, tag3) with placeholder updated - Custom autocomplete dropdown on last token, sources from _voices DB + localStorage - All comma-separated tokens saved individually to localStorage reuse list Inspector opt-groups: - Each group wrapped in opt-group-body for clean collapse - Chevron (▾/▸) in title, click title to toggle open/closed - Transcript and Loudness open by default; others collapsed - Loudness title preserves dBFS meta span + chevron Voice list pane reorder: - vl-synth-panel moved above vl-filters - vl-filters now sits directly above voice-list Co-Authored-By: Claude Sonnet 4.6 --- static/app.js | 184 +++++++++++++++++++++++----------- static/sections/s-voices.html | 14 +-- static/style.css | 144 +++++++++++++++----------- 3 files changed, 219 insertions(+), 123 deletions(-) diff --git a/static/app.js b/static/app.js index 79eb23e..43a0ac4 100644 --- a/static/app.js +++ b/static/app.js @@ -116,7 +116,7 @@ function selectVoice(wrap) { ${makeStars(rating)} ${rating}/5 - +
@@ -249,20 +249,71 @@ function selectVoice(wrap) { }); genderSel?.addEventListener('change', () => applyGender(genderSel.value)); - // ── Tag input with reuse list ───────────────────────────────────────────── + // ── Tag input — comma-separated, autocomplete from DB + localStorage ──────── const tagInput = inspector.querySelector('.insp-tag-input'); - let _tagDl = document.getElementById('insp-tag-opts'); - if (!_tagDl) { _tagDl = document.createElement('datalist'); _tagDl.id = 'insp-tag-opts'; document.body.appendChild(_tagDl); } - _tagDl.innerHTML = getStoredTags().map(t => `