@remotion/studio 4.0.513 → 4.0.515

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 (204) hide show
  1. package/dist/Studio.js +2 -1
  2. package/dist/api/install-package.js +14 -1
  3. package/dist/components/AskAiModal.js +1 -1
  4. package/dist/components/AssetSelector.js +2 -0
  5. package/dist/components/AssetSelectorItem.d.ts +2 -1
  6. package/dist/components/AssetSelectorItem.js +19 -16
  7. package/dist/components/AudioWaveform.d.ts +3 -0
  8. package/dist/components/AudioWaveform.js +65 -199
  9. package/dist/components/Canvas.js +40 -5
  10. package/dist/components/CanvasOrLoading.js +5 -0
  11. package/dist/components/CompositionSelector.js +2 -0
  12. package/dist/components/ConfigureDefaultEditorModal.js +17 -11
  13. package/dist/components/Editor.js +16 -1
  14. package/dist/components/ElementInstallConfirmation.d.ts +1 -0
  15. package/dist/components/ElementInstallConfirmation.js +4 -2
  16. package/dist/components/FixComputedValueModal.d.ts +9 -0
  17. package/dist/components/FixComputedValueModal.js +217 -0
  18. package/dist/components/InitialCompositionLoader.js +19 -0
  19. package/dist/components/InlineDropdown.js +4 -4
  20. package/dist/components/InspectorInfoHeader.js +3 -3
  21. package/dist/components/InspectorOpenInEditor.js +3 -1
  22. package/dist/components/InspectorPanel/CompositionInspector.js +37 -5
  23. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +2 -2
  24. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +1 -1
  25. package/dist/components/InspectorPanel/EasingInspector.js +1 -1
  26. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -2
  27. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +1 -1
  28. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +35 -6
  29. package/dist/components/InspectorPanel/common.d.ts +5 -5
  30. package/dist/components/InspectorPanel/common.js +8 -8
  31. package/dist/components/InspectorPanel/styles.d.ts +1 -1
  32. package/dist/components/InspectorPanel/styles.js +4 -2
  33. package/dist/components/InspectorSourceLocation.d.ts +1 -1
  34. package/dist/components/InspectorSourceLocation.js +2 -2
  35. package/dist/components/InstallPackage.d.ts +1 -1
  36. package/dist/components/InstallPackage.js +38 -6
  37. package/dist/components/LicenseKeyValidation.js +2 -2
  38. package/dist/components/Menu/MenuDivider.js +1 -1
  39. package/dist/components/Modals.js +11 -3
  40. package/dist/components/NewComposition/CodemodFooter.d.ts +1 -0
  41. package/dist/components/NewComposition/CodemodFooter.js +10 -8
  42. package/dist/components/NewComposition/DeleteComposition.js +1 -1
  43. package/dist/components/NewComposition/DeleteFolder.js +1 -1
  44. package/dist/components/NewComposition/DuplicateComposition.js +7 -2
  45. package/dist/components/NewComposition/NewComposition.js +1 -1
  46. package/dist/components/NewComposition/NewFolder.js +1 -1
  47. package/dist/components/NewComposition/RenameComposition.js +1 -1
  48. package/dist/components/NewComposition/RenameFolder.js +1 -1
  49. package/dist/components/NewComposition/duplicate-composition-api.d.ts +16 -0
  50. package/dist/components/NewComposition/duplicate-composition-api.js +16 -0
  51. package/dist/components/NoRegisterRoot.js +1 -1
  52. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +4 -3
  53. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  54. package/dist/components/QuickSwitcher/fuzzy-search.js +1 -1
  55. package/dist/components/RefreshCompositionOverlay.js +1 -1
  56. package/dist/components/RenderButton.js +6 -3
  57. package/dist/components/RenderModal/GuiRenderStatus.js +3 -1
  58. package/dist/components/RenderModal/RenderModalOutputName.js +3 -3
  59. package/dist/components/RenderModal/WebRenderModal.js +10 -4
  60. package/dist/components/RenderModal/WebRenderModalAdvanced.d.ts +2 -0
  61. package/dist/components/RenderModal/WebRenderModalAdvanced.js +9 -2
  62. package/dist/components/RenderModal/render-modals.js +5 -1
  63. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +5 -1
  64. package/dist/components/RenderQueue/RenderQueueItem.js +3 -1
  65. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +3 -1
  66. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +1 -1
  67. package/dist/components/RenderQueue/actions.js +12 -2
  68. package/dist/components/RenderQueue/client-side-render-types.d.ts +1 -0
  69. package/dist/components/RenderingSettings.d.ts +2 -0
  70. package/dist/components/RenderingSettings.js +355 -0
  71. package/dist/components/SelectedOutlineCanvasRotation.d.ts +1 -0
  72. package/dist/components/SelectedOutlineCanvasRotation.js +11 -4
  73. package/dist/components/SelectedOutlineElement.js +3 -3
  74. package/dist/components/SelectedOutlinePolygon.d.ts +2 -0
  75. package/dist/components/SelectedOutlinePolygon.js +54 -9
  76. package/dist/components/SettingsContext.d.ts +4 -1
  77. package/dist/components/SettingsContext.js +9 -2
  78. package/dist/components/SettingsModal.d.ts +1 -1
  79. package/dist/components/SettingsModal.js +10 -1
  80. package/dist/components/SettingsModalFooter.js +1 -1
  81. package/dist/components/StudioSettings.d.ts +2 -0
  82. package/dist/components/StudioSettings.js +185 -0
  83. package/dist/components/Timeline/LoopedIndicator.js +1 -1
  84. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +3 -0
  85. package/dist/components/Timeline/LoopedTimelineIndicators.js +22 -14
  86. package/dist/components/Timeline/Timeline.js +11 -9
  87. package/dist/components/Timeline/TimelineAssetField.d.ts +2 -2
  88. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  89. package/dist/components/Timeline/TimelineClipboardKeybindings.js +6 -2
  90. package/dist/components/Timeline/TimelineDragHandler.js +62 -76
  91. package/dist/components/Timeline/TimelineEffectItem.js +23 -6
  92. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +4 -2
  93. package/dist/components/Timeline/TimelineEffectPropItem.js +22 -13
  94. package/dist/components/Timeline/TimelineExpandArrowButton.js +10 -7
  95. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +4 -1
  96. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -1
  97. package/dist/components/Timeline/TimelineExpandedRow.js +4 -4
  98. package/dist/components/Timeline/TimelineExpandedSection.js +8 -5
  99. package/dist/components/Timeline/TimelineHeightContainer.d.ts +0 -4
  100. package/dist/components/Timeline/TimelineHeightContainer.js +4 -4
  101. package/dist/components/Timeline/TimelineImageInfo.d.ts +1 -0
  102. package/dist/components/Timeline/TimelineImageInfo.js +3 -2
  103. package/dist/components/Timeline/TimelineKeyframeControls.js +6 -1
  104. package/dist/components/Timeline/TimelineList.d.ts +1 -5
  105. package/dist/components/Timeline/TimelineList.js +14 -9
  106. package/dist/components/Timeline/TimelinePinchZoom.js +5 -5
  107. package/dist/components/Timeline/TimelineRowChrome.d.ts +1 -2
  108. package/dist/components/Timeline/TimelineRowChrome.js +50 -7
  109. package/dist/components/Timeline/TimelineSchemaField.d.ts +7 -3
  110. package/dist/components/Timeline/TimelineSchemaField.js +71 -13
  111. package/dist/components/Timeline/TimelineScrollable.js +3 -1
  112. package/dist/components/Timeline/TimelineSelection.d.ts +13 -5
  113. package/dist/components/Timeline/TimelineSelection.js +95 -106
  114. package/dist/components/Timeline/TimelineSequence.js +59 -25
  115. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -1
  116. package/dist/components/Timeline/TimelineSequenceItem.js +21 -12
  117. package/dist/components/Timeline/TimelineSequenceName.js +1 -1
  118. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +2 -1
  119. package/dist/components/Timeline/TimelineSequencePropItem.js +3 -3
  120. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +33 -10
  121. package/dist/components/Timeline/TimelineSlider.js +42 -33
  122. package/dist/components/Timeline/TimelineTimeIndicators.js +90 -98
  123. package/dist/components/Timeline/TimelineTrack.js +4 -1
  124. package/dist/components/Timeline/TimelineTracks.d.ts +0 -2
  125. package/dist/components/Timeline/TimelineTracks.js +11 -4
  126. package/dist/components/Timeline/TimelineTransformOriginField.js +1 -1
  127. package/dist/components/Timeline/TimelineVideoInfo.d.ts +4 -4
  128. package/dist/components/Timeline/TimelineVideoInfo.js +155 -63
  129. package/dist/components/Timeline/TimelineViewport.d.ts +12 -0
  130. package/dist/components/Timeline/TimelineViewport.js +62 -0
  131. package/dist/components/Timeline/TimelineVirtualization.d.ts +22 -0
  132. package/dist/components/Timeline/TimelineVirtualization.js +144 -0
  133. package/dist/components/Timeline/TimelineZoomControls.js +16 -8
  134. package/dist/components/Timeline/call-add-keyframe.js +31 -3
  135. package/dist/components/Timeline/call-delete-keyframe.js +13 -3
  136. package/dist/components/Timeline/call-move-keyframe.js +11 -1
  137. package/dist/components/Timeline/call-update-keyframe-settings.js +31 -3
  138. package/dist/components/Timeline/delete-selected-timeline-item.js +8 -3
  139. package/dist/components/Timeline/duplicate-selected-timeline-item.js +4 -2
  140. package/dist/components/Timeline/get-timeline-keyframes.d.ts +1 -2
  141. package/dist/components/Timeline/get-timeline-keyframes.js +1 -8
  142. package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +30 -0
  143. package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +61 -0
  144. package/dist/components/Timeline/save-effect-prop.js +3 -3
  145. package/dist/components/Timeline/split-selected-timeline-item.js +2 -2
  146. package/dist/components/Timeline/timeline-scroll-logic.d.ts +24 -0
  147. package/dist/components/Timeline/timeline-scroll-logic.js +127 -4
  148. package/dist/components/Timeline/use-timeline-height.d.ts +3 -5
  149. package/dist/components/Timeline/use-timeline-height.js +16 -18
  150. package/dist/components/UpdateCheck.d.ts +2 -10
  151. package/dist/components/UpdateCheck.js +8 -2
  152. package/dist/components/VisualControls/VisualControlHandle.js +8 -0
  153. package/dist/components/delete-jsx-node-api.d.ts +2 -0
  154. package/dist/components/delete-jsx-node-api.js +12 -0
  155. package/dist/components/effect-drag-and-drop.js +6 -3
  156. package/dist/components/effect-operations-api.d.ts +8 -0
  157. package/dist/components/effect-operations-api.js +52 -0
  158. package/dist/components/element-install-api.d.ts +3 -0
  159. package/dist/components/element-install-api.js +19 -0
  160. package/dist/components/import-assets.js +20 -9
  161. package/dist/components/reorder-sequence-api.d.ts +2 -0
  162. package/dist/components/reorder-sequence-api.js +12 -0
  163. package/dist/components/split-jsx-sequence-api.d.ts +2 -0
  164. package/dist/components/split-jsx-sequence-api.js +12 -0
  165. package/dist/components/split-video-from-audio-api.d.ts +2 -0
  166. package/dist/components/split-video-from-audio-api.js +12 -0
  167. package/dist/error-overlay/remotion-overlay/Overlay.js +1 -1
  168. package/dist/error-overlay/remotion-overlay/log-studio-error.js +4 -0
  169. package/dist/esm/{chunk-r46yxrjr.js → chunk-s6k99gh2.js} +1 -1
  170. package/dist/esm/{chunk-tv7r0jy3.js → chunk-v5a8vpv4.js} +11479 -7851
  171. package/dist/esm/index.mjs +7 -5
  172. package/dist/esm/internals.mjs +11479 -7851
  173. package/dist/esm/previewEntry.mjs +11311 -7683
  174. package/dist/esm/renderEntry.mjs +3 -4
  175. package/dist/helpers/browser-studio-operations.d.ts +5 -0
  176. package/dist/helpers/browser-studio-operations.js +27 -1
  177. package/dist/helpers/colors.d.ts +1 -1
  178. package/dist/helpers/colors.js +1 -1
  179. package/dist/helpers/get-timeline-max-zoom.d.ts +26 -0
  180. package/dist/helpers/get-timeline-max-zoom.js +45 -0
  181. package/dist/helpers/inject-css.js +7 -5
  182. package/dist/helpers/render-codec-label.d.ts +1 -1
  183. package/dist/helpers/retry-payload.js +1 -0
  184. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  185. package/dist/helpers/studio-runtime-config.js +2 -3
  186. package/dist/helpers/timeline-layout.d.ts +3 -1
  187. package/dist/helpers/timeline-layout.js +6 -1
  188. package/dist/helpers/url-state.js +3 -2
  189. package/dist/helpers/use-max-media-duration.js +5 -3
  190. package/dist/helpers/use-media-metadata.js +37 -20
  191. package/dist/helpers/use-menu-structure.js +67 -84
  192. package/dist/helpers/use-runtime-values.d.ts +2 -1
  193. package/dist/helpers/use-runtime-values.js +7 -3
  194. package/dist/icons/cloud-download.d.ts +4 -0
  195. package/dist/icons/cloud-download.js +8 -0
  196. package/dist/icons/remotion-triangle.d.ts +2 -0
  197. package/dist/icons/remotion-triangle.js +7 -0
  198. package/dist/renderEntry.js +1 -1
  199. package/dist/state/composition-list.d.ts +13 -0
  200. package/dist/state/composition-list.js +21 -0
  201. package/dist/state/modals.d.ts +8 -2
  202. package/dist/state/timeline-zoom.d.ts +1 -2
  203. package/dist/state/timeline-zoom.js +9 -5
  204. package/package.json +14 -13
@@ -29,7 +29,6 @@ const browser_studio_operations_1 = require("./browser-studio-operations");
29
29
  const check_fullscreen_support_1 = require("./check-fullscreen-support");
30
30
  const client_id_1 = require("./client-id");
31
31
  const colors_1 = require("./colors");
32
- const download_blob_1 = require("./download-blob");
33
32
  const get_file_manager_name_1 = require("./get-file-manager-name");
34
33
  const get_git_menu_item_1 = require("./get-git-menu-item");
35
34
  const mobile_layout_1 = require("./mobile-layout");
@@ -47,8 +46,7 @@ const ICON_SIZE = 14;
47
46
  const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewServerState, setSelectedModal, }) => {
48
47
  const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
49
48
  const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
50
- const downloadProject = browserStudioOperations === null || browserStudioOperations === void 0 ? void 0 : browserStudioOperations.downloadProject;
51
- const items = [
49
+ const newProjectItems = [
52
50
  readOnlyStudio
53
51
  ? null
54
52
  : {
@@ -93,12 +91,8 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewS
93
91
  quickSwitcherLabel: 'New folder...',
94
92
  disabled: previewServerState !== 'connected',
95
93
  },
96
- readOnlyStudio
97
- ? null
98
- : {
99
- type: 'divider',
100
- id: 'new-project-item-divider',
101
- },
94
+ ].filter(no_react_1.NoReactInternals.truthy);
95
+ const projectItems = [
102
96
  window.remotion_isReadOnlyStudio
103
97
  ? {
104
98
  id: 'input-props-override',
@@ -117,35 +111,6 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewS
117
111
  quickSwitcherLabel: 'Override input props',
118
112
  }
119
113
  : null,
120
- downloadProject
121
- ? {
122
- id: 'download-project',
123
- value: 'download-project',
124
- label: 'Download project',
125
- onClick: async () => {
126
- closeMenu();
127
- try {
128
- const { data, fileName } = await downloadProject();
129
- const arrayBuffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
130
- (0, download_blob_1.downloadBlob)(new Blob([arrayBuffer], { type: 'application/zip' }), fileName);
131
- }
132
- catch (error) {
133
- (0, NotificationCenter_1.showNotification)(`Could not download project: ${error instanceof Error ? error.message : String(error)}`, 2000);
134
- }
135
- },
136
- type: 'item',
137
- keyHint: null,
138
- leftItem: null,
139
- subMenu: null,
140
- quickSwitcherLabel: 'Download project',
141
- }
142
- : null,
143
- !readOnlyStudio && downloadProject
144
- ? {
145
- type: 'divider',
146
- id: 'open-project-divider',
147
- }
148
- : null,
149
114
  editorName && editorId && !readOnlyStudio
150
115
  ? {
151
116
  id: 'open-in-editor',
@@ -178,7 +143,7 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewS
178
143
  disabled: previewServerState !== 'connected',
179
144
  }
180
145
  : null,
181
- !readOnlyStudio
146
+ !readOnlyStudio && browserStudioOperations === null
182
147
  ? {
183
148
  id: 'open-project-in-explorer',
184
149
  value: 'open-project-in-explorer',
@@ -199,6 +164,16 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewS
199
164
  : null,
200
165
  (0, get_git_menu_item_1.getGitMenuItem)(),
201
166
  ].filter(no_react_1.NoReactInternals.truthy);
167
+ const items = [
168
+ ...newProjectItems,
169
+ newProjectItems.length > 0 && projectItems.length > 0
170
+ ? {
171
+ type: 'divider',
172
+ id: 'new-project-item-divider',
173
+ }
174
+ : null,
175
+ ...projectItems,
176
+ ].filter(no_react_1.NoReactInternals.truthy);
202
177
  if (items.length === 0) {
203
178
  return null;
204
179
  }
@@ -268,13 +243,11 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
268
243
  const { defaultEditorId, defaultEditorName } = (0, use_default_editor_info_1.useEditorOpening)(type === 'connected');
269
244
  const keyboardShortcutsDisabled = (0, use_keybinding_1.areKeyboardShortcutsDisabled)();
270
245
  const studioAskAIEnabled = (0, studio_runtime_config_1.getStudioAskAIEnabled)();
271
- const canConfigureDefaultEditor = !readOnlyStudio &&
272
- type === 'connected' &&
273
- (0, browser_studio_operations_1.getBrowserStudioOperations)() === null;
274
246
  const { setSidebarCollapsedState, sidebarCollapsedStateLeft, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
275
247
  const sizes = (0, react_1.useMemo)(() => (0, SizeSelector_1.getUniqueSizes)(size), [size]);
276
248
  const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
277
249
  const { remotion_packageManager } = window;
250
+ const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
278
251
  const sizePreselectIndex = sizes.findIndex((s) => String(size.size) === String(s.size));
279
252
  const mobileLayout = (0, mobile_layout_1.useMobileLayout)();
280
253
  const currentComposition = (0, react_1.useMemo)(() => {
@@ -331,27 +304,29 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
331
304
  subMenu: null,
332
305
  quickSwitcherLabel: 'Help: Changelog',
333
306
  },
334
- {
335
- id: 'settings',
336
- value: 'settings',
337
- label: 'Settings...',
338
- onClick: () => {
339
- var _a;
340
- var _b;
341
- closeMenu();
342
- setSelectedModal({
343
- type: 'settings',
344
- initialTab: canConfigureDefaultEditor ? 'apps' : 'license',
345
- initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
346
- });
347
- },
348
- type: 'item',
349
- keyHint: null,
350
- leftItem: null,
351
- subMenu: null,
352
- quickSwitcherLabel: 'Settings...',
353
- disabled: readOnlyStudio || type !== 'connected',
354
- },
307
+ browserStudioOperations === null
308
+ ? {
309
+ id: 'settings',
310
+ value: 'settings',
311
+ label: 'Settings...',
312
+ onClick: () => {
313
+ var _a;
314
+ var _b;
315
+ closeMenu();
316
+ setSelectedModal({
317
+ type: 'settings',
318
+ initialTab: 'rendering',
319
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
320
+ });
321
+ },
322
+ type: 'item',
323
+ keyHint: null,
324
+ leftItem: null,
325
+ subMenu: null,
326
+ quickSwitcherLabel: 'Settings...',
327
+ disabled: readOnlyStudio || type !== 'connected',
328
+ }
329
+ : null,
355
330
  {
356
331
  id: 'acknowledgements',
357
332
  value: 'acknowledgements',
@@ -366,24 +341,28 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
366
341
  subMenu: null,
367
342
  quickSwitcherLabel: 'Help: Acknowledgements',
368
343
  },
369
- {
370
- type: 'divider',
371
- id: 'timeline-divider-1',
372
- },
373
- {
374
- id: 'restart-studio',
375
- value: 'restart-studio',
376
- label: 'Restart Studio Server',
377
- onClick: () => {
378
- closeMenu();
379
- (0, restart_studio_1.restartStudio)();
380
- },
381
- type: 'item',
382
- keyHint: null,
383
- leftItem: null,
384
- subMenu: null,
385
- quickSwitcherLabel: 'Restart Studio Server',
386
- },
344
+ browserStudioOperations === null
345
+ ? {
346
+ type: 'divider',
347
+ id: 'timeline-divider-1',
348
+ }
349
+ : null,
350
+ browserStudioOperations === null
351
+ ? {
352
+ id: 'restart-studio',
353
+ value: 'restart-studio',
354
+ label: 'Restart Studio Server',
355
+ onClick: () => {
356
+ closeMenu();
357
+ (0, restart_studio_1.restartStudio)();
358
+ },
359
+ type: 'item',
360
+ keyHint: null,
361
+ leftItem: null,
362
+ subMenu: null,
363
+ quickSwitcherLabel: 'Restart Studio Server',
364
+ }
365
+ : null,
387
366
  ].filter(no_react_1.NoReactInternals.truthy),
388
367
  quickSwitcherLabel: null,
389
368
  },
@@ -801,7 +780,9 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
801
780
  quickSwitcherLabel: 'Show Color Picker',
802
781
  }
803
782
  : null,
804
- readOnlyStudio || remotion_packageManager === 'unknown'
783
+ !(0, browser_studio_operations_1.canInstallPackages)() ||
784
+ (browserStudioOperations === null &&
785
+ remotion_packageManager === 'unknown')
805
786
  ? null
806
787
  : {
807
788
  id: 'install-packages',
@@ -811,7 +792,9 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
811
792
  closeMenu();
812
793
  setSelectedModal({
813
794
  type: 'install-packages',
814
- packageManager: remotion_packageManager,
795
+ packageManager: remotion_packageManager === 'unknown'
796
+ ? null
797
+ : remotion_packageManager,
815
798
  });
816
799
  },
817
800
  type: 'item',
@@ -999,7 +982,6 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
999
982
  }
1000
983
  return struct;
1001
984
  }, [
1002
- canConfigureDefaultEditor,
1003
985
  readOnlyStudio,
1004
986
  closeMenu,
1005
987
  type,
@@ -1021,6 +1003,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
1021
1003
  defaultEditorName,
1022
1004
  keyboardShortcutsDisabled,
1023
1005
  studioAskAIEnabled,
1006
+ browserStudioOperations,
1024
1007
  size.size,
1025
1008
  setSize,
1026
1009
  setEditorZoomGestures,
@@ -1,6 +1,7 @@
1
- import type { SequenceRegistrationControls } from 'remotion';
1
+ import type { RuntimeValueStore, SequenceRegistrationControls } from 'remotion';
2
2
  export declare const useRuntimeValues: (controls: SequenceRegistrationControls | null) => Readonly<Record<string, unknown>>;
3
3
  export declare const useRuntimeValue: (controls: SequenceRegistrationControls | null, key: string) => unknown;
4
+ export declare const useRuntimeStoreValue: (storeOrNull: RuntimeValueStore | null, key: string) => unknown;
4
5
  export declare const useRuntimeValueSelector: <T>({ controls, selector, isEqual, }: {
5
6
  controls: SequenceRegistrationControls | null;
6
7
  selector: (values: Readonly<Record<string, unknown>>) => T;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useRuntimeValueSnapshots = exports.useRuntimeValueSelector = exports.useRuntimeValue = exports.useRuntimeValues = void 0;
3
+ exports.useRuntimeValueSnapshots = exports.useRuntimeValueSelector = exports.useRuntimeStoreValue = exports.useRuntimeValue = exports.useRuntimeValues = void 0;
4
4
  const react_1 = require("react");
5
5
  const EMPTY_RUNTIME_VALUES = {};
6
6
  const EMPTY_RUNTIME_VALUE_STORE = {
@@ -15,11 +15,15 @@ const useRuntimeValues = (controls) => {
15
15
  exports.useRuntimeValues = useRuntimeValues;
16
16
  const useRuntimeValue = (controls, key) => {
17
17
  var _a;
18
- const store = (_a = controls === null || controls === void 0 ? void 0 : controls.runtimeValues) !== null && _a !== void 0 ? _a : EMPTY_RUNTIME_VALUE_STORE;
18
+ return (0, exports.useRuntimeStoreValue)((_a = controls === null || controls === void 0 ? void 0 : controls.runtimeValues) !== null && _a !== void 0 ? _a : null, key);
19
+ };
20
+ exports.useRuntimeValue = useRuntimeValue;
21
+ const useRuntimeStoreValue = (storeOrNull, key) => {
22
+ const store = storeOrNull !== null && storeOrNull !== void 0 ? storeOrNull : EMPTY_RUNTIME_VALUE_STORE;
19
23
  const getSnapshot = (0, react_1.useCallback)(() => store.getSnapshot()[key], [key, store]);
20
24
  return (0, react_1.useSyncExternalStore)(store.subscribe, getSnapshot, getSnapshot);
21
25
  };
22
- exports.useRuntimeValue = useRuntimeValue;
26
+ exports.useRuntimeStoreValue = useRuntimeStoreValue;
23
27
  const useRuntimeValueSelector = ({ controls, selector, isEqual = Object.is, }) => {
24
28
  var _a;
25
29
  const store = (_a = controls === null || controls === void 0 ? void 0 : controls.runtimeValues) !== null && _a !== void 0 ? _a : EMPTY_RUNTIME_VALUE_STORE;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const CloudDownloadIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ readonly color: string;
4
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudDownloadIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const CloudDownloadIcon = ({ color, ...props }) => {
6
+ return (jsx_runtime_1.jsx("svg", { ...props, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 576 512", children: jsx_runtime_1.jsx("path", { fill: color, d: "M128 176c0-61.9 50.1-112 112-112 39.3 0 73.8 20.2 93.8 50.8 4.4 6.7 13.1 9.1 20.3 5.7 11.4-5.5 24.3-8.5 37.9-8.5 48.6 0 88 39.4 88 88 0 14.1-3.3 27.4-9.2 39.2-2 4.1-2.2 8.9-.5 13.1s5.2 7.6 9.5 9.1c37.4 13.1 64.2 48.8 64.2 90.6 0 53-43 96-96 96l-304 0c-61.9 0-112-50.1-112-112 0-53.7 37.8-98.6 88.2-109.5 4.3-.9 8.1-3.6 10.3-7.4s2.9-8.3 1.7-12.6c-2.7-9.7-4.2-19.9-4.2-30.5zM240 32c-79.5 0-144 64.5-144 144 0 8 .7 15.9 1.9 23.5-56.9 19.2-97.9 73-97.9 136.5 0 79.5 64.5 144 144 144l304 0c70.7 0 128-57.3 128-128 0-49.9-28.5-93-70.1-114.2 3.9-11.9 6.1-24.6 6.1-37.8 0-66.3-53.7-120-120-120-13.7 0-26.9 2.3-39.2 6.5-26.4-33.2-67.1-54.5-112.8-54.5zM371.3 307.3c6.2-6.2 6.2-16.4 0-22.6s-16.4-6.2-22.6 0L304 329.4 304 208c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 121.4-44.7-44.7c-6.2-6.2-16.4-6.2-22.6 0s-6.2 16.4 0 22.6l72 72c6.2 6.2 16.4 6.2 22.6 0l72-72z" }) }));
7
+ };
8
+ exports.CloudDownloadIcon = CloudDownloadIcon;
@@ -0,0 +1,2 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const RemotionTriangleIcon: ({ color, ...props }: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemotionTriangleIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const colors_1 = require("../helpers/colors");
6
+ const RemotionTriangleIcon = ({ color, ...props }) => (jsx_runtime_1.jsx("svg", { viewBox: "-14 -14 438 453", fill: "none", xmlns: "http://www.w3.org/2000/svg", ...props, children: jsx_runtime_1.jsx("path", { d: "M92.3905 0.603638C83.5124 1.08554 76.358 2.49417 69.1481 5.2373C65.5523 6.59033 59.6583 9.53735 56.4148 11.5762C42.8474 20.0836 32.5051 32.8724 27.1115 47.7558C26.0365 50.7028 23.1266 60.0998 21.2546 66.5684C8.78078 109.81 1.70055 157.092 0.180713 207.135C-0.0602375 215.105 -0.0602375 234.084 0.180713 241.925C1.20012 275.102 4.36954 305.053 10.1153 335.599C12.4506 347.961 16.1946 364.568 18.3632 372.112C22.793 387.44 31.8379 400.488 44.7009 410.052C53.3195 416.465 63.1058 420.765 73.9485 422.878C79.1753 423.897 86.0702 424.361 91.1487 424.027C98.1733 423.564 112.111 421.692 123.436 419.672C174.48 410.571 221.632 394.279 264.392 370.963C291.471 356.19 314.621 340.195 336.955 320.789C359.215 301.476 378.194 280.699 394.894 257.382C398.768 251.989 400.714 248.838 402.66 244.872C407.665 234.64 410.018 224.465 410 213.085C410 202.483 407.998 193.067 403.68 183.429C401.604 178.777 399.62 175.441 395.172 169.102C378.788 145.767 360.605 125.434 338.438 105.676C304.074 75.0573 263.261 49.9428 217.685 31.3526C207.806 27.3306 198.075 23.7905 186.361 19.9538C161.562 11.8542 130.868 4.82956 104.901 1.32651C100.824 0.770477 95.2819 0.455353 92.3905 0.603638Z", stroke: color !== null && color !== void 0 ? color : colors_1.CURRENT_COLOR_LOWERCASE, strokeLinejoin: "round", strokeWidth: 24 }) }));
7
+ exports.RemotionTriangleIcon = RemotionTriangleIcon;
@@ -89,7 +89,7 @@ const DelayedSpinner = () => {
89
89
  if (!show) {
90
90
  return null;
91
91
  }
92
- return (jsx_runtime_1.jsx(remotion_1.AbsoluteFill, { style: {
92
+ return (jsx_runtime_1.jsx(remotion_1.Internals.AbsoluteFillElement, { style: {
93
93
  justifyContent: 'center',
94
94
  alignItems: 'center',
95
95
  fontSize: 13,
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ type CompositionListState = 'loading' | 'ready';
3
+ export declare const compositionListRenderedRef: {
4
+ current: boolean;
5
+ };
6
+ export declare const CompositionListContext: React.Context<{
7
+ compositionListState: CompositionListState;
8
+ setCompositionListState: React.Dispatch<React.SetStateAction<CompositionListState>>;
9
+ }>;
10
+ export declare const CompositionListProvider: React.FC<{
11
+ readonly children: React.ReactNode;
12
+ }>;
13
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompositionListProvider = exports.CompositionListContext = exports.compositionListRenderedRef = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ exports.compositionListRenderedRef = { current: false };
7
+ exports.CompositionListContext = (0, react_1.createContext)({
8
+ compositionListState: 'loading',
9
+ setCompositionListState: () => {
10
+ throw new Error('CompositionListContext provider is missing');
11
+ },
12
+ });
13
+ const CompositionListProvider = ({ children }) => {
14
+ const [compositionListState, setCompositionListState] = (0, react_1.useState)(() => {
15
+ exports.compositionListRenderedRef.current = false;
16
+ return 'loading';
17
+ });
18
+ const value = (0, react_1.useMemo)(() => ({ compositionListState, setCompositionListState }), [compositionListState]);
19
+ return (jsx_runtime_1.jsx(exports.CompositionListContext.Provider, { value: value, children: children }));
20
+ };
21
+ exports.CompositionListProvider = CompositionListProvider;
@@ -31,6 +31,7 @@ export type WebRenderModalState = {
31
31
  initialTransparent: boolean | null;
32
32
  initialMuted: boolean | null;
33
33
  initialMediaCacheSizeInBytes: number | null;
34
+ initialAllowHtmlInCanvas: boolean;
34
35
  initialPageResponsiveness: WebRendererPageResponsiveness;
35
36
  };
36
37
  export type RenderModalState = {
@@ -153,7 +154,7 @@ export type ModalState = {
153
154
  type: 'input-props-override';
154
155
  } | {
155
156
  type: 'settings';
156
- initialTab: 'apps' | 'license';
157
+ initialTab: 'apps' | 'rendering' | 'studio' | 'license';
157
158
  initialPublicLicenseKey: string | null;
158
159
  } | RenderModalState | WebRenderModalState | {
159
160
  type: 'render-progress';
@@ -162,9 +163,14 @@ export type ModalState = {
162
163
  type: 'update';
163
164
  info: UpdateInfo;
164
165
  knownBugs: Bug[];
166
+ } | {
167
+ type: 'fix-computed-value';
168
+ prop: string;
169
+ context: string;
170
+ remotionInteractivitySkillAvailable: boolean;
165
171
  } | {
166
172
  type: 'install-packages';
167
- packageManager: PackageManager;
173
+ packageManager: PackageManager | null;
168
174
  } | {
169
175
  type: 'quick-switcher';
170
176
  mode: QuickSwitcherMode;
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
- export declare const TIMELINE_MIN_ZOOM = 1;
3
- export declare const TIMELINE_MAX_ZOOM = 5;
2
+ export { getTimelineMaxZoom, TIMELINE_MIN_ZOOM, } from '../helpers/get-timeline-max-zoom';
4
3
  export type TimelineSetZoomOptions = {
5
4
  anchorFrame: number | null;
6
5
  anchorContentX: number | null;
@@ -1,14 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimelineZoomContext = exports.TimelineZoomCtx = exports.TIMELINE_MAX_ZOOM = exports.TIMELINE_MIN_ZOOM = void 0;
3
+ exports.TimelineZoomContext = exports.TimelineZoomCtx = exports.TIMELINE_MIN_ZOOM = exports.getTimelineMaxZoom = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const react_dom_1 = require("react-dom");
7
7
  const imperative_state_1 = require("../components/Timeline/imperative-state");
8
8
  const timeline_scroll_logic_1 = require("../components/Timeline/timeline-scroll-logic");
9
9
  const ZoomPersistor_1 = require("../components/ZoomPersistor");
10
- exports.TIMELINE_MIN_ZOOM = 1;
11
- exports.TIMELINE_MAX_ZOOM = 5;
10
+ const get_timeline_max_zoom_1 = require("../helpers/get-timeline-max-zoom");
11
+ const get_timeline_max_zoom_2 = require("../helpers/get-timeline-max-zoom");
12
+ Object.defineProperty(exports, "getTimelineMaxZoom", { enumerable: true, get: function () { return get_timeline_max_zoom_2.getTimelineMaxZoom; } });
13
+ Object.defineProperty(exports, "TIMELINE_MIN_ZOOM", { enumerable: true, get: function () { return get_timeline_max_zoom_2.TIMELINE_MIN_ZOOM; } });
12
14
  exports.TimelineZoomCtx = (0, react_1.createContext)({
13
15
  zoom: {},
14
16
  setZoom: () => {
@@ -29,8 +31,10 @@ const TimelineZoomContext = ({ children }) => {
29
31
  (0, react_dom_1.flushSync)(() => {
30
32
  setZoomState((prevZoomMap) => {
31
33
  var _a;
32
- const newZoomWithFloatingPointErrors = Math.min(exports.TIMELINE_MAX_ZOOM, Math.max(exports.TIMELINE_MIN_ZOOM, callback((_a = prevZoomMap[compositionId]) !== null && _a !== void 0 ? _a : exports.TIMELINE_MIN_ZOOM)));
33
- const newZoom = Math.round(newZoomWithFloatingPointErrors * 10) / 10;
34
+ const newZoom = (0, get_timeline_max_zoom_1.clampTimelineZoom)({
35
+ zoom: callback((_a = prevZoomMap[compositionId]) !== null && _a !== void 0 ? _a : get_timeline_max_zoom_1.TIMELINE_MIN_ZOOM),
36
+ durationInFrames: (0, imperative_state_1.getCurrentDuration)(),
37
+ });
34
38
  return { ...prevZoomMap, [compositionId]: newZoom };
35
39
  });
36
40
  });
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.513",
6
+ "version": "4.0.515",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -24,19 +24,20 @@
24
24
  "react-dom": ">=16.8.0"
25
25
  },
26
26
  "dependencies": {
27
- "@remotion/studio-protocol": "4.0.513",
27
+ "@tanstack/react-virtual": "3.14.9",
28
+ "@remotion/studio-protocol": "4.0.515",
28
29
  "semver": "7.5.3",
29
- "remotion": "4.0.513",
30
- "@remotion/captions": "4.0.513",
31
- "@remotion/player": "4.0.513",
32
- "@remotion/media-utils": "4.0.513",
33
- "@remotion/renderer": "4.0.513",
34
- "@remotion/web-renderer": "4.0.513",
35
- "@remotion/studio-shared": "4.0.513",
36
- "@remotion/timeline-utils": "4.0.513",
37
- "@remotion/zod-types": "4.0.513",
30
+ "remotion": "4.0.515",
31
+ "@remotion/captions": "4.0.515",
32
+ "@remotion/player": "4.0.515",
33
+ "@remotion/media-utils": "4.0.515",
34
+ "@remotion/renderer": "4.0.515",
35
+ "@remotion/web-renderer": "4.0.515",
36
+ "@remotion/studio-shared": "4.0.515",
37
+ "@remotion/timeline-utils": "4.0.515",
38
+ "@remotion/zod-types": "4.0.515",
38
39
  "@jridgewell/trace-mapping": "0.3.31",
39
- "mediabunny": "1.50.8",
40
+ "mediabunny": "1.55.1",
40
41
  "memfs": "3.4.3",
41
42
  "open": "8.4.2",
42
43
  "zod": "4.4.3"
@@ -45,7 +46,7 @@
45
46
  "react": "19.2.3",
46
47
  "react-dom": "19.2.3",
47
48
  "@types/semver": "7.5.3",
48
- "@remotion/eslint-config-internal": "4.0.513",
49
+ "@remotion/eslint-config-internal": "4.0.515",
49
50
  "eslint": "9.19.0",
50
51
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
51
52
  },