@remotion/studio 4.0.507 → 4.0.509

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 (191) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/Studio.d.ts +5 -0
  3. package/dist/Studio.js +2 -2
  4. package/dist/components/Canvas.js +35 -5
  5. package/dist/components/CodingAgentIcon.d.ts +3 -1
  6. package/dist/components/CodingAgentIcon.js +4 -9
  7. package/dist/components/ColorPicker/AlphaSlider.js +2 -2
  8. package/dist/components/ColorPicker/HueSlider.js +2 -2
  9. package/dist/components/ColorPicker/SaturationValueArea.js +2 -2
  10. package/dist/components/ConfigureDefaultEditorModal.js +1 -1
  11. package/dist/components/ContextMenu.d.ts +1 -0
  12. package/dist/components/ContextMenu.js +32 -5
  13. package/dist/components/EditorContent.js +4 -3
  14. package/dist/components/EditorGuides/Guide.js +2 -2
  15. package/dist/components/EditorRuler/index.js +2 -2
  16. package/dist/components/ExplorerPanel.js +19 -1
  17. package/dist/components/InlineAction.d.ts +2 -1
  18. package/dist/components/InlineAction.js +3 -3
  19. package/dist/components/InspectorLocationCopy.js +1 -1
  20. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  21. package/dist/components/InspectorOpenInEditor.js +52 -8
  22. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  23. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  24. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +3 -3
  25. package/dist/components/InspectorPanel/styles.js +1 -1
  26. package/dist/components/InspectorSequenceSection.js +36 -4
  27. package/dist/components/Menu/MenuItem.js +2 -2
  28. package/dist/components/MenuBuildIndicator.js +1 -1
  29. package/dist/components/ModalContainer.js +1 -1
  30. package/dist/components/Modals.js +2 -9
  31. package/dist/components/NewComposition/InputDragger.js +2 -2
  32. package/dist/components/NewComposition/NewComposition.d.ts +2 -0
  33. package/dist/components/NewComposition/NewComposition.js +38 -6
  34. package/dist/components/NewComposition/get-new-composition-defaults.d.ts +1 -1
  35. package/dist/components/NewComposition/get-new-composition-defaults.js +9 -1
  36. package/dist/components/PlayPause.d.ts +1 -1
  37. package/dist/components/PlayPause.js +61 -12
  38. package/dist/components/RenderButton.js +16 -12
  39. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  40. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  41. package/dist/components/RenderModal/InfoBubble.js +6 -4
  42. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  43. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  44. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  45. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  46. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  47. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  48. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  49. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  50. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  51. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  52. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  53. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  54. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  55. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  56. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  57. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +6 -1
  58. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  59. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  60. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  61. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  62. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  63. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  64. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  65. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  66. package/dist/components/SelectedOutlineCanvasRotation.js +239 -0
  67. package/dist/components/SelectedOutlineCropControls.js +2 -2
  68. package/dist/components/SelectedOutlineElement.d.ts +2 -1
  69. package/dist/components/SelectedOutlineElement.js +40 -5
  70. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  71. package/dist/components/SelectedOutlineOverlay.js +55 -26
  72. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  73. package/dist/components/SelectedOutlinePolygon.js +6 -5
  74. package/dist/components/SelectedOutlineRenderer.d.ts +1 -0
  75. package/dist/components/SelectedOutlineRenderer.js +24 -7
  76. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +6 -0
  77. package/dist/components/SelectedOutlineRotationCornerHandle.js +9 -7
  78. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +2 -0
  79. package/dist/components/SelectedOutlineScaleEdgeLine.js +11 -7
  80. package/dist/components/SelectedOutlineTransformOriginHandle.js +50 -24
  81. package/dist/components/SelectedOutlineUvControls.js +8 -8
  82. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  83. package/dist/components/SettingsModalFooter.js +1 -1
  84. package/dist/components/Splitter/SplitterHandle.js +2 -2
  85. package/dist/components/Tabs/index.d.ts +2 -0
  86. package/dist/components/Tabs/index.js +2 -2
  87. package/dist/components/Timeline/EasingEditorModal.js +2 -2
  88. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  89. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  90. package/dist/components/Timeline/Timeline.js +55 -1
  91. package/dist/components/Timeline/TimelineClipboardKeybindings.js +99 -35
  92. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  93. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  94. package/dist/components/Timeline/TimelineEffectPropItem.js +7 -0
  95. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  96. package/dist/components/Timeline/TimelineInOutDragHandler.js +2 -2
  97. package/dist/components/Timeline/TimelineLayerEye.js +2 -2
  98. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  99. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  100. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  101. package/dist/components/Timeline/TimelineSelection.js +47 -4
  102. package/dist/components/Timeline/TimelineSequenceItem.js +43 -25
  103. package/dist/components/Timeline/TimelineSequencePropItem.js +12 -3
  104. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +6 -6
  105. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  106. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  107. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  108. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  109. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  110. package/dist/components/Timeline/get-sequence-context-menu-items.js +14 -6
  111. package/dist/components/Timeline/keyframe-clipboard.d.ts +5 -1
  112. package/dist/components/Timeline/keyframe-clipboard.js +3 -2
  113. package/dist/components/Timeline/save-sequence-prop.js +16 -7
  114. package/dist/components/Timeline/sequence-prop-clipboard.d.ts +31 -0
  115. package/dist/components/Timeline/sequence-prop-clipboard.js +142 -0
  116. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  117. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  118. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  119. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  120. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  121. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  122. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  123. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  124. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  125. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  126. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  127. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  128. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  129. package/dist/components/Timeline/update-selected-easing.js +8 -0
  130. package/dist/components/Timeline/use-open-sequence-in-apps.js +3 -1
  131. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  132. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +67 -10
  133. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  134. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  135. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  136. package/dist/components/call-api.js +2 -0
  137. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  138. package/dist/components/canvas-rotation-cursor.js +14 -0
  139. package/dist/components/folder-menu-items.js +1 -0
  140. package/dist/components/get-open-in-menu-items.d.ts +8 -1
  141. package/dist/components/get-open-in-menu-items.js +93 -8
  142. package/dist/components/import-assets.js +7 -0
  143. package/dist/components/root-composition-menu-items.js +1 -0
  144. package/dist/components/selected-outline-control-layout.d.ts +14 -0
  145. package/dist/components/selected-outline-control-layout.js +94 -0
  146. package/dist/components/selected-outline-drag.d.ts +11 -5
  147. package/dist/components/selected-outline-drag.js +80 -42
  148. package/dist/components/selected-outline-measurement.d.ts +5 -0
  149. package/dist/components/selected-outline-measurement.js +28 -1
  150. package/dist/components/selected-outline-types.d.ts +6 -0
  151. package/dist/components/use-default-editor-info.js +28 -3
  152. package/dist/esm/{chunk-ptnd65a9.js → chunk-jdn6nkbk.js} +10087 -7919
  153. package/dist/esm/{chunk-fgedsvhb.js → chunk-r46yxrjr.js} +1 -2
  154. package/dist/esm/index.mjs +357 -2
  155. package/dist/esm/internals.mjs +10086 -7918
  156. package/dist/esm/previewEntry.mjs +9926 -7758
  157. package/dist/esm/renderEntry.mjs +4 -2
  158. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  159. package/dist/helpers/get-canvas-capture-import.d.ts +7 -0
  160. package/dist/helpers/get-canvas-capture-import.js +43 -0
  161. package/dist/helpers/get-git-menu-item.d.ts +1 -1
  162. package/dist/helpers/get-git-menu-item.js +33 -3
  163. package/dist/helpers/inserted-element-selection.d.ts +12 -0
  164. package/dist/helpers/inserted-element-selection.js +29 -0
  165. package/dist/helpers/open-in-editor.d.ts +3 -1
  166. package/dist/helpers/open-in-editor.js +5 -1
  167. package/dist/helpers/pointer-session.d.ts +6 -2
  168. package/dist/helpers/pointer-session.js +29 -12
  169. package/dist/helpers/preview-server-events.js +4 -0
  170. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  171. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  172. package/dist/helpers/use-create-composition.d.ts +15 -2
  173. package/dist/helpers/use-create-composition.js +11 -17
  174. package/dist/helpers/use-menu-structure.js +1 -0
  175. package/dist/icons/cube.d.ts +4 -0
  176. package/dist/icons/cube.js +6 -0
  177. package/dist/icons/finder.d.ts +4 -0
  178. package/dist/icons/finder.js +8 -0
  179. package/dist/icons/github.d.ts +4 -0
  180. package/dist/icons/github.js +11 -0
  181. package/dist/icons/terminal.d.ts +6 -0
  182. package/dist/icons/terminal.js +46 -0
  183. package/dist/index.d.ts +15 -0
  184. package/dist/index.js +8 -0
  185. package/dist/renderEntry.js +2 -2
  186. package/dist/state/modals.d.ts +9 -1
  187. package/dist/state/transform-3d-mode.d.ts +10 -0
  188. package/dist/state/transform-3d-mode.js +27 -0
  189. package/dist/state/z-index.d.ts +0 -1
  190. package/dist/state/z-index.js +28 -37
  191. package/package.json +12 -12
@@ -14,6 +14,7 @@ export declare const SelectedOutlinePolygon: React.NamedExoticComponent<{
14
14
  readonly hasTarget: boolean;
15
15
  readonly hovered: boolean;
16
16
  readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
17
+ readonly onContextMenuOpenChange: (open: boolean) => void;
17
18
  readonly outline: SelectedOutline;
18
19
  readonly onDraggingChange: (dragging: boolean) => void;
19
20
  readonly onHoverChange: (key: string | null) => void;
@@ -55,7 +55,7 @@ const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
55
55
  const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
56
56
  const imperative_state_1 = require("./Timeline/imperative-state");
57
57
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
58
- const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getLayoutTarget, getTarget, hasTarget, hovered, onContextMenuOpen, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, showSelectedOutline, }) => {
58
+ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getLayoutTarget, getTarget, hasTarget, hovered, onContextMenuOpen, onContextMenuOpenChange, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, showSelectedOutline, }) => {
59
59
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
60
60
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
61
61
  const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -109,6 +109,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
109
109
  getDragOverrides,
110
110
  timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
111
111
  });
112
+ const dragOutlines = selected ? getAllDragOutlines() : [outline];
112
113
  let lastValues = new Map();
113
114
  let currentPointerX = startPointerX;
114
115
  let currentPointerY = startPointerY;
@@ -154,7 +155,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
154
155
  allowY: axisLockedDirection !== 'horizontal',
155
156
  deltaX,
156
157
  deltaY,
157
- outlines: selected ? getAllDragOutlines() : [outline],
158
+ outlines: dragOutlines,
158
159
  scale,
159
160
  targets: snapTargets,
160
161
  });
@@ -258,9 +259,9 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
258
259
  (0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
259
260
  });
260
261
  };
261
- (0, pointer_session_1.startPointerSession)({
262
+ (0, pointer_session_1.startCapturedPointerSession)({
262
263
  event,
263
- target: event.currentTarget,
264
+ captureTarget: event.currentTarget,
264
265
  onMove: onPointerMove,
265
266
  onEnd: onPointerUp,
266
267
  });
@@ -353,7 +354,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
353
354
  if (!dragging) {
354
355
  onHoverChange(null);
355
356
  }
356
- }, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onDragOver: onEffectDragOver, onDragLeave: onEffectDragLeave, onDrop: onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, getItems: onContextMenuOpen })
357
+ }, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onDragOver: onEffectDragOver, onDragLeave: onEffectDragLeave, onDrop: onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, getItems: onContextMenuOpen, onOpenChange: onContextMenuOpenChange })
357
358
  ] }));
358
359
  };
359
360
  exports.SelectedOutlinePolygon = react_1.default.memo(SelectedOutlinePolygonUnmemoized);
@@ -8,6 +8,7 @@ export declare const SelectedOutlineRenderer: React.NamedExoticComponent<{
8
8
  readonly getLatestOutlineTargetByKey: (key: string) => SelectedOutlineTarget | undefined;
9
9
  readonly getOutlineTargets: () => readonly SelectedOutlineLayoutTarget[];
10
10
  readonly onDraggingChange: (dragging: boolean) => void;
11
+ readonly onContextMenuOpenChange: (open: boolean) => void;
11
12
  readonly onSelect: (item: TimelineSelection, interaction?: TimelineSelectionInteraction | undefined) => void;
12
13
  readonly scale: number;
13
14
  readonly sequences: readonly {
@@ -64,7 +64,7 @@ const SelectedOutlineHoverCleanup = ({ targets }) => {
64
64
  }, [hoveredSequence, setHoveredSequence, targets]);
65
65
  return null;
66
66
  };
67
- const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth, dragging, getLatestOutlineTargetByKey, getOutlineTargets, onDraggingChange, onSelect, scale, sequences, updateOutlinesRef, }) => {
67
+ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth, dragging, getLatestOutlineTargetByKey, getOutlineTargets, onDraggingChange, onContextMenuOpenChange, onSelect, scale, sequences, updateOutlinesRef, }) => {
68
68
  const [renderState, setRenderState] = (0, react_1.useState)(emptyRenderState);
69
69
  const overlayRef = (0, react_1.useRef)(null);
70
70
  const resizeObserverRef = (0, react_1.useRef)(null);
@@ -149,13 +149,30 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
149
149
  const targetsByKey = (0, react_1.useMemo)(() => {
150
150
  return new Map(renderState.targets.map((target) => [target.key, target]));
151
151
  }, [renderState.targets]);
152
+ // Reordering a captured SVG target can cancel the active pointer session.
153
+ const outlineRenderingOrderRef = (0, react_1.useRef)([]);
152
154
  const outlinesForRendering = (0, react_1.useMemo)(() => {
153
- return (0, selected_outline_order_1.orderOutlinesForRendering)({
154
- outlines: renderState.outlines,
155
- sequences,
156
- targetsByKey,
155
+ if (!dragging || outlineRenderingOrderRef.current.length === 0) {
156
+ const orderedOutlines = (0, selected_outline_order_1.orderOutlinesForRendering)({
157
+ outlines: renderState.outlines,
158
+ sequences,
159
+ targetsByKey,
160
+ });
161
+ outlineRenderingOrderRef.current = orderedOutlines.map((outline) => outline.key);
162
+ return orderedOutlines;
163
+ }
164
+ const currentOutlinesByKey = new Map(renderState.outlines.map((outline) => [outline.key, outline]));
165
+ const frozenKeys = new Set(outlineRenderingOrderRef.current);
166
+ const newOutlines = renderState.outlines.filter((outline) => !frozenKeys.has(outline.key));
167
+ outlineRenderingOrderRef.current = [
168
+ ...outlineRenderingOrderRef.current,
169
+ ...newOutlines.map((outline) => outline.key),
170
+ ];
171
+ return outlineRenderingOrderRef.current.flatMap((key) => {
172
+ const outline = currentOutlinesByKey.get(key);
173
+ return outline === undefined ? [] : [outline];
157
174
  });
158
- }, [renderState.outlines, sequences, targetsByKey]);
175
+ }, [dragging, renderState.outlines, sequences, targetsByKey]);
159
176
  const outlinesByKey = (0, react_1.useMemo)(() => {
160
177
  return new Map(renderState.outlines.map((outline) => [outline.key, outline]));
161
178
  }, [renderState.outlines]);
@@ -203,6 +220,6 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
203
220
  const updateSnapPointsRef = (0, react_1.useRef)(() => undefined);
204
221
  const onSnapPointsChange = (0, react_1.useCallback)((snapPoints) => updateSnapPointsRef.current(snapPoints), []);
205
222
  return (jsx_runtime_1.jsxs("svg", { ref: overlayRef, style: outlineContainer, width: "100%", height: "100%", "aria-hidden": "true", children: [
206
- jsx_runtime_1.jsx(SelectedOutlineHoverCleanup, { targets: renderState.targets }), jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapIndicators, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, scale: scale, updateSnapPointsRef: updateSnapPointsRef }), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement_1.SelectedOutlineElement, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getAllRotationDragTargets: getAllRotationDragTargets, getAllScaleDragTargets: getAllScaleDragTargets, getLatestTargetByKey: getLatestOutlineTargetByKey, outline: outline, onDraggingChange: onDraggingChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, scale: scale, layoutTarget: targetsByKey.get(outline.key) }, outline.key))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle_1.SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-transform-origin`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`)))] }));
223
+ jsx_runtime_1.jsx(SelectedOutlineHoverCleanup, { targets: renderState.targets }), jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapIndicators, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, scale: scale, updateSnapPointsRef: updateSnapPointsRef }), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement_1.SelectedOutlineElement, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getAllRotationDragTargets: getAllRotationDragTargets, getAllScaleDragTargets: getAllScaleDragTargets, getLatestTargetByKey: getLatestOutlineTargetByKey, outline: outline, onDraggingChange: onDraggingChange, onContextMenuOpenChange: onContextMenuOpenChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, scale: scale, layoutTarget: targetsByKey.get(outline.key) }, outline.key))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle_1.SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-transform-origin`)))] }));
207
224
  };
208
225
  exports.SelectedOutlineRenderer = react_1.default.memo(SelectedOutlineRendererUnmemoized);
@@ -7,10 +7,16 @@ export declare const SelectedOutlineRotationCornerHandle: React.FC<{
7
7
  readonly getAllRotationDragTargets: () => readonly SelectedOutlineRotationDragTarget[];
8
8
  readonly corner: SelectedOutlineRotationCorner;
9
9
  readonly dragging: boolean;
10
+ readonly handlePoint: {
11
+ readonly x: number;
12
+ readonly y: number;
13
+ };
10
14
  readonly outline: SelectedOutline;
11
15
  readonly onDraggingChange: (dragging: boolean) => void;
12
16
  readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
17
+ readonly onContextMenuOpenChange: (open: boolean) => void;
13
18
  readonly onHoverChange: (key: string | null) => void;
14
19
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
20
+ readonly radius: number;
15
21
  readonly target: SelectedOutlineTarget | undefined;
16
22
  }>;
@@ -51,13 +51,14 @@ const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
51
51
  const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
52
52
  const imperative_state_1 = require("./Timeline/imperative-state");
53
53
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
54
- const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner, dragging, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
55
- var _a, _b;
54
+ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner, dragging, handlePoint, outline, onDraggingChange, onContextMenuOpen, onContextMenuOpenChange, onHoverChange, onSelect, radius, target, }) => {
55
+ var _a, _b, _c;
56
56
  const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
57
57
  const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
58
58
  const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
59
59
  const rotationDrag = (_a = target === null || target === void 0 ? void 0 : target.rotationDrag) !== null && _a !== void 0 ? _a : null;
60
60
  const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
61
+ const containsSelection = (_c = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _c !== void 0 ? _c : false;
61
62
  const circleRef = (0, react_1.useRef)(null);
62
63
  const cornerInfo = (0, react_1.useMemo)(() => (0, selected_outline_measurement_1.getSelectedOutlineRotationCornerInfo)(outline.points, corner), [corner, outline.points]);
63
64
  const onPointerDown = react_1.default.useCallback((event) => {
@@ -72,7 +73,7 @@ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner
72
73
  return;
73
74
  }
74
75
  const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
75
- const shouldUpdateSelection = !selected || interaction.toggleKey;
76
+ const shouldUpdateSelection = (!selected && !containsSelection) || interaction.toggleKey;
76
77
  if (shouldUpdateSelection && target !== undefined) {
77
78
  onSelect(target.selection, {
78
79
  shiftKey: false,
@@ -226,9 +227,9 @@ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner
226
227
  });
227
228
  });
228
229
  };
229
- (0, pointer_session_1.startPointerSession)({
230
+ (0, pointer_session_1.startCapturedPointerSession)({
230
231
  event,
231
- target: event.currentTarget,
232
+ captureTarget: event.currentTarget,
232
233
  onMove: onPointerMove,
233
234
  onEnd: onPointerUp,
234
235
  });
@@ -236,6 +237,7 @@ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner
236
237
  window.addEventListener('keyup', onKeyChange);
237
238
  }, [
238
239
  clearDragOverrides,
240
+ containsSelection,
239
241
  cornerInfo,
240
242
  editorSnapping,
241
243
  getDragOverrides,
@@ -255,7 +257,7 @@ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner
255
257
  return null;
256
258
  }
257
259
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
258
- 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: () => {
260
+ jsx_runtime_1.jsx("circle", { ref: circleRef, cx: handlePoint.x, cy: handlePoint.y, r: radius, fill: colors_1.TRANSPARENT, stroke: colors_1.TRANSPARENT, vectorEffect: "non-scaling-stroke", pointerEvents: "all", cursor: cornerInfo.cursor, "data-remotion-studio-rotation-corner": corner, "data-remotion-studio-rotation-corner-contains-selection": containsSelection, onPointerEnter: () => {
259
261
  if (!dragging) {
260
262
  onHoverChange(outline.key);
261
263
  }
@@ -263,7 +265,7 @@ const SelectedOutlineRotationCornerHandle = ({ getAllRotationDragTargets, corner
263
265
  if (!dragging) {
264
266
  onHoverChange(null);
265
267
  }
266
- }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: circleRef, getItems: onContextMenuOpen })
268
+ }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: circleRef, getItems: onContextMenuOpen, onOpenChange: onContextMenuOpenChange })
267
269
  ] }));
268
270
  };
269
271
  exports.SelectedOutlineRotationCornerHandle = SelectedOutlineRotationCornerHandle;
@@ -7,9 +7,11 @@ export declare const SelectedOutlineScaleEdgeLine: React.FC<{
7
7
  readonly getAllScaleDragTargets: () => readonly SelectedOutlineScaleDragTarget[];
8
8
  readonly dragging: boolean;
9
9
  readonly edge: SelectedOutlineScaleEdge;
10
+ readonly hitWidth: number;
10
11
  readonly outline: SelectedOutline;
11
12
  readonly onDraggingChange: (dragging: boolean) => void;
12
13
  readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
14
+ readonly onContextMenuOpenChange: (open: boolean) => void;
13
15
  readonly onHoverChange: (key: string | null) => void;
14
16
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
15
17
  readonly target: SelectedOutlineTarget | undefined;
@@ -49,12 +49,13 @@ const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
49
49
  const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
50
50
  const imperative_state_1 = require("./Timeline/imperative-state");
51
51
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
52
- const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
53
- var _a, _b;
52
+ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge, hitWidth, outline, onDraggingChange, onContextMenuOpen, onContextMenuOpenChange, onHoverChange, onSelect, target, }) => {
53
+ var _a, _b, _c, _d;
54
54
  const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
55
55
  const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
56
56
  const scaleDrag = (_a = target === null || target === void 0 ? void 0 : target.scaleDrag) !== null && _a !== void 0 ? _a : null;
57
57
  const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
58
+ const containsSelection = (_c = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _c !== void 0 ? _c : false;
58
59
  const lineRef = (0, react_1.useRef)(null);
59
60
  const edgeInfo = (0, react_1.useMemo)(() => (0, selected_outline_drag_1.getSelectedOutlineScaleEdgeInfo)(outline.points, edge), [edge, outline.points]);
60
61
  const onPointerDown = react_1.default.useCallback((event) => {
@@ -64,7 +65,9 @@ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge,
64
65
  event.preventDefault();
65
66
  event.stopPropagation();
66
67
  const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
67
- const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
68
+ const shouldUpdateSelection = (!selected && !containsSelection) ||
69
+ interaction.shiftKey ||
70
+ interaction.toggleKey;
68
71
  if (shouldUpdateSelection && target !== undefined) {
69
72
  onSelect(target.selection, interaction);
70
73
  }
@@ -174,14 +177,15 @@ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge,
174
177
  });
175
178
  });
176
179
  };
177
- (0, pointer_session_1.startPointerSession)({
180
+ (0, pointer_session_1.startCapturedPointerSession)({
178
181
  event,
179
- target: event.currentTarget,
182
+ captureTarget: event.currentTarget,
180
183
  onMove: onPointerMove,
181
184
  onEnd: onPointerUp,
182
185
  });
183
186
  }, [
184
187
  clearDragOverrides,
188
+ containsSelection,
185
189
  getAllScaleDragTargets,
186
190
  edgeInfo,
187
191
  getDragOverrides,
@@ -197,7 +201,7 @@ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge,
197
201
  return null;
198
202
  }
199
203
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
200
- 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: () => {
204
+ 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: hitWidth, strokeLinecap: "butt", vectorEffect: "non-scaling-stroke", pointerEvents: "stroke", cursor: edgeInfo.cursor, "data-remotion-studio-scale-edge": edge, "data-remotion-studio-scale-edge-contains-selection": (_d = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _d !== void 0 ? _d : false, onPointerEnter: () => {
201
205
  if (!dragging) {
202
206
  onHoverChange(outline.key);
203
207
  }
@@ -205,7 +209,7 @@ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge,
205
209
  if (!dragging) {
206
210
  onHoverChange(null);
207
211
  }
208
- }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: lineRef, getItems: onContextMenuOpen })
212
+ }, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: lineRef, getItems: onContextMenuOpen, onOpenChange: onContextMenuOpenChange })
209
213
  ] }));
210
214
  };
211
215
  exports.SelectedOutlineScaleEdgeLine = SelectedOutlineScaleEdgeLine;
@@ -44,25 +44,31 @@ const editor_snapping_1 = require("../state/editor-snapping");
44
44
  const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
45
45
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
46
46
  const selected_outline_drag_1 = require("./selected-outline-drag");
47
+ const selected_outline_measurement_1 = require("./selected-outline-measurement");
47
48
  const selected_outline_types_1 = require("./selected-outline-types");
48
49
  const selected_outline_uv_1 = require("./selected-outline-uv");
49
50
  const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
50
51
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
52
+ const timeline_rotation_utils_1 = require("./Timeline/timeline-rotation-utils");
51
53
  const timeline_translate_utils_1 = require("./Timeline/timeline-translate-utils");
52
54
  const transform_origin_utils_1 = require("./Timeline/transform-origin-utils");
53
55
  const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarget, outline, onDraggingChange }) => {
54
- var _a, _b;
56
+ var _a, _b, _c;
55
57
  const { setDragOverrides, clearDragOverrides, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
56
58
  const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
57
- const target = (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForTransformOrigin)
59
+ const target = (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForTransformOrigin) ||
60
+ (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation)
58
61
  ? getLatestTargetByKey(layoutTarget.key)
59
62
  : undefined;
60
63
  const transformOriginDrag = (_a = target === null || target === void 0 ? void 0 : target.transformOriginDrag) !== null && _a !== void 0 ? _a : null;
64
+ const transformOriginValue = (_b = transformOriginDrag === null || transformOriginDrag === void 0 ? void 0 : transformOriginDrag.originValue) !== null && _b !== void 0 ? _b : ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation)
65
+ ? layoutTarget.transformOriginValue
66
+ : null);
61
67
  const crop = target === null || target === void 0 ? void 0 : target.crop;
62
- const transformOriginPoints = (_b = outline.uncroppedPoints) !== null && _b !== void 0 ? _b : outline.points;
63
- const parsed = (0, react_1.useMemo)(() => transformOriginDrag === null
68
+ const transformOriginPoints = (_c = outline.uncroppedPoints) !== null && _c !== void 0 ? _c : outline.points;
69
+ const parsed = (0, react_1.useMemo)(() => transformOriginValue === null
64
70
  ? null
65
- : (0, transform_origin_utils_1.parseTransformOrigin)(transformOriginDrag.originValue), [transformOriginDrag]);
71
+ : (0, transform_origin_utils_1.parseTransformOrigin)(transformOriginValue), [transformOriginValue]);
66
72
  const uv = (0, react_1.useMemo)(() => {
67
73
  if (parsed === null || outline.dimensions === null) {
68
74
  return null;
@@ -73,7 +79,22 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
73
79
  height: outline.dimensions.height,
74
80
  });
75
81
  }, [outline.dimensions, parsed]);
76
- const position = (0, react_1.useMemo)(() => (uv === null ? null : (0, selected_outline_uv_1.getUvHandlePosition)(transformOriginPoints, uv)), [transformOriginPoints, uv]);
82
+ const position = (0, react_1.useMemo)(() => {
83
+ if (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation) {
84
+ return (0, selected_outline_measurement_1.getSelectedOutlineRotationPivot)({
85
+ dimensions: outline.dimensions,
86
+ points: transformOriginPoints,
87
+ transformOriginValue: layoutTarget.transformOriginValue,
88
+ });
89
+ }
90
+ return uv === null ? null : (0, selected_outline_uv_1.getUvHandlePosition)(transformOriginPoints, uv);
91
+ }, [
92
+ layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation,
93
+ layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.transformOriginValue,
94
+ outline.dimensions,
95
+ transformOriginPoints,
96
+ uv,
97
+ ]);
77
98
  const onPointerDown = react_1.default.useCallback((event) => {
78
99
  if (event.button !== 0 ||
79
100
  transformOriginDrag === null ||
@@ -88,7 +109,7 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
88
109
  if (svg === null) {
89
110
  return;
90
111
  }
91
- const rotation = (0, selected_outline_drag_1.parseCssRotationToRadians)(transformOriginDrag.rotateValue);
112
+ const rotation = (0, timeline_rotation_utils_1.parseCssRotation)(transformOriginDrag.rotateValue);
92
113
  if (rotation === null) {
93
114
  return;
94
115
  }
@@ -96,7 +117,7 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
96
117
  if (dimensions === null) {
97
118
  return;
98
119
  }
99
- const [scaleX, scaleY] = no_react_1.NoReactInternals.parseScaleValue(transformOriginDrag.scaleValue);
120
+ const scale = no_react_1.NoReactInternals.parseScaleValue(transformOriginDrag.scaleValue);
100
121
  const startTranslate = (0, timeline_translate_utils_1.parseTranslate)(transformOriginDrag.translateValue);
101
122
  const svgRect = svg.getBoundingClientRect();
102
123
  let last = null;
@@ -144,16 +165,20 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
144
165
  (nextUv[1] - uv[1]) * dimensions.height,
145
166
  ];
146
167
  const [nextTranslateX, nextTranslateY] = (0, selected_outline_drag_1.compensateTranslateForTransformOrigin)({
147
- startTranslate,
168
+ startTranslate: [startTranslate[0], startTranslate[1]],
148
169
  deltaOrigin,
149
- rotate: rotation,
150
- scale: [scaleX, scaleY],
170
+ rotation,
171
+ scale,
151
172
  });
152
173
  const origin = (0, transform_origin_utils_1.serializeTransformOrigin)({
153
174
  uv: nextUv,
154
175
  z: parsed.z,
155
176
  });
156
- const translate = (0, timeline_translate_utils_1.serializeTranslate)(nextTranslateX, nextTranslateY);
177
+ const translate = (0, timeline_translate_utils_1.serializeTranslate)([
178
+ nextTranslateX,
179
+ nextTranslateY,
180
+ startTranslate[2],
181
+ ]);
157
182
  last = { uv: nextUv, origin, translate };
158
183
  setDragOverrides(transformOriginDrag.nodePath, selected_outline_types_1.transformOriginFieldKey, transformOriginDrag.originPropStatus.status === 'keyframed'
159
184
  ? remotion_1.Internals.makeKeyframedDragOverride({
@@ -177,11 +202,15 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
177
202
  const keyframeTranslate = (0, timeline_translate_utils_1.parseTranslate)(String(keyframe.value));
178
203
  return {
179
204
  ...keyframe,
180
- value: (0, timeline_translate_utils_1.serializeTranslate)(keyframeTranslate[0] +
181
- nextTranslateX -
182
- startTranslate[0], keyframeTranslate[1] +
183
- nextTranslateY -
184
- startTranslate[1]),
205
+ value: (0, timeline_translate_utils_1.serializeTranslate)([
206
+ keyframeTranslate[0] +
207
+ nextTranslateX -
208
+ startTranslate[0],
209
+ keyframeTranslate[1] +
210
+ nextTranslateY -
211
+ startTranslate[1],
212
+ keyframeTranslate[2],
213
+ ]),
185
214
  };
186
215
  }),
187
216
  },
@@ -250,9 +279,9 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
250
279
  clearDragOverrides(transformOriginDrag.nodePath);
251
280
  });
252
281
  };
253
- (0, pointer_session_1.startPointerSession)({
282
+ (0, pointer_session_1.startCapturedPointerSession)({
254
283
  event,
255
- target: event.currentTarget,
284
+ captureTarget: event.currentTarget,
256
285
  onMove: onPointerMove,
257
286
  onEnd: onPointerUp,
258
287
  });
@@ -271,13 +300,10 @@ const SelectedOutlineTransformOriginHandle = ({ getLatestTargetByKey, layoutTarg
271
300
  transformOriginPoints,
272
301
  uv,
273
302
  ]);
274
- if (transformOriginDrag === null ||
275
- parsed === null ||
276
- uv === null ||
277
- position === null) {
303
+ if (position === null) {
278
304
  return null;
279
305
  }
280
- return (jsx_runtime_1.jsxs("g", { pointerEvents: "all", cursor: "crosshair", onPointerDown: onPointerDown, "aria-hidden": "true", style: {
306
+ return (jsx_runtime_1.jsxs("g", { "data-remotion-studio-transform-origin-handle": true, pointerEvents: transformOriginDrag === null ? 'none' : 'all', cursor: transformOriginDrag === null ? undefined : 'crosshair', onPointerDown: onPointerDown, "aria-hidden": "true", style: {
281
307
  filter: colors_1.SELECTED_OUTLINE_DROP_SHADOW,
282
308
  }, children: [
283
309
  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" })
@@ -236,9 +236,9 @@ const SelectedUvEllipseStartHandle = ({ control, onDraggingChange, outline }) =>
236
236
  sourceFrame: control.handle.sourceFrame,
237
237
  });
238
238
  };
239
- (0, pointer_session_1.startPointerSession)({
239
+ (0, pointer_session_1.startCapturedPointerSession)({
240
240
  event,
241
- target: event.currentTarget,
241
+ captureTarget: event.currentTarget,
242
242
  onMove: onPointerMove,
243
243
  onEnd: onPointerUp,
244
244
  });
@@ -336,9 +336,9 @@ const SelectedUvEllipseResizeHandle = ({ axis, control, onDraggingChange, outlin
336
336
  sourceFrame: control.handle.sourceFrame,
337
337
  });
338
338
  };
339
- (0, pointer_session_1.startPointerSession)({
339
+ (0, pointer_session_1.startCapturedPointerSession)({
340
340
  event,
341
- target: event.currentTarget,
341
+ captureTarget: event.currentTarget,
342
342
  onMove: onPointerMove,
343
343
  onEnd: onPointerUp,
344
344
  });
@@ -491,9 +491,9 @@ const SelectedUvEllipseRotationHandle = ({ control, onDraggingChange }) => {
491
491
  sourceFrame: control.handle.sourceFrame,
492
492
  });
493
493
  };
494
- (0, pointer_session_1.startPointerSession)({
494
+ (0, pointer_session_1.startCapturedPointerSession)({
495
495
  event,
496
- target: event.currentTarget,
496
+ captureTarget: event.currentTarget,
497
497
  onMove: onPointerMove,
498
498
  onEnd: onPointerUp,
499
499
  });
@@ -645,9 +645,9 @@ const SelectedUvHandleCircle = ({ handle, nodePathInfo, onDraggingChange, onSele
645
645
  clearEffectDragOverrides(handle.nodePath, handle.effectIndex);
646
646
  });
647
647
  };
648
- (0, pointer_session_1.startPointerSession)({
648
+ (0, pointer_session_1.startCapturedPointerSession)({
649
649
  event,
650
- target: event.currentTarget,
650
+ captureTarget: event.currentTarget,
651
651
  onMove: onPointerMove,
652
652
  onEnd: onPointerUp,
653
653
  });
@@ -35,6 +35,14 @@ const SequencePropsSubscriptionProvider = ({ children }) => {
35
35
  const setOverrideIdToNodePath = (0, react_1.useCallback)((overrideId, state) => {
36
36
  setOverrideIdToNodePathMap((prev) => {
37
37
  const existing = prev[overrideId];
38
+ if (state === null) {
39
+ if (!existing) {
40
+ return prev;
41
+ }
42
+ const next = { ...prev };
43
+ delete next[overrideId];
44
+ return next;
45
+ }
38
46
  if (existing && existing === state) {
39
47
  return prev;
40
48
  }
@@ -38,7 +38,7 @@ const SettingsModalFooter = () => {
38
38
  };
39
39
  }, []);
40
40
  return (jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { style: footer, noBorder: true, children: jsx_runtime_1.jsx("div", { style: footerRow, children: jsx_runtime_1.jsxs("div", { style: configFileHint, children: ["Changes save to",
41
- jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }) })
41
+ jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { locationType: null, location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }) })
42
42
  ] }) }) }));
43
43
  };
44
44
  exports.SettingsModalFooter = SettingsModalFooter;
@@ -96,9 +96,9 @@ const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
96
96
  }
97
97
  }
98
98
  };
99
- endDrag = (0, pointer_session_1.startPointerSession)({
99
+ endDrag = (0, pointer_session_1.startCapturedPointerSession)({
100
100
  event: e,
101
- target: current,
101
+ captureTarget: current,
102
102
  onMove: onPointerMove,
103
103
  onEnd: (reason, endEvent) => {
104
104
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -5,6 +5,8 @@ export declare const Tabs: React.FC<{
5
5
  }>;
6
6
  export declare const Tab: React.FC<{
7
7
  readonly children: React.ReactNode;
8
+ readonly onDragEnter?: React.DragEventHandler<HTMLDivElement>;
9
+ readonly onDragLeave?: React.DragEventHandler<HTMLDivElement>;
8
10
  readonly onClick: React.MouseEventHandler<HTMLDivElement>;
9
11
  readonly style?: React.CSSProperties;
10
12
  readonly selected: boolean;
@@ -34,7 +34,7 @@ const selectorButton = {
34
34
  userSelect: 'none',
35
35
  WebkitUserSelect: 'none',
36
36
  };
37
- const Tab = ({ children, onClick, style, selected }) => {
37
+ const Tab = ({ children, onClick, onDragEnter, onDragLeave, style, selected }) => {
38
38
  const [hovered, setHovered] = (0, react_1.useState)(false);
39
39
  const { tabIndex } = (0, z_index_1.useZIndex)();
40
40
  const onPointerEnter = (0, react_1.useCallback)(() => {
@@ -55,6 +55,6 @@ const Tab = ({ children, onClick, style, selected }) => {
55
55
  boxShadow: selected ? 'none' : undefined,
56
56
  ...style,
57
57
  }), [hovered, selected, style]);
58
- return (jsx_runtime_1.jsx("div", { style: definiteStyle, role: "button", onClick: onClick, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: children }));
58
+ return (jsx_runtime_1.jsx("div", { style: definiteStyle, role: "button", onClick: onClick, onDragEnter: onDragEnter, onDragLeave: onDragLeave, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: children }));
59
59
  };
60
60
  exports.Tab = Tab;
@@ -681,9 +681,9 @@ const EasingEditor = ({ state, renderHeader }) => {
681
681
  const bezierBeforeDrag = [...bezierRef.current];
682
682
  setActiveHandle(handle);
683
683
  updateHandleFromPointer(handle, event);
684
- (0, pointer_session_1.startPointerSession)({
684
+ (0, pointer_session_1.startCapturedPointerSession)({
685
685
  event,
686
- target: event.currentTarget,
686
+ captureTarget: event.currentTarget,
687
687
  onMove: (moveEvent) => {
688
688
  updateHandleFromPointer(handle, moveEvent);
689
689
  },