@remotion/studio 4.0.524 → 4.0.525

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 (135) hide show
  1. package/dist/components/ActionTooltip.d.ts +2 -0
  2. package/dist/components/ActionTooltip.js +14 -4
  3. package/dist/components/AppLaunchButton.js +2 -0
  4. package/dist/components/AssetSelectorModal.d.ts +6 -0
  5. package/dist/components/AssetSelectorModal.js +174 -0
  6. package/dist/components/Canvas.js +15 -1
  7. package/dist/components/CheckboardToggle.js +2 -1
  8. package/dist/components/ColorPicker/AlphaSlider.js +1 -1
  9. package/dist/components/ColorPicker/HueSlider.js +1 -1
  10. package/dist/components/ColorPicker/SaturationValueArea.js +1 -1
  11. package/dist/components/CompositionSelector.js +1 -0
  12. package/dist/components/CompositionSelectorItem.js +1 -0
  13. package/dist/components/EditorGuides/Guide.js +1 -1
  14. package/dist/components/ElementInstallConfirmation.js +31 -23
  15. package/dist/components/FullscreenToggle.js +1 -1
  16. package/dist/components/GlobalKeybindings.js +14 -0
  17. package/dist/components/InspectorLocationCopy.js +1 -1
  18. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  19. package/dist/components/InspectorOpenInEditor.js +18 -15
  20. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +6 -7
  21. package/dist/components/InspectorPanel/CompositionMetadata.js +1 -0
  22. package/dist/components/InspectorPanel/ElementLibraryButton.js +1 -0
  23. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +4 -12
  24. package/dist/components/InspectorSequenceSection.js +18 -9
  25. package/dist/components/LoopToggle.js +2 -1
  26. package/dist/components/Menu/MenuItem.js +1 -2
  27. package/dist/components/MenuBuildIndicator.js +1 -1
  28. package/dist/components/Modals.js +2 -1
  29. package/dist/components/MuteToggle.js +2 -1
  30. package/dist/components/NewComposition/CodemodFooter.js +1 -0
  31. package/dist/components/NewComposition/DeleteComposition.js +42 -6
  32. package/dist/components/NewComposition/DeleteFolder.js +1 -0
  33. package/dist/components/NewComposition/DuplicateComposition.js +5 -0
  34. package/dist/components/NewComposition/InputDragger.js +2 -2
  35. package/dist/components/NewComposition/NewFolder.js +29 -2
  36. package/dist/components/NewComposition/RenameFolder.js +1 -0
  37. package/dist/components/NewComposition/duplicate-composition-api.d.ts +3 -2
  38. package/dist/components/NewComposition/duplicate-composition-api.js +9 -2
  39. package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
  40. package/dist/components/Notifications/NotificationCenter.js +22 -1
  41. package/dist/components/OutlineToggle.js +2 -1
  42. package/dist/components/PlayPause.js +1 -1
  43. package/dist/components/Preview.js +0 -3
  44. package/dist/components/PreviewToolbar.js +3 -6
  45. package/dist/components/PreviewToolbarOverflowButton.js +2 -1
  46. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  47. package/dist/components/RenderButton.js +40 -4
  48. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  49. package/dist/components/RenderModal/render-modals.js +3 -0
  50. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +1 -1
  51. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +1 -1
  52. package/dist/components/RenderQueue/actions.d.ts +2 -1
  53. package/dist/components/RenderQueue/actions.js +2 -1
  54. package/dist/components/RulersAndGuidesToggle.js +2 -1
  55. package/dist/components/SegmentedButton.d.ts +1 -0
  56. package/dist/components/SegmentedButton.js +9 -3
  57. package/dist/components/SelectedOutlineElement.js +16 -6
  58. package/dist/components/SelectedOutlinePolygon.js +4 -2
  59. package/dist/components/SettingsContext.d.ts +8 -0
  60. package/dist/components/SettingsContext.js +57 -2
  61. package/dist/components/SettingsModal.js +4 -1
  62. package/dist/components/SettingsModalFooter.js +1 -1
  63. package/dist/components/SidebarCollapserControls.js +1 -1
  64. package/dist/components/SkillsSettings.js +35 -4
  65. package/dist/components/SnappingToggle.js +2 -1
  66. package/dist/components/Splitter/SplitterHandle.js +1 -2
  67. package/dist/components/Tabs/vertical.d.ts +1 -1
  68. package/dist/components/Tabs/vertical.js +16 -2
  69. package/dist/components/Timeline/EasingEditorModal.js +2 -2
  70. package/dist/components/Timeline/TimelineAssetField.js +148 -9
  71. package/dist/components/Timeline/TimelineDragHandler.js +1 -2
  72. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  73. package/dist/components/Timeline/TimelineEffectItem.js +2 -2
  74. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  75. package/dist/components/Timeline/TimelineEffectPropItem.js +2 -2
  76. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  77. package/dist/components/Timeline/TimelineInOutDragHandler.js +1 -2
  78. package/dist/components/Timeline/TimelineSchemaField.js +8 -1
  79. package/dist/components/Timeline/TimelineSelection.d.ts +3 -1
  80. package/dist/components/Timeline/TimelineSelection.js +32 -5
  81. package/dist/components/Timeline/TimelineSequence.js +6 -6
  82. package/dist/components/Timeline/TimelineSequenceItem.js +12 -10
  83. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +3 -12
  84. package/dist/components/Timeline/TimelineTranslateField.js +25 -12
  85. package/dist/components/Timeline/TimelineZoomControls.js +1 -1
  86. package/dist/components/Timeline/get-sequence-context-menu-items.js +22 -6
  87. package/dist/components/Timeline/timeline-field-display-utils.js +4 -2
  88. package/dist/components/Timeline/timeline-translate-utils.d.ts +17 -0
  89. package/dist/components/Timeline/timeline-translate-utils.js +53 -12
  90. package/dist/components/Timeline/use-open-sequence-in-apps.d.ts +2 -0
  91. package/dist/components/Timeline/use-open-sequence-in-apps.js +17 -0
  92. package/dist/components/Timeline/use-timeline-asset-drop.js +17 -3
  93. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  94. package/dist/components/TimelineCombobox.js +1 -0
  95. package/dist/components/UndoRedoButtons.js +11 -0
  96. package/dist/components/composition-menu-items.js +56 -2
  97. package/dist/components/folder-menu-items.js +44 -0
  98. package/dist/components/get-open-in-menu-items.js +1 -1
  99. package/dist/components/import-assets.d.ts +24 -1
  100. package/dist/components/import-assets.js +3 -1
  101. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  102. package/dist/components/keyboard-shortcuts.js +5 -0
  103. package/dist/esm/{LazyModels-hc33szyn.mjs → LazyModels-gfmpcy4h.mjs} +3 -3
  104. package/dist/esm/{LazyModels-sg40rjw6.mjs → LazyModels-m1rf06wh.mjs} +3 -3
  105. package/dist/esm/{TranscriptionModal-3ctnxpt6.mjs → TranscriptionModal-8pvrehg4.mjs} +6 -6
  106. package/dist/esm/{VideoMattingModal-b0r7e60n.mjs → VideoMattingModal-fefbzgka.mjs} +6 -6
  107. package/dist/esm/{index-yfrysr5f.mjs → index-0x13f28h.mjs} +17 -3
  108. package/dist/esm/{index-q2epbw93.mjs → index-1089795y.mjs} +2 -2
  109. package/dist/esm/{index-9qtvmwtx.mjs → index-41kqns5c.mjs} +4 -2
  110. package/dist/esm/{index-c37kme2v.mjs → index-ggqpre9v.mjs} +2202 -1719
  111. package/dist/esm/{index-wbmp5srk.mjs → index-hbezgbbq.mjs} +1 -1
  112. package/dist/esm/{index-2j3d1g81.mjs → index-jrw61pkj.mjs} +1 -1
  113. package/dist/esm/{index-1b9skrrd.mjs → index-mww32xc8.mjs} +3 -3
  114. package/dist/esm/{index-er3mh6em.mjs → index-s848rffx.mjs} +7123 -6588
  115. package/dist/esm/{index-q5xv20xx.mjs → index-tzxb8808.mjs} +1 -1
  116. package/dist/esm/{index-e3zwf3e7.mjs → index-vsxrxfpj.mjs} +1 -1
  117. package/dist/esm/index.mjs +2 -2
  118. package/dist/esm/internals.mjs +7 -7
  119. package/dist/esm/previewEntry.mjs +7 -7
  120. package/dist/helpers/get-git-menu-item.d.ts +4 -0
  121. package/dist/helpers/get-git-menu-item.js +8 -1
  122. package/dist/helpers/get-sequence-double-click-action.d.ts +3 -3
  123. package/dist/helpers/get-sequence-double-click-action.js +2 -2
  124. package/dist/helpers/pointer-session.d.ts +1 -0
  125. package/dist/helpers/pointer-session.js +10 -1
  126. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  127. package/dist/helpers/use-create-composition.js +5 -0
  128. package/dist/helpers/use-keybinding.d.ts +1 -1
  129. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  130. package/dist/helpers/use-media-metadata.js +5 -1
  131. package/dist/helpers/use-menu-structure.js +5 -1
  132. package/dist/helpers/use-rename-composition.js +6 -1
  133. package/dist/state/modals.d.ts +13 -1
  134. package/dist/state/z-index.js +1 -3
  135. package/package.json +19 -19
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  callApi
3
- } from "./index-9qtvmwtx.mjs";
3
+ } from "./index-41kqns5c.mjs";
4
4
  import {
5
5
  getBrowserStudioOperations
6
6
  } from "./index-cw0pnpg5.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ModelManager
3
- } from "./index-2j3d1g81.mjs";
3
+ } from "./index-jrw61pkj.mjs";
4
4
 
5
5
  // src/components/Transcription/Models.tsx
6
6
  import {
@@ -3,7 +3,7 @@ import {
3
3
  play,
4
4
  restartStudio,
5
5
  seek
6
- } from "./index-q5xv20xx.mjs";
6
+ } from "./index-tzxb8808.mjs";
7
7
  import {
8
8
  CodingAgentIcon,
9
9
  DEFAULT_PROPS_PATH_ACTIVE_CLASSNAME,
@@ -20,7 +20,7 @@ import {
20
20
  visualControlRef,
21
21
  visualControlStore,
22
22
  watchPublicFolder
23
- } from "./index-9qtvmwtx.mjs";
23
+ } from "./index-41kqns5c.mjs";
24
24
  import {
25
25
  getBrowserStudioOperations,
26
26
  writeStaticFile
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  Studio
3
- } from "./index-er3mh6em.mjs";
4
- import"./index-q2epbw93.mjs";
5
- import"./index-1b9skrrd.mjs";
6
- import"./index-c37kme2v.mjs";
3
+ } from "./index-s848rffx.mjs";
4
+ import"./index-1089795y.mjs";
5
+ import"./index-mww32xc8.mjs";
6
+ import"./index-ggqpre9v.mjs";
7
7
  import"./index-9x6e1dq0.mjs";
8
- import"./index-q5xv20xx.mjs";
9
- import"./index-9qtvmwtx.mjs";
8
+ import"./index-tzxb8808.mjs";
9
+ import"./index-41kqns5c.mjs";
10
10
  import"./index-cw0pnpg5.mjs";
11
- import"./index-yfrysr5f.mjs";
11
+ import"./index-0x13f28h.mjs";
12
12
  import"./index-5zrb1ft4.mjs";
13
13
  import"./index-k426ye99.mjs";
14
14
  import"./index-rcv7qkt5.mjs";
@@ -5,18 +5,18 @@ import {
5
5
  markErrorMessageAsLoggedByServer,
6
6
  setErrorsRef,
7
7
  startReportingRuntimeErrors
8
- } from "./index-er3mh6em.mjs";
9
- import"./index-q2epbw93.mjs";
10
- import"./index-1b9skrrd.mjs";
8
+ } from "./index-s848rffx.mjs";
9
+ import"./index-1089795y.mjs";
10
+ import"./index-mww32xc8.mjs";
11
11
  import {
12
12
  reloadUrl,
13
13
  subscribeToPreviewServerEvents
14
- } from "./index-c37kme2v.mjs";
14
+ } from "./index-ggqpre9v.mjs";
15
15
  import"./index-9x6e1dq0.mjs";
16
- import"./index-q5xv20xx.mjs";
17
- import"./index-9qtvmwtx.mjs";
16
+ import"./index-tzxb8808.mjs";
17
+ import"./index-41kqns5c.mjs";
18
18
  import"./index-cw0pnpg5.mjs";
19
- import"./index-yfrysr5f.mjs";
19
+ import"./index-0x13f28h.mjs";
20
20
  import"./index-5zrb1ft4.mjs";
21
21
  import {
22
22
  BACKGROUND_HEX,
@@ -5,6 +5,10 @@ export declare const getGitSourceName: (gitSource: GitSource) => string;
5
5
  export declare const getGitSourceBranchUrl: (gitSource: GitSource) => string;
6
6
  export declare const getGitRefUrl: (gitSource: GitSource, originalLocation: OriginalPosition, remotionRoot: string) => string;
7
7
  export declare const hasReadOnlyGitSource: () => boolean;
8
+ export type DefaultOpenInTarget = 'editor' | 'git-source';
9
+ export declare const getDefaultOpenInTarget: ({ canOpenInEditor, }: {
10
+ readonly canOpenInEditor: boolean;
11
+ }) => DefaultOpenInTarget | null;
8
12
  export declare const openGitSource: ({ folder, location, }: {
9
13
  folder: boolean;
10
14
  location: OriginalPosition | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getGitMenuItem = exports.openGitSource = exports.hasReadOnlyGitSource = exports.getGitRefUrl = exports.getGitSourceBranchUrl = exports.getGitSourceName = void 0;
3
+ exports.getGitMenuItem = exports.openGitSource = exports.getDefaultOpenInTarget = exports.hasReadOnlyGitSource = exports.getGitRefUrl = exports.getGitSourceBranchUrl = exports.getGitSourceName = void 0;
4
4
  const getGitSourceName = (gitSource) => {
5
5
  if (gitSource.type === 'github') {
6
6
  return 'GitHub';
@@ -56,6 +56,13 @@ const hasReadOnlyGitSource = () => {
56
56
  return Boolean(window.remotion_isReadOnlyStudio && window.remotion_gitSource);
57
57
  };
58
58
  exports.hasReadOnlyGitSource = hasReadOnlyGitSource;
59
+ const getDefaultOpenInTarget = ({ canOpenInEditor, }) => {
60
+ if (canOpenInEditor) {
61
+ return 'editor';
62
+ }
63
+ return (0, exports.hasReadOnlyGitSource)() ? 'git-source' : null;
64
+ };
65
+ exports.getDefaultOpenInTarget = getDefaultOpenInTarget;
59
66
  const openGitSource = ({ folder, location, }) => {
60
67
  const gitSource = window.remotion_gitSource;
61
68
  if (!gitSource) {
@@ -1,8 +1,8 @@
1
1
  import type { TSequence } from 'remotion';
2
- export type SequenceDoubleClickAction = 'open-connected-composition' | 'open-in-editor';
3
- export declare const getSequenceDoubleClickAction: ({ button, canOpenInEditor, numberOfConnectedCompositions, sequenceWasDragged, }: {
2
+ export type SequenceDoubleClickAction = 'open-connected-composition' | 'open-source';
3
+ export declare const getSequenceDoubleClickAction: ({ button, canOpenSource, numberOfConnectedCompositions, sequenceWasDragged, }: {
4
4
  readonly button: number;
5
- readonly canOpenInEditor: boolean;
5
+ readonly canOpenSource: boolean;
6
6
  readonly numberOfConnectedCompositions: number;
7
7
  readonly sequenceWasDragged: boolean;
8
8
  }) => SequenceDoubleClickAction | null;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getConnectedCompositionFrame = exports.getSequenceDoubleClickAction = void 0;
4
- const getSequenceDoubleClickAction = ({ button, canOpenInEditor, numberOfConnectedCompositions, sequenceWasDragged, }) => {
4
+ const getSequenceDoubleClickAction = ({ button, canOpenSource, numberOfConnectedCompositions, sequenceWasDragged, }) => {
5
5
  // The browser still fires `dblclick` when the second press of a
6
6
  // double-click turned into a drag. That gesture is a drag, not a
7
7
  // double-click.
@@ -14,7 +14,7 @@ const getSequenceDoubleClickAction = ({ button, canOpenInEditor, numberOfConnect
14
14
  if (numberOfConnectedCompositions === 1) {
15
15
  return 'open-connected-composition';
16
16
  }
17
- return canOpenInEditor ? 'open-in-editor' : null;
17
+ return canOpenSource ? 'open-source' : null;
18
18
  };
19
19
  exports.getSequenceDoubleClickAction = getSequenceDoubleClickAction;
20
20
  const getConnectedCompositionFrame = ({ timelinePosition, sequence, sequenceFrameOffset, }) => {
@@ -1,4 +1,5 @@
1
1
  export type PointerSessionEndReason = 'pointerup' | 'pointercancel' | 'lostpointercapture' | 'blur' | 'visibilitychange' | 'buttons-released' | 'manual';
2
+ export declare const isPointerSessionRelease: (reason: PointerSessionEndReason, event: PointerEvent | null) => event is PointerEvent;
2
3
  type PointerSessionEvent = Pick<PointerEvent, 'button' | 'pointerId'>;
3
4
  export declare const startCapturedPointerSession: ({ event, captureTarget, onMove, onEnd, }: {
4
5
  event: PointerSessionEvent;
@@ -1,6 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.observePointerRelease = exports.startDeferredCapturedPointerSession = exports.startCapturedPointerSession = void 0;
3
+ exports.observePointerRelease = exports.startDeferredCapturedPointerSession = exports.startCapturedPointerSession = exports.isPointerSessionRelease = void 0;
4
+ const isPointerSessionRelease = (reason, event) => {
5
+ if (event === null) {
6
+ return false;
7
+ }
8
+ return (reason === 'pointerup' ||
9
+ reason === 'buttons-released' ||
10
+ (reason === 'lostpointercapture' && event.buttons === 0));
11
+ };
12
+ exports.isPointerSessionRelease = isPointerSessionRelease;
4
13
  const getButtonMask = (button) => {
5
14
  if (button === 0) {
6
15
  return 1;
@@ -2,6 +2,6 @@ export declare const DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS = 300;
2
2
  export declare const getStudioAskAIEnabled: () => boolean;
3
3
  export declare const getStudioInteractivityEnabled: () => boolean;
4
4
  export declare const getStudioKeyboardShortcutsEnabled: () => boolean;
5
- export declare const getStudioKeyboardShortcuts: () => Partial<Record<"askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut", import("@remotion/studio-shared").StudioKeyboardShortcutValue>> | null;
5
+ export declare const getStudioKeyboardShortcuts: () => Partial<Record<"askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "pickColor" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut", import("@remotion/studio-shared").StudioKeyboardShortcutValue>> | null;
6
6
  export declare const getStudioMaxTimelineTracks: () => number | null;
7
7
  export declare const getStudioBufferStateDelayInMilliseconds: () => number;
@@ -5,6 +5,7 @@ const react_1 = require("react");
5
5
  const InitialCompositionLoader_1 = require("../components/InitialCompositionLoader");
6
6
  const actions_1 = require("../components/RenderQueue/actions");
7
7
  const slugify_name_1 = require("./slugify-name");
8
+ const url_state_1 = require("./url-state");
8
9
  const validate_new_comp_data_1 = require("./validate-new-comp-data");
9
10
  const toPascalCase = (value) => {
10
11
  var _a;
@@ -89,6 +90,10 @@ const useCreateComposition = ({ compositions, durationInFrames, folderName, newI
89
90
  dryRun: false,
90
91
  signal,
91
92
  symbolicatedStack,
93
+ undoRedoNavigation: {
94
+ undoRoute: (0, url_state_1.getRoute)(),
95
+ redoRoute: `/${compositionId}`,
96
+ },
92
97
  });
93
98
  if (result.success) {
94
99
  selectComposition({
@@ -8,7 +8,7 @@ export declare const useKeybinding: () => {
8
8
  triggerIfInputFieldFocused: boolean;
9
9
  keepRegisteredWhenNotHighestContext: boolean;
10
10
  } & ({
11
- action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut";
11
+ action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "pickColor" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut";
12
12
  key?: undefined;
13
13
  commandCtrlKey?: undefined;
14
14
  } | {
@@ -1,2 +1,2 @@
1
- export declare const useKeyboardShortcutLabel: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
2
- export declare const useKeyboardShortcutAriaKeyShortcuts: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
1
+ export declare const useKeyboardShortcutLabel: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "pickColor" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
2
+ export declare const useKeyboardShortcutAriaKeyShortcuts: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "pickColor" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
@@ -42,7 +42,11 @@ const getMediabunnyMetadata = async (src) => {
42
42
  create: () => {
43
43
  const createdInput = new mediabunny_1.Input({
44
44
  formats: mediabunny_1.ALL_FORMATS,
45
- source: new mediabunny_1.UrlSource(src),
45
+ source: new mediabunny_1.UrlSource(src, {
46
+ handleUnhandledError: (error) => {
47
+ remotion_1.Internals.Log.warn({ logLevel: 'info', tag: '@remotion/studio' }, `A speculative fetch for "${src}" failed:`, error);
48
+ },
49
+ }),
46
50
  });
47
51
  return {
48
52
  resource: createdInput,
@@ -256,6 +256,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
256
256
  const goToFrameShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('goToFrame');
257
257
  const renderShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('render');
258
258
  const askAIShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('askAI');
259
+ const colorPickerShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('pickColor');
259
260
  const showKeyboardShortcutsShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('showKeyboardShortcuts');
260
261
  const studioAskAIEnabled = (0, studio_runtime_config_1.getStudioAskAIEnabled)();
261
262
  const { setSidebarCollapsedState, sidebarCollapsedStateLeft, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
@@ -823,7 +824,9 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
823
824
  (0, pick_color_1.pickColor)();
824
825
  },
825
826
  leftItem: null,
826
- keyHint: null,
827
+ keyHint: keyboardShortcutsDisabled
828
+ ? null
829
+ : colorPickerShortcut || null,
827
830
  subMenu: null,
828
831
  type: 'item',
829
832
  quickSwitcherLabel: 'Show Color Picker',
@@ -1057,6 +1060,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
1057
1060
  keyboardShortcutsDisabled,
1058
1061
  studioAskAIEnabled,
1059
1062
  askAIShortcut,
1063
+ colorPickerShortcut,
1060
1064
  checkerboardShortcut,
1061
1065
  clearInOutPointsShortcut,
1062
1066
  goToFrameShortcut,
@@ -32,14 +32,19 @@ const useRenameComposition = ({ compositions, currentId, newId, }) => {
32
32
  }, [getCodemod, newId]);
33
33
  const valid = validationMessage === null && currentId !== compositionId;
34
34
  const renameComposition = (0, react_1.useCallback)(async ({ newCompositionId, signal, symbolicatedStack, }) => {
35
+ const nextCompositionId = (0, slugify_name_1.slugifyName)(newCompositionId);
35
36
  const result = await (0, actions_1.applyCodemod)({
36
37
  codemod: getCodemod(newCompositionId),
37
38
  dryRun: false,
38
39
  signal,
39
40
  symbolicatedStack,
41
+ undoRedoNavigation: {
42
+ undoRoute: (0, url_state_1.getRoute)(),
43
+ redoRoute: `/${nextCompositionId}`,
44
+ },
40
45
  });
41
46
  if (result.success) {
42
- (0, url_state_1.pushUrl)(`/${(0, slugify_name_1.slugifyName)(newCompositionId)}`);
47
+ (0, url_state_1.pushUrl)(`/${nextCompositionId}`);
43
48
  }
44
49
  return result;
45
50
  }, [getCodemod]);
@@ -109,6 +109,18 @@ export type AddEffectModalState = {
109
109
  nodePath: SequencePropsSubscriptionKey;
110
110
  clientId: string;
111
111
  };
112
+ export type AssetSelectionModalState = {
113
+ readonly type: 'asset-selection';
114
+ readonly assetType: 'audio' | 'video' | 'image';
115
+ readonly initialUrl: string | null;
116
+ readonly invocationTimestamp: number;
117
+ readonly assetSelection: {
118
+ readonly initialQuery: string;
119
+ readonly onSelectFile: () => void;
120
+ readonly onSelected: (asset: StaticFile) => void;
121
+ };
122
+ readonly onSelectedUrl: (url: string) => void;
123
+ };
112
124
  export type TranscriptionModalState = {
113
125
  type: 'transcribe';
114
126
  src: string;
@@ -206,7 +218,7 @@ export type ModalState = {
206
218
  type: 'element-library';
207
219
  name: string;
208
220
  url: string;
209
- } | ElementInstallModalState | AddEffectModalState | TranscriptionModalState | VideoMattingModalState | ConfirmationDialogState | SvgImportDialogState;
221
+ } | ElementInstallModalState | AddEffectModalState | AssetSelectionModalState | TranscriptionModalState | VideoMattingModalState | ConfirmationDialogState | SvgImportDialogState;
210
222
  export type SetSelectedModalContextType = {
211
223
  setSelectedModal: React.Dispatch<React.SetStateAction<ModalState | null>>;
212
224
  };
@@ -81,9 +81,7 @@ const HigherZIndex = ({ children, onEscape, onOutsideClick, disabled, outsideCli
81
81
  onEnd: (reason, upEvent) => {
82
82
  var _a;
83
83
  endPointerSession = null;
84
- if ((reason === 'pointerup' || reason === 'buttons-released') &&
85
- upEvent &&
86
- !(0, input_dragger_click_lock_1.getClickLock)()) {
84
+ if ((0, pointer_session_1.isPointerSessionRelease)(reason, upEvent) && !(0, input_dragger_click_lock_1.getClickLock)()) {
87
85
  const target = (_a = document.elementFromPoint(upEvent.clientX, upEvent.clientY)) !== null && _a !== void 0 ? _a : upEvent.target;
88
86
  if (document.contains(target)) {
89
87
  upEvent.stopPropagation();
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.524",
6
+ "version": "4.0.525",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -20,8 +20,8 @@
20
20
  "url": "https://github.com/remotion-dev/remotion/issues"
21
21
  },
22
22
  "peerDependencies": {
23
- "@remotion/video-matting": "4.0.524",
24
- "@remotion/whisper-webgpu": "4.0.524",
23
+ "@remotion/video-matting": "4.0.525",
24
+ "@remotion/whisper-webgpu": "4.0.525",
25
25
  "react": ">=16.8.0",
26
26
  "react-dom": ">=16.8.0"
27
27
  },
@@ -35,32 +35,32 @@
35
35
  },
36
36
  "dependencies": {
37
37
  "@jridgewell/trace-mapping": "0.3.31",
38
- "@remotion/canvas": "4.0.524",
39
- "@remotion/captions": "4.0.524",
40
- "@remotion/media": "4.0.524",
41
- "@remotion/media-utils": "4.0.524",
42
- "@remotion/player": "4.0.524",
43
- "@remotion/renderer": "4.0.524",
44
- "@remotion/studio-codemods": "4.0.524",
45
- "@remotion/studio-protocol": "4.0.524",
46
- "@remotion/studio-shared": "4.0.524",
47
- "@remotion/timeline-utils": "4.0.524",
48
- "@remotion/web-renderer": "4.0.524",
49
- "@remotion/zod-types": "4.0.524",
38
+ "@remotion/canvas": "4.0.525",
39
+ "@remotion/captions": "4.0.525",
40
+ "@remotion/media": "4.0.525",
41
+ "@remotion/media-utils": "4.0.525",
42
+ "@remotion/player": "4.0.525",
43
+ "@remotion/renderer": "4.0.525",
44
+ "@remotion/studio-codemods": "4.0.525",
45
+ "@remotion/studio-protocol": "4.0.525",
46
+ "@remotion/studio-shared": "4.0.525",
47
+ "@remotion/timeline-utils": "4.0.525",
48
+ "@remotion/web-renderer": "4.0.525",
49
+ "@remotion/zod-types": "4.0.525",
50
50
  "@tanstack/react-virtual": "3.14.9",
51
51
  "mediabunny": "1.56.1",
52
52
  "memfs": "3.4.3",
53
53
  "open": "8.4.2",
54
54
  "prismjs": "1.30.0",
55
- "remotion": "4.0.524",
55
+ "remotion": "4.0.525",
56
56
  "semver": "7.5.3",
57
57
  "zod": "4.5.4"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@happy-dom/global-registrator": "14.5.1",
61
- "@remotion/eslint-config-internal": "4.0.524",
62
- "@remotion/video-matting": "4.0.524",
63
- "@remotion/whisper-webgpu": "4.0.524",
61
+ "@remotion/eslint-config-internal": "4.0.525",
62
+ "@remotion/video-matting": "4.0.525",
63
+ "@remotion/whisper-webgpu": "4.0.525",
64
64
  "@testing-library/react": "16.1.0",
65
65
  "@types/prismjs": "1.26.4",
66
66
  "@types/semver": "7.5.3",