@remotion/cli 4.0.62 → 4.0.65
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.
- package/dist/config/image-format.d.ts +1 -1
- package/dist/config/index.d.ts +1 -1
- package/dist/editor/components/AudioWaveform.js +2 -1
- package/dist/editor/components/Canvas.js +10 -1
- package/dist/editor/components/CompositionSelectorItem.js +42 -1
- package/dist/editor/components/ContextMenu.d.ts +6 -0
- package/dist/editor/components/ContextMenu.js +91 -0
- package/dist/editor/components/EditorContexts.js +3 -1
- package/dist/editor/components/EditorGuides/Guide.d.ts +13 -0
- package/dist/editor/components/EditorGuides/Guide.js +91 -0
- package/dist/editor/components/EditorGuides/index.d.ts +10 -0
- package/dist/editor/components/EditorGuides/index.js +32 -0
- package/dist/editor/components/EditorRuler/Ruler.d.ts +17 -0
- package/dist/editor/components/EditorRuler/Ruler.js +105 -0
- package/dist/editor/components/EditorRuler/index.d.ts +10 -0
- package/dist/editor/components/EditorRuler/index.js +167 -0
- package/dist/editor/components/EditorRuler/use-is-ruler-visible.d.ts +1 -0
- package/dist/editor/components/EditorRuler/use-is-ruler-visible.js +12 -0
- package/dist/editor/components/Menu/MenuItem.js +6 -3
- package/dist/editor/components/Menu/MenuSubItem.d.ts +2 -1
- package/dist/editor/components/Menu/MenuSubItem.js +2 -2
- package/dist/editor/components/NewComposition/ComboBox.d.ts +1 -1
- package/dist/editor/components/NewComposition/InputDragger.js +4 -1
- package/dist/editor/components/NewComposition/MenuContent.js +3 -3
- package/dist/editor/components/NewComposition/RemInput.d.ts +1 -1
- package/dist/editor/components/NewComposition/RemInputTypeColor.d.ts +1 -1
- package/dist/editor/components/NewComposition/RemTextarea.d.ts +1 -1
- package/dist/editor/components/RenderModal/human-readable-codec.d.ts +1 -1
- package/dist/editor/components/ShowGuidesProvider.d.ts +4 -0
- package/dist/editor/components/ShowGuidesProvider.js +43 -0
- package/dist/editor/components/ShowRulersProvider.d.ts +4 -0
- package/dist/editor/components/ShowRulersProvider.js +24 -0
- package/dist/editor/components/Splitter/SplitterHandle.js +3 -0
- package/dist/editor/components/Timeline/TimelineDragHandler.js +85 -5
- package/dist/editor/components/Timeline/TimelineInOutPointerHandle.js +2 -1
- package/dist/editor/components/TopPanel.js +10 -5
- package/dist/editor/helpers/colors.d.ts +6 -1
- package/dist/editor/helpers/colors.js +7 -2
- package/dist/editor/helpers/editor-ruler.d.ts +53 -0
- package/dist/editor/helpers/editor-ruler.js +184 -0
- package/dist/editor/helpers/use-menu-structure.js +41 -1
- package/dist/editor/helpers/use-studio-canvas-dimensions.d.ts +16 -0
- package/dist/editor/helpers/use-studio-canvas-dimensions.js +59 -0
- package/dist/editor/state/editor-guides.d.ts +25 -0
- package/dist/editor/state/editor-guides.js +34 -0
- package/dist/editor/state/editor-rulers.d.ts +14 -0
- package/dist/editor/state/editor-rulers.js +24 -0
- package/dist/get-cli-options.d.ts +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +1 -1
- package/dist/lambda-command.d.ts +2 -1
- package/dist/lambda-command.js +2 -2
- package/dist/preview-server/dev-middleware/range-parser.d.ts +1 -1
- package/dist/preview-server/public-folder.js +1 -1
- package/package.json +8 -8
|
@@ -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: () => "
|
|
5
|
+
export declare const getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | undefined;
|
package/dist/config/index.d.ts
CHANGED
|
@@ -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: () => "
|
|
332
|
+
getUserPreferredVideoImageFormat: () => "png" | "jpeg" | "none" | 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 =
|
|
75
|
+
context.strokeStyle = colors_1.LIGHT_TRANSPARENT;
|
|
75
76
|
context.stroke();
|
|
76
77
|
}, [visualizationWidth, metadata, startFrom, volume, doesVolumeChange]);
|
|
77
78
|
(0, react_1.useEffect)(() => {
|
|
@@ -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,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;
|
|
@@ -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;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface Point {
|
|
3
|
+
value: number;
|
|
4
|
+
position: number;
|
|
5
|
+
}
|
|
6
|
+
interface RulerProps {
|
|
7
|
+
scale: number;
|
|
8
|
+
points: Point[];
|
|
9
|
+
originOffset: number;
|
|
10
|
+
startMarking: number;
|
|
11
|
+
containerRef: React.RefObject<HTMLDivElement>;
|
|
12
|
+
markingGaps: number;
|
|
13
|
+
orientation: 'horizontal' | 'vertical';
|
|
14
|
+
}
|
|
15
|
+
export declare const makeGuideId: () => string;
|
|
16
|
+
declare const Ruler: React.FC<RulerProps>;
|
|
17
|
+
export default Ruler;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeGuideId = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const remotion_1 = require("remotion");
|
|
7
|
+
const colors_1 = require("../../helpers/colors");
|
|
8
|
+
const editor_ruler_1 = require("../../helpers/editor-ruler");
|
|
9
|
+
const editor_guides_1 = require("../../state/editor-guides");
|
|
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;
|
|
15
|
+
const Ruler = ({ scale, points, originOffset, startMarking, containerRef, markingGaps, orientation, }) => {
|
|
16
|
+
var _a;
|
|
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]);
|
|
29
|
+
(0, react_1.useEffect)(() => {
|
|
30
|
+
(0, editor_ruler_1.drawMarkingOnRulerCanvas)({
|
|
31
|
+
scale,
|
|
32
|
+
points,
|
|
33
|
+
startMarking,
|
|
34
|
+
originOffset,
|
|
35
|
+
markingGaps,
|
|
36
|
+
orientation,
|
|
37
|
+
rulerCanvasRef,
|
|
38
|
+
selectedGuide: selectedOrHoveredGuide,
|
|
39
|
+
});
|
|
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;
|
|
52
|
+
const rulerStyle = (0, react_1.useMemo)(() => ({
|
|
53
|
+
position: 'absolute',
|
|
54
|
+
background: colors_1.BACKGROUND,
|
|
55
|
+
width: `${rulerWidth}px`,
|
|
56
|
+
height: `${rulerHeight}px`,
|
|
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 }));
|
|
104
|
+
};
|
|
105
|
+
exports.default = Ruler;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Size } from '@remotion/player';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { AssetMetadata } from '../../helpers/get-asset-metadata';
|
|
4
|
+
import type { Dimensions } from '../../helpers/is-current-selected-still';
|
|
5
|
+
export declare const EditorRulers: React.FC<{
|
|
6
|
+
canvasSize: Size | null;
|
|
7
|
+
contentDimensions: Dimensions | 'none' | null;
|
|
8
|
+
assetMetadata: AssetMetadata | null;
|
|
9
|
+
containerRef: React.RefObject<HTMLDivElement>;
|
|
10
|
+
}>;
|