feat(transcribe): Norwegian defaults, vocabulary presets, multi-file court day queue

- Default language → nb (Bokmål); auto-detect demoted with warning note
- Default model → large-v3; VAD filter on by default
- Vocabulary prompt promoted to main form with 4 preset buttons
  (Barnerett/CPS, Rettssak/tingrett, Generell norsk, Egendefinert)
- Multi-file upload queue: drop/select multiple clips, numbered list UI
- Sequential queue processing with cumulative time_offset per clip
- Backend shifts segment timestamps so SRT/VTT covers full court day
- Merged transcript + segments across all clips for single download

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-14 22:20:11 +02:00
parent df31674f2e
commit 26f4e2231b
4 changed files with 356 additions and 138 deletions
+93 -3
View File
@@ -940,10 +940,12 @@ p {
.upload-file {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
flex-direction: column;
align-items: flex-start;
gap: 6px;
min-height: 48px;
width: 100%;
padding: 0.4rem 0;
}
.upload-filename {
@@ -1288,4 +1290,92 @@ p {
}
.prompt-textarea:focus { outline: 2px solid var(--teal); outline-offset: 1px; }
/* ─── Vocabulary presets ──────────────────────────────────────────────────── */
.vocab-presets {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 0.35rem;
margin-bottom: 0.35rem;
}
.vocab-btn {
font-size: 0.78rem;
padding: 0.2rem 0.6rem;
border: 1px solid var(--line);
border-radius: 20px;
background: var(--bg);
color: var(--ink);
cursor: pointer;
transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.vocab-btn:hover {
background: var(--soft-teal, #e8f7f6);
border-color: var(--teal);
color: var(--teal);
}
.vocab-btn.is-active {
background: var(--teal);
border-color: var(--teal);
color: #fff;
font-weight: 600;
}
/* ─── Audio queue list ────────────────────────────────────────────────────── */
.audio-queue-list {
list-style: none;
padding: 0;
margin: 0;
width: 100%;
text-align: left;
}
.queue-item {
display: flex;
align-items: baseline;
gap: 0.5rem;
padding: 3px 0;
font-size: 0.84rem;
}
.queue-num {
flex-shrink: 0;
min-width: 1.4rem;
font-variant-numeric: tabular-nums;
color: var(--muted);
font-size: 0.78rem;
}
.queue-item--processing .queue-num { color: var(--teal); }
.queue-item--done .queue-num { color: #22a06b; }
.queue-item--error .queue-num { color: var(--coral, #e05); }
.queue-name {
flex: 1;
font-weight: 500;
word-break: break-all;
color: var(--ink);
}
.queue-item--done .queue-name { color: var(--muted); }
.queue-item--error .queue-name { color: var(--coral, #e05); }
.queue-size {
flex-shrink: 0;
font-size: 0.76rem;
color: var(--muted);
}
.audio-queue-actions {
display: flex;
align-items: center;
gap: 1rem;
margin-top: 0.5rem;
font-size: 0.82rem;
}
.control-hint { font-size: 0.74rem; color: var(--muted); font-weight: 400; }