@remotion/studio 4.0.472 → 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/api/rename-static-file.d.ts +6 -0
- package/dist/api/rename-static-file.js +18 -0
- package/dist/components/AssetSelector.js +45 -4
- package/dist/components/AssetSelectorItem.js +177 -27
- package/dist/components/Canvas.js +131 -11
- package/dist/components/ConfirmationDialog-types.d.ts +8 -0
- package/dist/components/ConfirmationDialog-types.js +2 -0
- package/dist/components/ConfirmationDialog.d.ts +7 -0
- package/dist/components/ConfirmationDialog.js +103 -0
- package/dist/components/ContextMenu.d.ts +9 -1
- package/dist/components/ContextMenu.js +49 -5
- package/dist/components/CurrentAsset.d.ts +1 -0
- package/dist/components/CurrentAsset.js +13 -2
- package/dist/components/EditorContent.js +15 -2
- package/dist/components/EditorContexts.js +2 -1
- package/dist/components/EditorRuler/Ruler.js +2 -0
- package/dist/components/ExplorerPanel.d.ts +0 -4
- package/dist/components/ExplorerPanel.js +8 -4
- package/dist/components/ExplorerPanelRef.d.ts +4 -0
- package/dist/components/ExplorerPanelRef.js +5 -0
- package/dist/components/FilePreview.d.ts +1 -1
- package/dist/components/InitialCompositionLoader.d.ts +0 -1
- package/dist/components/InitialCompositionLoader.js +5 -27
- package/dist/components/Menu/MenuItem.js +7 -1
- package/dist/components/Menu/SubMenu.js +5 -1
- package/dist/components/Menu/portals.js +17 -8
- package/dist/components/MenuToolbar.js +5 -1
- package/dist/components/ModalContainer.js +6 -1
- package/dist/components/Modals.js +5 -2
- package/dist/components/NewComposition/ComboBox.js +8 -2
- package/dist/components/NewComposition/InputDragger.d.ts +1 -0
- package/dist/components/NewComposition/InputDragger.js +9 -6
- package/dist/components/NewComposition/RenameStaticFile.d.ts +4 -0
- package/dist/components/NewComposition/RenameStaticFile.js +118 -0
- package/dist/components/OptionsPanel.js +5 -1
- package/dist/components/OutlineToggle.d.ts +2 -0
- package/dist/components/OutlineToggle.js +20 -0
- package/dist/components/Preview.d.ts +0 -2
- package/dist/components/Preview.js +23 -33
- package/dist/components/PreviewToolbar.js +19 -6
- package/dist/components/RenderButton.js +8 -2
- package/dist/components/RenderPreview.js +2 -2
- package/dist/components/SelectedOutlineOverlay.d.ts +29 -3
- package/dist/components/SelectedOutlineOverlay.js +259 -80
- package/dist/components/ShowOutlinesProvider.d.ts +4 -0
- package/dist/components/ShowOutlinesProvider.js +24 -0
- package/dist/components/SizeSelector.js +3 -3
- package/dist/components/Splitter/SplitterHandle.js +2 -0
- package/dist/components/StaticFilePreview.js +2 -2
- package/dist/components/Timeline/KeyframeSettingsModal.d.ts +15 -0
- package/dist/components/Timeline/KeyframeSettingsModal.js +150 -0
- package/dist/components/Timeline/SequencePropsObserver.js +3 -3
- package/dist/components/Timeline/Timeline.js +3 -13
- package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +26 -3
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +242 -25
- package/dist/components/Timeline/TimelineDeleteKeybindings.js +23 -11
- package/dist/components/Timeline/TimelineEffectItem.js +8 -7
- package/dist/components/Timeline/TimelineEffectPropItem.js +69 -19
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +6 -1
- package/dist/components/Timeline/TimelineExpandedSection.js +5 -5
- package/dist/components/Timeline/TimelineKeyframeControls.js +13 -23
- package/dist/components/Timeline/TimelineKeyframeDiamond.js +24 -22
- package/dist/components/Timeline/TimelineKeyframeDiamondIcon.d.ts +6 -0
- package/dist/components/Timeline/TimelineKeyframeDiamondIcon.js +14 -0
- package/dist/components/Timeline/TimelineKeyframeDragState.d.ts +17 -0
- package/dist/components/Timeline/TimelineKeyframeDragState.js +39 -0
- 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/TimelineList.js +2 -2
- package/dist/components/Timeline/TimelineMediaInfo.d.ts +0 -13
- package/dist/components/Timeline/TimelineMediaInfo.js +8 -73
- package/dist/components/Timeline/TimelineNumberField.js +15 -7
- package/dist/components/Timeline/TimelineRotationField.js +17 -11
- package/dist/components/Timeline/TimelineScaleField.js +17 -13
- 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.d.ts +1 -0
- package/dist/components/Timeline/TimelineSequenceItem.js +297 -36
- package/dist/components/Timeline/TimelineSequencePropItem.js +113 -48
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +5 -5
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +69 -70
- package/dist/components/Timeline/TimelineTranslateField.js +24 -19
- package/dist/components/Timeline/TimelineUvCoordinateField.js +18 -12
- package/dist/components/Timeline/apply-effect-response-to-prop-statuses.d.ts +5 -0
- package/dist/components/Timeline/apply-effect-response-to-prop-statuses.js +19 -0
- package/dist/components/Timeline/call-add-keyframe.d.ts +5 -5
- package/dist/components/Timeline/call-add-keyframe.js +6 -4
- 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 +19 -0
- package/dist/components/Timeline/call-move-keyframe.js +71 -0
- package/dist/components/Timeline/call-update-keyframe-settings.d.ts +22 -0
- package/dist/components/Timeline/call-update-keyframe-settings.js +52 -0
- 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 +10 -7
- package/dist/components/Timeline/delete-selected-timeline-item.js +37 -23
- package/dist/components/Timeline/duplicate-selected-timeline-item.d.ts +4 -2
- package/dist/components/Timeline/duplicate-selected-timeline-item.js +39 -34
- package/dist/components/Timeline/get-bounded-keyframe-drag-delta.d.ts +8 -0
- package/dist/components/Timeline/get-bounded-keyframe-drag-delta.js +12 -0
- package/dist/components/Timeline/get-keyframe-navigation.d.ts +2 -2
- package/dist/components/Timeline/get-keyframe-navigation.js +14 -6
- 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 +13 -12
- package/dist/components/Timeline/save-effect-prop.d.ts +16 -5
- package/dist/components/Timeline/save-effect-prop.js +37 -19
- package/dist/components/Timeline/save-prop-queue.d.ts +4 -3
- package/dist/components/Timeline/save-prop-queue.js +6 -3
- package/dist/components/Timeline/save-sequence-prop.d.ts +5 -10
- package/dist/components/Timeline/save-sequence-prop.js +35 -32
- package/dist/components/Timeline/should-clear-selection-on-pointer-down.d.ts +3 -0
- package/dist/components/Timeline/should-clear-selection-on-pointer-down.js +7 -0
- package/dist/components/Timeline/timeline-asset-link.d.ts +13 -0
- package/dist/components/Timeline/timeline-asset-link.js +37 -0
- 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 +6 -4
- 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.d.ts +10 -0
- package/dist/components/Timeline/use-timeline-keyframe-drag.js +380 -0
- package/dist/components/import-assets.d.ts +31 -0
- package/dist/components/import-assets.js +216 -17
- package/dist/components/load-canvas-content-from-url.d.ts +1 -0
- package/dist/components/load-canvas-content-from-url.js +9 -3
- package/dist/components/use-select-asset.d.ts +1 -0
- package/dist/components/use-select-asset.js +30 -0
- package/dist/error-overlay/error-origin.d.ts +3 -0
- package/dist/error-overlay/error-origin.js +42 -0
- package/dist/error-overlay/react-overlay/listen-to-runtime-errors.js +6 -2
- package/dist/error-overlay/remotion-overlay/ErrorLoader.js +38 -0
- package/dist/error-overlay/remotion-overlay/ShortcutHint.js +1 -1
- package/dist/error-overlay/remotion-overlay/log-studio-error.d.ts +3 -0
- package/dist/error-overlay/remotion-overlay/log-studio-error.js +27 -0
- package/dist/esm/{chunk-48grt472.js → chunk-xjvc8qen.js} +21838 -18862
- package/dist/esm/internals.mjs +21838 -18862
- package/dist/esm/previewEntry.mjs +21127 -18127
- package/dist/esm/renderEntry.mjs +1 -1
- package/dist/helpers/get-asset-metadata.js +2 -2
- package/dist/helpers/get-preview-file-type.d.ts +2 -0
- package/dist/helpers/get-preview-file-type.js +33 -0
- package/dist/helpers/install-required-package.d.ts +1 -0
- package/dist/helpers/install-required-package.js +39 -0
- package/dist/helpers/remote-asset-drag.d.ts +4 -0
- package/dist/helpers/remote-asset-drag.js +73 -0
- package/dist/helpers/timeline-layout.d.ts +6 -6
- package/dist/helpers/timeline-layout.js +5 -5
- package/dist/helpers/use-asset-drag-events.d.ts +5 -2
- package/dist/helpers/use-asset-drag-events.js +13 -2
- package/dist/hot-middleware-client/client.js +6 -0
- package/dist/state/editor-outlines.d.ts +8 -0
- package/dist/state/editor-outlines.js +18 -0
- package/dist/state/modals.d.ts +16 -2
- package/package.json +10 -10
- package/dist/helpers/detect-file-type.d.ts +0 -69
- package/dist/helpers/detect-file-type.js +0 -278
|
@@ -9,25 +9,28 @@ const react_1 = require("react");
|
|
|
9
9
|
const client_id_1 = require("../helpers/client-id");
|
|
10
10
|
const modals_1 = require("../state/modals");
|
|
11
11
|
const AskAiModal_1 = require("./AskAiModal");
|
|
12
|
+
const ConfirmationDialog_1 = require("./ConfirmationDialog");
|
|
12
13
|
const InstallPackage_1 = require("./InstallPackage");
|
|
13
14
|
const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
|
|
14
15
|
const DeleteFolder_1 = require("./NewComposition/DeleteFolder");
|
|
15
16
|
const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
|
|
16
17
|
const RenameComposition_1 = require("./NewComposition/RenameComposition");
|
|
17
18
|
const RenameFolder_1 = require("./NewComposition/RenameFolder");
|
|
19
|
+
const RenameStaticFile_1 = require("./NewComposition/RenameStaticFile");
|
|
18
20
|
const OverrideInputProps_1 = require("./OverrideInputProps");
|
|
19
21
|
const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher"));
|
|
20
22
|
const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
|
|
21
23
|
const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
|
|
22
24
|
const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
|
|
25
|
+
const KeyframeSettingsModal_1 = require("./Timeline/KeyframeSettingsModal");
|
|
23
26
|
const UpdateModal_1 = require("./UpdateModal/UpdateModal");
|
|
24
27
|
const Modals = ({ readOnlyStudio }) => {
|
|
25
28
|
var _a;
|
|
26
29
|
const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
27
30
|
const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState.type ===
|
|
28
31
|
'connected';
|
|
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 &&
|
|
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 &&
|
|
30
33
|
modalContextType.type === 'server-render' &&
|
|
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, {})] }));
|
|
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, {})] }));
|
|
32
35
|
};
|
|
33
36
|
exports.Modals = Modals;
|
|
@@ -55,6 +55,10 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
|
|
|
55
55
|
const onHide = (0, react_1.useCallback)(() => {
|
|
56
56
|
setOpened(false);
|
|
57
57
|
}, []);
|
|
58
|
+
const onOverlayPointerDown = (0, react_1.useCallback)((e) => {
|
|
59
|
+
// Prevent deselection of currently selected items
|
|
60
|
+
e.stopPropagation();
|
|
61
|
+
}, []);
|
|
58
62
|
(0, react_1.useEffect)(() => {
|
|
59
63
|
const { current } = ref;
|
|
60
64
|
if (!current) {
|
|
@@ -62,7 +66,9 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
|
|
|
62
66
|
}
|
|
63
67
|
const onMouseEnter = () => setIsHovered(true);
|
|
64
68
|
const onMouseLeave = () => setIsHovered(false);
|
|
65
|
-
const onPointerDown = () => {
|
|
69
|
+
const onPointerDown = (e) => {
|
|
70
|
+
// Prevent deselection of currently selected items
|
|
71
|
+
e.stopPropagation();
|
|
66
72
|
return setOpened((o) => {
|
|
67
73
|
if (!o) {
|
|
68
74
|
refresh === null || refresh === void 0 ? void 0 : refresh();
|
|
@@ -176,7 +182,7 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
|
|
|
176
182
|
" ",
|
|
177
183
|
jsx_runtime_1.jsx(caret_1.CaretDown, { small: small })
|
|
178
184
|
] }), portalStyle
|
|
179
|
-
? 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, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: values, onHide: onHide, leaveLeftSpace: true, preselectIndex: values.findIndex((v) => selected && v.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
|
|
185
|
+
? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, onPointerDown: onOverlayPointerDown, 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, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: values, onHide: onHide, leaveLeftSpace: true, preselectIndex: values.findIndex((v) => selected && v.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
|
|
180
186
|
: null] }));
|
|
181
187
|
};
|
|
182
188
|
exports.Combobox = Combobox;
|
|
@@ -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
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenameStaticFileModal = 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 rename_static_file_1 = require("../../api/rename-static-file");
|
|
8
|
+
const url_state_1 = require("../../helpers/url-state");
|
|
9
|
+
const modals_1 = require("../../state/modals");
|
|
10
|
+
const Button_1 = require("../Button");
|
|
11
|
+
const layout_1 = require("../layout");
|
|
12
|
+
const ModalFooter_1 = require("../ModalFooter");
|
|
13
|
+
const ModalHeader_1 = require("../ModalHeader");
|
|
14
|
+
const NotificationCenter_1 = require("../Notifications/NotificationCenter");
|
|
15
|
+
const layout_2 = require("../RenderModal/layout");
|
|
16
|
+
const use_static_files_1 = require("../use-static-files");
|
|
17
|
+
const DismissableModal_1 = require("./DismissableModal");
|
|
18
|
+
const RemInput_1 = require("./RemInput");
|
|
19
|
+
const ValidationMessage_1 = require("./ValidationMessage");
|
|
20
|
+
const content = {
|
|
21
|
+
padding: 12,
|
|
22
|
+
paddingRight: 12,
|
|
23
|
+
flex: 1,
|
|
24
|
+
fontSize: 13,
|
|
25
|
+
minWidth: 500,
|
|
26
|
+
};
|
|
27
|
+
const getParent = (relativePath) => {
|
|
28
|
+
const slashIndex = relativePath.lastIndexOf('/');
|
|
29
|
+
return slashIndex === -1 ? '' : relativePath.slice(0, slashIndex);
|
|
30
|
+
};
|
|
31
|
+
const getBaseName = (relativePath) => {
|
|
32
|
+
const slashIndex = relativePath.lastIndexOf('/');
|
|
33
|
+
return slashIndex === -1 ? relativePath : relativePath.slice(slashIndex + 1);
|
|
34
|
+
};
|
|
35
|
+
const RenameStaticFileModal = ({ relativePath }) => {
|
|
36
|
+
const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
|
|
37
|
+
const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
38
|
+
const { setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionSetters);
|
|
39
|
+
const staticFiles = (0, use_static_files_1.useStaticFiles)();
|
|
40
|
+
const [newName, setNewName] = (0, react_1.useState)(() => getBaseName(relativePath));
|
|
41
|
+
const [submitting, setSubmitting] = (0, react_1.useState)(false);
|
|
42
|
+
const parent = (0, react_1.useMemo)(() => getParent(relativePath), [relativePath]);
|
|
43
|
+
const newRelativePath = (0, react_1.useMemo)(() => {
|
|
44
|
+
return [parent, newName].filter(Boolean).join('/');
|
|
45
|
+
}, [newName, parent]);
|
|
46
|
+
const changed = newRelativePath !== relativePath;
|
|
47
|
+
const validationMessage = (0, react_1.useMemo)(() => {
|
|
48
|
+
const trimmedName = newName.trim();
|
|
49
|
+
if (trimmedName.length === 0) {
|
|
50
|
+
return 'Name cannot be empty';
|
|
51
|
+
}
|
|
52
|
+
if (trimmedName !== newName) {
|
|
53
|
+
return 'Name cannot start or end with whitespace';
|
|
54
|
+
}
|
|
55
|
+
if (newName.includes('/') || newName.includes('\\')) {
|
|
56
|
+
return 'Name cannot include slashes';
|
|
57
|
+
}
|
|
58
|
+
const existingFile = staticFiles.find((file) => {
|
|
59
|
+
return file.name === newRelativePath && file.name !== relativePath;
|
|
60
|
+
});
|
|
61
|
+
if (existingFile) {
|
|
62
|
+
return 'An asset with this name already exists';
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}, [newName, newRelativePath, relativePath, staticFiles]);
|
|
66
|
+
const valid = changed && validationMessage === null;
|
|
67
|
+
const onNameChange = (0, react_1.useCallback)((e) => {
|
|
68
|
+
setNewName(e.target.value);
|
|
69
|
+
}, []);
|
|
70
|
+
const onRename = (0, react_1.useCallback)(() => {
|
|
71
|
+
if (!valid) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
setSubmitting(true);
|
|
75
|
+
const notification = (0, NotificationCenter_1.showNotification)(`Renaming ${relativePath}...`, null);
|
|
76
|
+
(0, rename_static_file_1.renameStaticFile)({
|
|
77
|
+
oldRelativePath: relativePath,
|
|
78
|
+
newRelativePath,
|
|
79
|
+
})
|
|
80
|
+
.then(() => {
|
|
81
|
+
setSelectedModal(null);
|
|
82
|
+
if ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset' &&
|
|
83
|
+
canvasContent.asset === relativePath) {
|
|
84
|
+
setCanvasContent({ type: 'asset', asset: newRelativePath });
|
|
85
|
+
(0, url_state_1.pushUrl)(`/assets/${newRelativePath}`);
|
|
86
|
+
}
|
|
87
|
+
notification.replaceContent(`Renamed to ${newRelativePath}`, 2000);
|
|
88
|
+
})
|
|
89
|
+
.catch((err) => {
|
|
90
|
+
setSubmitting(false);
|
|
91
|
+
notification.replaceContent(`Could not rename ${relativePath}: ${err.message}`, 3000);
|
|
92
|
+
});
|
|
93
|
+
}, [
|
|
94
|
+
canvasContent,
|
|
95
|
+
newRelativePath,
|
|
96
|
+
relativePath,
|
|
97
|
+
setCanvasContent,
|
|
98
|
+
setSelectedModal,
|
|
99
|
+
valid,
|
|
100
|
+
]);
|
|
101
|
+
const onSubmit = (0, react_1.useCallback)((e) => {
|
|
102
|
+
e.preventDefault();
|
|
103
|
+
onRename();
|
|
104
|
+
}, [onRename]);
|
|
105
|
+
return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
|
|
106
|
+
jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: `Rename ${relativePath}` }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
|
|
107
|
+
jsx_runtime_1.jsx("div", { style: content, children: jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
|
|
108
|
+
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: [
|
|
109
|
+
jsx_runtime_1.jsx(RemInput_1.RemotionInput, { value: newName, onChange: onNameChange, type: "text", autoFocus: true, autoComplete: "off", "data-1p-ignore": true, placeholder: "Asset name", status: validationMessage ? 'error' : 'ok', rightAlign: true }), validationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
110
|
+
jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: validationMessage, type: "error" })
|
|
111
|
+
] })) : null] }) })
|
|
112
|
+
] }) }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsxs(layout_1.Row, { align: "center", justify: "flex-end", children: [
|
|
113
|
+
jsx_runtime_1.jsx(Button_1.Button, { onClick: () => setSelectedModal(null), children: "Cancel" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx(Button_1.Button, { onClick: onRename, disabled: !valid || submitting, children: "Rename" })
|
|
114
|
+
] }) })
|
|
115
|
+
] })
|
|
116
|
+
] }));
|
|
117
|
+
};
|
|
118
|
+
exports.RenameStaticFileModal = RenameStaticFileModal;
|
|
@@ -181,7 +181,11 @@ const OptionsPanel = ({ readOnlyStudio }) => {
|
|
|
181
181
|
saveToFile(updater);
|
|
182
182
|
}
|
|
183
183
|
}, [compositionId, compositionDefaultProps, saveToFile, updateProps]);
|
|
184
|
-
|
|
184
|
+
const onPointerDown = (0, react_1.useCallback)((e) => {
|
|
185
|
+
// Prevent deselection of currently selected items
|
|
186
|
+
e.stopPropagation();
|
|
187
|
+
}, []);
|
|
188
|
+
return (jsx_runtime_1.jsxs("div", { style: container, className: "css-reset", onPointerDown: onPointerDown, children: [
|
|
185
189
|
jsx_runtime_1.jsx("div", { style: tabsContainer, children: jsx_runtime_1.jsxs(Tabs_1.Tabs, { children: [visualControlsTabActivated ? (jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'visual-controls', onClick: onVisualControlsSelected, children: "Controls" })) : null, jsx_runtime_1.jsxs(Tabs_1.Tab, { selected: panel === 'input-props', onClick: onPropsSelected, style: { justifyContent: 'space-between' }, children: ["Props", hasLocalModifications ? (jsx_runtime_1.jsx(SchemaResetButton_1.SchemaResetButton, { onClick: resetToOriginal })) : null] }), renderingAvailable ? (jsx_runtime_1.jsx(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' })) : null] }) }), panel === 'input-props' ? (composition ? (jsx_runtime_1.jsx(DefaultPropsEditor_1.DefaultPropsEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, propsEditType: "default-props" }, composition.id)) : null) : panel === 'visual-controls' && visualControlsTabActivated ? (jsx_runtime_1.jsx(VisualControlsContent_1.VisualControlsContent, {})) : !renderingAvailable ? null : (jsx_runtime_1.jsx(RenderQueue_1.RenderQueue, {}))] }));
|
|
186
190
|
};
|
|
187
191
|
exports.OptionsPanel = OptionsPanel;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OutlineToggle = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const colors_1 = require("../helpers/colors");
|
|
7
|
+
const editor_outlines_1 = require("../state/editor-outlines");
|
|
8
|
+
const ControlButton_1 = require("./ControlButton");
|
|
9
|
+
const OutlineToggle = () => {
|
|
10
|
+
const { editorShowOutlines, setEditorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
|
|
11
|
+
const onClick = (0, react_1.useCallback)(() => {
|
|
12
|
+
setEditorShowOutlines((current) => !current);
|
|
13
|
+
}, [setEditorShowOutlines]);
|
|
14
|
+
const color = editorShowOutlines ? colors_1.BLUE : 'white';
|
|
15
|
+
const accessibilityLabel = editorShowOutlines
|
|
16
|
+
? 'Hide outlines'
|
|
17
|
+
: 'Show outlines';
|
|
18
|
+
return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, onClick: onClick, children: jsx_runtime_1.jsx("svg", { style: { width: 16, height: 16 }, viewBox: "0 0 512 512", fill: color, "aria-hidden": "true", focusable: "false", children: jsx_runtime_1.jsx("path", { d: "M32 119.4C12.9 108.4 0 87.7 0 64 0 28.7 28.7 0 64 0 87.7 0 108.4 12.9 119.4 32l273.1 0c11.1-19.1 31.7-32 55.4-32 35.3 0 64 28.7 64 64 0 23.7-12.9 44.4-32 55.4l0 273.1c19.1 11.1 32 31.7 32 55.4 0 35.3-28.7 64-64 64-23.7 0-44.4-12.9-55.4-32l-273.1 0c-11.1 19.1-31.7 32-55.4 32-35.3 0-64-28.7-64-64 0-23.7 12.9-44.4 32-55.4l0-273.1zm64 0l0 273.1c9.7 5.6 17.8 13.7 23.4 23.4l273.1 0c5.6-9.7 13.7-17.8 23.4-23.4l0-273.1c-9.7-5.6-17.8-13.7-23.4-23.4L119.4 96c-5.6 9.7-13.7 17.8-23.4 23.4z" }) }) }));
|
|
19
|
+
};
|
|
20
|
+
exports.OutlineToggle = OutlineToggle;
|
|
@@ -3,8 +3,6 @@ import React from 'react';
|
|
|
3
3
|
import type { CanvasContent } from 'remotion';
|
|
4
4
|
import type { AssetMetadata } from '../helpers/get-asset-metadata';
|
|
5
5
|
import type { Dimensions } from '../helpers/is-current-selected-still';
|
|
6
|
-
export type AssetFileType = 'audio' | 'video' | 'image' | 'json' | 'txt' | 'other';
|
|
7
|
-
export declare const getPreviewFileType: (fileName: string | null) => AssetFileType;
|
|
8
6
|
export declare const VideoPreview: React.FC<{
|
|
9
7
|
readonly canvasSize: Size;
|
|
10
8
|
readonly contentDimensions: Dimensions | 'none' | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.VideoPreview =
|
|
3
|
+
exports.VideoPreview = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const player_1 = require("@remotion/player");
|
|
6
6
|
const react_1 = require("react");
|
|
@@ -8,12 +8,15 @@ const remotion_1 = require("remotion");
|
|
|
8
8
|
const ErrorLoader_1 = require("../error-overlay/remotion-overlay/ErrorLoader");
|
|
9
9
|
const checkerboard_background_1 = require("../helpers/checkerboard-background");
|
|
10
10
|
const colors_1 = require("../helpers/colors");
|
|
11
|
+
const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
|
|
11
12
|
const checkerboard_1 = require("../state/checkerboard");
|
|
12
13
|
const is_menu_item_1 = require("./Menu/is-menu-item");
|
|
13
14
|
const RenderPreview_1 = require("./RenderPreview");
|
|
14
15
|
const SelectedOutlineOverlay_1 = require("./SelectedOutlineOverlay");
|
|
15
16
|
const Spinner_1 = require("./Spinner");
|
|
16
17
|
const StaticFilePreview_1 = require("./StaticFilePreview");
|
|
18
|
+
const should_clear_selection_on_pointer_down_1 = require("./Timeline/should-clear-selection-on-pointer-down");
|
|
19
|
+
const TimelineSelection_1 = require("./Timeline/TimelineSelection");
|
|
17
20
|
const centeredContainer = {
|
|
18
21
|
display: 'flex',
|
|
19
22
|
flex: 1,
|
|
@@ -33,36 +36,6 @@ const assetMetadataErrorContainer = {
|
|
|
33
36
|
height: '100%',
|
|
34
37
|
overflowY: 'auto',
|
|
35
38
|
};
|
|
36
|
-
const getPreviewFileType = (fileName) => {
|
|
37
|
-
var _a;
|
|
38
|
-
if (!fileName) {
|
|
39
|
-
return 'other';
|
|
40
|
-
}
|
|
41
|
-
const audioExtensions = ['mp3', 'wav', 'ogg', 'aac'];
|
|
42
|
-
const videoExtensions = ['mp4', 'avi', 'mkv', 'mov', 'webm'];
|
|
43
|
-
const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
|
|
44
|
-
const fileExtension = (_a = fileName.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
|
|
45
|
-
if (fileExtension === undefined) {
|
|
46
|
-
throw new Error('File extension is undefined');
|
|
47
|
-
}
|
|
48
|
-
if (audioExtensions.includes(fileExtension)) {
|
|
49
|
-
return 'audio';
|
|
50
|
-
}
|
|
51
|
-
if (videoExtensions.includes(fileExtension)) {
|
|
52
|
-
return 'video';
|
|
53
|
-
}
|
|
54
|
-
if (imageExtensions.includes(fileExtension)) {
|
|
55
|
-
return 'image';
|
|
56
|
-
}
|
|
57
|
-
if (fileExtension === 'json') {
|
|
58
|
-
return 'json';
|
|
59
|
-
}
|
|
60
|
-
if (fileExtension === 'txt') {
|
|
61
|
-
return 'txt';
|
|
62
|
-
}
|
|
63
|
-
return 'other';
|
|
64
|
-
};
|
|
65
|
-
exports.getPreviewFileType = getPreviewFileType;
|
|
66
39
|
const checkerboardSize = 49;
|
|
67
40
|
const containerStyle = (options) => {
|
|
68
41
|
return {
|
|
@@ -126,7 +99,7 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
|
|
|
126
99
|
overflow: canvasContent.type === 'composition' ? 'visible' : 'hidden',
|
|
127
100
|
justifyContent: canvasContent.type === 'asset' ? 'center' : 'flex-start',
|
|
128
101
|
alignItems: canvasContent.type === 'asset' &&
|
|
129
|
-
(0,
|
|
102
|
+
(0, get_preview_file_type_1.getPreviewFileType)(canvasContent.asset) === 'audio'
|
|
130
103
|
? 'center'
|
|
131
104
|
: 'normal',
|
|
132
105
|
};
|
|
@@ -154,6 +127,8 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
|
|
|
154
127
|
};
|
|
155
128
|
const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions }) => {
|
|
156
129
|
const { checkerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
|
|
130
|
+
const { clearSelection } = (0, TimelineSelection_1.useTimelineSelection)();
|
|
131
|
+
const portalContainer = (0, react_1.useRef)(null);
|
|
157
132
|
const style = (0, react_1.useMemo)(() => {
|
|
158
133
|
return containerStyle({
|
|
159
134
|
checkerboard,
|
|
@@ -178,6 +153,21 @@ const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions })
|
|
|
178
153
|
current === null || current === void 0 ? void 0 : current.removeChild(remotion_1.Internals.portalNode());
|
|
179
154
|
};
|
|
180
155
|
}, []);
|
|
181
|
-
const
|
|
156
|
+
const onPointerDown = (0, react_1.useCallback)((event) => {
|
|
157
|
+
if (!(0, should_clear_selection_on_pointer_down_1.shouldClearSelectionOnPointerDown)(event)) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
clearSelection();
|
|
161
|
+
}, [clearSelection]);
|
|
162
|
+
(0, react_1.useEffect)(() => {
|
|
163
|
+
const { current } = portalContainer;
|
|
164
|
+
if (!current) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
current.addEventListener('pointerdown', onPointerDown);
|
|
168
|
+
return () => {
|
|
169
|
+
current.removeEventListener('pointerdown', onPointerDown);
|
|
170
|
+
};
|
|
171
|
+
}, [onPointerDown]);
|
|
182
172
|
return jsx_runtime_1.jsx("div", { ref: portalContainer, style: style });
|
|
183
173
|
};
|
|
@@ -16,12 +16,14 @@ const FullscreenToggle_1 = require("./FullscreenToggle");
|
|
|
16
16
|
const layout_1 = require("./layout");
|
|
17
17
|
const LoopToggle_1 = require("./LoopToggle");
|
|
18
18
|
const MuteToggle_1 = require("./MuteToggle");
|
|
19
|
+
const OutlineToggle_1 = require("./OutlineToggle");
|
|
19
20
|
const PlaybackKeyboardShortcutsManager_1 = require("./PlaybackKeyboardShortcutsManager");
|
|
20
21
|
const PlaybackRatePersistor_1 = require("./PlaybackRatePersistor");
|
|
21
22
|
const PlaybackRateSelector_1 = require("./PlaybackRateSelector");
|
|
22
23
|
const PlayPause_1 = require("./PlayPause");
|
|
23
24
|
const RenderButton_1 = require("./RenderButton");
|
|
24
25
|
const SizeSelector_1 = require("./SizeSelector");
|
|
26
|
+
const TimelineSelection_1 = require("./Timeline/TimelineSelection");
|
|
25
27
|
const TimelineZoomControls_1 = require("./Timeline/TimelineZoomControls");
|
|
26
28
|
const TimelineInOutToggle_1 = require("./TimelineInOutToggle");
|
|
27
29
|
const TOOLBAR_HEIGHT = 50;
|
|
@@ -70,6 +72,16 @@ const sideContainer = {
|
|
|
70
72
|
const padding = {
|
|
71
73
|
width: timeline_layout_1.TIMELINE_PADDING,
|
|
72
74
|
};
|
|
75
|
+
const toolbarControl = {
|
|
76
|
+
display: 'contents',
|
|
77
|
+
};
|
|
78
|
+
const PreviewToolbarControl = ({ children }) => {
|
|
79
|
+
const onPointerDown = (0, react_1.useCallback)((e) => {
|
|
80
|
+
// Prevent deselection of currently selected items
|
|
81
|
+
e.stopPropagation();
|
|
82
|
+
}, []);
|
|
83
|
+
return (jsx_runtime_1.jsx("div", { style: toolbarControl, onPointerDown: onPointerDown, children: children }));
|
|
84
|
+
};
|
|
73
85
|
const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
|
|
74
86
|
const { playbackRate, setPlaybackRate } = remotion_1.Internals.usePlaybackRate();
|
|
75
87
|
const { mediaMuted } = (0, react_1.useContext)(remotion_1.Internals.MediaVolumeContext);
|
|
@@ -136,12 +148,13 @@ const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
|
|
|
136
148
|
return (jsx_runtime_1.jsxs("div", { ref: previewToolbarRef, style: isMobileLayout ? mobileContainer : container, className: "css-reset", children: [
|
|
137
149
|
jsx_runtime_1.jsx("div", { ref: leftScrollIndicatorRef, style: scrollIndicatorLeft }), isMobileLayout ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
138
150
|
jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
|
|
139
|
-
jsx_runtime_1.jsx("div", { style: padding }), jsx_runtime_1.jsx(TimelineZoomControls_1.TimelineZoomControls, {})
|
|
140
|
-
] }), jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate })) : null] })), isVideoComposition ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
141
|
-
jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate, muted: mediaMuted }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }), jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
|
|
142
|
-
] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ?
|
|
143
|
-
jsx_runtime_1.jsx(
|
|
144
|
-
jsx_runtime_1.jsx(layout_1.Flex, {}),
|
|
151
|
+
jsx_runtime_1.jsx("div", { style: padding }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineZoomControls_1.TimelineZoomControls, {}) })
|
|
152
|
+
] }), jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) }), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })) : null] })), isVideoComposition ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
153
|
+
jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate, muted: mediaMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }) }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
|
|
154
|
+
] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
155
|
+
jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(CheckboardToggle_1.CheckboardToggle, {}) }), TimelineSelection_1.ENABLE_OUTLINES ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(OutlineToggle_1.OutlineToggle, {}) })) : null] })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), canvasContent && isFullscreenSupported ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(FullscreenToggle_1.FullScreenToggle, {}) })) : null, jsx_runtime_1.jsx(layout_1.Flex, {}), isMobileLayout && (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
156
|
+
jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) }), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })) : null] })), jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
|
|
157
|
+
jsx_runtime_1.jsx(layout_1.Flex, {}), !isMobileLayout && jsx_runtime_1.jsx(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(RenderButton_1.RenderButton, { readOnlyStudio: readOnlyStudio }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
|
|
145
158
|
] }), jsx_runtime_1.jsx(PlaybackKeyboardShortcutsManager_1.PlaybackKeyboardShortcutsManager, { setPlaybackRate: setPlaybackRate }), jsx_runtime_1.jsx(PlaybackRatePersistor_1.PlaybackRatePersistor, {}), jsx_runtime_1.jsx("div", { ref: rightScrollIndicatorRef, style: scrollIndicatorRight })
|
|
146
159
|
] }));
|
|
147
160
|
};
|
|
@@ -102,7 +102,9 @@ const RenderButton = ({ readOnlyStudio, }) => {
|
|
|
102
102
|
shouldApplyCssTransforms: true,
|
|
103
103
|
});
|
|
104
104
|
const refresh = size === null || size === void 0 ? void 0 : size.refresh;
|
|
105
|
-
const onPointerDown = (0, react_1.useCallback)(() => {
|
|
105
|
+
const onPointerDown = (0, react_1.useCallback)((e) => {
|
|
106
|
+
// Prevent deselection of currently selected items
|
|
107
|
+
e.stopPropagation();
|
|
106
108
|
setDropdownOpened((o) => {
|
|
107
109
|
if (!o) {
|
|
108
110
|
refresh === null || refresh === void 0 ? void 0 : refresh();
|
|
@@ -110,6 +112,10 @@ const RenderButton = ({ readOnlyStudio, }) => {
|
|
|
110
112
|
return !o;
|
|
111
113
|
});
|
|
112
114
|
}, [refresh]);
|
|
115
|
+
const onMenuPointerDown = (0, react_1.useCallback)((e) => {
|
|
116
|
+
// Prevent deselection of currently selected items
|
|
117
|
+
e.stopPropagation();
|
|
118
|
+
}, []);
|
|
113
119
|
const onClickDropdown = (0, react_1.useCallback)((e) => {
|
|
114
120
|
e.stopPropagation();
|
|
115
121
|
const isKeyboardInitiated = e.detail === 0;
|
|
@@ -420,7 +426,7 @@ const RenderButton = ({ readOnlyStudio, }) => {
|
|
|
420
426
|
] }) }), shouldShowDropdown ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
421
427
|
jsx_runtime_1.jsx("div", { style: dividerStyle }), jsx_runtime_1.jsx("button", { ref: dropdownRef, type: "button", style: dropdownTriggerStyle, disabled: !readOnlyStudio && connectionStatus !== 'connected', className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: onPointerDown, onClick: onClickDropdown, children: jsx_runtime_1.jsx(caret_1.CaretDown, {}) })
|
|
422
428
|
] })) : null] }), portalStyle
|
|
423
|
-
? 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: onHideDropdown, onEscape: onHideDropdown, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: () => { }, onPreviousMenu: () => { }, values: dropdownValues, onHide: onHideDropdown, leaveLeftSpace: false, preselectIndex: dropdownValues.findIndex((v) => v.id === renderType), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
|
|
429
|
+
? 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: onHideDropdown, onEscape: onHideDropdown, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: () => { }, onPreviousMenu: () => { }, values: dropdownValues, onHide: onHideDropdown, leaveLeftSpace: false, preselectIndex: dropdownValues.findIndex((v) => v.id === renderType), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
|
|
424
430
|
: null] }));
|
|
425
431
|
};
|
|
426
432
|
exports.RenderButton = RenderButton;
|
|
@@ -6,8 +6,8 @@ const react_1 = require("react");
|
|
|
6
6
|
const client_id_1 = require("../helpers/client-id");
|
|
7
7
|
const colors_1 = require("../helpers/colors");
|
|
8
8
|
const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
|
|
9
|
+
const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
|
|
9
10
|
const FilePreview_1 = require("./FilePreview");
|
|
10
|
-
const Preview_1 = require("./Preview");
|
|
11
11
|
const msgStyle = {
|
|
12
12
|
fontSize: 13,
|
|
13
13
|
color: 'white',
|
|
@@ -20,7 +20,7 @@ const errMsgStyle = {
|
|
|
20
20
|
color: colors_1.LIGHT_TEXT,
|
|
21
21
|
};
|
|
22
22
|
const RenderPreview = ({ path, assetMetadata, getBlob }) => {
|
|
23
|
-
const fileType = (0,
|
|
23
|
+
const fileType = (0, get_preview_file_type_1.getPreviewFileType)(path);
|
|
24
24
|
const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
|
|
25
25
|
.previewServerState.type;
|
|
26
26
|
const [blobUrl, setBlobUrl] = (0, react_1.useState)(null);
|
|
@@ -7,9 +7,29 @@ type OutlinePoint = {
|
|
|
7
7
|
readonly x: number;
|
|
8
8
|
readonly y: number;
|
|
9
9
|
};
|
|
10
|
-
type UvCoordinate = readonly [number, number];
|
|
10
|
+
export type UvCoordinate = readonly [number, number];
|
|
11
|
+
export type UvCoordinateFieldSchema = Extract<SequenceFieldSchema, {
|
|
12
|
+
type: 'uv-coordinate';
|
|
13
|
+
}>;
|
|
14
|
+
type SelectedOutlineUvHandle = {
|
|
15
|
+
readonly clientId: string;
|
|
16
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic;
|
|
17
|
+
readonly effectIndex: number;
|
|
18
|
+
readonly fieldDefault: UvCoordinate | undefined;
|
|
19
|
+
readonly fieldKey: string;
|
|
20
|
+
readonly fieldSchema: UvCoordinateFieldSchema;
|
|
21
|
+
readonly nodePath: SequencePropsSubscriptionKey;
|
|
22
|
+
readonly schema: SequenceSchema;
|
|
23
|
+
readonly value: UvCoordinate;
|
|
24
|
+
};
|
|
25
|
+
type UvConnectionHandle = Pick<SelectedOutlineUvHandle, 'effectIndex' | 'fieldKey' | 'fieldSchema' | 'value'>;
|
|
26
|
+
type UvHandleConnectionLine = {
|
|
27
|
+
readonly key: string;
|
|
28
|
+
readonly from: OutlinePoint;
|
|
29
|
+
readonly to: OutlinePoint;
|
|
30
|
+
};
|
|
11
31
|
type SelectedOutlineDragTarget = {
|
|
12
|
-
readonly
|
|
32
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic | CanUpdateSequencePropStatusKeyframed;
|
|
13
33
|
readonly clientId: string;
|
|
14
34
|
readonly fieldDefault: string | undefined;
|
|
15
35
|
readonly keyframeDisplayOffset: number;
|
|
@@ -20,7 +40,7 @@ type ScaleFieldSchema = Extract<SequenceFieldSchema, {
|
|
|
20
40
|
type: 'scale';
|
|
21
41
|
}>;
|
|
22
42
|
type SelectedOutlineScaleDragTarget = {
|
|
23
|
-
readonly
|
|
43
|
+
readonly propStatus: CanUpdateSequencePropStatusStatic;
|
|
24
44
|
readonly clientId: string;
|
|
25
45
|
readonly fieldDefault: number | string | undefined;
|
|
26
46
|
readonly fieldSchema: ScaleFieldSchema;
|
|
@@ -52,7 +72,13 @@ type SequenceWithSelectedOutline = {
|
|
|
52
72
|
readonly sequence: TSequence;
|
|
53
73
|
};
|
|
54
74
|
export declare const getUvHandlePosition: (points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint], uv: UvCoordinate) => OutlinePoint;
|
|
75
|
+
export declare const getUvHandleConnectionLines: ({ handles, points, }: {
|
|
76
|
+
readonly handles: readonly UvConnectionHandle[];
|
|
77
|
+
readonly points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint];
|
|
78
|
+
}) => UvHandleConnectionLine[];
|
|
55
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>;
|
|
56
82
|
export declare const getOutlineSelectionInteraction: ({ shiftKey, metaKey, ctrlKey, }: {
|
|
57
83
|
readonly shiftKey: boolean;
|
|
58
84
|
readonly metaKey: boolean;
|