Files
UmbraTrans/web/umbra-app.html
umbra audio 3e0568b9d1 Generate backend endpoints for language-project workflow
Add REST endpoints and frontend wiring for per-language project actions:
- POST /api/workspace/{project}/translation/{lang}/queue — queue translation
- POST /api/workspace/{project}/audio/{lang}/queue — queue audio generation
- GET/POST /api/workspace/{project}/format/{lang} — format metadata (EPUB/PDF)
- GET /api/workspace/{project}/review/{lang}/chapters/{chapter} — utterance review
- GET/POST /api/workspace/{project}/front-matter/{lang} — front matter editor
- GET /api/workspace/{project}/chapters/{lang} — chapter list
- GET /api/workspace/{project}/chapter-content/{lang}/{chapter} — chapter text

Frontend fixes:
- Review page shows per-language text (English source, Chinese translation, etc.)
- Non-translated languages show 'Queue translation' button only
- Speaker data from English source matched by paragraph ID
- UmbraAudio column layout: Speaker, Variation, Text, Actions
- Chapter tree in left sidebar: Front matter, Back matter, Body
- Audio Format label at top of sidebar
- Pandoc formatting toolbar for front matter text editing
2026-10-25 11:04:53 -07:00

81 lines
3.4 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Umbra Tools workspace">
<title>Umbra Tools</title>
<link rel="icon" type="image/png" href="assets/umbratrans-emblem.png">
<link rel="stylesheet" href="assets/styles.css">
</head>
<body>
<!--
The Umbra Tools shell. Every signed-in session lands here.
Banner: brand and activity switch (left), the program selector (middle-left),
the selected language/project name (middle), the account and role (right).
Two-level navigation:
1. Activity: Control Panel, Program, Edit, Audio
2. Program: "Select Program" until one is chosen; then the dropdown lists
the program's languages as "IT - Deal Hunter", "SP - Deal Hunter", etc.
A Program is a book being translated and produced as audiobooks. Each
language under a program is a "project" with its own state: metadata/ISBN,
utterance review, audio generation, epub/pdf formatting, production download.
The control panel is mounted inline from `assets/admin-view.js`, which the
standalone `uadmin/` page also uses, so the two cannot drift.
-->
<div class="umbra-shell">
<header class="umbra-topbar">
<div class="umbra-topbar__left">
<a class="umbra-topbar__brandlink" href="umbra-app.html" aria-label="Umbra Tools home">
<img class="umbra-topbar__logo" src="assets/umbratrans-emblem.png" alt="" aria-hidden="true">
<span class="umbra-topbar__brand">Umbra Tools</span>
</a>
<select id="activity-select" class="umbra-topbar__mode" aria-label="Active activity">
<option value="control">Control Panel</option>
<option value="program">Program</option>
<option value="edit">Edit</option>
<option value="audio">Audio</option>
<option value="format">Format</option>
<option value="review">Review</option>
</select>
</div>
<div class="umbra-topbar__middle">
<select id="program-select" class="umbra-topbar__mode umbra-topbar__mode--hidden" aria-label="Program">
<option value="">Select Program</option>
</select>
<div id="topbar-language-name" class="umbra-topbar__name" aria-live="polite"></div>
</div>
<div class="umbra-topbar__right">
<div class="umbra-user">
<span class="avatar" id="topbar-avatar" aria-hidden="true">··</span>
<span class="umbra-user__meta">
<span class="umbra-user__name" id="topbar-username">Loading…</span>
<span class="umbra-user__role" id="topbar-role">Checking session</span>
</span>
</div>
<select id="account-menu" class="umbra-dropdown" aria-label="Account menu">
<option value="">Account ▾</option>
<option value="settings">Account settings</option>
<option value="signout">Sign out</option>
</select>
</div>
</header>
<aside class="umbra-sidebar" id="sidebar" aria-label="Activity navigation"></aside>
<main class="umbra-main" id="main">
<noscript>Umbra Tools needs JavaScript enabled.</noscript>
</main>
</div>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script src="assets/api.js" defer></script>
<script src="assets/admin-view.js" defer></script>
<script src="assets/umbra-app.js" defer></script>
</body>
</html>