@remotion/cli 3.3.82 → 3.3.84

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 (79) hide show
  1. package/dist/codemods/update-default-props.js +7 -8
  2. package/dist/color-math.d.ts +1 -0
  3. package/dist/color-math.js +12 -0
  4. package/dist/config/index.d.ts +1 -0
  5. package/dist/config/index.js +3 -0
  6. package/dist/config/user-agent.d.ts +4 -0
  7. package/dist/config/user-agent.js +12 -0
  8. package/dist/editor/components/Canvas.js +1 -4
  9. package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +7 -0
  10. package/dist/editor/components/NewComposition/RemInputTypeColor.js +53 -0
  11. package/dist/editor/components/RenderButton.js +4 -1
  12. package/dist/editor/components/RenderModal/CrfSetting.js +1 -1
  13. package/dist/editor/components/RenderModal/EnvInput.js +1 -1
  14. package/dist/editor/components/RenderModal/FrameRangeSetting.js +1 -1
  15. package/dist/editor/components/RenderModal/NumberOfLoopsSetting.js +1 -1
  16. package/dist/editor/components/RenderModal/NumberSetting.js +1 -1
  17. package/dist/editor/components/RenderModal/RenderModal.js +25 -15
  18. package/dist/editor/components/RenderModal/RenderModalAdvanced.js +2 -0
  19. package/dist/editor/components/RenderModal/RenderModalAudio.js +1 -1
  20. package/dist/editor/components/RenderModal/RenderModalBasic.js +1 -1
  21. package/dist/editor/components/RenderModal/RenderModalData.js +71 -12
  22. package/dist/editor/components/RenderModal/RenderModalInput.js +1 -1
  23. package/dist/editor/components/RenderModal/RenderModalJSONInputPropsEditor.d.ts +1 -0
  24. package/dist/editor/components/RenderModal/RenderModalJSONInputPropsEditor.js +22 -2
  25. package/dist/editor/components/RenderModal/RenderModalPicture.js +1 -1
  26. package/dist/editor/components/RenderModal/SchemaEditor/SchemaEditor.js +3 -40
  27. package/dist/editor/components/RenderModal/SchemaEditor/SchemaErrorMessages.d.ts +11 -0
  28. package/dist/editor/components/RenderModal/SchemaEditor/SchemaErrorMessages.js +55 -0
  29. package/dist/editor/components/RenderModal/SchemaEditor/ZodColorEditor.d.ts +14 -0
  30. package/dist/editor/components/RenderModal/SchemaEditor/ZodColorEditor.js +108 -0
  31. package/dist/editor/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  32. package/dist/editor/components/RenderModal/SchemaEditor/{ZodOrNullEditor.d.ts → ZodNullableEditor.d.ts} +1 -2
  33. package/dist/editor/components/RenderModal/SchemaEditor/ZodNullableEditor.js +10 -0
  34. package/dist/editor/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  35. package/dist/editor/components/RenderModal/SchemaEditor/ZodOptionalEditor.d.ts +14 -0
  36. package/dist/editor/components/RenderModal/SchemaEditor/ZodOptionalEditor.js +10 -0
  37. package/dist/editor/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +1 -2
  38. package/dist/editor/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  39. package/dist/editor/components/RenderModal/SchemaEditor/ZodSwitch.js +12 -0
  40. package/dist/editor/components/RenderModal/SchemaEditor/create-zod-values.js +3 -0
  41. package/dist/editor/components/RenderModal/layout.js +0 -1
  42. package/dist/editor/components/RenderModal/out-name-checker.d.ts +0 -1
  43. package/dist/editor/components/RenderModal/out-name-checker.js +3 -3
  44. package/dist/editor/components/RenderQueue/actions.d.ts +0 -2
  45. package/dist/editor/components/RenderQueue/actions.js +10 -11
  46. package/dist/editor/components/RenderQueue/index.js +25 -1
  47. package/dist/editor/components/RenderToolbarIcon.js +22 -7
  48. package/dist/editor/components/RendersTab.js +3 -3
  49. package/dist/editor/components/RightPanel.js +2 -7
  50. package/dist/editor/components/SegmentedControl.d.ts +0 -5
  51. package/dist/editor/components/SegmentedControl.js +2 -3
  52. package/dist/editor/components/SidebarCollapserControls.js +81 -10
  53. package/dist/editor/components/SizeSelector.js +1 -1
  54. package/dist/editor/components/Splitter/SplitterElement.js +1 -0
  55. package/dist/editor/components/Tabs/index.js +9 -2
  56. package/dist/editor/components/Tabs/vertical.d.ts +7 -0
  57. package/dist/editor/components/Tabs/vertical.js +43 -0
  58. package/dist/editor/components/TimeValue.js +3 -4
  59. package/dist/editor/components/Timeline/TimelineListItem.js +9 -1
  60. package/dist/ffmpeg.js +2 -2
  61. package/dist/get-cli-options.js +1 -0
  62. package/dist/parse-command-line.d.ts +1 -0
  63. package/dist/parse-command-line.js +3 -0
  64. package/dist/preview-server/api-types.d.ts +0 -4
  65. package/dist/preview-server/render-queue/job.d.ts +1 -1
  66. package/dist/preview-server/render-queue/queue.d.ts +1 -13
  67. package/dist/preview-server/render-queue/queue.js +6 -9
  68. package/dist/preview-server/routes/can-update-default-props.d.ts +4 -0
  69. package/dist/preview-server/routes/can-update-default-props.js +38 -0
  70. package/package.json +6 -6
  71. package/dist/editor/components/CheckerboardContext.d.ts +0 -0
  72. package/dist/editor/components/CheckerboardContext.js +0 -1
  73. package/dist/editor/components/CollapsedSidebarExpander.d.ts +0 -5
  74. package/dist/editor/components/CollapsedSidebarExpander.js +0 -40
  75. package/dist/editor/components/RenderModal/SchemaEditor/ZodOrNullEditor.js +0 -45
  76. package/dist/editor/components/RenderModal/SchemaEditor/schema-serialization.d.ts +0 -2
  77. package/dist/editor/components/RenderModal/SchemaEditor/schema-serialization.js +0 -21
  78. package/dist/editor/components/SidebarContent.d.ts +0 -5
  79. package/dist/editor/components/SidebarContent.js +0 -53
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.canUpdateDefaultProps = exports.updateDefaultProps = exports.cancelRenderJob = exports.removeRenderJob = exports.openInFileExplorer = exports.subscribeToFileExistenceWatcher = exports.unsubscribeFromFileExistenceWatcher = exports.addVideoRenderJob = exports.addStillRenderJob = exports.callApi = void 0;
3
+ exports.canUpdateDefaultProps = exports.updateDefaultProps = exports.cancelRenderJob = exports.removeRenderJob = exports.openInFileExplorer = exports.subscribeToFileExistenceWatcher = exports.unsubscribeFromFileExistenceWatcher = exports.addVideoRenderJob = exports.addStillRenderJob = void 0;
4
4
  const date_serialization_1 = require("../RenderModal/SchemaEditor/date-serialization");
5
5
  const callApi = (endpoint, body) => {
6
6
  return new Promise((resolve, reject) => {
@@ -25,9 +25,8 @@ const callApi = (endpoint, body) => {
25
25
  });
26
26
  });
27
27
  };
28
- exports.callApi = callApi;
29
28
  const addStillRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, frame, scale, verbose, chromiumOptions, delayRenderTimeout, envVariables, inputProps, }) => {
30
- return (0, exports.callApi)('/api/render', {
29
+ return callApi('/api/render', {
31
30
  compositionId,
32
31
  type: 'still',
33
32
  outName,
@@ -44,7 +43,7 @@ const addStillRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, f
44
43
  };
45
44
  exports.addStillRenderJob = addStillRenderJob;
46
45
  const addVideoRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, scale, verbose, codec, concurrency, crf, startFrame, endFrame, muted, enforceAudioTrack, proResProfile, pixelFormat, audioBitrate, videoBitrate, everyNthFrame, numberOfGifLoops, delayRenderTimeout, audioCodec, disallowParallelEncoding, chromiumOptions, envVariables, inputProps, }) => {
47
- return (0, exports.callApi)('/api/render', {
46
+ return callApi('/api/render', {
48
47
  compositionId,
49
48
  type: 'video',
50
49
  outName,
@@ -75,11 +74,11 @@ const addVideoRenderJob = ({ compositionId, outName, imageFormat, jpegQuality, s
75
74
  };
76
75
  exports.addVideoRenderJob = addVideoRenderJob;
77
76
  const unsubscribeFromFileExistenceWatcher = ({ file, clientId, }) => {
78
- return (0, exports.callApi)('/api/unsubscribe-from-file-existence', { file, clientId });
77
+ return callApi('/api/unsubscribe-from-file-existence', { file, clientId });
79
78
  };
80
79
  exports.unsubscribeFromFileExistenceWatcher = unsubscribeFromFileExistenceWatcher;
81
80
  const subscribeToFileExistenceWatcher = async ({ file, clientId, }) => {
82
- const { exists } = await (0, exports.callApi)('/api/subscribe-to-file-existence', {
81
+ const { exists } = await callApi('/api/subscribe-to-file-existence', {
83
82
  file,
84
83
  clientId,
85
84
  });
@@ -90,30 +89,30 @@ const openInFileExplorer = ({ directory }) => {
90
89
  const body = {
91
90
  directory,
92
91
  };
93
- return (0, exports.callApi)('/api/open-in-file-explorer', body);
92
+ return callApi('/api/open-in-file-explorer', body);
94
93
  };
95
94
  exports.openInFileExplorer = openInFileExplorer;
96
95
  const removeRenderJob = (job) => {
97
- return (0, exports.callApi)('/api/remove-render', {
96
+ return callApi('/api/remove-render', {
98
97
  jobId: job.id,
99
98
  });
100
99
  };
101
100
  exports.removeRenderJob = removeRenderJob;
102
101
  const cancelRenderJob = (job) => {
103
- return (0, exports.callApi)('/api/cancel', {
102
+ return callApi('/api/cancel', {
104
103
  jobId: job.id,
105
104
  });
106
105
  };
107
106
  exports.cancelRenderJob = cancelRenderJob;
108
107
  const updateDefaultProps = (compositionId, defaultProps) => {
109
- return (0, exports.callApi)('/api/update-default-props', {
108
+ return callApi('/api/update-default-props', {
110
109
  compositionId,
111
110
  defaultProps: (0, date_serialization_1.serializeJSONWithDate)(defaultProps, undefined),
112
111
  });
113
112
  };
114
113
  exports.updateDefaultProps = updateDefaultProps;
115
114
  const canUpdateDefaultProps = (compositionId) => {
116
- return (0, exports.callApi)('/api/can-update-default-props', {
115
+ return callApi('/api/can-update-default-props', {
117
116
  compositionId,
118
117
  });
119
118
  };
@@ -3,15 +3,39 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RenderQueue = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const client_id_1 = require("../../helpers/client-id");
6
7
  const colors_1 = require("../../helpers/colors");
8
+ const layout_1 = require("../layout");
7
9
  const context_1 = require("./context");
8
10
  const RenderQueueItem_1 = require("./RenderQueueItem");
9
11
  const separatorStyle = {
10
12
  borderBottom: `1px solid ${colors_1.BORDER_COLOR}`,
11
13
  };
12
- // TODO: Handle state where preview server is disconnected
14
+ const errorExplanation = {
15
+ fontSize: 14,
16
+ color: colors_1.LIGHT_TEXT,
17
+ fontFamily: 'sans-serif',
18
+ lineHeight: 1.5,
19
+ };
20
+ const explainer = {
21
+ display: 'flex',
22
+ flex: 1,
23
+ flexDirection: 'column',
24
+ padding: '0 12px',
25
+ justifyContent: 'center',
26
+ alignItems: 'center',
27
+ textAlign: 'center',
28
+ };
13
29
  const RenderQueue = () => {
30
+ const connectionStatus = (0, react_1.useContext)(client_id_1.PreviewServerConnectionCtx).type;
14
31
  const { jobs } = (0, react_1.useContext)(context_1.RenderQueueContext);
32
+ const jobCount = jobs.length;
33
+ if (connectionStatus === 'disconnected') {
34
+ return ((0, jsx_runtime_1.jsxs)("div", { style: explainer, children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { y: 5 }), (0, jsx_runtime_1.jsx)("div", { style: errorExplanation, children: "The preview server has disconnected." }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { y: 2, block: true })] }));
35
+ }
36
+ if (jobCount === 0) {
37
+ return ((0, jsx_runtime_1.jsxs)("div", { style: explainer, children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { y: 5 }), (0, jsx_runtime_1.jsx)("div", { style: errorExplanation, children: "No renders in the queue." }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { y: 2, block: true })] }));
38
+ }
15
39
  return ((0, jsx_runtime_1.jsx)("div", { children: jobs.map((j, index) => {
16
40
  return ((0, jsx_runtime_1.jsx)("div", { style: index === jobs.length - 1 ? undefined : separatorStyle, children: (0, jsx_runtime_1.jsx)(RenderQueueItem_1.RenderQueueItem, { job: j }) }, j.id));
17
41
  }) }));
@@ -2,27 +2,40 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RenderButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const client_1 = require("@remotion/renderer/client");
5
6
  const react_1 = require("react");
6
7
  const remotion_1 = require("remotion");
7
8
  const get_default_out_name_1 = require("../../get-default-out-name");
9
+ const Button_1 = require("../../preview-server/error-overlay/remotion-overlay/Button");
8
10
  const get_default_video_contexts_1 = require("../../preview-server/render-queue/get-default-video-contexts");
9
11
  const client_id_1 = require("../helpers/client-id");
12
+ const use_keybinding_1 = require("../helpers/use-keybinding");
10
13
  const render_1 = require("../icons/render");
11
14
  const modals_1 = require("../state/modals");
12
- const ControlButton_1 = require("./ControlButton");
15
+ const layout_1 = require("./layout");
16
+ const button = {
17
+ paddingLeft: 7,
18
+ paddingRight: 7,
19
+ paddingTop: 7,
20
+ paddingBottom: 7,
21
+ };
22
+ const label = {
23
+ fontSize: 14,
24
+ };
13
25
  const RenderButton = () => {
14
26
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
15
27
  const { type } = (0, react_1.useContext)(client_id_1.PreviewServerConnectionCtx);
28
+ const shortcut = (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? '' : '(R)';
29
+ const tooltip = type === 'connected'
30
+ ? 'Export the current composition ' + shortcut
31
+ : 'Connect to the preview server to render';
16
32
  const iconStyle = (0, react_1.useMemo)(() => {
17
33
  return {
18
34
  style: {
19
- height: 18,
35
+ height: 16,
20
36
  },
21
37
  };
22
38
  }, []);
23
- const tooltip = type === 'connected'
24
- ? 'Export the current composition'
25
- : 'Connect to the preview server to render';
26
39
  const video = remotion_1.Internals.useVideo();
27
40
  const frame = (0, remotion_1.useCurrentFrame)();
28
41
  const onClick = (0, react_1.useCallback)(() => {
@@ -47,7 +60,9 @@ const RenderButton = () => {
47
60
  initialVideoImageFormat: defaults.videoImageFormat,
48
61
  initialOutName: (0, get_default_out_name_1.getDefaultOutLocation)({
49
62
  compositionName: video.id,
50
- defaultExtension: isVideo ? 'mp4' : 'png',
63
+ defaultExtension: isVideo
64
+ ? client_1.BrowserSafeApis.getFileExtensionFromCodec(initialVideoCodec, defaults.audioCodec)
65
+ : defaults.stillImageFormat,
51
66
  type: 'asset',
52
67
  }),
53
68
  initialJpegQuality: defaults.jpegQuality,
@@ -79,6 +94,6 @@ const RenderButton = () => {
79
94
  if (!video) {
80
95
  return null;
81
96
  }
82
- return ((0, jsx_runtime_1.jsx)(ControlButton_1.ControlButton, { id: "render-modal-button", disabled: type !== 'connected', title: tooltip, "aria-label": tooltip, onClick: onClick, children: (0, jsx_runtime_1.jsx)(render_1.RenderIcon, { svgProps: iconStyle }) }));
97
+ return ((0, jsx_runtime_1.jsx)(Button_1.Button, { id: "render-modal-button", title: tooltip, onClick: onClick, buttonContainerStyle: button, children: (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)(render_1.RenderIcon, { svgProps: iconStyle }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("span", { style: label, children: "Render" })] }) }));
83
98
  };
84
99
  exports.RenderButton = RenderButton;
@@ -11,14 +11,14 @@ const row = {
11
11
  display: 'flex',
12
12
  flexDirection: 'row',
13
13
  fontSize: 14,
14
- justifyContent: 'center',
15
14
  color: 'inherit',
16
15
  alignItems: 'center',
16
+ flex: 1,
17
17
  };
18
18
  const badge = {
19
19
  height: 16,
20
20
  width: 16,
21
- borderRadius: 8,
21
+ borderRadius: 3,
22
22
  fontSize: 10,
23
23
  display: 'inline-flex',
24
24
  justifyContent: 'center',
@@ -38,6 +38,6 @@ const RendersTab = ({ selected, onClick }) => {
38
38
  borderColor: colors_1.LIGHT_TEXT,
39
39
  };
40
40
  }, [failedJobs]);
41
- return ((0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: selected, onClick: onClick, children: (0, jsx_runtime_1.jsxs)("div", { style: row, children: ["Renders", jobCount > 0 ? ((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)("div", { style: badgeStyle, children: jobCount })] })) : null] }) }));
41
+ return ((0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: selected, onClick: onClick, children: (0, jsx_runtime_1.jsxs)("div", { style: row, children: ["Renders", jobCount > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)("div", { style: badgeStyle, children: jobCount })] })) : null] }) }));
42
42
  };
43
43
  exports.RendersTab = RendersTab;
@@ -4,7 +4,6 @@ exports.RightPanel = exports.rightSidebarTabs = exports.persistSelectedPanel = v
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
- const colors_1 = require("../helpers/colors");
8
7
  const RenderModalData_1 = require("./RenderModal/RenderModalData");
9
8
  const RenderQueue_1 = require("./RenderQueue");
10
9
  const RendersTab_1 = require("./RendersTab");
@@ -19,8 +18,6 @@ const container = {
19
18
  const PropsEditor = ({ composition }) => {
20
19
  var _a;
21
20
  const { props, updateProps } = (0, react_1.useContext)(remotion_1.Internals.EditorPropsContext);
22
- // TODO: Warn if inputProps were specified to the CLI, then
23
- // they take priority over defaultProps
24
21
  const setInputProps = (0, react_1.useCallback)((newProps) => {
25
22
  updateProps({
26
23
  id: composition.id,
@@ -38,9 +35,7 @@ const getSelectedPanel = () => {
38
35
  }
39
36
  return 'input-props';
40
37
  };
41
- const tabsContainer = {
42
- borderBottom: `1px solid ${colors_1.BORDER_COLOR}`,
43
- };
38
+ const tabsContainer = {};
44
39
  const persistSelectedPanel = (panel) => {
45
40
  localStorage.setItem(localStorageKey, panel);
46
41
  };
@@ -76,6 +71,6 @@ const RightPanel = () => {
76
71
  if (composition === null) {
77
72
  return null;
78
73
  }
79
- 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 === 'input-props', onClick: onCompositionsSelected, children: "Default Props" }), (0, jsx_runtime_1.jsx)(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' })] }) }), panel === 'renders' ? ((0, jsx_runtime_1.jsx)(RenderQueue_1.RenderQueue, {})) : ((0, jsx_runtime_1.jsx)(PropsEditor, { composition: composition }))] }));
74
+ 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 === 'input-props', onClick: onCompositionsSelected, children: "Props" }), (0, jsx_runtime_1.jsx)(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' })] }) }), panel === 'renders' ? ((0, jsx_runtime_1.jsx)(RenderQueue_1.RenderQueue, {})) : ((0, jsx_runtime_1.jsx)(PropsEditor, { composition: composition }))] }));
80
75
  };
81
76
  exports.RightPanel = RightPanel;
@@ -1,4 +1,3 @@
1
- import type { PropsWithChildren } from 'react';
2
1
  import React from 'react';
3
2
  export declare type SegmentedControlItem = {
4
3
  label: React.ReactNode;
@@ -10,7 +9,3 @@ export declare const SegmentedControl: React.FC<{
10
9
  items: SegmentedControlItem[];
11
10
  needsWrapping: boolean;
12
11
  }>;
13
- export declare const Item: React.FC<PropsWithChildren<{
14
- selected: boolean;
15
- onClick: () => void;
16
- }>>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Item = exports.SegmentedControl = void 0;
3
+ exports.SegmentedControl = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const colors_1 = require("../helpers/colors");
@@ -38,7 +38,7 @@ const SegmentedControl = ({ items, needsWrapping }) => {
38
38
  };
39
39
  }, [needsWrapping]);
40
40
  return ((0, jsx_runtime_1.jsx)("div", { style: controlStyle, children: items.map((i) => {
41
- return ((0, jsx_runtime_1.jsx)(exports.Item, { onClick: i.onClick, selected: i.selected, children: i.label }, i.key));
41
+ return ((0, jsx_runtime_1.jsx)(Item, { onClick: i.onClick, selected: i.selected, children: i.label }, i.key));
42
42
  }) }));
43
43
  };
44
44
  exports.SegmentedControl = SegmentedControl;
@@ -60,4 +60,3 @@ const Item = ({ selected, onClick, children }) => {
60
60
  }, [hovered, selected]);
61
61
  return ((0, jsx_runtime_1.jsx)("button", { type: "button", onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, style: itemStyle, tabIndex: tabIndex, onClick: onClick, children: children }));
62
62
  };
63
- exports.Item = Item;
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SidebarCollapserControls = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const ShortcutHint_1 = require("../../preview-server/error-overlay/remotion-overlay/ShortcutHint");
7
+ const use_keybinding_1 = require("../helpers/use-keybinding");
6
8
  const sidebar_1 = require("../state/sidebar");
7
9
  const InlineAction_1 = require("./InlineAction");
8
10
  const layout_1 = require("./layout");
@@ -15,7 +17,8 @@ const style = {
15
17
  position: 'relative',
16
18
  };
17
19
  const SidebarCollapserControls = () => {
18
- const { setSidebarCollapsedStateLeft, setSidebarCollapsedStateRight, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
20
+ const { setSidebarCollapsedState, sidebarCollapsedStateRight } = (0, react_1.useContext)(sidebar_1.SidebarContext);
21
+ const keybindings = (0, use_keybinding_1.useKeybinding)();
19
22
  const leftSidebarStatus = (0, TopPanel_1.useResponsiveSidebarStatus)();
20
23
  const leftIcon = (0, react_1.useMemo)(() => {
21
24
  return {
@@ -36,16 +39,84 @@ const SidebarCollapserControls = () => {
36
39
  };
37
40
  }, [sidebarCollapsedStateRight]);
38
41
  const toggleLeft = (0, react_1.useCallback)(() => {
39
- setSidebarCollapsedStateLeft((s) => {
40
- if (s === 'responsive') {
41
- return leftSidebarStatus === 'collapsed' ? 'expanded' : 'collapsed';
42
- }
43
- return s === 'collapsed' ? 'expanded' : 'collapsed';
42
+ setSidebarCollapsedState({
43
+ left: (s) => {
44
+ if (s === 'responsive') {
45
+ return leftSidebarStatus === 'collapsed' ? 'expanded' : 'collapsed';
46
+ }
47
+ return s === 'collapsed' ? 'expanded' : 'collapsed';
48
+ },
49
+ right: null,
44
50
  });
45
- }, [leftSidebarStatus, setSidebarCollapsedStateLeft]);
51
+ }, [leftSidebarStatus, setSidebarCollapsedState]);
46
52
  const toggleRight = (0, react_1.useCallback)(() => {
47
- setSidebarCollapsedStateRight((s) => s === 'collapsed' ? 'expanded' : 'collapsed');
48
- }, [setSidebarCollapsedStateRight]);
49
- return ((0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [(0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { onClick: toggleLeft, children: (0, jsx_runtime_1.jsx)("div", { style: style, children: (0, jsx_runtime_1.jsx)("div", { style: leftIcon }) }) }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { onClick: toggleRight, children: (0, jsx_runtime_1.jsx)("div", { style: style, children: (0, jsx_runtime_1.jsx)("div", { style: rightIcon }) }) })] }));
53
+ setSidebarCollapsedState({
54
+ right: (s) => (s === 'collapsed' ? 'expanded' : 'collapsed'),
55
+ left: null,
56
+ });
57
+ }, [setSidebarCollapsedState]);
58
+ const toggleBoth = (0, react_1.useCallback)(() => {
59
+ if (sidebarCollapsedStateRight === leftSidebarStatus) {
60
+ setSidebarCollapsedState({
61
+ left: (s) => {
62
+ if (s === 'responsive') {
63
+ return leftSidebarStatus === 'collapsed' ? 'expanded' : 'collapsed';
64
+ }
65
+ return s === 'collapsed' ? 'expanded' : 'collapsed';
66
+ },
67
+ right: (s) => (s === 'collapsed' ? 'expanded' : 'collapsed'),
68
+ });
69
+ }
70
+ else if (sidebarCollapsedStateRight === 'expanded') {
71
+ toggleRight();
72
+ }
73
+ else if (leftSidebarStatus === 'expanded') {
74
+ toggleLeft();
75
+ }
76
+ }, [
77
+ leftSidebarStatus,
78
+ setSidebarCollapsedState,
79
+ sidebarCollapsedStateRight,
80
+ toggleLeft,
81
+ toggleRight,
82
+ ]);
83
+ (0, react_1.useEffect)(() => {
84
+ const left = keybindings.registerKeybinding({
85
+ event: 'keydown',
86
+ key: 'b',
87
+ commandCtrlKey: true,
88
+ callback: toggleLeft,
89
+ preventDefault: true,
90
+ triggerIfInputFieldFocused: false,
91
+ });
92
+ const right = keybindings.registerKeybinding({
93
+ event: 'keydown',
94
+ key: 'j',
95
+ commandCtrlKey: true,
96
+ callback: toggleRight,
97
+ preventDefault: true,
98
+ triggerIfInputFieldFocused: false,
99
+ });
100
+ const zen = keybindings.registerKeybinding({
101
+ event: 'keydown',
102
+ key: 'g',
103
+ commandCtrlKey: true,
104
+ callback: toggleBoth,
105
+ preventDefault: true,
106
+ triggerIfInputFieldFocused: false,
107
+ });
108
+ return () => {
109
+ left.unregister();
110
+ right.unregister();
111
+ zen.unregister();
112
+ };
113
+ }, [keybindings, toggleBoth, toggleLeft, toggleRight]);
114
+ const toggleLeftTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
115
+ ? 'Toggle Left Sidebar'
116
+ : `Toggle Left Sidebar (${ShortcutHint_1.cmdOrCtrlCharacter}+B)`;
117
+ const toggleRightTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
118
+ ? 'Toggle Right Sidebar'
119
+ : `Toggle Right Sidebar (${ShortcutHint_1.cmdOrCtrlCharacter}+J)`;
120
+ return ((0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [(0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { onClick: toggleLeft, children: (0, jsx_runtime_1.jsx)("div", { style: style, title: toggleLeftTooltip, children: (0, jsx_runtime_1.jsx)("div", { style: leftIcon }) }) }), (0, jsx_runtime_1.jsx)(InlineAction_1.InlineAction, { onClick: toggleRight, children: (0, jsx_runtime_1.jsx)("div", { style: style, title: toggleRightTooltip, children: (0, jsx_runtime_1.jsx)("div", { style: rightIcon }) }) })] }));
50
121
  };
51
122
  exports.SidebarCollapserControls = SidebarCollapserControls;
@@ -84,7 +84,7 @@ const SizeSelector = () => {
84
84
  },
85
85
  type: 'item',
86
86
  value: newSize.size,
87
- keyHint: newSize.size === 1 ? '0' : null,
87
+ keyHint: newSize.size === 'auto' ? '0' : null,
88
88
  leftItem: String(size.size) === String(newSize.size) ? (0, jsx_runtime_1.jsx)(Checkmark_1.Checkmark, {}) : null,
89
89
  subMenu: null,
90
90
  quickSwitcherLabel: null,
@@ -14,6 +14,7 @@ const SplitterElement = ({ children, type }) => {
14
14
  display: 'flex',
15
15
  position: 'relative',
16
16
  overflow: 'hidden',
17
+ flexDirection: 'column',
17
18
  };
18
19
  }, [context.flexValue, type]);
19
20
  return (0, jsx_runtime_1.jsx)("div", { style: style, children: children });
@@ -23,7 +23,12 @@ const selectorButton = {
23
23
  border: 'none',
24
24
  flex: 1,
25
25
  padding: 8,
26
+ paddingLeft: 16,
27
+ display: 'flex',
28
+ flexDirection: 'row',
26
29
  fontSize: 14,
30
+ color: 'inherit',
31
+ alignItems: 'center',
27
32
  };
28
33
  const Tab = ({ children, onClick, style, selected }) => {
29
34
  const [hovered, setHovered] = (0, react_1.useState)(false);
@@ -38,11 +43,13 @@ const Tab = ({ children, onClick, style, selected }) => {
38
43
  return {
39
44
  ...selectorButton,
40
45
  backgroundColor: selected
41
- ? colors_1.SELECTED_BACKGROUND
46
+ ? 'transparent'
42
47
  : hovered
43
48
  ? colors_1.CLEAR_HOVER
44
- : 'transparent',
49
+ : colors_1.INPUT_BACKGROUND,
45
50
  color: selected ? 'white' : colors_1.LIGHT_TEXT,
51
+ borderTop: selected ? '2px solid var(--blue)' : '2px solid transparent',
52
+ boxShadow: selected ? 'none' : undefined,
46
53
  ...style,
47
54
  };
48
55
  }, [hovered, selected, style]);
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export declare const VerticalTab: React.FC<{
3
+ children: React.ReactNode;
4
+ onClick: React.MouseEventHandler<HTMLButtonElement>;
5
+ style?: React.CSSProperties;
6
+ selected: boolean;
7
+ }>;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VerticalTab = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const z_index_1 = require("../../state/z-index");
8
+ const selectorButton = {
9
+ border: 'none',
10
+ flex: 1,
11
+ padding: 8,
12
+ paddingLeft: 16,
13
+ display: 'flex',
14
+ flexDirection: 'row',
15
+ fontSize: 14,
16
+ color: 'inherit',
17
+ alignItems: 'center',
18
+ };
19
+ const VerticalTab = ({ children, onClick, style, selected }) => {
20
+ const [hovered, setHovered] = (0, react_1.useState)(false);
21
+ const { tabIndex } = (0, z_index_1.useZIndex)();
22
+ const onPointerEnter = (0, react_1.useCallback)(() => {
23
+ setHovered(true);
24
+ }, []);
25
+ const onPointerLeave = (0, react_1.useCallback)(() => {
26
+ setHovered(false);
27
+ }, []);
28
+ const definiteStyle = (0, react_1.useMemo)(() => {
29
+ return {
30
+ ...selectorButton,
31
+ backgroundColor: selected
32
+ ? colors_1.SELECTED_BACKGROUND
33
+ : hovered
34
+ ? colors_1.CLEAR_HOVER
35
+ : 'transparent',
36
+ color: selected ? 'white' : colors_1.LIGHT_TEXT,
37
+ boxShadow: selected ? 'none' : undefined,
38
+ ...style,
39
+ };
40
+ }, [hovered, selected, style]);
41
+ return ((0, jsx_runtime_1.jsx)("button", { style: definiteStyle, type: "button", onClick: onClick, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: children }));
42
+ };
43
+ exports.VerticalTab = VerticalTab;
@@ -18,14 +18,13 @@ const text = {
18
18
  const time = {
19
19
  display: 'inline-block',
20
20
  fontSize: 18,
21
+ lineHeight: 1,
21
22
  };
22
23
  const frameStyle = {
23
24
  color: '#ccc',
24
25
  fontSize: 10,
25
26
  fontWeight: 500,
26
- };
27
- const spacer = {
28
- width: layout_1.SPACING_UNIT,
27
+ lineHeight: 1,
29
28
  };
30
29
  const TimeValue = () => {
31
30
  const frame = (0, remotion_1.useCurrentFrame)();
@@ -37,6 +36,6 @@ const TimeValue = () => {
37
36
  if (isStill) {
38
37
  return null;
39
38
  }
40
- return ((0, jsx_runtime_1.jsxs)("div", { style: text, children: [(0, jsx_runtime_1.jsx)("div", { style: time, children: (0, render_frame_1.renderFrame)(frame, config.fps) }), ' ', (0, jsx_runtime_1.jsx)("div", { style: spacer }), (0, jsx_runtime_1.jsxs)("div", { style: frameStyle, children: [frame, " ", (0, jsx_runtime_1.jsxs)("span", { style: frameStyle, children: ["(", config.fps, " fps)"] })] })] }));
39
+ return ((0, jsx_runtime_1.jsxs)("div", { style: text, children: [(0, jsx_runtime_1.jsx)("div", { style: time, children: (0, render_frame_1.renderFrame)(frame, config.fps) }), " ", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsxs)("div", { style: frameStyle, children: [frame, " ", (0, jsx_runtime_1.jsxs)("span", { style: frameStyle, children: ["(", config.fps, " fps)"] })] })] }));
41
40
  };
42
41
  exports.TimeValue = TimeValue;
@@ -5,6 +5,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const timeline_layout_1 = require("../../helpers/timeline-layout");
7
7
  const z_index_1 = require("../../state/z-index");
8
+ const layout_1 = require("../layout");
8
9
  const TimelineCollapseToggle_1 = require("./TimelineCollapseToggle");
9
10
  const TimelineSequenceFrame_1 = require("./TimelineSequenceFrame");
10
11
  const HOOK_WIDTH = 7;
@@ -16,6 +17,9 @@ const TIMELINE_COLLAPSER_MARGIN_RIGHT = 10;
16
17
  exports.TOTAL_TIMELINE_LAYER_LEFT_PADDING = TIMELINE_COLLAPSER_WIDTH + TIMELINE_COLLAPSER_MARGIN_RIGHT + timeline_layout_1.TIMELINE_PADDING;
17
18
  const textStyle = {
18
19
  fontSize: 13,
20
+ whiteSpace: 'nowrap',
21
+ textOverflow: 'ellipsis',
22
+ overflow: 'hidden',
19
23
  };
20
24
  const outer = {
21
25
  height: timeline_layout_1.TIMELINE_LAYER_HEIGHT + timeline_layout_1.TIMELINE_BORDER * 2,
@@ -43,14 +47,17 @@ const hook = {
43
47
  };
44
48
  const space = {
45
49
  width: SPACING,
50
+ flexShrink: 0,
46
51
  };
47
52
  const smallSpace = {
48
53
  width: SPACING * 0.5,
54
+ flexShrink: 0,
49
55
  };
50
56
  const collapser = {
51
57
  width: TIMELINE_COLLAPSER_WIDTH,
52
58
  userSelect: 'none',
53
59
  marginRight: TIMELINE_COLLAPSER_MARGIN_RIGHT,
60
+ flexShrink: 0,
54
61
  };
55
62
  const collapserButton = {
56
63
  ...collapser,
@@ -71,6 +78,7 @@ const TimelineListItem = ({ nestedDepth, sequence, collapsed, beforeDepth, dispa
71
78
  const padder = (0, react_1.useMemo)(() => {
72
79
  return {
73
80
  width: leftOffset * nestedDepth,
81
+ flexShrink: 0,
74
82
  };
75
83
  }, [leftOffset, nestedDepth]);
76
84
  const toggleCollapse = (0, react_1.useCallback)(() => {
@@ -90,6 +98,6 @@ const TimelineListItem = ({ nestedDepth, sequence, collapsed, beforeDepth, dispa
90
98
  const text = sequence.displayName.length > 80
91
99
  ? sequence.displayName.slice(0, 80) + '...'
92
100
  : sequence.displayName;
93
- return ((0, jsx_runtime_1.jsxs)("div", { style: outer, children: [(0, jsx_runtime_1.jsx)("div", { style: padder }), canCollapse ? ((0, jsx_runtime_1.jsx)("button", { tabIndex: tabIndex, type: "button", style: collapserButton, onClick: toggleCollapse, children: (0, jsx_runtime_1.jsx)(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: collapsed }) })) : ((0, jsx_runtime_1.jsx)("div", { style: collapser })), sequence.parent && nestedDepth > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: smallSpace }), (0, jsx_runtime_1.jsx)("div", { style: hookContainer, children: (0, jsx_runtime_1.jsx)("div", { style: hookStyle }) }), (0, jsx_runtime_1.jsx)("div", { style: space })] })) : null, (0, jsx_runtime_1.jsxs)("div", { style: textStyle, children: [text || 'Untitled', (0, jsx_runtime_1.jsx)(TimelineSequenceFrame_1.TimelineSequenceFrame, { duration: sequence.duration, from: sequence.from })] })] }));
101
+ return ((0, jsx_runtime_1.jsxs)("div", { style: outer, children: [(0, jsx_runtime_1.jsx)("div", { style: padder }), canCollapse ? ((0, jsx_runtime_1.jsx)("button", { tabIndex: tabIndex, type: "button", style: collapserButton, onClick: toggleCollapse, children: (0, jsx_runtime_1.jsx)(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: collapsed }) })) : ((0, jsx_runtime_1.jsx)("div", { style: collapser })), sequence.parent && nestedDepth > 0 ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: smallSpace }), (0, jsx_runtime_1.jsx)("div", { style: hookContainer, children: (0, jsx_runtime_1.jsx)("div", { style: hookStyle }) }), (0, jsx_runtime_1.jsx)("div", { style: space })] })) : null, (0, jsx_runtime_1.jsxs)("div", { title: text || 'Untitled', style: textStyle, children: [text || 'Untitled', (0, jsx_runtime_1.jsx)(TimelineSequenceFrame_1.TimelineSequenceFrame, { duration: sequence.duration, from: sequence.from })] }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 })] }));
94
102
  };
95
103
  exports.TimelineListItem = TimelineListItem;
package/dist/ffmpeg.js CHANGED
@@ -5,7 +5,7 @@ const renderer_1 = require("@remotion/renderer");
5
5
  const child_process_1 = require("child_process");
6
6
  const ffmpegCommand = (_root, args) => {
7
7
  const done = (0, child_process_1.spawnSync)(renderer_1.RenderInternals.getExecutablePath('ffmpeg'), args, {
8
- ...renderer_1.RenderInternals.callFfExtraOptions(),
8
+ ...renderer_1.RenderInternals.dynamicLibraryPathOptions(),
9
9
  stdio: 'inherit',
10
10
  });
11
11
  process.exit(done.status);
@@ -13,7 +13,7 @@ const ffmpegCommand = (_root, args) => {
13
13
  exports.ffmpegCommand = ffmpegCommand;
14
14
  const ffprobeCommand = (_root, args) => {
15
15
  const done = (0, child_process_1.spawnSync)(renderer_1.RenderInternals.getExecutablePath('ffprobe'), args, {
16
- ...renderer_1.RenderInternals.callFfExtraOptions(),
16
+ ...renderer_1.RenderInternals.dynamicLibraryPathOptions(),
17
17
  stdio: 'inherit',
18
18
  });
19
19
  process.exit(done.status);
@@ -131,6 +131,7 @@ const getCliOptions = async (options) => {
131
131
  ignoreCertificateErrors: config_1.ConfigInternals.getIgnoreCertificateErrors(),
132
132
  headless: config_1.ConfigInternals.getChromiumHeadlessMode(),
133
133
  gl: (_a = config_1.ConfigInternals.getChromiumOpenGlRenderer()) !== null && _a !== void 0 ? _a : renderer_1.RenderInternals.DEFAULT_OPENGL_RENDERER,
134
+ userAgent: config_1.ConfigInternals.getChromiumUserAgent(),
134
135
  };
135
136
  const everyNthFrame = config_1.ConfigInternals.getEveryNthFrame();
136
137
  const numberOfGifLoops = config_1.ConfigInternals.getNumberOfGifLoops();
@@ -50,6 +50,7 @@ export declare type CommandLineOptions = {
50
50
  ['no-open']: boolean;
51
51
  ['browser']: string;
52
52
  ['browser-args']: string;
53
+ ['user-agent']: string;
53
54
  };
54
55
  export declare const BooleanFlags: string[];
55
56
  export declare const parsedCli: CommandLineOptions & {
@@ -66,6 +66,9 @@ const parseCommandLine = () => {
66
66
  if (exports.parsedCli['disable-headless']) {
67
67
  config_1.Config.setChromiumHeadlessMode(false);
68
68
  }
69
+ if (exports.parsedCli['user-agent']) {
70
+ config_1.Config.setChromiumUserAgent(exports.parsedCli['user-agent']);
71
+ }
69
72
  if (exports.parsedCli.log) {
70
73
  if (!renderer_1.RenderInternals.isValidLogLevel(exports.parsedCli.log)) {
71
74
  log_1.Log.error('Invalid `--log` value passed.');
@@ -8,10 +8,6 @@ export declare type ApiHandler<ReqData, ResData> = (params: {
8
8
  request: IncomingMessage;
9
9
  response: ServerResponse;
10
10
  }) => Promise<ResData>;
11
- export declare type ApiRoute<ReqData, ResData> = {
12
- handler: ApiHandler<ReqData, ResData>;
13
- endpoint: string;
14
- };
15
11
  declare type ReqAndRes<A, B> = {
16
12
  Request: A;
17
13
  Response: B;
@@ -1,7 +1,7 @@
1
1
  import type { AudioCodec, Codec, makeCancelSignal, PixelFormat, ProResProfile, StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
2
  import type { AggregateRenderProgress } from '../../progress-types';
3
3
  import type { RequiredChromiumOptions } from '../../required-chromium-options';
4
- export declare type BaseRenderProgress = {
4
+ declare type BaseRenderProgress = {
5
5
  message: string;
6
6
  value: number;
7
7
  };