@remotion/cli 4.0.63 → 4.0.66

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 (63) hide show
  1. package/dist/better-opn/index.d.ts +2 -0
  2. package/dist/config/image-format.d.ts +1 -1
  3. package/dist/config/index.d.ts +2 -2
  4. package/dist/editor/components/AudioWaveform.js +2 -2
  5. package/dist/editor/components/Canvas.js +10 -1
  6. package/dist/editor/components/CompositionSelectorItem.js +42 -1
  7. package/dist/editor/components/ContextMenu.d.ts +6 -0
  8. package/dist/editor/components/ContextMenu.js +91 -0
  9. package/dist/editor/components/CurrentComposition.d.ts +1 -0
  10. package/dist/editor/components/EditorContexts.js +3 -1
  11. package/dist/editor/components/EditorGuides/Guide.d.ts +13 -0
  12. package/dist/editor/components/EditorGuides/Guide.js +91 -0
  13. package/dist/editor/components/EditorGuides/index.d.ts +10 -0
  14. package/dist/editor/components/EditorGuides/index.js +32 -0
  15. package/dist/editor/components/EditorRuler/Ruler.d.ts +1 -0
  16. package/dist/editor/components/EditorRuler/Ruler.js +81 -16
  17. package/dist/editor/components/EditorRuler/index.js +117 -48
  18. package/dist/editor/components/EditorRuler/use-is-ruler-visible.d.ts +1 -0
  19. package/dist/editor/components/EditorRuler/use-is-ruler-visible.js +12 -0
  20. package/dist/editor/components/Menu/MenuItem.js +6 -3
  21. package/dist/editor/components/Menu/MenuSubItem.d.ts +2 -1
  22. package/dist/editor/components/Menu/MenuSubItem.js +2 -2
  23. package/dist/editor/components/NewComposition/ComboBox.d.ts +1 -1
  24. package/dist/editor/components/NewComposition/CopyHint.js +1 -0
  25. package/dist/editor/components/NewComposition/InputDragger.js +4 -1
  26. package/dist/editor/components/NewComposition/MenuContent.js +3 -3
  27. package/dist/editor/components/NewComposition/NewCompCode.d.ts +1 -0
  28. package/dist/editor/components/NewComposition/RemInput.d.ts +1 -1
  29. package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +1 -1
  30. package/dist/editor/components/OpenEditorButton.js +1 -0
  31. package/dist/editor/components/RenderModal/DataEditor.js +1 -0
  32. package/dist/editor/components/RenderModal/RenderStatusModal.js +0 -2
  33. package/dist/editor/components/RenderModal/human-readable-codec.d.ts +1 -1
  34. package/dist/editor/components/RenderQueue/RenderQueueRemoveItem.js +0 -1
  35. package/dist/editor/components/ShowGuidesProvider.js +20 -1
  36. package/dist/editor/components/Splitter/SplitterHandle.js +3 -0
  37. package/dist/editor/components/Timeline/TimelineDragHandler.js +85 -5
  38. package/dist/editor/components/Timeline/TimelineInOutPointerHandle.js +2 -1
  39. package/dist/editor/components/Timeline/TimelineVideoInfo.js +1 -0
  40. package/dist/editor/components/TopPanel.js +10 -5
  41. package/dist/editor/components/UpdateCheck.d.ts +1 -0
  42. package/dist/editor/components/UpdateCheck.js +2 -0
  43. package/dist/editor/helpers/colors.d.ts +6 -1
  44. package/dist/editor/helpers/colors.js +7 -2
  45. package/dist/editor/helpers/convert-env-variables.d.ts +2 -8
  46. package/dist/editor/helpers/create-folder-tree.js +1 -0
  47. package/dist/editor/helpers/editor-ruler.d.ts +20 -1
  48. package/dist/editor/helpers/editor-ruler.js +119 -20
  49. package/dist/editor/helpers/presets-labels.d.ts +1 -1
  50. package/dist/editor/helpers/render-modal-sections.d.ts +1 -0
  51. package/dist/editor/helpers/use-keybinding.js +1 -0
  52. package/dist/editor/helpers/use-menu-structure.js +42 -1
  53. package/dist/editor/helpers/use-studio-canvas-dimensions.d.ts +16 -0
  54. package/dist/editor/helpers/use-studio-canvas-dimensions.js +59 -0
  55. package/dist/editor/icons/Checkmark.d.ts +1 -0
  56. package/dist/editor/state/editor-guides.d.ts +19 -3
  57. package/dist/editor/state/editor-guides.js +19 -2
  58. package/dist/get-cli-options.d.ts +2 -2
  59. package/dist/index.d.ts +7 -7
  60. package/dist/preview-server/dev-middleware/range-parser.d.ts +1 -1
  61. package/dist/preview-server/public-folder.js +1 -1
  62. package/dist/preview-server/routes.d.ts +1 -0
  63. package/package.json +8 -8
@@ -5,69 +5,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.EditorRulers = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const player_1 = require("@remotion/player");
9
8
  const react_1 = require("react");
9
+ const colors_1 = require("../../helpers/colors");
10
10
  const editor_ruler_1 = require("../../helpers/editor-ruler");
11
+ const use_studio_canvas_dimensions_1 = require("../../helpers/use-studio-canvas-dimensions");
12
+ const editor_guides_1 = require("../../state/editor-guides");
11
13
  const editor_rulers_1 = require("../../state/editor-rulers");
12
- const preview_size_1 = require("../../state/preview-size");
13
14
  const Ruler_1 = __importDefault(require("./Ruler"));
14
15
  const originBlockStyles = {
15
16
  position: 'absolute',
16
17
  top: 0,
17
18
  left: 0,
18
- borderBottom: '1px solid #444444',
19
- borderRight: '1px solid #444444',
19
+ borderBottom: '1px solid ' + colors_1.RULER_COLOR,
20
+ borderRight: '1px solid ' + colors_1.RULER_COLOR,
20
21
  width: `${editor_rulers_1.RULER_WIDTH}px`,
21
22
  height: `${editor_rulers_1.RULER_WIDTH}px`,
22
- background: '#000000',
23
+ background: colors_1.BACKGROUND,
23
24
  };
24
25
  const EditorRulers = ({ contentDimensions, canvasSize, assetMetadata, containerRef }) => {
25
- const { size: previewSize } = (0, react_1.useContext)(preview_size_1.PreviewSizeContext);
26
- const { centerX, centerY, scale } = (0, react_1.useMemo)(() => {
27
- if (contentDimensions === 'none' ||
28
- contentDimensions === null ||
29
- (assetMetadata && assetMetadata.type === 'not-found') ||
30
- !canvasSize) {
31
- return {
32
- centerX: previewSize.translation.x,
33
- centerY: previewSize.translation.y,
34
- scale: 1,
35
- };
36
- }
37
- return player_1.PlayerInternals.calculateCanvasTransformation({
38
- canvasSize,
39
- compositionHeight: contentDimensions.height,
40
- compositionWidth: contentDimensions.width,
41
- previewSize: previewSize.size,
42
- });
43
- }, [
26
+ const { scale, canvasDimensions } = (0, use_studio_canvas_dimensions_1.useStudioCanvasDimensions)({
44
27
  canvasSize,
45
28
  contentDimensions,
46
- previewSize.size,
47
- previewSize.translation.y,
48
- previewSize.translation.x,
49
29
  assetMetadata,
50
- ]);
51
- const canvasDimensions = (0, react_1.useMemo)(() => {
52
- return {
53
- left: centerX - previewSize.translation.x,
54
- top: centerY - previewSize.translation.y,
55
- width: contentDimensions === 'none' || !contentDimensions
56
- ? (canvasSize === null || canvasSize === void 0 ? void 0 : canvasSize.width) || 0
57
- : contentDimensions.width * scale,
58
- height: contentDimensions === 'none' || !contentDimensions
59
- ? (canvasSize === null || canvasSize === void 0 ? void 0 : canvasSize.height) || 0
60
- : contentDimensions.height * scale,
61
- };
62
- }, [
63
- scale,
64
- centerX,
65
- previewSize.translation.x,
66
- previewSize.translation.y,
67
- centerY,
68
- canvasSize,
69
- contentDimensions,
70
- ]);
30
+ });
31
+ const { shouldCreateGuideRef, shouldDeleteGuideRef, setGuidesList, selectedGuideId, setSelectedGuideId, } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
71
32
  const rulerMarkingGaps = (0, react_1.useMemo)(() => {
72
33
  const minimumGap = editor_rulers_1.MINIMUM_RULER_MARKING_GAP_PX;
73
34
  const predefinedGap = editor_rulers_1.PREDEFINED_RULER_SCALE_GAPS.find((gap) => gap * scale > minimumGap);
@@ -93,6 +54,114 @@ const EditorRulers = ({ contentDimensions, canvasSize, assetMetadata, containerR
93
54
  rulerMarkingGaps,
94
55
  scale,
95
56
  }), [verticalRulerScaleRange, rulerMarkingGaps, scale]);
57
+ const requestAnimationFrameRef = (0, react_1.useRef)(null);
58
+ const onMouseMove = (0, react_1.useCallback)((e) => {
59
+ if (requestAnimationFrameRef.current) {
60
+ cancelAnimationFrame(requestAnimationFrameRef.current);
61
+ }
62
+ requestAnimationFrameRef.current = requestAnimationFrame(() => {
63
+ var _a;
64
+ const { clientX: mouseX, clientY: mouseY } = e;
65
+ const { left: containerLeft = 0, top: containerTop = 0, right: containerRight = 0, bottom: containerBottom = 0, } = ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) || {};
66
+ if (mouseX < containerLeft ||
67
+ mouseX > containerRight ||
68
+ mouseY < containerTop ||
69
+ mouseY > containerBottom) {
70
+ if (!shouldDeleteGuideRef.current) {
71
+ shouldDeleteGuideRef.current = true;
72
+ }
73
+ if (document.body.style.cursor !== 'no-drop') {
74
+ document.body.style.cursor = 'no-drop';
75
+ }
76
+ setGuidesList((prevState) => {
77
+ const newGuides = prevState.map((guide) => {
78
+ if (guide.id !== selectedGuideId) {
79
+ return guide;
80
+ }
81
+ return {
82
+ ...guide,
83
+ show: false,
84
+ };
85
+ });
86
+ (0, editor_guides_1.persistGuidesList)(newGuides);
87
+ return newGuides;
88
+ });
89
+ }
90
+ else {
91
+ if (shouldDeleteGuideRef.current) {
92
+ shouldDeleteGuideRef.current = false;
93
+ }
94
+ setGuidesList((prevState) => {
95
+ // Intentionally no persist, only persist on mouse up
96
+ return prevState.map((guide) => {
97
+ if (guide.id !== selectedGuideId) {
98
+ return guide;
99
+ }
100
+ const position = guide.orientation === 'vertical'
101
+ ? (mouseX - containerLeft) / scale -
102
+ canvasDimensions.left / scale
103
+ : (mouseY - containerTop) / scale -
104
+ canvasDimensions.top / scale;
105
+ const desiredCursor = guide.orientation === 'vertical' ? 'ew-resize' : 'ns-resize';
106
+ if (document.body.style.cursor !== desiredCursor) {
107
+ document.body.style.cursor = desiredCursor;
108
+ }
109
+ return {
110
+ ...guide,
111
+ position: Math.floor(position / 1.0),
112
+ show: true,
113
+ };
114
+ });
115
+ });
116
+ }
117
+ });
118
+ }, [
119
+ containerRef,
120
+ shouldDeleteGuideRef,
121
+ selectedGuideId,
122
+ scale,
123
+ setGuidesList,
124
+ canvasDimensions.left,
125
+ canvasDimensions.top,
126
+ ]);
127
+ const onMouseUp = (0, react_1.useCallback)(() => {
128
+ setGuidesList((prevState) => {
129
+ const newGuides = prevState.filter((selected) => {
130
+ if (!shouldDeleteGuideRef.current) {
131
+ return true;
132
+ }
133
+ return selected.id !== selectedGuideId;
134
+ });
135
+ (0, editor_guides_1.persistGuidesList)(newGuides);
136
+ return newGuides;
137
+ });
138
+ shouldDeleteGuideRef.current = false;
139
+ document.body.style.cursor = 'auto';
140
+ shouldCreateGuideRef.current = false;
141
+ setSelectedGuideId(() => null);
142
+ document.removeEventListener('pointerup', onMouseUp);
143
+ document.removeEventListener('pointermove', onMouseMove);
144
+ }, [
145
+ selectedGuideId,
146
+ shouldCreateGuideRef,
147
+ shouldDeleteGuideRef,
148
+ setSelectedGuideId,
149
+ setGuidesList,
150
+ onMouseMove,
151
+ ]);
152
+ (0, react_1.useEffect)(() => {
153
+ if (selectedGuideId !== null) {
154
+ document.addEventListener('pointermove', onMouseMove);
155
+ document.addEventListener('pointerup', onMouseUp);
156
+ }
157
+ return () => {
158
+ document.removeEventListener('pointermove', onMouseMove);
159
+ document.removeEventListener('pointerup', onMouseUp);
160
+ if (requestAnimationFrameRef.current) {
161
+ cancelAnimationFrame(requestAnimationFrameRef.current);
162
+ }
163
+ };
164
+ }, [selectedGuideId, onMouseMove, onMouseUp]);
96
165
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { style: originBlockStyles }), (0, jsx_runtime_1.jsx)(Ruler_1.default, { orientation: "horizontal", scale: scale, points: horizontalRulerPoints, startMarking: horizontalRulerStartMarking, containerRef: containerRef, markingGaps: rulerMarkingGaps, originOffset: canvasDimensions.left }), (0, jsx_runtime_1.jsx)(Ruler_1.default, { orientation: "vertical", scale: scale, points: verticalRulerPoints, startMarking: verticalRulerStartMarking, containerRef: containerRef, markingGaps: rulerMarkingGaps, originOffset: canvasDimensions.top })] }));
97
166
  };
98
167
  exports.EditorRulers = EditorRulers;
@@ -0,0 +1 @@
1
+ export declare const useIsRulerVisible: () => boolean | null;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useIsRulerVisible = void 0;
4
+ const react_1 = require("react");
5
+ const remotion_1 = require("remotion");
6
+ const editor_rulers_1 = require("../../state/editor-rulers");
7
+ const useIsRulerVisible = () => {
8
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
9
+ const { editorShowRulers } = (0, react_1.useContext)(editor_rulers_1.EditorShowRulersContext);
10
+ return (editorShowRulers && canvasContent && canvasContent.type === 'composition');
11
+ };
12
+ exports.useIsRulerVisible = useIsRulerVisible;
@@ -59,10 +59,13 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
59
59
  const onPointerLeave = (0, react_1.useCallback)(() => {
60
60
  setHovered(false);
61
61
  }, []);
62
- const onPointerDown = (0, react_1.useCallback)(() => {
62
+ const onPointerDown = (0, react_1.useCallback)((e) => {
63
+ if (e.button !== 0) {
64
+ return;
65
+ }
63
66
  onItemSelected(id);
64
- window.addEventListener('pointerup', (e) => {
65
- if (!(0, is_menu_item_1.isMenuItem)(e.target)) {
67
+ window.addEventListener('pointerup', (evt) => {
68
+ if (!(0, is_menu_item_1.isMenuItem)(evt.target)) {
66
69
  onItemQuit();
67
70
  }
68
71
  }, {
@@ -1,10 +1,11 @@
1
+ import type { PointerEvent } from 'react';
1
2
  import React from 'react';
2
3
  import type { SubMenu } from '../NewComposition/ComboBox';
3
4
  export type SubMenuActivated = false | 'with-mouse' | 'without-mouse';
4
5
  export declare const MenuSubItem: React.FC<{
5
6
  label: React.ReactNode;
6
7
  id: string;
7
- onActionChosen: (id: string) => void;
8
+ onActionChosen: (id: string, e: PointerEvent<HTMLDivElement>) => void;
8
9
  selected: boolean;
9
10
  onItemSelected: (id: string) => void;
10
11
  keyHint: string | null;
@@ -57,8 +57,8 @@ const MenuSubItem = ({ label, leaveLeftSpace, leftItem, onActionChosen, id, sele
57
57
  backgroundColor: selected ? colors_1.CLEAR_HOVER : 'transparent',
58
58
  };
59
59
  }, [selected]);
60
- const onItemTriggered = (0, react_1.useCallback)(() => {
61
- onActionChosen(id);
60
+ const onItemTriggered = (0, react_1.useCallback)((e) => {
61
+ onActionChosen(id, e);
62
62
  }, [id, onActionChosen]);
63
63
  const onPointerEnter = (0, react_1.useCallback)(() => {
64
64
  onItemSelected(id);
@@ -13,7 +13,7 @@ export type SelectionItem = {
13
13
  id: string;
14
14
  label: React.ReactNode;
15
15
  value: string | number;
16
- onClick: (id: string) => void;
16
+ onClick: (id: string, e: React.PointerEvent | null) => void;
17
17
  keyHint: string | null;
18
18
  leftItem: React.ReactNode;
19
19
  subMenu: SubMenu | null;
@@ -17,6 +17,7 @@ const CopyHint = () => {
17
17
  setProjectInfo(res);
18
18
  })
19
19
  .catch((err) => {
20
+ // eslint-disable-next-line no-console
20
21
  console.log('Error fetching info about the project', err);
21
22
  setProjectInfo(null);
22
23
  });
@@ -71,7 +71,10 @@ const InputDragger = ({ onValueChange, min: _min, max: _max, step: _step, value,
71
71
  return Math.ceil(val * factor) / factor;
72
72
  };
73
73
  const onPointerDown = (0, react_1.useCallback)((e) => {
74
- const { pageX, pageY } = e;
74
+ const { pageX, pageY, button } = e;
75
+ if (button !== 0) {
76
+ return;
77
+ }
75
78
  const moveListener = (ev) => {
76
79
  const xDistance = ev.pageX - pageX;
77
80
  const distanceFromStart = Math.sqrt(xDistance ** 2 + (ev.pageY - pageY) ** 2);
@@ -88,7 +88,7 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
88
88
  return setSubMenuActivated('without-mouse');
89
89
  }
90
90
  onHide();
91
- item.onClick(item.id);
91
+ item.onClick(item.id, null);
92
92
  }, [onHide, selectedItem, values]);
93
93
  const onArrowRight = (0, react_1.useCallback)(() => {
94
94
  if (selectedItem === null) {
@@ -228,9 +228,9 @@ const MenuContent = ({ onHide, values, preselectIndex, onNextMenu, onPreviousMen
228
228
  if (item.type === 'divider') {
229
229
  return (0, jsx_runtime_1.jsx)(MenuDivider_1.MenuDivider, {}, item.id);
230
230
  }
231
- const onClick = () => {
231
+ const onClick = (id, e) => {
232
232
  onHide();
233
- item.onClick(item.id);
233
+ item.onClick(id, e);
234
234
  };
235
235
  return ((0, jsx_runtime_1.jsx)(MenuSubItem_1.MenuSubItem, { selected: item.id === selectedItem, onActionChosen: onClick, onItemSelected: onItemSelected, label: item.label, id: item.id, keyHint: item.keyHint, leaveLeftSpace: leaveLeftSpace, leftItem: item.leftItem, subMenu: item.subMenu, onQuitMenu: onHide, onNextMenu: onNextMenu, subMenuActivated: subMenuActivated, setSubMenuActivated: setSubMenuActivated }, item.id));
236
236
  }) }));
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  export declare const getNewCompositionCode: ({ type, height, width, fps, durationInFrames, name, raw, }: {
2
3
  type: 'still' | 'composition';
3
4
  height: number;
@@ -13,5 +13,5 @@ export declare const getInputBorderColor: ({ status, isFocused, isHovered, }: {
13
13
  isFocused: boolean;
14
14
  isHovered: boolean;
15
15
  }) => "hsla(0, 0%, 100%, 0.15)" | "rgba(0, 0, 0, 0.6)" | "rgba(255, 255, 255, 0.05)" | "#ff3232" | "#f1c40f";
16
- export declare const RemotionInput: React.ForwardRefExoticComponent<Pick<Props, "key" | "status" | "rightAlign" | keyof React.InputHTMLAttributes<HTMLInputElement>> & React.RefAttributes<HTMLInputElement>>;
16
+ export declare const RemotionInput: React.ForwardRefExoticComponent<Pick<Props, "key" | keyof React.InputHTMLAttributes<HTMLInputElement> | "status" | "rightAlign"> & React.RefAttributes<HTMLInputElement>>;
17
17
  export {};
@@ -4,5 +4,5 @@ type Props = React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>
4
4
  status: RemInputStatus;
5
5
  name: string;
6
6
  };
7
- export declare const RemInputTypeColor: React.ForwardRefExoticComponent<Pick<Props, "key" | "status" | keyof React.InputHTMLAttributes<HTMLInputElement>> & React.RefAttributes<HTMLInputElement>>;
7
+ export declare const RemInputTypeColor: React.ForwardRefExoticComponent<Pick<Props, "key" | keyof React.InputHTMLAttributes<HTMLInputElement> | "status"> & React.RefAttributes<HTMLInputElement>>;
8
8
  export {};
@@ -37,6 +37,7 @@ const OpenEditorButton = () => {
37
37
  }
38
38
  })
39
39
  .catch((err) => {
40
+ // eslint-disable-next-line no-console
40
41
  console.error(err);
41
42
  (0, NotificationCenter_1.sendErrorNotification)(`Could not open ${window.remotion_editorName}`);
42
43
  });
@@ -231,6 +231,7 @@ const DataEditor = ({ unresolvedComposition, inputProps, setInputProps, mayShowS
231
231
  (0, actions_1.updateDefaultProps)(unresolvedComposition.id, updater((_a = unresolvedComposition.defaultProps) !== null && _a !== void 0 ? _a : {}), (0, extract_enum_json_paths_1.extractEnumJsonPaths)(schema, z, []))
232
232
  .then((response) => {
233
233
  if (!response.success) {
234
+ // eslint-disable-next-line no-console
234
235
  console.log(response.stack);
235
236
  (0, NotificationCenter_1.sendErrorNotification)(`Cannot update default props: ${response.reason}. See console for more information.`);
236
237
  }
@@ -55,13 +55,11 @@ const RenderStatusModal = ({ jobId }) => {
55
55
  setSelectedModal(null);
56
56
  (0, actions_1.removeRenderJob)(job).catch((err) => {
57
57
  (0, NotificationCenter_1.sendErrorNotification)(`Could not remove job: ${err.message}`);
58
- console.log(err);
59
58
  });
60
59
  }, [job, setSelectedModal]);
61
60
  const onClickOnCancel = (0, react_1.useCallback)(() => {
62
61
  (0, actions_1.cancelRenderJob)(job).catch((err) => {
63
62
  (0, NotificationCenter_1.sendErrorNotification)(`Could not cancel job: ${err.message}`);
64
- console.log(err);
65
63
  });
66
64
  }, [job]);
67
65
  if (!job || job.status === 'idle') {
@@ -1,2 +1,2 @@
1
1
  import type { Codec } from '@remotion/renderer';
2
- export declare const humanReadableCodec: (codec: Codec) => "GIF" | "AAC" | "MP3" | "H.264" | "H.264 Matroska" | "H.265" | "ProRes" | "WebM VP8" | "WebM VP9" | "Waveform" | undefined;
2
+ export declare const humanReadableCodec: (codec: Codec) => "AAC" | "MP3" | "GIF" | "H.264" | "H.264 Matroska" | "H.265" | "ProRes" | "WebM VP8" | "WebM VP9" | "Waveform" | undefined;
@@ -21,7 +21,6 @@ const RenderQueueRemoveItem = ({ job }) => {
21
21
  })
22
22
  .catch((err) => {
23
23
  (0, NotificationCenter_1.sendErrorNotification)(`Could not remove item: ${err.message}`);
24
- console.log(err);
25
24
  });
26
25
  }, [job]);
27
26
  const icon = (0, react_1.useMemo)(() => {
@@ -5,7 +5,12 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const editor_guides_1 = require("../state/editor-guides");
7
7
  const ShowGuidesProvider = ({ children }) => {
8
+ const [guidesList, setGuidesList] = (0, react_1.useState)(() => (0, editor_guides_1.loadGuidesList)());
9
+ const [selectedGuideId, setSelectedGuideId] = (0, react_1.useState)(null);
10
+ const [hoveredGuideId, setHoveredGuideId] = (0, react_1.useState)(null);
8
11
  const [editorShowGuides, setEditorShowGuidesState] = (0, react_1.useState)(() => (0, editor_guides_1.loadEditorShowGuidesOption)());
12
+ const shouldCreateGuideRef = (0, react_1.useRef)(false);
13
+ const shouldDeleteGuideRef = (0, react_1.useRef)(false);
9
14
  const setEditorShowGuides = (0, react_1.useCallback)((newValue) => {
10
15
  setEditorShowGuidesState((prevState) => {
11
16
  const newVal = newValue(prevState);
@@ -17,8 +22,22 @@ const ShowGuidesProvider = ({ children }) => {
17
22
  return {
18
23
  editorShowGuides,
19
24
  setEditorShowGuides,
25
+ guidesList,
26
+ setGuidesList,
27
+ selectedGuideId,
28
+ setSelectedGuideId,
29
+ shouldCreateGuideRef,
30
+ shouldDeleteGuideRef,
31
+ hoveredGuideId,
32
+ setHoveredGuideId,
20
33
  };
21
- }, [editorShowGuides, setEditorShowGuides]);
34
+ }, [
35
+ editorShowGuides,
36
+ setEditorShowGuides,
37
+ guidesList,
38
+ selectedGuideId,
39
+ hoveredGuideId,
40
+ ]);
22
41
  return ((0, jsx_runtime_1.jsx)(editor_guides_1.EditorShowGuidesContext.Provider, { value: editorShowGuidesCtx, children: children }));
23
42
  };
24
43
  exports.ShowGuidesProvider = ShowGuidesProvider;
@@ -56,6 +56,9 @@ const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
56
56
  };
57
57
  const onPointerDown = (e) => {
58
58
  var _a;
59
+ if (e.button !== 0) {
60
+ return;
61
+ }
59
62
  context.isDragging.current = {
60
63
  x: e.clientX,
61
64
  y: e.clientY,
@@ -9,6 +9,8 @@ const get_left_of_timeline_slider_1 = require("../../helpers/get-left-of-timelin
9
9
  const timeline_layout_1 = require("../../helpers/timeline-layout");
10
10
  const in_out_1 = require("../../state/in-out");
11
11
  const timeline_zoom_1 = require("../../state/timeline-zoom");
12
+ const z_index_1 = require("../../state/z-index");
13
+ const ContextMenu_1 = require("../ContextMenu");
12
14
  const is_menu_item_1 = require("../Menu/is-menu-item");
13
15
  const TimelineInOutToggle_1 = require("../TimelineInOutToggle");
14
16
  const timeline_refs_1 = require("./timeline-refs");
@@ -27,6 +29,10 @@ const container = {
27
29
  height: '100%',
28
30
  top: 0,
29
31
  };
32
+ const style = {
33
+ width: '100%',
34
+ height: '100%',
35
+ };
30
36
  const getClientXWithScroll = (x) => {
31
37
  var _a;
32
38
  return x + ((_a = timeline_refs_1.scrollableRef.current) === null || _a === void 0 ? void 0 : _a.scrollLeft);
@@ -50,6 +56,7 @@ const Inner = () => {
50
56
  triggerOnWindowResize: true,
51
57
  shouldApplyCssTransforms: true,
52
58
  });
59
+ const { isHighestContext } = (0, z_index_1.useZIndex)();
53
60
  const setFrame = remotion_1.Internals.useTimelineSetFrame();
54
61
  const [inOutDragging, setInOutDragging] = (0, react_1.useState)({
55
62
  dragging: false,
@@ -77,6 +84,12 @@ const Inner = () => {
77
84
  }
78
85
  };
79
86
  const onPointerDown = (0, react_1.useCallback)((e) => {
87
+ if (e.button !== 0) {
88
+ return;
89
+ }
90
+ if (!isHighestContext) {
91
+ return;
92
+ }
80
93
  stopInterval();
81
94
  if (!videoConfig) {
82
95
  return;
@@ -107,6 +120,9 @@ const Inner = () => {
107
120
  });
108
121
  return;
109
122
  }
123
+ if (e.button !== 0) {
124
+ return;
125
+ }
110
126
  const frame = (0, timeline_scroll_logic_1.getFrameFromX)({
111
127
  clientX: getClientXWithScroll(e.clientX) - left,
112
128
  durationInFrames: videoConfig.durationInFrames,
@@ -119,7 +135,18 @@ const Inner = () => {
119
135
  wasPlaying: playing,
120
136
  });
121
137
  pause();
122
- }, [videoConfig, left, width, seek, playing, pause, outFrame, get, inFrame]);
138
+ }, [
139
+ isHighestContext,
140
+ videoConfig,
141
+ left,
142
+ width,
143
+ seek,
144
+ playing,
145
+ pause,
146
+ inFrame,
147
+ get,
148
+ outFrame,
149
+ ]);
123
150
  const onPointerMoveScrubbing = (0, react_1.useCallback)((e) => {
124
151
  var _a;
125
152
  if (!videoConfig) {
@@ -358,8 +385,61 @@ const Inner = () => {
358
385
  window.removeEventListener('pointerup', onPointerUpInOut);
359
386
  };
360
387
  }, [inOutDragging.dragging, onPointerMoveInOut, onPointerUpInOut]);
361
- return ((0, jsx_runtime_1.jsxs)("div", { style: {
362
- width: '100%',
363
- height: '100%',
364
- }, onPointerDown: onPointerDown, children: [(0, jsx_runtime_1.jsx)("div", { style: inner, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME }), inFrame !== null && ((0, jsx_runtime_1.jsx)(TimelineInOutPointerHandle_1.TimelineInOutPointerHandle, { type: "in", atFrame: inFrame, dragging: inOutDragging.dragging === 'in' })), outFrame !== null && ((0, jsx_runtime_1.jsx)(TimelineInOutPointerHandle_1.TimelineInOutPointerHandle, { type: "out", dragging: inOutDragging.dragging === 'out', atFrame: outFrame }))] }));
388
+ const inContextMenu = (0, react_1.useMemo)(() => {
389
+ return [
390
+ {
391
+ id: 'hide-in',
392
+ keyHint: null,
393
+ label: 'Clear In marker',
394
+ leftItem: null,
395
+ onClick: (_, e) => {
396
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
397
+ e === null || e === void 0 ? void 0 : e.preventDefault();
398
+ setInAndOutFrames((prev) => {
399
+ var _a;
400
+ return ({
401
+ ...prev,
402
+ [videoConfig.id]: {
403
+ ...((_a = prev[videoConfig.id]) !== null && _a !== void 0 ? _a : TimelineInOutToggle_1.defaultInOutValue),
404
+ inFrame: null,
405
+ },
406
+ });
407
+ });
408
+ },
409
+ quickSwitcherLabel: null,
410
+ subMenu: null,
411
+ type: 'item',
412
+ value: 'hide-in',
413
+ },
414
+ ];
415
+ }, [setInAndOutFrames, videoConfig.id]);
416
+ const outContextMenu = (0, react_1.useMemo)(() => {
417
+ return [
418
+ {
419
+ id: 'hide-out',
420
+ keyHint: null,
421
+ label: 'Clear Out marker',
422
+ leftItem: null,
423
+ onClick: (_, e) => {
424
+ e === null || e === void 0 ? void 0 : e.stopPropagation();
425
+ e === null || e === void 0 ? void 0 : e.preventDefault();
426
+ setInAndOutFrames((prev) => {
427
+ var _a;
428
+ return ({
429
+ ...prev,
430
+ [videoConfig.id]: {
431
+ ...((_a = prev[videoConfig.id]) !== null && _a !== void 0 ? _a : TimelineInOutToggle_1.defaultInOutValue),
432
+ outFrame: null,
433
+ },
434
+ });
435
+ });
436
+ },
437
+ quickSwitcherLabel: null,
438
+ subMenu: null,
439
+ type: 'item',
440
+ value: 'hide-out',
441
+ },
442
+ ];
443
+ }, [setInAndOutFrames, videoConfig.id]);
444
+ return ((0, jsx_runtime_1.jsxs)("div", { style: style, onPointerDown: onPointerDown, children: [(0, jsx_runtime_1.jsx)("div", { style: inner, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME }), inFrame !== null && ((0, jsx_runtime_1.jsx)(ContextMenu_1.ContextMenu, { values: inContextMenu, children: (0, jsx_runtime_1.jsx)(TimelineInOutPointerHandle_1.TimelineInOutPointerHandle, { type: "in", atFrame: inFrame, dragging: inOutDragging.dragging === 'in' }) })), outFrame !== null && ((0, jsx_runtime_1.jsx)(ContextMenu_1.ContextMenu, { values: outContextMenu, children: (0, jsx_runtime_1.jsx)(TimelineInOutPointerHandle_1.TimelineInOutPointerHandle, { type: "out", dragging: inOutDragging.dragging === 'out', atFrame: outFrame }) }))] }));
365
445
  };
@@ -4,6 +4,7 @@ exports.TimelineInOutPointerHandle = exports.outPointerHandle = exports.inPointe
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");
7
8
  const get_left_of_timeline_slider_1 = require("../../helpers/get-left-of-timeline-slider");
8
9
  const TimelineWidthProvider_1 = require("./TimelineWidthProvider");
9
10
  const line = {
@@ -23,7 +24,7 @@ const InnerTimelineInOutPointerHandle = ({ atFrame, dragging, timelineWidth, typ
23
24
  return {
24
25
  ...line,
25
26
  backgroundColor: dragging
26
- ? 'rgba(255, 255, 255, 0.7)'
27
+ ? colors_1.LIGHT_TRANSPARENT
27
28
  : 'rgba(255, 255, 255, 0.1)',
28
29
  transform: `translateX(${(0, get_left_of_timeline_slider_1.getXPositionOfItemInTimelineImperatively)(atFrame, videoConfig.durationInFrames, timelineWidth)}px)`,
29
30
  };
@@ -32,6 +32,7 @@ const TimelineVideoInfo = ({ src }) => {
32
32
  setVideoMetadata(data);
33
33
  })
34
34
  .catch((err) => {
35
+ // eslint-disable-next-line no-console
35
36
  console.log('Could not get video metadata', err);
36
37
  });
37
38
  }, [src]);
@@ -4,9 +4,11 @@ exports.TopPanel = exports.useResponsiveSidebarStatus = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const use_breakpoint_1 = require("../helpers/use-breakpoint");
7
+ const editor_rulers_1 = require("../state/editor-rulers");
7
8
  const sidebar_1 = require("../state/sidebar");
8
9
  const CanvasOrLoading_1 = require("./CanvasOrLoading");
9
10
  const CurrentCompositionSideEffects_1 = require("./CurrentCompositionSideEffects");
11
+ const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
10
12
  const ExplorerPanel_1 = require("./ExplorerPanel");
11
13
  const InitialCompositionLoader_1 = require("./InitialCompositionLoader");
12
14
  const MenuToolbar_1 = require("./MenuToolbar");
@@ -28,10 +30,6 @@ const row = {
28
30
  flex: 1,
29
31
  minHeight: 0,
30
32
  };
31
- const canvasContainer = {
32
- flex: 1,
33
- display: 'flex',
34
- };
35
33
  const useResponsiveSidebarStatus = () => {
36
34
  const { sidebarCollapsedStateLeft } = (0, react_1.useContext)(sidebar_1.SidebarContext);
37
35
  const responsiveLeftStatus = (0, use_breakpoint_1.useBreakpoint)(1200) ? 'collapsed' : 'expanded';
@@ -49,6 +47,7 @@ const useResponsiveSidebarStatus = () => {
49
47
  exports.useResponsiveSidebarStatus = useResponsiveSidebarStatus;
50
48
  const TopPanel = () => {
51
49
  const { setSidebarCollapsedState, sidebarCollapsedStateRight } = (0, react_1.useContext)(sidebar_1.SidebarContext);
50
+ const rulersAreVisible = (0, use_is_ruler_visible_1.useIsRulerVisible)();
52
51
  const actualStateLeft = (0, exports.useResponsiveSidebarStatus)();
53
52
  const actualStateRight = (0, react_1.useMemo)(() => {
54
53
  if (sidebarCollapsedStateRight === 'collapsed') {
@@ -56,12 +55,18 @@ const TopPanel = () => {
56
55
  }
57
56
  return 'expanded';
58
57
  }, [sidebarCollapsedStateRight]);
58
+ const canvasContainerStyle = (0, react_1.useMemo)(() => ({
59
+ flex: 1,
60
+ display: 'flex',
61
+ paddingTop: rulersAreVisible ? editor_rulers_1.RULER_WIDTH : 0,
62
+ paddingLeft: rulersAreVisible ? editor_rulers_1.RULER_WIDTH : 0,
63
+ }), [rulersAreVisible]);
59
64
  const onCollapseLeft = (0, react_1.useCallback)(() => {
60
65
  setSidebarCollapsedState({ left: 'collapsed', right: null });
61
66
  }, [setSidebarCollapsedState]);
62
67
  const onCollapseRight = (0, react_1.useCallback)(() => {
63
68
  setSidebarCollapsedState({ left: null, right: 'collapsed' });
64
69
  }, [setSidebarCollapsedState]);
65
- return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(InitialCompositionLoader_1.InitialCompositionLoader, {}), (0, jsx_runtime_1.jsx)(MenuToolbar_1.MenuToolbar, {}), (0, jsx_runtime_1.jsx)("div", { style: row, children: (0, jsx_runtime_1.jsxs)(SplitterContainer_1.SplitterContainer, { minFlex: 0.15, maxFlex: 0.4, defaultFlex: 0.2, id: "sidebar-to-preview", orientation: "vertical", children: [actualStateLeft === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "flexer", children: (0, jsx_runtime_1.jsx)(ExplorerPanel_1.ExplorerPanel, {}) })) : null, actualStateLeft === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterHandle_1.SplitterHandle, { allowToCollapse: "left", onCollapse: onCollapseLeft })) : null, (0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "anti-flexer", children: (0, jsx_runtime_1.jsxs)(SplitterContainer_1.SplitterContainer, { minFlex: 0.5, maxFlex: 0.8, defaultFlex: 0.7, id: "canvas-to-right-sidebar", orientation: "vertical", children: [(0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "flexer", children: (0, jsx_runtime_1.jsx)("div", { style: canvasContainer, children: (0, jsx_runtime_1.jsx)(CanvasOrLoading_1.CanvasOrLoading, {}) }) }), actualStateRight === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterHandle_1.SplitterHandle, { allowToCollapse: "right", onCollapse: onCollapseRight })) : null, actualStateRight === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "anti-flexer", children: (0, jsx_runtime_1.jsx)(OptionsPanel_1.OptionsPanel, {}) })) : null] }) })] }) }), (0, jsx_runtime_1.jsx)(PreviewToolbar_1.PreviewToolbar, {}), (0, jsx_runtime_1.jsx)(CurrentCompositionSideEffects_1.CurrentCompositionKeybindings, {}), (0, jsx_runtime_1.jsx)(CurrentCompositionSideEffects_1.TitleUpdater, {})] }));
70
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(InitialCompositionLoader_1.InitialCompositionLoader, {}), (0, jsx_runtime_1.jsx)(MenuToolbar_1.MenuToolbar, {}), (0, jsx_runtime_1.jsx)("div", { style: row, children: (0, jsx_runtime_1.jsxs)(SplitterContainer_1.SplitterContainer, { minFlex: 0.15, maxFlex: 0.4, defaultFlex: 0.2, id: "sidebar-to-preview", orientation: "vertical", children: [actualStateLeft === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "flexer", children: (0, jsx_runtime_1.jsx)(ExplorerPanel_1.ExplorerPanel, {}) })) : null, actualStateLeft === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterHandle_1.SplitterHandle, { allowToCollapse: "left", onCollapse: onCollapseLeft })) : null, (0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "anti-flexer", children: (0, jsx_runtime_1.jsxs)(SplitterContainer_1.SplitterContainer, { minFlex: 0.5, maxFlex: 0.8, defaultFlex: 0.7, id: "canvas-to-right-sidebar", orientation: "vertical", children: [(0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "flexer", children: (0, jsx_runtime_1.jsx)("div", { style: canvasContainerStyle, children: (0, jsx_runtime_1.jsx)(CanvasOrLoading_1.CanvasOrLoading, {}) }) }), actualStateRight === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterHandle_1.SplitterHandle, { allowToCollapse: "right", onCollapse: onCollapseRight })) : null, actualStateRight === 'expanded' ? ((0, jsx_runtime_1.jsx)(SplitterElement_1.SplitterElement, { type: "anti-flexer", children: (0, jsx_runtime_1.jsx)(OptionsPanel_1.OptionsPanel, {}) })) : null] }) })] }) }), (0, jsx_runtime_1.jsx)(PreviewToolbar_1.PreviewToolbar, {}), (0, jsx_runtime_1.jsx)(CurrentCompositionSideEffects_1.CurrentCompositionKeybindings, {}), (0, jsx_runtime_1.jsx)(CurrentCompositionSideEffects_1.TitleUpdater, {})] }));
66
71
  };
67
72
  exports.TopPanel = TopPanel;