@remotion/studio 4.0.471 → 4.0.472
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/components/AssetSelector.js +10 -1
- package/dist/components/Canvas.js +98 -0
- package/dist/components/CompositionSelectorItem.d.ts +1 -0
- package/dist/components/CompositionSelectorItem.js +12 -4
- package/dist/components/ContextMenu.js +54 -46
- package/dist/components/Editor.js +14 -6
- package/dist/components/Modals.js +3 -1
- package/dist/components/NewComposition/CodemodFooter.js +2 -2
- package/dist/components/NewComposition/DeleteFolder.d.ts +6 -0
- package/dist/components/NewComposition/DeleteFolder.js +39 -0
- package/dist/components/NewComposition/RenameFolder.d.ts +6 -0
- package/dist/components/NewComposition/RenameFolder.js +60 -0
- package/dist/components/SelectedOutlineOverlay.d.ts +81 -4
- package/dist/components/SelectedOutlineOverlay.js +405 -54
- package/dist/components/Splitter/SplitterContainer.js +9 -0
- package/dist/components/Splitter/SplitterHandle.js +63 -70
- package/dist/components/Timeline/Timeline.js +47 -2
- package/dist/components/Timeline/TimelineArrayField.d.ts +9 -0
- package/dist/components/Timeline/TimelineArrayField.js +210 -0
- package/dist/components/Timeline/TimelineBooleanField.d.ts +2 -2
- package/dist/components/Timeline/TimelineBooleanField.js +2 -2
- package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +20 -0
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +265 -0
- package/dist/components/Timeline/TimelineColorField.d.ts +2 -2
- package/dist/components/Timeline/TimelineColorField.js +2 -8
- package/dist/components/Timeline/TimelineEffectItem.js +2 -2
- package/dist/components/Timeline/TimelineEffectPropItem.js +95 -25
- package/dist/components/Timeline/TimelineEnumField.d.ts +2 -2
- package/dist/components/Timeline/TimelineEnumField.js +3 -3
- package/dist/components/Timeline/TimelineKeyframeControls.d.ts +4 -3
- package/dist/components/Timeline/TimelineKeyframeControls.js +37 -23
- package/dist/components/Timeline/TimelineKeyframedValue.d.ts +7 -2
- package/dist/components/Timeline/TimelineKeyframedValue.js +22 -8
- package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -0
- package/dist/components/Timeline/TimelineLayerEye.js +8 -3
- package/dist/components/Timeline/TimelineNumberField.d.ts +2 -2
- package/dist/components/Timeline/TimelineNumberField.js +7 -11
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.d.ts +17 -0
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +53 -0
- package/dist/components/Timeline/TimelineRotationField.d.ts +2 -2
- package/dist/components/Timeline/TimelineRotationField.js +41 -24
- package/dist/components/Timeline/TimelineRowChrome.js +8 -7
- package/dist/components/Timeline/TimelineScaleField.d.ts +20 -0
- package/dist/components/Timeline/TimelineScaleField.js +314 -0
- package/dist/components/Timeline/TimelineSchemaField.d.ts +3 -2
- package/dist/components/Timeline/TimelineSchemaField.js +8 -42
- package/dist/components/Timeline/TimelineSelection.js +3 -2
- package/dist/components/Timeline/TimelineSequence.d.ts +1 -0
- package/dist/components/Timeline/TimelineSequence.js +51 -10
- package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
- package/dist/components/Timeline/TimelineSequenceItem.js +7 -7
- package/dist/components/Timeline/TimelineSequencePropItem.js +82 -21
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +58 -0
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +528 -0
- package/dist/components/Timeline/TimelineTrack.js +1 -1
- package/dist/components/Timeline/TimelineTranslateField.d.ts +2 -2
- package/dist/components/Timeline/TimelineTranslateField.js +21 -25
- package/dist/components/Timeline/TimelineUvCoordinateField.d.ts +2 -2
- package/dist/components/Timeline/TimelineUvCoordinateField.js +20 -26
- package/dist/components/Timeline/call-add-keyframe.js +2 -0
- package/dist/components/Timeline/get-node-keyframes.d.ts +5 -2
- package/dist/components/Timeline/get-node-keyframes.js +38 -5
- package/dist/components/Timeline/get-timeline-keyframes.js +4 -4
- package/dist/components/Timeline/reset-selected-timeline-props.js +19 -6
- package/dist/components/Timeline/timeline-field-utils.d.ts +1 -0
- package/dist/components/Timeline/timeline-field-utils.js +5 -1
- package/dist/components/Timeline/timeline-translate-utils.js +6 -2
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +7 -0
- package/dist/components/TopPanel.d.ts +1 -1
- package/dist/components/folder-menu-items.d.ts +12 -0
- package/dist/components/folder-menu-items.js +147 -0
- package/dist/components/import-assets.d.ts +6 -0
- package/dist/components/import-assets.js +157 -0
- package/dist/esm/{chunk-z0z9d4r0.js → chunk-48grt472.js} +8936 -5886
- package/dist/esm/internals.mjs +8936 -5886
- package/dist/esm/previewEntry.mjs +8748 -5698
- package/dist/esm/renderEntry.mjs +1 -1
- package/dist/helpers/calculate-timeline.js +7 -3
- package/dist/helpers/create-folder-tree.js +1 -0
- package/dist/helpers/detect-file-type.d.ts +69 -0
- package/dist/helpers/detect-file-type.js +278 -0
- package/dist/helpers/get-folder-id.d.ts +4 -0
- package/dist/helpers/get-folder-id.js +7 -0
- package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -0
- package/dist/helpers/timeline-layout.js +5 -1
- package/dist/helpers/validate-folder-rename.d.ts +6 -0
- package/dist/helpers/validate-folder-rename.js +19 -0
- package/dist/state/modals.d.ts +10 -0
- package/dist/state/scale-lock.d.ts +18 -0
- package/dist/state/scale-lock.js +59 -0
- package/package.json +10 -10
|
@@ -93,6 +93,15 @@ const AssetSelector = ({ readOnlyStudio }) => {
|
|
|
93
93
|
const makePath = (file) => {
|
|
94
94
|
return [assetPath, file.name].filter(Boolean).join('/');
|
|
95
95
|
};
|
|
96
|
+
const differentExistingFile = Array.from(files).find((file) => {
|
|
97
|
+
const filePath = makePath(file);
|
|
98
|
+
return staticFiles.some((staticFile) => staticFile.name === filePath &&
|
|
99
|
+
staticFile.sizeInBytes !== file.size);
|
|
100
|
+
});
|
|
101
|
+
if (differentExistingFile) {
|
|
102
|
+
(0, NotificationCenter_1.showNotification)(`File with name ${makePath(differentExistingFile)} already exists and is different`, 4000);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
96
105
|
for (const file of files) {
|
|
97
106
|
const body = await file.arrayBuffer();
|
|
98
107
|
await (0, write_static_file_1.writeStaticFile)({
|
|
@@ -113,7 +122,7 @@ const AssetSelector = ({ readOnlyStudio }) => {
|
|
|
113
122
|
finally {
|
|
114
123
|
setDropLocation(null);
|
|
115
124
|
}
|
|
116
|
-
}, [dropLocation]);
|
|
125
|
+
}, [dropLocation, staticFiles]);
|
|
117
126
|
return (jsx_runtime_1.jsxs("div", { style: container, onDragOver: shouldAllowUpload ? onDragOver : undefined, onDrop: shouldAllowUpload ? onDrop : undefined, children: [showCurrentAsset ? jsx_runtime_1.jsx(CurrentAsset_1.CurrentAsset, {}) : null, staticFiles.length === 0 ? (publicFolderExists ? (jsx_runtime_1.jsx("div", { style: emptyState, children: jsx_runtime_1.jsxs("div", { style: label, children: ["To add assets, place a file in the", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: "public" }),
|
|
118
127
|
" folder of your project or drag and drop a file here."] }) })) : (jsx_runtime_1.jsx("div", { style: emptyState, children: jsx_runtime_1.jsxs("div", { style: label, children: ["To add assets, create a folder called", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: "public" }),
|
|
119
128
|
" in the root of your project and place a file in it."] }) }))) : (jsx_runtime_1.jsx("div", { className: "__remotion-vertical-scrollbar", style: {
|
|
@@ -7,9 +7,11 @@ exports.Canvas = void 0;
|
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const react_1 = require("react");
|
|
9
9
|
const remotion_1 = require("remotion");
|
|
10
|
+
const client_id_1 = require("../helpers/client-id");
|
|
10
11
|
const colors_1 = require("../helpers/colors");
|
|
11
12
|
const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
|
|
12
13
|
const get_effective_translation_1 = require("../helpers/get-effective-translation");
|
|
14
|
+
const open_in_editor_1 = require("../helpers/open-in-editor");
|
|
13
15
|
const smooth_zoom_1 = require("../helpers/smooth-zoom");
|
|
14
16
|
const use_keybinding_1 = require("../helpers/use-keybinding");
|
|
15
17
|
const canvas_ref_1 = require("../state/canvas-ref");
|
|
@@ -18,9 +20,11 @@ const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
|
|
|
18
20
|
const EditorGuides_1 = __importDefault(require("./EditorGuides"));
|
|
19
21
|
const EditorRuler_1 = require("./EditorRuler");
|
|
20
22
|
const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
|
|
23
|
+
const import_assets_1 = require("./import-assets");
|
|
21
24
|
const layout_1 = require("./layout");
|
|
22
25
|
const Preview_1 = require("./Preview");
|
|
23
26
|
const ResetZoomButton_1 = require("./ResetZoomButton");
|
|
27
|
+
const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
|
|
24
28
|
const getContainerStyle = (editorZoomGestures) => ({
|
|
25
29
|
flex: 1,
|
|
26
30
|
display: 'flex',
|
|
@@ -35,7 +39,28 @@ const resetZoom = {
|
|
|
35
39
|
right: layout_1.SPACING_UNIT * 2,
|
|
36
40
|
};
|
|
37
41
|
const ZOOM_PX_FACTOR = 0.003;
|
|
42
|
+
const isFileDragEvent = (event) => {
|
|
43
|
+
var _a;
|
|
44
|
+
var _b;
|
|
45
|
+
return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes('Files');
|
|
46
|
+
};
|
|
47
|
+
const isDragEventInsideCanvas = (event) => {
|
|
48
|
+
const { current } = canvas_ref_1.canvasRef;
|
|
49
|
+
if (!current) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
const targetIsNode = event.target instanceof Node;
|
|
53
|
+
if (targetIsNode && current.contains(event.target)) {
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
const rect = current.getBoundingClientRect();
|
|
57
|
+
return (event.clientX >= rect.left &&
|
|
58
|
+
event.clientX <= rect.right &&
|
|
59
|
+
event.clientY >= rect.top &&
|
|
60
|
+
event.clientY <= rect.bottom);
|
|
61
|
+
};
|
|
38
62
|
const Canvas = ({ canvasContent, size }) => {
|
|
63
|
+
var _a, _b;
|
|
39
64
|
const { setSize, size: previewSize } = (0, react_1.useContext)(remotion_1.Internals.PreviewSizeContext);
|
|
40
65
|
const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
|
|
41
66
|
const previewSnapshotRef = (0, react_1.useRef)({
|
|
@@ -50,7 +75,30 @@ const Canvas = ({ canvasContent, size }) => {
|
|
|
50
75
|
const config = remotion_1.Internals.useUnsafeVideoConfig();
|
|
51
76
|
const areRulersVisible = (0, use_is_ruler_visible_1.useIsRulerVisible)();
|
|
52
77
|
const { editorShowGuides } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
|
|
78
|
+
const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
79
|
+
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
80
|
+
const [isAddingAsset, setIsAddingAsset] = (0, react_1.useState)(false);
|
|
53
81
|
const [assetResolution, setAssetResolution] = (0, react_1.useState)(null);
|
|
82
|
+
const currentCompositionId = canvasContent.type === 'composition' ? canvasContent.compositionId : null;
|
|
83
|
+
const currentComposition = (0, react_1.useMemo)(() => {
|
|
84
|
+
var _a;
|
|
85
|
+
if (currentCompositionId === null) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return ((_a = compositions.find((composition) => composition.id === currentCompositionId)) !== null && _a !== void 0 ? _a : null);
|
|
89
|
+
}, [compositions, currentCompositionId]);
|
|
90
|
+
const resolvedCompositionLocation = (0, use_resolved_stack_1.useResolvedStack)((_a = currentComposition === null || currentComposition === void 0 ? void 0 : currentComposition.stack) !== null && _a !== void 0 ? _a : null);
|
|
91
|
+
const compositionFile = (_b = resolvedCompositionLocation === null || resolvedCompositionLocation === void 0 ? void 0 : resolvedCompositionLocation.source) !== null && _b !== void 0 ? _b : null;
|
|
92
|
+
const compositionComponentInfo = (0, open_in_editor_1.useCachedCompositionComponentInfo)({
|
|
93
|
+
compositionFile,
|
|
94
|
+
compositionId: currentCompositionId,
|
|
95
|
+
});
|
|
96
|
+
const canDropAssets = previewServerState.type === 'connected' &&
|
|
97
|
+
!window.remotion_isReadOnlyStudio &&
|
|
98
|
+
(compositionComponentInfo === null || compositionComponentInfo === void 0 ? void 0 : compositionComponentInfo.canAddSequence) === true &&
|
|
99
|
+
currentCompositionId !== null &&
|
|
100
|
+
compositionFile !== null &&
|
|
101
|
+
!isAddingAsset;
|
|
54
102
|
const contentDimensions = (0, react_1.useMemo)(() => {
|
|
55
103
|
if ((canvasContent.type === 'asset' ||
|
|
56
104
|
canvasContent.type === 'output' ||
|
|
@@ -417,6 +465,56 @@ const Canvas = ({ canvasContent, size }) => {
|
|
|
417
465
|
(0, react_1.useEffect)(() => {
|
|
418
466
|
fetchMetadata();
|
|
419
467
|
}, [fetchMetadata]);
|
|
468
|
+
const onDragOver = (0, react_1.useCallback)((event) => {
|
|
469
|
+
if (!canDropAssets ||
|
|
470
|
+
!isFileDragEvent(event) ||
|
|
471
|
+
!isDragEventInsideCanvas(event)) {
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
474
|
+
event.preventDefault();
|
|
475
|
+
if (event.dataTransfer) {
|
|
476
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
477
|
+
}
|
|
478
|
+
}, [canDropAssets]);
|
|
479
|
+
const onDrop = (0, react_1.useCallback)(async (event) => {
|
|
480
|
+
var _a;
|
|
481
|
+
var _b;
|
|
482
|
+
if (!canDropAssets ||
|
|
483
|
+
compositionFile === null ||
|
|
484
|
+
currentCompositionId === null ||
|
|
485
|
+
!isFileDragEvent(event) ||
|
|
486
|
+
!isDragEventInsideCanvas(event)) {
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
event.preventDefault();
|
|
490
|
+
event.stopPropagation();
|
|
491
|
+
const files = Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
|
|
492
|
+
if (files.length === 0) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
setIsAddingAsset(true);
|
|
496
|
+
try {
|
|
497
|
+
await (0, import_assets_1.importAssets)({
|
|
498
|
+
files,
|
|
499
|
+
compositionFile,
|
|
500
|
+
compositionId: currentCompositionId,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
finally {
|
|
504
|
+
setIsAddingAsset(false);
|
|
505
|
+
}
|
|
506
|
+
}, [canDropAssets, compositionFile, currentCompositionId]);
|
|
507
|
+
(0, react_1.useEffect)(() => {
|
|
508
|
+
if (!canDropAssets) {
|
|
509
|
+
return;
|
|
510
|
+
}
|
|
511
|
+
document.addEventListener('dragover', onDragOver, { capture: true });
|
|
512
|
+
document.addEventListener('drop', onDrop, { capture: true });
|
|
513
|
+
return () => {
|
|
514
|
+
document.removeEventListener('dragover', onDragOver, { capture: true });
|
|
515
|
+
document.removeEventListener('drop', onDrop, { capture: true });
|
|
516
|
+
};
|
|
517
|
+
}, [canDropAssets, onDragOver, onDrop]);
|
|
420
518
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
421
519
|
jsx_runtime_1.jsxs("div", { ref: canvas_ref_1.canvasRef, style: getContainerStyle(editorZoomGestures), children: [size ? (jsx_runtime_1.jsx(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, onRetryAssetMetadata: fetchMetadata })) : null, isFit ? null : (jsx_runtime_1.jsx("div", { style: resetZoom, className: "css-reset", children: jsx_runtime_1.jsx(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && canvasContent.type === 'composition' && (jsx_runtime_1.jsx(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && (jsx_runtime_1.jsx(EditorRuler_1.EditorRulers, { contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
|
|
422
520
|
};
|
|
@@ -15,6 +15,7 @@ const modals_1 = require("../state/modals");
|
|
|
15
15
|
const composition_menu_items_1 = require("./composition-menu-items");
|
|
16
16
|
const CompositionContextButton_1 = require("./CompositionContextButton");
|
|
17
17
|
const ContextMenu_1 = require("./ContextMenu");
|
|
18
|
+
const folder_menu_items_1 = require("./folder-menu-items");
|
|
18
19
|
const layout_1 = require("./layout");
|
|
19
20
|
const SidebarRenderButton_1 = require("./SidebarRenderButton");
|
|
20
21
|
const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
|
|
@@ -108,7 +109,7 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
|
|
|
108
109
|
const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
109
110
|
const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
|
|
110
111
|
.previewServerState.type;
|
|
111
|
-
const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(item.type === 'composition' ? item.composition.stack :
|
|
112
|
+
const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(item.type === 'composition' ? item.composition.stack : item.folder.stack);
|
|
112
113
|
const contextMenu = (0, react_1.useMemo)(() => {
|
|
113
114
|
if (item.type === 'composition') {
|
|
114
115
|
return (0, composition_menu_items_1.getCompositionMenuItems)({
|
|
@@ -120,12 +121,19 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
|
|
|
120
121
|
readOnlyStudio: window.remotion_isReadOnlyStudio,
|
|
121
122
|
});
|
|
122
123
|
}
|
|
123
|
-
return
|
|
124
|
+
return (0, folder_menu_items_1.getFolderMenuItems)({
|
|
125
|
+
closeMenu: noop_1.noop,
|
|
126
|
+
connectionStatus,
|
|
127
|
+
folder: item.folder,
|
|
128
|
+
resolvedLocation,
|
|
129
|
+
setSelectedModal,
|
|
130
|
+
readOnlyStudio: window.remotion_isReadOnlyStudio,
|
|
131
|
+
});
|
|
124
132
|
}, [connectionStatus, item, resolvedLocation, setSelectedModal]);
|
|
125
133
|
if (item.type === 'folder') {
|
|
126
134
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
127
|
-
jsx_runtime_1.jsxs("button", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, type: "button", title: item.folderName, children: [item.expanded ? (jsx_runtime_1.jsx(folder_1.ExpandedFolderIcon, { style: iconStyle, color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT })) : (jsx_runtime_1.jsx(folder_1.CollapsedFolderIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.folderName })
|
|
128
|
-
|
|
135
|
+
jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenu, onOpen: null, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("button", { style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, type: "button", title: item.folderName, children: [item.expanded ? (jsx_runtime_1.jsx(folder_1.ExpandedFolderIcon, { style: iconStyle, color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT })) : (jsx_runtime_1.jsx(folder_1.CollapsedFolderIcon, { color: hovered || selected ? 'white' : colors_1.LIGHT_TEXT, style: iconStyle })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.folderName }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(CompositionContextButton_1.CompositionContextButton, { values: contextMenu, visible: hovered })
|
|
136
|
+
] }) }) }), item.expanded
|
|
129
137
|
? item.items.map((childItem) => {
|
|
130
138
|
return (jsx_runtime_1.jsx(exports.CompositionSelectorItem, { currentComposition: currentComposition, selectComposition: selectComposition, item: childItem, tabIndex: tabIndex, level: level + 1, toggleFolder: toggleFolder }, childItem.key + childItem.type));
|
|
131
139
|
})
|
|
@@ -47,58 +47,25 @@ const z_index_1 = require("../state/z-index");
|
|
|
47
47
|
const portals_1 = require("./Menu/portals");
|
|
48
48
|
const styles_1 = require("./Menu/styles");
|
|
49
49
|
const MenuContent_1 = require("./NewComposition/MenuContent");
|
|
50
|
-
|
|
51
|
-
const
|
|
52
|
-
const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
|
|
53
|
-
const { currentZIndex } = (0, z_index_1.useZIndex)();
|
|
54
|
-
const setRef = (0, react_1.useCallback)((node) => {
|
|
55
|
-
ref.current = node;
|
|
56
|
-
if (typeof forwardedRef === 'function') {
|
|
57
|
-
forwardedRef(node);
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
if (forwardedRef) {
|
|
61
|
-
forwardedRef.current = node;
|
|
62
|
-
}
|
|
63
|
-
}, [forwardedRef]);
|
|
64
|
-
const size = player_1.PlayerInternals.useElementSize(ref, {
|
|
50
|
+
const ContextMenuPortal = ({ containerRef, currentZIndex, onHide, opened, values }) => {
|
|
51
|
+
const size = player_1.PlayerInternals.useElementSize(containerRef, {
|
|
65
52
|
triggerOnWindowResize: true,
|
|
66
53
|
shouldApplyCssTransforms: true,
|
|
67
54
|
});
|
|
68
55
|
const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
|
|
69
|
-
(0, react_1.useEffect)(() => {
|
|
70
|
-
const { current } = ref;
|
|
71
|
-
if (!current) {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
const onClick = (e) => {
|
|
75
|
-
e.preventDefault();
|
|
76
|
-
e.stopPropagation();
|
|
77
|
-
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
|
|
78
|
-
setOpened({ type: 'open', left: e.clientX, top: e.clientY });
|
|
79
|
-
return false;
|
|
80
|
-
};
|
|
81
|
-
current.addEventListener('contextmenu', onClick);
|
|
82
|
-
return () => {
|
|
83
|
-
current.removeEventListener('contextmenu', onClick);
|
|
84
|
-
};
|
|
85
|
-
}, [onOpen, size]);
|
|
86
56
|
const spaceToBottom = (0, react_1.useMemo)(() => {
|
|
87
|
-
if (size
|
|
57
|
+
if (size) {
|
|
88
58
|
return size.windowSize.height - opened.top;
|
|
89
59
|
}
|
|
90
60
|
return 0;
|
|
91
|
-
}, [opened, size]);
|
|
61
|
+
}, [opened.top, size]);
|
|
92
62
|
const spaceToTop = (0, react_1.useMemo)(() => {
|
|
93
|
-
if (size
|
|
63
|
+
if (size) {
|
|
94
64
|
return opened.top;
|
|
95
65
|
}
|
|
96
66
|
return 0;
|
|
97
|
-
}, [opened, size]);
|
|
67
|
+
}, [opened.top, size]);
|
|
98
68
|
const portalStyle = (0, react_1.useMemo)(() => {
|
|
99
|
-
if (opened.type === 'not-open') {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
69
|
if (!size) {
|
|
103
70
|
return;
|
|
104
71
|
}
|
|
@@ -128,17 +95,58 @@ exports.ContextMenu = react_1.default.forwardRef(({ children, values, onOpen, st
|
|
|
128
95
|
right: canOpenOnLeft ? size.windowSize.width - opened.left : 0,
|
|
129
96
|
}),
|
|
130
97
|
};
|
|
131
|
-
}, [
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
98
|
+
}, [
|
|
99
|
+
opened.left,
|
|
100
|
+
opened.top,
|
|
101
|
+
size,
|
|
102
|
+
isMobileLayout,
|
|
103
|
+
spaceToTop,
|
|
104
|
+
spaceToBottom,
|
|
105
|
+
]);
|
|
135
106
|
// Prevent deselection of a selected item
|
|
136
107
|
const onMenuPointerDown = (0, react_1.useCallback)((e) => {
|
|
137
108
|
e.stopPropagation();
|
|
138
109
|
}, []);
|
|
110
|
+
if (!portalStyle) {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
return react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: 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));
|
|
114
|
+
};
|
|
115
|
+
exports.ContextMenu = react_1.default.forwardRef(({ children, values, onOpen, style = undefined, className = undefined, onPointerDown = undefined, }, forwardedRef) => {
|
|
116
|
+
const ref = (0, react_1.useRef)(null);
|
|
117
|
+
const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
|
|
118
|
+
const { currentZIndex } = (0, z_index_1.useZIndex)();
|
|
119
|
+
const setRef = (0, react_1.useCallback)((node) => {
|
|
120
|
+
ref.current = node;
|
|
121
|
+
if (typeof forwardedRef === 'function') {
|
|
122
|
+
forwardedRef(node);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (forwardedRef) {
|
|
126
|
+
forwardedRef.current = node;
|
|
127
|
+
}
|
|
128
|
+
}, [forwardedRef]);
|
|
129
|
+
(0, react_1.useEffect)(() => {
|
|
130
|
+
const { current } = ref;
|
|
131
|
+
if (!current) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const onClick = (e) => {
|
|
135
|
+
e.preventDefault();
|
|
136
|
+
e.stopPropagation();
|
|
137
|
+
onOpen === null || onOpen === void 0 ? void 0 : onOpen();
|
|
138
|
+
setOpened({ type: 'open', left: e.clientX, top: e.clientY });
|
|
139
|
+
return false;
|
|
140
|
+
};
|
|
141
|
+
current.addEventListener('contextmenu', onClick);
|
|
142
|
+
return () => {
|
|
143
|
+
current.removeEventListener('contextmenu', onClick);
|
|
144
|
+
};
|
|
145
|
+
}, [onOpen]);
|
|
146
|
+
const onHide = (0, react_1.useCallback)(() => {
|
|
147
|
+
setOpened({ type: 'not-open' });
|
|
148
|
+
}, []);
|
|
139
149
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
140
|
-
jsx_runtime_1.jsx("div", { ref: setRef, onContextMenu: () => false, style: style, className: className, onPointerDown: onPointerDown, children: children }),
|
|
141
|
-
? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: 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))
|
|
142
|
-
: null] }));
|
|
150
|
+
jsx_runtime_1.jsx("div", { ref: setRef, onContextMenu: () => false, style: style, className: className, onPointerDown: onPointerDown, children: children }), opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { containerRef: ref, currentZIndex: currentZIndex, onHide: onHide, opened: opened, values: values })) : null] }));
|
|
143
151
|
});
|
|
144
152
|
exports.ContextMenu.displayName = 'ContextMenu';
|
|
@@ -41,6 +41,7 @@ const remotion_1 = require("remotion");
|
|
|
41
41
|
const colors_1 = require("../helpers/colors");
|
|
42
42
|
const noop_1 = require("../helpers/noop");
|
|
43
43
|
const canvas_ref_1 = require("../state/canvas-ref");
|
|
44
|
+
const scale_lock_1 = require("../state/scale-lock");
|
|
44
45
|
const timeline_zoom_1 = require("../state/timeline-zoom");
|
|
45
46
|
const z_index_1 = require("../state/z-index");
|
|
46
47
|
const EditorContent_1 = require("./EditorContent");
|
|
@@ -65,7 +66,8 @@ exports.BUFFER_STATE_DELAY_IN_MILLISECONDS = typeof process.env.BUFFER_STATE_DEL
|
|
|
65
66
|
? DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS
|
|
66
67
|
: Number(process.env.BUFFER_STATE_DELAY_IN_MILLISECONDS);
|
|
67
68
|
const Editor = ({ Root, readOnlyStudio }) => {
|
|
68
|
-
const
|
|
69
|
+
const [drawElement, setDrawElement] = (0, react_1.useState)(null);
|
|
70
|
+
const size = player_1.PlayerInternals.useElementSize(drawElement, {
|
|
69
71
|
triggerOnWindowResize: false,
|
|
70
72
|
shouldApplyCssTransforms: true,
|
|
71
73
|
});
|
|
@@ -73,6 +75,12 @@ const Editor = ({ Root, readOnlyStudio }) => {
|
|
|
73
75
|
const onMounted = (0, react_1.useCallback)(() => {
|
|
74
76
|
setCanvasMounted(true);
|
|
75
77
|
}, []);
|
|
78
|
+
// Use a callback ref so the late-mounted canvas container triggers a render
|
|
79
|
+
// and useElementSize() can observe it. See GitHub issue #8098.
|
|
80
|
+
const setDrawRef = (0, react_1.useCallback)((node) => {
|
|
81
|
+
canvas_ref_1.drawRef.current = node;
|
|
82
|
+
setDrawElement(node);
|
|
83
|
+
}, []);
|
|
76
84
|
const value = (0, react_1.useMemo)(() => {
|
|
77
85
|
if (!size) {
|
|
78
86
|
return null;
|
|
@@ -93,11 +101,11 @@ const Editor = ({ Root, readOnlyStudio }) => {
|
|
|
93
101
|
const renderErrorContextValue = (0, react_1.useMemo)(() => ({ error: renderError }), [renderError]);
|
|
94
102
|
return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: noop_1.noop, onOutsideClick: noop_1.noop, children: jsx_runtime_1.jsx(timeline_zoom_1.TimelineZoomContext, { children: jsx_runtime_1.jsxs(SequencePropsSubscriptionProvider_1.SequencePropsSubscriptionProvider, { children: [
|
|
95
103
|
jsx_runtime_1.jsxs(remotion_1.Internals.CurrentScaleContext.Provider, { value: value, children: [
|
|
96
|
-
jsx_runtime_1.jsx(ForceSpecificCursor_1.ForceSpecificCursor, {}), jsx_runtime_1.jsxs("div", { style: background, children: [
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
104
|
+
jsx_runtime_1.jsx(ForceSpecificCursor_1.ForceSpecificCursor, {}), jsx_runtime_1.jsx(scale_lock_1.ScaleLockProvider, { children: jsx_runtime_1.jsxs("div", { style: background, children: [
|
|
105
|
+
jsx_runtime_1.jsx(remotion_1.Internals.CompositionRenderErrorContext.Provider, { value: compositionRenderErrorContextValue, children: canvasMounted ? jsx_runtime_1.jsx(MemoRoot, {}) : null }), jsx_runtime_1.jsxs(remotion_1.Internals.CanUseRemotionHooksProvider, { children: [
|
|
106
|
+
jsx_runtime_1.jsx(RenderErrorContext_1.RenderErrorContext.Provider, { value: renderErrorContextValue, children: jsx_runtime_1.jsx(EditorContent_1.EditorContent, { readOnlyStudio: readOnlyStudio, children: jsx_runtime_1.jsx(TopPanel_1.TopPanel, { drawRef: setDrawRef, bufferStateDelayInMilliseconds: exports.BUFFER_STATE_DELAY_IN_MILLISECONDS, onMounted: onMounted, readOnlyStudio: readOnlyStudio }) }) }), jsx_runtime_1.jsx(GlobalKeybindings_1.GlobalKeybindings, {})
|
|
107
|
+
] })
|
|
108
|
+
] }) })
|
|
101
109
|
] }), jsx_runtime_1.jsx(Modals_1.Modals, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(NotificationCenter_1.NotificationCenter, {})
|
|
102
110
|
] }) }) }));
|
|
103
111
|
};
|
|
@@ -11,8 +11,10 @@ const modals_1 = require("../state/modals");
|
|
|
11
11
|
const AskAiModal_1 = require("./AskAiModal");
|
|
12
12
|
const InstallPackage_1 = require("./InstallPackage");
|
|
13
13
|
const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
|
|
14
|
+
const DeleteFolder_1 = require("./NewComposition/DeleteFolder");
|
|
14
15
|
const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
|
|
15
16
|
const RenameComposition_1 = require("./NewComposition/RenameComposition");
|
|
17
|
+
const RenameFolder_1 = require("./NewComposition/RenameFolder");
|
|
16
18
|
const OverrideInputProps_1 = require("./OverrideInputProps");
|
|
17
19
|
const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher"));
|
|
18
20
|
const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
|
|
@@ -24,7 +26,7 @@ const Modals = ({ readOnlyStudio }) => {
|
|
|
24
26
|
const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
25
27
|
const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState.type ===
|
|
26
28
|
'connected';
|
|
27
|
-
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
|
|
29
|
+
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
|
|
28
30
|
modalContextType.type === 'server-render' &&
|
|
29
31
|
(canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), process.env.ASK_AI_ENABLED && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
|
|
30
32
|
};
|
|
@@ -70,7 +70,7 @@ const CodemodFooter = ({ codemod, stack, valid, loadingNotification, successNoti
|
|
|
70
70
|
if (!stack) {
|
|
71
71
|
setCanApplyCodemod({
|
|
72
72
|
type: 'fail',
|
|
73
|
-
error: 'Could not determine where this
|
|
73
|
+
error: 'Could not determine where this item is defined',
|
|
74
74
|
});
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
@@ -80,7 +80,7 @@ const CodemodFooter = ({ codemod, stack, valid, loadingNotification, successNoti
|
|
|
80
80
|
if (!symbolicatedStack) {
|
|
81
81
|
setCanApplyCodemod({
|
|
82
82
|
type: 'fail',
|
|
83
|
-
error: 'Could not resolve the source location of this
|
|
83
|
+
error: 'Could not resolve the source location of this item',
|
|
84
84
|
});
|
|
85
85
|
return;
|
|
86
86
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DeleteFolder = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const get_folder_id_1 = require("../../helpers/get-folder-id");
|
|
7
|
+
const styles_1 = require("../Menu/styles");
|
|
8
|
+
const ModalFooter_1 = require("../ModalFooter");
|
|
9
|
+
const ModalHeader_1 = require("../ModalHeader");
|
|
10
|
+
const CodemodFooter_1 = require("./CodemodFooter");
|
|
11
|
+
const DismissableModal_1 = require("./DismissableModal");
|
|
12
|
+
const content = {
|
|
13
|
+
padding: 16,
|
|
14
|
+
fontSize: 14,
|
|
15
|
+
flex: 1,
|
|
16
|
+
minWidth: 500,
|
|
17
|
+
};
|
|
18
|
+
const DeleteFolder = ({ folderName, parentName, stack }) => {
|
|
19
|
+
const codemod = (0, react_1.useMemo)(() => {
|
|
20
|
+
return {
|
|
21
|
+
type: 'delete-folder',
|
|
22
|
+
folderName,
|
|
23
|
+
parentName,
|
|
24
|
+
};
|
|
25
|
+
}, [folderName, parentName]);
|
|
26
|
+
const onSubmit = (0, react_1.useCallback)((e) => {
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
}, []);
|
|
29
|
+
const folderId = (0, get_folder_id_1.getFolderId)({ folderName, parentName });
|
|
30
|
+
return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
|
|
31
|
+
jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: 'Delete folder' }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
|
|
32
|
+
jsx_runtime_1.jsxs("div", { style: content, children: ["Do you want to delete the", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: "Folder" }),
|
|
33
|
+
" with ID ", '"', folderId, '"', "?",
|
|
34
|
+
jsx_runtime_1.jsx("br", {}),
|
|
35
|
+
"The compositions and nested folders inside it will stay in your code."] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { errorNotification: `Could not delete folder`, loadingNotification: 'Deleting folder', successNotification: `Deleted folder ${folderId}`, genericSubmitLabel: `Delete`, submitLabel: ({ relativeRootPath }) => `Delete from ${relativeRootPath}`, codemod: codemod, stack: stack, valid: true, onSuccess: null }) })
|
|
36
|
+
] })
|
|
37
|
+
] }));
|
|
38
|
+
};
|
|
39
|
+
exports.DeleteFolder = DeleteFolder;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenameFolder = 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 get_folder_id_1 = require("../../helpers/get-folder-id");
|
|
8
|
+
const validate_folder_rename_1 = require("../../helpers/validate-folder-rename");
|
|
9
|
+
const layout_1 = require("../layout");
|
|
10
|
+
const ModalFooter_1 = require("../ModalFooter");
|
|
11
|
+
const ModalHeader_1 = require("../ModalHeader");
|
|
12
|
+
const layout_2 = require("../RenderModal/layout");
|
|
13
|
+
const CodemodFooter_1 = require("./CodemodFooter");
|
|
14
|
+
const DismissableModal_1 = require("./DismissableModal");
|
|
15
|
+
const RemInput_1 = require("./RemInput");
|
|
16
|
+
const ValidationMessage_1 = require("./ValidationMessage");
|
|
17
|
+
const content = {
|
|
18
|
+
padding: 12,
|
|
19
|
+
paddingRight: 12,
|
|
20
|
+
flex: 1,
|
|
21
|
+
fontSize: 13,
|
|
22
|
+
minWidth: 500,
|
|
23
|
+
};
|
|
24
|
+
const RenameFolder = ({ folderName, parentName, stack }) => {
|
|
25
|
+
const { folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
26
|
+
const [newName, setName] = (0, react_1.useState)(folderName);
|
|
27
|
+
const onNameChange = (0, react_1.useCallback)((e) => {
|
|
28
|
+
setName(e.target.value);
|
|
29
|
+
}, []);
|
|
30
|
+
const folderNameErrMessage = (0, validate_folder_rename_1.validateFolderRename)({
|
|
31
|
+
folders,
|
|
32
|
+
newName,
|
|
33
|
+
originalName: folderName,
|
|
34
|
+
parentName,
|
|
35
|
+
});
|
|
36
|
+
const valid = folderNameErrMessage === null && folderName !== newName;
|
|
37
|
+
const codemod = (0, react_1.useMemo)(() => {
|
|
38
|
+
return {
|
|
39
|
+
type: 'rename-folder',
|
|
40
|
+
folderName,
|
|
41
|
+
parentName,
|
|
42
|
+
newName,
|
|
43
|
+
};
|
|
44
|
+
}, [folderName, newName, parentName]);
|
|
45
|
+
const onSubmit = (0, react_1.useCallback)((e) => {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
}, []);
|
|
48
|
+
const folderId = (0, get_folder_id_1.getFolderId)({ folderName, parentName });
|
|
49
|
+
return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
|
|
50
|
+
jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: `Rename ${folderId}` }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
|
|
51
|
+
jsx_runtime_1.jsx("div", { style: content, children: jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
|
|
52
|
+
jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Name" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { children: [
|
|
53
|
+
jsx_runtime_1.jsx(RemInput_1.RemotionInput, { value: newName, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Folder name", status: "ok", rightAlign: true }), folderNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
54
|
+
jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: folderNameErrMessage, type: "error" })
|
|
55
|
+
] })) : null] }) })
|
|
56
|
+
] }) }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: 'Renaming folder...', errorNotification: 'Could not rename folder', successNotification: `Renamed folder to ${newName}`, genericSubmitLabel: 'Rename', submitLabel: ({ relativeRootPath }) => `Modify ${relativeRootPath}`, codemod: codemod, stack: stack, valid: valid, onSuccess: null }) })
|
|
57
|
+
] })
|
|
58
|
+
] }));
|
|
59
|
+
};
|
|
60
|
+
exports.RenameFolder = RenameFolder;
|