Skip to content

feat(studio): timeline glue swap — Timeline/TimelineCanvas onto the NLE engine#2212

Open
ukimsanov wants to merge 4 commits into
studio-dnd/pr18-nle-shell-assemblyfrom
studio-dnd/pr21-timeline-glue-swap
Open

feat(studio): timeline glue swap — Timeline/TimelineCanvas onto the NLE engine#2212
ukimsanov wants to merge 4 commits into
studio-dnd/pr18-nle-shell-assemblyfrom
studio-dnd/pr21-timeline-glue-swap

Conversation

@ukimsanov

@ukimsanov ukimsanov commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator

What

flips the timeline glue to its final form (23 files): Timeline and TimelineCanvas rebuilt on TimelineLanes/TimelineOverlays, useTimelineClipDrag drives preview/commit through the new drag engine, range selection goes multi-select, playback loop moves to useTimelinePlayerLoop. Deletes the 9 old-engine files this orphans (group drag, marquee selection, snap targets, layer gutter, selection overlays + their suites) — each is compile- or gate-forced by this swap, verified by probe.

Why

second swap step; timeline-only, canvas and App untouched.

How

modified files to final content + forced deletions. playerStore/timelineEditing/timelineCallbacks stay at their coexistence form until the app swap (the old App still runs on them).

Test plan

tsc --noEmit; bunx vitest run (full suite); fallow audit clean.


Stack position 21/25 — studio NLE overhaul (CapCut-parity timeline + canvas). Graphite manages bases; merge from #2192 upward. Temporary TEMP(studio-dnd) fallow entries (unwired-component windows) are all removed by #2213 (app-shell swap), whose tree is byte-identical to the fully-verified integration branch.

Merge invariant: #2206#2213 land as ONE ordered unit — no cherry-picks, no deploys between #2211#2213 (review-fix foliation concentrates engine wiring at #2213; seam evidence in the #2205 thread).

ukimsanov commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator Author

@miga-heygen miga-heygen left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed as part of the 25-PR NLE overhaul stack. Full stack review on #2205 (the keystone). This is one of the critical swap PRs — reviewed with extra scrutiny. No blockers. — Miga

@ukimsanov ukimsanov force-pushed the studio-dnd/pr20-canvas-glue-swap branch from c50d69d to 55e7fb7 Compare July 11, 2026 12:51
@ukimsanov ukimsanov force-pushed the studio-dnd/pr21-timeline-glue-swap branch 2 times, most recently from 3e2c01f to 5a92f6f Compare July 11, 2026 21:08
@ukimsanov ukimsanov force-pushed the studio-dnd/pr20-canvas-glue-swap branch 2 times, most recently from 436fb8c to 3888f93 Compare July 11, 2026 22:38
@ukimsanov ukimsanov force-pushed the studio-dnd/pr21-timeline-glue-swap branch from 5a92f6f to 20115a6 Compare July 11, 2026 22:38

@miguel-heygen miguel-heygen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Final rebase review: current head inspected, latest required checks pass, no unresolved blocking findings. Approving; stack order/invariants remain as specified.

@ukimsanov ukimsanov force-pushed the studio-dnd/pr20-canvas-glue-swap branch from 3888f93 to f6d6992 Compare July 11, 2026 23:26
@ukimsanov ukimsanov force-pushed the studio-dnd/pr21-timeline-glue-swap branch from 20115a6 to 4ba7711 Compare July 11, 2026 23:26
@ukimsanov ukimsanov force-pushed the studio-dnd/pr20-canvas-glue-swap branch from f6d6992 to 7456861 Compare July 12, 2026 01:04
@ukimsanov ukimsanov force-pushed the studio-dnd/pr21-timeline-glue-swap branch from 4ba7711 to 9ea5097 Compare July 12, 2026 01:04
@ukimsanov ukimsanov force-pushed the studio-dnd/pr20-canvas-glue-swap branch from 7456861 to 5b35c76 Compare July 12, 2026 01:23
@ukimsanov ukimsanov force-pushed the studio-dnd/pr21-timeline-glue-swap branch from 9ea5097 to 0938959 Compare July 12, 2026 01:23

@miguel-heygen miguel-heygen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-audit current head 0938959: required checks pass; no new actionable threads. Approving current head.

@miguel-heygen miguel-heygen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed current head and verified the addressed feedback and required behavior. Approval is for this exact head; Graphite mergeability may still be pending.

What: AssetCard — the sidebar asset tile (thumbnail, hover preview, click
policy, context menu incl. add-at-playhead), unwired.

Why: standalone sidebar concept; AssetsTab adopts it in the app-shell swap.

How: new file against the coexistence layer (assetHelpers, AssetContextMenu,
assetClickBehavior, assetPreviewStore); one TEMP(studio-dnd) entry until
AssetsTab wires it.

Test plan: tsc --noEmit; fallow audit clean.
…l form

What: flips the canvas editing glue to its final NLE form (25 files):
DomEditOverlay renders DomEditSelectionChrome/CanvasContextMenu, the gesture
pipeline gains center-anchored corner resize (CapCut model) + z-order
commit, dom selection/wiring/geometry-commit hooks move to the multi-select
store API. Adds the anchored-resize characterization test.

Why: first of three swap steps; the coexistence layer makes it
compile-green without touching timeline or App glue.

How: modified files to final content; no deletions (nothing is orphaned by
this step — verified). Both characterization suites from the earlier PR
stay green.

Test plan: tsc --noEmit; bunx vitest run (full suite; anchored-resize suite
passes from this PR on); fallow audit clean.
…LE engine

What: flips the timeline glue to its final form (23 files): Timeline and
TimelineCanvas rebuilt on TimelineLanes/TimelineOverlays, useTimelineClipDrag
drives preview/commit through the new drag engine, range selection goes
multi-select, playback loop moves to useTimelinePlayerLoop. Deletes the 9
old-engine files this orphans (group drag, marquee selection, snap targets,
layer gutter, selection overlays + their suites) — each is compile- or
gate-forced by this swap, verified by probe.

Why: second swap step; timeline-only, canvas and App untouched.

How: modified files to final content + forced deletions.
playerStore/timelineEditing/timelineCallbacks stay at their coexistence
form until the app swap (the old App still runs on them).

Test plan: tsc --noEmit; bunx vitest run (full suite); fallow audit clean.
…ngine (#2213)

What: the final swap (43 files): App mounts EditorShell; contexts, hotkeys,
sidebar (AssetsTab→AssetCard, toolbar, audio row), useTimelineEditing and
the store drop the legacy single-select API and trimmed callbacks; deletes
the 7 files this orphans (StudioPreviewArea, NLELayout,
useTimelineGroupEditing, timelineLayerDrag + suites, legacy hook test);
.fallowrc.jsonc lands at final content, dropping every TEMP(studio-dnd)
suppression — everything shipped unwired is now reachable.

Why: last step of the NLE integration; after this the tree is byte-identical
to the previously-green integration checkpoint.

How: modified files to final content + gate-forced deletions + suppression
cleanup. Tree parity with checkpoint 86dd2a32b verified.

Test plan: tsc --noEmit in studio, studio-server, core; bun run --filter
@hyperframes/studio build; bunx vitest run (full suite); fallow audit clean
with zero remaining TEMP entries; tree-diff vs 86dd2a32b empty.
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.

4 participants