@remotion/studio 4.0.505 → 4.0.507

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 (208) hide show
  1. package/dist/api/copy-render-output-to-asset.d.ts +4 -0
  2. package/dist/api/copy-render-output-to-asset.js +11 -0
  3. package/dist/api/install-package.d.ts +2 -3
  4. package/dist/api/install-package.js +1 -3
  5. package/dist/api/visual-control.d.ts +3 -0
  6. package/dist/api/visual-control.js +3 -0
  7. package/dist/components/AssetSelector.js +19 -4
  8. package/dist/components/AssetSelectorItem.js +3 -3
  9. package/dist/components/Canvas.js +2 -0
  10. package/dist/components/CodingAgentIcon.d.ts +4 -0
  11. package/dist/components/CodingAgentIcon.js +17 -0
  12. package/dist/components/CompositionSelector.js +1 -1
  13. package/dist/components/CompositionSelectorItem.js +1 -1
  14. package/dist/components/ConfigureDefaultEditorModal.d.ts +1 -1
  15. package/dist/components/ConfigureDefaultEditorModal.js +117 -69
  16. package/dist/components/ConfigureLicenseModal.d.ts +1 -3
  17. package/dist/components/ConfigureLicenseModal.js +105 -89
  18. package/dist/components/ConfirmationDialog.js +2 -2
  19. package/dist/components/ContextMenu.js +10 -8
  20. package/dist/components/Editor.js +2 -0
  21. package/dist/components/EditorContexts.js +6 -5
  22. package/dist/components/EffectPickerModal.js +1 -1
  23. package/dist/components/ExpandedTracksProvider.js +10 -53
  24. package/dist/components/GlobalKeybindings.js +3 -2
  25. package/dist/components/InlineCaptionInspector.d.ts +2 -2
  26. package/dist/components/InlineDropdown.d.ts +2 -1
  27. package/dist/components/InlineDropdown.js +10 -4
  28. package/dist/components/InspectorLocationCopy.js +8 -8
  29. package/dist/components/InspectorOpenInEditor.d.ts +2 -0
  30. package/dist/components/InspectorOpenInEditor.js +63 -49
  31. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  32. package/dist/components/InspectorPanel/CompositionInspector.js +15 -1
  33. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +1 -1
  34. package/dist/components/InspectorPanel/EasingInspector.js +7 -4
  35. package/dist/components/InspectorPanel/KeyframeInspector.js +5 -1
  36. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -0
  37. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +22 -4
  38. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  39. package/dist/components/InspectorPanel/common.d.ts +1 -0
  40. package/dist/components/InspectorPanel/common.js +2 -2
  41. package/dist/components/InspectorPanel/use-composition-actions.js +4 -1
  42. package/dist/components/InspectorSequenceSection.js +4 -4
  43. package/dist/components/InstallPackage.js +1 -1
  44. package/dist/components/Menu/MenuSectionHeader.d.ts +4 -0
  45. package/dist/components/Menu/MenuSectionHeader.js +20 -0
  46. package/dist/components/Menu/SubMenu.js +13 -2
  47. package/dist/components/Menu/menu-tree-context.d.ts +3 -0
  48. package/dist/components/Menu/menu-tree-context.js +13 -0
  49. package/dist/components/MenuBuildIndicator.js +1 -0
  50. package/dist/components/MenuToolbar.js +1 -1
  51. package/dist/components/ModalFooter.d.ts +1 -0
  52. package/dist/components/ModalFooter.js +6 -2
  53. package/dist/components/ModalHeader.js +1 -1
  54. package/dist/components/Modals.js +18 -7
  55. package/dist/components/ModalsProvider.js +5 -6
  56. package/dist/components/NewComposition/CodemodFooter.js +1 -1
  57. package/dist/components/NewComposition/ComboBox.d.ts +6 -1
  58. package/dist/components/NewComposition/DismissableModal.js +1 -1
  59. package/dist/components/NewComposition/MenuContent.js +27 -19
  60. package/dist/components/NewComposition/RenameStaticFile.js +1 -1
  61. package/dist/components/NewComposition/menu-typeahead.js +2 -2
  62. package/dist/components/OverrideInputProps.js +1 -1
  63. package/dist/components/PlayPause.js +2 -1
  64. package/dist/components/PlaybackKeyboardShortcutsManager.js +7 -5
  65. package/dist/components/Preview.js +29 -4
  66. package/dist/components/PreviewToolbarOverflowButton.js +4 -2
  67. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
  68. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  69. package/dist/components/RenderButton.d.ts +3 -3
  70. package/dist/components/RenderButton.js +42 -7
  71. package/dist/components/RenderModal/RenderStatusModal.js +1 -1
  72. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.d.ts +1 -0
  73. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +2 -2
  74. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +3 -3
  75. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  76. package/dist/components/RenderModal/ServerRenderModal.js +5 -1
  77. package/dist/components/RenderModal/WebRenderModal.js +3 -2
  78. package/dist/components/RenderQueue/RenderQueueError.js +1 -1
  79. package/dist/components/RenderQueue/RenderQueueItem.js +8 -2
  80. package/dist/components/RenderQueue/RenderQueueItemStatus.js +1 -1
  81. package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
  82. package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -1
  83. package/dist/components/RenderQueue/actions.d.ts +4 -2
  84. package/dist/components/RenderQueue/actions.js +4 -2
  85. package/dist/components/RenderQueue/index.js +3 -4
  86. package/dist/components/RenderQueue/use-render-output-file-drag.d.ts +8 -0
  87. package/dist/components/RenderQueue/use-render-output-file-drag.js +121 -0
  88. package/dist/components/SegmentedControl.js +0 -1
  89. package/dist/components/SelectedOutlineElement.d.ts +14 -17
  90. package/dist/components/SelectedOutlineElement.js +113 -931
  91. package/dist/components/SelectedOutlineKeyboardControls.d.ts +7 -0
  92. package/dist/components/SelectedOutlineKeyboardControls.js +261 -0
  93. package/dist/components/SelectedOutlineOverlay.d.ts +6 -13
  94. package/dist/components/SelectedOutlineOverlay.js +360 -832
  95. package/dist/components/SelectedOutlinePolygon.d.ts +25 -0
  96. package/dist/components/SelectedOutlinePolygon.js +359 -0
  97. package/dist/components/SelectedOutlineRenderer.d.ts +18 -0
  98. package/dist/components/SelectedOutlineRenderer.js +208 -0
  99. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +16 -0
  100. package/dist/components/SelectedOutlineRotationCornerHandle.js +269 -0
  101. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +16 -0
  102. package/dist/components/SelectedOutlineScaleEdgeLine.js +211 -0
  103. package/dist/components/SelectedOutlineSnapIndicators.d.ts +9 -0
  104. package/dist/components/SelectedOutlineSnapIndicators.js +29 -0
  105. package/dist/components/SelectedOutlineTransformOriginHandle.d.ts +9 -0
  106. package/dist/components/SelectedOutlineTransformOriginHandle.js +286 -0
  107. package/dist/components/SelectedOutlineUvControls.d.ts +3 -9
  108. package/dist/components/SelectedOutlineUvControls.js +57 -12
  109. package/dist/components/SettingsContext.d.ts +15 -0
  110. package/dist/components/SettingsContext.js +116 -0
  111. package/dist/components/SettingsModal.d.ts +7 -0
  112. package/dist/components/SettingsModal.js +56 -0
  113. package/dist/components/SettingsModalFooter.d.ts +2 -0
  114. package/dist/components/SettingsModalFooter.js +44 -0
  115. package/dist/components/ShowOutlinesProvider.js +2 -3
  116. package/dist/components/SidebarRenderButton.js +1 -1
  117. package/dist/components/SvgImportDialog.js +2 -2
  118. package/dist/components/TimeValue.js +1 -1
  119. package/dist/components/Timeline/EasingEditorModal.js +66 -22
  120. package/dist/components/Timeline/Timeline.js +23 -5
  121. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  122. package/dist/components/Timeline/TimelineDragHandler.js +3 -3
  123. package/dist/components/Timeline/TimelineDuplicateCount.d.ts +4 -0
  124. package/dist/components/Timeline/TimelineDuplicateCount.js +28 -0
  125. package/dist/components/Timeline/TimelineEffectPropItem.js +5 -3
  126. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +3 -23
  127. package/dist/components/Timeline/TimelineExpandedRow.d.ts +4 -2
  128. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  129. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +4 -2
  130. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +11 -1
  131. package/dist/components/Timeline/TimelineFontFamilyField.js +3 -1
  132. package/dist/components/Timeline/TimelineKeyframeControls.js +1 -0
  133. package/dist/components/Timeline/TimelineSelection.js +1 -0
  134. package/dist/components/Timeline/TimelineSequence.js +28 -25
  135. package/dist/components/Timeline/TimelineSequenceItem.js +74 -58
  136. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +1 -1
  137. package/dist/components/Timeline/TimelineTrack.js +2 -1
  138. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -3
  139. package/dist/components/Timeline/get-sequence-context-menu-items.js +58 -53
  140. package/dist/components/Timeline/reset-selected-timeline-props.js +1 -1
  141. package/dist/components/Timeline/should-subscribe-to-sequence-props.d.ts +1 -1
  142. package/dist/components/Timeline/timeline-asset-link.d.ts +2 -2
  143. package/dist/components/Timeline/timeline-asset-link.js +2 -2
  144. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +38 -2
  145. package/dist/components/Timeline/{use-open-sequence-in-editor.d.ts → use-open-sequence-in-apps.d.ts} +4 -1
  146. package/dist/components/Timeline/{use-open-sequence-in-editor.js → use-open-sequence-in-apps.js} +20 -4
  147. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  148. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +5 -0
  149. package/dist/components/Timeline/use-timeline-expanded-tree.js +50 -1
  150. package/dist/components/Timeline/use-timeline-height.js +20 -0
  151. package/dist/components/TimelineInOutToggle.js +5 -1
  152. package/dist/components/TopPanel.js +16 -0
  153. package/dist/components/UpdateCheck.js +1 -1
  154. package/dist/components/effect-drag-and-drop.js +1 -1
  155. package/dist/components/get-open-in-menu-items.d.ts +12 -0
  156. package/dist/components/get-open-in-menu-items.js +83 -0
  157. package/dist/components/handle-drop.d.ts +2 -1
  158. package/dist/components/handle-drop.js +12 -2
  159. package/dist/components/import-assets.d.ts +18 -6
  160. package/dist/components/import-assets.js +76 -32
  161. package/dist/components/selected-outline-measurement.d.ts +2 -2
  162. package/dist/components/selected-outline-order.d.ts +12 -0
  163. package/dist/components/selected-outline-order.js +251 -0
  164. package/dist/components/selected-outline-types.d.ts +9 -10
  165. package/dist/components/svg-point-to-client-point.d.ts +2 -0
  166. package/dist/components/svg-point-to-client-point.js +10 -0
  167. package/dist/components/use-auto-save-config.d.ts +8 -0
  168. package/dist/components/use-auto-save-config.js +74 -0
  169. package/dist/components/use-default-editor-info.d.ts +1 -0
  170. package/dist/components/use-default-editor-info.js +10 -30
  171. package/dist/esm/{chunk-jefhcs5z.js → chunk-fgedsvhb.js} +1 -2
  172. package/dist/esm/{chunk-7pgk8h5m.js → chunk-ptnd65a9.js} +14596 -12725
  173. package/dist/esm/internals.mjs +14595 -12724
  174. package/dist/esm/previewEntry.mjs +12726 -10855
  175. package/dist/esm/renderEntry.mjs +2 -2
  176. package/dist/helpers/are-sequence-node-path-infos-equal.d.ts +2 -0
  177. package/dist/helpers/are-sequence-node-path-infos-equal.js +27 -0
  178. package/dist/helpers/calculate-timeline.js +3 -3
  179. package/dist/helpers/client-id.d.ts +3 -1
  180. package/dist/helpers/client-id.js +28 -4
  181. package/dist/helpers/format-file-location.d.ts +1 -1
  182. package/dist/helpers/format-file-location.js +3 -3
  183. package/dist/helpers/install-required-package.d.ts +3 -3
  184. package/dist/helpers/install-required-package.js +1 -6
  185. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  186. package/dist/helpers/open-in-editor.d.ts +1 -0
  187. package/dist/helpers/open-in-editor.js +5 -1
  188. package/dist/helpers/studio-fit-padding.d.ts +1 -1
  189. package/dist/helpers/studio-fit-padding.js +1 -1
  190. package/dist/helpers/studio-runtime-config.js +3 -0
  191. package/dist/helpers/timeline-layout.d.ts +2 -1
  192. package/dist/helpers/timeline-layout.js +5 -2
  193. package/dist/helpers/timeline-node-path-key.d.ts +2 -0
  194. package/dist/helpers/timeline-node-path-key.js +3 -1
  195. package/dist/helpers/use-asset-drag-events.d.ts +2 -1
  196. package/dist/helpers/use-asset-drag-events.js +14 -6
  197. package/dist/helpers/use-menu-structure.js +25 -35
  198. package/dist/helpers/use-runtime-values.d.ts +9 -0
  199. package/dist/helpers/use-runtime-values.js +76 -0
  200. package/dist/icons/apps.d.ts +2 -0
  201. package/dist/icons/apps.js +7 -0
  202. package/dist/icons/browse-elements.d.ts +4 -0
  203. package/dist/icons/browse-elements.js +10 -0
  204. package/dist/state/modals.d.ts +5 -6
  205. package/dist/state/modals.js +5 -3
  206. package/dist/state/timeline-sequence-hover.d.ts +9 -3
  207. package/dist/state/timeline-sequence-hover.js +63 -12
  208. package/package.json +12 -12
@@ -15,6 +15,7 @@ const cwd = {
15
15
  alignItems: 'center',
16
16
  justifyContent: 'center',
17
17
  userSelect: 'none',
18
+ whiteSpace: 'nowrap',
18
19
  };
19
20
  const spinnerSize = 14;
20
21
  const spinner = {
@@ -39,7 +39,7 @@ const flex = {
39
39
  const MenuToolbar = ({ readOnlyStudio }) => {
40
40
  const [selected, setSelected] = (0, react_1.useState)(null);
41
41
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
42
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
42
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
43
43
  const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
44
44
  const canUndoAndRedo = !readOnlyStudio ||
45
45
  (previewServerState.type === 'connected' &&
@@ -2,4 +2,5 @@ import React from 'react';
2
2
  export declare const ModalFooterContainer: React.FC<{
3
3
  readonly children: React.ReactNode;
4
4
  readonly style?: React.CSSProperties;
5
+ readonly noBorder?: boolean;
5
6
  }>;
@@ -10,7 +10,11 @@ const content = {
10
10
  fontSize: 13,
11
11
  minWidth: 500,
12
12
  };
13
- const ModalFooterContainer = ({ children, style }) => {
14
- return (jsx_runtime_1.jsx("div", { style: { ...content, ...style, borderTop: colors_1.BORDER_BLACK }, children: children }));
13
+ const ModalFooterContainer = ({ children, noBorder, style }) => {
14
+ return (jsx_runtime_1.jsx("div", { style: {
15
+ ...content,
16
+ ...style,
17
+ borderTop: noBorder ? undefined : colors_1.BORDER_BLACK,
18
+ }, children: children }));
15
19
  };
16
20
  exports.ModalFooterContainer = ModalFooterContainer;
@@ -24,7 +24,7 @@ const icon = {
24
24
  width: 20,
25
25
  };
26
26
  const ModalHeader = ({ title, onClose }) => {
27
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
27
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
28
28
  const onPress = (0, react_1.useCallback)(() => {
29
29
  setSelectedModal(null);
30
30
  }, [setSelectedModal]);
@@ -12,8 +12,6 @@ const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
12
12
  const modals_1 = require("../state/modals");
13
13
  const z_index_1 = require("../state/z-index");
14
14
  const AskAiModal_1 = require("./AskAiModal");
15
- const ConfigureDefaultEditorModal_1 = require("./ConfigureDefaultEditorModal");
16
- const ConfigureLicenseModal_1 = require("./ConfigureLicenseModal");
17
15
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
18
16
  const EffectPickerModal_1 = require("./EffectPickerModal");
19
17
  const InstallPackage_1 = require("./InstallPackage");
@@ -31,16 +29,29 @@ const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher")
31
29
  const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
32
30
  const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
33
31
  const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
32
+ const SettingsModal_1 = require("./SettingsModal");
34
33
  const SvgImportDialog_1 = require("./SvgImportDialog");
35
34
  const UpdateModal_1 = require("./UpdateModal/UpdateModal");
36
35
  const Modals = ({ readOnlyStudio }) => {
37
36
  var _a;
38
- const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
37
+ const modalContextType = (0, react_1.useContext)(modals_1.SelectedModalContext);
38
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
39
39
  const { currentZIndex } = (0, z_index_1.useZIndex)();
40
- const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState.type ===
41
- 'connected';
42
- return react_dom_1.default.createPortal(jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'configure-license' && (jsx_runtime_1.jsx(ConfigureLicenseModal_1.ConfigureLicenseModal, { initialPublicLicenseKey: modalContextType.initialPublicLicenseKey })), modalContextType &&
43
- modalContextType.type === 'configure-default-editor' && (jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.ConfigureDefaultEditorModal, {})), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
40
+ const { previewServerState, subscribeToEvent } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
41
+ const canRender = previewServerState.type === 'connected';
42
+ (0, react_1.useEffect)(() => {
43
+ return subscribeToEvent('license-key-install-request', (event) => {
44
+ if (event.type !== 'license-key-install-request') {
45
+ return;
46
+ }
47
+ setSelectedModal({
48
+ type: 'settings',
49
+ initialTab: 'license',
50
+ initialPublicLicenseKey: event.licenseKey,
51
+ });
52
+ });
53
+ }, [setSelectedModal, subscribeToEvent]);
54
+ return react_dom_1.default.createPortal(jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'settings' && (jsx_runtime_1.jsx(SettingsModal_1.SettingsModal, { initialTab: modalContextType.initialTab, initialPublicLicenseKey: modalContextType.initialPublicLicenseKey }, `${modalContextType.initialTab}-${modalContextType.initialPublicLicenseKey}`)), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
44
55
  modalContextType.type === 'server-render' &&
45
56
  (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }),
46
57
  // Modals must be above overlays opened from the editor, such as the
@@ -5,13 +5,12 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const modals_1 = require("../state/modals");
7
7
  const ModalsProvider = ({ children }) => {
8
- const [modalContextType, setModalContextType] = (0, react_1.useState)(null);
9
- const modalsContext = (0, react_1.useMemo)(() => {
8
+ const [selectedModal, setSelectedModal] = (0, react_1.useState)(null);
9
+ const setSelectedModalContext = (0, react_1.useMemo)(() => {
10
10
  return {
11
- selectedModal: modalContextType,
12
- setSelectedModal: setModalContextType,
11
+ setSelectedModal,
13
12
  };
14
- }, [modalContextType]);
15
- return (jsx_runtime_1.jsx(modals_1.ModalsContext.Provider, { value: modalsContext, children: children }));
13
+ }, []);
14
+ return (jsx_runtime_1.jsx(modals_1.SetSelectedModalContext.Provider, { value: setSelectedModalContext, children: jsx_runtime_1.jsx(modals_1.SelectedModalContext.Provider, { value: selectedModal, children: children }) }));
16
15
  };
17
16
  exports.ModalsProvider = ModalsProvider;
@@ -24,7 +24,7 @@ const CodemodFooterPresentation = ({ codemodStatus, disabled, genericSubmitLabel
24
24
  const CodemodFooter = ({ codemod, stack, valid, loadingNotification, successNotification, errorNotification, genericSubmitLabel, submitLabel, onSuccess, fallbackToRootFile = false, applyCodemod, }) => {
25
25
  var _a;
26
26
  const [submitting, setSubmitting] = (0, react_1.useState)(false);
27
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
27
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
28
28
  const [codemodStatus, setCanApplyCodemod] = (0, react_1.useState)({
29
29
  type: 'loading',
30
30
  });
@@ -4,6 +4,11 @@ type DividerItem = {
4
4
  type: 'divider';
5
5
  id: string;
6
6
  };
7
+ type SectionHeaderItem = {
8
+ type: 'section-header';
9
+ id: string;
10
+ label: string;
11
+ };
7
12
  export type SubMenu = {
8
13
  preselectIndex: number | false;
9
14
  leaveLeftSpace: boolean;
@@ -21,7 +26,7 @@ export type SelectionItem = {
21
26
  quickSwitcherLabel: string | null;
22
27
  disabled?: boolean;
23
28
  };
24
- export type ComboboxValue = DividerItem | SelectionItem;
29
+ export type ComboboxValue = DividerItem | SectionHeaderItem | SelectionItem;
25
30
  export declare const Combobox: React.FC<{
26
31
  readonly values: ComboboxValue[];
27
32
  readonly selectedId: string | number;
@@ -6,7 +6,7 @@ const react_1 = require("react");
6
6
  const modals_1 = require("../../state/modals");
7
7
  const ModalContainer_1 = require("../ModalContainer");
8
8
  const DismissableModal = ({ children, panelStyle }) => {
9
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
9
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
10
10
  const onQuit = (0, react_1.useCallback)(() => {
11
11
  setSelectedModal(null);
12
12
  }, [setSelectedModal]);
@@ -8,7 +8,9 @@ const mobile_layout_1 = require("../../helpers/mobile-layout");
8
8
  const studio_runtime_config_1 = require("../../helpers/studio-runtime-config");
9
9
  const use_keybinding_1 = require("../../helpers/use-keybinding");
10
10
  const is_menu_item_1 = require("../Menu/is-menu-item");
11
+ const menu_tree_context_1 = require("../Menu/menu-tree-context");
11
12
  const MenuDivider_1 = require("../Menu/MenuDivider");
13
+ const MenuSectionHeader_1 = require("../Menu/MenuSectionHeader");
12
14
  const MenuSubItem_1 = require("../Menu/MenuSubItem");
13
15
  const styles_1 = require("../Menu/styles");
14
16
  const menu_typeahead_1 = require("./menu-typeahead");
@@ -27,6 +29,9 @@ const container = {
27
29
  const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMenu, leaveLeftSpace, topItemCanBeUnselected, fixedHeight, }) => {
28
30
  const keybindings = (0, use_keybinding_1.useKeybinding)();
29
31
  const containerRef = (0, react_1.useRef)(null);
32
+ const inheritedMenuTreeId = (0, react_1.useContext)(menu_tree_context_1.MenuTreeContext);
33
+ const localMenuTreeId = (0, react_1.useRef)((0, menu_tree_context_1.getNextMenuTreeId)());
34
+ const menuTreeId = inheritedMenuTreeId !== null && inheritedMenuTreeId !== void 0 ? inheritedMenuTreeId : localMenuTreeId.current;
30
35
  const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
31
36
  const [subMenuActivated, setSubMenuActivated] = (0, react_1.useState)(false);
32
37
  const typeaheadQueryRef = (0, react_1.useRef)('');
@@ -51,7 +56,7 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
51
56
  }
52
57
  }, []);
53
58
  const isItemSelectable = (0, react_1.useCallback)((v) => {
54
- return v.type !== 'divider' && !v.disabled;
59
+ return v.type === 'item' && !v.disabled;
55
60
  }, []);
56
61
  const onArrowUp = (0, react_1.useCallback)(() => {
57
62
  setSelectedItem((prevItem) => {
@@ -98,8 +103,8 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
98
103
  if (!item) {
99
104
  throw new Error('cannot find item');
100
105
  }
101
- if (item.type === 'divider') {
102
- throw new Error('cannot find divider');
106
+ if (item.type !== 'item') {
107
+ throw new Error('cannot select non-interactive menu item');
103
108
  }
104
109
  if (item.disabled) {
105
110
  return;
@@ -118,8 +123,8 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
118
123
  if (!item) {
119
124
  throw new Error('cannot find item');
120
125
  }
121
- if (item.type === 'divider') {
122
- throw new Error('cannot find divider');
126
+ if (item.type !== 'item') {
127
+ throw new Error('cannot select non-interactive menu item');
123
128
  }
124
129
  if (!item.subMenu) {
125
130
  return onNextMenu();
@@ -282,8 +287,8 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
282
287
  // Can happen if resizing the window
283
288
  return;
284
289
  }
285
- if (item.type === 'divider') {
286
- throw new Error('should not select divider');
290
+ if (item.type !== 'item') {
291
+ throw new Error('should not select non-interactive menu item');
287
292
  }
288
293
  if (!item.subMenu && subMenuActivated) {
289
294
  setSubMenuActivated(false);
@@ -303,18 +308,21 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
303
308
  current.addEventListener('pointerleave', onPointerLeave);
304
309
  return () => current.removeEventListener('pointerleave', onPointerLeave);
305
310
  }, [onHide, subMenuActivated]);
306
- return (jsx_runtime_1.jsx("div", { ref: containerRef, style: containerWithHeight, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: values.map((item) => {
307
- if (item.type === 'divider') {
308
- return jsx_runtime_1.jsx(MenuDivider_1.MenuDivider, {}, item.id);
309
- }
310
- const onClick = (id, e) => {
311
- item.onClick(id, e);
312
- if (item.subMenu) {
313
- return null;
311
+ return (jsx_runtime_1.jsx(menu_tree_context_1.MenuTreeContext.Provider, { value: menuTreeId, children: jsx_runtime_1.jsx("div", { ref: containerRef, "data-remotion-menu-tree-id": menuTreeId, style: containerWithHeight, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: values.map((item) => {
312
+ if (item.type === 'divider') {
313
+ return jsx_runtime_1.jsx(MenuDivider_1.MenuDivider, {}, item.id);
314
+ }
315
+ if (item.type === 'section-header') {
316
+ return (jsx_runtime_1.jsx(MenuSectionHeader_1.MenuSectionHeader, { children: item.label }, item.id));
314
317
  }
315
- onHide();
316
- };
317
- return (jsx_runtime_1.jsx(MenuSubItem_1.MenuSubItem, { selected: item.id === selectedItem, onActionChosen: onClick, onItemSelected: onItemSelected, label: item.label, id: item.id, keyHint: item.keyHint, leaveLeftSpace: leaveLeftSpace, leftItem: item.leftItem, subMenu: item.subMenu, onQuitMenu: onHide, onNextMenu: onNextMenu, subMenuActivated: subMenuActivated, setSubMenuActivated: setSubMenuActivated, disabled: item.disabled }, item.id));
318
- }) }));
318
+ const onClick = (id, e) => {
319
+ item.onClick(id, e);
320
+ if (item.subMenu) {
321
+ return null;
322
+ }
323
+ onHide();
324
+ };
325
+ return (jsx_runtime_1.jsx(MenuSubItem_1.MenuSubItem, { selected: item.id === selectedItem, onActionChosen: onClick, onItemSelected: onItemSelected, label: item.label, id: item.id, keyHint: item.keyHint, leaveLeftSpace: leaveLeftSpace, leftItem: item.leftItem, subMenu: item.subMenu, onQuitMenu: onHide, onNextMenu: onNextMenu, subMenuActivated: subMenuActivated, setSubMenuActivated: setSubMenuActivated, disabled: item.disabled }, item.id));
326
+ }) }) }));
319
327
  };
320
328
  exports.MenuContent = MenuContent;
@@ -23,7 +23,7 @@ const content = {
23
23
  minWidth: 500,
24
24
  };
25
25
  const RenameStaticFileModal = ({ relativePath }) => {
26
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
26
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
27
27
  const staticFiles = (0, use_static_files_1.useStaticFiles)();
28
28
  const [newName, setNewName] = (0, react_1.useState)(() => (0, use_rename_static_file_1.getStaticFileBaseName)(relativePath));
29
29
  const [submitting, setSubmitting] = (0, react_1.useState)(false);
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.findTypeaheadMenuItem = void 0;
4
4
  const getLabelToMatch = (value) => {
5
- if (value.type === 'divider' || value.disabled) {
5
+ if (value.type !== 'item' || value.disabled) {
6
6
  return null;
7
7
  }
8
8
  if (typeof value.label === 'string') {
@@ -19,7 +19,7 @@ const findTypeaheadMenuItem = ({ query, values, }) => {
19
19
  const label = getLabelToMatch(value);
20
20
  return label ? label.toLowerCase().startsWith(normalizedQuery) : false;
21
21
  });
22
- if (!matched || matched.type === 'divider') {
22
+ if (!matched || matched.type !== 'item') {
23
23
  return null;
24
24
  }
25
25
  return matched.id;
@@ -51,7 +51,7 @@ const Inner = () => {
51
51
  }
52
52
  return null;
53
53
  });
54
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
54
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
55
55
  const valid = (0, react_1.useMemo)(() => {
56
56
  if (!value)
57
57
  return true;
@@ -30,7 +30,8 @@ const PlayPause = ({ playbackRate, loop, bufferStateDelayInMilliseconds, muted,
30
30
  const { inFrame, outFrame } = (0, in_out_1.useTimelineInOutFramePosition)();
31
31
  const videoConfig = remotion_1.Internals.useUnsafeVideoConfig();
32
32
  const [showBufferIndicator, setShowBufferState] = (0, react_1.useState)(false);
33
- const { playing, play, pause, pauseAndReturnToPlayStart, frameBack, seek, frameForward, emitter, getCurrentFrame, } = player_1.PlayerInternals.usePlayer();
33
+ const { play, pause, pauseAndReturnToPlayStart, frameBack, seek, frameForward, emitter, getCurrentFrame, } = player_1.PlayerInternals.usePlayerMethods();
34
+ const [playing] = remotion_1.Internals.Timeline.usePlayingState();
34
35
  player_1.PlayerInternals.usePlayback({
35
36
  loop,
36
37
  playbackRate,
@@ -6,10 +6,11 @@ const react_1 = require("react");
6
6
  const use_keybinding_1 = require("../helpers/use-keybinding");
7
7
  const PlaybackKeyboardShortcutsManager = ({ setPlaybackRate }) => {
8
8
  const keybindings = (0, use_keybinding_1.useKeybinding)();
9
- const { play, pause, playing } = player_1.PlayerInternals.usePlayer();
9
+ const { play, pause, isPlaying } = player_1.PlayerInternals.usePlayerMethods();
10
10
  const onJKey = (0, react_1.useCallback)(() => {
11
+ const wasPlaying = isPlaying();
11
12
  setPlaybackRate((prevPlaybackRate) => {
12
- if (!playing) {
13
+ if (!wasPlaying) {
13
14
  return -1;
14
15
  }
15
16
  if (prevPlaybackRate > -1) {
@@ -21,14 +22,15 @@ const PlaybackKeyboardShortcutsManager = ({ setPlaybackRate }) => {
21
22
  return -4;
22
23
  });
23
24
  play();
24
- }, [play, playing, setPlaybackRate]);
25
+ }, [isPlaying, play, setPlaybackRate]);
25
26
  const onKKey = (0, react_1.useCallback)(() => {
26
27
  setPlaybackRate(1);
27
28
  pause();
28
29
  }, [pause, setPlaybackRate]);
29
30
  const onLKey = (0, react_1.useCallback)(() => {
31
+ const wasPlaying = isPlaying();
30
32
  setPlaybackRate((prevPlaybackRate) => {
31
- if (!playing) {
33
+ if (!wasPlaying) {
32
34
  return 1;
33
35
  }
34
36
  if (prevPlaybackRate < 1) {
@@ -40,7 +42,7 @@ const PlaybackKeyboardShortcutsManager = ({ setPlaybackRate }) => {
40
42
  return 4;
41
43
  });
42
44
  play();
43
- }, [play, playing, setPlaybackRate]);
45
+ }, [isPlaying, play, setPlaybackRate]);
44
46
  (0, react_1.useEffect)(() => {
45
47
  const jKey = keybindings.registerKeybinding({
46
48
  event: 'keydown',
@@ -69,6 +69,24 @@ const VideoPreview = ({ canvasSize, contentDimensions, canvasContent, assetMetad
69
69
  exports.VideoPreview = VideoPreview;
70
70
  const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent, assetMetadata }) => {
71
71
  const { size: previewSize } = (0, react_1.useContext)(remotion_1.Internals.PreviewSizeContext);
72
+ const [canvasHovered, setCanvasHovered] = (0, react_1.useState)(false);
73
+ const compositionContainerRef = (0, react_1.useRef)(null);
74
+ (0, react_1.useEffect)(() => {
75
+ const compositionContainer = compositionContainerRef.current;
76
+ if (compositionContainer === null) {
77
+ setCanvasHovered(false);
78
+ return;
79
+ }
80
+ const onPointerEnter = () => setCanvasHovered(true);
81
+ const onPointerLeave = () => setCanvasHovered(false);
82
+ setCanvasHovered(compositionContainer.matches(':hover'));
83
+ compositionContainer.addEventListener('pointerenter', onPointerEnter);
84
+ compositionContainer.addEventListener('pointerleave', onPointerLeave);
85
+ return () => {
86
+ compositionContainer.removeEventListener('pointerenter', onPointerEnter);
87
+ compositionContainer.removeEventListener('pointerleave', onPointerLeave);
88
+ };
89
+ }, [canvasContent.type]);
72
90
  const { centerX, centerY, yCorrection, xCorrection, scale } = (0, react_1.useMemo)(() => {
73
91
  if (contentDimensions === 'none') {
74
92
  return {
@@ -129,8 +147,8 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
129
147
  if (canvasContent.type === 'output-blob') {
130
148
  return (jsx_runtime_1.jsx("div", { style: outer, children: jsx_runtime_1.jsx(RenderPreview_1.RenderPreview, { path: canvasContent.displayName, assetMetadata: assetMetadata, getBlob: canvasContent.getBlob }) }));
131
149
  }
132
- return (jsx_runtime_1.jsxs("div", { className: "remotion-studio-composition-container", style: outer, children: [
133
- jsx_runtime_1.jsx(PortalContainer, { contentDimensions: contentDimensions, scale: scale, xCorrection: xCorrection, yCorrection: yCorrection }), jsx_runtime_1.jsx(SelectedOutlineOverlay_1.SelectedOutlineOverlay, { compositionHeight: contentDimensions.height, compositionWidth: contentDimensions.width, scale: scale, translationX: previewSize.translation.x, translationY: previewSize.translation.y })
150
+ return (jsx_runtime_1.jsxs("div", { ref: compositionContainerRef, className: "remotion-studio-composition-container", style: outer, children: [
151
+ jsx_runtime_1.jsx(PortalContainer, { contentDimensions: contentDimensions, scale: scale, xCorrection: xCorrection, yCorrection: yCorrection }), jsx_runtime_1.jsx(SelectedOutlineOverlay_1.SelectedOutlineOverlay, { canvasHovered: canvasHovered, compositionHeight: contentDimensions.height, compositionWidth: contentDimensions.width, scale: scale, translationX: previewSize.translation.x, translationY: previewSize.translation.y })
134
152
  ] }));
135
153
  };
136
154
  const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions }) => {
@@ -154,13 +172,20 @@ const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions })
154
172
  xCorrection,
155
173
  yCorrection,
156
174
  ]);
157
- (0, react_1.useEffect)(() => {
175
+ (0, react_1.useLayoutEffect)(() => {
158
176
  const { current } = portalContainer;
159
177
  current === null || current === void 0 ? void 0 : current.appendChild(remotion_1.Internals.portalNode());
160
178
  return () => {
161
- current === null || current === void 0 ? void 0 : current.removeChild(remotion_1.Internals.portalNode());
179
+ const portalNode = remotion_1.Internals.portalNode();
180
+ if (current && portalNode.parentNode === current) {
181
+ current.removeChild(portalNode);
182
+ remotion_1.Internals.setPortalNodeCurrentScale(1);
183
+ }
162
184
  };
163
185
  }, []);
186
+ (0, react_1.useLayoutEffect)(() => {
187
+ remotion_1.Internals.setPortalNodeCurrentScale(scale);
188
+ }, [scale]);
164
189
  const onPointerDown = (0, react_1.useCallback)((event) => {
165
190
  if (!(0, should_clear_selection_on_pointer_down_1.shouldClearSelectionOnPointerDown)(event)) {
166
191
  return;
@@ -18,6 +18,7 @@ const clickButton = (id) => {
18
18
  (_a = document.getElementById(id)) === null || _a === void 0 ? void 0 : _a.click();
19
19
  };
20
20
  const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLoop, showCompositionControls, playbackRate, setPlaybackRate, loop, setLoop, }) => {
21
+ const keyboardShortcutsDisabled = (0, use_keybinding_1.areKeyboardShortcutsDisabled)();
21
22
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
22
23
  const { editorShowOutlines, setEditorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
23
24
  const { items: previewSizeItems, selectedId: selectedPreviewSize, zoomable, } = (0, SizeSelector_1.usePreviewSizeMenuItems)();
@@ -88,7 +89,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
88
89
  label: 'Transparency as checkerboard',
89
90
  value: 'checkerboard',
90
91
  onClick: () => setCheckerboard((current) => !current),
91
- keyHint: (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? null : 'T',
92
+ keyHint: keyboardShortcutsDisabled ? null : 'T',
92
93
  leftItem: checkerboard ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
93
94
  subMenu: null,
94
95
  quickSwitcherLabel: null,
@@ -112,7 +113,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
112
113
  label: 'Fullscreen',
113
114
  value: 'fullscreen',
114
115
  onClick: () => clickButton('fullscreen-toggle'),
115
- keyHint: (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? null : 'F',
116
+ keyHint: keyboardShortcutsDisabled ? null : 'F',
116
117
  leftItem: null,
117
118
  subMenu: null,
118
119
  quickSwitcherLabel: null,
@@ -135,6 +136,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
135
136
  setEditorShowOutlines,
136
137
  setLoop,
137
138
  zoomable,
139
+ keyboardShortcutsDisabled,
138
140
  ]);
139
141
  if (values.length === 0) {
140
142
  return null;
@@ -30,7 +30,7 @@ const shortcutLabel = {
30
30
  opacity: 0.6,
31
31
  };
32
32
  const ExplorerQuickSwitcherTrigger = ({ mode, showShortcut, tabIndex }) => {
33
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
33
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
34
34
  const openQuickSwitcher = (0, react_1.useCallback)(() => {
35
35
  setSelectedModal({
36
36
  type: 'quick-switcher',
@@ -125,7 +125,7 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
125
125
  const closeMenu = (0, react_1.useCallback)(() => undefined, []);
126
126
  const actions = (0, use_menu_structure_1.useMenuStructure)(closeMenu, readOnlyStudio);
127
127
  const [docResults, setDocResults] = (0, react_1.useState)({ type: 'initial' });
128
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
128
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
129
129
  const keybindings = (0, use_keybinding_1.useKeybinding)();
130
130
  const mode = assetSelection !== null
131
131
  ? 'assets'
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  export type RenderType = 'server-render' | 'client-render' | 'render-command';
3
- export declare const RenderButton: React.FC<{
3
+ export declare const RenderButton: React.NamedExoticComponent<{
4
4
  readonly readOnlyStudio: boolean;
5
- readonly size?: 'default' | 'compact';
6
- readonly narrow?: boolean;
5
+ readonly size?: "compact" | "default" | undefined;
6
+ readonly narrow?: boolean | undefined;
7
7
  }>;
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -6,7 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.RenderButton = void 0;
7
40
  const jsx_runtime_1 = require("react/jsx-runtime");
8
41
  const player_1 = require("@remotion/player");
9
- const react_1 = require("react");
42
+ const react_1 = __importStar(require("react"));
10
43
  const react_dom_1 = __importDefault(require("react-dom"));
11
44
  const remotion_1 = require("remotion");
12
45
  const client_id_1 = require("../helpers/client-id");
@@ -117,9 +150,9 @@ const getInitialRenderType = (readOnlyStudio) => {
117
150
  }
118
151
  return 'server-render';
119
152
  };
120
- const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow = false }) => {
153
+ const RenderButtonInner = ({ readOnlyStudio, size: controlSize = 'default', narrow = false }) => {
121
154
  const { inFrame, outFrame } = (0, in_out_1.useTimelineInOutFramePosition)();
122
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
155
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
123
156
  const [preferredRenderType, setPreferredRenderType] = (0, react_1.useState)(() => getInitialRenderType(readOnlyStudio));
124
157
  const [dropdownOpened, setDropdownOpened] = (0, react_1.useState)(false);
125
158
  const [hovered, setHovered] = (0, react_1.useState)(false);
@@ -193,8 +226,10 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
193
226
  };
194
227
  }, [controlSize]);
195
228
  const video = remotion_1.Internals.useVideo();
196
- const { getCurrentFrame } = player_1.PlayerInternals.usePlayer();
229
+ const { getCurrentFrame } = player_1.PlayerInternals.usePlayerMethods();
197
230
  const { props } = (0, react_1.useContext)(remotion_1.Internals.EditorPropsContext);
231
+ // Read the frame when the modal opens instead of subscribing this button to
232
+ // every timeline position update.
198
233
  const openServerRenderModal = (0, react_1.useCallback)((copyCommandOnly) => {
199
234
  var _a;
200
235
  var _b, _c;
@@ -258,7 +293,7 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
258
293
  initialMediaCacheSizeInBytes: defaults.mediaCacheSizeInBytes,
259
294
  renderDefaults: defaults,
260
295
  });
261
- }, [video, setSelectedModal, getCurrentFrame, props, inFrame, outFrame]);
296
+ }, [video, setSelectedModal, props, inFrame, outFrame, getCurrentFrame]);
262
297
  const openClientRenderModal = (0, react_1.useCallback)(() => {
263
298
  var _a;
264
299
  if (!video) {
@@ -292,7 +327,7 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
292
327
  initialMediaCacheSizeInBytes: defaults.mediaCacheSizeInBytes,
293
328
  initialPageResponsiveness: 'medium',
294
329
  });
295
- }, [video, setSelectedModal, getCurrentFrame, props, inFrame, outFrame]);
330
+ }, [video, setSelectedModal, props, inFrame, outFrame, getCurrentFrame]);
296
331
  const onClick = (0, react_1.useCallback)(() => {
297
332
  if (renderType === 'render-command') {
298
333
  openServerRenderModal(true);
@@ -469,4 +504,4 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
469
504
  ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHideDropdown, onEscape: onHideDropdown, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: () => { }, onPreviousMenu: () => { }, values: dropdownValues, onHide: onHideDropdown, leaveLeftSpace: false, preselectIndex: dropdownValues.findIndex((v) => v.id === renderType), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
470
505
  : null] }));
471
506
  };
472
- exports.RenderButton = RenderButton;
507
+ exports.RenderButton = react_1.default.memo(RenderButtonInner);
@@ -41,7 +41,7 @@ const buttonRow = {
41
41
  justifyContent: 'flex-end',
42
42
  };
43
43
  const RenderStatusModal = ({ jobId, }) => {
44
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
44
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
45
45
  const { jobs, removeClientJob, cancelClientJob } = (0, react_1.useContext)(context_1.RenderQueueContext);
46
46
  const job = jobs.find((j) => j.id === jobId);
47
47
  if (!job) {
@@ -8,4 +8,5 @@ export declare const ZodEnumEditor: React.FC<{
8
8
  readonly value: string;
9
9
  readonly setValue: UpdaterFunction<string>;
10
10
  readonly onRemove: null | (() => void);
11
+ readonly mayPad: boolean;
11
12
  }>;
@@ -14,7 +14,7 @@ const ZodFieldValidation_1 = require("./ZodFieldValidation");
14
14
  const container = {
15
15
  width: '100%',
16
16
  };
17
- const ZodEnumEditor = ({ schema, jsonPath, setValue, value, onRemove }) => {
17
+ const ZodEnumEditor = ({ schema, jsonPath, setValue, value, onRemove, mayPad }) => {
18
18
  const onChange = (0, react_2.useCallback)((updater, { shouldSave }) => {
19
19
  setValue(updater, { shouldSave });
20
20
  }, [setValue]);
@@ -38,7 +38,7 @@ const ZodEnumEditor = ({ schema, jsonPath, setValue, value, onRemove }) => {
38
38
  });
39
39
  }, [enumValues, onChange, value]);
40
40
  const zodValidation = (0, react_1.useMemo)(() => (0, zod_schema_type_1.zodSafeParse)(schema, value), [schema, value]);
41
- return (jsx_runtime_1.jsxs(Fieldset_1.Fieldset, { shouldPad: true, children: [
41
+ return (jsx_runtime_1.jsxs(Fieldset_1.Fieldset, { shouldPad: mayPad, children: [
42
42
  jsx_runtime_1.jsx(SchemaLabel_1.SchemaLabel, { handleClick: null, jsonPath: jsonPath, onRemove: onRemove, valid: zodValidation.success, suffix: null }), jsx_runtime_1.jsx("div", { style: isRoot ? undefined : container, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: comboBoxValues, selectedId: value, title: value, size: "small" }) }), jsx_runtime_1.jsx(ZodFieldValidation_1.ZodFieldValidation, { path: jsonPath, zodValidation: zodValidation })
43
43
  ] }));
44
44
  };