@remotion/studio 4.0.476 → 4.0.477

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.
Files changed (61) hide show
  1. package/dist/components/Canvas.js +40 -1
  2. package/dist/components/ControlButton.d.ts +1 -0
  3. package/dist/components/ControlButton.js +7 -2
  4. package/dist/components/EditorGuides/Guide.js +122 -20
  5. package/dist/components/EditorRuler/Ruler.js +21 -15
  6. package/dist/components/EditorRuler/index.js +18 -10
  7. package/dist/components/OutlineToggle.js +1 -1
  8. package/dist/components/SelectedOutlineElement.d.ts +17 -0
  9. package/dist/components/SelectedOutlineElement.js +938 -0
  10. package/dist/components/SelectedOutlineOverlay.d.ts +4 -210
  11. package/dist/components/SelectedOutlineOverlay.js +64 -1637
  12. package/dist/components/SelectedOutlineUvControls.js +1 -1
  13. package/dist/components/ShowGuidesProvider.js +4 -4
  14. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  15. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  16. package/dist/components/Timeline/Timeline.js +3 -1
  17. package/dist/components/Timeline/TimelineClipboardKeybindings.js +9 -10
  18. package/dist/components/Timeline/TimelineDeleteKeybindings.js +15 -4
  19. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +7 -11
  20. package/dist/components/Timeline/TimelineList.js +1 -1
  21. package/dist/components/Timeline/TimelineSelection.d.ts +27 -13
  22. package/dist/components/Timeline/TimelineSelection.js +47 -28
  23. package/dist/components/Timeline/TimelineSequence.js +169 -8
  24. package/dist/components/Timeline/TimelineSequenceFrame.d.ts +1 -0
  25. package/dist/components/Timeline/TimelineSequenceFrame.js +17 -6
  26. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  27. package/dist/components/Timeline/TimelineSequenceItem.js +90 -130
  28. package/dist/components/Timeline/delete-selected-timeline-item.js +4 -0
  29. package/dist/components/Timeline/duplicate-selected-timeline-item.d.ts +1 -2
  30. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +20 -0
  31. package/dist/components/Timeline/get-sequence-context-menu-items.js +160 -0
  32. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  33. package/dist/components/Timeline/sequence-props-subscription-store.js +11 -3
  34. package/dist/components/Timeline/should-clear-selection-on-pointer-down.d.ts +2 -0
  35. package/dist/components/Timeline/should-clear-selection-on-pointer-down.js +16 -2
  36. package/dist/components/Timeline/update-selected-easing.d.ts +4 -6
  37. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +2 -1
  38. package/dist/components/Timeline/use-sequence-props-subscription.js +3 -1
  39. package/dist/components/Timeline/use-timeline-keyframe-drag.d.ts +37 -1
  40. package/dist/components/Timeline/use-timeline-keyframe-drag.js +282 -1
  41. package/dist/components/import-assets.d.ts +36 -8
  42. package/dist/components/import-assets.js +170 -10
  43. package/dist/components/selected-outline-drag.d.ts +117 -0
  44. package/dist/components/selected-outline-drag.js +427 -0
  45. package/dist/components/selected-outline-measurement.d.ts +67 -0
  46. package/dist/components/selected-outline-measurement.js +355 -0
  47. package/dist/components/selected-outline-types.d.ts +121 -0
  48. package/dist/components/selected-outline-types.js +15 -0
  49. package/dist/components/selected-outline-uv.d.ts +1 -0
  50. package/dist/components/selected-outline-uv.js +12 -0
  51. package/dist/esm/{chunk-0atarw3p.js → chunk-t8fjnw2d.js} +12570 -11492
  52. package/dist/esm/internals.mjs +12570 -11492
  53. package/dist/esm/previewEntry.mjs +12580 -11502
  54. package/dist/esm/renderEntry.mjs +1 -1
  55. package/dist/helpers/editor-guide-selection.d.ts +31 -0
  56. package/dist/helpers/editor-guide-selection.js +58 -0
  57. package/dist/helpers/editor-ruler.d.ts +3 -3
  58. package/dist/helpers/editor-ruler.js +16 -18
  59. package/dist/state/editor-guides.d.ts +2 -2
  60. package/dist/state/editor-guides.js +2 -2
  61. package/package.json +11 -11
@@ -0,0 +1,938 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SelectedOutlineElement = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const react_1 = __importStar(require("react"));
39
+ const remotion_1 = require("remotion");
40
+ const no_react_1 = require("remotion/no-react");
41
+ const client_id_1 = require("../helpers/client-id");
42
+ const colors_1 = require("../helpers/colors");
43
+ const format_file_location_1 = require("../helpers/format-file-location");
44
+ const open_in_editor_1 = require("../helpers/open-in-editor");
45
+ const call_api_1 = require("./call-api");
46
+ const ConfirmationDialog_1 = require("./ConfirmationDialog");
47
+ const ContextMenu_1 = require("./ContextMenu");
48
+ const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
49
+ const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
50
+ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
51
+ const selected_outline_drag_1 = require("./selected-outline-drag");
52
+ const selected_outline_measurement_1 = require("./selected-outline-measurement");
53
+ const selected_outline_types_1 = require("./selected-outline-types");
54
+ const selected_outline_uv_1 = require("./selected-outline-uv");
55
+ const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
56
+ const disable_sequence_interactivity_1 = require("./Timeline/disable-sequence-interactivity");
57
+ const duplicate_selected_timeline_item_1 = require("./Timeline/duplicate-selected-timeline-item");
58
+ const get_sequence_context_menu_items_1 = require("./Timeline/get-sequence-context-menu-items");
59
+ const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
60
+ const timeline_asset_link_1 = require("./Timeline/timeline-asset-link");
61
+ const timeline_translate_utils_1 = require("./Timeline/timeline-translate-utils");
62
+ const get_stack_1 = require("./Timeline/TimelineStack/get-stack");
63
+ const transform_origin_utils_1 = require("./Timeline/transform-origin-utils");
64
+ const use_select_asset_1 = require("./use-select-asset");
65
+ const emptyContextMenuValues = [];
66
+ const SelectedOutlineTransformOriginHandle = ({ outline, onDraggingChange, target }) => {
67
+ var _a;
68
+ const { setDragOverrides, clearDragOverrides, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
69
+ const transformOriginDrag = (_a = target === null || target === void 0 ? void 0 : target.transformOriginDrag) !== null && _a !== void 0 ? _a : null;
70
+ const parsed = (0, react_1.useMemo)(() => transformOriginDrag === null
71
+ ? null
72
+ : (0, transform_origin_utils_1.parseTransformOrigin)(transformOriginDrag.originValue), [transformOriginDrag]);
73
+ const uv = (0, react_1.useMemo)(() => {
74
+ if (parsed === null || outline.dimensions === null) {
75
+ return null;
76
+ }
77
+ return (0, transform_origin_utils_1.parsedTransformOriginToUv)({
78
+ parsed,
79
+ width: outline.dimensions.width,
80
+ height: outline.dimensions.height,
81
+ });
82
+ }, [outline.dimensions, parsed]);
83
+ const position = (0, react_1.useMemo)(() => (uv === null ? null : (0, selected_outline_uv_1.getUvHandlePosition)(outline.points, uv)), [outline.points, uv]);
84
+ const onPointerDown = react_1.default.useCallback((event) => {
85
+ if (event.button !== 0 ||
86
+ transformOriginDrag === null ||
87
+ parsed === null ||
88
+ uv === null ||
89
+ outline.dimensions === null) {
90
+ return;
91
+ }
92
+ event.preventDefault();
93
+ event.stopPropagation();
94
+ const svg = event.currentTarget.ownerSVGElement;
95
+ if (svg === null) {
96
+ return;
97
+ }
98
+ const rotation = (0, selected_outline_drag_1.parseCssRotationToRadians)(transformOriginDrag.rotateValue);
99
+ if (rotation === null) {
100
+ return;
101
+ }
102
+ const { dimensions } = outline;
103
+ if (dimensions === null) {
104
+ return;
105
+ }
106
+ const [scaleX, scaleY] = no_react_1.NoReactInternals.parseScaleValue(transformOriginDrag.scaleValue);
107
+ const startTranslate = (0, timeline_translate_utils_1.parseTranslate)(transformOriginDrag.translateValue);
108
+ const svgRect = svg.getBoundingClientRect();
109
+ const defaultOrigin = transformOriginDrag.originDefault !== undefined
110
+ ? JSON.stringify(transformOriginDrag.originDefault)
111
+ : null;
112
+ const defaultTranslate = transformOriginDrag.translateDefault !== undefined
113
+ ? JSON.stringify(transformOriginDrag.translateDefault)
114
+ : null;
115
+ let last = null;
116
+ onDraggingChange(true);
117
+ (0, ForceSpecificCursor_1.forceSpecificCursor)('crosshair');
118
+ const updateFromPointerEvent = (pointerEvent) => {
119
+ const point = {
120
+ x: pointerEvent.clientX - svgRect.left,
121
+ y: pointerEvent.clientY - svgRect.top,
122
+ };
123
+ const nextUv = (0, selected_outline_uv_1.getUvCoordinateForPoint)(outline.points, point);
124
+ const deltaOrigin = [
125
+ (nextUv[0] - uv[0]) * dimensions.width,
126
+ (nextUv[1] - uv[1]) * dimensions.height,
127
+ ];
128
+ const [nextTranslateX, nextTranslateY] = (0, selected_outline_drag_1.compensateTranslateForTransformOrigin)({
129
+ startTranslate,
130
+ deltaOrigin,
131
+ rotate: rotation,
132
+ scale: [scaleX, scaleY],
133
+ });
134
+ const origin = (0, transform_origin_utils_1.serializeTransformOrigin)({
135
+ uv: nextUv,
136
+ z: parsed.z,
137
+ });
138
+ const translate = (0, timeline_translate_utils_1.serializeTranslate)(nextTranslateX, nextTranslateY);
139
+ last = { uv: nextUv, origin, translate };
140
+ setDragOverrides(transformOriginDrag.nodePath, selected_outline_types_1.transformOriginFieldKey, transformOriginDrag.originPropStatus.status === 'keyframed'
141
+ ? remotion_1.Internals.makeKeyframedDragOverride({
142
+ status: transformOriginDrag.originPropStatus,
143
+ frame: transformOriginDrag.sourceFrame,
144
+ value: origin,
145
+ })
146
+ : remotion_1.Internals.makeStaticDragOverride(origin));
147
+ setDragOverrides(transformOriginDrag.nodePath, selected_outline_types_1.translateFieldKey, transformOriginDrag.translatePropStatus.status === 'keyframed'
148
+ ? remotion_1.Internals.makeKeyframedDragOverride({
149
+ status: transformOriginDrag.translatePropStatus,
150
+ frame: transformOriginDrag.sourceFrame,
151
+ value: translate,
152
+ })
153
+ : remotion_1.Internals.makeStaticDragOverride(translate));
154
+ };
155
+ updateFromPointerEvent(event);
156
+ const onPointerMove = (moveEvent) => {
157
+ moveEvent.preventDefault();
158
+ updateFromPointerEvent(moveEvent);
159
+ };
160
+ const onPointerUp = () => {
161
+ window.removeEventListener('pointermove', onPointerMove);
162
+ window.removeEventListener('pointerup', onPointerUp);
163
+ window.removeEventListener('pointercancel', onPointerUp);
164
+ (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
165
+ onDraggingChange(false);
166
+ if (last === null || (0, selected_outline_drag_1.uvsEqual)(last.uv, uv)) {
167
+ clearDragOverrides(transformOriginDrag.nodePath);
168
+ return;
169
+ }
170
+ const originChanged = last.origin !== transformOriginDrag.originValue;
171
+ const translateChanged = last.translate !== transformOriginDrag.translateValue;
172
+ if (!originChanged && !translateChanged) {
173
+ clearDragOverrides(transformOriginDrag.nodePath);
174
+ return;
175
+ }
176
+ const shouldSaveAsKeyframes = transformOriginDrag.originPropStatus.status === 'keyframed' ||
177
+ transformOriginDrag.translatePropStatus.status === 'keyframed';
178
+ const promise = shouldSaveAsKeyframes
179
+ ? (0, call_add_keyframe_1.callAddKeyframes)({
180
+ sequenceKeyframes: [
181
+ originChanged
182
+ ? {
183
+ fileName: transformOriginDrag.nodePath.absolutePath,
184
+ nodePath: transformOriginDrag.nodePath,
185
+ fieldKey: selected_outline_types_1.transformOriginFieldKey,
186
+ sourceFrame: transformOriginDrag.sourceFrame,
187
+ value: last.origin,
188
+ schema: transformOriginDrag.schema,
189
+ }
190
+ : null,
191
+ translateChanged
192
+ ? {
193
+ fileName: transformOriginDrag.nodePath.absolutePath,
194
+ nodePath: transformOriginDrag.nodePath,
195
+ fieldKey: selected_outline_types_1.translateFieldKey,
196
+ sourceFrame: transformOriginDrag.sourceFrame,
197
+ value: last.translate,
198
+ schema: transformOriginDrag.schema,
199
+ }
200
+ : null,
201
+ ].filter(no_react_1.NoReactInternals.truthy),
202
+ effectKeyframes: [],
203
+ setPropStatuses,
204
+ clientId: transformOriginDrag.clientId,
205
+ })
206
+ : (0, save_sequence_prop_1.saveSequenceProps)({
207
+ changes: [
208
+ originChanged
209
+ ? {
210
+ fileName: transformOriginDrag.nodePath.absolutePath,
211
+ nodePath: transformOriginDrag.nodePath,
212
+ fieldKey: selected_outline_types_1.transformOriginFieldKey,
213
+ value: last.origin,
214
+ defaultValue: defaultOrigin,
215
+ schema: transformOriginDrag.schema,
216
+ }
217
+ : null,
218
+ translateChanged
219
+ ? {
220
+ fileName: transformOriginDrag.nodePath.absolutePath,
221
+ nodePath: transformOriginDrag.nodePath,
222
+ fieldKey: selected_outline_types_1.translateFieldKey,
223
+ value: last.translate,
224
+ defaultValue: defaultTranslate,
225
+ schema: transformOriginDrag.schema,
226
+ }
227
+ : null,
228
+ ].filter(no_react_1.NoReactInternals.truthy),
229
+ setPropStatuses,
230
+ clientId: transformOriginDrag.clientId,
231
+ undoLabel: 'Move transform origin',
232
+ redoLabel: 'Move transform origin back',
233
+ });
234
+ promise
235
+ .catch((err) => {
236
+ (0, NotificationCenter_1.showNotification)(`Could not save transform origin: ${err instanceof Error ? err.message : String(err)}`, 4000);
237
+ })
238
+ .finally(() => {
239
+ clearDragOverrides(transformOriginDrag.nodePath);
240
+ });
241
+ };
242
+ window.addEventListener('pointermove', onPointerMove);
243
+ window.addEventListener('pointerup', onPointerUp);
244
+ window.addEventListener('pointercancel', onPointerUp);
245
+ }, [
246
+ clearDragOverrides,
247
+ onDraggingChange,
248
+ outline,
249
+ parsed,
250
+ setDragOverrides,
251
+ setPropStatuses,
252
+ transformOriginDrag,
253
+ uv,
254
+ ]);
255
+ if (transformOriginDrag === null ||
256
+ parsed === null ||
257
+ uv === null ||
258
+ position === null) {
259
+ return null;
260
+ }
261
+ return (jsx_runtime_1.jsxs("g", { pointerEvents: "all", cursor: "crosshair", onPointerDown: onPointerDown, "aria-hidden": "true", children: [
262
+ jsx_runtime_1.jsx("circle", { cx: position.x, cy: position.y, r: 4, stroke: colors_1.BLUE, fill: "none", strokeWidth: 2, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("line", { x1: position.x - 8, y1: position.y, x2: position.x + 8, y2: position.y, stroke: colors_1.BLUE, strokeWidth: 2, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("line", { x1: position.x, y1: position.y - 8, x2: position.x, y2: position.y + 8, stroke: colors_1.BLUE, strokeWidth: 2, vectorEffect: "non-scaling-stroke" })
263
+ ] }));
264
+ };
265
+ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, hovered, onContextMenuOpen, outline, onDraggingChange, onHoverChange, onSelect, scale, target, }) => {
266
+ var _a, _b, _c, _d;
267
+ const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
268
+ const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
269
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
270
+ const timelinePositionRef = (0, react_1.useRef)(timelinePosition);
271
+ timelinePositionRef.current = timelinePosition;
272
+ const polygonRef = (0, react_1.useRef)(null);
273
+ const points = (0, react_1.useMemo)(() => outline.points.map(selected_outline_measurement_1.pointToString).join(' '), [outline.points]);
274
+ const drag = (_a = target === null || target === void 0 ? void 0 : target.drag) !== null && _a !== void 0 ? _a : null;
275
+ const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
276
+ const containsSelection = (_c = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _c !== void 0 ? _c : false;
277
+ const effectDrop = (_d = target === null || target === void 0 ? void 0 : target.effectDrop) !== null && _d !== void 0 ? _d : null;
278
+ const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
279
+ const visible = containsSelection || hovered;
280
+ const onPointerDown = react_1.default.useCallback((event) => {
281
+ if (event.button !== 0 || target === undefined) {
282
+ return;
283
+ }
284
+ event.preventDefault();
285
+ event.stopPropagation();
286
+ const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
287
+ const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
288
+ if (shouldUpdateSelection) {
289
+ onSelect(target.selection, interaction);
290
+ }
291
+ if (drag === null || interaction.shiftKey || interaction.toggleKey) {
292
+ return;
293
+ }
294
+ const startPointerX = event.clientX;
295
+ const startPointerY = event.clientY;
296
+ const dragStates = (0, selected_outline_drag_1.getSelectedOutlineDragStates)({
297
+ dragTargets: selected ? allDragTargets : [drag],
298
+ getDragOverrides,
299
+ timelinePosition: timelinePositionRef.current,
300
+ });
301
+ let lastValues = new Map();
302
+ let currentPointerX = startPointerX;
303
+ let currentPointerY = startPointerY;
304
+ let axisLocked = false;
305
+ let dragStarted = false;
306
+ const updateDragOverrides = () => {
307
+ const screenDeltaX = currentPointerX - startPointerX;
308
+ const screenDeltaY = currentPointerY - startPointerY;
309
+ if (!dragStarted) {
310
+ if (!(0, selected_outline_drag_1.isSelectedOutlineDragPastThreshold)({
311
+ deltaX: screenDeltaX,
312
+ deltaY: screenDeltaY,
313
+ })) {
314
+ return;
315
+ }
316
+ dragStarted = true;
317
+ onDraggingChange(true);
318
+ }
319
+ const dragDelta = (0, selected_outline_drag_1.applySelectedOutlineDragAxisLock)({
320
+ deltaX: screenDeltaX / scale,
321
+ deltaY: screenDeltaY / scale,
322
+ axisLocked,
323
+ });
324
+ lastValues = (0, selected_outline_drag_1.getSelectedOutlineDragValues)({
325
+ dragStates,
326
+ deltaX: dragDelta.deltaX,
327
+ deltaY: dragDelta.deltaY,
328
+ });
329
+ for (const dragState of dragStates) {
330
+ const value = lastValues.get(dragState.key);
331
+ if (value === undefined) {
332
+ throw new Error('Expected drag value to be available');
333
+ }
334
+ if (dragState.target.propStatus.status === 'keyframed') {
335
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
336
+ status: dragState.target.propStatus,
337
+ frame: dragState.sourceFrame,
338
+ value,
339
+ }));
340
+ }
341
+ else {
342
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
343
+ }
344
+ }
345
+ };
346
+ const onPointerMove = (moveEvent) => {
347
+ moveEvent.preventDefault();
348
+ currentPointerX = moveEvent.clientX;
349
+ currentPointerY = moveEvent.clientY;
350
+ axisLocked = moveEvent.shiftKey;
351
+ updateDragOverrides();
352
+ };
353
+ const onKeyChange = (keyEvent) => {
354
+ if (keyEvent.key !== 'Shift') {
355
+ return;
356
+ }
357
+ const nextAxisLocked = keyEvent.type === 'keydown';
358
+ if (nextAxisLocked === axisLocked) {
359
+ return;
360
+ }
361
+ axisLocked = nextAxisLocked;
362
+ updateDragOverrides();
363
+ };
364
+ const onPointerUp = () => {
365
+ window.removeEventListener('pointermove', onPointerMove);
366
+ window.removeEventListener('pointerup', onPointerUp);
367
+ window.removeEventListener('pointercancel', onPointerUp);
368
+ window.removeEventListener('keydown', onKeyChange);
369
+ window.removeEventListener('keyup', onKeyChange);
370
+ if (dragStarted) {
371
+ onDraggingChange(false);
372
+ }
373
+ const changes = (0, selected_outline_drag_1.getSelectedOutlineDragChanges)({
374
+ dragStates,
375
+ lastValues,
376
+ });
377
+ if (changes.length === 0) {
378
+ (0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
379
+ return;
380
+ }
381
+ const staticChanges = changes.filter((change) => change.type === 'static');
382
+ const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
383
+ Promise.all([
384
+ staticChanges.length > 0
385
+ ? (0, save_sequence_prop_1.saveSequenceProps)({
386
+ changes: staticChanges,
387
+ setPropStatuses,
388
+ clientId: drag.clientId,
389
+ undoLabel: changes.length > 1
390
+ ? 'Move selected sequences'
391
+ : 'Move sequence',
392
+ redoLabel: changes.length > 1
393
+ ? 'Move selected sequences back'
394
+ : 'Move sequence back',
395
+ })
396
+ : Promise.resolve(),
397
+ ...keyframedChanges.map((change) => (0, call_add_keyframe_1.callAddSequenceKeyframe)({
398
+ fileName: change.fileName,
399
+ nodePath: change.nodePath,
400
+ fieldKey: change.fieldKey,
401
+ sourceFrame: change.sourceFrame,
402
+ value: change.value,
403
+ schema: change.schema,
404
+ setPropStatuses,
405
+ clientId: change.clientId,
406
+ })),
407
+ ])
408
+ .catch((err) => {
409
+ (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
410
+ })
411
+ .finally(() => {
412
+ (0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
413
+ });
414
+ };
415
+ window.addEventListener('pointermove', onPointerMove);
416
+ window.addEventListener('pointerup', onPointerUp);
417
+ window.addEventListener('pointercancel', onPointerUp);
418
+ window.addEventListener('keydown', onKeyChange);
419
+ window.addEventListener('keyup', onKeyChange);
420
+ }, [
421
+ allDragTargets,
422
+ clearDragOverrides,
423
+ drag,
424
+ getDragOverrides,
425
+ onDraggingChange,
426
+ onSelect,
427
+ scale,
428
+ selected,
429
+ setPropStatuses,
430
+ setDragOverrides,
431
+ target,
432
+ ]);
433
+ const onEffectDragOver = react_1.default.useCallback((event) => {
434
+ if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
435
+ return;
436
+ }
437
+ event.preventDefault();
438
+ event.stopPropagation();
439
+ event.dataTransfer.dropEffect = 'copy';
440
+ setEffectDropHovered(true);
441
+ }, [effectDrop]);
442
+ const onEffectDragLeave = react_1.default.useCallback((event) => {
443
+ if (event.currentTarget.contains(event.relatedTarget)) {
444
+ return;
445
+ }
446
+ setEffectDropHovered(false);
447
+ }, []);
448
+ const onEffectDrop = react_1.default.useCallback(async (event) => {
449
+ if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
450
+ return;
451
+ }
452
+ const dragData = (0, effect_drag_and_drop_1.getEffectDragData)(event.dataTransfer);
453
+ if (!dragData) {
454
+ if ((0, effect_drag_and_drop_1.hasExplicitEffectDragType)(event.dataTransfer)) {
455
+ event.preventDefault();
456
+ event.stopPropagation();
457
+ setEffectDropHovered(false);
458
+ (0, NotificationCenter_1.showNotification)('Could not read effect drag data', 3000);
459
+ }
460
+ return;
461
+ }
462
+ event.preventDefault();
463
+ event.stopPropagation();
464
+ setEffectDropHovered(false);
465
+ await (0, effect_drag_and_drop_1.addEffectFromDragData)({
466
+ dragData,
467
+ fileName: effectDrop.fileName,
468
+ nodePath: effectDrop.nodePath,
469
+ clientId: effectDrop.clientId,
470
+ });
471
+ }, [effectDrop]);
472
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
473
+ jsx_runtime_1.jsx("polygon", { ref: polygonRef, points: points, fill: effectDropHovered ? 'rgba(0, 155, 255, 0.12)' : 'transparent', stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: target === undefined ? undefined : 'all', onPointerEnter: () => {
474
+ if (!dragging) {
475
+ onHoverChange(outline.key);
476
+ }
477
+ }, onPointerLeave: () => {
478
+ if (!dragging) {
479
+ onHoverChange(null);
480
+ }
481
+ }, onPointerDown: onPointerDown, onDragOver: effectDrop === null ? undefined : onEffectDragOver, onDragLeave: effectDrop === null ? undefined : onEffectDragLeave, onDrop: effectDrop === null ? undefined : onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
482
+ ] }));
483
+ };
484
+ const SelectedOutlineScaleEdgeLine = ({ allScaleDragTargets, contextMenuValues, dragging, edge, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
485
+ var _a, _b;
486
+ const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
487
+ const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
488
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
489
+ const timelinePositionRef = (0, react_1.useRef)(timelinePosition);
490
+ timelinePositionRef.current = timelinePosition;
491
+ const scaleDrag = (_a = target === null || target === void 0 ? void 0 : target.scaleDrag) !== null && _a !== void 0 ? _a : null;
492
+ const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
493
+ const lineRef = (0, react_1.useRef)(null);
494
+ const edgeInfo = (0, react_1.useMemo)(() => (0, selected_outline_drag_1.getSelectedOutlineScaleEdgeInfo)(outline.points, edge), [edge, outline.points]);
495
+ const onPointerDown = react_1.default.useCallback((event) => {
496
+ if (event.button !== 0 || scaleDrag === null || edgeInfo === null) {
497
+ return;
498
+ }
499
+ event.preventDefault();
500
+ event.stopPropagation();
501
+ const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
502
+ const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
503
+ if (shouldUpdateSelection && target !== undefined) {
504
+ onSelect(target.selection, interaction);
505
+ }
506
+ if (interaction.shiftKey || interaction.toggleKey) {
507
+ return;
508
+ }
509
+ onDraggingChange(true);
510
+ (0, ForceSpecificCursor_1.forceSpecificCursor)(edgeInfo.cursor);
511
+ const startPointer = { x: event.clientX, y: event.clientY };
512
+ const dragStates = (0, selected_outline_drag_1.getSelectedOutlineScaleDragStates)({
513
+ dragTargets: selected ? allScaleDragTargets : [scaleDrag],
514
+ getDragOverrides,
515
+ timelinePosition: timelinePositionRef.current,
516
+ });
517
+ let lastValues = new Map();
518
+ const onPointerMove = (moveEvent) => {
519
+ moveEvent.preventDefault();
520
+ const delta = {
521
+ x: moveEvent.clientX - startPointer.x,
522
+ y: moveEvent.clientY - startPointer.y,
523
+ };
524
+ const projectedDelta = (0, selected_outline_measurement_1.dot)(delta, edgeInfo.normal);
525
+ const scaleFactor = Math.max(0.001, 1 + projectedDelta / edgeInfo.extent);
526
+ lastValues = (0, selected_outline_drag_1.getSelectedOutlineScaleDragValues)({
527
+ dragStates,
528
+ axis: edgeInfo.axis,
529
+ scaleFactor,
530
+ });
531
+ for (const dragState of dragStates) {
532
+ const value = lastValues.get(dragState.key);
533
+ if (value === undefined) {
534
+ throw new Error('Expected scale drag value to be available');
535
+ }
536
+ if (dragState.target.propStatus.status === 'keyframed') {
537
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.scaleFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
538
+ status: dragState.target.propStatus,
539
+ frame: dragState.sourceFrame,
540
+ value,
541
+ }));
542
+ }
543
+ else {
544
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.scaleFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
545
+ }
546
+ }
547
+ };
548
+ const onPointerUp = () => {
549
+ window.removeEventListener('pointermove', onPointerMove);
550
+ window.removeEventListener('pointerup', onPointerUp);
551
+ window.removeEventListener('pointercancel', onPointerUp);
552
+ (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
553
+ onDraggingChange(false);
554
+ const changes = (0, selected_outline_drag_1.getSelectedOutlineScaleDragChanges)({
555
+ dragStates,
556
+ lastValues,
557
+ });
558
+ if (changes.length === 0) {
559
+ (0, selected_outline_drag_1.clearSelectedOutlineScaleDragOverrides)({
560
+ clearDragOverrides,
561
+ dragStates,
562
+ });
563
+ return;
564
+ }
565
+ const staticChanges = changes.filter((change) => change.type === 'static');
566
+ const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
567
+ Promise.all([
568
+ staticChanges.length > 0
569
+ ? (0, save_sequence_prop_1.saveSequenceProps)({
570
+ changes: staticChanges,
571
+ setPropStatuses,
572
+ clientId: scaleDrag.clientId,
573
+ undoLabel: changes.length > 1
574
+ ? 'Scale selected sequences'
575
+ : 'Scale sequence',
576
+ redoLabel: changes.length > 1
577
+ ? 'Scale selected sequences back'
578
+ : 'Scale sequence back',
579
+ })
580
+ : Promise.resolve(),
581
+ ...keyframedChanges.map((change) => (0, call_add_keyframe_1.callAddSequenceKeyframe)({
582
+ fileName: change.fileName,
583
+ nodePath: change.nodePath,
584
+ fieldKey: change.fieldKey,
585
+ sourceFrame: change.sourceFrame,
586
+ value: change.value,
587
+ schema: change.schema,
588
+ setPropStatuses,
589
+ clientId: change.clientId,
590
+ })),
591
+ ])
592
+ .catch((err) => {
593
+ (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
594
+ })
595
+ .finally(() => {
596
+ (0, selected_outline_drag_1.clearSelectedOutlineScaleDragOverrides)({
597
+ clearDragOverrides,
598
+ dragStates,
599
+ });
600
+ });
601
+ };
602
+ window.addEventListener('pointermove', onPointerMove);
603
+ window.addEventListener('pointerup', onPointerUp);
604
+ window.addEventListener('pointercancel', onPointerUp);
605
+ }, [
606
+ allScaleDragTargets,
607
+ clearDragOverrides,
608
+ edgeInfo,
609
+ getDragOverrides,
610
+ onDraggingChange,
611
+ onSelect,
612
+ scaleDrag,
613
+ selected,
614
+ setPropStatuses,
615
+ setDragOverrides,
616
+ target,
617
+ ]);
618
+ if (scaleDrag === null || edgeInfo === null) {
619
+ return null;
620
+ }
621
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
622
+ jsx_runtime_1.jsx("line", { ref: lineRef, x1: edgeInfo.start.x, y1: edgeInfo.start.y, x2: edgeInfo.end.x, y2: edgeInfo.end.y, stroke: "transparent", strokeWidth: 12, vectorEffect: "non-scaling-stroke", pointerEvents: "stroke", cursor: edgeInfo.cursor, onPointerEnter: () => {
623
+ if (!dragging) {
624
+ onHoverChange(outline.key);
625
+ }
626
+ }, onPointerLeave: () => {
627
+ if (!dragging) {
628
+ onHoverChange(null);
629
+ }
630
+ }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: lineRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
631
+ ] }));
632
+ };
633
+ const svgPointToClientPoint = (point, rect) => {
634
+ return {
635
+ x: point.x + rect.left,
636
+ y: point.y + rect.top,
637
+ };
638
+ };
639
+ const SelectedOutlineRotationCornerHandle = ({ allRotationDragTargets, contextMenuValues, corner, dragging, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
640
+ var _a, _b;
641
+ const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
642
+ const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
643
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
644
+ const timelinePositionRef = (0, react_1.useRef)(timelinePosition);
645
+ timelinePositionRef.current = timelinePosition;
646
+ const rotationDrag = (_a = target === null || target === void 0 ? void 0 : target.rotationDrag) !== null && _a !== void 0 ? _a : null;
647
+ const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
648
+ const circleRef = (0, react_1.useRef)(null);
649
+ const cornerInfo = (0, react_1.useMemo)(() => (0, selected_outline_measurement_1.getSelectedOutlineRotationCornerInfo)(outline.points, corner), [corner, outline.points]);
650
+ const onPointerDown = react_1.default.useCallback((event) => {
651
+ if (event.button !== 0 || rotationDrag === null) {
652
+ return;
653
+ }
654
+ event.preventDefault();
655
+ event.stopPropagation();
656
+ const svg = event.currentTarget.ownerSVGElement;
657
+ if (svg === null) {
658
+ return;
659
+ }
660
+ const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
661
+ const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
662
+ if (shouldUpdateSelection && target !== undefined) {
663
+ onSelect(target.selection, interaction);
664
+ }
665
+ if (interaction.shiftKey || interaction.toggleKey) {
666
+ return;
667
+ }
668
+ onDraggingChange(true);
669
+ (0, ForceSpecificCursor_1.forceSpecificCursor)(cornerInfo.cursor);
670
+ const svgRect = svg.getBoundingClientRect();
671
+ const center = svgPointToClientPoint((0, selected_outline_measurement_1.getSelectedOutlineRotationPivot)({
672
+ dimensions: outline.dimensions,
673
+ points: outline.points,
674
+ transformOriginValue: rotationDrag.transformOriginValue,
675
+ }), svgRect);
676
+ const dragStates = (0, selected_outline_drag_1.getSelectedOutlineRotationDragStates)({
677
+ dragTargets: selected ? allRotationDragTargets : [rotationDrag],
678
+ getDragOverrides,
679
+ timelinePosition: timelinePositionRef.current,
680
+ });
681
+ let previousAngle = (0, selected_outline_measurement_1.getAngleDegrees)(center, {
682
+ x: event.clientX,
683
+ y: event.clientY,
684
+ });
685
+ let accumulatedDelta = 0;
686
+ let lastValues = new Map();
687
+ const onPointerMove = (moveEvent) => {
688
+ moveEvent.preventDefault();
689
+ const nextAngle = (0, selected_outline_measurement_1.getAngleDegrees)(center, {
690
+ x: moveEvent.clientX,
691
+ y: moveEvent.clientY,
692
+ });
693
+ accumulatedDelta += (0, selected_outline_measurement_1.getSelectedOutlineRotationDeltaDegrees)({
694
+ from: previousAngle,
695
+ to: nextAngle,
696
+ });
697
+ previousAngle = nextAngle;
698
+ lastValues = (0, selected_outline_drag_1.getSelectedOutlineRotationDragValues)({
699
+ dragStates,
700
+ rotationDeltaDegrees: accumulatedDelta,
701
+ });
702
+ (0, ForceSpecificCursor_1.forceSpecificCursor)((0, selected_outline_measurement_1.getRotationCursor)(cornerInfo.cursorDegrees + accumulatedDelta));
703
+ for (const dragState of dragStates) {
704
+ const value = lastValues.get(dragState.key);
705
+ if (value === undefined) {
706
+ throw new Error('Expected rotation drag value to be available');
707
+ }
708
+ if (dragState.target.propStatus.status === 'keyframed') {
709
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.rotateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
710
+ status: dragState.target.propStatus,
711
+ frame: dragState.sourceFrame,
712
+ value,
713
+ }));
714
+ }
715
+ else {
716
+ setDragOverrides(dragState.target.nodePath, selected_outline_types_1.rotateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
717
+ }
718
+ }
719
+ };
720
+ const onPointerUp = () => {
721
+ window.removeEventListener('pointermove', onPointerMove);
722
+ window.removeEventListener('pointerup', onPointerUp);
723
+ window.removeEventListener('pointercancel', onPointerUp);
724
+ (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
725
+ onDraggingChange(false);
726
+ const changes = (0, selected_outline_drag_1.getSelectedOutlineRotationDragChanges)({
727
+ dragStates,
728
+ lastValues,
729
+ });
730
+ if (changes.length === 0) {
731
+ (0, selected_outline_drag_1.clearSelectedOutlineRotationDragOverrides)({
732
+ clearDragOverrides,
733
+ dragStates,
734
+ });
735
+ return;
736
+ }
737
+ const staticChanges = changes.filter((change) => change.type === 'static');
738
+ const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
739
+ Promise.all([
740
+ staticChanges.length > 0
741
+ ? (0, save_sequence_prop_1.saveSequenceProps)({
742
+ changes: staticChanges,
743
+ setPropStatuses,
744
+ clientId: rotationDrag.clientId,
745
+ undoLabel: changes.length > 1
746
+ ? 'Rotate selected sequences'
747
+ : 'Rotate sequence',
748
+ redoLabel: changes.length > 1
749
+ ? 'Rotate selected sequences back'
750
+ : 'Rotate sequence back',
751
+ })
752
+ : Promise.resolve(),
753
+ ...keyframedChanges.map((change) => (0, call_add_keyframe_1.callAddSequenceKeyframe)({
754
+ fileName: change.fileName,
755
+ nodePath: change.nodePath,
756
+ fieldKey: change.fieldKey,
757
+ sourceFrame: change.sourceFrame,
758
+ value: change.value,
759
+ schema: change.schema,
760
+ setPropStatuses,
761
+ clientId: change.clientId,
762
+ })),
763
+ ])
764
+ .catch((err) => {
765
+ (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
766
+ })
767
+ .finally(() => {
768
+ (0, selected_outline_drag_1.clearSelectedOutlineRotationDragOverrides)({
769
+ clearDragOverrides,
770
+ dragStates,
771
+ });
772
+ });
773
+ };
774
+ window.addEventListener('pointermove', onPointerMove);
775
+ window.addEventListener('pointerup', onPointerUp);
776
+ window.addEventListener('pointercancel', onPointerUp);
777
+ }, [
778
+ allRotationDragTargets,
779
+ clearDragOverrides,
780
+ cornerInfo,
781
+ getDragOverrides,
782
+ onDraggingChange,
783
+ outline.dimensions,
784
+ outline.points,
785
+ onSelect,
786
+ rotationDrag,
787
+ selected,
788
+ setPropStatuses,
789
+ setDragOverrides,
790
+ target,
791
+ ]);
792
+ if (rotationDrag === null) {
793
+ return null;
794
+ }
795
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
796
+ jsx_runtime_1.jsx("circle", { ref: circleRef, cx: cornerInfo.point.x, cy: cornerInfo.point.y, r: 12, fill: "transparent", stroke: "transparent", vectorEffect: "non-scaling-stroke", pointerEvents: "all", cursor: cornerInfo.cursor, onPointerEnter: () => {
797
+ if (!dragging) {
798
+ onHoverChange(outline.key);
799
+ }
800
+ }, onPointerLeave: () => {
801
+ if (!dragging) {
802
+ onHoverChange(null);
803
+ }
804
+ }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: circleRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
805
+ ] }));
806
+ };
807
+ const SelectedOutlineElement = ({ allDragTargets, allRotationDragTargets, allScaleDragTargets, dragging, hovered, outline, onDraggingChange, onHoverChange, onSelect, scale, target, }) => {
808
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
809
+ const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
810
+ const updateResolvedStackTrace = (0, react_1.useContext)(remotion_1.Internals.SequenceStackTracesUpdateContext);
811
+ const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
812
+ const selectAsset = (0, use_select_asset_1.useSelectAsset)();
813
+ const onContextMenuOpen = react_1.default.useCallback(async () => {
814
+ if (target === undefined || previewServerState.type !== 'connected') {
815
+ return false;
816
+ }
817
+ if (!target.selected) {
818
+ onSelect(target.selection, { shiftKey: false, toggleKey: false });
819
+ }
820
+ const stack = target.sequence.getStack();
821
+ let originalLocation = null;
822
+ if (stack) {
823
+ try {
824
+ originalLocation = await (0, get_stack_1.getOriginalLocationFromStack)(stack, 'sequence');
825
+ }
826
+ catch (err) {
827
+ (0, NotificationCenter_1.showNotification)(err.message, 2000);
828
+ }
829
+ }
830
+ if (stack) {
831
+ updateResolvedStackTrace(stack, originalLocation);
832
+ }
833
+ const fileLocation = (0, format_file_location_1.formatFileLocation)({
834
+ location: originalLocation,
835
+ root: window.remotion_cwd,
836
+ });
837
+ const nodePath = target.nodePathInfo.sequenceSubscriptionKey;
838
+ const mediaSrc = target.sequence.type === 'audio' ||
839
+ target.sequence.type === 'video' ||
840
+ target.sequence.type === 'image'
841
+ ? target.sequence.src
842
+ : null;
843
+ const assetLinkInfo = mediaSrc ? (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(mediaSrc) : null;
844
+ const canOpenInEditor = Boolean(window.remotion_editorName && originalLocation);
845
+ const disableInteractivityDisabled = !target.sequence.showInTimeline;
846
+ const sourceEditDisabled = !target.sequence.controls || !nodePath.absolutePath;
847
+ return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
848
+ assetLinkInfo,
849
+ canOpenInEditor,
850
+ deleteDisabled: sourceEditDisabled,
851
+ disableInteractivityDisabled,
852
+ duplicateDisabled: sourceEditDisabled,
853
+ fileLocation,
854
+ includeSourceEditItems: true,
855
+ onDeleteSequenceFromSource: async () => {
856
+ if (sourceEditDisabled || previewServerState.type !== 'connected') {
857
+ return;
858
+ }
859
+ if (target.nodePathInfo.numberOfSequencesWithThisNodePath > 1) {
860
+ const shouldDelete = await confirm({
861
+ title: 'Delete sequence?',
862
+ message: 'This sequence is programmatically duplicated ' +
863
+ target.nodePathInfo.numberOfSequencesWithThisNodePath +
864
+ ' times in the code. Deleting removes all instances. Continue?',
865
+ confirmLabel: 'Delete',
866
+ });
867
+ if (!shouldDelete) {
868
+ return;
869
+ }
870
+ }
871
+ try {
872
+ const result = await (0, call_api_1.callApi)('/api/delete-jsx-node', {
873
+ nodes: [
874
+ {
875
+ fileName: nodePath.absolutePath,
876
+ nodePath: nodePath.nodePath,
877
+ },
878
+ ],
879
+ });
880
+ if (result.success) {
881
+ (0, NotificationCenter_1.showNotification)('Removed sequence from source file', 2000);
882
+ }
883
+ else {
884
+ (0, NotificationCenter_1.showNotification)(result.reason, 4000);
885
+ }
886
+ }
887
+ catch (err) {
888
+ (0, NotificationCenter_1.showNotification)(err.message, 4000);
889
+ }
890
+ },
891
+ onDisableSequenceInteractivity: () => {
892
+ if (disableInteractivityDisabled ||
893
+ previewServerState.type !== 'connected') {
894
+ return;
895
+ }
896
+ (0, disable_sequence_interactivity_1.disableSequenceInteractivity)({
897
+ fileName: nodePath.absolutePath,
898
+ nodePath,
899
+ setPropStatuses,
900
+ clientId: previewServerState.clientId,
901
+ });
902
+ },
903
+ onDuplicateSequenceFromSource: () => {
904
+ if (sourceEditDisabled) {
905
+ return;
906
+ }
907
+ (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)([target.nodePathInfo], confirm).catch(() => undefined);
908
+ },
909
+ openInEditor: () => {
910
+ if (!originalLocation) {
911
+ return;
912
+ }
913
+ (0, open_in_editor_1.openOriginalPositionInEditor)(originalLocation).catch((err) => {
914
+ (0, NotificationCenter_1.showNotification)(err.message, 2000);
915
+ });
916
+ },
917
+ originalLocation,
918
+ selectAsset,
919
+ sequence: target.sequence,
920
+ });
921
+ }, [
922
+ confirm,
923
+ onSelect,
924
+ previewServerState,
925
+ selectAsset,
926
+ setPropStatuses,
927
+ target,
928
+ updateResolvedStackTrace,
929
+ ]);
930
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
931
+ jsx_runtime_1.jsx(SelectedOutlinePolygon, { allDragTargets: allDragTargets, contextMenuValues: emptyContextMenuValues, dragging: dragging, hovered: hovered, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, scale: scale, target: target }), (target === null || target === void 0 ? void 0 : target.containsSelection) || hovered
932
+ ? ['top', 'right', 'bottom', 'left'].map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine, { allScaleDragTargets: allScaleDragTargets, contextMenuValues: emptyContextMenuValues, dragging: dragging, edge: edge, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, edge)))
933
+ : null, (target === null || target === void 0 ? void 0 : target.containsSelection) || hovered
934
+ ? ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map((corner) => (jsx_runtime_1.jsx(SelectedOutlineRotationCornerHandle, { allRotationDragTargets: allRotationDragTargets, contextMenuValues: emptyContextMenuValues, corner: corner, dragging: dragging, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, corner)))
935
+ : null, jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, target: target })
936
+ ] }));
937
+ };
938
+ exports.SelectedOutlineElement = SelectedOutlineElement;