Skip to content

feat(player): unify timeline controls and video scrubbing - #64

Merged
Leftium merged 14 commits into
mainfrom
continuum/62-video-surface-scrubbing
Oct 14, 2026
Merged

Leftium merged 14 commits into
mainfrom
continuum/62-video-surface-scrubbing

Conversation

@Leftium

@Leftium Leftium commented Oct 14, 2026 •

Copy link
Copy Markdown
Owner

Refs #62, PR 2: video-surface scrubbing and editor timeline consolidation. Keep #62 open for hold-to-step and Clip settings; watch reveal/docking remains in #15.

This PR follows the Continuum protocol at 9aea333.

Horizontal video dragging jumps to the cursor's time in editor and watch modes without changing A/B or the share URL. The shared recognizer owns direction locking after 8 CSS pixels, capture, taps, cancellation, and synthetic-click suppression. Static touch-action: pan-y pinch-zoom preserves vertical scrolling and pinch; capture begins only after horizontal intent. The competing watch-only tap recognizer is removed. Media, engine, and iframe remain intact.

Editor dragging uses the full-width timeline axis. The watch timeline now spans the visible player width, including portrait-video side margins, at the visible canvas bottom edge. Watch dragging uses that track between clip tails and retains its axis when Theater hides the chrome. Black margins remain tappable; seeks clamp to VIDEO/A:B scope.

The editor combines progress and A/B handles on one full-width 20px track, flush with the video and retaining the 16px gap below. The full 36px timeline space is reserved before duration settles, preventing a loading shift. Both A and B point up, with every vertex on a track edge. Their tips retain exact times; unconstrained triangles are equilateral, with bases shifting at source edges and away from each other. Crossing preserves role swapping, physical focus, and capture. The abrupt source-edge fallback is removed. Timeline edits retain at least 1/30 second between endpoints (or the full source if shorter), preventing collapsed-range errors and layout shifts.

Solid blue A and purple B triangles have white labels. Matching upward markers share the same colors in the Clip range summary and dialog. Invisible 44px targets make handles easier to grab beside the splitter; overlapping targets acquire the nearest tip, with A winning ties. Targets remain inside the source width and outrank splitter hit padding. The entire timeline is above the splitter; coordinate-based forwarding also protects handle grabs and navigation clicks covered by splitter padding. Splitter padding extends only toward settings in both layouts, allowing video-edge playback taps and scrubbing while resizing remains accessible from the other side. Other range sliders retain circles and their existing policies.

Editor and watch share red played progress outside A:B, deep orange (#f07800) played progress inside A:B, pale yellow (#ffe66d) unplayed selection, and gray remaining source. The editor's plain red/orange playhead line ends at the timeline top. White edges, shadows, and transport arrow are removed; watch has no playhead line.

Edit mode starts in VIDEO playback scope, allowing playback outside the selected range. One Play button uses the "Clip Only" binary toggle beside Sound and Loop. Its A:B text icon is crossed out when Clip Only is off and remains visible on compact layouts; the label appears alongside other control labels. Switching to A:B enters the selected loop when the playhead is outside it; VIDEO preserves the current position. Loop/Once applies to the chosen scope. Watch retains its existing automatic initial scope choice. Selection and share URL do not change when scope switches.

Video scrubbing updates currentTime and transportTime together to preview the release destination. Only endpoint inspection freezes transport. The scrub session privately saves its original position; cancellation restores position/playback. Provider seeks are coalesced per animation frame. Release restores playback when scope permits. In A:B scope, editor inspection outside the selection stays paused and Play re-enters A; watch retains VIDEO/A:B and Loop/Once semantics.

Verification

  • Type checking, lint, all 23 Node tests, and production build passed for the behavior refinement. The final toggle relocation/icon/label passed both focused editor Chromium/WebKit checks and lint.
  • Eight focused offline Chromium/WebKit executions passed: upward triangle acquisition/capture and swapping, enlarged targets beside the splitter, video-edge play/pause/scrubbing and settings-side resize, minimum endpoint span and stable layout during edits/loading, plus navigation clicks beneath splitter padding, keyboard restoration, combined geometry/colors, absence of line shadow and transport arrow, cursor alignment, transport preview/cancellation, touch taps, scope bounds, signed URLs, provider identity, full-width portrait watch mapping, hidden-Theater geometry, matching fieldset colors, and VIDEO/A:B editor playback.
  • A temporary Node geometry proof checked exact tips, bounded vertices, equilateral unconstrained triangles, separated upward-triangle interiors, and continuous boundary collapse across source positions and widths. No persistent test was added for this proof.
  • Mocked-provider screenshots reviewed ordinary and coincident-edge ranges. The mobile share-route case passed on the preceding refinement; initial implementation also passed four mocked production scrub checks.
  • Last completed routine CI passed, including the unchanged 36-browser selection and production hosting checks. New-head CI is pending. Local focused runs used a temporary port/config because the developer's port 5174 is occupied and routine URL assertions hard-code that origin.

Physical iPhone Safari/Android touch, toolbar collapse, orientation, and real YouTube seeking latency remain manual. Automated WebKit does not establish those device results or decoded-frame accuracy. The full live-YouTube advisory suite was not run.

Test lifecycle

Retired PR #63's separate source-navigation and broad line-layout journeys; useful signed URL, alignment, and provider identity assertions are consolidated into scrub cases. Four cases x Chromium/WebKit remain eight executions, excluded from routine gates and probationary through PR 3 in #62. The new cheap minimum-span Node case remains permanent for invalid clip/playback regressions at source bounds. The five cheap gesture lifecycle Node cases remain permanent for accidental playback and cancellation regressions. Existing watch assertions now reflect full-width geometry and yellow/orange colors; no routine cases were added.

Navigation helpers acquire empty track space so endpoints retain pointer ownership. Removed redundant external response/fulfillment count equality after WebKit CI reported 3 responses versus 2 fulfillments during picker history traversal. Every external request must still be intercepted and locally fulfilled or aborted; response counts remain diagnostic attachments.

Ready for independent review after release of the matching Continuum claim. Do not merge as part of this task.

@vercel

vercel Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
youloop Ready Ready Preview Oct 14, 2026 8:34pm UTC

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6173878760 was released at 5fa335a

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 17:18
@Leftium
Leftium marked this pull request as draft October 14, 2026 18:28
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6175421133 was released at 7d2d48e

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 18:36
@Leftium
Leftium marked this pull request as draft October 14, 2026 18:38
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6175618010 was released at ee9d2f2

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 18:44
@Leftium
Leftium marked this pull request as draft October 14, 2026 18:47
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium Leftium changed the title feat(player): scrub video horizontally in watch and edit modes feat(player): unify timeline controls and video scrubbing Oct 14, 2026
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6175788048 was released at 977e153

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 18:58
@Leftium
Leftium marked this pull request as draft October 14, 2026 19:07
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6177404480 was released at bd29f4c

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 20:14
@Leftium
Leftium marked this pull request as draft October 14, 2026 20:15
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6177454380 was released at a2e76fe

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 20:15
@Leftium
Leftium marked this pull request as draft October 14, 2026 20:16
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6177477946 was released at d44ab9a

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 20:16
@Leftium
Leftium marked this pull request as draft October 14, 2026 20:28
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6177754872 was released at f58e678

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 20:31
@Leftium
Leftium marked this pull request as draft October 14, 2026 20:33
@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR was claimed

@Leftium

Leftium commented Oct 14, 2026

Copy link
Copy Markdown
Owner Author

This PR's claim 6177849457 was released at 83efa38

@Leftium
Leftium marked this pull request as ready for review October 14, 2026 20:34
@Leftium
Leftium merged commit 3c797c8 into main Oct 14, 2026
3 checks passed
@Leftium
Leftium deleted the continuum/62-video-surface-scrubbing branch October 14, 2026 20:44

This branch was successfully deployed

1 active deployment
Preview — 83efa38d Deployed Oct 14, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant