@remotion/studio 4.0.525 → 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 (195) hide show
  1. package/dist/api/focus-default-props-path.js +7 -1
  2. package/dist/api/restart-studio.d.ts +1 -1
  3. package/dist/api/restart-studio.js +1 -1
  4. package/dist/components/AgentPrompt.d.ts +6 -0
  5. package/dist/components/AgentPrompt.js +107 -0
  6. package/dist/components/AssetFileIcon.js +2 -0
  7. package/dist/components/AssetSelectorItem.d.ts +1 -23
  8. package/dist/components/AssetSelectorItem.js +10 -200
  9. package/dist/components/Canvas.js +109 -44
  10. package/dist/components/CanvasCaptureDropHandler.js +63 -0
  11. package/dist/components/CanvasOrLoading.js +10 -2
  12. package/dist/components/CaptionInspector.js +9 -3
  13. package/dist/{error-overlay/remotion-overlay → components}/CodeFrame.d.ts +2 -0
  14. package/dist/components/CodeFrame.js +77 -0
  15. package/dist/components/CompositionSelectorItem.js +7 -17
  16. package/dist/components/CurrentAsset.js +6 -4
  17. package/dist/components/ElementInstallConfirmation.js +69 -38
  18. package/dist/components/FilePreview.js +4 -0
  19. package/dist/components/FixComputedValueModal.js +64 -96
  20. package/dist/components/GenerateWithAgentModal.d.ts +9 -0
  21. package/dist/components/GenerateWithAgentModal.js +39 -0
  22. package/dist/components/InitialCompositionLoader.js +1 -1
  23. package/dist/components/InlineDropdown.js +26 -2
  24. package/dist/components/InlineEditableTitle.js +3 -0
  25. package/dist/components/InspectorOpenInEditor.js +8 -4
  26. package/dist/components/InspectorPanel/CollapsibleInspectorSection.d.ts +7 -0
  27. package/dist/components/InspectorPanel/CollapsibleInspectorSection.js +14 -0
  28. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +1 -1
  29. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +20 -8
  30. package/dist/components/InspectorPanel/CompositionInspector.js +32 -15
  31. package/dist/components/InspectorPanel/CompositionMetadata.js +7 -0
  32. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +6 -12
  33. package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -0
  34. package/dist/components/InspectorPanel/GuideInspector.js +2 -3
  35. package/dist/components/InspectorPanel/KeyframeSettings.js +5 -6
  36. package/dist/components/InspectorPanel/MultiSequenceInspector.js +34 -2
  37. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +45 -4
  38. package/dist/components/InspectorPanel/common.d.ts +4 -0
  39. package/dist/components/InspectorPanel/common.js +15 -2
  40. package/dist/components/InspectorPanel/styles.d.ts +0 -3
  41. package/dist/components/InspectorPanel/styles.js +3 -27
  42. package/dist/components/InspectorPanel/use-composition-actions.d.ts +2 -0
  43. package/dist/components/InspectorPanel/use-composition-actions.js +16 -0
  44. package/dist/components/InspectorPanel/use-inspector-section-expanded.d.ts +1 -0
  45. package/dist/components/InspectorPanel/use-inspector-section-expanded.js +21 -0
  46. package/dist/components/InspectorSequenceSection.js +44 -35
  47. package/dist/components/InspectorSourceLocation.js +4 -0
  48. package/dist/components/KeyboardShortcutsSettings.js +12 -4
  49. package/dist/components/LutPreview.d.ts +4 -0
  50. package/dist/components/LutPreview.js +192 -0
  51. package/dist/components/MenuBuildIndicator.js +1 -0
  52. package/dist/components/MenuCompositionName.js +4 -9
  53. package/dist/components/Modals.js +3 -6
  54. package/dist/components/ModelsSettings.js +15 -4
  55. package/dist/components/NewComposition/CancelButton.js +1 -1
  56. package/dist/components/Notifications/NotificationCenter.d.ts +0 -1
  57. package/dist/components/Notifications/NotificationCenter.js +1 -22
  58. package/dist/components/Preview.js +3 -0
  59. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -0
  60. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  61. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +4 -9
  62. package/dist/components/RadioButton.js +1 -0
  63. package/dist/components/RenderModal/DataEditor.js +4 -1
  64. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.d.ts +1 -0
  65. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.js +2 -1
  66. package/dist/components/RenderModal/WebRenderModal.js +10 -2
  67. package/dist/components/RenderQueue/CaptionQueueItem.js +5 -2
  68. package/dist/components/RenderQueue/CaptionQueueProcessor.js +35 -8
  69. package/dist/components/RenderQueue/VideoMattingQueueItem.js +1 -0
  70. package/dist/components/RenderQueue/caption-job-types.d.ts +6 -0
  71. package/dist/components/RenderQueue/index.js +1 -0
  72. package/dist/components/RendersTab.js +4 -0
  73. package/dist/components/SelectedOutlineElement.js +6 -0
  74. package/dist/components/SelectedOutlineSnapIndicators.d.ts +6 -0
  75. package/dist/components/SelectedOutlineSnapIndicators.js +16 -12
  76. package/dist/components/SequencePropsSubscriptionProvider.d.ts +3 -0
  77. package/dist/components/SequencePropsSubscriptionProvider.js +8 -6
  78. package/dist/components/SettingsButton.js +11 -2
  79. package/dist/components/SettingsModal.d.ts +1 -2
  80. package/dist/components/SettingsModal.js +24 -6
  81. package/dist/components/SettingsModalFooter.js +17 -3
  82. package/dist/components/SkillsSettings.d.ts +5 -0
  83. package/dist/components/SkillsSettings.js +29 -26
  84. package/dist/components/Timeline/Timeline.js +10 -11
  85. package/dist/components/Timeline/TimelineAssetField.js +81 -51
  86. package/dist/components/Timeline/TimelineDeleteKeybindings.js +6 -9
  87. package/dist/components/Timeline/TimelineEffectItem.js +1 -0
  88. package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -0
  89. package/dist/components/Timeline/TimelineExpandedRow.js +1 -0
  90. package/dist/components/Timeline/TimelineFieldLabel.js +1 -0
  91. package/dist/components/Timeline/TimelineHeightContainer.js +11 -1
  92. package/dist/components/Timeline/TimelineKeyframeControls.js +16 -1
  93. package/dist/components/Timeline/TimelineLayerChildren.d.ts +3 -3
  94. package/dist/components/Timeline/TimelineLayerChildren.js +11 -9
  95. package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -1
  96. package/dist/components/Timeline/TimelineLayerEye.js +6 -3
  97. package/dist/components/Timeline/TimelineList.js +9 -3
  98. package/dist/components/Timeline/TimelineSchemaField.js +2 -6
  99. package/dist/components/Timeline/TimelineSelection.d.ts +14 -3
  100. package/dist/components/Timeline/TimelineSelection.js +91 -49
  101. package/dist/components/Timeline/TimelineSequence.js +28 -2
  102. package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
  103. package/dist/components/Timeline/TimelineSequenceItem.d.ts +2 -0
  104. package/dist/components/Timeline/TimelineSequenceItem.js +45 -13
  105. package/dist/components/Timeline/TimelineViewport.d.ts +1 -0
  106. package/dist/components/Timeline/TimelineViewport.js +10 -1
  107. package/dist/components/Timeline/TimelineVirtualization.d.ts +3 -3
  108. package/dist/components/Timeline/delete-selected-timeline-item.js +2 -2
  109. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -2
  110. package/dist/components/Timeline/get-sequence-context-menu-items.js +143 -46
  111. package/dist/components/Timeline/normalize-font-weight-for-keyframe.d.ts +1 -0
  112. package/dist/components/Timeline/normalize-font-weight-for-keyframe.js +19 -0
  113. package/dist/components/Timeline/split-selected-timeline-item.d.ts +13 -10
  114. package/dist/components/Timeline/split-selected-timeline-item.js +58 -35
  115. package/dist/components/Timeline/timeline-display-groups.d.ts +9 -0
  116. package/dist/components/Timeline/timeline-display-groups.js +66 -0
  117. package/dist/components/Timeline/use-timeline-asset-drop.js +21 -21
  118. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +2 -1
  119. package/dist/components/Timeline/use-timeline-expanded-tree.js +1 -2
  120. package/dist/components/TimelineCombobox.js +1 -0
  121. package/dist/components/Transcription/TranscriptionModal.js +16 -11
  122. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +1 -1
  123. package/dist/components/UpdateStatusContext.d.ts +2 -2
  124. package/dist/components/UpdateStatusContext.js +6 -7
  125. package/dist/components/UpdatesSettings.js +6 -6
  126. package/dist/components/WebMcp.js +41 -41
  127. package/dist/components/asset-context-menu.d.ts +32 -0
  128. package/dist/components/asset-context-menu.js +242 -0
  129. package/dist/components/composition-drop-preview.d.ts +9 -2
  130. package/dist/components/composition-drop-preview.js +7 -4
  131. package/dist/components/composition-menu-items.d.ts +4 -6
  132. package/dist/components/composition-menu-items.js +191 -75
  133. package/dist/components/delete-jsx-nodes-api.d.ts +2 -0
  134. package/dist/components/{delete-jsx-node-api.js → delete-jsx-nodes-api.js} +5 -5
  135. package/dist/components/get-open-in-menu-items.d.ts +6 -5
  136. package/dist/components/get-open-in-menu-items.js +22 -16
  137. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  138. package/dist/components/keyboard-shortcuts.js +3 -1
  139. package/dist/components/public-output-name.d.ts +1 -0
  140. package/dist/components/public-output-name.js +7 -3
  141. package/dist/components/selected-outline-order.js +18 -12
  142. package/dist/components/use-open-in-menu-apps.d.ts +14 -0
  143. package/dist/components/use-open-in-menu-apps.js +33 -0
  144. package/dist/error-overlay/remotion-overlay/ErrorDisplay.js +2 -2
  145. package/dist/error-overlay/remotion-overlay/OpenInEditor.d.ts +1 -0
  146. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +3 -3
  147. package/dist/error-overlay/remotion-overlay/StackFrame.d.ts +5 -1
  148. package/dist/error-overlay/remotion-overlay/StackFrame.js +26 -19
  149. package/dist/esm/{CaptionQueueProcessor-k0yrm3dj.mjs → CaptionQueueProcessor-npa6szn1.mjs} +39 -8
  150. package/dist/esm/{LazyModels-gfmpcy4h.mjs → LazyModels-nh3c8h9p.mjs} +4 -3
  151. package/dist/esm/{LazyModels-m1rf06wh.mjs → LazyModels-rr5v8h5y.mjs} +4 -3
  152. package/dist/esm/{TranscriptionModal-8pvrehg4.mjs → TranscriptionModal-79m5wgcj.mjs} +25 -17
  153. package/dist/esm/{VideoMattingModal-fefbzgka.mjs → VideoMattingModal-31pew0xj.mjs} +9 -6
  154. package/dist/esm/index-21hxsfaa.mjs +239 -0
  155. package/dist/esm/{index-s848rffx.mjs → index-4zen9prq.mjs} +5438 -4686
  156. package/dist/esm/index-5t2dwxsk.mjs +530 -0
  157. package/dist/esm/{index-vsxrxfpj.mjs → index-614tdz2q.mjs} +1 -1
  158. package/dist/esm/{index-0x13f28h.mjs → index-9xxg6218.mjs} +20 -541
  159. package/dist/esm/{index-hbezgbbq.mjs → index-ac5550e7.mjs} +1 -1
  160. package/dist/esm/{index-41kqns5c.mjs → index-e855w59j.mjs} +15 -92
  161. package/dist/esm/{index-tzxb8808.mjs → index-n5gmcvhz.mjs} +8 -8
  162. package/dist/esm/{index-ggqpre9v.mjs → index-ppspzgn9.mjs} +4963 -4178
  163. package/dist/esm/{index-jrw61pkj.mjs → index-r0ejh5sy.mjs} +1 -1
  164. package/dist/esm/index-r1gr3j3a.mjs +80 -0
  165. package/dist/esm/{index-mww32xc8.mjs → index-s7qa3xbw.mjs} +6 -4
  166. package/dist/esm/{index-1089795y.mjs → index-vxwg66ar.mjs} +7 -22
  167. package/dist/esm/index.mjs +13 -6
  168. package/dist/esm/internals.mjs +10 -7
  169. package/dist/esm/previewEntry.mjs +10 -7
  170. package/dist/esm/{resolve-composition-component-location-bt2d6qxq.mjs → resolve-composition-component-location-qrp05g62.mjs} +1 -1
  171. package/dist/helpers/client-id.d.ts +1 -0
  172. package/dist/helpers/client-id.js +8 -4
  173. package/dist/helpers/copy-text.js +1 -16
  174. package/dist/helpers/cube-lut.d.ts +12 -0
  175. package/dist/helpers/cube-lut.js +160 -0
  176. package/dist/helpers/get-preview-file-type.d.ts +1 -1
  177. package/dist/helpers/get-preview-file-type.js +3 -0
  178. package/dist/helpers/hoverable.js +2 -1
  179. package/dist/helpers/open-in-editor.d.ts +5 -2
  180. package/dist/helpers/open-in-editor.js +13 -5
  181. package/dist/helpers/settings-tab-availability.d.ts +14 -0
  182. package/dist/helpers/settings-tab-availability.js +35 -0
  183. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  184. package/dist/helpers/use-keybinding.d.ts +1 -1
  185. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  186. package/dist/helpers/use-menu-structure.js +31 -21
  187. package/dist/icons/lut.d.ts +4 -0
  188. package/dist/icons/lut.js +6 -0
  189. package/dist/icons/sparkles.d.ts +4 -0
  190. package/dist/icons/sparkles.js +6 -0
  191. package/dist/state/modals.d.ts +17 -2
  192. package/dist/state/timeline-zoom.js +4 -0
  193. package/package.json +19 -19
  194. package/dist/components/delete-jsx-node-api.d.ts +0 -2
  195. package/dist/error-overlay/remotion-overlay/CodeFrame.js +0 -62
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.WebMcp = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
37
38
  const studio_shared_1 = require("@remotion/studio-shared");
38
39
  const react_1 = require("react");
39
40
  const remotion_1 = require("remotion");
@@ -128,20 +129,10 @@ const resolveAssetPath = ({ assetPath, currentContent, staticFiles, }) => {
128
129
  }
129
130
  return resolvedAssetPath;
130
131
  };
131
- const WebMcp = () => {
132
+ const WebMcpSelectionSync = ({ currentSelectionRef, selectedSequenceRef }) => {
132
133
  var _a;
133
- var _b, _c, _d, _e, _f;
134
- const { addCaptionJob, addVideoMattingJob } = (0, react_1.useContext)(context_1.RenderQueueContext);
135
- const staticFiles = (0, use_static_files_1.useStaticFiles)();
136
- const { canSelect, clearSelection, selectedItems, selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
137
- const { canvasContent, compositions, currentCompositionMetadata, folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
138
- const { playbackRate: currentPlaybackRate, setPlaybackRate } = remotion_1.Internals.usePlaybackRate();
139
- const { isPlaying } = remotion_1.Internals.Timeline.useTimelineContext();
140
- const { mediaVolume, playerMuted } = (0, react_1.useContext)(remotion_1.Internals.MediaVolumeContext);
141
- const { setPlayerMuted } = (0, react_1.useContext)(remotion_1.Internals.SetMediaVolumeContext);
142
- const { setZoom: setTimelineZoom, zoom: timelineZoomMap } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
143
- const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
144
- const { editorShowGuides, guidesList, setEditorShowGuides, setGuidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
134
+ var _b, _c, _d, _e;
135
+ const { selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
145
136
  const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
146
137
  const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
147
138
  const selectedItem = selectedItems.length === 1 ? selectedItems[0] : null;
@@ -161,16 +152,10 @@ const WebMcp = () => {
161
152
  const currentResolvedLocation = stack === currentStack ? resolvedLocation : null;
162
153
  const currentSelection = (0, react_1.useMemo)(() => {
163
154
  var _a;
164
- if (selectedItems.length === 0) {
165
- return null;
166
- }
167
- if (selectedItems.length > 1) {
168
- return null;
169
- }
170
- if (selectedItem === null || selectedItem.type === 'guide') {
171
- return null;
172
- }
173
- if (track === null) {
155
+ if (selectedItems.length !== 1 ||
156
+ selectedItem === null ||
157
+ selectedItem.type === 'guide' ||
158
+ track === null) {
174
159
  return null;
175
160
  }
176
161
  let name;
@@ -209,15 +194,28 @@ const WebMcp = () => {
209
194
  root: window.remotion_cwd,
210
195
  });
211
196
  }, [currentResolvedLocation, selectedItem, selectedItems.length, track]);
212
- const currentSelectionRef = (0, react_1.useRef)(currentSelection);
213
197
  currentSelectionRef.current = currentSelection;
214
- const selectedSequence = (0, react_1.useMemo)(() => (track === null ? null : serializeSequence(track)), [track]);
215
- const selectedSequenceRef = (0, react_1.useRef)(selectedSequence);
216
- selectedSequenceRef.current = selectedSequence;
217
- const selectedItemsRef = (0, react_1.useRef)(selectedItems);
218
- selectedItemsRef.current = selectedItems;
219
- const canSelectRef = (0, react_1.useRef)(canSelect);
220
- canSelectRef.current = canSelect;
198
+ selectedSequenceRef.current =
199
+ track === null ? null : serializeSequence(track);
200
+ return null;
201
+ };
202
+ const WebMcp = () => {
203
+ var _a;
204
+ const { addCaptionJob, addVideoMattingJob } = (0, react_1.useContext)(context_1.RenderQueueContext);
205
+ const staticFiles = (0, use_static_files_1.useStaticFiles)();
206
+ const timelineSelectionRef = (0, TimelineSelection_1.useCurrentTimelineSelectionStateAsRef)();
207
+ const currentSelectionRef = (0, react_1.useRef)(null);
208
+ const selectedSequenceRef = (0, react_1.useRef)(null);
209
+ const { canvasContent, compositions, currentCompositionMetadata, folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
210
+ const { playbackRate: currentPlaybackRate, setPlaybackRate } = remotion_1.Internals.usePlaybackRate();
211
+ const { isPlaying } = remotion_1.Internals.Timeline.useTimelineContext();
212
+ const { mediaVolume, playerMuted } = (0, react_1.useContext)(remotion_1.Internals.MediaVolumeContext);
213
+ const { setPlayerMuted } = (0, react_1.useContext)(remotion_1.Internals.SetMediaVolumeContext);
214
+ const { setZoom: setTimelineZoom, zoom: timelineZoomMap } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
215
+ const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
216
+ const { editorShowGuides, guidesList, setEditorShowGuides, setGuidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
217
+ const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
218
+ const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
221
219
  const currentCompositionDefinition = (0, react_1.useMemo)(() => {
222
220
  var _a;
223
221
  if ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) !== 'composition') {
@@ -241,7 +239,7 @@ const WebMcp = () => {
241
239
  currentContentRef.current = currentContent;
242
240
  const staticFilesRef = (0, react_1.useRef)(staticFiles);
243
241
  staticFilesRef.current = staticFiles;
244
- const currentComposition = (_f = currentCompositionDefinition === null || currentCompositionDefinition === void 0 ? void 0 : currentCompositionDefinition.id) !== null && _f !== void 0 ? _f : null;
242
+ const currentComposition = (_a = currentCompositionDefinition === null || currentCompositionDefinition === void 0 ? void 0 : currentCompositionDefinition.id) !== null && _a !== void 0 ? _a : null;
245
243
  const currentCompositionRef = (0, react_1.useRef)(currentComposition);
246
244
  currentCompositionRef.current = currentComposition;
247
245
  const currentCompositionDefinitionRef = (0, react_1.useRef)(currentCompositionDefinition);
@@ -478,6 +476,7 @@ const WebMcp = () => {
478
476
  model: model.name,
479
477
  noRepeatNgramSize,
480
478
  outName: outputPath,
479
+ target: null,
481
480
  repetitionPenalty,
482
481
  requestInit: null,
483
482
  src,
@@ -766,7 +765,7 @@ const WebMcp = () => {
766
765
  if (compositionId === null) {
767
766
  throw new Error('No composition is currently selected.');
768
767
  }
769
- if (!canSelectRef.current) {
768
+ if (!timelineSelectionRef.current.canSelect) {
770
769
  throw new Error('Studio sequence selection is unavailable.');
771
770
  }
772
771
  const timelineTrack = getCurrentTimeline().find((candidate) => candidate.sequence.id === sequenceId);
@@ -777,7 +776,9 @@ const WebMcp = () => {
777
776
  if (selection === null) {
778
777
  throw new Error(`Sequence ${sequenceId} cannot be selected.`);
779
778
  }
780
- selectItems([selection], { reveal: true });
779
+ timelineSelectionRef.current.selectItems([selection], {
780
+ reveal: true,
781
+ });
781
782
  return Promise.resolve({
782
783
  currentContent: currentContentRef.current,
783
784
  selectedSequence: serializeSequence(timelineTrack),
@@ -1025,8 +1026,8 @@ const WebMcp = () => {
1025
1026
  currentFrame: (0, imperative_state_1.getCurrentFrame)(),
1026
1027
  currentSelection: currentSelectionRef.current,
1027
1028
  currentContent: currentContentRef.current,
1028
- selectionType: selectedItemsRef.current.length === 1
1029
- ? selectedItemsRef.current[0].type
1029
+ selectionType: timelineSelectionRef.current.selectedItems.length === 1
1030
+ ? timelineSelectionRef.current.selectedItems[0].type
1030
1031
  : null,
1031
1032
  selectedSequence: selectedSequenceRef.current,
1032
1033
  }),
@@ -1181,9 +1182,9 @@ const WebMcp = () => {
1181
1182
  guidesListRef.current = nextGuides;
1182
1183
  setGuidesList(() => nextGuides);
1183
1184
  (0, editor_guides_1.persistGuidesList)(nextGuides);
1184
- const removedGuideWasSelected = selectedItemsRef.current.some((item) => item.type === 'guide' && item.guideId === guideId);
1185
+ const removedGuideWasSelected = timelineSelectionRef.current.selectedItems.some((item) => item.type === 'guide' && item.guideId === guideId);
1185
1186
  if (removedGuideWasSelected) {
1186
- clearSelection();
1187
+ timelineSelectionRef.current.clearSelection();
1187
1188
  }
1188
1189
  return Promise.resolve({
1189
1190
  currentContent: currentContentRef.current,
@@ -1426,16 +1427,15 @@ const WebMcp = () => {
1426
1427
  }, [
1427
1428
  addCaptionJob,
1428
1429
  addVideoMattingJob,
1429
- clearSelection,
1430
1430
  isPlaying,
1431
1431
  selectComposition,
1432
- selectItems,
1433
1432
  setEditorShowGuides,
1434
1433
  setGuidesList,
1435
1434
  setPlaybackRate,
1436
1435
  setPlayerMuted,
1437
1436
  setTimelineZoom,
1437
+ timelineSelectionRef,
1438
1438
  ]);
1439
- return null;
1439
+ return (jsx_runtime_1.jsx(WebMcpSelectionSync, { currentSelectionRef: currentSelectionRef, selectedSequenceRef: selectedSequenceRef }));
1440
1440
  };
1441
1441
  exports.WebMcp = WebMcp;
@@ -0,0 +1,32 @@
1
+ import type { ComboboxValue } from './NewComposition/ComboBox';
2
+ export declare const getAssetActionAvailability: ({ browserStudioCanMutateAssets, readOnlyStudio, connectionStatus, publicFolderExists, }: {
3
+ browserStudioCanMutateAssets: boolean | null;
4
+ readOnlyStudio: boolean;
5
+ connectionStatus: "connected" | "disconnected" | "init";
6
+ publicFolderExists: string | null;
7
+ }) => {
8
+ mutationsDisabled: boolean;
9
+ fileExplorerDisabled: boolean;
10
+ };
11
+ export declare const getAssetContextMenuItems: ({ relativePath, fileManagerName, copyFileName, copyStaticFilePath, copyAbsolutePath, openAssetInConvert, openAssetInExplorer, renameAsset, deleteAsset, fileExplorerAvailable, fileExplorerDisabled, mutationsDisabled, }: {
12
+ relativePath: string;
13
+ fileManagerName: string;
14
+ copyFileName: () => void;
15
+ copyStaticFilePath: () => void;
16
+ copyAbsolutePath: (() => void) | null;
17
+ openAssetInConvert: () => void;
18
+ openAssetInExplorer: () => void;
19
+ renameAsset: () => void;
20
+ deleteAsset: () => void;
21
+ fileExplorerAvailable: boolean;
22
+ fileExplorerDisabled: boolean;
23
+ mutationsDisabled: boolean;
24
+ }) => ComboboxValue[];
25
+ export declare const useAssetContextMenuItems: ({ relativePath, readOnlyStudio, }: {
26
+ relativePath: string | null;
27
+ readOnlyStudio: boolean;
28
+ }) => {
29
+ fileExplorerDisabled: boolean;
30
+ fileManagerName: string;
31
+ getContextMenuItems: () => ComboboxValue[];
32
+ };
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useAssetContextMenuItems = exports.getAssetContextMenuItems = exports.getAssetActionAvailability = void 0;
4
+ const react_1 = require("react");
5
+ const no_react_1 = require("remotion/no-react");
6
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
7
+ const client_id_1 = require("../helpers/client-id");
8
+ const copy_text_1 = require("../helpers/copy-text");
9
+ const get_file_manager_name_1 = require("../helpers/get-file-manager-name");
10
+ const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
11
+ const open_in_remotion_convert_1 = require("../helpers/open-in-remotion-convert");
12
+ const modals_1 = require("../state/modals");
13
+ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
14
+ const open_in_new_window_1 = require("./open-in-new-window");
15
+ const actions_1 = require("./RenderQueue/actions");
16
+ const use_delete_asset_1 = require("./use-delete-asset");
17
+ const getAssetActionAvailability = ({ browserStudioCanMutateAssets, readOnlyStudio, connectionStatus, publicFolderExists, }) => {
18
+ return {
19
+ mutationsDisabled: browserStudioCanMutateAssets !== true &&
20
+ (readOnlyStudio || connectionStatus !== 'connected'),
21
+ fileExplorerDisabled: browserStudioCanMutateAssets !== null ||
22
+ publicFolderExists === null ||
23
+ readOnlyStudio ||
24
+ connectionStatus !== 'connected',
25
+ };
26
+ };
27
+ exports.getAssetActionAvailability = getAssetActionAvailability;
28
+ const getAssetContextMenuItems = ({ relativePath, fileManagerName, copyFileName, copyStaticFilePath, copyAbsolutePath, openAssetInConvert, openAssetInExplorer, renameAsset, deleteAsset, fileExplorerAvailable, fileExplorerDisabled, mutationsDisabled, }) => {
29
+ const previewFileType = (0, get_preview_file_type_1.getPreviewFileType)(relativePath);
30
+ const canOpenInConvert = previewFileType === 'audio' || previewFileType === 'video';
31
+ const items = [
32
+ (0, open_in_new_window_1.getOpenInNewWindowMenuItem)(`/assets/${relativePath}`),
33
+ canOpenInConvert
34
+ ? {
35
+ id: 'open-asset-in-convert',
36
+ keyHint: null,
37
+ label: 'Open in Remotion Convert',
38
+ leftItem: null,
39
+ onClick: openAssetInConvert,
40
+ quickSwitcherLabel: 'Open asset in Remotion Convert',
41
+ subMenu: null,
42
+ type: 'item',
43
+ value: 'open-asset-in-convert',
44
+ }
45
+ : null,
46
+ {
47
+ type: 'divider',
48
+ id: 'open-in-new-window-divider',
49
+ },
50
+ {
51
+ id: 'copy-asset-file-name',
52
+ keyHint: null,
53
+ label: 'Copy file name',
54
+ leftItem: null,
55
+ onClick: copyFileName,
56
+ quickSwitcherLabel: 'Copy asset file name',
57
+ subMenu: null,
58
+ type: 'item',
59
+ value: 'copy-asset-file-name',
60
+ },
61
+ {
62
+ id: 'copy-asset-static-file-path',
63
+ keyHint: null,
64
+ label: 'Copy staticFile() path',
65
+ leftItem: null,
66
+ onClick: copyStaticFilePath,
67
+ quickSwitcherLabel: 'Copy staticFile() path',
68
+ subMenu: null,
69
+ type: 'item',
70
+ value: 'copy-asset-static-file-path',
71
+ },
72
+ copyAbsolutePath
73
+ ? {
74
+ id: 'copy-asset-absolute-path',
75
+ keyHint: null,
76
+ label: 'Copy absolute path',
77
+ leftItem: null,
78
+ onClick: copyAbsolutePath,
79
+ quickSwitcherLabel: 'Copy asset absolute path',
80
+ subMenu: null,
81
+ type: 'item',
82
+ value: 'copy-asset-absolute-path',
83
+ }
84
+ : null,
85
+ {
86
+ type: 'divider',
87
+ id: 'asset-file-actions-divider',
88
+ },
89
+ fileExplorerAvailable
90
+ ? {
91
+ id: 'open-asset-in-explorer',
92
+ keyHint: null,
93
+ label: `Show in ${fileManagerName}`,
94
+ leftItem: null,
95
+ onClick: openAssetInExplorer,
96
+ quickSwitcherLabel: `Show asset in ${fileManagerName}`,
97
+ subMenu: null,
98
+ type: 'item',
99
+ value: 'open-asset-in-explorer',
100
+ disabled: fileExplorerDisabled,
101
+ }
102
+ : null,
103
+ {
104
+ id: 'rename-asset',
105
+ keyHint: null,
106
+ label: 'Rename...',
107
+ leftItem: null,
108
+ onClick: renameAsset,
109
+ quickSwitcherLabel: 'Rename asset...',
110
+ subMenu: null,
111
+ type: 'item',
112
+ value: 'rename-asset',
113
+ disabled: mutationsDisabled,
114
+ },
115
+ {
116
+ id: 'delete-asset',
117
+ keyHint: null,
118
+ label: 'Delete...',
119
+ leftItem: null,
120
+ onClick: deleteAsset,
121
+ quickSwitcherLabel: 'Delete asset...',
122
+ subMenu: null,
123
+ type: 'item',
124
+ value: 'delete-asset',
125
+ disabled: mutationsDisabled,
126
+ },
127
+ ];
128
+ return items.filter(no_react_1.NoReactInternals.truthy);
129
+ };
130
+ exports.getAssetContextMenuItems = getAssetContextMenuItems;
131
+ const useAssetContextMenuItems = ({ relativePath, readOnlyStudio, }) => {
132
+ var _a;
133
+ const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
134
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
135
+ const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
136
+ .previewServerState.type;
137
+ const fileName = (_a = relativePath === null || relativePath === void 0 ? void 0 : relativePath.split('/').pop()) !== null && _a !== void 0 ? _a : null;
138
+ const copyFileName = (0, react_1.useCallback)(() => {
139
+ if (fileName === null) {
140
+ return;
141
+ }
142
+ (0, copy_text_1.copyText)(fileName)
143
+ .then(() => {
144
+ (0, NotificationCenter_1.showNotification)(`Copied '${fileName}' to clipboard`, 1000);
145
+ })
146
+ .catch((err) => {
147
+ (0, NotificationCenter_1.showNotification)(`Could not copy: ${err.message}`, 2000);
148
+ });
149
+ }, [fileName]);
150
+ const copyStaticFilePath = (0, react_1.useCallback)(() => {
151
+ if (relativePath === null) {
152
+ return;
153
+ }
154
+ const content = `staticFile("${relativePath}")`;
155
+ (0, copy_text_1.copyText)(content)
156
+ .then(() => {
157
+ (0, NotificationCenter_1.showNotification)(`Copied '${content}' to clipboard`, 1000);
158
+ })
159
+ .catch((err) => {
160
+ (0, NotificationCenter_1.showNotification)(`Could not copy: ${err.message}`, 2000);
161
+ });
162
+ }, [relativePath]);
163
+ const copyAbsolutePath = (0, react_1.useCallback)(() => {
164
+ if (relativePath === null || window.remotion_publicFolderExists === null) {
165
+ return;
166
+ }
167
+ const content = `${window.remotion_publicFolderExists}/${relativePath}`;
168
+ (0, copy_text_1.copyText)(content)
169
+ .then(() => {
170
+ (0, NotificationCenter_1.showNotification)(`Copied '${content}' to clipboard`, 1000);
171
+ })
172
+ .catch((err) => {
173
+ (0, NotificationCenter_1.showNotification)(`Could not copy: ${err.message}`, 2000);
174
+ });
175
+ }, [relativePath]);
176
+ const openAssetInConvert = (0, react_1.useCallback)(() => {
177
+ if (relativePath === null) {
178
+ return;
179
+ }
180
+ (0, open_in_remotion_convert_1.openInRemotionConvert)({ relativePath });
181
+ }, [relativePath]);
182
+ const openAssetInExplorer = (0, react_1.useCallback)(() => {
183
+ if (relativePath === null || !window.remotion_publicFolderExists) {
184
+ (0, NotificationCenter_1.showNotification)('Could not find the public folder', 2000);
185
+ return;
186
+ }
187
+ (0, actions_1.openInFileExplorer)({
188
+ directory: window.remotion_publicFolderExists + '/' + relativePath,
189
+ }).catch((err) => {
190
+ (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
191
+ });
192
+ }, [relativePath]);
193
+ const { mutationsDisabled, fileExplorerDisabled } = (0, exports.getAssetActionAvailability)({
194
+ browserStudioCanMutateAssets: (0, browser_studio_operations_1.getBrowserStudioOperations)() === null ? null : true,
195
+ readOnlyStudio,
196
+ connectionStatus,
197
+ publicFolderExists: window.remotion_publicFolderExists,
198
+ });
199
+ const deleteAsset = (0, use_delete_asset_1.useDeleteAsset)(relativePath);
200
+ const renameAsset = (0, react_1.useCallback)(() => {
201
+ if (relativePath === null) {
202
+ return;
203
+ }
204
+ setSelectedModal({
205
+ type: 'rename-static-file',
206
+ relativePath,
207
+ });
208
+ }, [relativePath, setSelectedModal]);
209
+ const getContextMenuItems = (0, react_1.useCallback)(() => {
210
+ if (relativePath === null) {
211
+ return [];
212
+ }
213
+ return (0, exports.getAssetContextMenuItems)({
214
+ relativePath,
215
+ fileManagerName,
216
+ copyFileName,
217
+ copyStaticFilePath,
218
+ copyAbsolutePath: window.remotion_publicFolderExists === null ? null : copyAbsolutePath,
219
+ openAssetInConvert,
220
+ openAssetInExplorer,
221
+ renameAsset,
222
+ deleteAsset,
223
+ fileExplorerAvailable: (0, browser_studio_operations_1.getBrowserStudioOperations)() === null,
224
+ fileExplorerDisabled,
225
+ mutationsDisabled,
226
+ });
227
+ }, [
228
+ copyFileName,
229
+ copyStaticFilePath,
230
+ copyAbsolutePath,
231
+ deleteAsset,
232
+ fileExplorerDisabled,
233
+ fileManagerName,
234
+ mutationsDisabled,
235
+ openAssetInConvert,
236
+ openAssetInExplorer,
237
+ renameAsset,
238
+ relativePath,
239
+ ]);
240
+ return { fileExplorerDisabled, fileManagerName, getContextMenuItems };
241
+ };
242
+ exports.useAssetContextMenuItems = useAssetContextMenuItems;
@@ -1,5 +1,7 @@
1
1
  import type { PreviewSize } from 'remotion';
2
+ import type { Guide } from '../state/editor-guides';
2
3
  import { type InsertElementDropPosition } from './import-assets';
4
+ import { type SelectedOutlineSnapPoint } from './selected-outline-snap';
3
5
  type Dimensions = {
4
6
  readonly width: number;
5
7
  readonly height: number;
@@ -11,6 +13,7 @@ type CanvasSize = {
11
13
  export type CompositionDropPreview = {
12
14
  readonly compositionDimensions: Dimensions;
13
15
  readonly dropPosition: InsertElementDropPosition;
16
+ readonly snapPoints: readonly SelectedOutlineSnapPoint[];
14
17
  };
15
18
  export type CompositionDropPreviewBox = {
16
19
  readonly left: number;
@@ -18,12 +21,16 @@ export type CompositionDropPreviewBox = {
18
21
  readonly width: number;
19
22
  readonly height: number;
20
23
  };
21
- export declare const snapCompositionDropPosition: ({ compositionDimensions, destinationDimensions, dropPosition, scale, }: {
24
+ export declare const snapCompositionDropPosition: ({ compositionDimensions, destinationDimensions, dropPosition, guides, scale, }: {
22
25
  readonly compositionDimensions: Dimensions;
23
26
  readonly destinationDimensions: Dimensions;
24
27
  readonly dropPosition: InsertElementDropPosition;
28
+ readonly guides: readonly Guide[];
25
29
  readonly scale: number;
26
- }) => InsertElementDropPosition;
30
+ }) => {
31
+ readonly dropPosition: InsertElementDropPosition;
32
+ readonly snapPoints: readonly SelectedOutlineSnapPoint[];
33
+ };
27
34
  export declare const getCompositionDropPreviewBox: ({ canvasSize, destinationDimensions, preview, previewSize, }: {
28
35
  readonly canvasSize: CanvasSize;
29
36
  readonly destinationDimensions: Dimensions;
@@ -4,7 +4,7 @@ exports.getCompositionDropPreviewBox = exports.snapCompositionDropPosition = voi
4
4
  const studio_fit_padding_1 = require("../helpers/studio-fit-padding");
5
5
  const import_assets_1 = require("./import-assets");
6
6
  const selected_outline_snap_1 = require("./selected-outline-snap");
7
- const snapCompositionDropPosition = ({ compositionDimensions, destinationDimensions, dropPosition, scale, }) => {
7
+ const snapCompositionDropPosition = ({ compositionDimensions, destinationDimensions, dropPosition, guides, scale, }) => {
8
8
  var _a, _b;
9
9
  const left = dropPosition.centerX - compositionDimensions.width / 2;
10
10
  const top = dropPosition.centerY - compositionDimensions.height / 2;
@@ -31,12 +31,15 @@ const snapCompositionDropPosition = ({ compositionDimensions, destinationDimensi
31
31
  targets: (0, selected_outline_snap_1.getSelectedOutlineSnapTargets)({
32
32
  compositionHeight: destinationDimensions.height,
33
33
  compositionWidth: destinationDimensions.width,
34
- guides: [],
34
+ guides,
35
35
  }),
36
36
  });
37
37
  return {
38
- centerX: dropPosition.centerX + ((_a = snap.snapOffsetX) !== null && _a !== void 0 ? _a : 0),
39
- centerY: dropPosition.centerY + ((_b = snap.snapOffsetY) !== null && _b !== void 0 ? _b : 0),
38
+ dropPosition: {
39
+ centerX: dropPosition.centerX + ((_a = snap.snapOffsetX) !== null && _a !== void 0 ? _a : 0),
40
+ centerY: dropPosition.centerY + ((_b = snap.snapOffsetY) !== null && _b !== void 0 ? _b : 0),
41
+ },
42
+ snapPoints: snap.activeSnapPoints,
40
43
  };
41
44
  };
42
45
  exports.snapCompositionDropPosition = snapCompositionDropPosition;
@@ -1,9 +1,9 @@
1
- import type { EditorPickerId } from '@remotion/studio-shared';
2
1
  import type { SetStateAction } from 'react';
3
2
  import type { ResolvedStackLocation } from 'remotion';
4
3
  import type { ModalState } from '../state/modals';
5
4
  import type { ComboboxValue } from './NewComposition/ComboBox';
6
- export declare const getCompositionMenuItems: ({ composition, connectionStatus, resolvedLocation, setSelectedModal, closeMenu, readOnlyStudio, includeCompositionManagementItems, editorId, editorName, }: {
5
+ import type { OpenInMenuApps } from './use-open-in-menu-apps';
6
+ export declare const getCompositionMenuItems: ({ composition, connectionStatus, resolvedLocation, setSelectedModal, closeMenu, readOnlyStudio, includeCompositionManagementItems, openInApps, }: {
7
7
  composition: import("remotion").AnyComposition | null;
8
8
  connectionStatus: "connected" | "disconnected" | "init";
9
9
  resolvedLocation: ResolvedStackLocation | null;
@@ -11,8 +11,7 @@ export declare const getCompositionMenuItems: ({ composition, connectionStatus,
11
11
  closeMenu: () => void;
12
12
  readOnlyStudio: boolean;
13
13
  includeCompositionManagementItems: boolean;
14
- editorId: EditorPickerId | null;
15
- editorName: string | null;
14
+ openInApps: OpenInMenuApps;
16
15
  }) => ComboboxValue[];
17
16
  export declare const getCompositionContextMenuItems: (args: Omit<{
18
17
  composition: import("remotion").AnyComposition | null;
@@ -22,8 +21,7 @@ export declare const getCompositionContextMenuItems: (args: Omit<{
22
21
  closeMenu: () => void;
23
22
  readOnlyStudio: boolean;
24
23
  includeCompositionManagementItems: boolean;
25
- editorId: EditorPickerId | null;
26
- editorName: string | null;
24
+ openInApps: OpenInMenuApps;
27
25
  }, "includeCompositionManagementItems"> & {
28
26
  readonly includeCompositionManagementItems: boolean;
29
27
  }) => ComboboxValue[];