@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
@@ -1,3 +1,5 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="bun-types" />
1
3
  export declare const openBrowser: ({ url, browserFlag, browserArgs, }: {
2
4
  url: string;
3
5
  browserFlag: string | undefined;
@@ -2,4 +2,4 @@ import type { StillImageFormat, VideoImageFormat } from '@remotion/renderer';
2
2
  export declare const setStillImageFormat: (format: StillImageFormat) => void;
3
3
  export declare const setVideoImageFormat: (format: VideoImageFormat) => void;
4
4
  export declare const getUserPreferredStillImageFormat: () => "png" | "jpeg" | "pdf" | "webp" | undefined;
5
- export declare const getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
5
+ export declare const getUserPreferredVideoImageFormat: () => "none" | "png" | "jpeg" | undefined;
@@ -307,7 +307,7 @@ export declare const ConfigInternals: {
307
307
  getBrowser: () => null;
308
308
  getPixelFormat: () => "yuv420p" | "yuva420p" | "yuv422p" | "yuv444p" | "yuv420p10le" | "yuv422p10le" | "yuv444p10le" | "yuva444p10le";
309
309
  getProResProfile: () => "4444-xq" | "4444" | "hq" | "standard" | "light" | "proxy" | undefined;
310
- getPresetProfile: () => "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "medium" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
310
+ getPresetProfile: () => "medium" | "ultrafast" | "superfast" | "veryfast" | "faster" | "fast" | "slow" | "slower" | "veryslow" | "placebo" | undefined;
311
311
  getShouldOverwrite: ({ defaultValue, }: {
312
312
  defaultValue: boolean;
313
313
  }) => boolean;
@@ -329,7 +329,7 @@ export declare const ConfigInternals: {
329
329
  getShouldOutputImageSequence: (frameRange: FrameRange | null) => boolean;
330
330
  getDotEnvLocation: () => string | null;
331
331
  getUserPreferredStillImageFormat: () => "png" | "jpeg" | "pdf" | "webp" | undefined;
332
- getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
332
+ getUserPreferredVideoImageFormat: () => "none" | "png" | "jpeg" | undefined;
333
333
  getWebpackOverrideFn: () => WebpackOverrideFn;
334
334
  getWebpackCaching: () => boolean;
335
335
  getOutputLocation: () => string | null;
@@ -5,6 +5,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const media_utils_1 = require("@remotion/media-utils");
6
6
  const react_1 = require("react");
7
7
  const remotion_1 = require("remotion");
8
+ const colors_1 = require("../helpers/colors");
8
9
  const timeline_layout_1 = require("../helpers/timeline-layout");
9
10
  const AudioWaveformBar_1 = require("./AudioWaveformBar");
10
11
  const container = {
@@ -71,7 +72,7 @@ const AudioWaveform = ({ src, startFrom, durationInFrames, visualizationWidth, s
71
72
  context.lineTo(x, y);
72
73
  }
73
74
  });
74
- context.strokeStyle = 'rgba(255, 255, 255, 0.7)';
75
+ context.strokeStyle = colors_1.LIGHT_TRANSPARENT;
75
76
  context.stroke();
76
77
  }, [visualizationWidth, metadata, startFrom, volume, doesVolumeChange]);
77
78
  (0, react_1.useEffect)(() => {
@@ -84,7 +85,6 @@ const AudioWaveform = ({ src, startFrom, durationInFrames, visualizationWidth, s
84
85
  }
85
86
  })
86
87
  .catch((err) => {
87
- console.log(err);
88
88
  if (mountState.current.isMounted) {
89
89
  setError(err);
90
90
  }
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.Canvas = void 0;
4
7
  const jsx_runtime_1 = require("react/jsx-runtime");
@@ -11,8 +14,12 @@ const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
11
14
  const get_effective_translation_1 = require("../helpers/get-effective-translation");
12
15
  const use_keybinding_1 = require("../helpers/use-keybinding");
13
16
  const canvas_ref_1 = require("../state/canvas-ref");
17
+ const editor_guides_1 = require("../state/editor-guides");
14
18
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
15
19
  const preview_size_1 = require("../state/preview-size");
20
+ const EditorGuides_1 = __importDefault(require("./EditorGuides"));
21
+ const EditorRuler_1 = require("./EditorRuler");
22
+ const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
16
23
  const layout_1 = require("./layout");
17
24
  const Preview_1 = require("./Preview");
18
25
  const ResetZoomButton_1 = require("./ResetZoomButton");
@@ -34,6 +41,8 @@ const Canvas = ({ canvasContent }) => {
34
41
  const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
35
42
  const keybindings = (0, use_keybinding_1.useKeybinding)();
36
43
  const config = remotion_1.Internals.useUnsafeVideoConfig();
44
+ const areRulersVisible = (0, use_is_ruler_visible_1.useIsRulerVisible)();
45
+ const { editorShowGuides } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
37
46
  const [assetResolution, setAssetResolution] = (0, react_1.useState)(null);
38
47
  const contentDimensions = (0, react_1.useMemo)(() => {
39
48
  if ((canvasContent.type === 'asset' || canvasContent.type === 'output') &&
@@ -243,6 +252,6 @@ const Canvas = ({ canvasContent }) => {
243
252
  (0, react_1.useEffect)(() => {
244
253
  fetchMetadata();
245
254
  }, [fetchMetadata]);
246
- return ((0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? ((0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution })) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) }))] }));
255
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? ((0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution })) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && ((0, jsx_runtime_1.jsx)(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && ((0, jsx_runtime_1.jsx)(EditorRuler_1.EditorRulers, { contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
247
256
  };
248
257
  exports.Canvas = Canvas;
@@ -8,7 +8,9 @@ const is_composition_still_1 = require("../helpers/is-composition-still");
8
8
  const folder_1 = require("../icons/folder");
9
9
  const still_1 = require("../icons/still");
10
10
  const video_1 = require("../icons/video");
11
+ const ContextMenu_1 = require("./ContextMenu");
11
12
  const layout_1 = require("./layout");
13
+ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
12
14
  const SidebarRenderButton_1 = require("./SidebarRenderButton");
13
15
  const COMPOSITION_ITEM_HEIGHT = 32;
14
16
  const itemStyle = {
@@ -78,6 +80,45 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
78
80
  toggleFolder(item.folderName, item.parentName);
79
81
  }
80
82
  }, [item, selectComposition, toggleFolder]);
83
+ const contextMenu = (0, react_1.useMemo)(() => {
84
+ if (item.type === 'composition') {
85
+ return [
86
+ {
87
+ id: '1',
88
+ keyHint: null,
89
+ label: `Copy ID`,
90
+ leftItem: null,
91
+ onClick: () => {
92
+ navigator.clipboard
93
+ .writeText(item.composition.id)
94
+ .catch((err) => {
95
+ var _a;
96
+ (_a = NotificationCenter_1.notificationCenter.current) === null || _a === void 0 ? void 0 : _a.addNotification({
97
+ content: `Could not copy to clipboard: ${err.message}`,
98
+ created: Date.now(),
99
+ duration: 1000,
100
+ id: String(Math.random()),
101
+ });
102
+ })
103
+ .then(() => {
104
+ var _a;
105
+ (_a = NotificationCenter_1.notificationCenter.current) === null || _a === void 0 ? void 0 : _a.addNotification({
106
+ content: 'Copied to clipboard',
107
+ created: Date.now(),
108
+ duration: 1000,
109
+ id: String(Math.random()),
110
+ });
111
+ });
112
+ },
113
+ quickSwitcherLabel: null,
114
+ subMenu: null,
115
+ type: 'item',
116
+ value: 'remove',
117
+ },
118
+ ];
119
+ }
120
+ return [];
121
+ }, [item]);
81
122
  if (item.type === 'folder') {
82
123
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("button", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, type: "button", title: item.folderName, children: [item.expanded ? ((0, jsx_runtime_1.jsx)(folder_1.ExpandedFolderIcon, { style: iconStyle, color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT })) : ((0, jsx_runtime_1.jsx)(folder_1.CollapsedFolderIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.folderName })] }), item.expanded
83
124
  ? item.items.map((childItem) => {
@@ -85,6 +126,6 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
85
126
  })
86
127
  : null] }));
87
128
  }
88
- return ((0, jsx_runtime_1.jsx)(layout_1.Row, { align: "center", children: (0, jsx_runtime_1.jsxs)("button", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, type: "button", title: item.composition.id, className: "__remotion-composition", "data-compname": item.composition.id, children: [(0, is_composition_still_1.isCompositionStill)(item.composition) ? ((0, jsx_runtime_1.jsx)(still_1.StillIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })) : ((0, jsx_runtime_1.jsx)(video_1.FilmIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.composition.id }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SidebarRenderButton_1.SidebarRenderButton, { visible: hovered, composition: item.composition }) })] }) }));
129
+ return ((0, jsx_runtime_1.jsx)(ContextMenu_1.ContextMenu, { values: contextMenu, children: (0, jsx_runtime_1.jsx)(layout_1.Row, { align: "center", children: (0, jsx_runtime_1.jsxs)("button", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, type: "button", title: item.composition.id, className: "__remotion-composition", "data-compname": item.composition.id, children: [(0, is_composition_still_1.isCompositionStill)(item.composition) ? ((0, jsx_runtime_1.jsx)(still_1.StillIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })) : ((0, jsx_runtime_1.jsx)(video_1.FilmIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), (0, jsx_runtime_1.jsx)("div", { style: label, children: item.composition.id }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.5 }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(SidebarRenderButton_1.SidebarRenderButton, { visible: hovered, composition: item.composition }) })] }) }) }));
89
130
  };
90
131
  exports.CompositionSelectorItem = CompositionSelectorItem;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import type { ComboboxValue } from './NewComposition/ComboBox';
3
+ export declare const ContextMenu: React.FC<{
4
+ children: React.ReactNode;
5
+ values: ComboboxValue[];
6
+ }>;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ContextMenu = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const player_1 = require("@remotion/player");
9
+ const react_1 = require("react");
10
+ const react_dom_1 = __importDefault(require("react-dom"));
11
+ const noop_1 = require("../helpers/noop");
12
+ const z_index_1 = require("../state/z-index");
13
+ const portals_1 = require("./Menu/portals");
14
+ const styles_1 = require("./Menu/styles");
15
+ const MenuContent_1 = require("./NewComposition/MenuContent");
16
+ const ContextMenu = ({ children, values }) => {
17
+ const ref = (0, react_1.useRef)(null);
18
+ const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
19
+ const { currentZIndex } = (0, z_index_1.useZIndex)();
20
+ const style = (0, react_1.useMemo)(() => {
21
+ return {};
22
+ }, []);
23
+ const size = player_1.PlayerInternals.useElementSize(ref, {
24
+ triggerOnWindowResize: true,
25
+ shouldApplyCssTransforms: true,
26
+ });
27
+ (0, react_1.useEffect)(() => {
28
+ const { current } = ref;
29
+ if (!current) {
30
+ return;
31
+ }
32
+ const onClick = (e) => {
33
+ e.preventDefault();
34
+ e.stopPropagation();
35
+ setOpened({ type: 'open', left: e.clientX, top: e.clientY });
36
+ return false;
37
+ };
38
+ current.addEventListener('contextmenu', onClick);
39
+ return () => {
40
+ current.removeEventListener('contextmenu', onClick);
41
+ };
42
+ }, [size]);
43
+ const spaceToBottom = (0, react_1.useMemo)(() => {
44
+ if (size && opened.type === 'open') {
45
+ return size.windowSize.height - opened.top;
46
+ }
47
+ return 0;
48
+ }, [opened, size]);
49
+ const spaceToTop = (0, react_1.useMemo)(() => {
50
+ if (size && opened.type === 'open') {
51
+ return opened.top;
52
+ }
53
+ return 0;
54
+ }, [opened, size]);
55
+ const portalStyle = (0, react_1.useMemo)(() => {
56
+ if (opened.type === 'not-open') {
57
+ return;
58
+ }
59
+ if (!size) {
60
+ return;
61
+ }
62
+ const spaceToRight = size.windowSize.width - (opened.left + size.width);
63
+ const minSpaceToRightRequired = styles_1.MAX_MENU_WIDTH;
64
+ const verticalLayout = spaceToTop > spaceToBottom ? 'bottom' : 'top';
65
+ const horizontalLayout = spaceToRight >= minSpaceToRightRequired ? 'left' : 'right';
66
+ return {
67
+ ...styles_1.menuContainerTowardsTop,
68
+ ...(verticalLayout === 'top'
69
+ ? {
70
+ top: opened.top,
71
+ }
72
+ : {
73
+ bottom: size.windowSize.height - opened.top,
74
+ }),
75
+ ...(horizontalLayout === 'left'
76
+ ? {
77
+ left: opened.left,
78
+ }
79
+ : {
80
+ right: size.windowSize.width - opened.left,
81
+ }),
82
+ };
83
+ }, [opened, spaceToBottom, spaceToTop, size]);
84
+ const onHide = (0, react_1.useCallback)(() => {
85
+ setOpened({ type: 'not-open' });
86
+ }, []);
87
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { ref: ref, onContextMenu: () => false, style: style, children: children }), portalStyle
88
+ ? react_dom_1.default.createPortal((0, jsx_runtime_1.jsx)("div", { style: styles_1.fullScreenOverlay, children: (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: false, topItemCanBeUnselected: false, fixedHeight: null }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
89
+ : null] }));
90
+ };
91
+ exports.ContextMenu = ContextMenu;
@@ -1,2 +1,3 @@
1
+ /// <reference types="react" />
1
2
  export declare const CURRENT_COMPOSITION_HEIGHT = 80;
2
3
  export declare const CurrentComposition: () => JSX.Element;
@@ -15,8 +15,10 @@ const ModalsProvider_1 = require("./ModalsProvider");
15
15
  const PlayerEmitterContext_1 = require("./PlayerEmitterContext");
16
16
  const context_1 = require("./RenderQueue/context");
17
17
  const SetTimelineInOutProvider_1 = require("./SetTimelineInOutProvider");
18
+ const ShowGuidesProvider_1 = require("./ShowGuidesProvider");
19
+ const ShowRulersProvider_1 = require("./ShowRulersProvider");
18
20
  const ZoomGesturesProvider_1 = require("./ZoomGesturesProvider");
19
21
  const EditorContexts = ({ children }) => {
20
- return ((0, jsx_runtime_1.jsx)(get_zod_if_possible_1.ZodProvider, { children: (0, jsx_runtime_1.jsx)(client_id_1.PreviewServerConnection, { children: (0, jsx_runtime_1.jsx)(context_1.RenderQueueContextProvider, { children: (0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(CheckerboardProvider_1.CheckerboardProvider, { children: (0, jsx_runtime_1.jsx)(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(ModalsProvider_1.ModalsProvider, { children: (0, jsx_runtime_1.jsx)(MediaVolumeProvider_1.MediaVolumeProvider, { children: (0, jsx_runtime_1.jsx)(PlayerEmitterContext_1.PlayerEmitterContext, { 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)(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }));
22
+ return ((0, jsx_runtime_1.jsx)(get_zod_if_possible_1.ZodProvider, { children: (0, jsx_runtime_1.jsx)(client_id_1.PreviewServerConnection, { children: (0, jsx_runtime_1.jsx)(context_1.RenderQueueContextProvider, { children: (0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(CheckerboardProvider_1.CheckerboardProvider, { children: (0, jsx_runtime_1.jsx)(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: (0, jsx_runtime_1.jsx)(ShowRulersProvider_1.ShowRulersProvider, { children: (0, jsx_runtime_1.jsx)(ShowGuidesProvider_1.ShowGuidesProvider, { children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(ModalsProvider_1.ModalsProvider, { children: (0, jsx_runtime_1.jsx)(MediaVolumeProvider_1.MediaVolumeProvider, { children: (0, jsx_runtime_1.jsx)(PlayerEmitterContext_1.PlayerEmitterContext, { 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)(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
21
23
  };
22
24
  exports.EditorContexts = EditorContexts;
@@ -0,0 +1,13 @@
1
+ /// <reference types="react" />
2
+ import type { Guide } from '../../state/editor-guides';
3
+ declare const _default: import("react").NamedExoticComponent<{
4
+ guide: Guide;
5
+ canvasDimensions: {
6
+ left: number;
7
+ top: number;
8
+ width: number;
9
+ height: number;
10
+ };
11
+ scale: number;
12
+ }>;
13
+ export default _default;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const jsx_runtime_1 = require("react/jsx-runtime");
4
+ const react_1 = require("react");
5
+ const truthy_1 = require("../../../truthy");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const editor_guides_1 = require("../../state/editor-guides");
8
+ const editor_rulers_1 = require("../../state/editor-rulers");
9
+ const ContextMenu_1 = require("../ContextMenu");
10
+ const PADDING_FOR_EASY_DRAG = 4;
11
+ const GuideComp = ({ guide, canvasDimensions, scale }) => {
12
+ const { shouldCreateGuideRef, setGuidesList, setSelectedGuideId, selectedGuideId, setHoveredGuideId, hoveredGuideId, } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
13
+ const onPointerEnter = (0, react_1.useCallback)(() => {
14
+ setHoveredGuideId(() => guide.id);
15
+ }, [guide.id, setHoveredGuideId]);
16
+ const onPointerLeave = (0, react_1.useCallback)(() => {
17
+ setHoveredGuideId(() => null);
18
+ }, [setHoveredGuideId]);
19
+ const isVerticalGuide = guide.orientation === 'vertical';
20
+ const guideStyle = (0, react_1.useMemo)(() => {
21
+ const canvasPosition = isVerticalGuide
22
+ ? canvasDimensions.left
23
+ : canvasDimensions.top;
24
+ const guidePosition = guide.position * scale + canvasPosition;
25
+ return {
26
+ position: 'absolute',
27
+ width: `${isVerticalGuide ? '1px' : '100%'}`,
28
+ height: `${isVerticalGuide ? '100%' : '1px'}`,
29
+ left: `${isVerticalGuide ? guidePosition - PADDING_FOR_EASY_DRAG : 0}px`,
30
+ top: `${isVerticalGuide ? 0 : guidePosition - PADDING_FOR_EASY_DRAG}px`,
31
+ cursor: `${isVerticalGuide ? 'ew-resize' : 'ns-resize'}`,
32
+ padding: isVerticalGuide
33
+ ? `0 ${PADDING_FOR_EASY_DRAG}px`
34
+ : `${PADDING_FOR_EASY_DRAG}px 0`,
35
+ };
36
+ }, [guide, scale, canvasDimensions, isVerticalGuide]);
37
+ const guideContentStyle = (0, react_1.useMemo)(() => {
38
+ return {
39
+ position: 'relative',
40
+ minWidth: `${isVerticalGuide ? '1px' : `calc(100% + ${editor_rulers_1.RULER_WIDTH}px`}`,
41
+ minHeight: `${isVerticalGuide ? `calc(100% + ${editor_rulers_1.RULER_WIDTH}px` : '1px'}`,
42
+ top: `${isVerticalGuide ? `-${editor_rulers_1.RULER_WIDTH}px` : '0px'}`,
43
+ left: `${isVerticalGuide ? '0px' : `-${editor_rulers_1.RULER_WIDTH}px`}`,
44
+ display: guide.show ? 'block' : 'none',
45
+ backgroundColor: selectedGuideId === guide.id || hoveredGuideId === guide.id
46
+ ? colors_1.SELECTED_GUIDE
47
+ : colors_1.UNSELECTED_GUIDE,
48
+ };
49
+ }, [isVerticalGuide, guide.show, guide.id, selectedGuideId, hoveredGuideId]);
50
+ const onMouseDown = (0, react_1.useCallback)((e) => {
51
+ e.preventDefault();
52
+ if (e.button !== 0) {
53
+ return;
54
+ }
55
+ shouldCreateGuideRef.current = true;
56
+ document.body.style.cursor = 'no-drop';
57
+ setSelectedGuideId(() => guide.id);
58
+ }, [shouldCreateGuideRef, setSelectedGuideId, guide.id]);
59
+ const values = (0, react_1.useMemo)(() => {
60
+ return [
61
+ {
62
+ id: '1',
63
+ keyHint: null,
64
+ label: 'Remove guide',
65
+ leftItem: null,
66
+ onClick: () => {
67
+ setGuidesList((prevState) => {
68
+ const newGuides = prevState.filter((selected) => {
69
+ return selected.id !== guide.id;
70
+ });
71
+ (0, editor_guides_1.persistGuidesList)(newGuides);
72
+ return newGuides;
73
+ });
74
+ },
75
+ quickSwitcherLabel: null,
76
+ subMenu: null,
77
+ type: 'item',
78
+ value: 'remove',
79
+ },
80
+ ];
81
+ }, [guide.id, setGuidesList]);
82
+ return ((0, jsx_runtime_1.jsx)(ContextMenu_1.ContextMenu, { values: values, children: (0, jsx_runtime_1.jsx)("div", { style: guideStyle, onMouseDown: onMouseDown, className: "__remotion_editor_guide", onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: (0, jsx_runtime_1.jsx)("div", { style: guideContentStyle, className: [
83
+ '__remotion_editor_guide_content',
84
+ selectedGuideId === guide.id || hoveredGuideId === guide.id
85
+ ? '__remotion_editor_guide_selected'
86
+ : null,
87
+ ]
88
+ .filter(truthy_1.truthy)
89
+ .join(' ') }) }) }));
90
+ };
91
+ exports.default = (0, react_1.memo)(GuideComp);
@@ -0,0 +1,10 @@
1
+ /// <reference types="react" />
2
+ import { type Size } from '@remotion/player';
3
+ import type { AssetMetadata } from '../../helpers/get-asset-metadata';
4
+ import type { Dimensions } from '../../helpers/is-current-selected-still';
5
+ declare const EditorGuides: React.FC<{
6
+ canvasSize: Size | null;
7
+ contentDimensions: Dimensions | 'none' | null;
8
+ assetMetadata: AssetMetadata | null;
9
+ }>;
10
+ export default EditorGuides;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const react_1 = require("react");
8
+ const remotion_1 = require("remotion");
9
+ const use_studio_canvas_dimensions_1 = require("../../helpers/use-studio-canvas-dimensions");
10
+ const editor_guides_1 = require("../../state/editor-guides");
11
+ const Guide_1 = __importDefault(require("./Guide"));
12
+ const EditorGuides = ({ canvasSize, contentDimensions, assetMetadata }) => {
13
+ const { canvasDimensions, scale } = (0, use_studio_canvas_dimensions_1.useStudioCanvasDimensions)({
14
+ canvasSize,
15
+ contentDimensions,
16
+ assetMetadata,
17
+ });
18
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
19
+ if (canvasContent === null || canvasContent.type !== 'composition') {
20
+ throw new Error('Expected to be in a composition');
21
+ }
22
+ const { guidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
23
+ const guidesForThisComposition = (0, react_1.useMemo)(() => {
24
+ return guidesList.filter((guide) => {
25
+ return guide.compositionId === canvasContent.compositionId;
26
+ });
27
+ }, [canvasContent.compositionId, guidesList]);
28
+ return ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: guidesForThisComposition.map((guide) => {
29
+ return ((0, jsx_runtime_1.jsx)(Guide_1.default, { guide: guide, canvasDimensions: canvasDimensions, scale: scale }, guide.id));
30
+ }) }));
31
+ };
32
+ exports.default = EditorGuides;
@@ -12,5 +12,6 @@ interface RulerProps {
12
12
  markingGaps: number;
13
13
  orientation: 'horizontal' | 'vertical';
14
14
  }
15
+ export declare const makeGuideId: () => string;
15
16
  declare const Ruler: React.FC<RulerProps>;
16
17
  export default Ruler;
@@ -1,12 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeGuideId = void 0;
3
4
  const jsx_runtime_1 = require("react/jsx-runtime");
4
5
  const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const colors_1 = require("../../helpers/colors");
5
8
  const editor_ruler_1 = require("../../helpers/editor-ruler");
9
+ const editor_guides_1 = require("../../state/editor-guides");
6
10
  const editor_rulers_1 = require("../../state/editor-rulers");
11
+ const makeGuideId = () => {
12
+ return Math.random().toString(36).substring(7);
13
+ };
14
+ exports.makeGuideId = makeGuideId;
7
15
  const Ruler = ({ scale, points, originOffset, startMarking, containerRef, markingGaps, orientation, }) => {
8
- var _a, _b, _c, _d;
16
+ var _a;
9
17
  const rulerCanvasRef = (0, react_1.useRef)(null);
18
+ const isVerticalRuler = orientation === 'vertical';
19
+ const { shouldCreateGuideRef, setGuidesList, selectedGuideId, hoveredGuideId, setSelectedGuideId, guidesList, } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
20
+ const unsafeVideoConfig = remotion_1.Internals.useUnsafeVideoConfig();
21
+ if (!unsafeVideoConfig) {
22
+ throw new Error('Video config not set');
23
+ }
24
+ const [cursor, setCursor] = (0, react_1.useState)(isVerticalRuler ? 'ew-resize' : 'ns-resize');
25
+ const selectedOrHoveredGuide = (0, react_1.useMemo)(() => {
26
+ var _a, _b;
27
+ return ((_b = (_a = guidesList.find((guide) => guide.id === selectedGuideId)) !== null && _a !== void 0 ? _a : guidesList.find((guide) => guide.id === hoveredGuideId)) !== null && _b !== void 0 ? _b : null);
28
+ }, [guidesList, hoveredGuideId, selectedGuideId]);
10
29
  (0, react_1.useEffect)(() => {
11
30
  (0, editor_ruler_1.drawMarkingOnRulerCanvas)({
12
31
  scale,
@@ -16,25 +35,71 @@ const Ruler = ({ scale, points, originOffset, startMarking, containerRef, markin
16
35
  markingGaps,
17
36
  orientation,
18
37
  rulerCanvasRef,
38
+ selectedGuide: selectedOrHoveredGuide,
19
39
  });
20
- }, [scale, points, startMarking, originOffset, markingGaps, orientation]);
21
- const canvasContainerWidth = ((_b = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) === null || _b === void 0 ? void 0 : _b.width) || 0;
22
- const canvasContainerHeight = ((_d = (_c = containerRef.current) === null || _c === void 0 ? void 0 : _c.getBoundingClientRect()) === null || _d === void 0 ? void 0 : _d.height) || 0;
23
- const rulerWidth = orientation === 'horizontal' ? canvasContainerWidth : editor_rulers_1.RULER_WIDTH;
24
- const rulerHeight = orientation === 'horizontal' ? editor_rulers_1.RULER_WIDTH : canvasContainerHeight;
40
+ }, [
41
+ scale,
42
+ points,
43
+ startMarking,
44
+ originOffset,
45
+ markingGaps,
46
+ orientation,
47
+ selectedOrHoveredGuide,
48
+ ]);
49
+ const { width: canvasContainerWidth, height: canvasContainerHeight } = ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) || { width: 0, height: 0 };
50
+ const rulerWidth = isVerticalRuler ? editor_rulers_1.RULER_WIDTH : canvasContainerWidth;
51
+ const rulerHeight = isVerticalRuler ? canvasContainerHeight : editor_rulers_1.RULER_WIDTH;
25
52
  const rulerStyle = (0, react_1.useMemo)(() => ({
26
53
  position: 'absolute',
27
- background: '#000000',
54
+ background: colors_1.BACKGROUND,
28
55
  width: `${rulerWidth}px`,
29
56
  height: `${rulerHeight}px`,
30
- ...(orientation === 'vertical'
31
- ? {
32
- left: 0,
33
- }
34
- : {
35
- top: 0,
36
- }),
37
- }), [orientation, rulerWidth, rulerHeight]);
38
- return ((0, jsx_runtime_1.jsx)("canvas", { ref: rulerCanvasRef, width: rulerWidth * devicePixelRatio, height: rulerHeight * devicePixelRatio, style: rulerStyle }));
57
+ left: isVerticalRuler ? 0 : 'unset',
58
+ top: isVerticalRuler ? 'unset' : 0,
59
+ borderBottom: isVerticalRuler ? undefined : '1px solid ' + colors_1.RULER_COLOR,
60
+ borderRight: isVerticalRuler ? '1px solid ' + colors_1.RULER_COLOR : undefined,
61
+ cursor,
62
+ }), [rulerWidth, rulerHeight, cursor, isVerticalRuler]);
63
+ const onMouseDown = (0, react_1.useCallback)((e) => {
64
+ if (e.button !== 0) {
65
+ return;
66
+ }
67
+ e.preventDefault();
68
+ shouldCreateGuideRef.current = true;
69
+ document.body.style.cursor = 'no-drop';
70
+ const guideId = (0, exports.makeGuideId)();
71
+ setSelectedGuideId(() => guideId);
72
+ setGuidesList((prevState) => {
73
+ return [
74
+ ...prevState,
75
+ {
76
+ orientation,
77
+ position: -originOffset,
78
+ show: false,
79
+ id: guideId,
80
+ compositionId: unsafeVideoConfig.id,
81
+ },
82
+ ];
83
+ });
84
+ }, [
85
+ shouldCreateGuideRef,
86
+ setSelectedGuideId,
87
+ setGuidesList,
88
+ orientation,
89
+ originOffset,
90
+ unsafeVideoConfig.id,
91
+ ]);
92
+ const changeCursor = (0, react_1.useCallback)((e) => {
93
+ e.preventDefault();
94
+ if (selectedGuideId !== null) {
95
+ setCursor('no-drop');
96
+ }
97
+ }, [setCursor, selectedGuideId]);
98
+ (0, react_1.useEffect)(() => {
99
+ if (selectedGuideId === null) {
100
+ setCursor(isVerticalRuler ? 'ew-resize' : 'ns-resize');
101
+ }
102
+ }, [selectedGuideId, isVerticalRuler]);
103
+ return ((0, jsx_runtime_1.jsx)("canvas", { ref: rulerCanvasRef, width: rulerWidth * devicePixelRatio, height: rulerHeight * devicePixelRatio, style: rulerStyle, onPointerDown: onMouseDown, onPointerEnter: changeCursor, onPointerLeave: changeCursor }));
39
104
  };
40
105
  exports.default = Ruler;