One Cue at a time: the transcript becomes a carousel #10

Closed
opened 2026-08-10 09:26:18 +00:00 by aiko · 1 comment
Owner

Parent

#1

What to build

The scrolling transcript is replaced by a horizontal strip showing one Cue per panel at reading size (ADR 0007).

The reason is not cosmetic: a vertical list shows the lines below the current one, which is dialogue that has not been spoken yet. For a listening-practice tool that turns reading along into reading ahead. One Cue per panel makes future dialogue something the reader travels to deliberately.

The strip is overflow-x with CSS scroll snapping, one panel per Cue — momentum, rubber-banding, and partial-drag feedback come from the platform rather than from a hand-rolled touch handler. Reading type size lives in a CSS custom property, because the right value is found at sofa distance rather than chosen in advance.

Swiping is free in both directions. Swiping away from live freezes the strip: it stops following the Playhead, the header says so and shows the offset from live (-1:21, not a wall-clock time), and a control returns to live. The control is labelled by meaning, not direction — you can be on either side of live.

Swiping is not seeking. The strip is a transcript, not a scrubber.

Acceptance criteria

  • One Cue fills the panel; the strip advances itself as the Playhead moves
  • Reading type size is a CSS custom property, tunable without touching TypeScript
  • Swiping backwards and forwards both work; the show does not seek
  • Swiping away from live enters a frozen state, shown in the header with the offset from live
  • A control returns to live from either side of it
  • Auto-follow does not yank a panel away from a reader who swiped there deliberately
  • holdThroughGaps is removed from currentCueIndex — with one Cue per panel, silence just leaves the last panel in place
  • Manual-gesture detection no longer treats every touchmove on the root element as the reader scrolling, so gestures elsewhere on screen do not stop auto-follow
  • Cue selection and frozen-state logic are covered by tests

Blocked by

None - can start immediately

## Parent #1 ## What to build The scrolling transcript is replaced by a horizontal strip showing one Cue per panel at reading size (ADR 0007). The reason is not cosmetic: a vertical list shows the lines *below* the current one, which is dialogue that has not been spoken yet. For a listening-practice tool that turns reading along into reading ahead. One Cue per panel makes future dialogue something the reader travels to deliberately. The strip is `overflow-x` with CSS scroll snapping, one panel per Cue — momentum, rubber-banding, and partial-drag feedback come from the platform rather than from a hand-rolled touch handler. Reading type size lives in a CSS custom property, because the right value is found at sofa distance rather than chosen in advance. Swiping is free in both directions. Swiping away from live freezes the strip: it stops following the Playhead, the header says so and shows the offset from live (`-1:21`, not a wall-clock time), and a control returns to live. The control is labelled by meaning, not direction — you can be on either side of live. Swiping is **not** seeking. The strip is a transcript, not a scrubber. ## Acceptance criteria - [ ] One Cue fills the panel; the strip advances itself as the Playhead moves - [ ] Reading type size is a CSS custom property, tunable without touching TypeScript - [ ] Swiping backwards and forwards both work; the show does not seek - [ ] Swiping away from live enters a frozen state, shown in the header with the offset from live - [ ] A control returns to live from either side of it - [ ] Auto-follow does not yank a panel away from a reader who swiped there deliberately - [ ] `holdThroughGaps` is removed from `currentCueIndex` — with one Cue per panel, silence just leaves the last panel in place - [ ] Manual-gesture detection no longer treats every `touchmove` on the root element as the reader scrolling, so gestures elsewhere on screen do not stop auto-follow - [ ] Cue selection and frozen-state logic are covered by tests ## Blocked by None - can start immediately
Author
Owner

This was generated by AI during triage.

Merged to main in 168b131.

The scrolling transcript is gone; one Cue fills a panel in a CSS scroll-snap strip. Reading size is --cue-reading-size, tunable without touching TypeScript — asserted by a C# test against the shell rather than left as a promise. Free swiping both directions, frozen state showing the offset from live measured Cue-start to Cue-start so it does not tick upward while following, and one Back to live control that works from either side.

holdThroughGaps is removed from currentCueIndex, and the touchmove listeners on root are gone with the old transcript view.

18 tests in cueStrip.test.ts covering advance, freeze/unfreeze, offset formatting, and panel-index-at-scroll.

One acceptance criterion could not become a runnable test: "the show does not seek" asserts an absence, and there is no PlaybackRemote to mock yet. Enforced structurally — cueStrip.ts imports only tick and Cue types, and the strip's only side effect is scrollTo. Worth a real test when PlaybackRemote lands.

> *This was generated by AI during triage.* Merged to `main` in 168b131. The scrolling transcript is gone; one Cue fills a panel in a CSS scroll-snap strip. Reading size is `--cue-reading-size`, tunable without touching TypeScript — asserted by a C# test against the shell rather than left as a promise. Free swiping both directions, frozen state showing the offset from live measured Cue-start to Cue-start so it does not tick upward while following, and one `Back to live` control that works from either side. `holdThroughGaps` is removed from `currentCueIndex`, and the `touchmove` listeners on `root` are gone with the old transcript view. 18 tests in `cueStrip.test.ts` covering advance, freeze/unfreeze, offset formatting, and panel-index-at-scroll. **One acceptance criterion could not become a runnable test:** "the show does not seek" asserts an absence, and there is no `PlaybackRemote` to mock yet. Enforced structurally — `cueStrip.ts` imports only tick and Cue types, and the strip's only side effect is `scrollTo`. Worth a real test when `PlaybackRemote` lands.
aiko closed this issue 2026-08-10 10:59:36 +00:00
aiko referenced this issue from a commit 2026-08-10 12:13:58 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mobrule/kurageyomi#10
No description provided.