@remotion/studio 4.0.473 → 4.0.474
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/AssetSelectorItem.js +30 -6
- package/dist/components/Canvas.js +71 -0
- package/dist/components/Modals.js +1 -2
- package/dist/components/NewComposition/InputDragger.d.ts +1 -0
- package/dist/components/NewComposition/InputDragger.js +9 -6
- package/dist/components/SelectedOutlineOverlay.d.ts +7 -5
- package/dist/components/SelectedOutlineOverlay.js +78 -67
- package/dist/components/Timeline/KeyframeSettingsModal.js +4 -4
- package/dist/components/Timeline/SequencePropsObserver.js +3 -3
- package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +7 -7
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +19 -16
- package/dist/components/Timeline/TimelineDeleteKeybindings.js +11 -9
- package/dist/components/Timeline/TimelineEffectItem.js +7 -7
- package/dist/components/Timeline/TimelineEffectPropItem.js +17 -17
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +6 -1
- package/dist/components/Timeline/TimelineExpandedSection.js +5 -5
- package/dist/components/Timeline/TimelineKeyframeControls.js +8 -8
- package/dist/components/Timeline/TimelineKeyframeDiamond.js +0 -1
- package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +9 -0
- package/dist/components/Timeline/TimelineKeyframeEasingLine.js +120 -0
- package/dist/components/Timeline/TimelineKeyframedValue.js +1 -1
- package/dist/components/Timeline/TimelineNumberField.js +15 -7
- package/dist/components/Timeline/TimelineRotationField.js +17 -11
- package/dist/components/Timeline/TimelineScaleField.js +16 -12
- package/dist/components/Timeline/TimelineSelection.d.ts +15 -0
- package/dist/components/Timeline/TimelineSelection.js +26 -1
- package/dist/components/Timeline/TimelineSequence.js +6 -6
- package/dist/components/Timeline/TimelineSequenceItem.js +21 -14
- package/dist/components/Timeline/TimelineSequencePropItem.js +37 -37
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +5 -5
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +46 -44
- package/dist/components/Timeline/TimelineTranslateField.js +24 -19
- package/dist/components/Timeline/TimelineUvCoordinateField.js +18 -12
- package/dist/components/Timeline/{apply-effect-response-to-code-values.d.ts → apply-effect-response-to-prop-statuses.d.ts} +1 -1
- package/dist/components/Timeline/{apply-effect-response-to-code-values.js → apply-effect-response-to-prop-statuses.js} +3 -3
- package/dist/components/Timeline/call-add-keyframe.d.ts +5 -5
- package/dist/components/Timeline/call-add-keyframe.js +6 -6
- package/dist/components/Timeline/call-delete-keyframe.d.ts +7 -7
- package/dist/components/Timeline/call-delete-keyframe.js +7 -7
- package/dist/components/Timeline/call-move-keyframe.d.ts +3 -3
- package/dist/components/Timeline/call-move-keyframe.js +3 -3
- package/dist/components/Timeline/call-update-keyframe-settings.d.ts +5 -5
- package/dist/components/Timeline/call-update-keyframe-settings.js +6 -6
- package/dist/components/Timeline/delete-selected-keyframe.d.ts +5 -5
- package/dist/components/Timeline/delete-selected-keyframe.js +5 -5
- package/dist/components/Timeline/delete-selected-timeline-item.d.ts +5 -5
- package/dist/components/Timeline/delete-selected-timeline-item.js +6 -4
- package/dist/components/Timeline/get-node-keyframes.d.ts +3 -3
- package/dist/components/Timeline/get-node-keyframes.js +4 -4
- package/dist/components/Timeline/get-timeline-easing-segments.d.ts +9 -0
- package/dist/components/Timeline/get-timeline-easing-segments.js +19 -0
- package/dist/components/Timeline/reset-selected-timeline-props.d.ts +7 -7
- package/dist/components/Timeline/reset-selected-timeline-props.js +10 -10
- package/dist/components/Timeline/save-effect-prop.d.ts +2 -2
- package/dist/components/Timeline/save-effect-prop.js +5 -5
- package/dist/components/Timeline/save-prop-queue.d.ts +3 -3
- package/dist/components/Timeline/save-prop-queue.js +3 -3
- package/dist/components/Timeline/save-sequence-prop.d.ts +3 -3
- package/dist/components/Timeline/save-sequence-prop.js +4 -4
- package/dist/components/Timeline/timeline-field-utils.d.ts +10 -0
- package/dist/components/Timeline/timeline-field-utils.js +26 -5
- package/dist/components/Timeline/timeline-translate-utils.d.ts +1 -1
- package/dist/components/Timeline/timeline-translate-utils.js +4 -5
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +7 -7
- package/dist/components/Timeline/use-sequence-props-subscription.js +3 -3
- package/dist/components/Timeline/use-timeline-height.js +3 -3
- package/dist/components/Timeline/use-timeline-keyframe-drag.js +13 -11
- package/dist/components/import-assets.d.ts +15 -0
- package/dist/components/import-assets.js +63 -1
- package/dist/esm/{chunk-q0jkt0zq.js → chunk-xjvc8qen.js} +1708 -1394
- package/dist/esm/internals.mjs +1708 -1394
- package/dist/esm/previewEntry.mjs +1711 -1397
- package/dist/esm/renderEntry.mjs +1 -1
- package/dist/helpers/timeline-layout.d.ts +6 -6
- package/dist/helpers/timeline-layout.js +5 -5
- package/dist/state/modals.d.ts +0 -3
- package/package.json +10 -10
- package/dist/components/NewComposition/DeleteStaticFile.d.ts +0 -4
- package/dist/components/NewComposition/DeleteStaticFile.js +0 -44
|
@@ -39,6 +39,7 @@ const studio_shared_1 = require("@remotion/studio-shared");
|
|
|
39
39
|
const react_1 = require("react");
|
|
40
40
|
const remotion_1 = require("remotion");
|
|
41
41
|
const no_react_1 = require("remotion/no-react");
|
|
42
|
+
const delete_static_file_1 = require("../api/delete-static-file");
|
|
42
43
|
const client_id_1 = require("../helpers/client-id");
|
|
43
44
|
const colors_1 = require("../helpers/colors");
|
|
44
45
|
const copy_text_1 = require("../helpers/copy-text");
|
|
@@ -51,10 +52,12 @@ const file_1 = require("../icons/file");
|
|
|
51
52
|
const folder_1 = require("../icons/folder");
|
|
52
53
|
const modals_1 = require("../state/modals");
|
|
53
54
|
const sidebar_1 = require("../state/sidebar");
|
|
55
|
+
const ConfirmationDialog_1 = require("./ConfirmationDialog");
|
|
54
56
|
const ContextMenu_1 = require("./ContextMenu");
|
|
55
57
|
const import_assets_1 = require("./import-assets");
|
|
56
58
|
const InlineAction_1 = require("./InlineAction");
|
|
57
59
|
const layout_1 = require("./layout");
|
|
60
|
+
const styles_1 = require("./Menu/styles");
|
|
58
61
|
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
59
62
|
const actions_1 = require("./RenderQueue/actions");
|
|
60
63
|
const ASSET_ITEM_HEIGHT = 32;
|
|
@@ -167,6 +170,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
|
|
|
167
170
|
const [isDragging, setIsDragging] = (0, react_1.useState)(false);
|
|
168
171
|
const { setSidebarCollapsedState } = (0, react_1.useContext)(sidebar_1.SidebarContext);
|
|
169
172
|
const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
173
|
+
const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
|
|
170
174
|
const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
|
|
171
175
|
.previewServerState.type;
|
|
172
176
|
const onPointerEnter = (0, react_1.useCallback)(() => {
|
|
@@ -279,6 +283,30 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
|
|
|
279
283
|
});
|
|
280
284
|
}, [relativePath]);
|
|
281
285
|
const serverActionDisabled = readOnlyStudio || connectionStatus !== 'connected';
|
|
286
|
+
const deleteAsset = (0, react_1.useCallback)(() => {
|
|
287
|
+
confirm({
|
|
288
|
+
title: 'Delete asset',
|
|
289
|
+
message: (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: ["Do you want to delete the asset", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: relativePath }),
|
|
290
|
+
" from your public folder?"] })),
|
|
291
|
+
confirmLabel: 'Delete',
|
|
292
|
+
})
|
|
293
|
+
.then((confirmed) => {
|
|
294
|
+
if (!confirmed) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
const notification = (0, NotificationCenter_1.showNotification)(`Deleting ${relativePath}...`, null);
|
|
298
|
+
(0, delete_static_file_1.deleteStaticFile)(relativePath)
|
|
299
|
+
.then(() => {
|
|
300
|
+
notification.replaceContent(`Deleted ${relativePath}`, 2000);
|
|
301
|
+
})
|
|
302
|
+
.catch((err) => {
|
|
303
|
+
notification.replaceContent(`Could not delete ${relativePath}: ${err.message}`, 3000);
|
|
304
|
+
});
|
|
305
|
+
})
|
|
306
|
+
.catch((err) => {
|
|
307
|
+
(0, NotificationCenter_1.showNotification)(`Could not delete ${relativePath}: ${err.message}`, 3000);
|
|
308
|
+
});
|
|
309
|
+
}, [confirm, relativePath]);
|
|
282
310
|
const contextMenu = (0, react_1.useMemo)(() => {
|
|
283
311
|
return [
|
|
284
312
|
{
|
|
@@ -341,12 +369,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
|
|
|
341
369
|
keyHint: null,
|
|
342
370
|
label: 'Delete...',
|
|
343
371
|
leftItem: null,
|
|
344
|
-
onClick:
|
|
345
|
-
setSelectedModal({
|
|
346
|
-
type: 'delete-static-file',
|
|
347
|
-
relativePath,
|
|
348
|
-
});
|
|
349
|
-
},
|
|
372
|
+
onClick: deleteAsset,
|
|
350
373
|
quickSwitcherLabel: 'Delete asset...',
|
|
351
374
|
subMenu: null,
|
|
352
375
|
type: 'item',
|
|
@@ -358,6 +381,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
|
|
|
358
381
|
copyFileName,
|
|
359
382
|
copyStaticFilePath,
|
|
360
383
|
openAssetInExplorer,
|
|
384
|
+
deleteAsset,
|
|
361
385
|
relativePath,
|
|
362
386
|
serverActionDisabled,
|
|
363
387
|
setSelectedModal,
|
|
@@ -51,9 +51,21 @@ const isAssetDragEvent = (event) => {
|
|
|
51
51
|
var _b;
|
|
52
52
|
return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.ASSET_DRAG_MIME_TYPE);
|
|
53
53
|
};
|
|
54
|
+
const isComponentDragEvent = (event) => {
|
|
55
|
+
var _a;
|
|
56
|
+
var _b;
|
|
57
|
+
return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.COMPONENT_DRAG_MIME_TYPE);
|
|
58
|
+
};
|
|
59
|
+
const isSfxDragEvent = (event) => {
|
|
60
|
+
var _a;
|
|
61
|
+
var _b;
|
|
62
|
+
return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.SFX_DRAG_MIME_TYPE);
|
|
63
|
+
};
|
|
54
64
|
const isRemoteAssetDragEvent = (event) => {
|
|
55
65
|
return (!isFileDragEvent(event) &&
|
|
56
66
|
!isAssetDragEvent(event) &&
|
|
67
|
+
!isComponentDragEvent(event) &&
|
|
68
|
+
!isSfxDragEvent(event) &&
|
|
57
69
|
(0, remote_asset_drag_1.hasRemoteAssetDragData)(event.dataTransfer));
|
|
58
70
|
};
|
|
59
71
|
const getAssetDragPath = (event) => {
|
|
@@ -65,6 +77,41 @@ const getAssetDragPath = (event) => {
|
|
|
65
77
|
}
|
|
66
78
|
return (_c = (_b = (0, studio_shared_1.parseAssetDragData)(value)) === null || _b === void 0 ? void 0 : _b.assetPath) !== null && _c !== void 0 ? _c : null;
|
|
67
79
|
};
|
|
80
|
+
const getComponentDragData = (event) => {
|
|
81
|
+
var _a;
|
|
82
|
+
for (const type of [
|
|
83
|
+
studio_shared_1.COMPONENT_DRAG_MIME_TYPE,
|
|
84
|
+
'application/json',
|
|
85
|
+
'text/plain',
|
|
86
|
+
]) {
|
|
87
|
+
const value = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(type);
|
|
88
|
+
if (!value) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const parsed = (0, studio_shared_1.parseComponentDragData)(value);
|
|
92
|
+
if (parsed) {
|
|
93
|
+
return parsed;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
};
|
|
98
|
+
const getSfxDragUrl = (event) => {
|
|
99
|
+
const { dataTransfer } = event;
|
|
100
|
+
if (!dataTransfer) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
for (const type of [studio_shared_1.SFX_DRAG_MIME_TYPE, 'application/json', 'text/plain']) {
|
|
104
|
+
const value = dataTransfer.getData(type);
|
|
105
|
+
if (!value) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const parsed = (0, studio_shared_1.parseSfxDragData)(value);
|
|
109
|
+
if (parsed) {
|
|
110
|
+
return parsed.sfx.url;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return null;
|
|
114
|
+
};
|
|
68
115
|
const isDragEventInsideCanvas = (event) => {
|
|
69
116
|
const { current } = canvas_ref_1.canvasRef;
|
|
70
117
|
if (!current) {
|
|
@@ -490,6 +537,8 @@ const Canvas = ({ canvasContent, size }) => {
|
|
|
490
537
|
if (!canDropAssets ||
|
|
491
538
|
(!isFileDragEvent(event) &&
|
|
492
539
|
!isAssetDragEvent(event) &&
|
|
540
|
+
!isComponentDragEvent(event) &&
|
|
541
|
+
!isSfxDragEvent(event) &&
|
|
493
542
|
!isRemoteAssetDragEvent(event)) ||
|
|
494
543
|
!isDragEventInsideCanvas(event)) {
|
|
495
544
|
return;
|
|
@@ -507,6 +556,8 @@ const Canvas = ({ canvasContent, size }) => {
|
|
|
507
556
|
currentCompositionId === null ||
|
|
508
557
|
(!isFileDragEvent(event) &&
|
|
509
558
|
!isAssetDragEvent(event) &&
|
|
559
|
+
!isComponentDragEvent(event) &&
|
|
560
|
+
!isSfxDragEvent(event) &&
|
|
510
561
|
!isRemoteAssetDragEvent(event)) ||
|
|
511
562
|
!isDragEventInsideCanvas(event)) {
|
|
512
563
|
return;
|
|
@@ -537,7 +588,27 @@ const Canvas = ({ canvasContent, size }) => {
|
|
|
537
588
|
compositionId: currentCompositionId,
|
|
538
589
|
});
|
|
539
590
|
}
|
|
591
|
+
else if (isSfxDragEvent(event)) {
|
|
592
|
+
const url = getSfxDragUrl(event);
|
|
593
|
+
if (url === null) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
await (0, import_assets_1.insertRemoteAudio)({
|
|
597
|
+
url,
|
|
598
|
+
compositionFile,
|
|
599
|
+
compositionId: currentCompositionId,
|
|
600
|
+
});
|
|
601
|
+
}
|
|
540
602
|
else {
|
|
603
|
+
const componentDragData = getComponentDragData(event);
|
|
604
|
+
if (componentDragData !== null) {
|
|
605
|
+
await (0, import_assets_1.insertComponent)({
|
|
606
|
+
component: componentDragData.component,
|
|
607
|
+
compositionFile,
|
|
608
|
+
compositionId: currentCompositionId,
|
|
609
|
+
});
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
541
612
|
const url = (0, remote_asset_drag_1.getRemoteAssetUrlFromDataTransfer)(event.dataTransfer);
|
|
542
613
|
if (url === null) {
|
|
543
614
|
return;
|
|
@@ -13,7 +13,6 @@ const ConfirmationDialog_1 = require("./ConfirmationDialog");
|
|
|
13
13
|
const InstallPackage_1 = require("./InstallPackage");
|
|
14
14
|
const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
|
|
15
15
|
const DeleteFolder_1 = require("./NewComposition/DeleteFolder");
|
|
16
|
-
const DeleteStaticFile_1 = require("./NewComposition/DeleteStaticFile");
|
|
17
16
|
const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
|
|
18
17
|
const RenameComposition_1 = require("./NewComposition/RenameComposition");
|
|
19
18
|
const RenameFolder_1 = require("./NewComposition/RenameFolder");
|
|
@@ -30,7 +29,7 @@ const Modals = ({ readOnlyStudio }) => {
|
|
|
30
29
|
const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
31
30
|
const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState.type ===
|
|
32
31
|
'connected';
|
|
33
|
-
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 === '
|
|
32
|
+
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 === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'keyframe-settings' && (jsx_runtime_1.jsx(KeyframeSettingsModal_1.KeyframeSettingsModal, { state: modalContextType })), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
|
|
34
33
|
modalContextType.type === 'server-render' &&
|
|
35
34
|
(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 })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), process.env.ASK_AI_ENABLED && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
|
|
36
35
|
};
|
|
@@ -9,4 +9,5 @@ export declare const InputDragger: React.ForwardRefExoticComponent<InputHTMLAttr
|
|
|
9
9
|
readonly formatter?: ((str: string | number) => string) | undefined;
|
|
10
10
|
readonly rightAlign: boolean;
|
|
11
11
|
readonly small?: boolean | undefined;
|
|
12
|
+
readonly snapToStep?: boolean | undefined;
|
|
12
13
|
} & React.RefAttributes<HTMLButtonElement>>;
|
|
@@ -46,7 +46,7 @@ const RemInput_1 = require("./RemInput");
|
|
|
46
46
|
const isInt = (num) => {
|
|
47
47
|
return num % 1 === 0;
|
|
48
48
|
};
|
|
49
|
-
const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min, max: _max, step: _step, value, onTextChange, formatter = (q) => String(q), status, rightAlign, small, ...props }, ref) => {
|
|
49
|
+
const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min, max: _max, step: _step, value, onTextChange, formatter = (q) => String(q), status, rightAlign, small, snapToStep = true, ...props }, ref) => {
|
|
50
50
|
const [inputFallback, setInputFallback] = (0, react_1.useState)(false);
|
|
51
51
|
const [dragging, setDragging] = (0, react_1.useState)(false);
|
|
52
52
|
const fallbackRef = (0, react_1.useRef)(null);
|
|
@@ -142,9 +142,9 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
|
|
|
142
142
|
}
|
|
143
143
|
const diff = (0, remotion_1.interpolate)(xDistance, [-5, -4, 0, 4, 5], [-step, 0, 0, 0, step]);
|
|
144
144
|
const newValue = Math.min(max, Math.max(min, Number(value) + diff));
|
|
145
|
-
const
|
|
146
|
-
lastDragValue =
|
|
147
|
-
onValueChange(
|
|
145
|
+
const nextValue = snapToStep ? roundToStep(newValue, step) : newValue;
|
|
146
|
+
lastDragValue = nextValue;
|
|
147
|
+
onValueChange(nextValue);
|
|
148
148
|
};
|
|
149
149
|
window.addEventListener('mousemove', moveListener);
|
|
150
150
|
window.addEventListener('pointerup', () => {
|
|
@@ -161,7 +161,7 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
|
|
|
161
161
|
}, {
|
|
162
162
|
once: true,
|
|
163
163
|
});
|
|
164
|
-
}, [_step, _min, _max, value, onValueChange, onValueChangeEnd]);
|
|
164
|
+
}, [_step, _min, _max, value, onValueChange, onValueChangeEnd, snapToStep]);
|
|
165
165
|
(0, react_1.useEffect)(() => {
|
|
166
166
|
var _a;
|
|
167
167
|
if (inputFallback) {
|
|
@@ -169,6 +169,9 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
|
|
|
169
169
|
}
|
|
170
170
|
}, [inputFallback]);
|
|
171
171
|
const deriveStep = (0, react_1.useMemo)(() => {
|
|
172
|
+
if (!snapToStep) {
|
|
173
|
+
return 'any';
|
|
174
|
+
}
|
|
172
175
|
if (_step !== undefined) {
|
|
173
176
|
return _step;
|
|
174
177
|
}
|
|
@@ -176,7 +179,7 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
|
|
|
176
179
|
return 1;
|
|
177
180
|
}
|
|
178
181
|
return 0.0001;
|
|
179
|
-
}, [_min, _step]);
|
|
182
|
+
}, [_min, _step, snapToStep]);
|
|
180
183
|
if (inputFallback) {
|
|
181
184
|
return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onEscape, onOutsideClick: noop_1.noop, children: jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: fallbackRef, autoFocus: true, onKeyPress: onKeyPress, onBlur: onBlur, onChange: onInputChange, min: _min, max: _max, step: deriveStep, defaultValue: value, status: status, pattern: '[0-9]*[.]?[0-9]*', rightAlign: rightAlign, ...props, ...(small ? { style: { padding: '4px 6px', fontSize: 12 } } : {}) }) }));
|
|
182
185
|
}
|
|
@@ -7,13 +7,13 @@ type OutlinePoint = {
|
|
|
7
7
|
readonly x: number;
|
|
8
8
|
readonly y: number;
|
|
9
9
|
};
|
|
10
|
-
type UvCoordinate = readonly [number, number];
|
|
11
|
-
type UvCoordinateFieldSchema = Extract<SequenceFieldSchema, {
|
|
10
|
+
export type UvCoordinate = readonly [number, number];
|
|
11
|
+
export type UvCoordinateFieldSchema = Extract<SequenceFieldSchema, {
|
|
12
12
|
type: 'uv-coordinate';
|
|
13
13
|
}>;
|
|
14
14
|
type SelectedOutlineUvHandle = {
|
|
15
15
|
readonly clientId: string;
|
|
16
|
-
readonly
|
|
16
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic;
|
|
17
17
|
readonly effectIndex: number;
|
|
18
18
|
readonly fieldDefault: UvCoordinate | undefined;
|
|
19
19
|
readonly fieldKey: string;
|
|
@@ -29,7 +29,7 @@ type UvHandleConnectionLine = {
|
|
|
29
29
|
readonly to: OutlinePoint;
|
|
30
30
|
};
|
|
31
31
|
type SelectedOutlineDragTarget = {
|
|
32
|
-
readonly
|
|
32
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic | CanUpdateSequencePropStatusKeyframed;
|
|
33
33
|
readonly clientId: string;
|
|
34
34
|
readonly fieldDefault: string | undefined;
|
|
35
35
|
readonly keyframeDisplayOffset: number;
|
|
@@ -40,7 +40,7 @@ type ScaleFieldSchema = Extract<SequenceFieldSchema, {
|
|
|
40
40
|
type: 'scale';
|
|
41
41
|
}>;
|
|
42
42
|
type SelectedOutlineScaleDragTarget = {
|
|
43
|
-
readonly
|
|
43
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic;
|
|
44
44
|
readonly clientId: string;
|
|
45
45
|
readonly fieldDefault: number | string | undefined;
|
|
46
46
|
readonly fieldSchema: ScaleFieldSchema;
|
|
@@ -77,6 +77,8 @@ export declare const getUvHandleConnectionLines: ({ handles, points, }: {
|
|
|
77
77
|
readonly points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint];
|
|
78
78
|
}) => UvHandleConnectionLine[];
|
|
79
79
|
export declare const getUvCoordinateForPoint: (points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint], point: OutlinePoint) => UvCoordinate;
|
|
80
|
+
export declare function constrainUv(value: UvCoordinate, schema: UvCoordinateFieldSchema): UvCoordinate;
|
|
81
|
+
export declare const getSelectedSequenceKeys: (selectedItems: readonly TimelineSelection[]) => Set<string>;
|
|
80
82
|
export declare const getOutlineSelectionInteraction: ({ shiftKey, metaKey, ctrlKey, }: {
|
|
81
83
|
readonly shiftKey: boolean;
|
|
82
84
|
readonly metaKey: boolean;
|