@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
@@ -10,11 +10,16 @@ const InputDragger_1 = require("../NewComposition/InputDragger");
10
10
  const timeline_field_display_utils_1 = require("./timeline-field-display-utils");
11
11
  const timeline_field_utils_1 = require("./timeline-field-utils");
12
12
  const TimelineLayerEye_1 = require("./TimelineLayerEye");
13
+ const Transform3DModeContext_1 = require("./Transform3DModeContext");
13
14
  const leftDraggerStyle = {
15
+ paddingBottom: 2,
14
16
  paddingLeft: 0,
17
+ paddingTop: 2,
15
18
  };
16
19
  const rightDraggerStyle = {
20
+ paddingBottom: 2,
17
21
  paddingRight: 0,
22
+ paddingTop: 2,
18
23
  };
19
24
  const containerStyle = {
20
25
  alignItems: 'center',
@@ -82,9 +87,12 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
82
87
  var _a, _b;
83
88
  const [dragX, setDragX] = (0, react_1.useState)(null);
84
89
  const [dragY, setDragY] = (0, react_1.useState)(null);
90
+ const [dragZ, setDragZ] = (0, react_1.useState)(null);
85
91
  const dragStartRef = (0, react_1.useRef)(null);
86
92
  const { getScaleLockState, setScaleLockState } = (0, react_1.useContext)(scale_lock_1.ScaleLockContext);
93
+ const transform3DMode = (0, react_1.useContext)(Transform3DModeContext_1.Transform3DModeContext);
87
94
  const [codeX, codeY, codeZ] = (0, react_1.useMemo)(() => no_react_1.NoReactInternals.parseScaleValue(effectiveValue), [effectiveValue]);
95
+ const show3D = transform3DMode || codeZ !== 1;
88
96
  const defaultLinked = codeX === codeY;
89
97
  const linked = getScaleLockState({
90
98
  nodePath: scaleLockNodePath,
@@ -111,9 +119,9 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
111
119
  }
112
120
  return dragStartRef.current;
113
121
  }, [codeX, codeY, dragX, dragY]);
114
- const serialize = (0, react_1.useCallback)((x, y) => {
115
- return no_react_1.NoReactInternals.serializeScaleValue([x, y, codeZ]);
116
- }, [codeZ]);
122
+ const serialize = (0, react_1.useCallback)((x, y, z = dragZ !== null && dragZ !== void 0 ? dragZ : codeZ) => {
123
+ return no_react_1.NoReactInternals.serializeScaleValue([x, y, z]);
124
+ }, [codeZ, dragZ]);
117
125
  const onXChange = (0, react_1.useCallback)((newVal) => {
118
126
  if (linked) {
119
127
  const [baseX, baseY] = getDragStart();
@@ -161,6 +169,7 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
161
169
  dragStartRef.current = null;
162
170
  setDragX(null);
163
171
  setDragY(null);
172
+ setDragZ(null);
164
173
  onDragEnd();
165
174
  };
166
175
  if (!valuesEqual(newScale, propStatus.codeValue)) {
@@ -204,6 +213,7 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
204
213
  dragStartRef.current = null;
205
214
  setDragX(null);
206
215
  setDragY(null);
216
+ setDragZ(null);
207
217
  });
208
218
  }
209
219
  }, [codeX, codeY, dragY, linked, max, min, onSave, propStatus, serialize]);
@@ -254,6 +264,7 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
254
264
  dragStartRef.current = null;
255
265
  setDragX(null);
256
266
  setDragY(null);
267
+ setDragZ(null);
257
268
  onDragEnd();
258
269
  };
259
270
  if (!valuesEqual(newScale, propStatus.codeValue)) {
@@ -297,6 +308,7 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
297
308
  dragStartRef.current = null;
298
309
  setDragX(null);
299
310
  setDragY(null);
311
+ setDragZ(null);
300
312
  });
301
313
  }
302
314
  }, [codeX, codeY, dragX, linked, max, min, onSave, propStatus, serialize]);
@@ -307,8 +319,50 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
307
319
  linked: !linked,
308
320
  });
309
321
  }, [field.key, linked, scaleLockNodePath, setScaleLockState]);
322
+ const onZChange = (0, react_1.useCallback)((newVal) => {
323
+ setDragZ(newVal);
324
+ onDragValueChange(serialize(dragX !== null && dragX !== void 0 ? dragX : codeX, dragY !== null && dragY !== void 0 ? dragY : codeY, newVal));
325
+ }, [codeX, codeY, dragX, dragY, onDragValueChange, serialize]);
326
+ const onZChangeEnd = (0, react_1.useCallback)((newVal) => {
327
+ const newScale = serialize(dragX !== null && dragX !== void 0 ? dragX : codeX, dragY !== null && dragY !== void 0 ? dragY : codeY, newVal);
328
+ const clearDragState = () => {
329
+ dragStartRef.current = null;
330
+ setDragX(null);
331
+ setDragY(null);
332
+ setDragZ(null);
333
+ onDragEnd();
334
+ };
335
+ if (!valuesEqual(newScale, propStatus.codeValue)) {
336
+ onSave(newScale).finally(clearDragState);
337
+ }
338
+ else {
339
+ clearDragState();
340
+ }
341
+ }, [
342
+ codeX,
343
+ codeY,
344
+ dragX,
345
+ dragY,
346
+ onDragEnd,
347
+ onSave,
348
+ propStatus.codeValue,
349
+ serialize,
350
+ ]);
351
+ const onZTextChange = (0, react_1.useCallback)((newVal) => {
352
+ const parsed = Number(newVal);
353
+ if (Number.isNaN(parsed)) {
354
+ return;
355
+ }
356
+ const newScale = serialize(dragX !== null && dragX !== void 0 ? dragX : codeX, dragY !== null && dragY !== void 0 ? dragY : codeY, parsed);
357
+ if (!valuesEqual(newScale, propStatus.codeValue)) {
358
+ setDragZ(parsed);
359
+ onSave(newScale).finally(() => setDragZ(null));
360
+ }
361
+ }, [codeX, codeY, dragX, dragY, onSave, propStatus.codeValue, serialize]);
310
362
  return (jsx_runtime_1.jsxs("span", { style: containerStyle, children: [
311
- jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragX !== null && dragX !== void 0 ? dragX : codeX, style: leftDraggerStyle, status: "ok", small: true, onValueChange: onXChange, onValueChangeEnd: onXChangeEnd, onTextChange: onXTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false, allowStepMismatch: true }), jsx_runtime_1.jsx("div", { style: gapStyle }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragY !== null && dragY !== void 0 ? dragY : codeY, style: rightDraggerStyle, status: "ok", small: true, onValueChange: onYChange, onValueChangeEnd: onYChangeEnd, onTextChange: onYTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false, allowStepMismatch: true }), jsx_runtime_1.jsx(LinkToggle, { linked: linked, onToggle: onToggleLink })
363
+ jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragX !== null && dragX !== void 0 ? dragX : codeX, buttonStyle: leftDraggerStyle, style: leftDraggerStyle, status: "ok", small: true, onValueChange: onXChange, onValueChangeEnd: onXChangeEnd, onTextChange: onXTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false, allowStepMismatch: true, "aria-label": "Scale X" }), jsx_runtime_1.jsx("div", { style: gapStyle }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragY !== null && dragY !== void 0 ? dragY : codeY, buttonStyle: rightDraggerStyle, style: rightDraggerStyle, status: "ok", small: true, onValueChange: onYChange, onValueChangeEnd: onYChangeEnd, onTextChange: onYTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false, allowStepMismatch: true, "aria-label": "Scale Y" }), show3D ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
364
+ jsx_runtime_1.jsx("div", { style: gapStyle }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragZ !== null && dragZ !== void 0 ? dragZ : codeZ, buttonStyle: rightDraggerStyle, style: rightDraggerStyle, status: "ok", small: true, onValueChange: onZChange, onValueChangeEnd: onZChangeEnd, onTextChange: onZTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false, allowStepMismatch: true, "aria-label": "Scale Z" })
365
+ ] })) : null, jsx_runtime_1.jsx(LinkToggle, { linked: linked, onToggle: onToggleLink })
312
366
  ] }));
313
367
  };
314
368
  exports.TimelineScaleField = TimelineScaleField;
@@ -161,6 +161,10 @@ export declare const getTimelineSequenceSelectionKey: (nodePathInfo: SequenceNod
161
161
  export declare const TimelineSelectAllKeybindings: React.FC<{
162
162
  readonly timeline: readonly TimelineTrackData[];
163
163
  }>;
164
+ export declare const getTimelineSequenceSelectionForEscape: (selectedItems: readonly TimelineSelection[]) => {
165
+ readonly type: "sequence";
166
+ readonly nodePathInfo: SequenceNodePathInfo;
167
+ } | null;
164
168
  export declare const TimelineSelectableItemsProvider: React.FC<{
165
169
  readonly children: React.ReactNode;
166
170
  readonly timeline: readonly TimelineTrackData[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useTimelineRowHighlightBackground = exports.useTimelineRowContainsSelection = exports.useTimelineGuideSelection = exports.useTimelineEasingSelection = exports.useTimelineKeyframeSelection = exports.useTimelineRowSelection = exports.useTimelineFocusableItem = exports.useTimelineMarqueeSelectableItem = exports.useTimelineMarqueeSelection = exports.useCurrentTimelineSelectionStateAsRef = exports.TIMELINE_SCRUBBER_ATTR = exports.TIMELINE_MARQUEE_ITEM_ATTR = exports.useTimelineSelection = exports.TimelineSelectionProvider = exports.TimelineSelectableItemsProvider = exports.TimelineSelectAllKeybindings = exports.getTimelineSequenceSelectionKey = exports.getSelectableTimelineItems = exports.getSelectableTimelineSequenceSelections = exports.getTimelineSelectionKey = exports.getTimelineSelectionFromNodePathInfo = exports.TimelineSelectionOrderProvider = exports.extendTimelineMarqueeSelection = exports.getTimelineMarqueeSelection = exports.timelineMarqueeRectsIntersect = exports.getClampedTimelineMarqueePoint = exports.getNormalizedTimelineMarqueeRect = exports.getAvailableTimelineSelectionState = exports.getTimelineSelectionAfterInteraction = exports.EMPTY_TIMELINE_SELECTION_STATE = exports.shouldSelectTimelineRowOnPointerDown = exports.isTimelineSelectionModifierEvent = exports.TIMELINE_TICKS_BACKGROUND = exports.TIMELINE_BACKGROUND = exports.getTimelineRowHighlightBackground = exports.getTimelineSelectedTrackHighlightStyle = exports.getTimelineColor = exports.getTimelineSelectedLabelStyle = exports.TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = exports.TIMELINE_SELECTED_LABEL_TEXT = exports.TIMELINE_SELECTED_LABEL_BACKGROUND = exports.TIMELINE_HOVER_BACKGROUND = exports.TIMELINE_SELECTED_BACKGROUND = void 0;
3
+ exports.useTimelineRowHighlightBackground = exports.useTimelineRowContainsSelection = exports.useTimelineGuideSelection = exports.useTimelineEasingSelection = exports.useTimelineKeyframeSelection = exports.useTimelineRowSelection = exports.useTimelineFocusableItem = exports.useTimelineMarqueeSelectableItem = exports.useTimelineMarqueeSelection = exports.useCurrentTimelineSelectionStateAsRef = exports.TIMELINE_SCRUBBER_ATTR = exports.TIMELINE_MARQUEE_ITEM_ATTR = exports.useTimelineSelection = exports.TimelineSelectionProvider = exports.TimelineSelectableItemsProvider = exports.getTimelineSequenceSelectionForEscape = exports.TimelineSelectAllKeybindings = exports.getTimelineSequenceSelectionKey = exports.getSelectableTimelineItems = exports.getSelectableTimelineSequenceSelections = exports.getTimelineSelectionKey = exports.getTimelineSelectionFromNodePathInfo = exports.TimelineSelectionOrderProvider = exports.extendTimelineMarqueeSelection = exports.getTimelineMarqueeSelection = exports.timelineMarqueeRectsIntersect = exports.getClampedTimelineMarqueePoint = exports.getNormalizedTimelineMarqueeRect = exports.getAvailableTimelineSelectionState = exports.getTimelineSelectionAfterInteraction = exports.EMPTY_TIMELINE_SELECTION_STATE = exports.shouldSelectTimelineRowOnPointerDown = exports.isTimelineSelectionModifierEvent = exports.TIMELINE_TICKS_BACKGROUND = exports.TIMELINE_BACKGROUND = exports.getTimelineRowHighlightBackground = exports.getTimelineSelectedTrackHighlightStyle = exports.getTimelineColor = exports.getTimelineSelectedLabelStyle = exports.TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = exports.TIMELINE_SELECTED_LABEL_TEXT = exports.TIMELINE_SELECTED_LABEL_BACKGROUND = exports.TIMELINE_HOVER_BACKGROUND = exports.TIMELINE_SELECTED_BACKGROUND = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const studio_shared_1 = require("@remotion/studio-shared");
6
6
  const react_1 = require("react");
@@ -18,6 +18,7 @@ const options_sidebar_tabs_1 = require("../options-sidebar-tabs");
18
18
  const get_node_keyframes_1 = require("./get-node-keyframes");
19
19
  const get_timeline_easing_segments_1 = require("./get-timeline-easing-segments");
20
20
  const imperative_state_1 = require("./imperative-state");
21
+ const parse_keyframe_field_from_node_path_1 = require("./parse-keyframe-field-from-node-path");
21
22
  const timeline_expanded_filter_1 = require("./timeline-expanded-filter");
22
23
  const timeline_refs_1 = require("./timeline-refs");
23
24
  const TimelineClipboardKeybindings_1 = require("./TimelineClipboardKeybindings");
@@ -543,6 +544,42 @@ const TimelineSelectAllKeybindings = ({ timeline }) => {
543
544
  return null;
544
545
  };
545
546
  exports.TimelineSelectAllKeybindings = TimelineSelectAllKeybindings;
547
+ const fieldsSelectingSequenceOnEscape = new Set([
548
+ 'cropLeft',
549
+ 'cropRight',
550
+ 'cropTop',
551
+ 'cropBottom',
552
+ 'style.rotate',
553
+ ]);
554
+ const getTimelineSequenceSelectionForEscape = (selectedItems) => {
555
+ if (selectedItems.length !== 1) {
556
+ return null;
557
+ }
558
+ const [selectedItem] = selectedItems;
559
+ let fieldKey = null;
560
+ if (selectedItem.type === 'sequence-prop') {
561
+ fieldKey = selectedItem.key;
562
+ }
563
+ else if (selectedItem.type === 'keyframe' ||
564
+ selectedItem.type === 'easing') {
565
+ const field = (0, parse_keyframe_field_from_node_path_1.parseKeyframeFieldFromNodePath)(selectedItem.nodePathInfo.auxiliaryKeys);
566
+ fieldKey = (field === null || field === void 0 ? void 0 : field.type) === 'sequence' ? field.fieldKey : null;
567
+ }
568
+ else {
569
+ return null;
570
+ }
571
+ if (!fieldsSelectingSequenceOnEscape.has(fieldKey !== null && fieldKey !== void 0 ? fieldKey : '')) {
572
+ return null;
573
+ }
574
+ return {
575
+ type: 'sequence',
576
+ nodePathInfo: {
577
+ ...selectedItem.nodePathInfo,
578
+ auxiliaryKeys: [],
579
+ },
580
+ };
581
+ };
582
+ exports.getTimelineSequenceSelectionForEscape = getTimelineSequenceSelectionForEscape;
546
583
  const TimelineEscapeKeybindings = () => {
547
584
  const keybindings = (0, use_keybinding_1.useKeybinding)();
548
585
  const currentSelection = (0, exports.useCurrentTimelineSelectionStateAsRef)();
@@ -551,10 +588,16 @@ const TimelineEscapeKeybindings = () => {
551
588
  event: 'keydown',
552
589
  key: 'Escape',
553
590
  callback: (event) => {
554
- const { selectedItems, clearSelection } = currentSelection.current;
591
+ const { selectedItems, clearSelection, selectItems } = currentSelection.current;
555
592
  if (selectedItems.length === 0) {
556
593
  return;
557
594
  }
595
+ const sequenceSelection = (0, exports.getTimelineSequenceSelectionForEscape)(selectedItems);
596
+ if (sequenceSelection) {
597
+ selectItems([sequenceSelection]);
598
+ event.preventDefault();
599
+ return;
600
+ }
558
601
  clearSelection();
559
602
  event.preventDefault();
560
603
  },
@@ -970,9 +1013,9 @@ const useTimelineMarqueeSelection = () => {
970
1013
  const onPointerMove = (moveEvent) => {
971
1014
  updateSelection(moveEvent.clientX, moveEvent.clientY);
972
1015
  };
973
- (0, pointer_session_1.startPointerSession)({
1016
+ (0, pointer_session_1.startCapturedPointerSession)({
974
1017
  event,
975
- target,
1018
+ captureTarget: target,
976
1019
  onMove: onPointerMove,
977
1020
  onEnd: (reason, endEvent) => {
978
1021
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -48,6 +48,7 @@ const use_keybinding_1 = require("../../helpers/use-keybinding");
48
48
  const use_runtime_values_1 = require("../../helpers/use-runtime-values");
49
49
  const modals_1 = require("../../state/modals");
50
50
  const timeline_sequence_hover_1 = require("../../state/timeline-sequence-hover");
51
+ const transform_3d_mode_1 = require("../../state/transform-3d-mode");
51
52
  const call_api_1 = require("../call-api");
52
53
  const CompositionOrStillIcon_1 = require("../CompositionOrStillIcon");
53
54
  const ConfirmationDialog_1 = require("../ConfirmationDialog");
@@ -139,21 +140,6 @@ const sequenceReorderAfterLine = {
139
140
  ...sequenceReorderLineBase,
140
141
  top: -1,
141
142
  };
142
- const sequenceReorderRejectionStyle = {
143
- backgroundColor: colors_1.BLACK_ALPHA_85,
144
- border: colors_1.BORDER_WHITE_ALPHA_20,
145
- borderRadius: 4,
146
- color: colors_1.WHITE,
147
- fontSize: 11,
148
- lineHeight: 1.2,
149
- maxWidth: 260,
150
- padding: '3px 6px',
151
- pointerEvents: 'none',
152
- position: 'absolute',
153
- right: 6,
154
- top: 2,
155
- zIndex: 2,
156
- };
157
143
  const hasSequenceReorderDragType = (dataTransfer) => {
158
144
  return Array.from(dataTransfer.types).includes(SEQUENCE_REORDER_MIME_TYPE);
159
145
  };
@@ -207,7 +193,6 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
207
193
  const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
208
194
  const [isRenaming, setIsRenaming] = (0, react_1.useState)(false);
209
195
  const [sequenceDropIndicator, setSequenceDropIndicator] = (0, react_1.useState)(null);
210
- const [sequenceDropRejection, setSequenceDropRejection] = (0, react_1.useState)(null);
211
196
  const { canOpenInEditor, canConfigureApps, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(sequence);
212
197
  const validatedLocation = (0, react_1.useMemo)(() => {
213
198
  var _a;
@@ -400,7 +385,6 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
400
385
  const onSequenceDragEnd = (0, react_1.useCallback)(() => {
401
386
  currentSequenceDrag = null;
402
387
  setSequenceDropIndicator(null);
403
- setSequenceDropRejection(null);
404
388
  }, []);
405
389
  const onSequenceDragOver = (0, react_1.useCallback)((e) => {
406
390
  if (!hasSequenceReorderDragType(e.dataTransfer)) {
@@ -409,12 +393,10 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
409
393
  const dropTarget = getSequenceDropTarget(e);
410
394
  if (!dropTarget) {
411
395
  setSequenceDropIndicator(null);
412
- setSequenceDropRejection(null);
413
396
  return;
414
397
  }
415
398
  if (dropTarget.type === 'invalid') {
416
399
  setSequenceDropIndicator(null);
417
- setSequenceDropRejection(dropTarget.reason);
418
400
  e.dataTransfer.dropEffect = 'none';
419
401
  return;
420
402
  }
@@ -422,14 +404,12 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
422
404
  e.stopPropagation();
423
405
  e.dataTransfer.dropEffect = 'move';
424
406
  setSequenceDropIndicator(dropTarget.position);
425
- setSequenceDropRejection(null);
426
407
  }, [getSequenceDropTarget]);
427
408
  const onSequenceDragLeave = (0, react_1.useCallback)((e) => {
428
409
  if (e.currentTarget.contains(e.relatedTarget)) {
429
410
  return;
430
411
  }
431
412
  setSequenceDropIndicator(null);
432
- setSequenceDropRejection(null);
433
413
  }, []);
434
414
  const onSequenceDrop = (0, react_1.useCallback)(async (e) => {
435
415
  if (!canReorderSequence ||
@@ -441,13 +421,11 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
441
421
  const dropTarget = getSequenceDropTarget(e);
442
422
  if (!dropTarget || dropTarget.type === 'invalid') {
443
423
  setSequenceDropIndicator(null);
444
- setSequenceDropRejection((dropTarget === null || dropTarget === void 0 ? void 0 : dropTarget.type) === 'invalid' ? dropTarget.reason : null);
445
424
  return;
446
425
  }
447
426
  e.preventDefault();
448
427
  e.stopPropagation();
449
428
  setSequenceDropIndicator(null);
450
- setSequenceDropRejection(null);
451
429
  currentSequenceDrag = null;
452
430
  try {
453
431
  const result = await (0, call_api_1.callApi)('/api/reorder-sequence', {
@@ -658,6 +636,8 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
658
636
  });
659
637
  },
660
638
  });
639
+ const canRotate = nodePathInfo !== null;
640
+ const { setManuallyEnabled } = (0, react_1.useContext)(transform_3d_mode_1.Transform3DModeStateContext);
661
641
  const onAddEffect = (0, react_1.useCallback)(() => {
662
642
  if (!canAddEffect ||
663
643
  previewServerState.type !== 'connected' ||
@@ -691,6 +671,20 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
691
671
  key: selected_outline_types_1.cropFieldKeys.left,
692
672
  }, undefined, undefined, { reveal: true });
693
673
  }, [canCrop, nodePathInfo, selectItem]);
674
+ const onRotate = (0, react_1.useCallback)(() => {
675
+ if (!canRotate || !nodePathInfo) {
676
+ return;
677
+ }
678
+ setManuallyEnabled((0, TimelineSelection_1.getTimelineSequenceSelectionKey)(nodePathInfo), true);
679
+ selectItem({
680
+ type: 'sequence-prop',
681
+ nodePathInfo: {
682
+ ...nodePathInfo,
683
+ auxiliaryKeys: ['controls', selected_outline_types_1.rotateFieldKey],
684
+ },
685
+ key: selected_outline_types_1.rotateFieldKey,
686
+ }, undefined, undefined, { reveal: true });
687
+ }, [canRotate, nodePathInfo, selectItem, setManuallyEnabled]);
694
688
  const getContextMenuItems = (0, react_1.useCallback)(() => {
695
689
  var _a;
696
690
  if (selectable) {
@@ -769,9 +763,31 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
769
763
  subMenu: null,
770
764
  value: 'crop',
771
765
  },
766
+ ]
767
+ : []),
768
+ ...(canRotate
769
+ ? [
770
+ {
771
+ type: 'item',
772
+ id: 'rotate',
773
+ keyHint: null,
774
+ label: isProgrammaticallyDuplicated
775
+ ? 'Rotate all'
776
+ : 'Rotate',
777
+ leftItem: null,
778
+ disabled: false,
779
+ onClick: onRotate,
780
+ quickSwitcherLabel: null,
781
+ subMenu: null,
782
+ value: 'rotate',
783
+ },
784
+ ]
785
+ : []),
786
+ ...(canCrop || canRotate
787
+ ? [
772
788
  {
773
789
  type: 'divider',
774
- id: 'crop-divider',
790
+ id: 'transform-controls-divider',
775
791
  },
776
792
  ]
777
793
  : []),
@@ -796,6 +812,7 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
796
812
  }, [
797
813
  canAddEffect,
798
814
  canCrop,
815
+ canRotate,
799
816
  canConfigureApps,
800
817
  canOpenInEditor,
801
818
  canRenameThisSequence,
@@ -810,6 +827,7 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
810
827
  nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.supportsEffects,
811
828
  onAddEffect,
812
829
  onCrop,
830
+ onRotate,
813
831
  onDeleteSequenceFromSource,
814
832
  onDisableSequenceInteractivity,
815
833
  onDuplicateSequenceFromSource,
@@ -896,7 +914,7 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
896
914
  " ",
897
915
  jsx_runtime_1.jsx(TimelineMediaInfo_1.TimelineMediaInfo, { src: mediaSrc })
898
916
  ] })) : null] }) }));
899
- const draggableTrackRow = canHandleSequenceDrag ? (jsx_runtime_1.jsxs("div", { draggable: canReorderSequence, onDragStart: onSequenceDragStart, onDragEnd: onSequenceDragEnd, onDragOver: onSequenceDragOver, onDragLeave: onSequenceDragLeave, onDrop: onSequenceDrop, style: sequenceReorderWrapper, children: [sequenceReorderLineStyle ? (jsx_runtime_1.jsx("div", { style: sequenceReorderLineStyle })) : null, sequenceDropRejection ? (jsx_runtime_1.jsx("div", { style: sequenceReorderRejectionStyle, children: sequenceDropRejection })) : null, trackRow] })) : (trackRow);
917
+ const draggableTrackRow = canHandleSequenceDrag ? (jsx_runtime_1.jsxs("div", { draggable: canReorderSequence, onDragStart: onSequenceDragStart, onDragEnd: onSequenceDragEnd, onDragOver: onSequenceDragOver, onDragLeave: onSequenceDragLeave, onDrop: onSequenceDrop, style: sequenceReorderWrapper, children: [sequenceReorderLineStyle ? (jsx_runtime_1.jsx("div", { style: sequenceReorderLineStyle })) : null, trackRow] })) : (trackRow);
900
918
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: draggableTrackRow })) : (draggableTrackRow), previewConnected &&
901
919
  (0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
902
920
  isExpanded &&
@@ -45,6 +45,7 @@ const InspectorPanelLayout_1 = require("../InspectorPanelLayout");
45
45
  const call_add_keyframe_1 = require("./call-add-keyframe");
46
46
  const get_sequence_prop_reset_changes_1 = require("./get-sequence-prop-reset-changes");
47
47
  const save_sequence_prop_1 = require("./save-sequence-prop");
48
+ const timeline_field_row_layout_1 = require("./timeline-field-row-layout");
48
49
  const TimelineExpandArrowButton_1 = require("./TimelineExpandArrowButton");
49
50
  const TimelineFieldRowContent_1 = require("./TimelineFieldRowContent");
50
51
  const TimelineKeyframeControls_1 = require("./TimelineKeyframeControls");
@@ -53,6 +54,7 @@ const TimelineLayerEye_1 = require("./TimelineLayerEye");
53
54
  const TimelineRowChrome_1 = require("./TimelineRowChrome");
54
55
  const TimelineSchemaField_1 = require("./TimelineSchemaField");
55
56
  const TimelineSelection_1 = require("./TimelineSelection");
57
+ const Transform3DModeContext_1 = require("./Transform3DModeContext");
56
58
  const fieldRowBase = {};
57
59
  const inlineSourceFieldRow = {
58
60
  alignItems: 'stretch',
@@ -205,8 +207,14 @@ const TimelineSequenceKeyframedValueUnmemoized = (props) => {
205
207
  status: propStatus,
206
208
  frame: sourceFrame,
207
209
  value,
210
+ defaultEasing: (0, studio_shared_1.isSchemaFieldHoldOnly)({
211
+ schema,
212
+ key: field.key,
213
+ })
214
+ ? { type: 'step1' }
215
+ : undefined,
208
216
  }));
209
- }, [propStatus, field.key, nodePath, setDragOverrides]);
217
+ }, [propStatus, field.key, nodePath, schema, setDragOverrides]);
210
218
  const onKeyframedDragEnd = (0, react_1.useCallback)(() => {
211
219
  clearDragOverrides(nodePath);
212
220
  }, [clearDragOverrides, nodePath]);
@@ -229,6 +237,7 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
229
237
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
230
238
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
231
239
  const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
240
+ const transform3DMode = (0, react_1.useContext)(Transform3DModeContext_1.Transform3DModeContext);
232
241
  const propStatusesForOverride = remotion_1.Internals.getPropStatusesCtx(visualModePropStatuses, nodePath);
233
242
  const propStatus = (_a = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride[field.key]) !== null && _a !== void 0 ? _a : null;
234
243
  const dragOverrideValue = (0, react_1.useMemo)(() => {
@@ -248,10 +257,10 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
248
257
  keyframable,
249
258
  })) ? (jsx_runtime_1.jsx(TimelineKeyframeControls_1.TimelineKeyframeControls, { fieldKey: field.key, propStatus: propStatus, nodePath: nodePath, fileName: validatedLocation.source, keyframeDisplayOffset: keyframeDisplayOffset, defaultValue: field.fieldSchema.default, dragOverrideValue: dragOverrideValue, schema: schema, effectIndex: null, nodePathInfo: nodePathInfo, mode: keyframeControlsMode })) : null;
250
259
  const style = (0, react_1.useMemo)(() => {
251
- return field.typeName === 'text-content'
260
+ return (0, timeline_field_row_layout_1.isTimelineFieldStacked)({ field, transform3DMode })
252
261
  ? fieldRowBase
253
262
  : { ...fieldRowBase, height: field.rowHeight };
254
- }, [field.rowHeight, field.typeName]);
263
+ }, [field, transform3DMode]);
255
264
  const canResetToDefault = (0, react_1.useMemo)(() => {
256
265
  if (!propStatus || propStatus.status === 'computed') {
257
266
  return false;
@@ -729,9 +729,9 @@ const TimelineSequenceLeftEdgeDragHandleInner = ({ nodePathInfo, windowWidth, ti
729
729
  if (!activeDragState) {
730
730
  return;
731
731
  }
732
- return (0, pointer_session_1.startPointerSession)({
732
+ return (0, pointer_session_1.startCapturedPointerSession)({
733
733
  event: activeDragState,
734
- target: activeDragState.target,
734
+ captureTarget: activeDragState.target,
735
735
  onMove,
736
736
  onEnd: (reason, endEvent) => {
737
737
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -953,9 +953,9 @@ const useTimelineSequenceFromDrag = ({ nodePathInfo, windowWidth, timelineDurati
953
953
  if (!activeDragState) {
954
954
  return;
955
955
  }
956
- return (0, pointer_session_1.startPointerSession)({
956
+ return (0, pointer_session_1.startCapturedPointerSession)({
957
957
  event: activeDragState,
958
- target: activeDragState.target,
958
+ captureTarget: activeDragState.target,
959
959
  onMove,
960
960
  onEnd: (reason, endEvent) => {
961
961
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -1136,9 +1136,9 @@ const TimelineSequenceRightEdgeDragHandleInner = ({ nodePathInfo, windowWidth, t
1136
1136
  if (!activeDragState) {
1137
1137
  return;
1138
1138
  }
1139
- return (0, pointer_session_1.startPointerSession)({
1139
+ return (0, pointer_session_1.startCapturedPointerSession)({
1140
1140
  event: activeDragState,
1141
- target: activeDragState.target,
1141
+ captureTarget: activeDragState.target,
1142
1142
  onMove,
1143
1143
  onEnd: (reason, endEvent) => {
1144
1144
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -8,21 +8,33 @@ const timeline_field_display_utils_1 = require("./timeline-field-display-utils")
8
8
  const timeline_field_utils_1 = require("./timeline-field-utils");
9
9
  const TimelineSchemaField_1 = require("./TimelineSchemaField");
10
10
  const transform_origin_utils_1 = require("./transform-origin-utils");
11
+ const Transform3DModeContext_1 = require("./Transform3DModeContext");
11
12
  const leftDraggerStyle = {
13
+ paddingBottom: 2,
12
14
  paddingLeft: 0,
15
+ paddingTop: 2,
13
16
  };
14
17
  const rightDraggerStyle = {
18
+ paddingBottom: 2,
15
19
  paddingRight: 0,
20
+ paddingTop: 2,
16
21
  };
17
22
  const containerStyle = {
18
23
  display: 'flex',
19
24
  gap: 4,
20
25
  };
21
26
  const TimelineTransformOriginField = ({ field, propStatus, effectiveValue, onSave, onDragValueChange, onDragEnd, }) => {
27
+ var _a;
22
28
  const [dragX, setDragX] = (0, react_1.useState)(null);
23
29
  const [dragY, setDragY] = (0, react_1.useState)(null);
30
+ const [dragZ, setDragZ] = (0, react_1.useState)(null);
31
+ const transform3DMode = (0, react_1.useContext)(Transform3DModeContext_1.Transform3DModeContext);
24
32
  const parsed = (0, react_1.useMemo)(() => (0, transform_origin_utils_1.parseTransformOrigin)(effectiveValue), [effectiveValue]);
25
33
  const percent = (0, react_1.useMemo)(() => (parsed === null ? null : (0, transform_origin_utils_1.parsedTransformOriginToPercent)(parsed)), [parsed]);
34
+ const parsedZ = (0, react_1.useMemo)(() => (parsed === null || parsed === void 0 ? void 0 : parsed.z) === null || (parsed === null || parsed === void 0 ? void 0 : parsed.z) === undefined
35
+ ? null
36
+ : (0, transform_origin_utils_1.parseTransformOriginZ)(parsed.z), [parsed === null || parsed === void 0 ? void 0 : parsed.z]);
37
+ const show3D = transform3DMode || (parsedZ !== null && parsedZ.value !== 0);
26
38
  const configuredStep = field.fieldSchema.type === 'transform-origin'
27
39
  ? field.fieldSchema.step
28
40
  : undefined;
@@ -37,14 +49,19 @@ const TimelineTransformOriginField = ({ field, propStatus, effectiveValue, onSav
37
49
  value: v,
38
50
  });
39
51
  }, [field.fieldSchema]);
40
- const serialize = (0, react_1.useCallback)((x, y) => {
52
+ const serialize = (0, react_1.useCallback)((x, y, z) => {
41
53
  var _a;
54
+ if (z === void 0) { z = (_a = parsed === null || parsed === void 0 ? void 0 : parsed.z) !== null && _a !== void 0 ? _a : null; }
42
55
  return (0, transform_origin_utils_1.serializeTransformOrigin)({
43
56
  uv: (0, transform_origin_utils_1.transformOriginPercentToUv)([x, y]),
44
- z: (_a = parsed === null || parsed === void 0 ? void 0 : parsed.z) !== null && _a !== void 0 ? _a : null,
57
+ z,
45
58
  decimalPlaces,
46
59
  });
47
60
  }, [decimalPlaces, parsed === null || parsed === void 0 ? void 0 : parsed.z]);
61
+ const serializeZ = (0, react_1.useCallback)((value) => {
62
+ var _a;
63
+ return `${(0, timeline_field_utils_1.normalizeTimelineNumber)(value)}${(_a = parsedZ === null || parsedZ === void 0 ? void 0 : parsedZ.unit) !== null && _a !== void 0 ? _a : 'px'}`;
64
+ }, [parsedZ === null || parsedZ === void 0 ? void 0 : parsedZ.unit]);
48
65
  const onXChange = (0, react_1.useCallback)((newVal) => {
49
66
  if (percent === null) {
50
67
  return;
@@ -127,11 +144,68 @@ const TimelineTransformOriginField = ({ field, propStatus, effectiveValue, onSav
127
144
  }
128
145
  }
129
146
  }, [dragX, onSave, percent, propStatus.codeValue, serialize]);
147
+ const onZChange = (0, react_1.useCallback)((newVal) => {
148
+ if (percent === null) {
149
+ return;
150
+ }
151
+ setDragZ(newVal);
152
+ onDragValueChange(serialize(dragX !== null && dragX !== void 0 ? dragX : percent[0], dragY !== null && dragY !== void 0 ? dragY : percent[1], serializeZ(newVal)));
153
+ }, [dragX, dragY, onDragValueChange, percent, serialize, serializeZ]);
154
+ const onZChangeEnd = (0, react_1.useCallback)((newVal) => {
155
+ if (percent === null) {
156
+ return;
157
+ }
158
+ const value = serialize(dragX !== null && dragX !== void 0 ? dragX : percent[0], dragY !== null && dragY !== void 0 ? dragY : percent[1], serializeZ(newVal));
159
+ if (value !== propStatus.codeValue) {
160
+ onSave(value).finally(() => {
161
+ setDragZ(null);
162
+ onDragEnd();
163
+ });
164
+ }
165
+ else {
166
+ setDragZ(null);
167
+ onDragEnd();
168
+ }
169
+ }, [
170
+ dragX,
171
+ dragY,
172
+ onDragEnd,
173
+ onSave,
174
+ percent,
175
+ propStatus.codeValue,
176
+ serialize,
177
+ serializeZ,
178
+ ]);
179
+ const onZTextChange = (0, react_1.useCallback)((newVal) => {
180
+ if (percent === null) {
181
+ return;
182
+ }
183
+ const parsedValue = Number(newVal);
184
+ if (!Number.isNaN(parsedValue)) {
185
+ const value = serialize(dragX !== null && dragX !== void 0 ? dragX : percent[0], dragY !== null && dragY !== void 0 ? dragY : percent[1], serializeZ(parsedValue));
186
+ if (value !== propStatus.codeValue) {
187
+ setDragZ(parsedValue);
188
+ onSave(value).finally(() => setDragZ(null));
189
+ }
190
+ }
191
+ }, [
192
+ dragX,
193
+ dragY,
194
+ onSave,
195
+ percent,
196
+ propStatus.codeValue,
197
+ serialize,
198
+ serializeZ,
199
+ ]);
130
200
  if (percent === null) {
131
201
  return jsx_runtime_1.jsx(TimelineSchemaField_1.UnsupportedStatus, { label: "unsupported origin" });
132
202
  }
133
203
  return (jsx_runtime_1.jsxs("span", { style: containerStyle, children: [
134
- jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragX !== null && dragX !== void 0 ? dragX : percent[0], style: leftDraggerStyle, status: "ok", small: true, onValueChange: onXChange, onValueChangeEnd: onXChangeEnd, onTextChange: onXTextChange, min: -Infinity, max: Infinity, step: step, formatter: formatter, rightAlign: false, snapToStep: false, dragDecimalPlaces: decimalPlaces }), jsx_runtime_1.jsx("div", { style: { marginLeft: -6, marginRight: -6 } }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragY !== null && dragY !== void 0 ? dragY : percent[1], style: rightDraggerStyle, status: "ok", small: true, onValueChange: onYChange, onValueChangeEnd: onYChangeEnd, onTextChange: onYTextChange, min: -Infinity, max: Infinity, step: step, formatter: formatter, rightAlign: false, snapToStep: false, dragDecimalPlaces: decimalPlaces })
135
- ] }));
204
+ jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragX !== null && dragX !== void 0 ? dragX : percent[0], buttonStyle: leftDraggerStyle, style: leftDraggerStyle, status: "ok", small: true, onValueChange: onXChange, onValueChangeEnd: onXChangeEnd, onTextChange: onXTextChange, min: -Infinity, max: Infinity, step: step, formatter: formatter, rightAlign: false, snapToStep: false, dragDecimalPlaces: decimalPlaces, "aria-label": "Transform origin X" }), jsx_runtime_1.jsx("div", { style: { marginLeft: -6, marginRight: -6 } }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragY !== null && dragY !== void 0 ? dragY : percent[1], buttonStyle: rightDraggerStyle, style: rightDraggerStyle, status: "ok", small: true, onValueChange: onYChange, onValueChangeEnd: onYChangeEnd, onTextChange: onYTextChange, min: -Infinity, max: Infinity, step: step, formatter: formatter, rightAlign: false, snapToStep: false, dragDecimalPlaces: decimalPlaces, "aria-label": "Transform origin Y" }), show3D ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
205
+ jsx_runtime_1.jsx("div", { style: { marginLeft: -6, marginRight: -6 } }), jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: (_a = dragZ !== null && dragZ !== void 0 ? dragZ : parsedZ === null || parsedZ === void 0 ? void 0 : parsedZ.value) !== null && _a !== void 0 ? _a : 0, buttonStyle: rightDraggerStyle, style: rightDraggerStyle, status: "ok", small: true, onValueChange: onZChange, onValueChangeEnd: onZChangeEnd, onTextChange: onZTextChange, min: -Infinity, max: Infinity, step: step, formatter: (value) => {
206
+ var _a;
207
+ return `${value}${(_a = parsedZ === null || parsedZ === void 0 ? void 0 : parsedZ.unit) !== null && _a !== void 0 ? _a : 'px'}`;
208
+ }, rightAlign: false, snapToStep: false, dragDecimalPlaces: decimalPlaces, "aria-label": "Transform origin Z" })
209
+ ] })) : null] }));
136
210
  };
137
211
  exports.TimelineTransformOriginField = TimelineTransformOriginField;