@remotion/studio 4.0.526 → 4.0.527

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 (98) hide show
  1. package/dist/components/Canvas.js +88 -26
  2. package/dist/components/CanvasCaptureDropHandler.js +63 -0
  3. package/dist/components/CanvasOrLoading.js +10 -2
  4. package/dist/components/CompositionSelectorItem.js +1 -0
  5. package/dist/components/CurrentAsset.js +2 -1
  6. package/dist/components/InitialCompositionLoader.js +1 -1
  7. package/dist/components/InlineDropdown.js +26 -2
  8. package/dist/components/InlineEditableTitle.js +1 -0
  9. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +1 -0
  10. package/dist/components/InspectorPanel/CompositionInspector.js +3 -3
  11. package/dist/components/InspectorPanel/CompositionMetadata.js +4 -0
  12. package/dist/components/InspectorPanel/ElementLibraryButton.js +1 -0
  13. package/dist/components/InspectorPanel/MultiSequenceInspector.js +32 -1
  14. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +41 -1
  15. package/dist/components/InspectorPanel/common.js +1 -0
  16. package/dist/components/InspectorPanel/styles.js +2 -0
  17. package/dist/components/InspectorPanel/use-composition-actions.js +1 -0
  18. package/dist/components/InspectorSourceLocation.js +3 -0
  19. package/dist/components/MenuBuildIndicator.js +1 -0
  20. package/dist/components/NewComposition/CancelButton.js +1 -1
  21. package/dist/components/Preview.js +3 -0
  22. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -0
  23. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  24. package/dist/components/RadioButton.js +1 -0
  25. package/dist/components/RenderModal/DataEditor.js +4 -1
  26. package/dist/components/RenderQueue/CaptionQueueItem.js +5 -2
  27. package/dist/components/RenderQueue/CaptionQueueProcessor.js +35 -8
  28. package/dist/components/RenderQueue/VideoMattingQueueItem.js +1 -0
  29. package/dist/components/RenderQueue/caption-job-types.d.ts +6 -0
  30. package/dist/components/RenderQueue/index.js +1 -0
  31. package/dist/components/RendersTab.js +2 -0
  32. package/dist/components/SelectedOutlineSnapIndicators.d.ts +6 -0
  33. package/dist/components/SelectedOutlineSnapIndicators.js +16 -12
  34. package/dist/components/SequencePropsSubscriptionProvider.d.ts +3 -0
  35. package/dist/components/SequencePropsSubscriptionProvider.js +8 -6
  36. package/dist/components/Timeline/TimelineDeleteKeybindings.js +6 -9
  37. package/dist/components/Timeline/TimelineEffectItem.js +1 -0
  38. package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -0
  39. package/dist/components/Timeline/TimelineExpandedRow.js +1 -0
  40. package/dist/components/Timeline/TimelineFieldLabel.js +1 -0
  41. package/dist/components/Timeline/TimelineKeyframeControls.js +1 -0
  42. package/dist/components/Timeline/TimelineSequence.js +26 -0
  43. package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
  44. package/dist/components/Timeline/TimelineSequenceItem.js +28 -0
  45. package/dist/components/Timeline/TimelineViewport.d.ts +1 -0
  46. package/dist/components/Timeline/TimelineViewport.js +10 -1
  47. package/dist/components/Timeline/delete-selected-timeline-item.js +2 -2
  48. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +3 -1
  49. package/dist/components/Timeline/get-sequence-context-menu-items.js +13 -1
  50. package/dist/components/Timeline/split-selected-timeline-item.d.ts +13 -10
  51. package/dist/components/Timeline/split-selected-timeline-item.js +58 -35
  52. package/dist/components/TimelineCombobox.js +1 -0
  53. package/dist/components/Transcription/TranscriptionModal.js +16 -11
  54. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +1 -1
  55. package/dist/components/WebMcp.js +1 -0
  56. package/dist/components/composition-drop-preview.d.ts +9 -2
  57. package/dist/components/composition-drop-preview.js +7 -4
  58. package/dist/components/composition-menu-items.js +4 -4
  59. package/dist/components/delete-jsx-nodes-api.d.ts +2 -0
  60. package/dist/components/{delete-jsx-node-api.js → delete-jsx-nodes-api.js} +5 -5
  61. package/dist/components/get-open-in-menu-items.js +7 -7
  62. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  63. package/dist/components/keyboard-shortcuts.js +3 -1
  64. package/dist/components/public-output-name.d.ts +1 -0
  65. package/dist/components/public-output-name.js +7 -3
  66. package/dist/esm/{CaptionQueueProcessor-k0yrm3dj.mjs → CaptionQueueProcessor-npa6szn1.mjs} +39 -8
  67. package/dist/esm/{LazyModels-nk7py0zt.mjs → LazyModels-nh3c8h9p.mjs} +4 -3
  68. package/dist/esm/{LazyModels-mtggyjye.mjs → LazyModels-rr5v8h5y.mjs} +4 -3
  69. package/dist/esm/{TranscriptionModal-ymnx1c7m.mjs → TranscriptionModal-79m5wgcj.mjs} +25 -17
  70. package/dist/esm/{VideoMattingModal-05vpczks.mjs → VideoMattingModal-31pew0xj.mjs} +9 -6
  71. package/dist/esm/index-21hxsfaa.mjs +239 -0
  72. package/dist/esm/{index-0gewwxse.mjs → index-4zen9prq.mjs} +2293 -2203
  73. package/dist/esm/index-5t2dwxsk.mjs +530 -0
  74. package/dist/esm/{index-5gd8k9yv.mjs → index-614tdz2q.mjs} +1 -1
  75. package/dist/esm/{index-cdy8v54v.mjs → index-9xxg6218.mjs} +20 -541
  76. package/dist/esm/{index-5bfxbpca.mjs → index-ac5550e7.mjs} +1 -1
  77. package/dist/esm/{index-eb5txqp6.mjs → index-e855w59j.mjs} +8 -86
  78. package/dist/esm/{index-4dsz9035.mjs → index-n5gmcvhz.mjs} +1 -1
  79. package/dist/esm/{index-bs39wngg.mjs → index-ppspzgn9.mjs} +3134 -2994
  80. package/dist/esm/{index-g7k2dvar.mjs → index-r0ejh5sy.mjs} +1 -1
  81. package/dist/esm/index-r1gr3j3a.mjs +80 -0
  82. package/dist/esm/{index-x40wwfmt.mjs → index-s7qa3xbw.mjs} +6 -4
  83. package/dist/esm/{index-f97r9e2g.mjs → index-vxwg66ar.mjs} +5 -3
  84. package/dist/esm/index.mjs +3 -2
  85. package/dist/esm/internals.mjs +10 -7
  86. package/dist/esm/previewEntry.mjs +10 -7
  87. package/dist/esm/{resolve-composition-component-location-bt2d6qxq.mjs → resolve-composition-component-location-qrp05g62.mjs} +1 -1
  88. package/dist/helpers/copy-text.js +1 -16
  89. package/dist/helpers/hoverable.js +2 -1
  90. package/dist/helpers/open-in-editor.js +1 -1
  91. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  92. package/dist/helpers/use-keybinding.d.ts +1 -1
  93. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  94. package/dist/helpers/use-menu-structure.js +15 -9
  95. package/dist/state/modals.d.ts +5 -0
  96. package/dist/state/timeline-zoom.js +4 -0
  97. package/package.json +19 -19
  98. package/dist/components/delete-jsx-node-api.d.ts +0 -2
@@ -7,7 +7,7 @@ import {
7
7
  VERTICAL_SCROLLBAR_CLASSNAME,
8
8
  ValidationMessage,
9
9
  optionsPanel
10
- } from "./index-cdy8v54v.mjs";
10
+ } from "./index-5t2dwxsk.mjs";
11
11
  import {
12
12
  BLUE,
13
13
  BORDER_WHITE_ALPHA_12,
@@ -0,0 +1,80 @@
1
+ // src/helpers/inserted-element-selection.ts
2
+ var pendingSelection = null;
3
+ var listeners = new Set;
4
+ var requestInsertedElementSelection = (selection) => {
5
+ pendingSelection = selection;
6
+ for (const listener of listeners) {
7
+ listener();
8
+ }
9
+ };
10
+ var clearInsertedElementSelection = (selection) => {
11
+ if (pendingSelection !== selection) {
12
+ return;
13
+ }
14
+ pendingSelection = null;
15
+ for (const listener of listeners) {
16
+ listener();
17
+ }
18
+ };
19
+ var subscribeToInsertedElementSelection = (listener) => {
20
+ listeners.add(listener);
21
+ return () => listeners.delete(listener);
22
+ };
23
+ var getInsertedElementSelection = () => pendingSelection;
24
+
25
+ // src/helpers/sequence-node-path-mutations.ts
26
+ var pendingMutations = [];
27
+ var seenMutationIds = new Set;
28
+ var queueSequenceNodePathMutation = (mutation) => {
29
+ if (seenMutationIds.has(mutation.mutationId)) {
30
+ return;
31
+ }
32
+ seenMutationIds.add(mutation.mutationId);
33
+ pendingMutations.push(mutation);
34
+ if (mutation.timelineSelection !== null) {
35
+ requestInsertedElementSelection({
36
+ compositionId: mutation.timelineSelection.compositionId,
37
+ nodePath: {
38
+ absolutePath: mutation.timelineSelection.absolutePath,
39
+ nodePath: mutation.timelineSelection.nodePath
40
+ },
41
+ notification: null
42
+ });
43
+ }
44
+ };
45
+ var queueSequenceNodePathMutationFromApiResponse = (response) => {
46
+ if (typeof response !== "object" || response === null || !("nodePathMutation" in response)) {
47
+ return;
48
+ }
49
+ const { nodePathMutation } = response;
50
+ if (typeof nodePathMutation !== "object" || nodePathMutation === null || !("mutationId" in nodePathMutation) || typeof nodePathMutation.mutationId !== "string") {
51
+ return;
52
+ }
53
+ queueSequenceNodePathMutation(nodePathMutation);
54
+ };
55
+ var takePendingSequenceNodePathMutations = () => pendingMutations.splice(0);
56
+
57
+ // src/components/call-api.ts
58
+ var callApi = (endpoint, body, signal) => {
59
+ return new Promise((resolve, reject) => {
60
+ fetch(endpoint, {
61
+ method: "post",
62
+ headers: {
63
+ "content-type": "application/json"
64
+ },
65
+ signal,
66
+ body: JSON.stringify(body)
67
+ }).then((res) => res.json()).then((data) => {
68
+ if (data.success) {
69
+ queueSequenceNodePathMutationFromApiResponse(data.data);
70
+ resolve(data.data);
71
+ } else {
72
+ reject(new Error(data.error));
73
+ }
74
+ }).catch((err) => {
75
+ reject(err);
76
+ });
77
+ });
78
+ };
79
+
80
+ export { requestInsertedElementSelection, clearInsertedElementSelection, subscribeToInsertedElementSelection, getInsertedElementSelection, queueSequenceNodePathMutation, takePendingSequenceNodePathMutations, callApi };
@@ -4,12 +4,14 @@ import {
4
4
  getFileManagerName,
5
5
  label,
6
6
  optionRow,
7
- rightRow,
7
+ rightRow
8
+ } from "./index-ppspzgn9.mjs";
9
+ import {
8
10
  showNotification
9
- } from "./index-bs39wngg.mjs";
11
+ } from "./index-21hxsfaa.mjs";
10
12
  import {
11
13
  openInFileExplorer
12
- } from "./index-eb5txqp6.mjs";
14
+ } from "./index-e855w59j.mjs";
13
15
  import {
14
16
  getBrowserStudioOperations
15
17
  } from "./index-cw0pnpg5.mjs";
@@ -18,7 +20,7 @@ import {
18
20
  InlineAction,
19
21
  Spacing,
20
22
  ValidationMessage
21
- } from "./index-cdy8v54v.mjs";
23
+ } from "./index-5t2dwxsk.mjs";
22
24
  import {
23
25
  WHITE
24
26
  } from "./index-k426ye99.mjs";
@@ -9,13 +9,15 @@ import {
9
9
  label,
10
10
  optionRow,
11
11
  rightRow,
12
- showNotification,
13
12
  useCopyFeedback,
14
13
  validatePublicOutputName
15
- } from "./index-bs39wngg.mjs";
14
+ } from "./index-ppspzgn9.mjs";
15
+ import {
16
+ showNotification
17
+ } from "./index-21hxsfaa.mjs";
16
18
  import {
17
19
  Spacing
18
- } from "./index-cdy8v54v.mjs";
20
+ } from "./index-5t2dwxsk.mjs";
19
21
  import {
20
22
  BLUE,
21
23
  CURRENT_COLOR_LOWERCASE,
@@ -3,7 +3,7 @@ import {
3
3
  play,
4
4
  seek,
5
5
  shutDownStudio
6
- } from "./index-4dsz9035.mjs";
6
+ } from "./index-n5gmcvhz.mjs";
7
7
  import {
8
8
  CodingAgentIcon,
9
9
  DEFAULT_PROPS_PATH_ACTIVE_CLASSNAME,
@@ -21,7 +21,8 @@ import {
21
21
  visualControlRef,
22
22
  visualControlStore,
23
23
  watchPublicFolder
24
- } from "./index-eb5txqp6.mjs";
24
+ } from "./index-e855w59j.mjs";
25
+ import"./index-r1gr3j3a.mjs";
25
26
  import {
26
27
  getBrowserStudioOperations,
27
28
  writeStaticFile
@@ -1,14 +1,17 @@
1
1
  import {
2
2
  Studio
3
- } from "./index-0gewwxse.mjs";
4
- import"./index-f97r9e2g.mjs";
5
- import"./index-x40wwfmt.mjs";
6
- import"./index-bs39wngg.mjs";
3
+ } from "./index-4zen9prq.mjs";
4
+ import"./index-vxwg66ar.mjs";
5
+ import"./index-s7qa3xbw.mjs";
6
+ import"./index-ppspzgn9.mjs";
7
+ import"./index-21hxsfaa.mjs";
7
8
  import"./index-9x6e1dq0.mjs";
8
- import"./index-4dsz9035.mjs";
9
- import"./index-eb5txqp6.mjs";
9
+ import"./index-n5gmcvhz.mjs";
10
+ import"./index-e855w59j.mjs";
11
+ import"./index-r1gr3j3a.mjs";
10
12
  import"./index-cw0pnpg5.mjs";
11
- import"./index-cdy8v54v.mjs";
13
+ import"./index-5t2dwxsk.mjs";
14
+ import"./index-9xxg6218.mjs";
12
15
  import"./index-5zrb1ft4.mjs";
13
16
  import"./index-k426ye99.mjs";
14
17
  import"./index-rcv7qkt5.mjs";
@@ -5,18 +5,21 @@ import {
5
5
  markErrorMessageAsLoggedByServer,
6
6
  setErrorsRef,
7
7
  startReportingRuntimeErrors
8
- } from "./index-0gewwxse.mjs";
9
- import"./index-f97r9e2g.mjs";
10
- import"./index-x40wwfmt.mjs";
8
+ } from "./index-4zen9prq.mjs";
9
+ import"./index-vxwg66ar.mjs";
10
+ import"./index-s7qa3xbw.mjs";
11
11
  import {
12
12
  reloadUrl,
13
13
  subscribeToPreviewServerEvents
14
- } from "./index-bs39wngg.mjs";
14
+ } from "./index-ppspzgn9.mjs";
15
+ import"./index-21hxsfaa.mjs";
15
16
  import"./index-9x6e1dq0.mjs";
16
- import"./index-4dsz9035.mjs";
17
- import"./index-eb5txqp6.mjs";
17
+ import"./index-n5gmcvhz.mjs";
18
+ import"./index-e855w59j.mjs";
19
+ import"./index-r1gr3j3a.mjs";
18
20
  import"./index-cw0pnpg5.mjs";
19
- import"./index-cdy8v54v.mjs";
21
+ import"./index-5t2dwxsk.mjs";
22
+ import"./index-9xxg6218.mjs";
20
23
  import"./index-5zrb1ft4.mjs";
21
24
  import {
22
25
  BACKGROUND_HEX,
@@ -1,6 +1,6 @@
1
1
  import"./index-rcv7qkt5.mjs";
2
2
 
3
- // ../studio-codemods/dist/esm/resolve-composition-component-location.mjs
3
+ // ../codemods/dist/esm/resolve-composition-component-location.mjs
4
4
  var __create = Object.create;
5
5
  var __getProtoOf = Object.getPrototypeOf;
6
6
  var __defProp = Object.defineProperty;
@@ -2,21 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.copyText = void 0;
4
4
  const copyText = (cmd) => {
5
- const permissionName = 'clipboard-write';
6
- return new Promise((resolve, reject) => {
7
- navigator.permissions
8
- .query({ name: permissionName })
9
- .then((result) => {
10
- if (result.state === 'granted' || result.state === 'prompt') {
11
- navigator.clipboard.writeText(cmd).then(resolve).catch(reject);
12
- }
13
- else {
14
- reject(new Error('Permission to copy not granted'));
15
- }
16
- })
17
- .catch((err) => {
18
- reject(err);
19
- });
20
- });
5
+ return navigator.clipboard.writeText(cmd);
21
6
  };
22
7
  exports.copyText = copyText;
@@ -77,7 +77,8 @@ const makeHoverableCSS = () => `
77
77
  overflow: hidden;
78
78
  }
79
79
 
80
- ${hoverGroup}:hover ${reveal} {
80
+ ${hoverGroup}:hover ${reveal},
81
+ ${hoverGroup}:has([aria-expanded="true"]) ${reveal} {
81
82
  opacity: 1;
82
83
  width: auto;
83
84
  overflow: visible;
@@ -174,7 +174,7 @@ const loadCompositionComponentInfo = async ({ compositionFile, compositionId, })
174
174
  if (files === null) {
175
175
  throw new Error(`Could not find source map contents for ${compositionFile}`);
176
176
  }
177
- const { resolveCompositionComponentLocation } = await Promise.resolve().then(() => __importStar(require('@remotion/studio-codemods/resolve-composition-component-location')));
177
+ const { resolveCompositionComponentLocation } = await Promise.resolve().then(() => __importStar(require('@remotion/codemods/resolve-composition-component-location')));
178
178
  return {
179
179
  canAddSequence: false,
180
180
  location: resolveCompositionComponentLocation({
@@ -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" | "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;
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" | "splitSequences" | "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;
@@ -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" | "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";
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" | "splitSequences" | "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" | "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;
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" | "splitSequences" | "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" | "splitSequences" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
@@ -186,7 +186,7 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, editorName, editorId, previewS
186
186
  quickSwitcherLabel: null,
187
187
  };
188
188
  };
189
- const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, renderShortcut, }) => {
189
+ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, renderShortcut, compositionSelected, }) => {
190
190
  return [
191
191
  readOnlyStudio
192
192
  ? null
@@ -210,6 +210,7 @@ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, ren
210
210
  leftItem: null,
211
211
  subMenu: null,
212
212
  quickSwitcherLabel: 'Render...',
213
+ disabled: !compositionSelected,
213
214
  },
214
215
  {
215
216
  id: 'render-on-web',
@@ -225,6 +226,7 @@ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, ren
225
226
  leftItem: null,
226
227
  subMenu: null,
227
228
  quickSwitcherLabel: 'Render in browser...',
229
+ disabled: !compositionSelected,
228
230
  },
229
231
  {
230
232
  type: 'divider',
@@ -778,6 +780,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
778
780
  previewServerState: type,
779
781
  readOnlyStudio,
780
782
  renderShortcut,
783
+ compositionSelected: currentComposition !== null,
781
784
  }),
782
785
  ...(0, composition_menu_items_1.getCompositionMenuItems)({
783
786
  closeMenu,
@@ -1100,7 +1103,7 @@ const getItemLabel = (item) => {
1100
1103
  }
1101
1104
  return (_a = item.label) === null || _a === void 0 ? void 0 : _a.toString();
1102
1105
  };
1103
- const itemToSearchResult = (item, setSelectedModal, prefixes) => {
1106
+ const itemToSearchResult = (item, setSelectedModal, prefixes, path) => {
1104
1107
  if (item.disabled) {
1105
1108
  return [];
1106
1109
  }
@@ -1110,23 +1113,26 @@ const itemToSearchResult = (item, setSelectedModal, prefixes) => {
1110
1113
  if (subItem.type !== 'item') {
1111
1114
  return null;
1112
1115
  }
1113
- return itemToSearchResult(subItem, setSelectedModal, [
1114
- ...prefixes,
1115
- getItemLabel(item),
1116
- ]);
1116
+ return itemToSearchResult(subItem, setSelectedModal, [...prefixes, getItemLabel(item)], [...path, subItem.id]);
1117
1117
  })
1118
1118
  .flat(1)
1119
1119
  .filter(no_react_1.NoReactInternals.truthy);
1120
1120
  }
1121
+ const label = getItemLabel(item);
1122
+ const distinctPrefixes = prefixes.filter((prefix, index) => prefix !== prefixes[index + 1]);
1123
+ if (distinctPrefixes.length > 0 &&
1124
+ label.startsWith(`${distinctPrefixes.at(-1)}: `)) {
1125
+ distinctPrefixes.pop();
1126
+ }
1121
1127
  return [
1122
1128
  {
1123
1129
  type: 'menu-item',
1124
- id: item.id,
1130
+ id: path.join(':'),
1125
1131
  onSelected: () => {
1126
1132
  setSelectedModal(null);
1127
1133
  item.onClick(item.id, null);
1128
1134
  },
1129
- title: [...prefixes, getItemLabel(item)].join(': '),
1135
+ title: [...distinctPrefixes, label].join(': '),
1130
1136
  },
1131
1137
  ];
1132
1138
  };
@@ -1137,7 +1143,7 @@ const makeSearchResults = (actions, setSelectedModal) => {
1137
1143
  if (item.type !== 'item') {
1138
1144
  return null;
1139
1145
  }
1140
- return itemToSearchResult(item, setSelectedModal, []);
1146
+ return itemToSearchResult(item, setSelectedModal, [], [menu.id, item.id]);
1141
1147
  });
1142
1148
  })
1143
1149
  .flat(Infinity)
@@ -127,6 +127,11 @@ export type TranscriptionModalState = {
127
127
  displayName: string;
128
128
  audioStreamIndex: number | null;
129
129
  requestInit: Omit<RequestInit, 'signal'> | null;
130
+ target: {
131
+ fileName: string;
132
+ nodePath: SequencePropsSubscriptionKey;
133
+ durationInFrames: number | null;
134
+ } | null;
130
135
  };
131
136
  export type VideoMattingModalState = {
132
137
  type: 'video-matting';
@@ -7,6 +7,7 @@ const react_dom_1 = require("react-dom");
7
7
  const imperative_state_1 = require("../components/Timeline/imperative-state");
8
8
  const timeline_refs_1 = require("../components/Timeline/timeline-refs");
9
9
  const timeline_scroll_logic_1 = require("../components/Timeline/timeline-scroll-logic");
10
+ const TimelineViewport_1 = require("../components/Timeline/TimelineViewport");
10
11
  const ZoomPersistor_1 = require("../components/ZoomPersistor");
11
12
  const get_timeline_max_zoom_1 = require("../helpers/get-timeline-max-zoom");
12
13
  exports.TimelineZoomCtx = (0, react_1.createContext)({
@@ -48,6 +49,9 @@ const TimelineZoomContext = ({ children }) => {
48
49
  // The new scroll range exists now, so the browser will not clamp the offset
49
50
  // against the previous width.
50
51
  preserveTimelineCursor();
52
+ // A large zoom can move beyond the old horizontal render window. Commit
53
+ // the new window before the browser paints the new scroll position.
54
+ (0, react_dom_1.flushSync)(TimelineViewport_1.syncTimelineViewport);
51
55
  }, []);
52
56
  const value = (0, react_1.useMemo)(() => {
53
57
  return {
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.526",
6
+ "version": "4.0.527",
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.526",
24
- "@remotion/whisper-webgpu": "4.0.526",
23
+ "@remotion/video-matting": "4.0.527",
24
+ "@remotion/whisper-webgpu": "4.0.527",
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.526",
39
- "@remotion/captions": "4.0.526",
40
- "@remotion/media": "4.0.526",
41
- "@remotion/media-utils": "4.0.526",
42
- "@remotion/player": "4.0.526",
43
- "@remotion/renderer": "4.0.526",
44
- "@remotion/studio-codemods": "4.0.526",
45
- "@remotion/studio-protocol": "4.0.526",
46
- "@remotion/studio-shared": "4.0.526",
47
- "@remotion/timeline-utils": "4.0.526",
48
- "@remotion/web-renderer": "4.0.526",
49
- "@remotion/zod-types": "4.0.526",
38
+ "@remotion/canvas": "4.0.527",
39
+ "@remotion/captions": "4.0.527",
40
+ "@remotion/media": "4.0.527",
41
+ "@remotion/media-utils": "4.0.527",
42
+ "@remotion/player": "4.0.527",
43
+ "@remotion/renderer": "4.0.527",
44
+ "@remotion/codemods": "4.0.527",
45
+ "@remotion/studio-protocol": "4.0.527",
46
+ "@remotion/studio-shared": "4.0.527",
47
+ "@remotion/timeline-utils": "4.0.527",
48
+ "@remotion/web-renderer": "4.0.527",
49
+ "@remotion/zod-types": "4.0.527",
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.526",
55
+ "remotion": "4.0.527",
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.526",
62
- "@remotion/video-matting": "4.0.526",
63
- "@remotion/whisper-webgpu": "4.0.526",
61
+ "@remotion/eslint-config-internal": "4.0.527",
62
+ "@remotion/video-matting": "4.0.527",
63
+ "@remotion/whisper-webgpu": "4.0.527",
64
64
  "@testing-library/react": "16.1.0",
65
65
  "@types/prismjs": "1.26.4",
66
66
  "@types/semver": "7.5.3",
@@ -1,2 +0,0 @@
1
- import type { DeleteJsxNodeRequest, DeleteJsxNodeResponse } from '@remotion/studio-shared';
2
- export declare const deleteJsxNode: (request: DeleteJsxNodeRequest) => Promise<DeleteJsxNodeResponse>;