@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.
- package/dist/api/shut-down-studio.d.ts +6 -0
- package/dist/api/shut-down-studio.js +23 -0
- package/dist/components/AudioWaveform.js +10 -6
- package/dist/components/Canvas.js +84 -12
- package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
- package/dist/components/CaptionInspector.d.ts +1 -0
- package/dist/components/CaptionInspector.js +43 -2
- package/dist/components/CaptionTextEditor.js +1 -1
- package/dist/components/CompositionSelector.js +41 -30
- package/dist/components/CompositionSelectorItem.d.ts +7 -0
- package/dist/components/CompositionSelectorItem.js +343 -67
- package/dist/components/CopyButton.js +7 -14
- package/dist/components/Editor.js +6 -5
- package/dist/components/EditorContent.js +1 -1
- package/dist/components/ElementInstallConfirmation.js +77 -65
- package/dist/components/ElementLibraryModal.js +3 -1
- package/dist/components/FixComputedValueModal.js +20 -10
- package/dist/components/InlineCaptionInspector.js +37 -1
- package/dist/components/InspectorLocationCopy.js +10 -5
- package/dist/components/InspectorPanel/ElementLibraryButton.js +3 -18
- package/dist/components/InspectorSequenceSection.js +1 -4
- package/dist/components/Menu/MenuSubItem.js +1 -1
- package/dist/components/MenuBuildIndicator.js +7 -2
- package/dist/components/MenuCompositionName.js +62 -6
- package/dist/components/ModalContainer.d.ts +1 -0
- package/dist/components/ModalContainer.js +2 -2
- package/dist/components/ModalHeader.js +5 -1
- package/dist/components/QuickSwitcher/asset-search.d.ts +0 -1
- package/dist/components/QuickSwitcher/asset-search.js +1 -16
- package/dist/components/RenderButton.js +2 -2
- package/dist/components/RenderModal/CliCopyButton.js +13 -27
- package/dist/components/RenderModal/RenderStatusModal.js +7 -1
- package/dist/components/RenderModal/ServerRenderModal.js +1 -1
- package/dist/components/RenderModal/WebRenderModal.js +1 -1
- package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +1 -1
- package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
- package/dist/components/SettingsModal.js +8 -5
- package/dist/components/SidebarCollapserControls.js +11 -5
- package/dist/components/SkillsSettings.js +9 -5
- package/dist/components/Splitter/SplitterContainer.js +63 -10
- package/dist/components/Splitter/SplitterContext.d.ts +3 -0
- package/dist/components/Splitter/SplitterContext.js +5 -1
- package/dist/components/Splitter/SplitterElement.js +11 -2
- package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
- package/dist/components/Splitter/SplitterHandle.js +55 -25
- package/dist/components/TimeValue.js +36 -7
- package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
- package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
- package/dist/components/Timeline/Timeline.d.ts +1 -1
- package/dist/components/Timeline/Timeline.js +45 -22
- package/dist/components/Timeline/TimelineAssetField.d.ts +0 -1
- package/dist/components/Timeline/TimelineAssetField.js +16 -9
- package/dist/components/Timeline/TimelineCollapseToggle.js +1 -1
- package/dist/components/Timeline/TimelineDragHandler.js +9 -4
- package/dist/components/Timeline/TimelineFontWeightField.d.ts +11 -0
- package/dist/components/Timeline/TimelineFontWeightField.js +65 -0
- package/dist/components/Timeline/TimelineLayerChildren.d.ts +21 -0
- package/dist/components/Timeline/TimelineLayerChildren.js +129 -0
- package/dist/components/Timeline/TimelineNumberField.js +13 -5
- package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
- package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
- package/dist/components/Timeline/TimelineSequence.js +113 -42
- package/dist/components/Timeline/TimelineSequenceItem.js +14 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +13 -3
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +185 -126
- package/dist/components/Timeline/TimelineSlider.js +1 -4
- package/dist/components/Timeline/TimelineTickFormatProvider.d.ts +8 -0
- package/dist/components/Timeline/TimelineTickFormatProvider.js +16 -0
- package/dist/components/Timeline/TimelineTimeIndicators.js +7 -3
- package/dist/components/Timeline/TimelineVideoInfo.js +7 -3
- package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
- package/dist/components/Timeline/TimelineZoomControls.js +20 -20
- package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
- package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
- package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
- package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
- package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
- package/dist/components/TopPanel.js +3 -19
- package/dist/components/UpdateStatusContext.d.ts +5 -0
- package/dist/components/UpdateStatusContext.js +53 -2
- package/dist/components/UpdatesSettings.js +34 -9
- package/dist/components/WebMcp.js +26 -0
- package/dist/components/ZoomPersistor.js +6 -3
- package/dist/components/composition-menu-items.js +1 -1
- package/dist/components/composition-selector-drag-data.d.ts +27 -0
- package/dist/components/composition-selector-drag-data.js +80 -0
- package/dist/components/import-assets.d.ts +2 -1
- package/dist/components/import-assets.js +11 -1
- package/dist/components/parse-caption-file.d.ts +5 -0
- package/dist/components/parse-caption-file.js +63 -0
- package/dist/esm/{chunk-np6q13k5.js → chunk-3netyjd9.js} +7943 -6314
- package/dist/esm/index.mjs +23 -8
- package/dist/esm/internals.mjs +7965 -6336
- package/dist/esm/previewEntry.mjs +8007 -6378
- package/dist/esm/renderEntry.mjs +1 -1
- package/dist/helpers/copy-text.js +1 -2
- package/dist/helpers/get-preview-file-type.js +22 -3
- package/dist/helpers/inserted-element-selection.d.ts +2 -1
- package/dist/helpers/use-copy-feedback.d.ts +4 -0
- package/dist/helpers/use-copy-feedback.js +19 -0
- package/dist/helpers/use-menu-structure.js +2 -2
- package/dist/icons/copy.d.ts +5 -0
- package/dist/icons/copy.js +12 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/state/canvas-ref.d.ts +1 -0
- package/dist/state/canvas-ref.js +2 -1
- package/dist/state/modals.d.ts +0 -2
- package/dist/state/sidebar.d.ts +3 -0
- package/dist/state/sidebar.js +6 -1
- package/dist/state/timeline-zoom.d.ts +1 -1
- package/dist/state/timeline-zoom.js +3 -3
- package/dist/visual-controls/VisualControls.js +4 -0
- package/package.json +16 -16
- package/dist/helpers/use-max-media-duration.d.ts +0 -2
- package/dist/helpers/use-max-media-duration.js +0 -61
package/dist/esm/renderEntry.mjs
CHANGED
|
@@ -215,7 +215,7 @@ var renderContent = (Root) => {
|
|
|
215
215
|
renderToDOM(/* @__PURE__ */ jsx("div", {
|
|
216
216
|
children: /* @__PURE__ */ jsx(DelayedSpinner, {})
|
|
217
217
|
}));
|
|
218
|
-
import("./chunk-
|
|
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 = [
|
|
11
|
-
|
|
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,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
|
|
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
|
|
225
|
+
quickSwitcherLabel: 'Render in browser...',
|
|
226
226
|
},
|
|
227
227
|
{
|
|
228
228
|
type: 'divider',
|
|
@@ -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");
|
package/dist/state/canvas-ref.js
CHANGED
|
@@ -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);
|
package/dist/state/modals.d.ts
CHANGED
|
@@ -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;
|
package/dist/state/sidebar.d.ts
CHANGED
|
@@ -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;
|
package/dist/state/sidebar.js
CHANGED
|
@@ -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: (
|
|
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)((
|
|
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[
|
|
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, [
|
|
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.
|
|
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.
|
|
29
|
-
"@remotion/studio-protocol": "4.0.
|
|
30
|
-
"@remotion/studio-codemods": "4.0.
|
|
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.
|
|
33
|
-
"@remotion/captions": "4.0.
|
|
34
|
-
"@remotion/media": "4.0.
|
|
35
|
-
"@remotion/player": "4.0.
|
|
36
|
-
"@remotion/media-utils": "4.0.
|
|
37
|
-
"@remotion/renderer": "4.0.
|
|
38
|
-
"@remotion/web-renderer": "4.0.
|
|
39
|
-
"@remotion/studio-shared": "4.0.
|
|
40
|
-
"@remotion/timeline-utils": "4.0.
|
|
41
|
-
"@remotion/zod-types": "4.0.
|
|
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
|
|
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.
|
|
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,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;
|