@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.
Files changed (79) hide show
  1. package/dist/components/AssetSelectorItem.js +30 -6
  2. package/dist/components/Canvas.js +71 -0
  3. package/dist/components/Modals.js +1 -2
  4. package/dist/components/NewComposition/InputDragger.d.ts +1 -0
  5. package/dist/components/NewComposition/InputDragger.js +9 -6
  6. package/dist/components/SelectedOutlineOverlay.d.ts +7 -5
  7. package/dist/components/SelectedOutlineOverlay.js +78 -67
  8. package/dist/components/Timeline/KeyframeSettingsModal.js +4 -4
  9. package/dist/components/Timeline/SequencePropsObserver.js +3 -3
  10. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +7 -7
  11. package/dist/components/Timeline/TimelineClipboardKeybindings.js +19 -16
  12. package/dist/components/Timeline/TimelineDeleteKeybindings.js +11 -9
  13. package/dist/components/Timeline/TimelineEffectItem.js +7 -7
  14. package/dist/components/Timeline/TimelineEffectPropItem.js +17 -17
  15. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +6 -1
  16. package/dist/components/Timeline/TimelineExpandedSection.js +5 -5
  17. package/dist/components/Timeline/TimelineKeyframeControls.js +8 -8
  18. package/dist/components/Timeline/TimelineKeyframeDiamond.js +0 -1
  19. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +9 -0
  20. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +120 -0
  21. package/dist/components/Timeline/TimelineKeyframedValue.js +1 -1
  22. package/dist/components/Timeline/TimelineNumberField.js +15 -7
  23. package/dist/components/Timeline/TimelineRotationField.js +17 -11
  24. package/dist/components/Timeline/TimelineScaleField.js +16 -12
  25. package/dist/components/Timeline/TimelineSelection.d.ts +15 -0
  26. package/dist/components/Timeline/TimelineSelection.js +26 -1
  27. package/dist/components/Timeline/TimelineSequence.js +6 -6
  28. package/dist/components/Timeline/TimelineSequenceItem.js +21 -14
  29. package/dist/components/Timeline/TimelineSequencePropItem.js +37 -37
  30. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +5 -5
  31. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +46 -44
  32. package/dist/components/Timeline/TimelineTranslateField.js +24 -19
  33. package/dist/components/Timeline/TimelineUvCoordinateField.js +18 -12
  34. package/dist/components/Timeline/{apply-effect-response-to-code-values.d.ts → apply-effect-response-to-prop-statuses.d.ts} +1 -1
  35. package/dist/components/Timeline/{apply-effect-response-to-code-values.js → apply-effect-response-to-prop-statuses.js} +3 -3
  36. package/dist/components/Timeline/call-add-keyframe.d.ts +5 -5
  37. package/dist/components/Timeline/call-add-keyframe.js +6 -6
  38. package/dist/components/Timeline/call-delete-keyframe.d.ts +7 -7
  39. package/dist/components/Timeline/call-delete-keyframe.js +7 -7
  40. package/dist/components/Timeline/call-move-keyframe.d.ts +3 -3
  41. package/dist/components/Timeline/call-move-keyframe.js +3 -3
  42. package/dist/components/Timeline/call-update-keyframe-settings.d.ts +5 -5
  43. package/dist/components/Timeline/call-update-keyframe-settings.js +6 -6
  44. package/dist/components/Timeline/delete-selected-keyframe.d.ts +5 -5
  45. package/dist/components/Timeline/delete-selected-keyframe.js +5 -5
  46. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +5 -5
  47. package/dist/components/Timeline/delete-selected-timeline-item.js +6 -4
  48. package/dist/components/Timeline/get-node-keyframes.d.ts +3 -3
  49. package/dist/components/Timeline/get-node-keyframes.js +4 -4
  50. package/dist/components/Timeline/get-timeline-easing-segments.d.ts +9 -0
  51. package/dist/components/Timeline/get-timeline-easing-segments.js +19 -0
  52. package/dist/components/Timeline/reset-selected-timeline-props.d.ts +7 -7
  53. package/dist/components/Timeline/reset-selected-timeline-props.js +10 -10
  54. package/dist/components/Timeline/save-effect-prop.d.ts +2 -2
  55. package/dist/components/Timeline/save-effect-prop.js +5 -5
  56. package/dist/components/Timeline/save-prop-queue.d.ts +3 -3
  57. package/dist/components/Timeline/save-prop-queue.js +3 -3
  58. package/dist/components/Timeline/save-sequence-prop.d.ts +3 -3
  59. package/dist/components/Timeline/save-sequence-prop.js +4 -4
  60. package/dist/components/Timeline/timeline-field-utils.d.ts +10 -0
  61. package/dist/components/Timeline/timeline-field-utils.js +26 -5
  62. package/dist/components/Timeline/timeline-translate-utils.d.ts +1 -1
  63. package/dist/components/Timeline/timeline-translate-utils.js +4 -5
  64. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +7 -7
  65. package/dist/components/Timeline/use-sequence-props-subscription.js +3 -3
  66. package/dist/components/Timeline/use-timeline-height.js +3 -3
  67. package/dist/components/Timeline/use-timeline-keyframe-drag.js +13 -11
  68. package/dist/components/import-assets.d.ts +15 -0
  69. package/dist/components/import-assets.js +63 -1
  70. package/dist/esm/{chunk-q0jkt0zq.js → chunk-xjvc8qen.js} +1708 -1394
  71. package/dist/esm/internals.mjs +1708 -1394
  72. package/dist/esm/previewEntry.mjs +1711 -1397
  73. package/dist/esm/renderEntry.mjs +1 -1
  74. package/dist/helpers/timeline-layout.d.ts +6 -6
  75. package/dist/helpers/timeline-layout.js +5 -5
  76. package/dist/state/modals.d.ts +0 -3
  77. package/package.json +10 -10
  78. package/dist/components/NewComposition/DeleteStaticFile.d.ts +0 -4
  79. 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 === 'delete-static-file' && (jsx_runtime_1.jsx(DeleteStaticFile_1.DeleteStaticFileModal, { relativePath: modalContextType.relativePath })), 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 &&
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 roundedToStep = roundToStep(newValue, step);
146
- lastDragValue = roundedToStep;
147
- onValueChange(roundedToStep);
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 codeValue: CanUpdateSequencePropStatusStatic;
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 codeValue: CanUpdateSequencePropStatusStatic | CanUpdateSequencePropStatusKeyframed;
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 codeValue: CanUpdateSequencePropStatusStatic;
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;