@remotion/cli 4.0.43 → 4.0.45

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 (81) 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 +54 -30
  8. package/dist/editor/components/CanvasOrLoading.js +9 -1
  9. package/dist/editor/components/CompositionSelector.js +8 -6
  10. package/dist/editor/components/CompositionSelectorItem.d.ts +1 -1
  11. package/dist/editor/components/CompositionSelectorItem.js +1 -7
  12. package/dist/editor/components/CurrentCompositionSideEffects.js +15 -4
  13. package/dist/editor/components/DownloadButton.d.ts +0 -0
  14. package/dist/editor/components/DownloadButton.js +1 -0
  15. package/dist/editor/components/EditorContent.js +6 -1
  16. package/dist/editor/components/ExplorerPanel.js +0 -13
  17. package/dist/editor/components/FilePreview.d.ts +9 -0
  18. package/dist/editor/components/FilePreview.js +40 -0
  19. package/dist/editor/components/FramePersistor.d.ts +0 -1
  20. package/dist/editor/components/FramePersistor.js +1 -5
  21. package/dist/editor/components/InitialCompositionLoader.js +68 -18
  22. package/dist/editor/components/LoopToggle.js +0 -5
  23. package/dist/editor/components/MuteToggle.js +0 -5
  24. package/dist/editor/components/NewComposition/RemInput.d.ts +2 -2
  25. package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +1 -1
  26. package/dist/editor/components/NewComposition/RemTextarea.d.ts +1 -1
  27. package/dist/editor/components/OptionsPanel.js +7 -7
  28. package/dist/editor/components/PlayPause.js +0 -3
  29. package/dist/editor/components/PlaybackRateSelector.js +3 -1
  30. package/dist/editor/components/Preview.d.ts +8 -0
  31. package/dist/editor/components/Preview.js +97 -30
  32. package/dist/editor/components/PreviewToolbar.js +4 -1
  33. package/dist/editor/components/RenderPreview.d.ts +6 -0
  34. package/dist/editor/components/RenderPreview.js +31 -0
  35. package/dist/editor/components/RenderQueue/RenderQueueCopyToClipboard.js +3 -2
  36. package/dist/editor/components/RenderQueue/RenderQueueItem.d.ts +1 -0
  37. package/dist/editor/components/RenderQueue/RenderQueueItem.js +55 -2
  38. package/dist/editor/components/RenderQueue/RenderQueueItemCancelButton.js +2 -1
  39. package/dist/editor/components/RenderQueue/RenderQueueItemStatus.js +35 -4
  40. package/dist/editor/components/RenderQueue/RenderQueueOpenInFolder.js +3 -2
  41. package/dist/editor/components/RenderQueue/RenderQueueOutputName.js +3 -11
  42. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +2 -1
  43. package/dist/editor/components/RenderQueue/RenderQueueRepeat.js +2 -1
  44. package/dist/editor/components/RenderQueue/index.js +16 -1
  45. package/dist/editor/components/RendersTab.js +9 -1
  46. package/dist/editor/components/SizeSelector.js +24 -0
  47. package/dist/editor/components/StaticFilePreview.d.ts +6 -0
  48. package/dist/editor/components/StaticFilePreview.js +39 -0
  49. package/dist/editor/components/TextViewer.d.ts +4 -0
  50. package/dist/editor/components/TextViewer.js +26 -0
  51. package/dist/editor/components/Timeline/TimelineZoomControls.js +3 -1
  52. package/dist/editor/components/TimelineInOutToggle.js +0 -5
  53. package/dist/editor/components/ZoomPersistor.d.ts +2 -0
  54. package/dist/editor/components/ZoomPersistor.js +35 -7
  55. package/dist/editor/components/layout.d.ts +2 -1
  56. package/dist/editor/components/layout.js +2 -2
  57. package/dist/editor/helpers/checkerboard-background.d.ts +1 -1
  58. package/dist/editor/helpers/colors.d.ts +1 -1
  59. package/dist/editor/helpers/create-folder-tree.d.ts +4 -3
  60. package/dist/editor/helpers/create-folder-tree.js +6 -3
  61. package/dist/editor/helpers/document-title.d.ts +1 -1
  62. package/dist/editor/helpers/document-title.js +14 -8
  63. package/dist/editor/helpers/get-asset-metadata.d.ts +11 -0
  64. package/dist/editor/helpers/get-asset-metadata.js +64 -0
  65. package/dist/editor/helpers/is-current-selected-still.d.ts +4 -3
  66. package/dist/editor/helpers/is-current-selected-still.js +12 -13
  67. package/dist/editor/helpers/persist-open-folders.d.ts +4 -2
  68. package/dist/editor/helpers/persist-open-folders.js +7 -5
  69. package/dist/editor/state/folders.d.ts +4 -2
  70. package/dist/editor/state/folders.js +13 -6
  71. package/dist/get-cli-options.d.ts +2 -2
  72. package/dist/index.d.ts +10 -10
  73. package/dist/log.d.ts +4 -4
  74. package/dist/preview-server/routes.d.ts +5 -3
  75. package/dist/preview-server/routes.js +52 -8
  76. package/dist/preview-server/serve-static.d.ts +6 -1
  77. package/dist/preview-server/serve-static.js +1 -4
  78. package/dist/preview-server/start-server.d.ts +4 -2
  79. package/dist/preview-server/start-server.js +4 -2
  80. package/dist/studio.js +9 -4
  81. package/package.json +8 -8
@@ -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
+ }>;
@@ -4,10 +4,11 @@ exports.Canvas = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const player_1 = require("@remotion/player");
6
6
  const react_1 = require("react");
7
+ const remotion_1 = require("remotion");
7
8
  const smooth_zoom_1 = require("../../smooth-zoom");
8
9
  const colors_1 = require("../helpers/colors");
10
+ const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
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,23 @@ 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' || canvasContent.type === 'output') &&
40
+ assetResolution &&
41
+ assetResolution.type === 'found') {
42
+ return assetResolution.dimensions;
43
+ }
44
+ if (config) {
45
+ return { width: config.width, height: config.height };
46
+ }
47
+ return null;
48
+ }, [assetResolution, config, canvasContent]);
36
49
  const size = player_1.PlayerInternals.useElementSize(canvas_ref_1.canvasRef, {
37
50
  triggerOnWindowResize: false,
38
51
  shouldApplyCssTransforms: true,
@@ -45,7 +58,7 @@ const Canvas = () => {
45
58
  if (!size) {
46
59
  return;
47
60
  }
48
- if (!dimensions) {
61
+ if (!contentDimensions || contentDimensions === 'none') {
49
62
  return;
50
63
  }
51
64
  const wantsToZoom = e.ctrlKey || e.metaKey;
@@ -56,8 +69,8 @@ const Canvas = () => {
56
69
  setSize((prevSize) => {
57
70
  const scale = player_1.PlayerInternals.calculateScale({
58
71
  canvasSize: size,
59
- compositionHeight: dimensions.height,
60
- compositionWidth: dimensions.width,
72
+ compositionHeight: contentDimensions.height,
73
+ compositionWidth: contentDimensions.width,
61
74
  previewSize: prevSize.size,
62
75
  });
63
76
  // Zoom in/out
@@ -70,18 +83,18 @@ const Canvas = () => {
70
83
  size,
71
84
  clientX: e.clientX,
72
85
  clientY: e.clientY,
73
- compositionWidth: dimensions.width,
74
- compositionHeight: dimensions.height,
86
+ compositionWidth: contentDimensions.width,
87
+ compositionHeight: contentDimensions.height,
75
88
  scale,
76
89
  translation: prevSize.translation,
77
90
  });
78
91
  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;
92
+ const uvCoordinatesX = centerX / contentDimensions.width;
93
+ const uvCoordinatesY = centerY / contentDimensions.height;
94
+ const correctionLeft = -uvCoordinatesX * (zoomDifference * contentDimensions.width) +
95
+ (1 - uvCoordinatesX) * zoomDifference * contentDimensions.width;
96
+ const correctionTop = -uvCoordinatesY * (zoomDifference * contentDimensions.height) +
97
+ (1 - uvCoordinatesY) * zoomDifference * contentDimensions.height;
85
98
  return {
86
99
  translation: (0, get_effective_translation_1.getEffectiveTranslation)({
87
100
  translation: {
@@ -89,8 +102,8 @@ const Canvas = () => {
89
102
  y: prevSize.translation.y - correctionTop / 2,
90
103
  },
91
104
  canvasSize: size,
92
- compositionHeight: dimensions.height,
93
- compositionWidth: dimensions.width,
105
+ compositionHeight: contentDimensions.height,
106
+ compositionWidth: contentDimensions.width,
94
107
  scale,
95
108
  }),
96
109
  size: unsmoothened,
@@ -99,8 +112,8 @@ const Canvas = () => {
99
112
  const effectiveTranslation = (0, get_effective_translation_1.getEffectiveTranslation)({
100
113
  translation: prevSize.translation,
101
114
  canvasSize: size,
102
- compositionHeight: dimensions.height,
103
- compositionWidth: dimensions.width,
115
+ compositionHeight: contentDimensions.height,
116
+ compositionWidth: contentDimensions.width,
104
117
  scale,
105
118
  });
106
119
  // Pan
@@ -112,13 +125,13 @@ const Canvas = () => {
112
125
  y: effectiveTranslation.y + e.deltaY,
113
126
  },
114
127
  canvasSize: size,
115
- compositionHeight: dimensions.height,
116
- compositionWidth: dimensions.width,
128
+ compositionHeight: contentDimensions.height,
129
+ compositionWidth: contentDimensions.width,
117
130
  scale,
118
131
  }),
119
132
  };
120
133
  });
121
- }, [editorZoomGestures, dimensions, isFit, setSize, size]);
134
+ }, [editorZoomGestures, contentDimensions, isFit, setSize, size]);
122
135
  (0, react_1.useEffect)(() => {
123
136
  const { current } = canvas_ref_1.canvasRef;
124
137
  if (!current) {
@@ -143,7 +156,7 @@ const Canvas = () => {
143
156
  });
144
157
  }, [setSize]);
145
158
  const onZoomIn = (0, react_1.useCallback)(() => {
146
- if (!dimensions) {
159
+ if (!contentDimensions || contentDimensions === 'none') {
147
160
  return;
148
161
  }
149
162
  if (!size) {
@@ -152,8 +165,8 @@ const Canvas = () => {
152
165
  setSize((prevSize) => {
153
166
  const scale = player_1.PlayerInternals.calculateScale({
154
167
  canvasSize: size,
155
- compositionHeight: dimensions.height,
156
- compositionWidth: dimensions.width,
168
+ compositionHeight: contentDimensions.height,
169
+ compositionWidth: contentDimensions.width,
157
170
  previewSize: prevSize.size,
158
171
  });
159
172
  return {
@@ -164,9 +177,9 @@ const Canvas = () => {
164
177
  size: Math.min(smooth_zoom_1.MAX_ZOOM, scale * 2),
165
178
  };
166
179
  });
167
- }, [dimensions, setSize, size]);
180
+ }, [contentDimensions, setSize, size]);
168
181
  const onZoomOut = (0, react_1.useCallback)(() => {
169
- if (!dimensions) {
182
+ if (!contentDimensions || contentDimensions === 'none') {
170
183
  return;
171
184
  }
172
185
  if (!size) {
@@ -175,8 +188,8 @@ const Canvas = () => {
175
188
  setSize((prevSize) => {
176
189
  const scale = player_1.PlayerInternals.calculateScale({
177
190
  canvasSize: size,
178
- compositionHeight: dimensions.height,
179
- compositionWidth: dimensions.width,
191
+ compositionHeight: contentDimensions.height,
192
+ compositionWidth: contentDimensions.width,
180
193
  previewSize: prevSize.size,
181
194
  });
182
195
  return {
@@ -187,7 +200,7 @@ const Canvas = () => {
187
200
  size: Math.max(smooth_zoom_1.MIN_ZOOM, scale / 2),
188
201
  };
189
202
  });
190
- }, [dimensions, setSize, size]);
203
+ }, [contentDimensions, setSize, size]);
191
204
  (0, react_1.useEffect)(() => {
192
205
  const resetBinding = keybindings.registerKeybinding({
193
206
  event: 'keydown',
@@ -219,6 +232,17 @@ const Canvas = () => {
219
232
  zoomOut.unregister();
220
233
  };
221
234
  }, [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 }) }))] }));
235
+ const fetchMetadata = (0, react_1.useCallback)(async () => {
236
+ setAssetResolution(null);
237
+ if (canvasContent.type === 'composition') {
238
+ return;
239
+ }
240
+ const metadata = await (0, get_asset_metadata_1.getAssetMetadata)(canvasContent);
241
+ setAssetResolution(metadata);
242
+ }, [canvasContent]);
243
+ (0, react_1.useEffect)(() => {
244
+ fetchMetadata();
245
+ }, [fetchMetadata]);
246
+ 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, assetMetadata: assetResolution })) : 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
247
  };
224
248
  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' || canvasContent.type === 'output') {
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 = {
@@ -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';
@@ -59,13 +59,7 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
59
59
  const style = (0, react_1.useMemo)(() => {
60
60
  return {
61
61
  ...itemStyle,
62
- backgroundColor: hovered
63
- ? selected
64
- ? colors_1.SELECTED_BACKGROUND
65
- : colors_1.CLEAR_HOVER
66
- : selected
67
- ? colors_1.SELECTED_BACKGROUND
68
- : 'transparent',
62
+ backgroundColor: (0, colors_1.getBackgroundFromHoverState)({ hovered, selected }),
69
63
  paddingLeft: 12 + level * 8,
70
64
  };
71
65
  }, [hovered, level, selected]);
@@ -9,13 +9,24 @@ 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
+ if (canvasContent.type === 'output') {
25
+ (0, document_title_1.setCurrentCanvasContentId)(canvasContent.path);
26
+ return;
27
+ }
28
+ (0, document_title_1.setCurrentCanvasContentId)(canvasContent.asset);
29
+ }, [canvasContent]);
19
30
  (0, react_1.useEffect)(() => {
20
31
  (0, document_title_1.setRenderJobs)(jobs);
21
32
  }, [jobs]);
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -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,10 @@ 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 ||
18
+ isStill ||
19
+ canvasContent.type !== 'composition') {
15
20
  return (0, jsx_runtime_1.jsx)(TopPanel_1.TopPanel, {});
16
21
  }
17
22
  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, {}) })] }));
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ExplorerPanel = exports.optionsSidebarTabs = exports.persistSelectedOptionsSidebarPanel = 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");
7
6
  const colors_1 = require("../helpers/colors");
8
7
  const AssetSelector_1 = require("./AssetSelector");
9
8
  const CompositionSelector_1 = require("./CompositionSelector");
@@ -50,18 +49,6 @@ const ExplorerPanel = () => {
50
49
  },
51
50
  };
52
51
  }, []);
53
- const { compositions, currentComposition } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
54
- const composition = (0, react_1.useMemo)(() => {
55
- for (const comp of compositions) {
56
- if (comp.id === currentComposition) {
57
- return comp;
58
- }
59
- }
60
- return null;
61
- }, [compositions, currentComposition]);
62
- if (composition === null) {
63
- return null;
64
- }
65
52
  return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: "css-reset", children: [(0, jsx_runtime_1.jsx)("div", { style: tabsContainer, children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [(0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: panel === 'compositions', onClick: onCompositionsSelected, children: "Compositions" }), (0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: panel === 'assets', onClick: onAssetsSelected, children: "Assets" })] }) }), panel === 'compositions' ? (0, jsx_runtime_1.jsx)(CompositionSelector_1.CompositionSelector, {}) : (0, jsx_runtime_1.jsx)(AssetSelector_1.AssetSelector, {})] }));
66
53
  };
67
54
  exports.ExplorerPanel = ExplorerPanel;