@remotion/cli 3.3.54 → 3.3.56

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.
@@ -1,3 +1,3 @@
1
1
  import type { LogLevel } from '@remotion/renderer';
2
- export declare const getLogLevel: () => "verbose" | "info" | "warn" | "error";
2
+ export declare const getLogLevel: () => "error" | "verbose" | "info" | "warn";
3
3
  export declare const setLogLevel: (newLogLevel: LogLevel) => void;
@@ -9,6 +9,7 @@ const colors_1 = require("../helpers/colors");
9
9
  const get_effective_translation_1 = require("../helpers/get-effective-translation");
10
10
  const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
11
11
  const use_keybinding_1 = require("../helpers/use-keybinding");
12
+ const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
12
13
  const preview_size_1 = require("../state/preview-size");
13
14
  const layout_1 = require("./layout");
14
15
  const Preview_1 = require("./Preview");
@@ -30,6 +31,7 @@ const Canvas = () => {
30
31
  const dimensions = (0, is_current_selected_still_1.useDimensions)();
31
32
  const ref = (0, react_1.useRef)(null);
32
33
  const { setSize, size: previewSize } = (0, react_1.useContext)(preview_size_1.PreviewSizeContext);
34
+ const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
33
35
  const keybindings = (0, use_keybinding_1.useKeybinding)();
34
36
  const size = player_1.PlayerInternals.useElementSize(ref, {
35
37
  triggerOnWindowResize: false,
@@ -40,6 +42,9 @@ const Canvas = () => {
40
42
  previewSize.translation.x === 0 &&
41
43
  previewSize.translation.y === 0);
42
44
  const onWheel = (0, react_1.useCallback)((e) => {
45
+ if (!editorZoomGestures) {
46
+ return;
47
+ }
43
48
  if (!size) {
44
49
  return;
45
50
  }
@@ -116,7 +121,7 @@ const Canvas = () => {
116
121
  }),
117
122
  };
118
123
  });
119
- }, [dimensions, isFit, setSize, size]);
124
+ }, [editorZoomGestures, dimensions, isFit, setSize, size]);
120
125
  (0, react_1.useEffect)(() => {
121
126
  const { current } = ref;
122
127
  if (!current) {
@@ -6,6 +6,7 @@ const player_1 = require("@remotion/player");
6
6
  const react_1 = require("react");
7
7
  const remotion_1 = require("remotion");
8
8
  const checkerboard_1 = require("../state/checkerboard");
9
+ const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
9
10
  const folders_1 = require("../state/folders");
10
11
  const highest_z_index_1 = require("../state/highest-z-index");
11
12
  const in_out_1 = require("../state/in-out");
@@ -37,6 +38,14 @@ const EditorContexts = ({ children }) => {
37
38
  return newVal;
38
39
  });
39
40
  }, []);
41
+ const [editorZoomGestures, setEditorZoomGesturesState] = (0, react_1.useState)(() => (0, editor_zoom_gestures_1.loadEditorZoomGesturesOption)());
42
+ const setEditorZoomGestures = (0, react_1.useCallback)((newValue) => {
43
+ setEditorZoomGesturesState((prevState) => {
44
+ const newVal = newValue(prevState);
45
+ (0, editor_zoom_gestures_1.persistEditorZoomGesturesOption)(newVal);
46
+ return newVal;
47
+ });
48
+ }, []);
40
49
  const [richTimeline, setRichTimelineState] = (0, react_1.useState)(() => (0, rich_timeline_1.loadRichTimelineOption)());
41
50
  const setRichTimeline = (0, react_1.useCallback)((newValue) => {
42
51
  setRichTimelineState((prevState) => {
@@ -54,6 +63,12 @@ const EditorContexts = ({ children }) => {
54
63
  setCheckerboard,
55
64
  };
56
65
  }, [checkerboard, setCheckerboard]);
66
+ const editorZoomGesturesCtx = (0, react_1.useMemo)(() => {
67
+ return {
68
+ editorZoomGestures,
69
+ setEditorZoomGestures,
70
+ };
71
+ }, [editorZoomGestures, setEditorZoomGestures]);
57
72
  const richTimelineCtx = (0, react_1.useMemo)(() => {
58
73
  return {
59
74
  richTimeline,
@@ -78,6 +93,6 @@ const EditorContexts = ({ children }) => {
78
93
  setSelectedModal: setModalContextType,
79
94
  };
80
95
  }, [modalContextType]);
81
- return ((0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(rich_timeline_1.RichTimelineContext.Provider, { value: richTimelineCtx, children: (0, jsx_runtime_1.jsx)(checkerboard_1.CheckerboardContext.Provider, { value: checkerboardCtx, children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(modals_1.ModalsContext.Provider, { value: modalsContext, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.MediaVolumeContext.Provider, { value: mediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.SetMediaVolumeContext.Provider, { value: setMediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(player_1.PlayerInternals.PlayerEventEmitterContext.Provider, { value: emitter, children: (0, jsx_runtime_1.jsx)(sidebar_1.SidebarContextProvider, { children: (0, jsx_runtime_1.jsx)(folders_1.FolderContextProvider, { children: (0, jsx_runtime_1.jsx)(highest_z_index_1.HighestZIndexProvider, { children: (0, jsx_runtime_1.jsx)(in_out_1.TimelineInOutContext.Provider, { value: timelineInOutContextValue, children: (0, jsx_runtime_1.jsx)(in_out_1.SetTimelineInOutContext.Provider, { value: setTimelineInOutContextValue, children: children }) }) }) }) }) }) }) }) }) }) }) }) }));
96
+ return ((0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(rich_timeline_1.RichTimelineContext.Provider, { value: richTimelineCtx, children: (0, jsx_runtime_1.jsx)(checkerboard_1.CheckerboardContext.Provider, { value: checkerboardCtx, children: (0, jsx_runtime_1.jsx)(editor_zoom_gestures_1.EditorZoomGesturesContext.Provider, { value: editorZoomGesturesCtx, children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(modals_1.ModalsContext.Provider, { value: modalsContext, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.MediaVolumeContext.Provider, { value: mediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(remotion_1.Internals.SetMediaVolumeContext.Provider, { value: setMediaVolumeContextValue, children: (0, jsx_runtime_1.jsx)(player_1.PlayerInternals.PlayerEventEmitterContext.Provider, { value: emitter, children: (0, jsx_runtime_1.jsx)(sidebar_1.SidebarContextProvider, { children: (0, jsx_runtime_1.jsx)(folders_1.FolderContextProvider, { children: (0, jsx_runtime_1.jsx)(highest_z_index_1.HighestZIndexProvider, { children: (0, jsx_runtime_1.jsx)(in_out_1.TimelineInOutContext.Provider, { value: timelineInOutContextValue, children: (0, jsx_runtime_1.jsx)(in_out_1.SetTimelineInOutContext.Provider, { value: setTimelineInOutContextValue, children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }));
82
97
  };
83
98
  exports.EditorContexts = EditorContexts;
@@ -1,3 +1,4 @@
1
+ import type { SetStateAction } from 'react';
1
2
  import React from 'react';
2
3
  import type { ComboboxValue } from '../NewComposition/ComboBox';
3
4
  export declare type MenuId = 'remotion' | 'file' | 'view' | 'tools' | 'help';
@@ -11,7 +12,7 @@ export declare const MenuItem: React.FC<{
11
12
  label: React.ReactNode;
12
13
  id: MenuId;
13
14
  selected: boolean;
14
- onItemSelected: (id: MenuId) => void;
15
+ onItemSelected: (s: SetStateAction<string | null>) => void;
15
16
  onItemHovered: (id: MenuId) => void;
16
17
  onItemQuit: () => void;
17
18
  onPreviousMenu: () => void;
@@ -11,6 +11,7 @@ const react_dom_1 = __importDefault(require("react-dom"));
11
11
  const colors_1 = require("../../helpers/colors");
12
12
  const z_index_1 = require("../../state/z-index");
13
13
  const MenuContent_1 = require("../NewComposition/MenuContent");
14
+ const is_menu_item_1 = require("./is-menu-item");
14
15
  const portals_1 = require("./portals");
15
16
  const styles_1 = require("./styles");
16
17
  const container = {
@@ -58,9 +59,25 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
58
59
  const onPointerLeave = (0, react_1.useCallback)(() => {
59
60
  setHovered(false);
60
61
  }, []);
61
- const onClick = (0, react_1.useCallback)(() => {
62
+ const onPointerDown = (0, react_1.useCallback)(() => {
62
63
  onItemSelected(id);
63
- document.activeElement.blur();
64
+ window.addEventListener('pointerup', (e) => {
65
+ if (!(0, is_menu_item_1.isMenuItem)(e.target)) {
66
+ onItemQuit();
67
+ }
68
+ }, {
69
+ once: true,
70
+ });
71
+ }, [id, onItemQuit, onItemSelected]);
72
+ const onClick = (0, react_1.useCallback)((e) => {
73
+ e.stopPropagation();
74
+ const isKeyboardInitiated = e.detail === 0;
75
+ if (!isKeyboardInitiated) {
76
+ return;
77
+ }
78
+ onItemSelected((p) => {
79
+ return p === null ? id : null;
80
+ });
64
81
  }, [id, onItemSelected]);
65
82
  const outerStyle = (0, react_1.useMemo)(() => {
66
83
  var _a, _b;
@@ -69,7 +86,7 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
69
86
  top: ((_a = size === null || size === void 0 ? void 0 : size.top) !== null && _a !== void 0 ? _a : 0) + ((_b = size === null || size === void 0 ? void 0 : size.height) !== null && _b !== void 0 ? _b : 0),
70
87
  };
71
88
  }, [size]);
72
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { ref: ref, role: "button", tabIndex: tabIndex, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onClick: onClick, style: containerStyle, type: "button", children: itemName }), portalStyle
89
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { ref: ref, role: "button", tabIndex: tabIndex, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onPointerDown: onPointerDown, onClick: onClick, style: containerStyle, type: "button", className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, children: itemName }), portalStyle
73
90
  ? react_dom_1.default.createPortal((0, jsx_runtime_1.jsx)("div", { className: "css-reset", style: outerStyle, children: (0, jsx_runtime_1.jsx)(z_index_1.HigherZIndex, { onEscape: onItemQuit, onOutsideClick: onItemQuit, children: (0, jsx_runtime_1.jsx)("div", { style: portalStyle, children: (0, jsx_runtime_1.jsx)(MenuContent_1.MenuContent, { onNextMenu: onPreviousMenu, onPreviousMenu: onNextMenu, values: menu.items, onHide: onItemQuit, leaveLeftSpace: menu.leaveLeftPadding, preselectIndex: false, topItemCanBeUnselected: true }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
74
91
  : null] }));
75
92
  };
@@ -13,6 +13,7 @@ const use_keybinding_1 = require("../../helpers/use-keybinding");
13
13
  const caret_1 = require("../../icons/caret");
14
14
  const z_index_1 = require("../../state/z-index");
15
15
  const layout_1 = require("../layout");
16
+ const is_menu_item_1 = require("./is-menu-item");
16
17
  const portals_1 = require("./portals");
17
18
  const styles_1 = require("./styles");
18
19
  const SubMenu_1 = require("./SubMenu");
@@ -53,7 +54,7 @@ const MenuSubItem = ({ label, leaveLeftSpace, leftItem, onActionChosen, id, sele
53
54
  backgroundColor: selected ? colors_1.CLEAR_HOVER : 'transparent',
54
55
  };
55
56
  }, [selected]);
56
- const onClick = (0, react_1.useCallback)(() => {
57
+ const onItemTriggered = (0, react_1.useCallback)(() => {
57
58
  onActionChosen(id);
58
59
  }, [id, onActionChosen]);
59
60
  const onPointerEnter = (0, react_1.useCallback)(() => {
@@ -85,7 +86,7 @@ const MenuSubItem = ({ label, leaveLeftSpace, leftItem, onActionChosen, id, sele
85
86
  }, 100);
86
87
  return () => clearTimeout(hi);
87
88
  }, [hovered, selected, setSubMenuActivated, subMenu]);
88
- return ((0, jsx_runtime_1.jsx)("div", { ref: ref, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, style: style, onClick: onClick, children: (0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [leaveLeftSpace ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: leftSpace, children: leftItem }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 })] })) : null, (0, jsx_runtime_1.jsx)("div", { style: labelStyle, children: label }), " ", (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), subMenu ? (0, jsx_runtime_1.jsx)(caret_1.CaretRight, {}) : null, keyHint && !(0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? ((0, jsx_runtime_1.jsx)("span", { style: keyHintCss, children: keyHint })) : null, portalStyle && subMenu
89
+ return ((0, jsx_runtime_1.jsx)("div", { ref: ref, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, style: style, onPointerUp: onItemTriggered, role: "button", className: is_menu_item_1.MENU_ITEM_CLASSNAME, children: (0, jsx_runtime_1.jsxs)(layout_1.Row, { children: [leaveLeftSpace ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: leftSpace, children: leftItem }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 })] })) : null, (0, jsx_runtime_1.jsx)("div", { style: labelStyle, children: label }), " ", (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), subMenu ? (0, jsx_runtime_1.jsx)(caret_1.CaretRight, {}) : null, keyHint && !(0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? ((0, jsx_runtime_1.jsx)("span", { style: keyHintCss, children: keyHint })) : null, portalStyle && subMenu
89
90
  ? react_dom_1.default.createPortal((0, jsx_runtime_1.jsx)(SubMenu_1.SubMenuComponent, { onQuitFullMenu: onQuitMenu, subMenu: subMenu, onQuitSubMenu: onQuitSubmenu, portalStyle: portalStyle, subMenuActivated: subMenuActivated }), (0, portals_1.getPortal)(currentZIndex))
90
91
  : null] }) }));
91
92
  };
@@ -0,0 +1,3 @@
1
+ export declare const MENU_INITIATOR_CLASSNAME = "__remotion-preview-menu-initiator";
2
+ export declare const MENU_ITEM_CLASSNAME = "__remotion-preview-menu-item";
3
+ export declare const isMenuItem: (el: HTMLElement) => boolean;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMenuItem = exports.MENU_ITEM_CLASSNAME = exports.MENU_INITIATOR_CLASSNAME = void 0;
4
+ exports.MENU_INITIATOR_CLASSNAME = '__remotion-preview-menu-initiator';
5
+ exports.MENU_ITEM_CLASSNAME = '__remotion-preview-menu-item';
6
+ const isMenuItem = (el) => {
7
+ return Boolean(el.classList.contains(exports.MENU_ITEM_CLASSNAME) ||
8
+ el.closest(`.${exports.MENU_ITEM_CLASSNAME}`) ||
9
+ el.classList.contains(exports.MENU_INITIATOR_CLASSNAME) ||
10
+ el.closest(`.${exports.MENU_INITIATOR_CLASSNAME}`));
11
+ };
12
+ exports.isMenuItem = isMenuItem;
@@ -21,6 +21,4 @@ exports.menuContainerTowardsTop = {
21
21
  };
22
22
  exports.outerPortal = {
23
23
  position: 'fixed',
24
- height: '100%',
25
- width: '100%',
26
24
  };
@@ -13,6 +13,7 @@ const noop_1 = require("../../helpers/noop");
13
13
  const caret_1 = require("../../icons/caret");
14
14
  const z_index_1 = require("../../state/z-index");
15
15
  const layout_1 = require("../layout");
16
+ const is_menu_item_1 = require("../Menu/is-menu-item");
16
17
  const portals_1 = require("../Menu/portals");
17
18
  const styles_1 = require("../Menu/styles");
18
19
  const MenuContent_1 = require("./MenuContent");
@@ -44,21 +45,50 @@ const Combobox = ({ values, selectedId, style: customStyle, title }) => {
44
45
  }
45
46
  const onMouseEnter = () => setIsHovered(true);
46
47
  const onMouseLeave = () => setIsHovered(false);
48
+ const onPointerDown = (e) => {
49
+ e.stopPropagation();
50
+ return setOpened((o) => {
51
+ if (!o) {
52
+ refresh === null || refresh === void 0 ? void 0 : refresh();
53
+ window.addEventListener('pointerup', (evt) => {
54
+ if (!(0, is_menu_item_1.isMenuItem)(evt.target)) {
55
+ setOpened(false);
56
+ }
57
+ }, {
58
+ once: true,
59
+ });
60
+ }
61
+ return !o;
62
+ });
63
+ };
47
64
  const onClick = (e) => {
48
65
  e.stopPropagation();
66
+ const isKeyboardInitiated = e.detail === 0;
67
+ if (!isKeyboardInitiated) {
68
+ return;
69
+ }
49
70
  return setOpened((o) => {
50
71
  if (!o) {
51
72
  refresh === null || refresh === void 0 ? void 0 : refresh();
73
+ window.addEventListener('pointerup', (evt) => {
74
+ if (!(0, is_menu_item_1.isMenuItem)(evt.target)) {
75
+ setOpened(false);
76
+ }
77
+ }, {
78
+ once: true,
79
+ });
52
80
  }
53
81
  return !o;
54
82
  });
55
83
  };
56
84
  current.addEventListener('mouseenter', onMouseEnter);
57
85
  current.addEventListener('mouseleave', onMouseLeave);
86
+ current.addEventListener('pointerdown', onPointerDown);
58
87
  current.addEventListener('click', onClick);
59
88
  return () => {
60
89
  current.removeEventListener('mouseenter', onMouseEnter);
61
90
  current.removeEventListener('mouseleave', onMouseLeave);
91
+ current.removeEventListener('pointerdown', onPointerDown);
62
92
  current.removeEventListener('click', onClick);
63
93
  };
64
94
  }, [refresh]);
@@ -99,7 +129,7 @@ const Combobox = ({ values, selectedId, style: customStyle, title }) => {
99
129
  : colors_1.INPUT_BORDER_COLOR_UNHOVERED,
100
130
  };
101
131
  }, [customStyle, hovered, opened]);
102
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { ref: ref, title: title, tabIndex: tabIndex, type: "button", style: style, children: [selected.label, " ", (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), " ", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), " ", (0, jsx_runtime_1.jsx)(caret_1.CaretDown, {})] }), portalStyle
132
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { ref: ref, title: title, tabIndex: tabIndex, type: "button", style: style, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, children: [selected.label, " ", (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), " ", (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), " ", (0, jsx_runtime_1.jsx)(caret_1.CaretDown, {})] }), portalStyle
103
133
  ? react_dom_1.default.createPortal((0, jsx_runtime_1.jsx)("div", { style: styles_1.outerPortal, className: "css-reset", children: (0, jsx_runtime_1.jsx)(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, children: (0, jsx_runtime_1.jsx)("div", { style: portalStyle, children: (0, jsx_runtime_1.jsx)(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: values, onHide: onHide, leaveLeftSpace: true, preselectIndex: values.findIndex((v) => v.id === selected.id), topItemCanBeUnselected: false }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
104
134
  : null] }));
105
135
  };
@@ -22,7 +22,9 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
22
22
  if (values[0].type === 'divider') {
23
23
  throw new Error('first value cant be divide');
24
24
  }
25
- const [selectedItem, setSelectedItem] = (0, react_1.useState)(typeof preselectIndex === 'number' ? values[preselectIndex].id : null);
25
+ const [selectedItem, setSelectedItem] = (0, react_1.useState)(typeof preselectIndex === 'number'
26
+ ? values[preselectIndex].id
27
+ : null);
26
28
  const onEscape = (0, react_1.useCallback)(() => {
27
29
  onHide();
28
30
  }, [onHide]);
@@ -80,6 +82,7 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
80
82
  if (item.subMenu) {
81
83
  return setSubMenuActivated('without-mouse');
82
84
  }
85
+ onHide();
83
86
  item.onClick(item.id);
84
87
  }, [onHide, selectedItem, values]);
85
88
  const onArrowRight = (0, react_1.useCallback)(() => {
@@ -12,6 +12,7 @@ const SizeSelector_1 = require("../components/SizeSelector");
12
12
  const TimelineInOutToggle_1 = require("../components/TimelineInOutToggle");
13
13
  const Checkmark_1 = require("../icons/Checkmark");
14
14
  const checkerboard_1 = require("../state/checkerboard");
15
+ const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
15
16
  const modals_1 = require("../state/modals");
16
17
  const preview_size_1 = require("../state/preview-size");
17
18
  const rich_timeline_1 = require("../state/rich-timeline");
@@ -30,6 +31,7 @@ const ICON_SIZE = 16;
30
31
  const useMenuStructure = (closeMenu) => {
31
32
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
32
33
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
34
+ const { editorZoomGestures, setEditorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
33
35
  const { richTimeline, setRichTimeline } = (0, react_1.useContext)(rich_timeline_1.RichTimelineContext);
34
36
  const { size, setSize } = (0, react_1.useContext)(preview_size_1.PreviewSizeContext);
35
37
  const { setSidebarCollapsedState, sidebarCollapsedState } = (0, react_1.useContext)(sidebar_1.SidebarContext);
@@ -205,6 +207,22 @@ const useMenuStructure = (closeMenu) => {
205
207
  },
206
208
  quickSwitcherLabel: null,
207
209
  },
210
+ {
211
+ id: 'editor-zoom-gestures',
212
+ keyHint: null,
213
+ label: 'Zoom and Pan Gestures',
214
+ onClick: () => {
215
+ closeMenu();
216
+ setEditorZoomGestures((c) => !c);
217
+ },
218
+ type: 'item',
219
+ value: 'editor-zoom-gestures',
220
+ leftItem: editorZoomGestures ? (0, jsx_runtime_1.jsx)(Checkmark_1.Checkmark, {}) : null,
221
+ subMenu: null,
222
+ quickSwitcherLabel: editorZoomGestures
223
+ ? 'Disable Zoom and Pan Gestures'
224
+ : 'Enable Zoom and Pan Gestures',
225
+ },
208
226
  {
209
227
  id: 'timeline-divider-1',
210
228
  type: 'divider',
@@ -227,6 +245,7 @@ const useMenuStructure = (closeMenu) => {
227
245
  label: 'Responsive',
228
246
  leftItem: sidebarCollapsedState === 'responsive' ? ((0, jsx_runtime_1.jsx)(Checkmark_1.Checkmark, {})) : null,
229
247
  onClick: () => {
248
+ closeMenu();
230
249
  setSidebarCollapsedState('responsive');
231
250
  },
232
251
  subMenu: null,
@@ -240,6 +259,7 @@ const useMenuStructure = (closeMenu) => {
240
259
  label: 'Expanded',
241
260
  leftItem: sidebarCollapsedState === 'expanded' ? (0, jsx_runtime_1.jsx)(Checkmark_1.Checkmark, {}) : null,
242
261
  onClick: () => {
262
+ closeMenu();
243
263
  setSidebarCollapsedState('expanded');
244
264
  },
245
265
  subMenu: null,
@@ -253,6 +273,7 @@ const useMenuStructure = (closeMenu) => {
253
273
  label: 'Collapsed',
254
274
  leftItem: sidebarCollapsedState === 'collapsed' ? ((0, jsx_runtime_1.jsx)(Checkmark_1.Checkmark, {})) : null,
255
275
  onClick: () => {
276
+ closeMenu();
256
277
  setSidebarCollapsedState('collapsed');
257
278
  },
258
279
  subMenu: null,
@@ -567,8 +588,10 @@ const useMenuStructure = (closeMenu) => {
567
588
  }, [
568
589
  checkerboard,
569
590
  closeMenu,
591
+ editorZoomGestures,
570
592
  richTimeline,
571
593
  setCheckerboard,
594
+ setEditorZoomGestures,
572
595
  setRichTimeline,
573
596
  setSelectedModal,
574
597
  setSidebarCollapsedState,
@@ -0,0 +1,9 @@
1
+ /// <reference types="react" />
2
+ declare type State = {
3
+ editorZoomGestures: boolean;
4
+ setEditorZoomGestures: (cb: (prevState: boolean) => boolean) => void;
5
+ };
6
+ export declare const persistEditorZoomGesturesOption: (option: boolean) => void;
7
+ export declare const loadEditorZoomGesturesOption: () => boolean;
8
+ export declare const EditorZoomGesturesContext: import("react").Context<State>;
9
+ export {};
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorZoomGesturesContext = exports.loadEditorZoomGesturesOption = exports.persistEditorZoomGesturesOption = void 0;
4
+ const react_1 = require("react");
5
+ const persistEditorZoomGesturesOption = (option) => {
6
+ localStorage.setItem('remotion.editorZoomGestures', String(option));
7
+ };
8
+ exports.persistEditorZoomGesturesOption = persistEditorZoomGesturesOption;
9
+ const loadEditorZoomGesturesOption = () => {
10
+ const item = localStorage.getItem('remotion.editorZoomGestures');
11
+ return item !== 'false';
12
+ };
13
+ exports.loadEditorZoomGesturesOption = loadEditorZoomGesturesOption;
14
+ exports.EditorZoomGesturesContext = (0, react_1.createContext)({
15
+ editorZoomGestures: (0, exports.loadEditorZoomGesturesOption)(),
16
+ setEditorZoomGestures: () => undefined,
17
+ });
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PreviewSizeProvider = exports.PreviewSizeContext = exports.loadPreviewSizeOption = exports.persistPreviewSizeOption = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const editor_zoom_gestures_1 = require("./editor-zoom-gestures");
6
7
  const key = 'remotion.previewSize';
7
8
  const persistPreviewSizeOption = (option) => {
8
9
  localStorage.setItem(key, JSON.stringify(option));
@@ -34,6 +35,7 @@ const PreviewSizeProvider = ({ children }) => {
34
35
  y: 0,
35
36
  };
36
37
  });
38
+ const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
37
39
  const setSize = (0, react_1.useCallback)((newValue) => {
38
40
  setSizeState((prevState) => {
39
41
  const newVal = newValue(prevState);
@@ -43,12 +45,20 @@ const PreviewSizeProvider = ({ children }) => {
43
45
  }, []);
44
46
  const previewSizeCtx = (0, react_1.useMemo)(() => {
45
47
  return {
46
- size,
48
+ size: editorZoomGestures
49
+ ? size
50
+ : {
51
+ size: size.size,
52
+ translation: {
53
+ x: 0,
54
+ y: 0,
55
+ },
56
+ },
47
57
  setSize,
48
58
  translation,
49
59
  setTranslation,
50
60
  };
51
- }, [setSize, size, translation, setTranslation]);
61
+ }, [editorZoomGestures, size, setSize, translation]);
52
62
  return ((0, jsx_runtime_1.jsx)(exports.PreviewSizeContext.Provider, { value: previewSizeCtx, children: children }));
53
63
  };
54
64
  exports.PreviewSizeProvider = PreviewSizeProvider;
@@ -30,7 +30,7 @@ export declare const getCliOptions: (options: {
30
30
  browserExecutable: BrowserExecutable;
31
31
  ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
32
32
  ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
33
- logLevel: "verbose" | "info" | "warn" | "error";
33
+ logLevel: "error" | "verbose" | "info" | "warn";
34
34
  scale: number;
35
35
  chromiumOptions: ChromiumOptions;
36
36
  overwrite: boolean;
@@ -1 +1,5 @@
1
+ /**
2
+ * @description You can retrieve inputs that you pass in, from the command line using --props, or the inputProps parameter if you're using the Node.js API
3
+ * @see [Documentation](https://www.remotion.dev/docs/get-input-props)
4
+ */
1
5
  export declare const getInputProps: (onUpdate: (newProps: object) => void) => object;
@@ -9,6 +9,10 @@ const os_1 = __importDefault(require("os"));
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const log_1 = require("./log");
11
11
  const parse_command_line_1 = require("./parse-command-line");
12
+ /**
13
+ * @description You can retrieve inputs that you pass in, from the command line using --props, or the inputProps parameter if you're using the Node.js API
14
+ * @see [Documentation](https://www.remotion.dev/docs/get-input-props)
15
+ */
12
16
  const getInputProps = (onUpdate) => {
13
17
  if (!parse_command_line_1.parsedCli.props) {
14
18
  return {};
package/dist/index.d.ts CHANGED
@@ -88,7 +88,7 @@ export declare const CliInternals: {
88
88
  browserExecutable: import("@remotion/renderer").BrowserExecutable;
89
89
  ffmpegExecutable: import("@remotion/renderer").FfmpegExecutable;
90
90
  ffprobeExecutable: import("@remotion/renderer").FfmpegExecutable;
91
- logLevel: "verbose" | "info" | "warn" | "error";
91
+ logLevel: "error" | "verbose" | "info" | "warn";
92
92
  scale: number;
93
93
  chromiumOptions: import("@remotion/renderer").ChromiumOptions;
94
94
  overwrite: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/cli",
3
- "version": "3.3.54",
3
+ "version": "3.3.56",
4
4
  "description": "CLI for Remotion",
5
5
  "main": "dist/index.js",
6
6
  "sideEffects": false,
@@ -22,16 +22,16 @@
22
22
  "author": "Jonny Burger <jonny@remotion.dev>",
23
23
  "license": "SEE LICENSE IN LICENSE.md",
24
24
  "dependencies": {
25
- "@remotion/bundler": "3.3.54",
26
- "@remotion/media-utils": "3.3.54",
27
- "@remotion/player": "3.3.54",
28
- "@remotion/renderer": "3.3.54",
25
+ "@remotion/bundler": "3.3.56",
26
+ "@remotion/media-utils": "3.3.56",
27
+ "@remotion/player": "3.3.56",
28
+ "@remotion/renderer": "3.3.56",
29
29
  "better-opn": "2.1.1",
30
30
  "dotenv": "9.0.2",
31
31
  "memfs": "3.4.3",
32
32
  "minimist": "1.2.6",
33
33
  "prompts": "2.4.1",
34
- "remotion": "3.3.54",
34
+ "remotion": "3.3.56",
35
35
  "semver": "7.3.5",
36
36
  "source-map": "0.6.1"
37
37
  },
@@ -71,5 +71,5 @@
71
71
  "publishConfig": {
72
72
  "access": "public"
73
73
  },
74
- "gitHead": "3a004e0b0e2a805fb276c35dd5922e3389c9f53c"
74
+ "gitHead": "40e96323b08717213c20fffcce8a985f0310f6e5"
75
75
  }
@@ -1 +0,0 @@
1
- export declare const gcpCommand: (remotionRoot: string, args: string[]) => Promise<never>;
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.gcpCommand = void 0;
4
- const log_1 = require("./log");
5
- const get_package_manager_1 = require("./preview-server/get-package-manager");
6
- const update_available_1 = require("./preview-server/update-available");
7
- const gcpCommand = async (remotionRoot, args) => {
8
- try {
9
- const path = require.resolve('@remotion/gcp', {
10
- paths: [remotionRoot],
11
- });
12
- const { GCPInternals } = require(path);
13
- await GCPInternals.executeCommand(args, remotionRoot);
14
- process.exit(0);
15
- }
16
- catch (err) {
17
- const manager = (0, get_package_manager_1.getPackageManager)(remotionRoot, undefined);
18
- const installCommand = manager === 'unknown' ? 'npm i' : manager.installCommand;
19
- log_1.Log.error(err);
20
- log_1.Log.error('Remotion GCP is not installed.');
21
- log_1.Log.info('');
22
- log_1.Log.info('You can install it using:');
23
- log_1.Log.info(`${installCommand} @remotion/gcp@${(0, update_available_1.getRemotionVersion)()}`);
24
- process.exit(1);
25
- }
26
- };
27
- exports.gcpCommand = gcpCommand;