@remotion/studio 4.0.506 → 4.0.508

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 (211) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/api/copy-render-output-to-asset.d.ts +4 -0
  3. package/dist/api/copy-render-output-to-asset.js +11 -0
  4. package/dist/components/AssetSelector.js +19 -4
  5. package/dist/components/AssetSelectorItem.js +2 -2
  6. package/dist/components/CodingAgentIcon.d.ts +6 -0
  7. package/dist/components/CodingAgentIcon.js +12 -0
  8. package/dist/components/ConfigureDefaultEditorModal.d.ts +1 -3
  9. package/dist/components/ConfigureDefaultEditorModal.js +67 -77
  10. package/dist/components/ConfigureLicenseModal.d.ts +1 -4
  11. package/dist/components/ConfigureLicenseModal.js +89 -81
  12. package/dist/components/ContextMenu.d.ts +1 -0
  13. package/dist/components/ContextMenu.js +42 -13
  14. package/dist/components/EditorContent.js +4 -3
  15. package/dist/components/EditorContexts.js +6 -5
  16. package/dist/components/ExpandedTracksProvider.js +10 -53
  17. package/dist/components/InlineAction.d.ts +2 -1
  18. package/dist/components/InlineAction.js +3 -3
  19. package/dist/components/InspectorLocationCopy.js +8 -8
  20. package/dist/components/InspectorOpenInEditor.d.ts +2 -0
  21. package/dist/components/InspectorOpenInEditor.js +81 -50
  22. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  23. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  24. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -0
  25. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +22 -4
  26. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  27. package/dist/components/InspectorPanel/styles.js +1 -1
  28. package/dist/components/InspectorSequenceSection.js +36 -4
  29. package/dist/components/Menu/MenuSectionHeader.d.ts +4 -0
  30. package/dist/components/Menu/MenuSectionHeader.js +20 -0
  31. package/dist/components/Menu/SubMenu.js +13 -2
  32. package/dist/components/Menu/menu-tree-context.d.ts +3 -0
  33. package/dist/components/Menu/menu-tree-context.js +13 -0
  34. package/dist/components/MenuBuildIndicator.js +1 -1
  35. package/dist/components/NewComposition/ComboBox.d.ts +6 -1
  36. package/dist/components/NewComposition/MenuContent.js +27 -19
  37. package/dist/components/NewComposition/menu-typeahead.js +2 -2
  38. package/dist/components/PlayPause.d.ts +1 -1
  39. package/dist/components/PlayPause.js +61 -12
  40. package/dist/components/Preview.js +29 -4
  41. package/dist/components/RenderButton.js +16 -12
  42. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  43. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  44. package/dist/components/RenderModal/InfoBubble.js +6 -4
  45. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  46. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  47. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  48. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  49. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  50. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  51. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  52. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  53. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  54. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  55. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.d.ts +1 -0
  56. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +3 -3
  57. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  58. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  59. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  60. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  61. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +8 -3
  62. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  63. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  64. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +2 -2
  65. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  66. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  67. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  68. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  69. package/dist/components/RenderModal/ServerRenderModal.js +4 -0
  70. package/dist/components/RenderQueue/RenderQueueItem.js +8 -2
  71. package/dist/components/RenderQueue/actions.d.ts +4 -2
  72. package/dist/components/RenderQueue/actions.js +4 -2
  73. package/dist/components/RenderQueue/index.js +3 -4
  74. package/dist/components/RenderQueue/use-render-output-file-drag.d.ts +8 -0
  75. package/dist/components/RenderQueue/use-render-output-file-drag.js +121 -0
  76. package/dist/components/SegmentedControl.js +0 -1
  77. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  78. package/dist/components/SelectedOutlineCanvasRotation.js +237 -0
  79. package/dist/components/SelectedOutlineElement.d.ts +16 -18
  80. package/dist/components/SelectedOutlineElement.js +144 -931
  81. package/dist/components/SelectedOutlineKeyboardControls.d.ts +7 -0
  82. package/dist/components/SelectedOutlineKeyboardControls.js +261 -0
  83. package/dist/components/SelectedOutlineOverlay.d.ts +7 -14
  84. package/dist/components/SelectedOutlineOverlay.js +378 -864
  85. package/dist/components/SelectedOutlinePolygon.d.ts +26 -0
  86. package/dist/components/SelectedOutlinePolygon.js +360 -0
  87. package/dist/components/SelectedOutlineRenderer.d.ts +19 -0
  88. package/dist/components/SelectedOutlineRenderer.js +225 -0
  89. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +17 -0
  90. package/dist/components/SelectedOutlineRotationCornerHandle.js +271 -0
  91. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +17 -0
  92. package/dist/components/SelectedOutlineScaleEdgeLine.js +215 -0
  93. package/dist/components/SelectedOutlineSnapIndicators.d.ts +9 -0
  94. package/dist/components/SelectedOutlineSnapIndicators.js +29 -0
  95. package/dist/components/SelectedOutlineTransformOriginHandle.d.ts +9 -0
  96. package/dist/components/SelectedOutlineTransformOriginHandle.js +312 -0
  97. package/dist/components/SelectedOutlineUvControls.d.ts +3 -9
  98. package/dist/components/SelectedOutlineUvControls.js +57 -12
  99. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  100. package/dist/components/SettingsContext.d.ts +15 -0
  101. package/dist/components/SettingsContext.js +116 -0
  102. package/dist/components/SettingsModal.js +10 -4
  103. package/dist/components/SettingsModalFooter.d.ts +1 -3
  104. package/dist/components/SettingsModalFooter.js +4 -6
  105. package/dist/components/ShowOutlinesProvider.js +2 -3
  106. package/dist/components/Timeline/EasingEditorModal.js +66 -22
  107. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  108. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  109. package/dist/components/Timeline/Timeline.js +22 -5
  110. package/dist/components/Timeline/TimelineDuplicateCount.d.ts +4 -0
  111. package/dist/components/Timeline/TimelineDuplicateCount.js +28 -0
  112. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  113. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +3 -23
  114. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +4 -2
  115. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +11 -1
  116. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  117. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  118. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  119. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  120. package/dist/components/Timeline/TimelineSelection.js +45 -2
  121. package/dist/components/Timeline/TimelineSequence.js +28 -25
  122. package/dist/components/Timeline/TimelineSequenceItem.js +91 -28
  123. package/dist/components/Timeline/TimelineSequencePropItem.js +5 -2
  124. package/dist/components/Timeline/TimelineTrack.js +2 -1
  125. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  126. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  127. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  128. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  129. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  130. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -3
  131. package/dist/components/Timeline/get-sequence-context-menu-items.js +69 -57
  132. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  133. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  134. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  135. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  136. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  137. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  138. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  139. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  140. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  141. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  142. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  143. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  144. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  145. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +36 -4
  146. package/dist/components/Timeline/{use-open-sequence-in-editor.d.ts → use-open-sequence-in-apps.d.ts} +4 -1
  147. package/dist/components/Timeline/{use-open-sequence-in-editor.js → use-open-sequence-in-apps.js} +21 -5
  148. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  149. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +45 -9
  150. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  151. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  152. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +4 -0
  153. package/dist/components/Timeline/use-timeline-expanded-tree.js +45 -1
  154. package/dist/components/call-api.js +2 -0
  155. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  156. package/dist/components/canvas-rotation-cursor.js +14 -0
  157. package/dist/components/get-open-in-menu-items.d.ts +17 -0
  158. package/dist/components/get-open-in-menu-items.js +144 -0
  159. package/dist/components/selected-outline-drag.d.ts +11 -5
  160. package/dist/components/selected-outline-drag.js +80 -42
  161. package/dist/components/selected-outline-measurement.d.ts +7 -2
  162. package/dist/components/selected-outline-measurement.js +28 -1
  163. package/dist/components/selected-outline-order.d.ts +12 -0
  164. package/dist/components/selected-outline-order.js +251 -0
  165. package/dist/components/selected-outline-types.d.ts +15 -10
  166. package/dist/components/svg-point-to-client-point.d.ts +2 -0
  167. package/dist/components/svg-point-to-client-point.js +10 -0
  168. package/dist/components/use-auto-save-config.d.ts +8 -0
  169. package/dist/components/use-auto-save-config.js +74 -0
  170. package/dist/components/use-default-editor-info.d.ts +1 -0
  171. package/dist/components/use-default-editor-info.js +10 -30
  172. package/dist/esm/{chunk-jefhcs5z.js → chunk-fgedsvhb.js} +1 -2
  173. package/dist/esm/{chunk-b49ec3nz.js → chunk-zpn4m49r.js} +12924 -10139
  174. package/dist/esm/index.mjs +357 -2
  175. package/dist/esm/internals.mjs +12923 -10138
  176. package/dist/esm/previewEntry.mjs +12771 -9986
  177. package/dist/esm/renderEntry.mjs +2 -2
  178. package/dist/helpers/are-sequence-node-path-infos-equal.d.ts +2 -0
  179. package/dist/helpers/are-sequence-node-path-infos-equal.js +27 -0
  180. package/dist/helpers/calculate-timeline.js +3 -3
  181. package/dist/helpers/client-id.js +8 -1
  182. package/dist/helpers/format-file-location.d.ts +1 -1
  183. package/dist/helpers/format-file-location.js +3 -3
  184. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  185. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  186. package/dist/helpers/open-in-editor.d.ts +4 -1
  187. package/dist/helpers/open-in-editor.js +9 -1
  188. package/dist/helpers/preview-server-events.js +4 -0
  189. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  190. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  191. package/dist/helpers/studio-runtime-config.js +3 -0
  192. package/dist/helpers/timeline-node-path-key.d.ts +2 -0
  193. package/dist/helpers/timeline-node-path-key.js +3 -1
  194. package/dist/helpers/use-asset-drag-events.d.ts +2 -1
  195. package/dist/helpers/use-asset-drag-events.js +14 -6
  196. package/dist/helpers/use-menu-structure.js +2 -2
  197. package/dist/helpers/use-runtime-values.d.ts +1 -3
  198. package/dist/icons/cube.d.ts +4 -0
  199. package/dist/icons/cube.js +6 -0
  200. package/dist/icons/finder.d.ts +4 -0
  201. package/dist/icons/finder.js +8 -0
  202. package/dist/icons/terminal.d.ts +6 -0
  203. package/dist/icons/terminal.js +46 -0
  204. package/dist/index.d.ts +15 -0
  205. package/dist/index.js +8 -0
  206. package/dist/state/timeline-sequence-hover.d.ts +9 -3
  207. package/dist/state/timeline-sequence-hover.js +63 -12
  208. package/dist/state/transform-3d-mode.d.ts +10 -0
  209. package/dist/state/transform-3d-mode.js +27 -0
  210. package/dist/state/z-index.js +5 -8
  211. package/package.json +12 -12
@@ -33,923 +33,43 @@ 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");
48
+ const transform_3d_mode_1 = require("../state/transform-3d-mode");
51
49
  const call_api_1 = require("./call-api");
52
50
  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
51
  const InitialCompositionLoader_1 = require("./InitialCompositionLoader");
57
52
  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
53
  const selected_outline_types_1 = require("./selected-outline-types");
62
- const selected_outline_uv_1 = require("./selected-outline-uv");
54
+ const SelectedOutlineCanvasRotation_1 = require("./SelectedOutlineCanvasRotation");
63
55
  const SelectedOutlineCropControls_1 = require("./SelectedOutlineCropControls");
64
- const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
56
+ const SelectedOutlinePolygon_1 = require("./SelectedOutlinePolygon");
57
+ const SelectedOutlineRotationCornerHandle_1 = require("./SelectedOutlineRotationCornerHandle");
58
+ const SelectedOutlineScaleEdgeLine_1 = require("./SelectedOutlineScaleEdgeLine");
65
59
  const disable_sequence_interactivity_1 = require("./Timeline/disable-sequence-interactivity");
66
60
  const duplicate_selected_timeline_item_1 = require("./Timeline/duplicate-selected-timeline-item");
67
- const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
68
61
  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
62
  const timeline_asset_link_1 = require("./Timeline/timeline-asset-link");
72
- const timeline_translate_utils_1 = require("./Timeline/timeline-translate-utils");
63
+ const TimelineSelection_1 = require("./Timeline/TimelineSelection");
73
64
  const get_stack_1 = require("./Timeline/TimelineStack/get-stack");
74
- const transform_origin_utils_1 = require("./Timeline/transform-origin-utils");
65
+ const use_default_editor_info_1 = require("./use-default-editor-info");
75
66
  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, }) => {
67
+ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getAllRotationDragTargets, getAllScaleDragTargets, getLatestTargetByKey, layoutTarget, outline, onDraggingChange, onContextMenuOpenChange, onSnapPointsChange, onSelect, scale, }) => {
68
+ var _a;
952
69
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
70
+ const canConfigureApps = (0, use_default_editor_info_1.canUseEditorPicker)(previewServerState.type === 'connected');
71
+ const editorInfo = (0, use_default_editor_info_1.useDefaultEditorInfo)(canConfigureApps);
72
+ const codingAgentInfo = (0, use_default_editor_info_1.useDefaultCodingAgentInfo)(canConfigureApps);
953
73
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
954
74
  const updateResolvedStackTrace = (0, react_1.useContext)(remotion_1.Internals.SequenceStackTracesUpdateContext);
955
75
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
@@ -957,6 +77,43 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
957
77
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
958
78
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
959
79
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
80
+ const { setManuallyEnabled } = (0, react_1.useContext)(transform_3d_mode_1.Transform3DModeStateContext);
81
+ const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
82
+ const targetRef = (0, react_1.useRef)(layoutTarget);
83
+ (0, react_1.useLayoutEffect)(() => {
84
+ targetRef.current = layoutTarget;
85
+ }, [layoutTarget]);
86
+ const getTarget = react_1.default.useCallback(() => {
87
+ const currentTarget = targetRef.current;
88
+ if (currentTarget === undefined) {
89
+ return undefined;
90
+ }
91
+ return getLatestTargetByKey(currentTarget.key);
92
+ }, [getLatestTargetByKey]);
93
+ const getLayoutTarget = react_1.default.useCallback(() => targetRef.current, []);
94
+ const hoveredNodePathKey = (0, react_1.useMemo)(() => layoutTarget === undefined
95
+ ? null
96
+ : (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(layoutTarget.nodePathInfo.sequenceSubscriptionKey), [layoutTarget]);
97
+ const hovered = (0, timeline_sequence_hover_1.useIsTimelineSequenceHovered)(hoveredNodePathKey);
98
+ const controlTarget = layoutTarget !== undefined && (layoutTarget.containsSelection || hovered)
99
+ ? getLatestTargetByKey(layoutTarget.key)
100
+ : undefined;
101
+ const onHoverChange = react_1.default.useCallback((key) => {
102
+ setHoveredSequence((currentHover) => {
103
+ if (key !== null) {
104
+ const hoverTarget = targetRef.current;
105
+ if (hoverTarget === undefined || hoverTarget.key !== key) {
106
+ return currentHover;
107
+ }
108
+ return {
109
+ key,
110
+ nodePathKey: (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(hoverTarget.nodePathInfo.sequenceSubscriptionKey),
111
+ source: 'canvas',
112
+ };
113
+ }
114
+ return (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover;
115
+ });
116
+ }, [setHoveredSequence]);
960
117
  const resolveOriginalLocation = react_1.default.useCallback(async (resolveTarget) => {
961
118
  const stack = resolveTarget.sequence.getStack();
962
119
  if (!stack) {
@@ -1008,52 +165,66 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1008
165
  selectComposition,
1009
166
  ]);
1010
167
  const onContextMenuOpen = react_1.default.useCallback(async () => {
1011
- if (target === undefined) {
168
+ const contextMenuTarget = getTarget();
169
+ if (contextMenuTarget === undefined) {
1012
170
  return false;
1013
171
  }
1014
- if (!target.selected) {
1015
- onSelect(target.selection, { shiftKey: false, toggleKey: false });
172
+ if (!contextMenuTarget.selected) {
173
+ onSelect(contextMenuTarget.selection, {
174
+ shiftKey: false,
175
+ toggleKey: false,
176
+ });
1016
177
  }
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
178
+ const originalLocation = await resolveOriginalLocation(contextMenuTarget);
179
+ const nodePath = contextMenuTarget.nodePathInfo.sequenceSubscriptionKey;
180
+ const mediaSrc = contextMenuTarget.sequence.type === 'audio' ||
181
+ contextMenuTarget.sequence.type === 'video' ||
182
+ contextMenuTarget.sequence.type === 'image'
183
+ ? contextMenuTarget.sequence.src
1027
184
  : null;
1028
185
  const assetLinkInfo = mediaSrc ? (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(mediaSrc) : null;
1029
186
  const canOpenInEditor = Boolean(window.remotion_editorName && originalLocation);
1030
187
  const sourceEditingEnabled = (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
1031
- const disableInteractivityDisabled = !sourceEditingEnabled || !target.sequence.showInTimeline;
188
+ const disableInteractivityDisabled = !sourceEditingEnabled || !contextMenuTarget.sequence.showInTimeline;
1032
189
  const sourceEditDisabled = !sourceEditingEnabled ||
1033
- !target.sequence.controls ||
190
+ !contextMenuTarget.sequence.controls ||
1034
191
  !nodePath.absolutePath;
1035
- const canAddEffect = target.nodePathInfo.supportsEffects &&
192
+ const isProgrammaticallyDuplicated = contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath > 1;
193
+ const canAddEffect = contextMenuTarget.nodePathInfo.supportsEffects &&
1036
194
  !sourceEditDisabled &&
1037
195
  previewServerState.type === 'connected';
1038
- const canCrop = target.canCrop && !sourceEditDisabled;
196
+ const canCrop = contextMenuTarget.canCrop && !sourceEditDisabled;
197
+ const canRotate = !sourceEditDisabled;
1039
198
  return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
1040
199
  assetLinkInfo,
1041
200
  canOpenInEditor,
201
+ codingAgentInfo,
1042
202
  deleteDisabled: sourceEditDisabled,
1043
203
  disableInteractivityDisabled,
1044
- duplicateDisabled: sourceEditDisabled,
1045
- editorInfo: null,
1046
- fileLocation,
204
+ duplicateDisabled: sourceEditDisabled || isProgrammaticallyDuplicated,
205
+ editorInfo,
1047
206
  includeSourceEditItems: sourceEditingEnabled,
207
+ isProgrammaticallyDuplicated,
208
+ onConfigureApps: canConfigureApps
209
+ ? () => {
210
+ var _a;
211
+ var _b;
212
+ setSelectedModal({
213
+ type: 'settings',
214
+ initialTab: 'apps',
215
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
216
+ });
217
+ }
218
+ : null,
1048
219
  onDeleteSequenceFromSource: async () => {
1049
220
  if (sourceEditDisabled || previewServerState.type !== 'connected') {
1050
221
  return;
1051
222
  }
1052
- if (target.nodePathInfo.numberOfSequencesWithThisNodePath > 1) {
223
+ if (contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath > 1) {
1053
224
  const shouldDelete = await confirm({
1054
225
  title: 'Delete sequence?',
1055
226
  message: 'This sequence is programmatically duplicated ' +
1056
- target.nodePathInfo.numberOfSequencesWithThisNodePath +
227
+ contextMenuTarget.nodePathInfo.numberOfSequencesWithThisNodePath +
1057
228
  ' times in the code. Deleting removes all instances. Continue?',
1058
229
  confirmLabel: 'Delete',
1059
230
  });
@@ -1094,22 +265,33 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1094
265
  if (sourceEditDisabled) {
1095
266
  return;
1096
267
  }
1097
- (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)([target.nodePathInfo], confirm).catch(() => undefined);
268
+ (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)([contextMenuTarget.nodePathInfo], confirm).catch(() => undefined);
1098
269
  },
1099
- openInEditor: () => {
270
+ openInCodingAgent: (codingAgentId, codingAgentName, contextForAgents) => {
271
+ (0, open_in_editor_1.openInCodingAgent)(codingAgentId, contextForAgents)
272
+ .then((response) => {
273
+ if (!response.success) {
274
+ (0, NotificationCenter_1.showNotification)(`Could not open ${codingAgentName}`, 2000);
275
+ }
276
+ })
277
+ .catch((err) => {
278
+ (0, NotificationCenter_1.showNotification)(err.message, 2000);
279
+ });
280
+ },
281
+ openInEditor: (editorId) => {
1100
282
  if (!originalLocation) {
1101
283
  return;
1102
284
  }
1103
- (0, open_in_editor_1.openOriginalPositionInEditor)(originalLocation, null).catch((err) => {
285
+ (0, open_in_editor_1.openOriginalPositionInEditor)(originalLocation, editorId).catch((err) => {
1104
286
  (0, NotificationCenter_1.showNotification)(err.message, 2000);
1105
287
  });
1106
288
  },
1107
289
  originalLocation,
1108
290
  selectAsset,
1109
- sequence: target.sequence,
291
+ sequence: contextMenuTarget.sequence,
1110
292
  sourceActions: sourceEditingEnabled
1111
293
  ? [
1112
- ...(target.nodePathInfo.supportsEffects
294
+ ...(contextMenuTarget.nodePathInfo.supportsEffects
1113
295
  ? [
1114
296
  {
1115
297
  type: 'item',
@@ -1140,7 +322,7 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1140
322
  type: 'item',
1141
323
  id: 'crop',
1142
324
  keyHint: null,
1143
- label: 'Crop',
325
+ label: isProgrammaticallyDuplicated ? 'Crop all' : 'Crop',
1144
326
  leftItem: null,
1145
327
  disabled: !canCrop,
1146
328
  onClick: () => {
@@ -1150,7 +332,7 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1150
332
  onSelect({
1151
333
  type: 'sequence-prop',
1152
334
  nodePathInfo: {
1153
- ...target.nodePathInfo,
335
+ ...contextMenuTarget.nodePathInfo,
1154
336
  auxiliaryKeys: ['controls', selected_outline_types_1.cropFieldKeys.left],
1155
337
  },
1156
338
  key: selected_outline_types_1.cropFieldKeys.left,
@@ -1160,28 +342,59 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
1160
342
  subMenu: null,
1161
343
  value: 'crop',
1162
344
  },
345
+ {
346
+ type: 'item',
347
+ id: 'rotate',
348
+ keyHint: null,
349
+ label: isProgrammaticallyDuplicated ? 'Rotate all' : 'Rotate',
350
+ leftItem: null,
351
+ disabled: !canRotate,
352
+ onClick: () => {
353
+ if (!canRotate) {
354
+ return;
355
+ }
356
+ setManuallyEnabled((0, TimelineSelection_1.getTimelineSequenceSelectionKey)(contextMenuTarget.nodePathInfo), true);
357
+ onSelect({
358
+ type: 'sequence-prop',
359
+ nodePathInfo: {
360
+ ...contextMenuTarget.nodePathInfo,
361
+ auxiliaryKeys: ['controls', selected_outline_types_1.rotateFieldKey],
362
+ },
363
+ key: selected_outline_types_1.rotateFieldKey,
364
+ }, { shiftKey: false, toggleKey: false });
365
+ },
366
+ quickSwitcherLabel: null,
367
+ subMenu: null,
368
+ value: 'rotate',
369
+ },
1163
370
  {
1164
371
  type: 'divider',
1165
- id: 'crop-divider',
372
+ id: 'rotate-divider',
1166
373
  },
1167
374
  ]
1168
375
  : [],
1169
376
  });
1170
377
  }, [
378
+ canConfigureApps,
379
+ codingAgentInfo,
1171
380
  confirm,
381
+ editorInfo,
382
+ getTarget,
1172
383
  onSelect,
1173
384
  previewServerState,
1174
385
  resolveOriginalLocation,
386
+ setManuallyEnabled,
1175
387
  selectAsset,
1176
388
  setSelectedModal,
1177
389
  setPropStatuses,
1178
- target,
1179
390
  ]);
1180
391
  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)))
392
+ 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, onContextMenuOpenChange: onContextMenuOpenChange, 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 }), (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation) && (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.rotationDrag) ? (jsx_runtime_1.jsx(SelectedOutlineCanvasRotation_1.SelectedOutlineCanvasRotation, { getLatestTargetByKey: getLatestTargetByKey, layoutTarget: layoutTarget, onDraggingChange: onDraggingChange, outline: outline })) : null, jsx_runtime_1.jsx(SelectedOutlineCropControls_1.SelectedOutlineCropControls, { outline: outline, onDraggingChange: onDraggingChange, target: controlTarget }), (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
393
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
394
+ ? ['top', 'right', 'bottom', 'left'].map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine_1.SelectedOutlineScaleEdgeLine, { getAllScaleDragTargets: getAllScaleDragTargets, dragging: dragging, edge: edge, outline: outline, onContextMenuOpen: onContextMenuOpen, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, edge)))
395
+ : null, (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
396
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
397
+ ? ['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, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, corner)))
1185
398
  : null] }));
1186
399
  };
1187
- exports.SelectedOutlineElement = SelectedOutlineElement;
400
+ exports.SelectedOutlineElement = react_1.default.memo(SelectedOutlineElementUnmemoized);