@remotion/cli 4.0.43 → 4.0.44

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 (61) hide show
  1. package/dist/config/index.d.ts +1 -1
  2. package/dist/config/log.d.ts +1 -1
  3. package/dist/editor/components/AssetSelector.js +19 -3
  4. package/dist/editor/components/AssetSelectorItem.d.ts +6 -4
  5. package/dist/editor/components/AssetSelectorItem.js +48 -23
  6. package/dist/editor/components/Canvas.d.ts +4 -1
  7. package/dist/editor/components/Canvas.js +72 -30
  8. package/dist/editor/components/CanvasOrLoading.js +9 -1
  9. package/dist/editor/components/CheckboardToggle.js +5 -0
  10. package/dist/editor/components/CompositionSelector.js +8 -6
  11. package/dist/editor/components/CompositionSelectorItem.d.ts +1 -1
  12. package/dist/editor/components/CurrentCompositionSideEffects.js +11 -4
  13. package/dist/editor/components/EditorContent.js +4 -1
  14. package/dist/editor/components/ExplorerPanel.js +0 -13
  15. package/dist/editor/components/FilePreview.d.ts +8 -0
  16. package/dist/editor/components/FilePreview.js +33 -0
  17. package/dist/editor/components/FramePersistor.d.ts +0 -1
  18. package/dist/editor/components/FramePersistor.js +1 -5
  19. package/dist/editor/components/InitialCompositionLoader.js +61 -18
  20. package/dist/editor/components/LoopToggle.js +3 -1
  21. package/dist/editor/components/MuteToggle.js +3 -1
  22. package/dist/editor/components/NewComposition/RemInput.d.ts +2 -2
  23. package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +1 -1
  24. package/dist/editor/components/NewComposition/RemTextarea.d.ts +1 -1
  25. package/dist/editor/components/OptionsPanel.js +7 -7
  26. package/dist/editor/components/PlayPause.js +2 -1
  27. package/dist/editor/components/PlaybackRateSelector.js +3 -1
  28. package/dist/editor/components/Preview.d.ts +7 -0
  29. package/dist/editor/components/Preview.js +156 -30
  30. package/dist/editor/components/RenderPreview.d.ts +4 -0
  31. package/dist/editor/components/RenderPreview.js +30 -0
  32. package/dist/editor/components/RendersTab.js +9 -1
  33. package/dist/editor/components/SizeSelector.js +15 -0
  34. package/dist/editor/components/StaticFilePreview.d.ts +4 -0
  35. package/dist/editor/components/StaticFilePreview.js +47 -0
  36. package/dist/editor/components/TextViewer.d.ts +4 -0
  37. package/dist/editor/components/TextViewer.js +26 -0
  38. package/dist/editor/components/Timeline/TimelineZoomControls.js +3 -1
  39. package/dist/editor/components/TimelineInOutToggle.js +2 -1
  40. package/dist/editor/components/ZoomPersistor.d.ts +2 -0
  41. package/dist/editor/components/ZoomPersistor.js +29 -7
  42. package/dist/editor/helpers/checkerboard-background.d.ts +1 -1
  43. package/dist/editor/helpers/colors.d.ts +1 -1
  44. package/dist/editor/helpers/create-folder-tree.d.ts +4 -3
  45. package/dist/editor/helpers/create-folder-tree.js +6 -3
  46. package/dist/editor/helpers/document-title.d.ts +1 -1
  47. package/dist/editor/helpers/document-title.js +14 -8
  48. package/dist/editor/helpers/is-current-selected-still.d.ts +3 -3
  49. package/dist/editor/helpers/is-current-selected-still.js +1 -15
  50. package/dist/editor/helpers/persist-open-folders.d.ts +4 -2
  51. package/dist/editor/helpers/persist-open-folders.js +7 -5
  52. package/dist/editor/state/folders.d.ts +4 -2
  53. package/dist/editor/state/folders.js +13 -6
  54. package/dist/get-cli-options.d.ts +2 -2
  55. package/dist/index.d.ts +10 -10
  56. package/dist/log.d.ts +4 -4
  57. package/package.json +8 -8
  58. package/dist/config/presets-profile.d.ts +0 -3
  59. package/dist/config/presets-profile.js +0 -12
  60. package/dist/handle-common-errors.d.ts +0 -2
  61. package/dist/handle-common-errors.js +0 -60
@@ -295,7 +295,7 @@ export declare const ConfigInternals: {
295
295
  getOutputCodecOrUndefined: () => CodecOrUndefined;
296
296
  getBrowser: () => null;
297
297
  getPixelFormat: () => "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
298
- getProResProfile: () => "light" | "4444-xq" | "4444" | "hq" | "standard" | "proxy" | undefined;
298
+ getProResProfile: () => "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
299
299
  getPresetProfile: () => "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
300
300
  getShouldOverwrite: ({ defaultValue, }: {
301
301
  defaultValue: boolean;
@@ -1 +1 @@
1
- export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn", setLogLevel: (newLogLevel: "error" | "verbose" | "info" | "warn") => void;
1
+ export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error", setLogLevel: (newLogLevel: "verbose" | "info" | "warn" | "error") => void;
@@ -30,6 +30,8 @@ const remotion_1 = require("remotion");
30
30
  const event_source_1 = require("../../event-source");
31
31
  const colors_1 = require("../helpers/colors");
32
32
  const create_folder_tree_1 = require("../helpers/create-folder-tree");
33
+ const persist_open_folders_1 = require("../helpers/persist-open-folders");
34
+ const folders_1 = require("../state/folders");
33
35
  const z_index_1 = require("../state/z-index");
34
36
  const AssetSelectorItem_1 = require("./AssetSelectorItem");
35
37
  const styles_1 = require("./Menu/styles");
@@ -60,6 +62,7 @@ const list = {
60
62
  };
61
63
  const AssetSelector = () => {
62
64
  const { tabIndex } = (0, z_index_1.useZIndex)();
65
+ const { assetFoldersExpanded, setAssetFoldersExpanded } = (0, react_1.useContext)(folders_1.FolderContext);
63
66
  const [{ publicFolderExists, staticFiles }, setState] = react_1.default.useState(() => {
64
67
  return {
65
68
  staticFiles: (0, remotion_1.getStaticFiles)(),
@@ -67,8 +70,8 @@ const AssetSelector = () => {
67
70
  };
68
71
  });
69
72
  const assetTree = (0, react_1.useMemo)(() => {
70
- return (0, create_folder_tree_1.buildAssetFolderStructure)(staticFiles);
71
- }, [staticFiles]);
73
+ return (0, create_folder_tree_1.buildAssetFolderStructure)(staticFiles, null, assetFoldersExpanded);
74
+ }, [assetFoldersExpanded, staticFiles]);
72
75
  (0, react_1.useEffect)(() => {
73
76
  const onUpdate = () => {
74
77
  setState({
@@ -81,6 +84,19 @@ const AssetSelector = () => {
81
84
  unsub();
82
85
  };
83
86
  }, []);
84
- return ((0, jsx_runtime_1.jsx)("div", { style: container, children: staticFiles.length === 0 ? (publicFolderExists ? ((0, jsx_runtime_1.jsx)("div", { style: emptyState, children: (0, jsx_runtime_1.jsxs)("div", { style: label, children: ["To add assets, place a file in the", ' ', (0, jsx_runtime_1.jsx)("code", { style: styles_1.inlineCodeSnippet, children: "public" }), " folder of your project."] }) })) : ((0, jsx_runtime_1.jsx)("div", { style: emptyState, children: (0, jsx_runtime_1.jsxs)("div", { style: label, children: ["To add assets, create a folder called", ' ', (0, jsx_runtime_1.jsx)("code", { style: styles_1.inlineCodeSnippet, children: "public" }), " in the root of your project and place a file in it."] }) }))) : ((0, jsx_runtime_1.jsx)("div", { className: "__remotion-vertical-scrollbar", style: list, children: (0, jsx_runtime_1.jsx)(AssetSelectorItem_1.FolderTree, { item: assetTree, level: 0, parentFolder: null, name: null, tabIndex: tabIndex }) })) }));
87
+ const toggleFolder = (0, react_1.useCallback)((folderName, parentName) => {
88
+ setAssetFoldersExpanded((p) => {
89
+ var _a;
90
+ const key = [parentName, folderName].filter(Boolean).join('/');
91
+ const prev = (_a = p[key]) !== null && _a !== void 0 ? _a : false;
92
+ const foldersExpandedState = {
93
+ ...p,
94
+ [key]: !prev,
95
+ };
96
+ (0, persist_open_folders_1.persistExpandedFolders)('assets', foldersExpandedState);
97
+ return foldersExpandedState;
98
+ });
99
+ }, [setAssetFoldersExpanded]);
100
+ return ((0, jsx_runtime_1.jsx)("div", { style: container, children: staticFiles.length === 0 ? (publicFolderExists ? ((0, jsx_runtime_1.jsx)("div", { style: emptyState, children: (0, jsx_runtime_1.jsxs)("div", { style: label, children: ["To add assets, place a file in the", ' ', (0, jsx_runtime_1.jsx)("code", { style: styles_1.inlineCodeSnippet, children: "public" }), " folder of your project."] }) })) : ((0, jsx_runtime_1.jsx)("div", { style: emptyState, children: (0, jsx_runtime_1.jsxs)("div", { style: label, children: ["To add assets, create a folder called", ' ', (0, jsx_runtime_1.jsx)("code", { style: styles_1.inlineCodeSnippet, children: "public" }), " in the root of your project and place a file in it."] }) }))) : ((0, jsx_runtime_1.jsx)("div", { className: "__remotion-vertical-scrollbar", style: list, children: (0, jsx_runtime_1.jsx)(AssetSelectorItem_1.AssetFolderTree, { item: assetTree, level: 0, parentFolder: null, name: null, tabIndex: tabIndex, toggleFolder: toggleFolder }) })) }));
85
101
  };
86
102
  exports.AssetSelector = AssetSelector;
@@ -1,18 +1,20 @@
1
1
  import React from 'react';
2
- import type { StaticFile } from 'remotion';
3
- import type { AssetFolder, Structure } from '../helpers/create-folder-tree';
2
+ import { type StaticFile } from 'remotion';
3
+ import type { AssetFolder, AssetStructure } from '../helpers/create-folder-tree';
4
4
  export declare const AssetFolderItem: React.FC<{
5
5
  item: AssetFolder;
6
6
  tabIndex: number;
7
7
  level: number;
8
8
  parentFolder: string;
9
+ toggleFolder: (folderName: string, parentName: string | null) => void;
9
10
  }>;
10
- export declare const FolderTree: React.FC<{
11
- item: Structure;
11
+ export declare const AssetFolderTree: React.FC<{
12
+ item: AssetStructure;
12
13
  name: string | null;
13
14
  parentFolder: string | null;
14
15
  level: number;
15
16
  tabIndex: number;
17
+ toggleFolder: (folderName: string, parentName: string | null) => void;
16
18
  }>;
17
19
  export declare const AssetSelectorItem: React.FC<{
18
20
  item: StaticFile | AssetFolder;
@@ -23,9 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.AssetSelectorItem = exports.FolderTree = exports.AssetFolderItem = void 0;
26
+ exports.AssetSelectorItem = exports.AssetFolderTree = exports.AssetFolderItem = void 0;
27
27
  const jsx_runtime_1 = require("react/jsx-runtime");
28
28
  const react_1 = __importStar(require("react"));
29
+ const remotion_1 = require("remotion");
29
30
  const truthy_1 = require("../../truthy");
30
31
  const colors_1 = require("../helpers/colors");
31
32
  const copy_text_1 = require("../helpers/copy-text");
@@ -58,6 +59,7 @@ const itemStyle = {
58
59
  textAlign: 'left',
59
60
  backgroundColor: colors_1.BACKGROUND,
60
61
  height: ASSET_ITEM_HEIGHT,
62
+ userSelect: 'none',
61
63
  };
62
64
  const labelStyle = {
63
65
  textAlign: 'left',
@@ -72,9 +74,8 @@ const revealIconStyle = {
72
74
  height: 12,
73
75
  color: 'currentColor',
74
76
  };
75
- const AssetFolderItem = ({ tabIndex, item, level, parentFolder }) => {
77
+ const AssetFolderItem = ({ tabIndex, item, level, parentFolder, toggleFolder }) => {
76
78
  const [hovered, setHovered] = (0, react_1.useState)(false);
77
- const [expanded, setExpanded] = (0, react_1.useState)(false);
78
79
  const onPointerEnter = (0, react_1.useCallback)(() => {
79
80
  setHovered(true);
80
81
  }, []);
@@ -91,56 +92,78 @@ const AssetFolderItem = ({ tabIndex, item, level, parentFolder }) => {
91
92
  const label = (0, react_1.useMemo)(() => {
92
93
  return {
93
94
  ...labelStyle,
94
- color: colors_1.LIGHT_TEXT,
95
+ color: hovered ? 'white' : colors_1.LIGHT_TEXT,
95
96
  };
96
- }, []);
97
+ }, [hovered]);
97
98
  const onClick = (0, react_1.useCallback)(() => {
98
- setExpanded((e) => !e);
99
- }, []);
100
- const Icon = expanded ? folder_1.ExpandedFolderIcon : folder_1.CollapsedFolderIcon;
101
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: folderStyle, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, title: item.name, onClick: onClick, children: (0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [(0, jsx_runtime_1.jsx)(Icon, { style: iconStyle, color: colors_1.LIGHT_TEXT }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.name })] }) }), expanded ? ((0, jsx_runtime_1.jsx)(exports.FolderTree, { item: item.items, name: item.name, level: level, parentFolder: parentFolder, tabIndex: tabIndex }, item.name)) : null] }));
99
+ toggleFolder(item.name, parentFolder);
100
+ }, [item.name, parentFolder, toggleFolder]);
101
+ const Icon = item.expanded ? folder_1.ExpandedFolderIcon : folder_1.CollapsedFolderIcon;
102
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: folderStyle, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, title: item.name, onClick: onClick, children: (0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [(0, jsx_runtime_1.jsx)(Icon, { style: iconStyle, color: hovered ? 'white' : colors_1.LIGHT_TEXT }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.name })] }) }), item.expanded ? ((0, jsx_runtime_1.jsx)(exports.AssetFolderTree, { item: item.items, name: item.name, level: level, parentFolder: parentFolder, tabIndex: tabIndex, toggleFolder: toggleFolder }, item.name)) : null] }));
102
103
  };
103
104
  exports.AssetFolderItem = AssetFolderItem;
104
- const FolderTree = ({ item, level, name, parentFolder, tabIndex }) => {
105
+ const AssetFolderTree = ({ item, level, name, parentFolder, toggleFolder, tabIndex }) => {
105
106
  const combinedParents = (0, react_1.useMemo)(() => {
106
107
  return [parentFolder, name].filter(truthy_1.truthy).join('/');
107
108
  }, [name, parentFolder]);
108
109
  return ((0, jsx_runtime_1.jsxs)("div", { children: [item.folders.map((folder) => {
109
- return ((0, jsx_runtime_1.jsx)(exports.AssetFolderItem, { item: folder, tabIndex: tabIndex, level: level + 1, parentFolder: combinedParents }, folder.name));
110
+ return ((0, jsx_runtime_1.jsx)(exports.AssetFolderItem, { item: folder, tabIndex: tabIndex, level: level + 1, parentFolder: combinedParents, toggleFolder: toggleFolder }, folder.name));
110
111
  }), item.files.map((file) => {
111
112
  return ((0, jsx_runtime_1.jsx)(exports.AssetSelectorItem, { item: file, tabIndex: tabIndex, level: level, parentFolder: combinedParents }, file.src));
112
113
  })] }));
113
114
  };
114
- exports.FolderTree = FolderTree;
115
+ exports.AssetFolderTree = AssetFolderTree;
115
116
  const AssetSelectorItem = ({ item, tabIndex, level, parentFolder }) => {
116
117
  const [hovered, setHovered] = (0, react_1.useState)(false);
117
118
  const onPointerEnter = (0, react_1.useCallback)(() => {
118
119
  setHovered(true);
119
120
  }, []);
121
+ const { canvasContent, setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
122
+ const selected = (0, react_1.useMemo)(() => {
123
+ if (canvasContent && canvasContent.type === 'asset') {
124
+ const nameWOParent = canvasContent.asset.split('/').pop();
125
+ return nameWOParent === item.name;
126
+ }
127
+ return false;
128
+ }, [canvasContent, item.name]);
120
129
  const onPointerLeave = (0, react_1.useCallback)(() => {
121
130
  setHovered(false);
122
131
  }, []);
132
+ const onClick = (0, react_1.useCallback)(() => {
133
+ const relativePath = parentFolder
134
+ ? parentFolder + '/' + item.name
135
+ : item.name;
136
+ setCanvasContent({ type: 'asset', asset: relativePath });
137
+ window.history.pushState({}, 'Studio', `/assets/${relativePath}`);
138
+ }, [item.name, parentFolder, setCanvasContent]);
123
139
  const style = (0, react_1.useMemo)(() => {
124
140
  return {
125
141
  ...itemStyle,
126
- color: colors_1.LIGHT_TEXT,
127
- backgroundColor: hovered ? colors_1.CLEAR_HOVER : 'transparent',
142
+ color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT,
143
+ backgroundColor: hovered
144
+ ? selected
145
+ ? colors_1.SELECTED_BACKGROUND
146
+ : colors_1.CLEAR_HOVER
147
+ : selected
148
+ ? colors_1.SELECTED_BACKGROUND
149
+ : 'transparent',
128
150
  paddingLeft: 12 + level * 8,
129
151
  };
130
- }, [hovered, level]);
152
+ }, [hovered, level, selected]);
131
153
  const label = (0, react_1.useMemo)(() => {
132
154
  return {
133
155
  ...labelStyle,
134
- color: colors_1.LIGHT_TEXT,
156
+ color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT,
135
157
  };
136
- }, []);
158
+ }, [hovered, selected]);
137
159
  const renderFileExplorerAction = (0, react_1.useCallback)((color) => {
138
160
  return (0, jsx_runtime_1.jsx)(folder_1.ExpandedFolderIcon, { style: revealIconStyle, color: color });
139
161
  }, []);
140
162
  const renderCopyAction = (0, react_1.useCallback)((color) => {
141
163
  return (0, jsx_runtime_1.jsx)(clipboard_1.ClipboardIcon, { style: revealIconStyle, color: color });
142
164
  }, []);
143
- const revealInExplorer = react_1.default.useCallback(() => {
165
+ const revealInExplorer = react_1.default.useCallback((e) => {
166
+ e.stopPropagation();
144
167
  (0, actions_1.openInFileExplorer)({
145
168
  directory: window.remotion_publicFolderExists +
146
169
  '/' +
@@ -151,12 +174,14 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder }) => {
151
174
  (0, NotificationCenter_1.sendErrorNotification)(`Could not open file: ${err.message}`);
152
175
  });
153
176
  }, [item.name, parentFolder]);
154
- const copyToClipboard = (0, react_1.useCallback)(() => {
155
- (0, copy_text_1.copyText)(`staticFile("${item.name}")`)
177
+ const copyToClipboard = (0, react_1.useCallback)((e) => {
178
+ e.stopPropagation();
179
+ const content = `staticFile("${[parentFolder, item.name].join('/')}")`;
180
+ (0, copy_text_1.copyText)(content)
156
181
  .then(() => {
157
182
  var _a;
158
183
  (_a = NotificationCenter_1.notificationCenter.current) === null || _a === void 0 ? void 0 : _a.addNotification({
159
- content: `Copied 'staticFile("${item.name}")' to clipboard`,
184
+ content: `Copied '${content}' to clipboard`,
160
185
  created: Date.now(),
161
186
  duration: 1000,
162
187
  id: String(Math.random()),
@@ -165,7 +190,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder }) => {
165
190
  .catch((err) => {
166
191
  (0, NotificationCenter_1.sendErrorNotification)(`Could not copy: ${err.message}`);
167
192
  });
168
- }, [item.name]);
169
- return ((0, jsx_runtime_1.jsx)(layout_1.Row, { align: "center", children: (0, jsx_runtime_1.jsxs)("div", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, title: item.name, children: [(0, jsx_runtime_1.jsx)(file_1.FileIcon, { style: iconStyle, color: colors_1.LIGHT_TEXT }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.name }), hovered ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { title: "Copy staticFile() name", renderAction: renderCopyAction, onClick: copyToClipboard }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { title: "Open in Explorer", renderAction: renderFileExplorerAction, onClick: revealInExplorer })] })) : null] }) }));
193
+ }, [item.name, parentFolder]);
194
+ return ((0, jsx_runtime_1.jsx)(layout_1.Row, { align: "center", children: (0, jsx_runtime_1.jsxs)("div", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onClick: onClick, tabIndex: tabIndex, title: item.name, children: [(0, jsx_runtime_1.jsx)(file_1.FileIcon, { style: iconStyle, color: colors_1.LIGHT_TEXT }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.name }), hovered ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { title: "Copy staticFile() name", renderAction: renderCopyAction, onClick: copyToClipboard }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { title: "Open in Explorer", renderAction: renderFileExplorerAction, onClick: revealInExplorer })] })) : null] }) }));
170
195
  };
171
196
  exports.AssetSelectorItem = AssetSelectorItem;
@@ -1,2 +1,5 @@
1
1
  import React from 'react';
2
- export declare const Canvas: React.FC;
2
+ import type { CanvasContent } from 'remotion';
3
+ export declare const Canvas: React.FC<{
4
+ canvasContent: CanvasContent;
5
+ }>;
@@ -2,12 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Canvas = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const media_utils_1 = require("@remotion/media-utils");
5
6
  const player_1 = require("@remotion/player");
6
7
  const react_1 = require("react");
8
+ const remotion_1 = require("remotion");
7
9
  const smooth_zoom_1 = require("../../smooth-zoom");
8
10
  const colors_1 = require("../helpers/colors");
9
11
  const get_effective_translation_1 = require("../helpers/get-effective-translation");
10
- const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
11
12
  const use_keybinding_1 = require("../helpers/use-keybinding");
12
13
  const canvas_ref_1 = require("../state/canvas-ref");
13
14
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
@@ -28,11 +29,21 @@ const resetZoom = {
28
29
  right: layout_1.SPACING_UNIT * 2,
29
30
  };
30
31
  const ZOOM_PX_FACTOR = 0.003;
31
- const Canvas = () => {
32
- const dimensions = (0, is_current_selected_still_1.useDimensions)();
32
+ const Canvas = ({ canvasContent }) => {
33
33
  const { setSize, size: previewSize } = (0, react_1.useContext)(preview_size_1.PreviewSizeContext);
34
34
  const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
35
35
  const keybindings = (0, use_keybinding_1.useKeybinding)();
36
+ const config = remotion_1.Internals.useUnsafeVideoConfig();
37
+ const [assetResolution, setAssetResolution] = (0, react_1.useState)(null);
38
+ const contentDimensions = (0, react_1.useMemo)(() => {
39
+ if (canvasContent.type === 'asset') {
40
+ return assetResolution;
41
+ }
42
+ if (config) {
43
+ return { width: config.width, height: config.height };
44
+ }
45
+ return null;
46
+ }, [assetResolution, config, canvasContent]);
36
47
  const size = player_1.PlayerInternals.useElementSize(canvas_ref_1.canvasRef, {
37
48
  triggerOnWindowResize: false,
38
49
  shouldApplyCssTransforms: true,
@@ -45,7 +56,7 @@ const Canvas = () => {
45
56
  if (!size) {
46
57
  return;
47
58
  }
48
- if (!dimensions) {
59
+ if (!contentDimensions || contentDimensions === 'none') {
49
60
  return;
50
61
  }
51
62
  const wantsToZoom = e.ctrlKey || e.metaKey;
@@ -56,8 +67,8 @@ const Canvas = () => {
56
67
  setSize((prevSize) => {
57
68
  const scale = player_1.PlayerInternals.calculateScale({
58
69
  canvasSize: size,
59
- compositionHeight: dimensions.height,
60
- compositionWidth: dimensions.width,
70
+ compositionHeight: contentDimensions.height,
71
+ compositionWidth: contentDimensions.width,
61
72
  previewSize: prevSize.size,
62
73
  });
63
74
  // Zoom in/out
@@ -70,18 +81,18 @@ const Canvas = () => {
70
81
  size,
71
82
  clientX: e.clientX,
72
83
  clientY: e.clientY,
73
- compositionWidth: dimensions.width,
74
- compositionHeight: dimensions.height,
84
+ compositionWidth: contentDimensions.width,
85
+ compositionHeight: contentDimensions.height,
75
86
  scale,
76
87
  translation: prevSize.translation,
77
88
  });
78
89
  const zoomDifference = unsmoothened - oldSize;
79
- const uvCoordinatesX = centerX / dimensions.width;
80
- const uvCoordinatesY = centerY / dimensions.height;
81
- const correctionLeft = -uvCoordinatesX * (zoomDifference * dimensions.width) +
82
- (1 - uvCoordinatesX) * zoomDifference * dimensions.width;
83
- const correctionTop = -uvCoordinatesY * (zoomDifference * dimensions.height) +
84
- (1 - uvCoordinatesY) * zoomDifference * dimensions.height;
90
+ const uvCoordinatesX = centerX / contentDimensions.width;
91
+ const uvCoordinatesY = centerY / contentDimensions.height;
92
+ const correctionLeft = -uvCoordinatesX * (zoomDifference * contentDimensions.width) +
93
+ (1 - uvCoordinatesX) * zoomDifference * contentDimensions.width;
94
+ const correctionTop = -uvCoordinatesY * (zoomDifference * contentDimensions.height) +
95
+ (1 - uvCoordinatesY) * zoomDifference * contentDimensions.height;
85
96
  return {
86
97
  translation: (0, get_effective_translation_1.getEffectiveTranslation)({
87
98
  translation: {
@@ -89,8 +100,8 @@ const Canvas = () => {
89
100
  y: prevSize.translation.y - correctionTop / 2,
90
101
  },
91
102
  canvasSize: size,
92
- compositionHeight: dimensions.height,
93
- compositionWidth: dimensions.width,
103
+ compositionHeight: contentDimensions.height,
104
+ compositionWidth: contentDimensions.width,
94
105
  scale,
95
106
  }),
96
107
  size: unsmoothened,
@@ -99,8 +110,8 @@ const Canvas = () => {
99
110
  const effectiveTranslation = (0, get_effective_translation_1.getEffectiveTranslation)({
100
111
  translation: prevSize.translation,
101
112
  canvasSize: size,
102
- compositionHeight: dimensions.height,
103
- compositionWidth: dimensions.width,
113
+ compositionHeight: contentDimensions.height,
114
+ compositionWidth: contentDimensions.width,
104
115
  scale,
105
116
  });
106
117
  // Pan
@@ -112,13 +123,13 @@ const Canvas = () => {
112
123
  y: effectiveTranslation.y + e.deltaY,
113
124
  },
114
125
  canvasSize: size,
115
- compositionHeight: dimensions.height,
116
- compositionWidth: dimensions.width,
126
+ compositionHeight: contentDimensions.height,
127
+ compositionWidth: contentDimensions.width,
117
128
  scale,
118
129
  }),
119
130
  };
120
131
  });
121
- }, [editorZoomGestures, dimensions, isFit, setSize, size]);
132
+ }, [editorZoomGestures, contentDimensions, isFit, setSize, size]);
122
133
  (0, react_1.useEffect)(() => {
123
134
  const { current } = canvas_ref_1.canvasRef;
124
135
  if (!current) {
@@ -143,7 +154,7 @@ const Canvas = () => {
143
154
  });
144
155
  }, [setSize]);
145
156
  const onZoomIn = (0, react_1.useCallback)(() => {
146
- if (!dimensions) {
157
+ if (!contentDimensions || contentDimensions === 'none') {
147
158
  return;
148
159
  }
149
160
  if (!size) {
@@ -152,8 +163,8 @@ const Canvas = () => {
152
163
  setSize((prevSize) => {
153
164
  const scale = player_1.PlayerInternals.calculateScale({
154
165
  canvasSize: size,
155
- compositionHeight: dimensions.height,
156
- compositionWidth: dimensions.width,
166
+ compositionHeight: contentDimensions.height,
167
+ compositionWidth: contentDimensions.width,
157
168
  previewSize: prevSize.size,
158
169
  });
159
170
  return {
@@ -164,9 +175,9 @@ const Canvas = () => {
164
175
  size: Math.min(smooth_zoom_1.MAX_ZOOM, scale * 2),
165
176
  };
166
177
  });
167
- }, [dimensions, setSize, size]);
178
+ }, [contentDimensions, setSize, size]);
168
179
  const onZoomOut = (0, react_1.useCallback)(() => {
169
- if (!dimensions) {
180
+ if (!contentDimensions || contentDimensions === 'none') {
170
181
  return;
171
182
  }
172
183
  if (!size) {
@@ -175,8 +186,8 @@ const Canvas = () => {
175
186
  setSize((prevSize) => {
176
187
  const scale = player_1.PlayerInternals.calculateScale({
177
188
  canvasSize: size,
178
- compositionHeight: dimensions.height,
179
- compositionWidth: dimensions.width,
189
+ compositionHeight: contentDimensions.height,
190
+ compositionWidth: contentDimensions.width,
180
191
  previewSize: prevSize.size,
181
192
  });
182
193
  return {
@@ -187,7 +198,7 @@ const Canvas = () => {
187
198
  size: Math.max(smooth_zoom_1.MIN_ZOOM, scale / 2),
188
199
  };
189
200
  });
190
- }, [dimensions, setSize, size]);
201
+ }, [contentDimensions, setSize, size]);
191
202
  (0, react_1.useEffect)(() => {
192
203
  const resetBinding = keybindings.registerKeybinding({
193
204
  event: 'keydown',
@@ -219,6 +230,37 @@ const Canvas = () => {
219
230
  zoomOut.unregister();
220
231
  };
221
232
  }, [keybindings, onReset, onZoomIn, onZoomOut]);
222
- return ((0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? (0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasSize: size }) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) }))] }));
233
+ const fetchMetadata = (0, react_1.useCallback)(async () => {
234
+ if (canvasContent.type !== 'asset') {
235
+ return;
236
+ }
237
+ setAssetResolution(null);
238
+ const assetSrc = (0, remotion_1.staticFile)(canvasContent.asset);
239
+ const fileType = (0, Preview_1.getPreviewFileType)(canvasContent.asset);
240
+ if (fileType === 'video') {
241
+ try {
242
+ await (0, media_utils_1.getVideoMetadata)(assetSrc).then((data) => {
243
+ setAssetResolution({ width: data.width, height: data.height });
244
+ });
245
+ }
246
+ catch (_a) {
247
+ setAssetResolution('none');
248
+ }
249
+ }
250
+ else if (fileType === 'image') {
251
+ const img = new Image();
252
+ img.onload = () => {
253
+ setAssetResolution({ width: img.width, height: img.height });
254
+ };
255
+ img.src = assetSrc;
256
+ }
257
+ else {
258
+ setAssetResolution('none');
259
+ }
260
+ }, [canvasContent]);
261
+ (0, react_1.useEffect)(() => {
262
+ fetchMetadata();
263
+ }, [fetchMetadata]);
264
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? ((0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size })) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) }))] }));
223
265
  };
224
266
  exports.Canvas = Canvas;
@@ -28,6 +28,7 @@ const CanvasOrLoading = () => {
28
28
  const resolved = remotion_1.Internals.useResolvedVideoConfig(null);
29
29
  const [takesALongTime, setTakesALongTime] = (0, react_1.useState)(false);
30
30
  const { setZoom } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
31
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
31
32
  (0, react_1.useEffect)(() => {
32
33
  const timeout = setTimeout(() => {
33
34
  setTakesALongTime(true);
@@ -56,6 +57,13 @@ const CanvasOrLoading = () => {
56
57
  transition: 'opacity 0.3s',
57
58
  };
58
59
  }, [takesALongTime]);
60
+ if (!canvasContent) {
61
+ return null;
62
+ }
63
+ const content = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ZoomPersistor_1.ZoomPersistor, {}), (0, jsx_runtime_1.jsx)(Canvas_1.Canvas, { canvasContent: canvasContent })] }));
64
+ if (canvasContent.type === 'asset') {
65
+ return content;
66
+ }
59
67
  if (!resolved) {
60
68
  return null;
61
69
  }
@@ -65,7 +73,7 @@ const CanvasOrLoading = () => {
65
73
  if (resolved.type === 'error') {
66
74
  return (0, jsx_runtime_1.jsx)(exports.ErrorLoading, { error: resolved.error });
67
75
  }
68
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(FramePersistor_1.FramePersistor, {}), (0, jsx_runtime_1.jsx)(ZoomPersistor_1.ZoomPersistor, {}), (0, jsx_runtime_1.jsx)(Canvas_1.Canvas, {})] }));
76
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(FramePersistor_1.FramePersistor, {}), " ", content] }));
69
77
  };
70
78
  exports.CanvasOrLoading = CanvasOrLoading;
71
79
  const loaderLabel = {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CheckboardToggle = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
6
7
  const truthy_1 = require("../../truthy");
7
8
  const colors_1 = require("../helpers/colors");
8
9
  const use_keybinding_1 = require("../helpers/use-keybinding");
@@ -16,11 +17,15 @@ const accessibilityLabel = [
16
17
  .join(' ');
17
18
  const CheckboardToggle = () => {
18
19
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
20
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
19
21
  const onClick = (0, react_1.useCallback)(() => {
20
22
  setCheckerboard((c) => {
21
23
  return !c;
22
24
  });
23
25
  }, [setCheckerboard]);
26
+ if ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset') {
27
+ return null;
28
+ }
24
29
  return ((0, jsx_runtime_1.jsx)(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, onClick: onClick, children: (0, jsx_runtime_1.jsx)("svg", { "aria-hidden": "true", focusable: "false", "data-prefix": "fas", "data-icon": "game-board-alt", className: "svg-inline--fa fa-game-board-alt fa-w-16", role: "img", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", style: { width: 16, height: 16 }, children: (0, jsx_runtime_1.jsx)("path", { fill: checkerboard ? colors_1.BLUE : 'white', d: "M480 0H32A32 32 0 0 0 0 32v448a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zm-32 256H256v192H64V256h192V64h192z" }) }) }));
25
30
  };
26
31
  exports.CheckboardToggle = CheckboardToggle;
@@ -33,8 +33,8 @@ const getKeysToExpand = (initialFolderName, parentFolderName, initial = []) => {
33
33
  exports.getKeysToExpand = getKeysToExpand;
34
34
  exports.compositionSelectorRef = (0, react_1.createRef)();
35
35
  const CompositionSelector = () => {
36
- const { compositions, currentComposition, folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
37
- const [foldersExpanded, setFoldersExpanded] = (0, react_1.useState)((0, persist_open_folders_1.loadExpandedFolders)());
36
+ const { compositions, canvasContent, folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
37
+ const [foldersExpanded, setFoldersExpanded] = (0, react_1.useState)((0, persist_open_folders_1.loadExpandedFolders)('compositions'));
38
38
  const { tabIndex } = (0, z_index_1.useZIndex)();
39
39
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
40
40
  const toggleFolder = (0, react_1.useCallback)((folderName, parentName) => {
@@ -46,7 +46,7 @@ const CompositionSelector = () => {
46
46
  ...p,
47
47
  [key]: !prev,
48
48
  };
49
- (0, persist_open_folders_1.persistExpandedFolders)(foldersExpandedState);
49
+ (0, persist_open_folders_1.persistExpandedFolders)('compositions', foldersExpandedState);
50
50
  return foldersExpandedState;
51
51
  });
52
52
  }, []);
@@ -81,7 +81,7 @@ const CompositionSelector = () => {
81
81
  currentFolder = (_b = parentFolder === null || parentFolder === void 0 ? void 0 : parentFolder.name) !== null && _b !== void 0 ? _b : null;
82
82
  currentParentName = (_c = parentFolder === null || parentFolder === void 0 ? void 0 : parentFolder.parent) !== null && _c !== void 0 ? _c : null;
83
83
  }
84
- (0, persist_open_folders_1.persistExpandedFolders)(foldersExpandedState);
84
+ (0, persist_open_folders_1.persistExpandedFolders)('compositions', foldersExpandedState);
85
85
  return foldersExpandedState;
86
86
  });
87
87
  },
@@ -90,8 +90,10 @@ const CompositionSelector = () => {
90
90
  const items = (0, react_1.useMemo)(() => {
91
91
  return (0, create_folder_tree_1.createFolderTree)(compositions, folders, foldersExpanded);
92
92
  }, [compositions, folders, foldersExpanded]);
93
- return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(CurrentComposition_1.CurrentComposition, {}), (0, jsx_runtime_1.jsx)("div", { className: "__remotion-vertical-scrollbar", style: list, children: items.map((c) => {
94
- return ((0, jsx_runtime_1.jsx)(CompositionSelectorItem_1.CompositionSelectorItem, { level: 0, currentComposition: currentComposition, selectComposition: selectComposition, toggleFolder: toggleFolder, tabIndex: tabIndex, item: c }, c.key + c.type));
93
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [canvasContent && canvasContent.type === 'composition' ? ((0, jsx_runtime_1.jsx)(CurrentComposition_1.CurrentComposition, {})) : null, (0, jsx_runtime_1.jsx)("div", { className: "__remotion-vertical-scrollbar", style: list, children: items.map((c) => {
94
+ return ((0, jsx_runtime_1.jsx)(CompositionSelectorItem_1.CompositionSelectorItem, { level: 0, currentComposition: canvasContent && canvasContent.type === 'composition'
95
+ ? canvasContent.compositionId
96
+ : null, selectComposition: selectComposition, toggleFolder: toggleFolder, tabIndex: tabIndex, item: c }, c.key + c.type));
95
97
  }) })] }));
96
98
  };
97
99
  exports.CompositionSelector = CompositionSelector;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { AnyComposition } from 'remotion';
2
+ import { type AnyComposition } from 'remotion';
3
3
  export type CompositionSelectorItemType = {
4
4
  key: string;
5
5
  type: 'composition';
@@ -9,13 +9,20 @@ const use_keybinding_1 = require("../helpers/use-keybinding");
9
9
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
10
10
  const context_1 = require("./RenderQueue/context");
11
11
  const TitleUpdater = () => {
12
- const video = remotion_1.Internals.useVideo();
13
12
  const renderQueue = (0, react_1.useContext)(context_1.RenderQueueContext);
13
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
14
14
  const { jobs } = renderQueue;
15
15
  (0, react_1.useEffect)(() => {
16
- var _a;
17
- (0, document_title_1.setCurrentVideoId)((_a = video === null || video === void 0 ? void 0 : video.id) !== null && _a !== void 0 ? _a : null);
18
- }, [video]);
16
+ if (!canvasContent) {
17
+ (0, document_title_1.setCurrentCanvasContentId)(null);
18
+ return;
19
+ }
20
+ if (canvasContent.type === 'composition') {
21
+ (0, document_title_1.setCurrentCanvasContentId)(canvasContent.compositionId);
22
+ return;
23
+ }
24
+ (0, document_title_1.setCurrentCanvasContentId)(canvasContent.asset);
25
+ }, [canvasContent]);
19
26
  (0, react_1.useEffect)(() => {
20
27
  (0, document_title_1.setRenderJobs)(jobs);
21
28
  }, [jobs]);
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EditorContent = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
5
7
  const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
6
8
  const SplitterContainer_1 = require("./Splitter/SplitterContainer");
7
9
  const SplitterElement_1 = require("./Splitter/SplitterElement");
@@ -11,7 +13,8 @@ const TopPanel_1 = require("./TopPanel");
11
13
  const noop = () => undefined;
12
14
  const EditorContent = () => {
13
15
  const isStill = (0, is_current_selected_still_1.useIsStill)();
14
- if (isStill) {
16
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
17
+ if (canvasContent === null || isStill || canvasContent.type === 'asset') {
15
18
  return (0, jsx_runtime_1.jsx)(TopPanel_1.TopPanel, {});
16
19
  }
17
20
  return ((0, jsx_runtime_1.jsxs)(SplitterContainer_1.SplitterContainer, { orientation: "horizontal", id: "top-to-bottom", maxFlex: 0.9, minFlex: 0.2, defaultFlex: 0.75, children: [(0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "flexer", children: (0, jsx_runtime_1.jsx)(TopPanel_1.TopPanel, {}) }), (0, jsx_runtime_1.jsx)(SplitterHandle_1.SplitterHandle, { allowToCollapse: "none", onCollapse: noop }), (0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "anti-flexer", children: (0, jsx_runtime_1.jsx)(Timeline_1.Timeline, {}) })] }));