@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
package/dist/index.js CHANGED
@@ -2,6 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StudioInternals = exports.writeStaticFile = exports.watchStaticFile = exports.watchPublicFolder = exports.visualControl = exports.updateDefaultProps = exports.toggle = exports.seek = exports.saveDefaultProps = exports.restartStudio = exports.reevaluateComposition = exports.play = exports.pause = exports.goToComposition = exports.getStaticFiles = exports.focusDefaultPropsPath = exports.deleteStaticFile = void 0;
4
4
  const create_composition_1 = require("./api/create-composition");
5
+ const CodingAgentIcon_1 = require("./components/CodingAgentIcon");
6
+ const editor_1 = require("./icons/editor");
7
+ const finder_1 = require("./icons/finder");
8
+ const terminal_1 = require("./icons/terminal");
5
9
  const delete_static_file_1 = require("./api/delete-static-file");
6
10
  Object.defineProperty(exports, "deleteStaticFile", { enumerable: true, get: function () { return delete_static_file_1.deleteStaticFile; } });
7
11
  const focus_default_props_path_1 = require("./api/focus-default-props-path");
@@ -35,6 +39,10 @@ Object.defineProperty(exports, "watchStaticFile", { enumerable: true, get: funct
35
39
  const write_static_file_1 = require("./api/write-static-file");
36
40
  Object.defineProperty(exports, "writeStaticFile", { enumerable: true, get: function () { return write_static_file_1.writeStaticFile; } });
37
41
  exports.StudioInternals = {
42
+ CodingAgentIcon: CodingAgentIcon_1.CodingAgentIcon,
43
+ EditorIcon: editor_1.EditorIcon,
44
+ FinderIcon: finder_1.FinderIcon,
45
+ TerminalIcon: terminal_1.TerminalIcon,
38
46
  createComposition: create_composition_1.createComposition,
39
47
  createStill: create_composition_1.createStill,
40
48
  };
@@ -187,13 +187,13 @@ const renderContent = (Root) => {
187
187
  defaultPixelFormat: bundleMode.compositionDefaultPixelFormat,
188
188
  defaultProResProfile: bundleMode.compositionDefaultProResProfile,
189
189
  defaultSampleRate: bundleMode.compositionDefaultSampleRate,
190
- }, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: 0, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', previewSampleRate: window.remotion_previewSampleRate, children: jsx_runtime_1.jsxs(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: [
190
+ }, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: 0, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', previewSampleRate: window.remotion_previewSampleRate, _experimentalKeepAudioContextAlive: false, children: jsx_runtime_1.jsxs(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: [
191
191
  jsx_runtime_1.jsx(Root, {}), jsx_runtime_1.jsx(GetVideoComposition, { state: bundleMode })
192
192
  ] }) }) }));
193
193
  renderToDOM(markup);
194
194
  }
195
195
  if (bundleMode.type === 'evaluation') {
196
- const markup = (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { initialCanvasContent: null, onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_c = window.remotion_logLevel) !== null && _c !== void 0 ? _c : 'info', numberOfAudioTags: 0, audioLatencyHint: (_d = window.remotion_audioLatencyHint) !== null && _d !== void 0 ? _d : 'playback', previewSampleRate: window.remotion_previewSampleRate, children: jsx_runtime_1.jsx(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: jsx_runtime_1.jsx(Root, {}) }) }) }));
196
+ const markup = (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { initialCanvasContent: null, onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_c = window.remotion_logLevel) !== null && _c !== void 0 ? _c : 'info', numberOfAudioTags: 0, audioLatencyHint: (_d = window.remotion_audioLatencyHint) !== null && _d !== void 0 ? _d : 'playback', previewSampleRate: window.remotion_previewSampleRate, _experimentalKeepAudioContextAlive: false, children: jsx_runtime_1.jsx(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: jsx_runtime_1.jsx(Root, {}) }) }) }));
197
197
  renderToDOM(markup);
198
198
  }
199
199
  if (bundleMode.type === 'index') {
@@ -1,6 +1,6 @@
1
1
  import type { AudioCodec, ChromeMode, Codec, ColorSpace, LogLevel, OpenGlRenderer, PixelFormat, StillImageFormat, VideoImageFormat, X264Preset } from '@remotion/renderer';
2
2
  import type { HardwareAccelerationOption } from '@remotion/renderer/client';
3
- import type { PackageManager, RenderDefaults } from '@remotion/studio-shared';
3
+ import type { CanvasCaptureData, PackageManager, RenderDefaults } from '@remotion/studio-shared';
4
4
  import type { RenderStillOnWebImageFormat, WebRendererAudioCodec, WebRendererContainer, WebRendererHardwareAcceleration, WebRendererPageResponsiveness, WebRendererQuality, WebRendererVideoCodec } from '@remotion/web-renderer';
5
5
  import type React from 'react';
6
6
  import type { SequencePropsSubscriptionKey, _InternalTypes } from 'remotion';
@@ -109,11 +109,19 @@ export type AddEffectModalState = {
109
109
  nodePath: SequencePropsSubscriptionKey;
110
110
  clientId: string;
111
111
  };
112
+ export type CanvasCaptureImport = {
113
+ readonly data: CanvasCaptureData;
114
+ readonly durationInSeconds: number;
115
+ readonly file: File;
116
+ readonly height: number;
117
+ readonly width: number;
118
+ };
112
119
  export type ModalState = {
113
120
  type: 'new-comp';
114
121
  folderName: string | null;
115
122
  parentName: string | null;
116
123
  stack: string | null;
124
+ canvasCapture: CanvasCaptureImport | null;
117
125
  } | {
118
126
  type: 'new-folder';
119
127
  parentName: string | null;
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ type Transform3DModeState = {
3
+ readonly manuallyEnabledSequenceKeys: ReadonlySet<string>;
4
+ readonly setManuallyEnabled: (sequenceKey: string, enabled: boolean) => void;
5
+ };
6
+ export declare const Transform3DModeStateContext: React.Context<Transform3DModeState>;
7
+ export declare const Transform3DModeStateProvider: React.FC<{
8
+ readonly children: React.ReactNode;
9
+ }>;
10
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Transform3DModeStateProvider = exports.Transform3DModeStateContext = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ exports.Transform3DModeStateContext = (0, react_1.createContext)({
7
+ manuallyEnabledSequenceKeys: new Set(),
8
+ setManuallyEnabled: () => undefined,
9
+ });
10
+ const Transform3DModeStateProvider = ({ children }) => {
11
+ const [manuallyEnabledSequenceKeys, setManuallyEnabledSequenceKeys] = (0, react_1.useState)(() => new Set());
12
+ const setManuallyEnabled = (0, react_1.useCallback)((sequenceKey, enabled) => {
13
+ setManuallyEnabledSequenceKeys((previous) => {
14
+ const next = new Set(previous);
15
+ if (enabled) {
16
+ next.add(sequenceKey);
17
+ }
18
+ else {
19
+ next.delete(sequenceKey);
20
+ }
21
+ return next;
22
+ });
23
+ }, []);
24
+ const value = (0, react_1.useMemo)(() => ({ manuallyEnabledSequenceKeys, setManuallyEnabled }), [manuallyEnabledSequenceKeys, setManuallyEnabled]);
25
+ return (jsx_runtime_1.jsx(exports.Transform3DModeStateContext.Provider, { value: value, children: children }));
26
+ };
27
+ exports.Transform3DModeStateProvider = Transform3DModeStateProvider;
@@ -5,7 +5,6 @@ export declare const HigherZIndex: React.FC<{
5
5
  readonly children: React.ReactNode;
6
6
  readonly disabled?: boolean;
7
7
  readonly outsideClickButton?: 'any' | 'primary';
8
- readonly stackOnHighest?: boolean;
9
8
  }>;
10
9
  export declare const useZIndex: () => {
11
10
  currentZIndex: number;
@@ -15,7 +15,7 @@ const margin = {
15
15
  };
16
16
  const EscapeHook = ({ onEscape }) => {
17
17
  const keybindings = (0, use_keybinding_1.useKeybinding)();
18
- (0, react_1.useEffect)(() => {
18
+ (0, react_1.useLayoutEffect)(() => {
19
19
  const escape = keybindings.registerKeybinding({
20
20
  event: 'keydown',
21
21
  key: 'Escape',
@@ -32,83 +32,74 @@ const EscapeHook = ({ onEscape }) => {
32
32
  }, [keybindings, onEscape]);
33
33
  return null;
34
34
  };
35
- const HigherZIndex = ({ children, onEscape, onOutsideClick, disabled, outsideClickButton = 'any', stackOnHighest = false, }) => {
36
- var _a;
35
+ const HigherZIndex = ({ children, onEscape, onOutsideClick, disabled, outsideClickButton = 'any', }) => {
37
36
  const context = (0, react_1.useContext)(ZIndexContext);
38
37
  const highestContext = (0, react_1.useContext)(highest_z_index_1.HighestZIndexContext);
38
+ const { registerZIndex, unregisterZIndex } = highestContext;
39
39
  const containerRef = (0, react_1.useRef)(null);
40
- const stackedIndex = (0, react_1.useRef)(null);
41
- if (disabled || !stackOnHighest) {
42
- stackedIndex.current = null;
43
- }
44
- else if (stackedIndex.current === null) {
45
- stackedIndex.current =
46
- Math.max(context.currentIndex, highestContext.highestIndex) + 1;
47
- }
40
+ const highestIndexRef = (0, react_1.useRef)(highestContext.highestIndex);
41
+ const onOutsideClickRef = (0, react_1.useRef)(onOutsideClick);
42
+ const outsideClickButtonRef = (0, react_1.useRef)(outsideClickButton);
48
43
  const currentIndex = disabled
49
44
  ? context.currentIndex
50
- : ((_a = stackedIndex.current) !== null && _a !== void 0 ? _a : context.currentIndex + 1);
51
- (0, react_1.useEffect)(() => {
45
+ : context.currentIndex + 1;
46
+ (0, react_1.useLayoutEffect)(() => {
47
+ highestIndexRef.current = highestContext.highestIndex;
48
+ onOutsideClickRef.current = onOutsideClick;
49
+ outsideClickButtonRef.current = outsideClickButton;
50
+ }, [highestContext.highestIndex, onOutsideClick, outsideClickButton]);
51
+ (0, react_1.useLayoutEffect)(() => {
52
52
  if (disabled) {
53
53
  return;
54
54
  }
55
- highestContext.registerZIndex(currentIndex);
56
- return () => highestContext.unregisterZIndex(currentIndex);
57
- }, [currentIndex, highestContext, disabled]);
58
- (0, react_1.useEffect)(() => {
55
+ registerZIndex(currentIndex);
56
+ return () => unregisterZIndex(currentIndex);
57
+ }, [currentIndex, disabled, registerZIndex, unregisterZIndex]);
58
+ (0, react_1.useLayoutEffect)(() => {
59
59
  if (disabled) {
60
60
  return;
61
61
  }
62
62
  let endPointerSession = null;
63
63
  const listener = (downEvent) => {
64
64
  var _a;
65
- if (outsideClickButton === 'primary' && downEvent.button !== 0) {
65
+ if (outsideClickButtonRef.current === 'primary' &&
66
+ downEvent.button !== 0) {
66
67
  return;
67
68
  }
68
69
  const outsideClick = !((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(downEvent.target));
69
70
  if (!outsideClick) {
70
71
  return;
71
72
  }
73
+ // The topmost layer owns the full pointer gesture. Layers may mount or
74
+ // unmount before pointerup, but that must not cancel or transfer dismissal.
75
+ if (highestIndexRef.current !== currentIndex) {
76
+ return;
77
+ }
72
78
  endPointerSession === null || endPointerSession === void 0 ? void 0 : endPointerSession();
73
- endPointerSession = (0, pointer_session_1.startPointerSession)({
79
+ endPointerSession = (0, pointer_session_1.observePointerRelease)({
74
80
  event: downEvent,
75
- target: downEvent.target,
76
81
  onEnd: (reason, upEvent) => {
77
82
  var _a;
78
83
  endPointerSession = null;
79
84
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
80
85
  upEvent &&
81
- highestContext.highestIndex === currentIndex &&
82
86
  !(0, input_dragger_click_lock_1.getClickLock)()) {
83
87
  const target = (_a = document.elementFromPoint(upEvent.clientX, upEvent.clientY)) !== null && _a !== void 0 ? _a : upEvent.target;
84
88
  if (document.contains(target)) {
85
89
  upEvent.stopPropagation();
86
- onOutsideClick(target);
90
+ onOutsideClickRef.current(target);
87
91
  }
88
92
  }
89
93
  },
90
94
  });
91
95
  };
92
- // If a menu is opened, then this component will also still receive the pointerdown event.
93
- // However we may not interpret it as a outside click, so we need to wait for the next tick
94
- requestAnimationFrame(() => {
95
- // The third argument `true` registers a capture-phase listener. Some Studio
96
- // elements stop pointerdown propagation while still being outside the menu,
97
- // so bubbling listeners would miss those clicks and keep the menu open.
98
- window.addEventListener('pointerdown', listener, true);
99
- });
96
+ window.addEventListener('pointerdown', listener, true);
100
97
  return () => {
101
98
  endPointerSession === null || endPointerSession === void 0 ? void 0 : endPointerSession();
102
99
  endPointerSession = null;
103
100
  return window.removeEventListener('pointerdown', listener, true);
104
101
  };
105
- }, [
106
- currentIndex,
107
- disabled,
108
- highestContext.highestIndex,
109
- onOutsideClick,
110
- outsideClickButton,
111
- ]);
102
+ }, [currentIndex, disabled]);
112
103
  const value = (0, react_1.useMemo)(() => {
113
104
  return {
114
105
  currentIndex,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.507",
6
+ "version": "4.0.509",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -24,17 +24,17 @@
24
24
  "react-dom": ">=16.8.0"
25
25
  },
26
26
  "dependencies": {
27
- "@remotion/studio-protocol": "4.0.507",
27
+ "@remotion/studio-protocol": "4.0.509",
28
28
  "semver": "7.5.3",
29
- "remotion": "4.0.507",
30
- "@remotion/captions": "4.0.507",
31
- "@remotion/player": "4.0.507",
32
- "@remotion/media-utils": "4.0.507",
33
- "@remotion/renderer": "4.0.507",
34
- "@remotion/web-renderer": "4.0.507",
35
- "@remotion/studio-shared": "4.0.507",
36
- "@remotion/timeline-utils": "4.0.507",
37
- "@remotion/zod-types": "4.0.507",
29
+ "remotion": "4.0.509",
30
+ "@remotion/captions": "4.0.509",
31
+ "@remotion/player": "4.0.509",
32
+ "@remotion/media-utils": "4.0.509",
33
+ "@remotion/renderer": "4.0.509",
34
+ "@remotion/web-renderer": "4.0.509",
35
+ "@remotion/studio-shared": "4.0.509",
36
+ "@remotion/timeline-utils": "4.0.509",
37
+ "@remotion/zod-types": "4.0.509",
38
38
  "@jridgewell/trace-mapping": "0.3.31",
39
39
  "mediabunny": "1.50.8",
40
40
  "memfs": "3.4.3",
@@ -45,7 +45,7 @@
45
45
  "react": "19.2.3",
46
46
  "react-dom": "19.2.3",
47
47
  "@types/semver": "7.5.3",
48
- "@remotion/eslint-config-internal": "4.0.507",
48
+ "@remotion/eslint-config-internal": "4.0.509",
49
49
  "eslint": "9.19.0",
50
50
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
51
51
  },