@remotion/studio 4.0.506 → 4.0.507

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 (119) hide show
  1. package/dist/api/copy-render-output-to-asset.d.ts +4 -0
  2. package/dist/api/copy-render-output-to-asset.js +11 -0
  3. package/dist/components/AssetSelector.js +19 -4
  4. package/dist/components/AssetSelectorItem.js +2 -2
  5. package/dist/components/CodingAgentIcon.d.ts +4 -0
  6. package/dist/components/CodingAgentIcon.js +17 -0
  7. package/dist/components/ConfigureDefaultEditorModal.d.ts +1 -3
  8. package/dist/components/ConfigureDefaultEditorModal.js +67 -77
  9. package/dist/components/ConfigureLicenseModal.d.ts +1 -4
  10. package/dist/components/ConfigureLicenseModal.js +89 -81
  11. package/dist/components/ContextMenu.js +10 -8
  12. package/dist/components/EditorContexts.js +6 -5
  13. package/dist/components/ExpandedTracksProvider.js +10 -53
  14. package/dist/components/InspectorLocationCopy.js +8 -8
  15. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  16. package/dist/components/InspectorOpenInEditor.js +39 -49
  17. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -0
  18. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +22 -4
  19. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  20. package/dist/components/Menu/MenuSectionHeader.d.ts +4 -0
  21. package/dist/components/Menu/MenuSectionHeader.js +20 -0
  22. package/dist/components/Menu/SubMenu.js +13 -2
  23. package/dist/components/Menu/menu-tree-context.d.ts +3 -0
  24. package/dist/components/Menu/menu-tree-context.js +13 -0
  25. package/dist/components/NewComposition/ComboBox.d.ts +6 -1
  26. package/dist/components/NewComposition/MenuContent.js +27 -19
  27. package/dist/components/NewComposition/menu-typeahead.js +2 -2
  28. package/dist/components/Preview.js +29 -4
  29. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.d.ts +1 -0
  30. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +2 -2
  31. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +3 -3
  32. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  33. package/dist/components/RenderModal/ServerRenderModal.js +4 -0
  34. package/dist/components/RenderQueue/RenderQueueItem.js +8 -2
  35. package/dist/components/RenderQueue/actions.d.ts +4 -2
  36. package/dist/components/RenderQueue/actions.js +4 -2
  37. package/dist/components/RenderQueue/index.js +3 -4
  38. package/dist/components/RenderQueue/use-render-output-file-drag.d.ts +8 -0
  39. package/dist/components/RenderQueue/use-render-output-file-drag.js +121 -0
  40. package/dist/components/SegmentedControl.js +0 -1
  41. package/dist/components/SelectedOutlineElement.d.ts +14 -17
  42. package/dist/components/SelectedOutlineElement.js +112 -930
  43. package/dist/components/SelectedOutlineKeyboardControls.d.ts +7 -0
  44. package/dist/components/SelectedOutlineKeyboardControls.js +261 -0
  45. package/dist/components/SelectedOutlineOverlay.d.ts +6 -13
  46. package/dist/components/SelectedOutlineOverlay.js +349 -864
  47. package/dist/components/SelectedOutlinePolygon.d.ts +25 -0
  48. package/dist/components/SelectedOutlinePolygon.js +359 -0
  49. package/dist/components/SelectedOutlineRenderer.d.ts +18 -0
  50. package/dist/components/SelectedOutlineRenderer.js +208 -0
  51. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +16 -0
  52. package/dist/components/SelectedOutlineRotationCornerHandle.js +269 -0
  53. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +16 -0
  54. package/dist/components/SelectedOutlineScaleEdgeLine.js +211 -0
  55. package/dist/components/SelectedOutlineSnapIndicators.d.ts +9 -0
  56. package/dist/components/SelectedOutlineSnapIndicators.js +29 -0
  57. package/dist/components/SelectedOutlineTransformOriginHandle.d.ts +9 -0
  58. package/dist/components/SelectedOutlineTransformOriginHandle.js +286 -0
  59. package/dist/components/SelectedOutlineUvControls.d.ts +3 -9
  60. package/dist/components/SelectedOutlineUvControls.js +57 -12
  61. package/dist/components/SettingsContext.d.ts +15 -0
  62. package/dist/components/SettingsContext.js +116 -0
  63. package/dist/components/SettingsModal.js +10 -4
  64. package/dist/components/SettingsModalFooter.d.ts +1 -3
  65. package/dist/components/SettingsModalFooter.js +4 -6
  66. package/dist/components/ShowOutlinesProvider.js +2 -3
  67. package/dist/components/Timeline/EasingEditorModal.js +66 -22
  68. package/dist/components/Timeline/Timeline.js +22 -5
  69. package/dist/components/Timeline/TimelineDuplicateCount.d.ts +4 -0
  70. package/dist/components/Timeline/TimelineDuplicateCount.js +28 -0
  71. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +3 -23
  72. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +4 -2
  73. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +11 -1
  74. package/dist/components/Timeline/TimelineSequence.js +28 -25
  75. package/dist/components/Timeline/TimelineSequenceItem.js +49 -27
  76. package/dist/components/Timeline/TimelineTrack.js +2 -1
  77. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -3
  78. package/dist/components/Timeline/get-sequence-context-menu-items.js +58 -53
  79. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +36 -4
  80. package/dist/components/Timeline/{use-open-sequence-in-editor.d.ts → use-open-sequence-in-apps.d.ts} +4 -1
  81. package/dist/components/Timeline/{use-open-sequence-in-editor.js → use-open-sequence-in-apps.js} +20 -4
  82. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +4 -0
  83. package/dist/components/Timeline/use-timeline-expanded-tree.js +45 -1
  84. package/dist/components/get-open-in-menu-items.d.ts +12 -0
  85. package/dist/components/get-open-in-menu-items.js +83 -0
  86. package/dist/components/selected-outline-measurement.d.ts +2 -2
  87. package/dist/components/selected-outline-order.d.ts +12 -0
  88. package/dist/components/selected-outline-order.js +251 -0
  89. package/dist/components/selected-outline-types.d.ts +9 -10
  90. package/dist/components/svg-point-to-client-point.d.ts +2 -0
  91. package/dist/components/svg-point-to-client-point.js +10 -0
  92. package/dist/components/use-auto-save-config.d.ts +8 -0
  93. package/dist/components/use-auto-save-config.js +74 -0
  94. package/dist/components/use-default-editor-info.d.ts +1 -0
  95. package/dist/components/use-default-editor-info.js +10 -30
  96. package/dist/esm/{chunk-jefhcs5z.js → chunk-fgedsvhb.js} +1 -2
  97. package/dist/esm/{chunk-b49ec3nz.js → chunk-ptnd65a9.js} +10602 -9364
  98. package/dist/esm/internals.mjs +10601 -9363
  99. package/dist/esm/previewEntry.mjs +10462 -9224
  100. package/dist/esm/renderEntry.mjs +2 -2
  101. package/dist/helpers/are-sequence-node-path-infos-equal.d.ts +2 -0
  102. package/dist/helpers/are-sequence-node-path-infos-equal.js +27 -0
  103. package/dist/helpers/calculate-timeline.js +3 -3
  104. package/dist/helpers/client-id.js +8 -1
  105. package/dist/helpers/format-file-location.d.ts +1 -1
  106. package/dist/helpers/format-file-location.js +3 -3
  107. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  108. package/dist/helpers/open-in-editor.d.ts +1 -0
  109. package/dist/helpers/open-in-editor.js +5 -1
  110. package/dist/helpers/studio-runtime-config.js +3 -0
  111. package/dist/helpers/timeline-node-path-key.d.ts +2 -0
  112. package/dist/helpers/timeline-node-path-key.js +3 -1
  113. package/dist/helpers/use-asset-drag-events.d.ts +2 -1
  114. package/dist/helpers/use-asset-drag-events.js +14 -6
  115. package/dist/helpers/use-menu-structure.js +2 -2
  116. package/dist/helpers/use-runtime-values.d.ts +1 -3
  117. package/dist/state/timeline-sequence-hover.d.ts +9 -3
  118. package/dist/state/timeline-sequence-hover.js +63 -12
  119. package/package.json +12 -12
@@ -33,923 +33,40 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SelectedOutlineElement = exports.SelectedOutlineTransformOriginHandle = void 0;
36
+ exports.SelectedOutlineElement = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const remotion_1 = require("remotion");
40
- const no_react_1 = require("remotion/no-react");
41
40
  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
41
  const get_connected_compositions_1 = require("../helpers/get-connected-compositions");
45
42
  const get_sequence_double_click_action_1 = require("../helpers/get-sequence-double-click-action");
46
43
  const interactivity_enabled_1 = require("../helpers/interactivity-enabled");
47
44
  const open_in_editor_1 = require("../helpers/open-in-editor");
48
- const pointer_session_1 = require("../helpers/pointer-session");
49
- const editor_snapping_1 = require("../state/editor-snapping");
45
+ const timeline_node_path_key_1 = require("../helpers/timeline-node-path-key");
50
46
  const modals_1 = require("../state/modals");
47
+ const timeline_sequence_hover_1 = require("../state/timeline-sequence-hover");
51
48
  const call_api_1 = require("./call-api");
52
49
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
53
- const ContextMenu_1 = require("./ContextMenu");
54
- const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
55
- const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
56
50
  const InitialCompositionLoader_1 = require("./InitialCompositionLoader");
57
51
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
58
- const selected_outline_drag_1 = require("./selected-outline-drag");
59
- const selected_outline_measurement_1 = require("./selected-outline-measurement");
60
- const selected_outline_snap_1 = require("./selected-outline-snap");
61
52
  const selected_outline_types_1 = require("./selected-outline-types");
62
- const selected_outline_uv_1 = require("./selected-outline-uv");
63
53
  const SelectedOutlineCropControls_1 = require("./SelectedOutlineCropControls");
64
- const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
54
+ const SelectedOutlinePolygon_1 = require("./SelectedOutlinePolygon");
55
+ const SelectedOutlineRotationCornerHandle_1 = require("./SelectedOutlineRotationCornerHandle");
56
+ const SelectedOutlineScaleEdgeLine_1 = require("./SelectedOutlineScaleEdgeLine");
65
57
  const disable_sequence_interactivity_1 = require("./Timeline/disable-sequence-interactivity");
66
58
  const duplicate_selected_timeline_item_1 = require("./Timeline/duplicate-selected-timeline-item");
67
- const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
68
59
  const get_sequence_context_menu_items_1 = require("./Timeline/get-sequence-context-menu-items");
69
- const imperative_state_1 = require("./Timeline/imperative-state");
70
- const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
71
60
  const timeline_asset_link_1 = require("./Timeline/timeline-asset-link");
72
- const timeline_translate_utils_1 = require("./Timeline/timeline-translate-utils");
73
61
  const get_stack_1 = require("./Timeline/TimelineStack/get-stack");
74
- const transform_origin_utils_1 = require("./Timeline/transform-origin-utils");
62
+ const use_default_editor_info_1 = require("./use-default-editor-info");
75
63
  const use_select_asset_1 = require("./use-select-asset");
76
- const SelectedOutlineTransformOriginHandle = ({ outline, onDraggingChange, target }) => {
77
- var _a, _b;
78
- const { setDragOverrides, clearDragOverrides, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
79
- const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
80
- const transformOriginDrag = (_a = target === null || target === void 0 ? void 0 : target.transformOriginDrag) !== null && _a !== void 0 ? _a : null;
81
- const crop = target === null || target === void 0 ? void 0 : target.crop;
82
- const transformOriginPoints = (_b = outline.uncroppedPoints) !== null && _b !== void 0 ? _b : outline.points;
83
- const parsed = (0, react_1.useMemo)(() => transformOriginDrag === null
84
- ? null
85
- : (0, transform_origin_utils_1.parseTransformOrigin)(transformOriginDrag.originValue), [transformOriginDrag]);
86
- const uv = (0, react_1.useMemo)(() => {
87
- if (parsed === null || outline.dimensions === null) {
88
- return null;
89
- }
90
- return (0, transform_origin_utils_1.parsedTransformOriginToUv)({
91
- parsed,
92
- width: outline.dimensions.width,
93
- height: outline.dimensions.height,
94
- });
95
- }, [outline.dimensions, parsed]);
96
- const position = (0, react_1.useMemo)(() => (uv === null ? null : (0, selected_outline_uv_1.getUvHandlePosition)(transformOriginPoints, uv)), [transformOriginPoints, uv]);
97
- const onPointerDown = react_1.default.useCallback((event) => {
98
- if (event.button !== 0 ||
99
- transformOriginDrag === null ||
100
- parsed === null ||
101
- uv === null ||
102
- outline.dimensions === null) {
103
- return;
104
- }
105
- event.preventDefault();
106
- event.stopPropagation();
107
- const svg = event.currentTarget.ownerSVGElement;
108
- if (svg === null) {
109
- return;
110
- }
111
- const rotation = (0, selected_outline_drag_1.parseCssRotationToRadians)(transformOriginDrag.rotateValue);
112
- if (rotation === null) {
113
- return;
114
- }
115
- const { dimensions } = outline;
116
- if (dimensions === null) {
117
- return;
118
- }
119
- const [scaleX, scaleY] = no_react_1.NoReactInternals.parseScaleValue(transformOriginDrag.scaleValue);
120
- const startTranslate = (0, timeline_translate_utils_1.parseTranslate)(transformOriginDrag.translateValue);
121
- const svgRect = svg.getBoundingClientRect();
122
- let last = null;
123
- let currentPointerX = event.clientX;
124
- let currentPointerY = event.clientY;
125
- let axisLocked = event.shiftKey;
126
- onDraggingChange(true);
127
- (0, ForceSpecificCursor_1.forceSpecificCursor)('crosshair');
128
- const updateFromPointerPosition = () => {
129
- const point = {
130
- x: currentPointerX - svgRect.left,
131
- y: currentPointerY - svgRect.top,
132
- };
133
- const rawUv = (0, selected_outline_uv_1.getUvCoordinateForPoint)(transformOriginPoints, point);
134
- const lockedAxis = (0, selected_outline_drag_1.getSelectedOutlineTransformOriginLockedAxis)({
135
- axisLocked,
136
- dimensions,
137
- startUv: uv,
138
- uv: rawUv,
139
- });
140
- const axisLockedUv = (0, selected_outline_drag_1.applySelectedOutlineTransformOriginAxisLock)({
141
- lockedAxis,
142
- startUv: uv,
143
- uv: rawUv,
144
- });
145
- const snapPoint = lockedAxis === null
146
- ? point
147
- : (0, selected_outline_uv_1.getUvHandlePosition)(transformOriginPoints, axisLockedUv);
148
- const snappedUv = editorSnapping
149
- ? (0, selected_outline_drag_1.snapSelectedOutlineTransformOriginUv)({
150
- crop: crop !== null && crop !== void 0 ? crop : null,
151
- point: snapPoint,
152
- points: transformOriginPoints,
153
- thresholdPx: null,
154
- uv: axisLockedUv,
155
- })
156
- : axisLockedUv;
157
- const nextUv = (0, selected_outline_drag_1.applySelectedOutlineTransformOriginAxisLock)({
158
- lockedAxis,
159
- startUv: uv,
160
- uv: snappedUv,
161
- });
162
- const deltaOrigin = [
163
- (nextUv[0] - uv[0]) * dimensions.width,
164
- (nextUv[1] - uv[1]) * dimensions.height,
165
- ];
166
- const [nextTranslateX, nextTranslateY] = (0, selected_outline_drag_1.compensateTranslateForTransformOrigin)({
167
- startTranslate,
168
- deltaOrigin,
169
- rotate: rotation,
170
- scale: [scaleX, scaleY],
171
- });
172
- const origin = (0, transform_origin_utils_1.serializeTransformOrigin)({
173
- uv: nextUv,
174
- z: parsed.z,
175
- });
176
- const translate = (0, timeline_translate_utils_1.serializeTranslate)(nextTranslateX, nextTranslateY);
177
- last = { uv: nextUv, origin, translate };
178
- setDragOverrides(transformOriginDrag.nodePath, selected_outline_types_1.transformOriginFieldKey, transformOriginDrag.originPropStatus.status === 'keyframed'
179
- ? remotion_1.Internals.makeKeyframedDragOverride({
180
- status: transformOriginDrag.originPropStatus,
181
- frame: transformOriginDrag.sourceFrame,
182
- value: origin,
183
- })
184
- : remotion_1.Internals.makeStaticDragOverride(origin));
185
- setDragOverrides(transformOriginDrag.nodePath, selected_outline_types_1.translateFieldKey, transformOriginDrag.translatePropStatus.status === 'keyframed'
186
- ? transformOriginDrag.originPropStatus.status === 'keyframed'
187
- ? remotion_1.Internals.makeKeyframedDragOverride({
188
- status: transformOriginDrag.translatePropStatus,
189
- frame: transformOriginDrag.sourceFrame,
190
- value: translate,
191
- })
192
- : {
193
- type: 'keyframed',
194
- status: {
195
- ...transformOriginDrag.translatePropStatus,
196
- keyframes: transformOriginDrag.translatePropStatus.keyframes.map((keyframe) => {
197
- const keyframeTranslate = (0, timeline_translate_utils_1.parseTranslate)(String(keyframe.value));
198
- return {
199
- ...keyframe,
200
- value: (0, timeline_translate_utils_1.serializeTranslate)(keyframeTranslate[0] +
201
- nextTranslateX -
202
- startTranslate[0], keyframeTranslate[1] +
203
- nextTranslateY -
204
- startTranslate[1]),
205
- };
206
- }),
207
- },
208
- }
209
- : remotion_1.Internals.makeStaticDragOverride(translate));
210
- };
211
- updateFromPointerPosition();
212
- const onPointerMove = (moveEvent) => {
213
- moveEvent.preventDefault();
214
- currentPointerX = moveEvent.clientX;
215
- currentPointerY = moveEvent.clientY;
216
- axisLocked = moveEvent.shiftKey;
217
- updateFromPointerPosition();
218
- };
219
- const onKeyChange = (keyEvent) => {
220
- if (keyEvent.key !== 'Shift') {
221
- return;
222
- }
223
- const nextAxisLocked = keyEvent.type === 'keydown';
224
- if (nextAxisLocked === axisLocked) {
225
- return;
226
- }
227
- axisLocked = nextAxisLocked;
228
- updateFromPointerPosition();
229
- };
230
- const onPointerUp = () => {
231
- window.removeEventListener('keydown', onKeyChange);
232
- window.removeEventListener('keyup', onKeyChange);
233
- (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
234
- onDraggingChange(false);
235
- if (last === null || (0, selected_outline_drag_1.uvsEqual)(last.uv, uv)) {
236
- clearDragOverrides(transformOriginDrag.nodePath);
237
- return;
238
- }
239
- const { staticChanges, keyframedChanges } = (0, selected_outline_drag_1.getSelectedOutlineTransformOriginDragChanges)({
240
- target: transformOriginDrag,
241
- startTranslate,
242
- origin: last.origin,
243
- translate: last.translate,
244
- });
245
- if (staticChanges.length === 0 && keyframedChanges.length === 0) {
246
- clearDragOverrides(transformOriginDrag.nodePath);
247
- return;
248
- }
249
- const promise = staticChanges.length === 0
250
- ? (0, call_add_keyframe_1.callAddKeyframes)({
251
- sequenceKeyframes: keyframedChanges,
252
- effectKeyframes: [],
253
- setPropStatuses,
254
- clientId: transformOriginDrag.clientId,
255
- })
256
- : (0, save_sequence_prop_1.saveSequenceProps)({
257
- changes: staticChanges,
258
- addedKeyframes: keyframedChanges,
259
- movedKeyframes: null,
260
- setPropStatuses,
261
- clientId: transformOriginDrag.clientId,
262
- undoLabel: 'Move transform origin',
263
- redoLabel: 'Move transform origin back',
264
- });
265
- promise
266
- .catch((err) => {
267
- (0, NotificationCenter_1.showNotification)(`Could not save transform origin: ${err instanceof Error ? err.message : String(err)}`, 4000);
268
- })
269
- .finally(() => {
270
- clearDragOverrides(transformOriginDrag.nodePath);
271
- });
272
- };
273
- (0, pointer_session_1.startPointerSession)({
274
- event,
275
- target: event.currentTarget,
276
- onMove: onPointerMove,
277
- onEnd: onPointerUp,
278
- });
279
- window.addEventListener('keydown', onKeyChange);
280
- window.addEventListener('keyup', onKeyChange);
281
- }, [
282
- clearDragOverrides,
283
- crop,
284
- editorSnapping,
285
- onDraggingChange,
286
- outline,
287
- parsed,
288
- setDragOverrides,
289
- setPropStatuses,
290
- transformOriginDrag,
291
- transformOriginPoints,
292
- uv,
293
- ]);
294
- if (transformOriginDrag === null ||
295
- parsed === null ||
296
- uv === null ||
297
- position === null) {
298
- return null;
299
- }
300
- return (jsx_runtime_1.jsxs("g", { pointerEvents: "all", cursor: "crosshair", onPointerDown: onPointerDown, "aria-hidden": "true", style: {
301
- filter: colors_1.SELECTED_OUTLINE_DROP_SHADOW,
302
- }, children: [
303
- 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" })
304
- ] }));
305
- };
306
- exports.SelectedOutlineTransformOriginHandle = SelectedOutlineTransformOriginHandle;
307
- const SelectedOutlinePolygon = ({ allDragTargets, allDragOutlines, dragging, hovered, onContextMenuOpen, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, snapTargets, target, }) => {
308
- var _a, _b, _c, _d;
309
- const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
310
- const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
311
- const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
312
- const polygonRef = (0, react_1.useRef)(null);
313
- const points = (0, react_1.useMemo)(() => outline.points.map(selected_outline_measurement_1.pointToString).join(' '), [outline.points]);
314
- const drag = (_a = target === null || target === void 0 ? void 0 : target.drag) !== null && _a !== void 0 ? _a : null;
315
- const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
316
- const containsSelection = (_c = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _c !== void 0 ? _c : false;
317
- const effectDrop = (_d = target === null || target === void 0 ? void 0 : target.effectDrop) !== null && _d !== void 0 ? _d : null;
318
- const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
319
- const visible = containsSelection || hovered;
320
- const onPointerDown = react_1.default.useCallback((event) => {
321
- if (event.button !== 0 || target === undefined) {
322
- return;
323
- }
324
- event.preventDefault();
325
- event.stopPropagation();
326
- const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
327
- const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
328
- if (shouldUpdateSelection) {
329
- onSelect(target.selection, interaction);
330
- }
331
- if (drag === null || interaction.shiftKey || interaction.toggleKey) {
332
- return;
333
- }
334
- if ((0, focus_inspector_field_1.commitPendingInspectorFields)()) {
335
- return;
336
- }
337
- const startPointerX = event.clientX;
338
- const startPointerY = event.clientY;
339
- const dragStates = (0, selected_outline_drag_1.getSelectedOutlineDragStates)({
340
- dragTargets: selected ? allDragTargets : [drag],
341
- getDragOverrides,
342
- timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
343
- });
344
- let lastValues = new Map();
345
- let currentPointerX = startPointerX;
346
- let currentPointerY = startPointerY;
347
- let axisLocked = false;
348
- let dragStarted = false;
349
- let snappingDisabled = event.metaKey || event.ctrlKey;
350
- const updateDragOverrides = () => {
351
- const screenDeltaX = currentPointerX - startPointerX;
352
- const screenDeltaY = currentPointerY - startPointerY;
353
- if (!dragStarted) {
354
- if (!(0, selected_outline_drag_1.isSelectedOutlineDragPastThreshold)({
355
- deltaX: screenDeltaX,
356
- deltaY: screenDeltaY,
357
- })) {
358
- return;
359
- }
360
- dragStarted = true;
361
- onDraggingChange(true);
362
- (0, ForceSpecificCursor_1.forceSpecificCursor)('default');
363
- }
364
- const axisLockedDirection = axisLocked
365
- ? Math.abs(screenDeltaX) >= Math.abs(screenDeltaY)
366
- ? 'horizontal'
367
- : 'vertical'
368
- : null;
369
- const dragDelta = (0, selected_outline_drag_1.applySelectedOutlineDragAxisLock)({
370
- deltaX: screenDeltaX / scale,
371
- deltaY: screenDeltaY / scale,
372
- axisLocked,
373
- });
374
- let { deltaX, deltaY } = dragDelta;
375
- if (editorSnapping && !snappingDisabled) {
376
- const snapResult = (0, selected_outline_snap_1.findSelectedOutlineSnap)({
377
- allowX: axisLockedDirection !== 'vertical',
378
- allowY: axisLockedDirection !== 'horizontal',
379
- deltaX,
380
- deltaY,
381
- outlines: selected ? allDragOutlines : [outline],
382
- scale,
383
- targets: snapTargets,
384
- });
385
- if (snapResult.snapOffsetX !== null) {
386
- deltaX += snapResult.snapOffsetX;
387
- }
388
- if (snapResult.snapOffsetY !== null) {
389
- deltaY += snapResult.snapOffsetY;
390
- }
391
- onSnapPointsChange(snapResult.activeSnapPoints);
392
- }
393
- else {
394
- onSnapPointsChange([]);
395
- }
396
- lastValues = (0, selected_outline_drag_1.getSelectedOutlineDragValues)({
397
- dragStates,
398
- deltaX,
399
- deltaY,
400
- });
401
- for (const dragState of dragStates) {
402
- const value = lastValues.get(dragState.key);
403
- if (value === undefined) {
404
- throw new Error('Expected drag value to be available');
405
- }
406
- if (dragState.target.propStatus.status === 'keyframed') {
407
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
408
- status: dragState.target.propStatus,
409
- frame: dragState.sourceFrame,
410
- value,
411
- }));
412
- }
413
- else {
414
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
415
- }
416
- }
417
- };
418
- const onPointerMove = (moveEvent) => {
419
- moveEvent.preventDefault();
420
- currentPointerX = moveEvent.clientX;
421
- currentPointerY = moveEvent.clientY;
422
- axisLocked = moveEvent.shiftKey;
423
- snappingDisabled = moveEvent.metaKey || moveEvent.ctrlKey;
424
- updateDragOverrides();
425
- };
426
- const onKeyChange = (keyEvent) => {
427
- if (keyEvent.key !== 'Shift') {
428
- return;
429
- }
430
- const nextAxisLocked = keyEvent.type === 'keydown';
431
- if (nextAxisLocked === axisLocked) {
432
- return;
433
- }
434
- axisLocked = nextAxisLocked;
435
- updateDragOverrides();
436
- };
437
- const onPointerUp = () => {
438
- window.removeEventListener('keydown', onKeyChange);
439
- window.removeEventListener('keyup', onKeyChange);
440
- if (dragStarted) {
441
- (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
442
- onDraggingChange(false);
443
- }
444
- const changes = (0, selected_outline_drag_1.getSelectedOutlineDragChanges)({
445
- dragStates,
446
- lastValues,
447
- });
448
- if (changes.length === 0) {
449
- (0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
450
- return;
451
- }
452
- const staticChanges = changes.filter((change) => change.type === 'static');
453
- const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
454
- Promise.all([
455
- staticChanges.length > 0
456
- ? (0, save_sequence_prop_1.saveSequenceProps)({
457
- changes: staticChanges,
458
- addedKeyframes: null,
459
- movedKeyframes: null,
460
- setPropStatuses,
461
- clientId: drag.clientId,
462
- undoLabel: changes.length > 1
463
- ? 'Move selected sequences'
464
- : 'Move sequence',
465
- redoLabel: changes.length > 1
466
- ? 'Move selected sequences back'
467
- : 'Move sequence back',
468
- })
469
- : Promise.resolve(),
470
- (0, call_add_keyframe_1.callAddKeyframes)({
471
- sequenceKeyframes: keyframedChanges,
472
- effectKeyframes: [],
473
- setPropStatuses,
474
- clientId: drag.clientId,
475
- }),
476
- ])
477
- .catch((err) => {
478
- (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
479
- })
480
- .finally(() => {
481
- (0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
482
- });
483
- };
484
- (0, pointer_session_1.startPointerSession)({
485
- event,
486
- target: event.currentTarget,
487
- onMove: onPointerMove,
488
- onEnd: onPointerUp,
489
- });
490
- window.addEventListener('keydown', onKeyChange);
491
- window.addEventListener('keyup', onKeyChange);
492
- }, [
493
- allDragTargets,
494
- allDragOutlines,
495
- clearDragOverrides,
496
- drag,
497
- editorSnapping,
498
- getDragOverrides,
499
- onDraggingChange,
500
- onSelect,
501
- onSnapPointsChange,
502
- outline,
503
- scale,
504
- selected,
505
- setPropStatuses,
506
- setDragOverrides,
507
- snapTargets,
508
- target,
509
- ]);
510
- const onDoubleClick = react_1.default.useCallback((event) => {
511
- if (target === undefined) {
512
- return;
513
- }
514
- if (!onDoubleClickTarget(target, event.button)) {
515
- return;
516
- }
517
- event.preventDefault();
518
- event.stopPropagation();
519
- }, [onDoubleClickTarget, target]);
520
- const onEffectDragOver = react_1.default.useCallback((event) => {
521
- if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
522
- return;
523
- }
524
- event.preventDefault();
525
- event.stopPropagation();
526
- event.dataTransfer.dropEffect = 'copy';
527
- setEffectDropHovered(true);
528
- }, [effectDrop]);
529
- const onEffectDragLeave = react_1.default.useCallback((event) => {
530
- if (event.currentTarget.contains(event.relatedTarget)) {
531
- return;
532
- }
533
- setEffectDropHovered(false);
534
- }, []);
535
- const onEffectDrop = react_1.default.useCallback(async (event) => {
536
- if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
537
- return;
538
- }
539
- const dragData = (0, effect_drag_and_drop_1.getEffectDragData)(event.dataTransfer);
540
- if (!dragData) {
541
- if ((0, effect_drag_and_drop_1.hasExplicitEffectDragType)(event.dataTransfer)) {
542
- event.preventDefault();
543
- event.stopPropagation();
544
- setEffectDropHovered(false);
545
- (0, NotificationCenter_1.showNotification)('Could not read effect drag data', 3000);
546
- }
547
- return;
548
- }
549
- event.preventDefault();
550
- event.stopPropagation();
551
- setEffectDropHovered(false);
552
- await (0, effect_drag_and_drop_1.addEffectFromDragData)({
553
- dragData,
554
- fileName: effectDrop.fileName,
555
- nodePath: effectDrop.nodePath,
556
- clientId: effectDrop.clientId,
557
- });
558
- }, [effectDrop]);
559
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
560
- jsx_runtime_1.jsx("polygon", { ref: polygonRef, points: points, fill: effectDropHovered ? colors_1.TIMELINE_DROP_BLUE_ALPHA_12 : colors_1.TRANSPARENT, stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: target === undefined ? undefined : 'all', onPointerEnter: () => {
561
- if (!dragging) {
562
- onHoverChange(outline.key);
563
- }
564
- }, onPointerLeave: () => {
565
- if (!dragging) {
566
- onHoverChange(null);
567
- }
568
- }, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onDragOver: effectDrop === null ? undefined : onEffectDragOver, onDragLeave: effectDrop === null ? undefined : onEffectDragLeave, onDrop: effectDrop === null ? undefined : onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, getItems: onContextMenuOpen })
569
- ] }));
570
- };
571
- const SelectedOutlineScaleEdgeLine = ({ allScaleDragTargets, dragging, edge, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
572
- var _a, _b;
573
- const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
574
- const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
575
- const scaleDrag = (_a = target === null || target === void 0 ? void 0 : target.scaleDrag) !== null && _a !== void 0 ? _a : null;
576
- const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
577
- const lineRef = (0, react_1.useRef)(null);
578
- const edgeInfo = (0, react_1.useMemo)(() => (0, selected_outline_drag_1.getSelectedOutlineScaleEdgeInfo)(outline.points, edge), [edge, outline.points]);
579
- const onPointerDown = react_1.default.useCallback((event) => {
580
- if (event.button !== 0 || scaleDrag === null || edgeInfo === null) {
581
- return;
582
- }
583
- event.preventDefault();
584
- event.stopPropagation();
585
- const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
586
- const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
587
- if (shouldUpdateSelection && target !== undefined) {
588
- onSelect(target.selection, interaction);
589
- }
590
- if (interaction.shiftKey || interaction.toggleKey) {
591
- return;
592
- }
593
- if ((0, focus_inspector_field_1.commitPendingInspectorFields)()) {
594
- return;
595
- }
596
- const startPointer = { x: event.clientX, y: event.clientY };
597
- const dragStates = (0, selected_outline_drag_1.getSelectedOutlineScaleDragStates)({
598
- dragTargets: selected ? allScaleDragTargets : [scaleDrag],
599
- getDragOverrides,
600
- timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
601
- });
602
- let lastValues = new Map();
603
- let dragStarted = false;
604
- const onPointerMove = (moveEvent) => {
605
- moveEvent.preventDefault();
606
- const delta = {
607
- x: moveEvent.clientX - startPointer.x,
608
- y: moveEvent.clientY - startPointer.y,
609
- };
610
- if (!dragStarted) {
611
- if (!(0, selected_outline_drag_1.isSelectedOutlineDragPastThreshold)({
612
- deltaX: delta.x,
613
- deltaY: delta.y,
614
- })) {
615
- return;
616
- }
617
- dragStarted = true;
618
- onDraggingChange(true);
619
- (0, ForceSpecificCursor_1.forceSpecificCursor)(edgeInfo.cursor);
620
- }
621
- const projectedDelta = (0, selected_outline_measurement_1.dot)(delta, edgeInfo.normal);
622
- const scaleFactor = Math.max(0.001, 1 + projectedDelta / edgeInfo.extent);
623
- lastValues = (0, selected_outline_drag_1.getSelectedOutlineScaleDragValues)({
624
- dragStates,
625
- axis: edgeInfo.axis,
626
- scaleFactor,
627
- });
628
- for (const dragState of dragStates) {
629
- const value = lastValues.get(dragState.key);
630
- if (value === undefined) {
631
- throw new Error('Expected scale drag value to be available');
632
- }
633
- if (dragState.target.propStatus.status === 'keyframed') {
634
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.scaleFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
635
- status: dragState.target.propStatus,
636
- frame: dragState.sourceFrame,
637
- value,
638
- }));
639
- }
640
- else {
641
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.scaleFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
642
- }
643
- }
644
- };
645
- const onPointerUp = () => {
646
- if (dragStarted) {
647
- (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
648
- onDraggingChange(false);
649
- }
650
- const changes = (0, selected_outline_drag_1.getSelectedOutlineScaleDragChanges)({
651
- dragStates,
652
- lastValues,
653
- });
654
- if (changes.length === 0) {
655
- (0, selected_outline_drag_1.clearSelectedOutlineScaleDragOverrides)({
656
- clearDragOverrides,
657
- dragStates,
658
- });
659
- return;
660
- }
661
- const staticChanges = changes.filter((change) => change.type === 'static');
662
- const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
663
- Promise.all([
664
- staticChanges.length > 0
665
- ? (0, save_sequence_prop_1.saveSequenceProps)({
666
- changes: staticChanges,
667
- addedKeyframes: null,
668
- movedKeyframes: null,
669
- setPropStatuses,
670
- clientId: scaleDrag.clientId,
671
- undoLabel: changes.length > 1
672
- ? 'Scale selected sequences'
673
- : 'Scale sequence',
674
- redoLabel: changes.length > 1
675
- ? 'Scale selected sequences back'
676
- : 'Scale sequence back',
677
- })
678
- : Promise.resolve(),
679
- (0, call_add_keyframe_1.callAddKeyframes)({
680
- sequenceKeyframes: keyframedChanges,
681
- effectKeyframes: [],
682
- setPropStatuses,
683
- clientId: scaleDrag.clientId,
684
- }),
685
- ])
686
- .catch((err) => {
687
- (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
688
- })
689
- .finally(() => {
690
- (0, selected_outline_drag_1.clearSelectedOutlineScaleDragOverrides)({
691
- clearDragOverrides,
692
- dragStates,
693
- });
694
- });
695
- };
696
- (0, pointer_session_1.startPointerSession)({
697
- event,
698
- target: event.currentTarget,
699
- onMove: onPointerMove,
700
- onEnd: onPointerUp,
701
- });
702
- }, [
703
- allScaleDragTargets,
704
- clearDragOverrides,
705
- edgeInfo,
706
- getDragOverrides,
707
- onDraggingChange,
708
- onSelect,
709
- scaleDrag,
710
- selected,
711
- setPropStatuses,
712
- setDragOverrides,
713
- target,
714
- ]);
715
- if (scaleDrag === null || edgeInfo === null) {
716
- return null;
717
- }
718
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
719
- jsx_runtime_1.jsx("line", { ref: lineRef, x1: edgeInfo.start.x, y1: edgeInfo.start.y, x2: edgeInfo.end.x, y2: edgeInfo.end.y, stroke: colors_1.TRANSPARENT, strokeWidth: 12, vectorEffect: "non-scaling-stroke", pointerEvents: "stroke", cursor: edgeInfo.cursor, onPointerEnter: () => {
720
- if (!dragging) {
721
- onHoverChange(outline.key);
722
- }
723
- }, onPointerLeave: () => {
724
- if (!dragging) {
725
- onHoverChange(null);
726
- }
727
- }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: lineRef, getItems: onContextMenuOpen })
728
- ] }));
729
- };
730
- const svgPointToClientPoint = (point, rect) => {
731
- return {
732
- x: point.x + rect.left,
733
- y: point.y + rect.top,
734
- };
735
- };
736
- const SelectedOutlineRotationCornerHandle = ({ allRotationDragTargets, corner, dragging, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
737
- var _a, _b;
738
- const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
739
- const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
740
- const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
741
- const rotationDrag = (_a = target === null || target === void 0 ? void 0 : target.rotationDrag) !== null && _a !== void 0 ? _a : null;
742
- const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
743
- const circleRef = (0, react_1.useRef)(null);
744
- const cornerInfo = (0, react_1.useMemo)(() => (0, selected_outline_measurement_1.getSelectedOutlineRotationCornerInfo)(outline.points, corner), [corner, outline.points]);
745
- const onPointerDown = react_1.default.useCallback((event) => {
746
- var _a;
747
- if (event.button !== 0 || rotationDrag === null) {
748
- return;
749
- }
750
- event.preventDefault();
751
- event.stopPropagation();
752
- const svg = event.currentTarget.ownerSVGElement;
753
- if (svg === null) {
754
- return;
755
- }
756
- const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
757
- const shouldUpdateSelection = !selected || interaction.toggleKey;
758
- if (shouldUpdateSelection && target !== undefined) {
759
- onSelect(target.selection, {
760
- shiftKey: false,
761
- toggleKey: interaction.toggleKey,
762
- });
763
- }
764
- if (interaction.toggleKey) {
765
- return;
766
- }
767
- if ((0, focus_inspector_field_1.commitPendingInspectorFields)()) {
768
- return;
769
- }
770
- const startPointer = { x: event.clientX, y: event.clientY };
771
- const svgRect = svg.getBoundingClientRect();
772
- const center = svgPointToClientPoint((0, selected_outline_measurement_1.getSelectedOutlineRotationPivot)({
773
- dimensions: outline.dimensions,
774
- points: (_a = outline.uncroppedPoints) !== null && _a !== void 0 ? _a : outline.points,
775
- transformOriginValue: rotationDrag.transformOriginValue,
776
- }), svgRect);
777
- const dragStates = (0, selected_outline_drag_1.getSelectedOutlineRotationDragStates)({
778
- dragTargets: selected ? allRotationDragTargets : [rotationDrag],
779
- getDragOverrides,
780
- timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
781
- });
782
- let previousAngle = (0, selected_outline_measurement_1.getAngleDegrees)(center, {
783
- x: event.clientX,
784
- y: event.clientY,
785
- });
786
- let accumulatedDelta = 0;
787
- let rotationLocked = event.shiftKey;
788
- let lastValues = new Map();
789
- let dragStarted = false;
790
- const updateRotationDragOverrides = () => {
791
- const rotationDeltaDegrees = rotationLocked && editorSnapping
792
- ? (0, selected_outline_drag_1.snapSelectedOutlineRotationDeltaDegrees)({
793
- dragStates,
794
- rotationDeltaDegrees: accumulatedDelta,
795
- })
796
- : accumulatedDelta;
797
- lastValues = (0, selected_outline_drag_1.getSelectedOutlineRotationDragValues)({
798
- dragStates,
799
- rotationDeltaDegrees,
800
- });
801
- (0, ForceSpecificCursor_1.forceSpecificCursor)((0, selected_outline_measurement_1.getRotationCursor)(cornerInfo.cursorDegrees + rotationDeltaDegrees));
802
- for (const dragState of dragStates) {
803
- const value = lastValues.get(dragState.key);
804
- if (value === undefined) {
805
- throw new Error('Expected rotation drag value to be available');
806
- }
807
- if (dragState.target.propStatus.status === 'keyframed') {
808
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.rotateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
809
- status: dragState.target.propStatus,
810
- frame: dragState.sourceFrame,
811
- value,
812
- }));
813
- }
814
- else {
815
- setDragOverrides(dragState.target.nodePath, selected_outline_types_1.rotateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
816
- }
817
- }
818
- };
819
- const onPointerMove = (moveEvent) => {
820
- moveEvent.preventDefault();
821
- const screenDeltaX = moveEvent.clientX - startPointer.x;
822
- const screenDeltaY = moveEvent.clientY - startPointer.y;
823
- if (!dragStarted) {
824
- if (!(0, selected_outline_drag_1.isSelectedOutlineDragPastThreshold)({
825
- deltaX: screenDeltaX,
826
- deltaY: screenDeltaY,
827
- })) {
828
- return;
829
- }
830
- dragStarted = true;
831
- onDraggingChange(true);
832
- }
833
- const nextAngle = (0, selected_outline_measurement_1.getAngleDegrees)(center, {
834
- x: moveEvent.clientX,
835
- y: moveEvent.clientY,
836
- });
837
- accumulatedDelta += (0, selected_outline_measurement_1.getSelectedOutlineRotationDeltaDegrees)({
838
- from: previousAngle,
839
- to: nextAngle,
840
- });
841
- previousAngle = nextAngle;
842
- rotationLocked = moveEvent.shiftKey;
843
- updateRotationDragOverrides();
844
- };
845
- const onKeyChange = (keyEvent) => {
846
- if (keyEvent.key !== 'Shift') {
847
- return;
848
- }
849
- const nextRotationLocked = keyEvent.type === 'keydown';
850
- if (nextRotationLocked === rotationLocked) {
851
- return;
852
- }
853
- rotationLocked = nextRotationLocked;
854
- if (dragStarted) {
855
- updateRotationDragOverrides();
856
- }
857
- };
858
- const onPointerUp = () => {
859
- window.removeEventListener('keydown', onKeyChange);
860
- window.removeEventListener('keyup', onKeyChange);
861
- if (dragStarted) {
862
- (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
863
- onDraggingChange(false);
864
- }
865
- const changes = (0, selected_outline_drag_1.getSelectedOutlineRotationDragChanges)({
866
- dragStates,
867
- lastValues,
868
- });
869
- if (changes.length === 0) {
870
- (0, selected_outline_drag_1.clearSelectedOutlineRotationDragOverrides)({
871
- clearDragOverrides,
872
- dragStates,
873
- });
874
- return;
875
- }
876
- const staticChanges = changes.filter((change) => change.type === 'static');
877
- const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
878
- Promise.all([
879
- staticChanges.length > 0
880
- ? (0, save_sequence_prop_1.saveSequenceProps)({
881
- changes: staticChanges,
882
- addedKeyframes: null,
883
- movedKeyframes: null,
884
- setPropStatuses,
885
- clientId: rotationDrag.clientId,
886
- undoLabel: changes.length > 1
887
- ? 'Rotate selected sequences'
888
- : 'Rotate sequence',
889
- redoLabel: changes.length > 1
890
- ? 'Rotate selected sequences back'
891
- : 'Rotate sequence back',
892
- })
893
- : Promise.resolve(),
894
- (0, call_add_keyframe_1.callAddKeyframes)({
895
- sequenceKeyframes: keyframedChanges,
896
- effectKeyframes: [],
897
- setPropStatuses,
898
- clientId: rotationDrag.clientId,
899
- }),
900
- ])
901
- .catch((err) => {
902
- (0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
903
- })
904
- .finally(() => {
905
- (0, selected_outline_drag_1.clearSelectedOutlineRotationDragOverrides)({
906
- clearDragOverrides,
907
- dragStates,
908
- });
909
- });
910
- };
911
- (0, pointer_session_1.startPointerSession)({
912
- event,
913
- target: event.currentTarget,
914
- onMove: onPointerMove,
915
- onEnd: onPointerUp,
916
- });
917
- window.addEventListener('keydown', onKeyChange);
918
- window.addEventListener('keyup', onKeyChange);
919
- }, [
920
- allRotationDragTargets,
921
- clearDragOverrides,
922
- cornerInfo,
923
- editorSnapping,
924
- getDragOverrides,
925
- onDraggingChange,
926
- outline.dimensions,
927
- outline.points,
928
- outline.uncroppedPoints,
929
- onSelect,
930
- rotationDrag,
931
- selected,
932
- setPropStatuses,
933
- setDragOverrides,
934
- target,
935
- ]);
936
- if (rotationDrag === null) {
937
- return null;
938
- }
939
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
940
- jsx_runtime_1.jsx("circle", { ref: circleRef, cx: cornerInfo.point.x, cy: cornerInfo.point.y, r: 12, fill: colors_1.TRANSPARENT, stroke: colors_1.TRANSPARENT, vectorEffect: "non-scaling-stroke", pointerEvents: "all", cursor: cornerInfo.cursor, onPointerEnter: () => {
941
- if (!dragging) {
942
- onHoverChange(outline.key);
943
- }
944
- }, onPointerLeave: () => {
945
- if (!dragging) {
946
- onHoverChange(null);
947
- }
948
- }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: circleRef, getItems: onContextMenuOpen })
949
- ] }));
950
- };
951
- const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDragTargets, allScaleDragTargets, dragging, hovered, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, scale, snapTargets, target, }) => {
64
+ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getAllRotationDragTargets, getAllScaleDragTargets, getLatestTargetByKey, layoutTarget, outline, onDraggingChange, onSnapPointsChange, onSelect, scale, }) => {
65
+ var _a;
952
66
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
67
+ const canConfigureApps = (0, use_default_editor_info_1.canUseEditorPicker)(previewServerState.type === 'connected');
68
+ const editorInfo = (0, use_default_editor_info_1.useDefaultEditorInfo)(canConfigureApps);
69
+ const codingAgentInfo = (0, use_default_editor_info_1.useDefaultCodingAgentInfo)(canConfigureApps);
953
70
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
954
71
  const updateResolvedStackTrace = (0, react_1.useContext)(remotion_1.Internals.SequenceStackTracesUpdateContext);
955
72
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
@@ -957,6 +74,42 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
957
74
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
958
75
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
959
76
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
77
+ const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
78
+ const targetRef = (0, react_1.useRef)(layoutTarget);
79
+ (0, react_1.useLayoutEffect)(() => {
80
+ targetRef.current = layoutTarget;
81
+ }, [layoutTarget]);
82
+ const getTarget = react_1.default.useCallback(() => {
83
+ const currentTarget = targetRef.current;
84
+ if (currentTarget === undefined) {
85
+ return undefined;
86
+ }
87
+ return getLatestTargetByKey(currentTarget.key);
88
+ }, [getLatestTargetByKey]);
89
+ const getLayoutTarget = react_1.default.useCallback(() => targetRef.current, []);
90
+ const hoveredNodePathKey = (0, react_1.useMemo)(() => layoutTarget === undefined
91
+ ? null
92
+ : (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(layoutTarget.nodePathInfo.sequenceSubscriptionKey), [layoutTarget]);
93
+ const hovered = (0, timeline_sequence_hover_1.useIsTimelineSequenceHovered)(hoveredNodePathKey);
94
+ const controlTarget = layoutTarget !== undefined && (layoutTarget.containsSelection || hovered)
95
+ ? getLatestTargetByKey(layoutTarget.key)
96
+ : undefined;
97
+ const onHoverChange = react_1.default.useCallback((key) => {
98
+ setHoveredSequence((currentHover) => {
99
+ if (key !== null) {
100
+ const hoverTarget = targetRef.current;
101
+ if (hoverTarget === undefined || hoverTarget.key !== key) {
102
+ return currentHover;
103
+ }
104
+ return {
105
+ key,
106
+ nodePathKey: (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(hoverTarget.nodePathInfo.sequenceSubscriptionKey),
107
+ source: 'canvas',
108
+ };
109
+ }
110
+ return (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover;
111
+ });
112
+ }, [setHoveredSequence]);
960
113
  const resolveOriginalLocation = react_1.default.useCallback(async (resolveTarget) => {
961
114
  const stack = resolveTarget.sequence.getStack();
962
115
  if (!stack) {
@@ -1008,52 +161,65 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1008
161
  selectComposition,
1009
162
  ]);
1010
163
  const onContextMenuOpen = react_1.default.useCallback(async () => {
1011
- if (target === undefined) {
164
+ const contextMenuTarget = getTarget();
165
+ if (contextMenuTarget === undefined) {
1012
166
  return false;
1013
167
  }
1014
- if (!target.selected) {
1015
- onSelect(target.selection, { shiftKey: false, toggleKey: false });
168
+ if (!contextMenuTarget.selected) {
169
+ onSelect(contextMenuTarget.selection, {
170
+ shiftKey: false,
171
+ toggleKey: false,
172
+ });
1016
173
  }
1017
- const originalLocation = await resolveOriginalLocation(target);
1018
- const fileLocation = (0, format_file_location_1.formatFileLocation)({
1019
- location: originalLocation,
1020
- root: window.remotion_cwd,
1021
- });
1022
- const nodePath = target.nodePathInfo.sequenceSubscriptionKey;
1023
- const mediaSrc = target.sequence.type === 'audio' ||
1024
- target.sequence.type === 'video' ||
1025
- target.sequence.type === 'image'
1026
- ? target.sequence.src
174
+ const originalLocation = await resolveOriginalLocation(contextMenuTarget);
175
+ const nodePath = contextMenuTarget.nodePathInfo.sequenceSubscriptionKey;
176
+ const mediaSrc = contextMenuTarget.sequence.type === 'audio' ||
177
+ contextMenuTarget.sequence.type === 'video' ||
178
+ contextMenuTarget.sequence.type === 'image'
179
+ ? contextMenuTarget.sequence.src
1027
180
  : null;
1028
181
  const assetLinkInfo = mediaSrc ? (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(mediaSrc) : null;
1029
182
  const canOpenInEditor = Boolean(window.remotion_editorName && originalLocation);
1030
183
  const sourceEditingEnabled = (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
1031
- const disableInteractivityDisabled = !sourceEditingEnabled || !target.sequence.showInTimeline;
184
+ const disableInteractivityDisabled = !sourceEditingEnabled || !contextMenuTarget.sequence.showInTimeline;
1032
185
  const sourceEditDisabled = !sourceEditingEnabled ||
1033
- !target.sequence.controls ||
186
+ !contextMenuTarget.sequence.controls ||
1034
187
  !nodePath.absolutePath;
1035
- const canAddEffect = target.nodePathInfo.supportsEffects &&
188
+ const isProgrammaticallyDuplicated = contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath > 1;
189
+ const canAddEffect = contextMenuTarget.nodePathInfo.supportsEffects &&
1036
190
  !sourceEditDisabled &&
1037
191
  previewServerState.type === 'connected';
1038
- const canCrop = target.canCrop && !sourceEditDisabled;
192
+ const canCrop = contextMenuTarget.canCrop && !sourceEditDisabled;
1039
193
  return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
1040
194
  assetLinkInfo,
1041
195
  canOpenInEditor,
196
+ codingAgentInfo,
1042
197
  deleteDisabled: sourceEditDisabled,
1043
198
  disableInteractivityDisabled,
1044
- duplicateDisabled: sourceEditDisabled,
1045
- editorInfo: null,
1046
- fileLocation,
199
+ duplicateDisabled: sourceEditDisabled || isProgrammaticallyDuplicated,
200
+ editorInfo,
1047
201
  includeSourceEditItems: sourceEditingEnabled,
202
+ isProgrammaticallyDuplicated,
203
+ onConfigureApps: canConfigureApps
204
+ ? () => {
205
+ var _a;
206
+ var _b;
207
+ setSelectedModal({
208
+ type: 'settings',
209
+ initialTab: 'apps',
210
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
211
+ });
212
+ }
213
+ : null,
1048
214
  onDeleteSequenceFromSource: async () => {
1049
215
  if (sourceEditDisabled || previewServerState.type !== 'connected') {
1050
216
  return;
1051
217
  }
1052
- if (target.nodePathInfo.numberOfSequencesWithThisNodePath > 1) {
218
+ if (contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath > 1) {
1053
219
  const shouldDelete = await confirm({
1054
220
  title: 'Delete sequence?',
1055
221
  message: 'This sequence is programmatically duplicated ' +
1056
- target.nodePathInfo.numberOfSequencesWithThisNodePath +
222
+ contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath +
1057
223
  ' times in the code. Deleting removes all instances. Continue?',
1058
224
  confirmLabel: 'Delete',
1059
225
  });
@@ -1094,22 +260,33 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1094
260
  if (sourceEditDisabled) {
1095
261
  return;
1096
262
  }
1097
- (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)([target.nodePathInfo], confirm).catch(() => undefined);
263
+ (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)([contextMenuTarget.nodePathInfo], confirm).catch(() => undefined);
264
+ },
265
+ openInCodingAgent: (codingAgentId, codingAgentName, contextForAgents) => {
266
+ (0, open_in_editor_1.openInCodingAgent)(codingAgentId, contextForAgents)
267
+ .then((response) => {
268
+ if (!response.success) {
269
+ (0, NotificationCenter_1.showNotification)(`Could not open ${codingAgentName}`, 2000);
270
+ }
271
+ })
272
+ .catch((err) => {
273
+ (0, NotificationCenter_1.showNotification)(err.message, 2000);
274
+ });
1098
275
  },
1099
- openInEditor: () => {
276
+ openInEditor: (editorId) => {
1100
277
  if (!originalLocation) {
1101
278
  return;
1102
279
  }
1103
- (0, open_in_editor_1.openOriginalPositionInEditor)(originalLocation, null).catch((err) => {
280
+ (0, open_in_editor_1.openOriginalPositionInEditor)(originalLocation, editorId).catch((err) => {
1104
281
  (0, NotificationCenter_1.showNotification)(err.message, 2000);
1105
282
  });
1106
283
  },
1107
284
  originalLocation,
1108
285
  selectAsset,
1109
- sequence: target.sequence,
286
+ sequence: contextMenuTarget.sequence,
1110
287
  sourceActions: sourceEditingEnabled
1111
288
  ? [
1112
- ...(target.nodePathInfo.supportsEffects
289
+ ...(contextMenuTarget.nodePathInfo.supportsEffects
1113
290
  ? [
1114
291
  {
1115
292
  type: 'item',
@@ -1140,7 +317,7 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1140
317
  type: 'item',
1141
318
  id: 'crop',
1142
319
  keyHint: null,
1143
- label: 'Crop',
320
+ label: isProgrammaticallyDuplicated ? 'Crop all' : 'Crop',
1144
321
  leftItem: null,
1145
322
  disabled: !canCrop,
1146
323
  onClick: () => {
@@ -1150,7 +327,7 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1150
327
  onSelect({
1151
328
  type: 'sequence-prop',
1152
329
  nodePathInfo: {
1153
- ...target.nodePathInfo,
330
+ ...contextMenuTarget.nodePathInfo,
1154
331
  auxiliaryKeys: ['controls', selected_outline_types_1.cropFieldKeys.left],
1155
332
  },
1156
333
  key: selected_outline_types_1.cropFieldKeys.left,
@@ -1168,20 +345,25 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1168
345
  : [],
1169
346
  });
1170
347
  }, [
348
+ canConfigureApps,
349
+ codingAgentInfo,
1171
350
  confirm,
351
+ editorInfo,
352
+ getTarget,
1172
353
  onSelect,
1173
354
  previewServerState,
1174
355
  resolveOriginalLocation,
1175
356
  selectAsset,
1176
357
  setSelectedModal,
1177
358
  setPropStatuses,
1178
- target,
1179
359
  ]);
1180
360
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1181
- jsx_runtime_1.jsx(SelectedOutlinePolygon, { allDragTargets: allDragTargets, allDragOutlines: allDragOutlines, dragging: dragging, hovered: hovered, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, onDoubleClickTarget: onDoubleClickTarget, scale: scale, snapTargets: snapTargets, target: target }), jsx_runtime_1.jsx(SelectedOutlineCropControls_1.SelectedOutlineCropControls, { outline: outline, onDraggingChange: onDraggingChange, target: target }), (target === null || target === void 0 ? void 0 : target.cropDrag) === null && (target.containsSelection || hovered)
1182
- ? ['top', 'right', 'bottom', 'left'].map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine, { allScaleDragTargets: allScaleDragTargets, dragging: dragging, edge: edge, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, edge)))
1183
- : null, (target === null || target === void 0 ? void 0 : target.cropDrag) === null && (target.containsSelection || hovered)
1184
- ? ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map((corner) => (jsx_runtime_1.jsx(SelectedOutlineRotationCornerHandle, { allRotationDragTargets: allRotationDragTargets, corner: corner, dragging: dragging, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, corner)))
361
+ jsx_runtime_1.jsx(SelectedOutlinePolygon_1.SelectedOutlinePolygon, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getLayoutTarget: getLayoutTarget, getTarget: getTarget, hasTarget: layoutTarget !== undefined, hovered: hovered, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, onDoubleClickTarget: onDoubleClickTarget, scale: scale, showSelectedOutline: (_a = layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.showSelectedOutline) !== null && _a !== void 0 ? _a : false }), jsx_runtime_1.jsx(SelectedOutlineCropControls_1.SelectedOutlineCropControls, { outline: outline, onDraggingChange: onDraggingChange, target: controlTarget }), (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
362
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
363
+ ? ['top', 'right', 'bottom', 'left'].map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine_1.SelectedOutlineScaleEdgeLine, { getAllScaleDragTargets: getAllScaleDragTargets, dragging: dragging, edge: edge, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, edge)))
364
+ : null, (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
365
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
366
+ ? ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map((corner) => (jsx_runtime_1.jsx(SelectedOutlineRotationCornerHandle_1.SelectedOutlineRotationCornerHandle, { getAllRotationDragTargets: getAllRotationDragTargets, corner: corner, dragging: dragging, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, corner)))
1185
367
  : null] }));
1186
368
  };
1187
- exports.SelectedOutlineElement = SelectedOutlineElement;
369
+ exports.SelectedOutlineElement = react_1.default.memo(SelectedOutlineElementUnmemoized);