71a398b82f
feat: add magazine reader frontend (P1)
...
Studio -> Magazines: library, contents tree grouped by section with
confidence/pages/listening-time/audio status, the Stage D review
screen (tick/untick layout blocks, correct title/author, approve or
reject), a reflowed article view with click-to-seek sentence
highlighting, a linked original-page view showing the source bounding
box, and a podcast panel (2-3 host pickers, script generation,
turn-by-turn playback).
Wired into the existing lazy-module system (module-manifest.json,
loader.js, nav.js) rather than a separate app. Reuses /api/tts-preview
for both narration and podcast turns -- no new audio pipeline.
Fixes found building this:
- The pane toggle used role="tab" without the full ARIA tabs pattern
(aria-selected, roving tabindex, arrow-key nav) -- fails WCAG 2.2 AA
and hid the buttons from role-based tooling. Replaced with a button
group + aria-pressed, matching the plain-click interaction it
actually has.
- Print layout cues ("(continued on page 8)") were being sent to TTS
verbatim -- narration would have spoken the parenthetical aloud.
Stripped from the narration copy only; layout.json keeps the
original for the review screen.
- has_podcast now comes from the articles listing so opening an
article without a generated script skips a doomed GET instead of a
routine 404 on every open.
Verified against the real API contract with Playwright (library,
review pre-selection, approval, sentence highlighting + PDF-page
linking, podcast approval gate, zero console errors across the flow)
and manually end-to-end against a real ingested fixture, screenshots
included. Full suite: 94 Python tests, 33/34 desktop Playwright tests
(one unrelated pre-existing flaky DOM-count assertion).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-06 15:00:58 +02:00
6553d5003d
fix: preserve custom OCR engine cards
2026-09-05 08:11:57 +02:00
60ef436ce1
feat: add OCR engine profiles
2026-09-04 22:29:11 +02:00
2caa417401
fix: preserve audiobook dialogue boundaries
2026-09-04 15:36:26 +02:00
29f5243f6b
test: preserve dialogue-only recast merges
2026-09-04 15:31:45 +02:00
b6f4a9518b
test: lock visual identity prompts
2026-09-04 15:30:39 +02:00
8181c491c0
docs: complete frontend namespace migration
2026-09-04 13:43:36 +02:00
18e586d06f
refactor: scope conversation state
2026-09-04 13:42:02 +02:00
417d7215d2
refactor: scope i18n state
2026-09-04 13:40:07 +02:00
ee4208ec51
refactor: scope cast compatibility modules
2026-09-04 13:38:40 +02:00
542f44fbb8
refactor: scope seed finder
2026-09-04 13:36:55 +02:00
10f618c179
refactor: scope character columns
2026-09-04 13:35:10 +02:00
d2a8dd43b4
perf: tighten character pagination
2026-09-04 13:31:18 +02:00
7938f9ca74
refactor: scope frontend utilities
2026-09-04 13:27:43 +02:00
d055596504
refactor: scope voice inspector
2026-09-04 13:25:13 +02:00
67ee55d3ac
refactor: scope character library
2026-09-04 13:23:54 +02:00
73f8f92826
refactor: scope character sheets
2026-09-04 13:21:31 +02:00
e5bd2a149f
refactor: scope voice library
2026-09-04 13:19:52 +02:00
1b7d6b2346
refactor: scope generation module
2026-09-04 13:15:30 +02:00
ababdf6741
refactor: scope stt module
2026-09-04 13:13:10 +02:00
c53c47ce2d
refactor: scope ai backends
2026-09-04 13:10:51 +02:00
716e601fac
refactor: scope integrations module
2026-09-04 13:06:59 +02:00
3fffae9015
refactor: scope combined library
2026-09-04 13:04:46 +02:00
260c5c22a7
refactor: scope engine support
2026-09-04 13:02:29 +02:00
b747553bf6
refactor: scope routing module
2026-09-04 13:00:10 +02:00
28c72c76dd
refactor: scope voice sources
2026-09-04 12:57:53 +02:00
d219aec676
refactor: scope voice clone
2026-09-04 12:55:50 +02:00
998a65f2ba
refactor: scope tts preview
2026-09-04 12:53:44 +02:00
656d0473d4
refactor: scope settings module
2026-09-04 12:51:29 +02:00
8002ca1d75
refactor: scope character library
2026-09-04 12:49:22 +02:00
0e615d52de
refactor: scope studio module
2026-09-04 12:47:30 +02:00
ac55cd88a3
refactor: scope rehearser cast
2026-09-04 12:44:58 +02:00
df95ada578
refactor: scope rehearser voice design
2026-09-04 12:44:08 +02:00
0f3d410260
refactor: scope rehearser voice picker
2026-09-04 12:43:11 +02:00
dea1de5c57
refactor: scope rehearser stage
2026-09-04 12:42:22 +02:00
da3957347c
refactor: scope audiobook network
2026-09-04 12:41:35 +02:00
7ee5f65e00
refactor: scope rehearser library
2026-09-04 12:40:56 +02:00
0ee43421b7
refactor: scope reader module
2026-09-04 12:40:09 +02:00
66c5dd6e0c
refactor: scope audiobook core
2026-09-04 12:37:37 +02:00
c6db55e55b
refactor: scope rehearser core
2026-09-04 12:33:55 +02:00
6c62a0f75e
refactor: scope rehearser recording
2026-09-04 12:31:03 +02:00
3a7f0bf677
refactor: scope rehearser io
2026-09-04 12:30:13 +02:00
a202230654
refactor: scope rehearser playback
2026-09-04 12:29:19 +02:00
cc4fc4ae2e
refactor: scope audiobook state modules
2026-09-04 12:26:21 +02:00
2aca152fe8
refactor: scope training ui module
2026-09-04 12:23:03 +02:00
302dbe1279
refactor: scope pure frontend leaves
2026-09-04 12:20:33 +02:00
d32985256d
docs: close incremental p1 audit
2026-09-04 12:14:47 +02:00
cefd4bd494
refactor: extract rehearser training mode
2026-09-04 12:12:11 +02:00
0c7cc04643
refactor: extract rehearser recording
2026-09-04 12:10:00 +02:00
ba7b3115b9
refactor: extract audiobook preview export
2026-09-04 12:05:50 +02:00
76421dfe88
refactor: extract audiobook casting pipeline
2026-09-04 12:04:05 +02:00
eaf2f29d62
refactor: extract rehearser io
2026-09-04 12:01:38 +02:00
f97fd60e43
refactor: extract rehearser playback
2026-09-04 11:59:09 +02:00
e096b3e529
refactor: wire audiobook namespace APIs
2026-09-04 11:54:56 +02:00
6f2c0b7b3d
refactor: extract audiobook cast view
2026-09-04 11:53:04 +02:00
262e37fffd
refactor: extract rehearser voice matching
2026-09-04 11:47:51 +02:00
4c8022e8aa
refactor: extract audiobook stylesheet
2026-09-04 11:44:55 +02:00
065445a20a
refactor: extract rehearser stylesheet
2026-09-04 11:42:43 +02:00
eb008475ed
refactor: extract rehearser cast renderer
2026-09-04 11:39:45 +02:00
ae9df4f7f0
feat: distinguish provider configuration and health
2026-09-04 11:35:52 +02:00
7c14f41cb9
refactor: extract audiobook speaker normalization
2026-09-04 11:32:20 +02:00
0d1299b19c
refactor: extract audiobook cast cleanup
2026-09-04 11:30:12 +02:00
1951ce0646
refactor: extract audiobook dialogue merging
2026-09-04 11:27:49 +02:00
41349867a1
refactor: extract audiobook cast normalization
2026-09-04 11:25:52 +02:00
0876527554
refactor: extract audiobook quote segmentation
2026-09-04 11:22:15 +02:00
2fde0a176d
refactor: extract rehearser voice design
2026-09-04 11:19:01 +02:00
d43959728d
refactor: split voice design styles
2026-09-04 11:16:05 +02:00
de099d30c5
refactor: split background job styles
2026-09-04 11:13:36 +02:00
8d9a172993
refactor: split resource diagnostics styles
2026-09-04 11:10:43 +02:00
c0ac5dd775
refactor: extract audiobook cast serialization
2026-09-04 11:08:49 +02:00
d3bc806f33
refactor: extract rehearser training comparison
2026-09-04 11:06:23 +02:00
d613591526
refactor: extract rehearser cast controls
2026-09-04 11:04:13 +02:00
ed3b2d42cd
refactor: publish feature APIs through TTVC
2026-09-04 11:00:22 +02:00
e2e20fa89f
feat: add request correlation diagnostics
2026-09-04 10:58:46 +02:00
66ebd1a8b8
refactor: extract audiobook parsing primitives
2026-09-04 10:56:31 +02:00
0bfb6d694b
refactor: extract rehearser voice picker
2026-09-04 10:54:21 +02:00
e98c5ffe33
refactor: extract rehearser stage controls
2026-09-04 10:52:05 +02:00
2712843322
refactor: extract rehearser library persistence
2026-09-04 10:46:02 +02:00
c815b7941a
feat: expand resource diagnostics
2026-09-04 10:42:08 +02:00
b1374c50a0
fix: synchronize frontend release cache version
2026-09-04 10:36:44 +02:00
5c8683821e
fix: preserve lazy navigation intent
2026-09-04 10:34:50 +02:00
8d7511cdbf
test: measure constrained character workloads
2026-09-04 10:34:27 +02:00
4b01a853fb
perf: bound browser library image cache
2026-09-04 10:28:07 +02:00
c43a11da68
perf: lazy-load section feature modules
2026-09-04 10:23:20 +02:00
0f1d93c9df
perf: bound rehearser audio cache
2026-09-04 10:11:44 +02:00
bf186387f9
perf: coalesce voice library fetches
2026-09-04 10:10:10 +02:00
55d0dd1012
refactor: add frontend namespace migration bridge
2026-09-04 10:07:46 +02:00
aa8a96c48f
feat: add safe retries for background jobs
2026-09-04 09:58:45 +02:00
6ca044ef64
feat: validate canonical image asset digests
2026-09-04 09:53:50 +02:00
90e74149d9
feat: add constrained-device resource diagnostics
2026-09-04 09:51:49 +02:00
690673625d
feat: persist background job result artifacts
2026-09-04 09:48:37 +02:00
b648bbdf0b
feat: add safe background job history panel
2026-09-04 09:44:31 +02:00
0fd39d4acb
test: cover profile completeness counting
2026-09-04 09:33:45 +02:00
a7a6bb1cdc
feat: add visual pair review workflow
2026-09-04 09:20:27 +02:00
cc8fcdbd69
refactor: share frontend module manifest
2026-09-04 09:15:41 +02:00
13d5807777
test: stabilize startup navigation smoke suite
2026-09-04 09:04:38 +02:00
d03c9841e9
test: cover constrained browser concurrency
2026-09-04 08:59:09 +02:00
fbb5fc52dd
fix: stabilize async library navigation
2026-09-04 08:58:01 +02:00
3456b5a3b0
feat: support character appearance forms
2026-09-04 08:51:33 +02:00
0b51a76c21
fix: flag inconsistent current image pairs
2026-09-04 08:39:01 +02:00