@hyperframes/studio 0.7.56 → 0.7.58
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/hyperframes-player-CtTDO63S.js +459 -0
- package/dist/assets/{index-CmVCjZjp.js → index-B_UvTX3E.js} +205 -205
- package/dist/assets/{index-BWnOxAiH.js → index-C47jAC3Q.js} +1 -1
- package/dist/assets/{index-C4csZims.js → index-DeQPzqwH.js} +1 -1
- package/dist/assets/index-uahwWkgw.css +1 -0
- package/dist/{chunk-5QSIMBEJ.js → chunk-OBAG3GWK.js} +33 -21
- package/dist/chunk-OBAG3GWK.js.map +1 -0
- package/dist/{domEditingLayers-6LQGKPOI.js → domEditingLayers-2CKWGEHS.js} +2 -2
- package/dist/index.d.ts +41 -4
- package/dist/index.html +2 -2
- package/dist/index.js +7436 -5423
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/App.tsx +3 -3
- package/src/components/StudioFeedbackBar.tsx +2 -2
- package/src/components/editor/CanvasContextMenu.test.tsx +166 -2
- package/src/components/editor/CanvasContextMenu.tsx +100 -20
- package/src/components/editor/DomEditOverlay.tsx +34 -62
- package/src/components/editor/LayersPanel.tsx +111 -91
- package/src/components/editor/canvasContextMenuZOrder.test.ts +243 -2
- package/src/components/editor/canvasContextMenuZOrder.ts +184 -23
- package/src/components/editor/domEditingDom.ts +5 -6
- package/src/components/editor/domEditingElement.ts +15 -32
- package/src/components/editor/layersPanelSort.ts +80 -0
- package/src/components/editor/propertyPanelColorGradingSection.tsx +15 -21
- package/src/components/editor/useCanvasContextMenuState.ts +92 -0
- package/src/components/editor/useLayerRevealOverride.test.ts +169 -0
- package/src/components/editor/useLayerRevealOverride.ts +389 -0
- package/src/components/editor/useZOrderCrossedFlash.tsx +68 -0
- package/src/components/nle/AssetPreviewOverlay.test.tsx +106 -0
- package/src/components/nle/AssetPreviewOverlay.tsx +61 -37
- package/src/components/nle/PreviewOverlays.tsx +61 -16
- package/src/components/nle/TimelinePane.test.ts +3 -0
- package/src/components/nle/TimelinePane.tsx +11 -1
- package/src/components/nle/useCanvasZOrderTimelineMirror.test.tsx +440 -0
- package/src/components/nle/useCanvasZOrderTimelineMirror.ts +191 -0
- package/src/components/nle/useTimelineEditCallbacks.ts +1 -0
- package/src/components/nle/zLaneGesture.test.ts +176 -0
- package/src/components/nle/zLaneGesture.ts +77 -0
- package/src/components/sidebar/AssetCard.test.tsx +106 -0
- package/src/components/sidebar/AssetCard.tsx +19 -2
- package/src/components/sidebar/AudioRow.tsx +19 -2
- package/src/hooks/domEditCommitTypes.ts +29 -2
- package/src/hooks/elementLifecycleOpsTestUtils.ts +25 -0
- package/src/hooks/fetchStubTestUtils.ts +16 -0
- package/src/hooks/timelineEditingHelpers.test.ts +183 -1
- package/src/hooks/timelineEditingHelpers.ts +63 -259
- package/src/hooks/timelineMoveAdapter.test.ts +44 -40
- package/src/hooks/timelineMoveAdapter.ts +7 -4
- package/src/hooks/timelineTimingSync.test.ts +820 -0
- package/src/hooks/timelineTimingSync.ts +597 -0
- package/src/hooks/timelineTrackVisibility.test.ts +3 -1
- package/src/hooks/timelineTrackVisibility.ts +4 -3
- package/src/hooks/useCaptionDetection.ts +2 -0
- package/src/hooks/useClipboard.ts +19 -17
- package/src/hooks/useCompositionDimensions.ts +32 -5
- package/src/hooks/useDomEditCommits.test.tsx +392 -23
- package/src/hooks/useDomEditCommits.ts +180 -53
- package/src/hooks/useDomEditSession.test.tsx +3 -1
- package/src/hooks/useDomEditSession.ts +1 -1
- package/src/hooks/useElementLifecycleOps.test.tsx +559 -28
- package/src/hooks/useElementLifecycleOps.ts +175 -69
- package/src/hooks/useElementPicker.ts +7 -8
- package/src/hooks/usePreviewPersistence.ts +2 -2
- package/src/hooks/useTimelineAssetDropOps.ts +175 -0
- package/src/hooks/useTimelineEditing.test.tsx +591 -277
- package/src/hooks/useTimelineEditing.ts +202 -282
- package/src/hooks/useTimelineEditingTypes.ts +1 -1
- package/src/hooks/useTimelineGroupEditing.ts +187 -134
- package/src/player/components/PlayerControls.tsx +5 -5
- package/src/player/components/PlayheadIndicator.tsx +7 -2
- package/src/player/components/Timeline.test.ts +105 -18
- package/src/player/components/Timeline.tsx +69 -98
- package/src/player/components/TimelineCanvas.tsx +47 -7
- package/src/player/components/TimelineLanes.tsx +32 -10
- package/src/player/components/TimelineOverlays.tsx +36 -0
- package/src/player/components/TimelineRuler.tsx +70 -47
- package/src/player/components/TrackGapContextMenu.tsx +116 -0
- package/src/player/components/timelineCallbacks.ts +4 -1
- package/src/player/components/timelineClipDragCommit.test.ts +370 -11
- package/src/player/components/timelineClipDragCommit.ts +267 -68
- package/src/player/components/timelineGapCommit.test.ts +163 -0
- package/src/player/components/timelineGapCommit.ts +103 -0
- package/src/player/components/timelineGaps.test.ts +221 -0
- package/src/player/components/timelineGaps.ts +182 -0
- package/src/player/components/timelineLayout.test.ts +2 -1
- package/src/player/components/timelineLayout.ts +119 -30
- package/src/player/components/timelineMarquee.test.ts +20 -10
- package/src/player/components/timelineMarquee.ts +9 -2
- package/src/player/components/timelineRevealScroll.test.ts +133 -0
- package/src/player/components/timelineRevealScroll.ts +91 -0
- package/src/player/components/timelineStackingSync.test.ts +102 -1
- package/src/player/components/timelineStackingSync.ts +45 -5
- package/src/player/components/timelineTrackPersistPipeline.test.ts +168 -0
- package/src/player/components/timelineZMirror.test.ts +667 -0
- package/src/player/components/timelineZMirror.ts +393 -0
- package/src/player/components/timelineZones.test.ts +122 -310
- package/src/player/components/timelineZones.ts +82 -135
- package/src/player/components/timelineZoom.test.ts +2 -2
- package/src/player/components/timelineZoom.ts +7 -3
- package/src/player/components/useTimelineClipDrag.ts +1 -1
- package/src/player/components/useTimelineGapHighlights.test.ts +119 -0
- package/src/player/components/useTimelineGapHighlights.ts +110 -0
- package/src/player/components/useTimelinePlayhead.ts +4 -3
- package/src/player/components/useTimelineRangeSelection.ts +6 -4
- package/src/player/components/useTimelineRevealClip.ts +56 -0
- package/src/player/components/useTimelineScrollViewport.ts +73 -0
- package/src/player/components/useTimelineStackingSync.test.tsx +11 -2
- package/src/player/components/useTimelineStackingSync.ts +17 -4
- package/src/player/components/useTimelineTrackDerivations.ts +38 -0
- package/src/player/components/useTrackGapMenu.ts +155 -0
- package/src/player/hooks/useExpandedTimelineElements.test.ts +67 -4
- package/src/player/hooks/useExpandedTimelineElements.ts +19 -1
- package/src/player/hooks/useTimelinePlayer.seek.test.ts +55 -0
- package/src/player/hooks/useTimelinePlayer.test.ts +36 -3
- package/src/player/hooks/useTimelinePlayer.ts +4 -0
- package/src/player/hooks/useTimelineSyncCallbacks.ts +11 -1
- package/src/player/index.ts +3 -1
- package/src/player/lib/layerOrdering.test.ts +1 -15
- package/src/player/lib/layerOrdering.ts +5 -28
- package/src/player/lib/runtimeProtocol.test.ts +48 -0
- package/src/player/lib/runtimeProtocol.ts +65 -0
- package/src/player/lib/timelineDOM.test.ts +72 -0
- package/src/player/lib/timelineDOM.ts +12 -0
- package/src/player/lib/timelineElementHelpers.ts +54 -11
- package/src/player/lib/timelineIframeHelpers.ts +2 -4
- package/src/player/store/playerStore.test.ts +38 -13
- package/src/player/store/playerStore.ts +49 -1
- package/src/telemetry/events.test.ts +10 -0
- package/src/telemetry/events.ts +1 -0
- package/src/utils/assetPreviewDismiss.test.ts +27 -0
- package/src/utils/assetPreviewDismiss.ts +29 -0
- package/src/utils/domEditSaveQueue.ts +4 -3
- package/src/utils/editHistory.test.ts +82 -0
- package/src/utils/editHistory.ts +14 -2
- package/src/utils/gsapSoftReload.test.ts +54 -115
- package/src/utils/gsapSoftReload.ts +42 -152
- package/src/utils/gsapUndoRestore.test.ts +269 -0
- package/src/utils/gsapUndoRestore.ts +269 -0
- package/src/utils/sourceScopedSelectorIndex.ts +29 -0
- package/src/utils/timelineAssetDrop.test.ts +144 -52
- package/src/utils/timelineAssetDrop.ts +62 -86
- package/dist/assets/hyperframes-player-BBrKzTGd.js +0 -459
- package/dist/assets/index-D-GyYi2d.css +0 -1
- package/dist/chunk-5QSIMBEJ.js.map +0 -1
- /package/dist/{domEditingLayers-6LQGKPOI.js.map → domEditingLayers-2CKWGEHS.js.map} +0 -0
|
@@ -2,6 +2,8 @@ import { describe, expect, it, vi } from "vitest";
|
|
|
2
2
|
import type { TimelineElement } from "../player";
|
|
3
3
|
import { persistTimelineMoveEditsAtomically } from "./timelineMoveAdapter";
|
|
4
4
|
|
|
5
|
+
type MoveArgs = Parameters<typeof persistTimelineMoveEditsAtomically>;
|
|
6
|
+
|
|
5
7
|
const element = (id: string, track: number): TimelineElement => ({
|
|
6
8
|
id,
|
|
7
9
|
key: id,
|
|
@@ -11,64 +13,66 @@ const element = (id: string, track: number): TimelineElement => ({
|
|
|
11
13
|
track,
|
|
12
14
|
});
|
|
13
15
|
|
|
16
|
+
const twoLaneEdits = (bTrack: number): MoveArgs[0] => [
|
|
17
|
+
{ element: element("a", 0), updates: { start: 1, track: 1 } },
|
|
18
|
+
{ element: element("b", bTrack), updates: { start: 3, track: 2 } },
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
const movedPair = (edits: MoveArgs[0]) => [
|
|
22
|
+
{ element: edits[0].element, start: 1, track: 1 },
|
|
23
|
+
{ element: edits[1].element, start: 3, track: 2 },
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
const runMove = async (edits: MoveArgs[0], coalesceKey: MoveArgs[1], intent: MoveArgs[2]) => {
|
|
27
|
+
const handleTimelineGroupMove = vi.fn().mockResolvedValue(undefined);
|
|
28
|
+
await persistTimelineMoveEditsAtomically(edits, coalesceKey, intent, {
|
|
29
|
+
handleTimelineGroupMove,
|
|
30
|
+
});
|
|
31
|
+
return handleTimelineGroupMove;
|
|
32
|
+
};
|
|
33
|
+
|
|
14
34
|
describe("persistTimelineMoveEditsAtomically", () => {
|
|
15
35
|
it("persists two vertical edits as one group with the gesture coalesce key", async () => {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
{ element: element("a", 0), updates: { start: 1, track: 1 } },
|
|
19
|
-
{ element: element("b", 1), updates: { start: 3, track: 2 } },
|
|
20
|
-
];
|
|
21
|
-
await persistTimelineMoveEditsAtomically(edits, "clip-lane-move:7", "track-insert", {
|
|
22
|
-
handleTimelineGroupMove,
|
|
23
|
-
});
|
|
36
|
+
const edits = twoLaneEdits(1);
|
|
37
|
+
const handleTimelineGroupMove = await runMove(edits, "clip-lane-move:7", "track-insert");
|
|
24
38
|
expect(handleTimelineGroupMove).toHaveBeenCalledTimes(1);
|
|
25
|
-
expect(handleTimelineGroupMove).toHaveBeenCalledWith(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{ element: edits[1].element, start: 3, track: 2 },
|
|
29
|
-
],
|
|
30
|
-
{ coalesceKey: "clip-lane-move:7" },
|
|
31
|
-
);
|
|
39
|
+
expect(handleTimelineGroupMove).toHaveBeenCalledWith(movedPair(edits), {
|
|
40
|
+
coalesceKey: "clip-lane-move:7",
|
|
41
|
+
});
|
|
32
42
|
});
|
|
33
43
|
|
|
34
|
-
it("
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
await persistTimelineMoveEditsAtomically([edit], "clip-lane-move:7", "lane-reorder", {
|
|
38
|
-
handleTimelineGroupMove,
|
|
39
|
-
});
|
|
44
|
+
it("omits track attrs for plain timing moves (keeps the SDK fast path eligible)", async () => {
|
|
45
|
+
const edit = { element: element("a", 0), updates: { start: 1, track: 0 } };
|
|
46
|
+
const handleTimelineGroupMove = await runMove([edit], undefined, "timing");
|
|
40
47
|
expect(handleTimelineGroupMove).toHaveBeenCalledWith([{ element: edit.element, start: 1 }], {
|
|
41
|
-
coalesceKey:
|
|
48
|
+
coalesceKey: undefined,
|
|
42
49
|
});
|
|
43
50
|
});
|
|
44
51
|
|
|
45
|
-
it("
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
];
|
|
51
|
-
await persistTimelineMoveEditsAtomically(edits, "clip-lane-move:7", "lane-reorder", {
|
|
52
|
-
handleTimelineGroupMove,
|
|
53
|
-
});
|
|
52
|
+
it("persists the track attr for a single lane reorder (stable track lanes)", async () => {
|
|
53
|
+
// Lane = authored data-track-index; a vertical move that never hits disk
|
|
54
|
+
// snaps back on the next normalize, so the lane change MUST persist.
|
|
55
|
+
const edit = { element: element("a", 0), updates: { start: 1, track: 1 } };
|
|
56
|
+
const handleTimelineGroupMove = await runMove([edit], "clip-lane-move:7", "lane-reorder");
|
|
54
57
|
expect(handleTimelineGroupMove).toHaveBeenCalledWith(
|
|
55
|
-
[
|
|
56
|
-
{ element: edits[0].element, start: 1 },
|
|
57
|
-
{ element: edits[1].element, start: 3 },
|
|
58
|
-
],
|
|
58
|
+
[{ element: edit.element, start: 1, track: 1 }],
|
|
59
59
|
{ coalesceKey: "clip-lane-move:7" },
|
|
60
60
|
);
|
|
61
61
|
});
|
|
62
62
|
|
|
63
|
+
it("persists track attrs for a multi-selection lane drag (stable track lanes)", async () => {
|
|
64
|
+
const edits = twoLaneEdits(2);
|
|
65
|
+
const handleTimelineGroupMove = await runMove(edits, "clip-lane-move:7", "lane-reorder");
|
|
66
|
+
expect(handleTimelineGroupMove).toHaveBeenCalledWith(movedPair(edits), {
|
|
67
|
+
coalesceKey: "clip-lane-move:7",
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
|
63
71
|
it("rejects without retrying individual members when the atomic batch fails", async () => {
|
|
64
72
|
const failure = new Error("batch failed");
|
|
65
73
|
const handleTimelineGroupMove = vi.fn().mockRejectedValue(failure);
|
|
66
|
-
const edits = [
|
|
67
|
-
{ element: element("a", 0), updates: { start: 1, track: 1 } },
|
|
68
|
-
{ element: element("b", 1), updates: { start: 3, track: 2 } },
|
|
69
|
-
];
|
|
70
74
|
await expect(
|
|
71
|
-
persistTimelineMoveEditsAtomically(
|
|
75
|
+
persistTimelineMoveEditsAtomically(twoLaneEdits(1), "clip-lane-move:7", "track-insert", {
|
|
72
76
|
handleTimelineGroupMove,
|
|
73
77
|
}),
|
|
74
78
|
).rejects.toBe(failure);
|
|
@@ -23,15 +23,18 @@ export function persistTimelineMoveEditsAtomically(
|
|
|
23
23
|
coalesceKey: string | undefined,
|
|
24
24
|
operation: TimelineMoveOperation,
|
|
25
25
|
deps: AtomicMoveDeps,
|
|
26
|
+
coalesceMs?: number,
|
|
26
27
|
): Promise<void> {
|
|
27
28
|
return deps.handleTimelineGroupMove(
|
|
28
29
|
edits.map(({ element, updates }) => ({
|
|
29
30
|
element,
|
|
30
31
|
start: updates.start,
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
|
|
32
|
+
// Stable track lanes: a lane is the authored data-track-index, so every
|
|
33
|
+
// vertical gesture (lane-reorder AND track-insert) must persist the track;
|
|
34
|
+
// z is paint order only and is synced separately. Plain horizontal moves
|
|
35
|
+
// ("timing") omit it so they stay eligible for the SDK fast path.
|
|
36
|
+
track: operation === "timing" ? undefined : updates.track,
|
|
34
37
|
})),
|
|
35
|
-
{ coalesceKey },
|
|
38
|
+
{ coalesceKey, coalesceMs },
|
|
36
39
|
);
|
|
37
40
|
}
|