Per-tool pages + multi-engine transcribe with expert controls

- Split monolithic index.php into per-tool pages (ask, search, summarize,
  timeline, redact, transcribe), each with its own URL and bookmarkable state
- Shared shell: includes/layout.php + layout_footer.php; shared form:
  includes/tool_form.php used by all text-tool pages
- index.php now redirects authenticated users to ask.php; unauthenticated
  users see the login gate only
- transcribe.php: engine selector (GPU/OpenAI/Azure), model size (small/
  medium/large-v3), diarize, language, expert settings (beam, VAD, task,
  initial prompt)
- api/transcribe.php: engine routing — GPU (cuttlefish), OpenAI BYOK,
  Azure AI Speech; passes model/beam/task/vad/prompt to Whisper server
- tools.js: data-active-tool body attr drives setTool() on load; <a> nav
  tabs skip click listeners; null guards on form/passcodeForm; engine radio
  toggle shows/hides BYOK key inputs and model selector; RTF shown in status
- tools.css: styles for BYOK inputs, expert settings panel, prompt textarea

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-13 22:14:20 +02:00
parent d178fbf295
commit eaff2a4d86
13 changed files with 789 additions and 257 deletions
+71
View File
@@ -1218,3 +1218,74 @@ p {
gap: 0.5rem;
margin-top: 0.75rem;
}
/* ── Transcribe extended controls ─────────────────────────────────────── */
.byok-input {
font-size: 0.82rem;
padding: 0.3rem 0.6rem;
border: 1px solid var(--line);
border-radius: 6px;
background: var(--bg);
color: var(--ink);
width: 22rem;
max-width: 100%;
}
.byok-input--short { width: 9rem; }
.byok-input:focus { outline: 2px solid var(--teal); outline-offset: 1px; }
.inline-hint {
font-size: 0.75rem;
color: var(--muted);
margin-left: 0.4rem;
}
.expert-settings {
border: 1px solid var(--line);
border-radius: 8px;
padding: 0;
margin-top: 0.75rem;
}
.expert-summary {
font-size: 0.82rem;
font-weight: 600;
color: var(--muted);
cursor: pointer;
padding: 0.55rem 0.9rem;
list-style: none;
user-select: none;
}
.expert-summary::-webkit-details-marker { display: none; }
.expert-summary::before {
content: '▶ ';
font-size: 0.65rem;
transition: transform 0.15s;
}
.expert-settings[open] .expert-summary::before { content: '▼ '; }
.expert-body {
padding: 0.6rem 0.9rem 0.9rem;
border-top: 1px solid var(--line);
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.expert-field {
display: flex;
flex-direction: column;
gap: 0.25rem;
margin-top: 0.4rem;
}
.prompt-textarea {
font-size: 0.82rem;
padding: 0.4rem 0.6rem;
border: 1px solid var(--line);
border-radius: 6px;
background: var(--bg);
color: var(--ink);
resize: vertical;
width: 100%;
box-sizing: border-box;
}
.prompt-textarea:focus { outline: 2px solid var(--teal); outline-offset: 1px; }
.control-hint { font-size: 0.74rem; color: var(--muted); font-weight: 400; }