diff --git a/static/app.js b/static/app.js index ab0bcde..3c53cea 100644 --- a/static/app.js +++ b/static/app.js @@ -517,7 +517,7 @@ async function clientAutoTrimBounds(fid) { function applyTheme(t) { document.documentElement.dataset.theme = t; - $('theme-btn').textContent = t === 'dark' ? '☀️' : '🌙'; + $('theme-btn').innerHTML = t === 'dark' ? '' : ''; $('theme-btn').title = t === 'dark' ? 'Switch to light mode' : 'Switch to dark mode'; localStorage.setItem('vcf-theme', t); } @@ -6244,7 +6244,7 @@ loadSettings().then(() => { const key = (s.elevenlabs_api_key || '').trim(); const inp = $('el-api-key'), st = $('el-key-status'); if (inp) inp.placeholder = key ? '••••••••••••••• (key saved)' : 'ElevenLabs API key (free — unlocks full library)…'; - if (st) { st.textContent = key ? '✓ Key active' : 'No key — max 3 results'; st.className = 'el-key-status ' + (key ? 'el-key-ok' : 'el-key-none'); } + if (st) { st.innerHTML = key ? ' Key active' : 'No key — max 3 results'; st.className = 'el-key-status ' + (key ? 'el-key-ok' : 'el-key-none'); } elFetch(); }).catch(() => elFetch()); } @@ -6256,7 +6256,7 @@ loadSettings().then(() => { fetch('/api/settings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ elevenlabs_api_key: val }) }) .then(() => { const st = $('el-key-status'); - if (st) { st.textContent = '✓ Key saved'; st.className = 'el-key-status el-key-ok'; } + if (st) { st.innerHTML = ' Key saved'; st.className = 'el-key-status el-key-ok'; } if (inp) { inp.value = ''; inp.placeholder = '••••••••••••••• (key saved)'; } _elPage = 0; elFetch(); }); @@ -6306,7 +6306,7 @@ loadSettings().then(() => { const res = await fetch('/api/elevenlabs/voices?' + elParams()); const data = await res.json(); if (data.detail) { - if (grid) grid.innerHTML = `
Configure the service URLs you actually use first. Advanced payloads, folders, and keys are tucked away below.
+Configure the service URLs you use. Advanced payloads, folders, and keys are tucked away below.
These are the endpoints you change most often. NVIDIA TTS and STT are grouped separately.
+ +POST /v1/audio/speech.
+ vd_... virtual voices.
+ audio_prompt.
+ audio_prompt and transcript.
+ POST /v1/audio/transcriptions.
+ These are the endpoints you change most often. Qwen3 TTS, NVIDIA TTS, and STT are grouped separately.
-POST /v1/audio/speech.
- vd_... virtual voices.
- audio_prompt.
- audio_prompt and transcript.
- POST /v1/audio/transcriptions.
- POST /v1/audio/transcriptions.
- POST /v1/audio/transcriptions.
- Small behavior switches for previews and OpenAI-compatible TTS calls.
-text, language, and audio_prompt.
+ Optional multipart fields. The app supplies text, language, audio_prompt.
Export all voices and settings as a ZIP for backup or migration. Import to restore. API keys are excluded from exports.
-Export all voices and settings as a ZIP for backup or migration. Import to restore. API keys are excluded from exports.
+Browse public voice clip sources, preview direct audio files, and import voices from the web.
@@ -61,7 +61,7 @@