@remotion/studio 4.0.507 → 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 (130) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/components/CodingAgentIcon.d.ts +3 -1
  3. package/dist/components/CodingAgentIcon.js +4 -9
  4. package/dist/components/ConfigureDefaultEditorModal.js +1 -1
  5. package/dist/components/ContextMenu.d.ts +1 -0
  6. package/dist/components/ContextMenu.js +32 -5
  7. package/dist/components/EditorContent.js +4 -3
  8. package/dist/components/InlineAction.d.ts +2 -1
  9. package/dist/components/InlineAction.js +3 -3
  10. package/dist/components/InspectorLocationCopy.js +1 -1
  11. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  12. package/dist/components/InspectorOpenInEditor.js +44 -3
  13. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  14. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  15. package/dist/components/InspectorPanel/styles.js +1 -1
  16. package/dist/components/InspectorSequenceSection.js +36 -4
  17. package/dist/components/MenuBuildIndicator.js +1 -1
  18. package/dist/components/PlayPause.d.ts +1 -1
  19. package/dist/components/PlayPause.js +61 -12
  20. package/dist/components/RenderButton.js +16 -12
  21. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  22. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  23. package/dist/components/RenderModal/InfoBubble.js +6 -4
  24. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  25. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  26. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  27. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  28. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  29. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  30. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  31. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  32. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  33. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  34. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  35. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  36. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  37. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  38. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  39. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +6 -1
  40. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  41. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  42. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  43. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  44. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  45. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  46. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  47. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  48. package/dist/components/SelectedOutlineCanvasRotation.js +237 -0
  49. package/dist/components/SelectedOutlineElement.d.ts +2 -1
  50. package/dist/components/SelectedOutlineElement.js +36 -5
  51. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  52. package/dist/components/SelectedOutlineOverlay.js +55 -26
  53. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  54. package/dist/components/SelectedOutlinePolygon.js +4 -3
  55. package/dist/components/SelectedOutlineRenderer.d.ts +1 -0
  56. package/dist/components/SelectedOutlineRenderer.js +24 -7
  57. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +1 -0
  58. package/dist/components/SelectedOutlineRotationCornerHandle.js +7 -5
  59. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +1 -0
  60. package/dist/components/SelectedOutlineScaleEdgeLine.js +9 -5
  61. package/dist/components/SelectedOutlineTransformOriginHandle.js +48 -22
  62. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  63. package/dist/components/SettingsModalFooter.js +1 -1
  64. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  65. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  66. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  67. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  68. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  69. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  70. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  71. package/dist/components/Timeline/TimelineSelection.js +45 -2
  72. package/dist/components/Timeline/TimelineSequenceItem.js +42 -1
  73. package/dist/components/Timeline/TimelineSequencePropItem.js +5 -2
  74. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  75. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  76. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  77. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  78. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  79. package/dist/components/Timeline/get-sequence-context-menu-items.js +13 -6
  80. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  81. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  82. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  83. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  84. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  85. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  86. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  87. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  88. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  89. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  90. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  91. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  92. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  93. package/dist/components/Timeline/use-open-sequence-in-apps.js +1 -1
  94. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  95. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +45 -9
  96. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  97. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  98. package/dist/components/call-api.js +2 -0
  99. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  100. package/dist/components/canvas-rotation-cursor.js +14 -0
  101. package/dist/components/get-open-in-menu-items.d.ts +6 -1
  102. package/dist/components/get-open-in-menu-items.js +69 -8
  103. package/dist/components/selected-outline-drag.d.ts +11 -5
  104. package/dist/components/selected-outline-drag.js +80 -42
  105. package/dist/components/selected-outline-measurement.d.ts +5 -0
  106. package/dist/components/selected-outline-measurement.js +28 -1
  107. package/dist/components/selected-outline-types.d.ts +6 -0
  108. package/dist/esm/{chunk-ptnd65a9.js → chunk-zpn4m49r.js} +8458 -6911
  109. package/dist/esm/index.mjs +357 -2
  110. package/dist/esm/internals.mjs +8458 -6911
  111. package/dist/esm/previewEntry.mjs +8363 -6816
  112. package/dist/esm/renderEntry.mjs +1 -1
  113. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  114. package/dist/helpers/open-in-editor.d.ts +3 -1
  115. package/dist/helpers/open-in-editor.js +5 -1
  116. package/dist/helpers/preview-server-events.js +4 -0
  117. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  118. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  119. package/dist/icons/cube.d.ts +4 -0
  120. package/dist/icons/cube.js +6 -0
  121. package/dist/icons/finder.d.ts +4 -0
  122. package/dist/icons/finder.js +8 -0
  123. package/dist/icons/terminal.d.ts +6 -0
  124. package/dist/icons/terminal.js +46 -0
  125. package/dist/index.d.ts +15 -0
  126. package/dist/index.js +8 -0
  127. package/dist/state/transform-3d-mode.d.ts +10 -0
  128. package/dist/state/transform-3d-mode.js +27 -0
  129. package/dist/state/z-index.js +5 -8
  130. package/package.json +12 -12
@@ -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
  });
@@ -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);
@@ -10,6 +10,7 @@ export declare const SelectedOutlineRotationCornerHandle: React.FC<{
10
10
  readonly outline: SelectedOutline;
11
11
  readonly onDraggingChange: (dragging: boolean) => void;
12
12
  readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
13
+ readonly onContextMenuOpenChange: (open: boolean) => void;
13
14
  readonly onHoverChange: (key: string | null) => void;
14
15
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
15
16
  readonly target: SelectedOutlineTarget | undefined;
@@ -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, outline, onDraggingChange, onContextMenuOpen, onContextMenuOpenChange, onHoverChange, onSelect, 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,
@@ -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: 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, "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;
@@ -10,6 +10,7 @@ export declare const SelectedOutlineScaleEdgeLine: React.FC<{
10
10
  readonly outline: SelectedOutline;
11
11
  readonly onDraggingChange: (dragging: boolean) => void;
12
12
  readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
13
+ readonly onContextMenuOpenChange: (open: boolean) => void;
13
14
  readonly onHoverChange: (key: string | null) => void;
14
15
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
15
16
  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, 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
  }
@@ -182,6 +185,7 @@ const SelectedOutlineScaleEdgeLine = ({ getAllScaleDragTargets, dragging, edge,
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: 12, 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
  },
@@ -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" })
@@ -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;
@@ -3,10 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SequencePropsObserver = void 0;
4
4
  const react_1 = require("react");
5
5
  const remotion_1 = require("remotion");
6
+ const fast_refresh_context_1 = require("../../fast-refresh-context");
6
7
  const client_id_1 = require("../../helpers/client-id");
8
+ const sequence_node_path_mutations_1 = require("../../helpers/sequence-node-path-mutations");
9
+ const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
7
10
  const SequencePropsObserver = () => {
8
11
  const { subscribeToEvent } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
9
- const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
12
+ const { remapPropStatuses, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
13
+ const propStatusesRef = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesRefContext);
14
+ const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
15
+ const overrideIdToNodePathMappingsRef = (0, react_1.useRef)(overrideIdToNodePathMappings);
16
+ overrideIdToNodePathMappingsRef.current = overrideIdToNodePathMappings;
17
+ const { setOverrideIdToNodePath } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsSettersContext);
18
+ const { fastRefreshes } = (0, react_1.useContext)(fast_refresh_context_1.FastRefreshContext);
19
+ const { migrateExpandedTracksForSubscriptionKey } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
10
20
  (0, react_1.useEffect)(() => {
11
21
  const handleEvent = (event) => {
12
22
  if (event.type !== 'sequence-props-updated') {
@@ -19,6 +29,92 @@ const SequencePropsObserver = () => {
19
29
  unsubscribe();
20
30
  };
21
31
  }, [setPropStatuses, subscribeToEvent]);
32
+ (0, react_1.useLayoutEffect)(() => {
33
+ var _a;
34
+ const mutations = (0, sequence_node_path_mutations_1.takePendingSequenceNodePathMutations)();
35
+ if (mutations.length === 0) {
36
+ return;
37
+ }
38
+ const statusRemappings = [];
39
+ const overrideUpdates = [];
40
+ for (const [overrideId, previousNodePath] of Object.entries(overrideIdToNodePathMappingsRef.current)) {
41
+ let { nodePath } = previousNodePath;
42
+ let wasRemapped = false;
43
+ let wasDeleted = false;
44
+ let runtimeNodePathExists = true;
45
+ const previousNodePathString = JSON.stringify(previousNodePath.nodePath);
46
+ for (const mutation of mutations) {
47
+ for (const file of mutation.files) {
48
+ if (file.absolutePath !== previousNodePath.absolutePath) {
49
+ continue;
50
+ }
51
+ // Prop statuses follow source nodes to their new paths. Override IDs,
52
+ // however, follow React's runtime instances. After deleting an unkeyed
53
+ // sibling, React reuses the instance already at the destination path.
54
+ // Keep that mapping in place and only remove mappings for vacated paths.
55
+ const runtimeNodePathIsSource = file.remappings.some((item) => JSON.stringify(item.oldNodePath) === previousNodePathString);
56
+ const runtimeNodePathIsDestination = file.remappings.some((item) => item.newNodePath !== null &&
57
+ JSON.stringify(item.newNodePath) === previousNodePathString);
58
+ const runtimeNodePathWasRestored = file.restoredNodePaths.some((item) => JSON.stringify(item) === previousNodePathString);
59
+ if (runtimeNodePathIsSource) {
60
+ runtimeNodePathExists =
61
+ runtimeNodePathIsDestination || runtimeNodePathWasRestored;
62
+ }
63
+ else if (runtimeNodePathIsDestination ||
64
+ runtimeNodePathWasRestored) {
65
+ runtimeNodePathExists = true;
66
+ }
67
+ if (wasDeleted) {
68
+ const wasRestored = file.restoredNodePaths.some((restoredNodePath) => JSON.stringify(restoredNodePath) === JSON.stringify(nodePath));
69
+ if (wasRestored) {
70
+ wasDeleted = false;
71
+ }
72
+ continue;
73
+ }
74
+ const remapping = file.remappings.find((item) => JSON.stringify(item.oldNodePath) === JSON.stringify(nodePath));
75
+ if (!remapping) {
76
+ continue;
77
+ }
78
+ wasRemapped = true;
79
+ if (remapping.newNodePath === null) {
80
+ wasDeleted = true;
81
+ continue;
82
+ }
83
+ nodePath = remapping.newNodePath;
84
+ }
85
+ }
86
+ if (!wasRemapped) {
87
+ continue;
88
+ }
89
+ const nextNodePath = wasDeleted ? null : { ...previousNodePath, nodePath };
90
+ const previousStatusKey = remotion_1.Internals.makeSequencePropsSubscriptionKey(previousNodePath);
91
+ statusRemappings.push({
92
+ previousNodePath,
93
+ nodePath: nextNodePath,
94
+ result: (_a = propStatusesRef.current[previousStatusKey]) !== null && _a !== void 0 ? _a : null,
95
+ });
96
+ overrideUpdates.push({
97
+ overrideId,
98
+ nodePath: runtimeNodePathExists ? previousNodePath : null,
99
+ });
100
+ }
101
+ remapPropStatuses(statusRemappings);
102
+ for (const event of overrideUpdates) {
103
+ setOverrideIdToNodePath(event.overrideId, event.nodePath);
104
+ }
105
+ for (const event of statusRemappings) {
106
+ if (event.nodePath === null) {
107
+ continue;
108
+ }
109
+ migrateExpandedTracksForSubscriptionKey(event.previousNodePath, event.nodePath);
110
+ }
111
+ }, [
112
+ fastRefreshes,
113
+ migrateExpandedTracksForSubscriptionKey,
114
+ propStatusesRef,
115
+ remapPropStatuses,
116
+ setOverrideIdToNodePath,
117
+ ]);
22
118
  return null;
23
119
  };
24
120
  exports.SequencePropsObserver = SequencePropsObserver;
@@ -6,7 +6,7 @@ const no_react_1 = require("remotion/no-react");
6
6
  const use_resolved_stack_react_to_change_1 = require("./use-resolved-stack-react-to-change");
7
7
  const use_sequence_props_subscription_1 = require("./use-sequence-props-subscription");
8
8
  const SubscribeToNodePaths = ({ overrideId, componentIdentity, schema, getStack, effects }) => {
9
- const originalLocation = (0, use_resolved_stack_react_to_change_1.useResolveStackAndReactToChange)(getStack);
9
+ const { resolvedLocation, stack, preferMappedNodePath } = (0, use_resolved_stack_react_to_change_1.useResolveStackAndReactToChange)(getStack);
10
10
  const effectSubscriptions = (0, react_1.useMemo)(() => {
11
11
  return effects
12
12
  .map((effect) => {
@@ -19,7 +19,9 @@ const SubscribeToNodePaths = ({ overrideId, componentIdentity, schema, getStack,
19
19
  componentIdentity,
20
20
  schema,
21
21
  effects: effectSubscriptions,
22
- originalLocation,
22
+ originalLocation: resolvedLocation,
23
+ preferMappedNodePath,
24
+ stack,
23
25
  });
24
26
  return null;
25
27
  };
@@ -109,10 +109,7 @@ const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, do
109
109
  effectIndex,
110
110
  },
111
111
  ]);
112
- if (result.success) {
113
- (0, NotificationCenter_1.showNotification)('Removed effect from source file', 2000);
114
- }
115
- else {
112
+ if (!result.success) {
116
113
  (0, NotificationCenter_1.showNotification)(result.reason, 4000);
117
114
  }
118
115
  }
@@ -2,13 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TimelineFieldRowContent = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
5
6
  const timeline_field_row_layout_1 = require("./timeline-field-row-layout");
6
7
  const TimelineFieldLabel_1 = require("./TimelineFieldLabel");
8
+ const Transform3DModeContext_1 = require("./Transform3DModeContext");
7
9
  const TimelineFieldRowContent = ({ field, rowDepth, selected, children }) => {
8
10
  var _a;
9
- const label = (jsx_runtime_1.jsx(TimelineFieldLabel_1.TimelineFieldLabel, { rowDepth: rowDepth, selected: selected, label: (_a = field.description) !== null && _a !== void 0 ? _a : field.key, stacked: field.typeName === 'text-content' }));
10
- const value = jsx_runtime_1.jsx("div", { style: timeline_field_row_layout_1.timelineFieldValueColumnStyle, children: children });
11
- if (field.typeName === 'text-content') {
11
+ const transform3DMode = (0, react_1.useContext)(Transform3DModeContext_1.Transform3DModeContext);
12
+ const stacked = (0, timeline_field_row_layout_1.isTimelineFieldStacked)({ field, transform3DMode });
13
+ const compactStacked = stacked && field.typeName !== 'text-content';
14
+ const label = (jsx_runtime_1.jsx(TimelineFieldLabel_1.TimelineFieldLabel, { rowDepth: rowDepth, selected: selected, label: (_a = field.description) !== null && _a !== void 0 ? _a : field.key, stacked: stacked }));
15
+ const value = (jsx_runtime_1.jsx("div", { style: compactStacked
16
+ ? timeline_field_row_layout_1.timelineCompactStackedFieldValueColumnStyle
17
+ : timeline_field_row_layout_1.timelineFieldValueColumnStyle, children: children }));
18
+ if (stacked) {
12
19
  return (jsx_runtime_1.jsxs("div", { style: timeline_field_row_layout_1.timelineStackedFieldContentStyle, children: [label, value] }));
13
20
  }
14
21
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [label, value] }));