@remotion/studio 4.0.520 → 4.0.522

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 (117) hide show
  1. package/dist/api/shut-down-studio.d.ts +6 -0
  2. package/dist/api/shut-down-studio.js +23 -0
  3. package/dist/components/AudioWaveform.js +10 -6
  4. package/dist/components/Canvas.js +84 -12
  5. package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
  6. package/dist/components/CaptionInspector.d.ts +1 -0
  7. package/dist/components/CaptionInspector.js +43 -2
  8. package/dist/components/CaptionTextEditor.js +1 -1
  9. package/dist/components/CompositionSelector.js +41 -30
  10. package/dist/components/CompositionSelectorItem.d.ts +7 -0
  11. package/dist/components/CompositionSelectorItem.js +343 -67
  12. package/dist/components/CopyButton.js +7 -14
  13. package/dist/components/Editor.js +6 -5
  14. package/dist/components/EditorContent.js +1 -1
  15. package/dist/components/ElementInstallConfirmation.js +77 -65
  16. package/dist/components/ElementLibraryModal.js +3 -1
  17. package/dist/components/FixComputedValueModal.js +20 -10
  18. package/dist/components/InlineCaptionInspector.js +37 -1
  19. package/dist/components/InspectorLocationCopy.js +10 -5
  20. package/dist/components/InspectorPanel/ElementLibraryButton.js +3 -18
  21. package/dist/components/InspectorSequenceSection.js +1 -4
  22. package/dist/components/Menu/MenuSubItem.js +1 -1
  23. package/dist/components/MenuBuildIndicator.js +7 -2
  24. package/dist/components/MenuCompositionName.js +62 -6
  25. package/dist/components/ModalContainer.d.ts +1 -0
  26. package/dist/components/ModalContainer.js +2 -2
  27. package/dist/components/ModalHeader.js +5 -1
  28. package/dist/components/QuickSwitcher/asset-search.d.ts +0 -1
  29. package/dist/components/QuickSwitcher/asset-search.js +1 -16
  30. package/dist/components/RenderButton.js +2 -2
  31. package/dist/components/RenderModal/CliCopyButton.js +13 -27
  32. package/dist/components/RenderModal/RenderStatusModal.js +7 -1
  33. package/dist/components/RenderModal/ServerRenderModal.js +1 -1
  34. package/dist/components/RenderModal/WebRenderModal.js +1 -1
  35. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +1 -1
  36. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
  37. package/dist/components/SettingsModal.js +8 -5
  38. package/dist/components/SidebarCollapserControls.js +11 -5
  39. package/dist/components/SkillsSettings.js +9 -5
  40. package/dist/components/Splitter/SplitterContainer.js +63 -10
  41. package/dist/components/Splitter/SplitterContext.d.ts +3 -0
  42. package/dist/components/Splitter/SplitterContext.js +5 -1
  43. package/dist/components/Splitter/SplitterElement.js +11 -2
  44. package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
  45. package/dist/components/Splitter/SplitterHandle.js +55 -25
  46. package/dist/components/TimeValue.js +36 -7
  47. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  48. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  49. package/dist/components/Timeline/Timeline.d.ts +1 -1
  50. package/dist/components/Timeline/Timeline.js +45 -22
  51. package/dist/components/Timeline/TimelineAssetField.d.ts +0 -1
  52. package/dist/components/Timeline/TimelineAssetField.js +16 -9
  53. package/dist/components/Timeline/TimelineCollapseToggle.js +1 -1
  54. package/dist/components/Timeline/TimelineDragHandler.js +9 -4
  55. package/dist/components/Timeline/TimelineFontWeightField.d.ts +11 -0
  56. package/dist/components/Timeline/TimelineFontWeightField.js +65 -0
  57. package/dist/components/Timeline/TimelineLayerChildren.d.ts +21 -0
  58. package/dist/components/Timeline/TimelineLayerChildren.js +129 -0
  59. package/dist/components/Timeline/TimelineNumberField.js +13 -5
  60. package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
  61. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
  62. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
  63. package/dist/components/Timeline/TimelineSequence.js +113 -42
  64. package/dist/components/Timeline/TimelineSequenceItem.js +14 -2
  65. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +13 -3
  66. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +185 -126
  67. package/dist/components/Timeline/TimelineSlider.js +1 -4
  68. package/dist/components/Timeline/TimelineTickFormatProvider.d.ts +8 -0
  69. package/dist/components/Timeline/TimelineTickFormatProvider.js +16 -0
  70. package/dist/components/Timeline/TimelineTimeIndicators.js +7 -3
  71. package/dist/components/Timeline/TimelineVideoInfo.js +7 -3
  72. package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
  73. package/dist/components/Timeline/TimelineZoomControls.js +20 -20
  74. package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
  75. package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
  76. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  77. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
  78. package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
  79. package/dist/components/TopPanel.js +3 -19
  80. package/dist/components/UpdateStatusContext.d.ts +5 -0
  81. package/dist/components/UpdateStatusContext.js +53 -2
  82. package/dist/components/UpdatesSettings.js +34 -9
  83. package/dist/components/WebMcp.js +26 -0
  84. package/dist/components/ZoomPersistor.js +6 -3
  85. package/dist/components/composition-menu-items.js +1 -1
  86. package/dist/components/composition-selector-drag-data.d.ts +27 -0
  87. package/dist/components/composition-selector-drag-data.js +80 -0
  88. package/dist/components/import-assets.d.ts +2 -1
  89. package/dist/components/import-assets.js +11 -1
  90. package/dist/components/parse-caption-file.d.ts +5 -0
  91. package/dist/components/parse-caption-file.js +63 -0
  92. package/dist/esm/{chunk-np6q13k5.js → chunk-3netyjd9.js} +7943 -6314
  93. package/dist/esm/index.mjs +23 -8
  94. package/dist/esm/internals.mjs +7965 -6336
  95. package/dist/esm/previewEntry.mjs +8007 -6378
  96. package/dist/esm/renderEntry.mjs +1 -1
  97. package/dist/helpers/copy-text.js +1 -2
  98. package/dist/helpers/get-preview-file-type.js +22 -3
  99. package/dist/helpers/inserted-element-selection.d.ts +2 -1
  100. package/dist/helpers/use-copy-feedback.d.ts +4 -0
  101. package/dist/helpers/use-copy-feedback.js +19 -0
  102. package/dist/helpers/use-menu-structure.js +2 -2
  103. package/dist/icons/copy.d.ts +5 -0
  104. package/dist/icons/copy.js +12 -0
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.js +3 -1
  107. package/dist/state/canvas-ref.d.ts +1 -0
  108. package/dist/state/canvas-ref.js +2 -1
  109. package/dist/state/modals.d.ts +0 -2
  110. package/dist/state/sidebar.d.ts +3 -0
  111. package/dist/state/sidebar.js +6 -1
  112. package/dist/state/timeline-zoom.d.ts +1 -1
  113. package/dist/state/timeline-zoom.js +3 -3
  114. package/dist/visual-controls/VisualControls.js +4 -0
  115. package/package.json +16 -16
  116. package/dist/helpers/use-max-media-duration.d.ts +0 -2
  117. package/dist/helpers/use-max-media-duration.js +0 -61
@@ -215,7 +215,7 @@ var renderContent = (Root) => {
215
215
  renderToDOM(/* @__PURE__ */ jsx("div", {
216
216
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
217
217
  }));
218
- import("./chunk-np6q13k5.js").then(({ StudioInternals }) => {
218
+ import("./chunk-3netyjd9.js").then(({ StudioInternals }) => {
219
219
  window.remotion_isStudio = true;
220
220
  window.remotion_isReadOnlyStudio = true;
221
221
  window.remotion_inputProps = "{}";
@@ -8,8 +8,7 @@ const copyText = (cmd) => {
8
8
  .query({ name: permissionName })
9
9
  .then((result) => {
10
10
  if (result.state === 'granted' || result.state === 'prompt') {
11
- navigator.clipboard.writeText(cmd);
12
- resolve();
11
+ navigator.clipboard.writeText(cmd).then(resolve).catch(reject);
13
12
  }
14
13
  else {
15
14
  reject(new Error('Permission to copy not granted'));
@@ -6,9 +6,28 @@ const getPreviewFileType = (fileName) => {
6
6
  if (!fileName) {
7
7
  return 'other';
8
8
  }
9
- const audioExtensions = ['mp3', 'wav', 'ogg', 'aac'];
10
- const videoExtensions = ['mp4', 'avi', 'mkv', 'mov', 'webm'];
11
- const imageExtensions = ['jpg', 'jpeg', 'png', 'apng', 'gif', 'bmp', 'webp'];
9
+ const audioExtensions = ['mp3', 'wav', 'ogg', 'aac', 'm4a', 'flac'];
10
+ const videoExtensions = [
11
+ 'mp4',
12
+ 'avi',
13
+ 'mkv',
14
+ 'mov',
15
+ 'webm',
16
+ 'm4v',
17
+ 'ts',
18
+ 'm2ts',
19
+ 'm3u8',
20
+ ];
21
+ const imageExtensions = [
22
+ 'jpg',
23
+ 'jpeg',
24
+ 'png',
25
+ 'apng',
26
+ 'gif',
27
+ 'bmp',
28
+ 'webp',
29
+ 'svg',
30
+ ];
12
31
  const fontExtensions = ['woff', 'woff2', 'ttf', 'otf', 'eot'];
13
32
  const fileExtension = (_a = fileName.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
14
33
  if (fileExtension === undefined) {
@@ -1,10 +1,11 @@
1
1
  import type { SequenceNodePath } from 'remotion';
2
2
  export type PendingInsertedElementSelection = {
3
3
  compositionId: string;
4
+ notification: string | null;
4
5
  nodePath: {
5
6
  absolutePath: string;
6
7
  nodePath: SequenceNodePath;
7
- };
8
+ } | null;
8
9
  };
9
10
  export declare const requestInsertedElementSelection: (selection: PendingInsertedElementSelection) => void;
10
11
  export declare const clearInsertedElementSelection: (selection: PendingInsertedElementSelection) => void;
@@ -0,0 +1,4 @@
1
+ export declare const useCopyFeedback: () => {
2
+ copied: boolean;
3
+ markCopied: () => void;
4
+ };
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCopyFeedback = void 0;
4
+ const react_1 = require("react");
5
+ const useCopyFeedback = () => {
6
+ const [copyCount, setCopyCount] = (0, react_1.useState)(0);
7
+ (0, react_1.useEffect)(() => {
8
+ if (copyCount === 0) {
9
+ return;
10
+ }
11
+ const timeout = setTimeout(() => setCopyCount(0), 2000);
12
+ return () => clearTimeout(timeout);
13
+ }, [copyCount]);
14
+ const markCopied = (0, react_1.useCallback)(() => {
15
+ setCopyCount((currentCopyCount) => currentCopyCount + 1);
16
+ }, []);
17
+ return { copied: copyCount > 0, markCopied };
18
+ };
19
+ exports.useCopyFeedback = useCopyFeedback;
@@ -212,7 +212,7 @@ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, })
212
212
  {
213
213
  id: 'render-on-web',
214
214
  value: 'render-on-web',
215
- label: 'Render on web...',
215
+ label: 'Render in browser...',
216
216
  onClick: () => {
217
217
  closeMenu();
218
218
  const renderButton = document.getElementById('render-modal-button-client');
@@ -222,7 +222,7 @@ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, })
222
222
  keyHint: null,
223
223
  leftItem: null,
224
224
  subMenu: null,
225
- quickSwitcherLabel: 'Render on web...',
225
+ quickSwitcherLabel: 'Render in browser...',
226
226
  },
227
227
  {
228
228
  type: 'divider',
@@ -0,0 +1,5 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const CopyIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ readonly copied: boolean;
4
+ readonly color?: string;
5
+ }>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CopyIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const clipboard_1 = require("./clipboard");
6
+ const CopyIcon = ({ copied, color, style, ...props }) => {
7
+ if (copied) {
8
+ return (jsx_runtime_1.jsx("svg", { viewBox: "0 0 512 512", style: style, ...props, children: jsx_runtime_1.jsx("path", { fill: color, d: "M435.848 83.466L172.804 346.51l-96.652-96.652c-4.686-4.686-12.284-4.686-16.971 0l-28.284 28.284c-4.686 4.686-4.686 12.284 0 16.971l133.421 133.421c4.686 4.686 12.284 4.686 16.971 0l299.813-299.813c4.686-4.686 4.686-12.284 0-16.971l-28.284-28.284c-4.686-4.686-12.284-4.686-16.97 0z" }) }));
9
+ }
10
+ return jsx_runtime_1.jsx(clipboard_1.ClipboardIcon, { color: color, style: style, ...props });
11
+ };
12
+ exports.CopyIcon = CopyIcon;
package/dist/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export { pause } from './api/pause';
7
7
  export { play } from './api/play';
8
8
  export { reevaluateComposition } from './api/reevaluate-composition';
9
9
  export { restartStudio } from './api/restart-studio';
10
+ export { shutDownStudio } from './api/shut-down-studio';
10
11
  export { saveDefaultProps } from './api/save-default-props';
11
12
  export { seek } from './api/seek';
12
13
  export { toggle } from './api/toggle';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StudioInternals = exports.writeStaticFile = exports.watchStaticFile = exports.watchPublicFolder = exports.visualControl = exports.updateDefaultProps = exports.toggle = exports.seek = exports.saveDefaultProps = exports.restartStudio = exports.reevaluateComposition = exports.play = exports.pause = exports.goToComposition = exports.getStaticFiles = exports.focusDefaultPropsPath = exports.deleteStaticFile = void 0;
3
+ exports.StudioInternals = exports.writeStaticFile = exports.watchStaticFile = exports.watchPublicFolder = exports.visualControl = exports.updateDefaultProps = exports.toggle = exports.seek = exports.saveDefaultProps = exports.shutDownStudio = exports.restartStudio = exports.reevaluateComposition = exports.play = exports.pause = exports.goToComposition = exports.getStaticFiles = exports.focusDefaultPropsPath = exports.deleteStaticFile = void 0;
4
4
  const create_composition_1 = require("./api/create-composition");
5
5
  const CodingAgentIcon_1 = require("./components/CodingAgentIcon");
6
6
  const editor_1 = require("./icons/editor");
@@ -22,6 +22,8 @@ const reevaluate_composition_1 = require("./api/reevaluate-composition");
22
22
  Object.defineProperty(exports, "reevaluateComposition", { enumerable: true, get: function () { return reevaluate_composition_1.reevaluateComposition; } });
23
23
  const restart_studio_1 = require("./api/restart-studio");
24
24
  Object.defineProperty(exports, "restartStudio", { enumerable: true, get: function () { return restart_studio_1.restartStudio; } });
25
+ const shut_down_studio_1 = require("./api/shut-down-studio");
26
+ Object.defineProperty(exports, "shutDownStudio", { enumerable: true, get: function () { return shut_down_studio_1.shutDownStudio; } });
25
27
  const save_default_props_1 = require("./api/save-default-props");
26
28
  Object.defineProperty(exports, "saveDefaultProps", { enumerable: true, get: function () { return save_default_props_1.saveDefaultProps; } });
27
29
  const seek_1 = require("./api/seek");
@@ -1,2 +1,3 @@
1
1
  export declare const canvasRef: import("react").RefObject<HTMLDivElement | null>;
2
2
  export declare const drawRef: import("react").RefObject<HTMLDivElement | null>;
3
+ export declare const RefreshCanvasSizeContext: import("react").Context<(() => void) | null>;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.drawRef = exports.canvasRef = void 0;
3
+ exports.RefreshCanvasSizeContext = exports.drawRef = exports.canvasRef = void 0;
4
4
  const react_1 = require("react");
5
5
  exports.canvasRef = (0, react_1.createRef)();
6
6
  exports.drawRef = (0, react_1.createRef)();
7
+ exports.RefreshCanvasSizeContext = (0, react_1.createContext)(null);
@@ -118,13 +118,11 @@ export type CanvasCaptureImport = {
118
118
  };
119
119
  export type ElementInstallPlan = {
120
120
  readonly compositionFile: string;
121
- readonly filePath: string;
122
121
  readonly expectedFileState: ElementInstallExpectedFileState;
123
122
  };
124
123
  export type ElementInstallModalState = {
125
124
  readonly type: 'element-install';
126
125
  readonly currentPlan: ElementInstallPlan | null;
127
- readonly dependenciesToReview: string[];
128
126
  readonly missingPackages: string[];
129
127
  readonly newPlan: ElementInstallPlan;
130
128
  readonly onClose: () => void;
@@ -2,6 +2,8 @@ import React from 'react';
2
2
  export type SidebarCollapsedState = 'collapsed' | 'expanded' | 'responsive';
3
3
  type RightSidebarCollapsedState = Exclude<SidebarCollapsedState, 'responsive'>;
4
4
  type Context = {
5
+ sidebarCollapsedDuringDrag: Sidebars | null;
6
+ setSidebarCollapsedDuringDrag: (side: Sidebars | null) => void;
5
7
  sidebarCollapsedStateLeft: SidebarCollapsedState;
6
8
  setSidebarCollapsedState: (options: {
7
9
  left: null | React.SetStateAction<SidebarCollapsedState>;
@@ -9,6 +11,7 @@ type Context = {
9
11
  }) => void;
10
12
  sidebarCollapsedStateRight: RightSidebarCollapsedState;
11
13
  };
14
+ type Sidebars = 'left' | 'right';
12
15
  export declare const SidebarContext: React.Context<Context>;
13
16
  export declare const SidebarContextProvider: React.FC<{
14
17
  readonly children: React.ReactNode;
@@ -37,6 +37,8 @@ const saveCollapsedState = (type, sidebar) => {
37
37
  window.localStorage.setItem(storageKey(sidebar), type);
38
38
  };
39
39
  exports.SidebarContext = (0, react_1.createContext)({
40
+ sidebarCollapsedDuringDrag: null,
41
+ setSidebarCollapsedDuringDrag: () => undefined,
40
42
  sidebarCollapsedStateLeft: 'collapsed',
41
43
  setSidebarCollapsedState: () => {
42
44
  throw new Error('sidebar collapsed state');
@@ -49,8 +51,11 @@ const SidebarContextProvider = ({ children }) => {
49
51
  left: getSavedCollapsedStateLeft(isMobileLayout),
50
52
  right: getSavedCollapsedStateRight(isMobileLayout),
51
53
  }));
54
+ const [sidebarCollapsedDuringDrag, setSidebarCollapsedDuringDrag] = (0, react_1.useState)(null);
52
55
  const value = (0, react_1.useMemo)(() => {
53
56
  return {
57
+ sidebarCollapsedDuringDrag,
58
+ setSidebarCollapsedDuringDrag,
54
59
  sidebarCollapsedStateLeft: sidebarCollapsedState.left,
55
60
  sidebarCollapsedStateRight: sidebarCollapsedState.right,
56
61
  setSidebarCollapsedState: (options) => {
@@ -71,7 +76,7 @@ const SidebarContextProvider = ({ children }) => {
71
76
  });
72
77
  },
73
78
  };
74
- }, [sidebarCollapsedState]);
79
+ }, [sidebarCollapsedState, sidebarCollapsedDuringDrag]);
75
80
  return (jsx_runtime_1.jsx(exports.SidebarContext.Provider, { value: value, children: children }));
76
81
  };
77
82
  exports.SidebarContextProvider = SidebarContextProvider;
@@ -5,7 +5,7 @@ export type TimelineSetZoomOptions = {
5
5
  };
6
6
  export declare const TimelineZoomCtx: React.Context<{
7
7
  zoom: Record<string, number>;
8
- setZoom: (compositionId: string, prev: (prevZoom: number) => number, options?: TimelineSetZoomOptions | undefined) => void;
8
+ setZoom: (videoId: string, prev: (prevZoom: number) => number, options?: TimelineSetZoomOptions | undefined) => void;
9
9
  }>;
10
10
  export declare const TimelineZoomContext: React.FC<{
11
11
  readonly children: React.ReactNode;
@@ -17,7 +17,7 @@ exports.TimelineZoomCtx = (0, react_1.createContext)({
17
17
  });
18
18
  const TimelineZoomContext = ({ children }) => {
19
19
  const [zoom, setZoomState] = (0, react_1.useState)(() => (0, ZoomPersistor_1.getZoomFromLocalStorage)());
20
- const setZoom = (0, react_1.useCallback)((compositionId, callback, options) => {
20
+ const setZoom = (0, react_1.useCallback)((videoId, callback, options) => {
21
21
  var _a, _b;
22
22
  // Capture the old geometry before committing the new timeline width.
23
23
  const preserveTimelineCursor = (0, timeline_scroll_logic_1.prepareToPreserveTimelineCursor)({
@@ -35,14 +35,14 @@ const TimelineZoomContext = ({ children }) => {
35
35
  const previousZoom = (0, get_timeline_max_zoom_1.getTimelineZoom)({
36
36
  durationInFrames,
37
37
  timelineViewportWidth,
38
- zoom: (_c = prevZoomMap[compositionId]) !== null && _c !== void 0 ? _c : null,
38
+ zoom: (_c = prevZoomMap[videoId]) !== null && _c !== void 0 ? _c : null,
39
39
  });
40
40
  const newZoom = (0, get_timeline_max_zoom_1.clampTimelineZoom)({
41
41
  zoom: callback(previousZoom),
42
42
  durationInFrames,
43
43
  timelineViewportWidth,
44
44
  });
45
- return { ...prevZoomMap, [compositionId]: newZoom };
45
+ return { ...prevZoomMap, [videoId]: newZoom };
46
46
  });
47
47
  });
48
48
  // The new scroll range exists now, so the browser will not clamp the offset
@@ -107,6 +107,10 @@ const VisualControlsProvider = ({ children }) => {
107
107
  globalVisualControl: visualControl,
108
108
  };
109
109
  }, [visualControl]);
110
+ (0, react_1.useEffect)(() => {
111
+ // Controls may have rendered before the imperative API or Zod was ready.
112
+ visual_control_store_1.visualControlStore.emitChange();
113
+ }, [visualControl]);
110
114
  (0, react_1.useEffect)(() => {
111
115
  const callback = () => {
112
116
  if (imperativeHandles.current) {
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.520",
6
+ "version": "4.0.522",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -25,25 +25,25 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@tanstack/react-virtual": "3.14.9",
28
- "@remotion/canvas": "4.0.520",
29
- "@remotion/studio-protocol": "4.0.520",
30
- "@remotion/studio-codemods": "4.0.520",
28
+ "@remotion/canvas": "4.0.522",
29
+ "@remotion/studio-protocol": "4.0.522",
30
+ "@remotion/studio-codemods": "4.0.522",
31
31
  "semver": "7.5.3",
32
- "remotion": "4.0.520",
33
- "@remotion/captions": "4.0.520",
34
- "@remotion/media": "4.0.520",
35
- "@remotion/player": "4.0.520",
36
- "@remotion/media-utils": "4.0.520",
37
- "@remotion/renderer": "4.0.520",
38
- "@remotion/web-renderer": "4.0.520",
39
- "@remotion/studio-shared": "4.0.520",
40
- "@remotion/timeline-utils": "4.0.520",
41
- "@remotion/zod-types": "4.0.520",
32
+ "remotion": "4.0.522",
33
+ "@remotion/captions": "4.0.522",
34
+ "@remotion/media": "4.0.522",
35
+ "@remotion/player": "4.0.522",
36
+ "@remotion/media-utils": "4.0.522",
37
+ "@remotion/renderer": "4.0.522",
38
+ "@remotion/web-renderer": "4.0.522",
39
+ "@remotion/studio-shared": "4.0.522",
40
+ "@remotion/timeline-utils": "4.0.522",
41
+ "@remotion/zod-types": "4.0.522",
42
42
  "@jridgewell/trace-mapping": "0.3.31",
43
43
  "mediabunny": "1.55.5",
44
44
  "memfs": "3.4.3",
45
45
  "open": "8.4.2",
46
- "zod": "4.4.3"
46
+ "zod": "4.5.4"
47
47
  },
48
48
  "devDependencies": {
49
49
  "@happy-dom/global-registrator": "14.5.1",
@@ -51,7 +51,7 @@
51
51
  "react-dom": "19.2.3",
52
52
  "@testing-library/react": "16.1.0",
53
53
  "@types/semver": "7.5.3",
54
- "@remotion/eslint-config-internal": "4.0.520",
54
+ "@remotion/eslint-config-internal": "4.0.522",
55
55
  "eslint": "9.19.0",
56
56
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
57
57
  },
@@ -1,2 +0,0 @@
1
- import { type TSequence } from 'remotion';
2
- export declare const useMaxMediaDuration: (s: TSequence, fps: number) => number | null;
@@ -1,61 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useMaxMediaDuration = void 0;
4
- const react_1 = require("react");
5
- const remotion_1 = require("remotion");
6
- const is_video_with_last_frame_hold_1 = require("./is-video-with-last-frame-hold");
7
- const use_media_metadata_1 = require("./use-media-metadata");
8
- const cache = new Map();
9
- const getCacheKey = (src, fps) => JSON.stringify([src, fps]);
10
- const getSrc = (s) => {
11
- if (s.type === 'video') {
12
- return s.src;
13
- }
14
- if (s.type === 'audio') {
15
- return s.src;
16
- }
17
- return null;
18
- };
19
- const useMaxMediaDuration = (s, fps) => {
20
- var _a;
21
- const holdsLastFrame = (0, is_video_with_last_frame_hold_1.isVideoWithLastFrameHold)(s);
22
- const src = holdsLastFrame ? null : getSrc(s);
23
- const resolvedSrc = remotion_1.Internals.usePreload(src !== null && src !== void 0 ? src : '');
24
- const cacheKey = src ? getCacheKey(resolvedSrc, fps) : null;
25
- const [maxMediaDuration, setMaxMediaDuration] = (0, react_1.useState)(cacheKey ? ((_a = cache.get(cacheKey)) !== null && _a !== void 0 ? _a : null) : Infinity);
26
- (0, react_1.useEffect)(() => {
27
- var _a;
28
- if (!src || !cacheKey) {
29
- return;
30
- }
31
- const cached = (_a = cache.get(cacheKey)) !== null && _a !== void 0 ? _a : null;
32
- setMaxMediaDuration(cached);
33
- if (cached !== null) {
34
- return;
35
- }
36
- let cancelled = false;
37
- (0, use_media_metadata_1.getMediaMetadata)(resolvedSrc)
38
- .then((metadata) => {
39
- if (cancelled || !metadata) {
40
- return;
41
- }
42
- const duration = Math.floor(metadata.duration * fps);
43
- cache.set(cacheKey, duration);
44
- setMaxMediaDuration(duration);
45
- })
46
- .catch(() => {
47
- if (cancelled) {
48
- return;
49
- }
50
- setMaxMediaDuration(null);
51
- });
52
- return () => {
53
- cancelled = true;
54
- };
55
- }, [cacheKey, fps, resolvedSrc, src]);
56
- if (holdsLastFrame) {
57
- return Infinity;
58
- }
59
- return maxMediaDuration;
60
- };
61
- exports.useMaxMediaDuration = useMaxMediaDuration;