@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
@@ -36,6 +36,7 @@ const EditorGuides_1 = __importDefault(require("./EditorGuides"));
36
36
  const EditorRuler_1 = require("./EditorRuler");
37
37
  const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
38
38
  const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
39
+ const element_drag_and_drop_1 = require("./element-drag-and-drop");
39
40
  const element_install_api_1 = require("./element-install-api");
40
41
  const element_install_request_1 = require("./element-install-request");
41
42
  const handle_drop_1 = require("./handle-drop");
@@ -44,6 +45,7 @@ const layout_1 = require("./layout");
44
45
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
45
46
  const Preview_1 = require("./Preview");
46
47
  const ResetZoomButton_1 = require("./ResetZoomButton");
48
+ const SelectedOutlineSnapIndicators_1 = require("./SelectedOutlineSnapIndicators");
47
49
  const SvgImportDialog_1 = require("./SvgImportDialog");
48
50
  const imperative_state_1 = require("./Timeline/imperative-state");
49
51
  const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
@@ -142,7 +144,7 @@ const Canvas = ({ canvasContent, size }) => {
142
144
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
143
145
  const config = remotion_1.Internals.useUnsafeVideoConfig();
144
146
  const areRulersVisible = (0, use_is_ruler_visible_1.useIsRulerVisible)();
145
- const { editorShowGuides } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
147
+ const { editorShowGuides, guidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
146
148
  const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
147
149
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
148
150
  const { setCurrentAssetMetadata } = (0, react_1.useContext)(remotion_1.Internals.CompositionSetters);
@@ -155,7 +157,6 @@ const Canvas = ({ canvasContent, size }) => {
155
157
  const [pendingElementInstallRequests, setPendingElementInstallRequests] = (0, react_1.useState)([]);
156
158
  const [activeElementInstallRequest, setActiveElementInstallRequest] = (0, react_1.useState)(null);
157
159
  const lastFocusedAtRef = (0, react_1.useRef)(typeof document === 'undefined' || document.hasFocus() ? Date.now() : null);
158
- const unsupportedDropNotifiedRef = (0, react_1.useRef)(false);
159
160
  const [assetResolution, setAssetResolution] = (0, react_1.useState)(null);
160
161
  const metadataRequestRef = (0, react_1.useRef)(0);
161
162
  const currentCompositionId = canvasContent.type === 'composition' ? canvasContent.compositionId : null;
@@ -844,17 +845,14 @@ const Canvas = ({ canvasContent, size }) => {
844
845
  var _a;
845
846
  var _b;
846
847
  if (!(0, drop_handler_data_1.isSupportedDropEvent)(event) || !isDragEventInsideCanvas(event)) {
847
- unsupportedDropNotifiedRef.current = false;
848
848
  setCompositionDropPreview(null);
849
849
  return;
850
850
  }
851
851
  const mayBeCanvasCapture = (0, drop_handler_data_1.isFileDragEvent)(event) && !window.remotion_isReadOnlyStudio;
852
- const shouldNotifyAboutUnsupportedDrop = cannotAddSequence && !mayBeCanvasCapture;
853
- if (shouldNotifyAboutUnsupportedDrop &&
854
- !unsupportedDropNotifiedRef.current) {
855
- (0, NotificationCenter_1.showCannotAddSequenceDropNotification)();
856
- }
857
- unsupportedDropNotifiedRef.current = shouldNotifyAboutUnsupportedDrop;
852
+ const canDropElementIntoNewComposition = cannotAddSequence &&
853
+ canReceiveElementInstallRequest &&
854
+ !isAddingAsset &&
855
+ (0, element_drag_and_drop_1.hasElementDragType)(event.dataTransfer);
858
856
  if (!canDropAssets && !cannotAddSequence && !mayBeCanvasCapture) {
859
857
  setCompositionDropPreview(null);
860
858
  return;
@@ -862,7 +860,11 @@ const Canvas = ({ canvasContent, size }) => {
862
860
  event.preventDefault();
863
861
  if (event.dataTransfer) {
864
862
  event.dataTransfer.dropEffect =
865
- canDropAssets || mayBeCanvasCapture ? 'copy' : 'none';
863
+ canDropAssets ||
864
+ canDropElementIntoNewComposition ||
865
+ mayBeCanvasCapture
866
+ ? 'copy'
867
+ : 'none';
866
868
  }
867
869
  if (!canDropAssets ||
868
870
  contentDimensions === null ||
@@ -872,36 +874,46 @@ const Canvas = ({ canvasContent, size }) => {
872
874
  }
873
875
  const metadata = getCanvasDragPreviewMetadata((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []);
874
876
  if (((metadata === null || metadata === void 0 ? void 0 : metadata.type) !== 'composition' && (metadata === null || metadata === void 0 ? void 0 : metadata.type) !== 'element') ||
875
- metadata.width === undefined ||
876
- metadata.height === undefined) {
877
+ (metadata.type === 'composition' &&
878
+ (metadata.width === undefined || metadata.height === undefined))) {
877
879
  setCompositionDropPreview(null);
878
880
  return;
879
881
  }
880
- let dropPosition = getDropPosition({
881
- addFitPadding,
882
- clientX: event.clientX,
883
- clientY: event.clientY,
884
- contentDimensions,
885
- unbounded: metadata.type === 'composition',
886
- previewSize,
887
- size,
888
- });
882
+ const isFullscreenElement = metadata.type === 'element' &&
883
+ (metadata.width === undefined || metadata.height === undefined);
884
+ let dropPosition = isFullscreenElement
885
+ ? {
886
+ centerX: contentDimensions.width / 2,
887
+ centerY: contentDimensions.height / 2,
888
+ }
889
+ : getDropPosition({
890
+ addFitPadding,
891
+ clientX: event.clientX,
892
+ clientY: event.clientY,
893
+ contentDimensions,
894
+ unbounded: metadata.type === 'composition',
895
+ previewSize,
896
+ size,
897
+ });
889
898
  if (dropPosition === null) {
890
899
  setCompositionDropPreview(null);
891
900
  return;
892
901
  }
893
- const compositionDimensions = {
894
- width: metadata.width,
895
- height: metadata.height,
896
- };
897
- if (metadata.type === 'composition' &&
902
+ const compositionDimensions = metadata.width === undefined || metadata.height === undefined
903
+ ? contentDimensions
904
+ : { width: metadata.width, height: metadata.height };
905
+ let snapPoints = [];
906
+ if (!isFullscreenElement &&
898
907
  editorSnapping &&
899
908
  !event.metaKey &&
900
909
  !event.ctrlKey) {
901
- dropPosition = (0, composition_drop_preview_1.snapCompositionDropPosition)({
910
+ const snapped = (0, composition_drop_preview_1.snapCompositionDropPosition)({
902
911
  compositionDimensions,
903
912
  destinationDimensions: contentDimensions,
904
913
  dropPosition,
914
+ guides: editorShowGuides
915
+ ? guidesList.filter((guide) => guide.compositionId === currentCompositionId)
916
+ : [],
905
917
  scale: calculateCanvasScale({
906
918
  addFitPadding,
907
919
  canvasSize: size,
@@ -910,6 +922,8 @@ const Canvas = ({ canvasContent, size }) => {
910
922
  previewSize: previewSize.size,
911
923
  }),
912
924
  });
925
+ dropPosition = snapped.dropPosition;
926
+ snapPoints = snapped.snapPoints;
913
927
  }
914
928
  setCompositionDropPreview((currentPreview) => {
915
929
  if ((currentPreview === null || currentPreview === void 0 ? void 0 : currentPreview.compositionDimensions.width) ===
@@ -917,20 +931,29 @@ const Canvas = ({ canvasContent, size }) => {
917
931
  currentPreview.compositionDimensions.height ===
918
932
  compositionDimensions.height &&
919
933
  currentPreview.dropPosition.centerX === dropPosition.centerX &&
920
- currentPreview.dropPosition.centerY === dropPosition.centerY) {
934
+ currentPreview.dropPosition.centerY === dropPosition.centerY &&
935
+ currentPreview.snapPoints.length === snapPoints.length &&
936
+ snapPoints.every((snapPoint, index) => {
937
+ const currentPoint = currentPreview.snapPoints[index];
938
+ return (currentPoint.edge === snapPoint.edge &&
939
+ currentPoint.target.type === snapPoint.target.type &&
940
+ currentPoint.target.position === snapPoint.target.position);
941
+ })) {
921
942
  return currentPreview;
922
943
  }
923
- return {
924
- compositionDimensions,
925
- dropPosition,
926
- };
944
+ return { compositionDimensions, dropPosition, snapPoints };
927
945
  });
928
946
  }, [
929
947
  addFitPadding,
930
948
  canDropAssets,
931
949
  cannotAddSequence,
950
+ canReceiveElementInstallRequest,
932
951
  contentDimensions,
952
+ currentCompositionId,
953
+ editorShowGuides,
933
954
  editorSnapping,
955
+ guidesList,
956
+ isAddingAsset,
934
957
  previewSize,
935
958
  size,
936
959
  ]);
@@ -947,18 +970,14 @@ const Canvas = ({ canvasContent, size }) => {
947
970
  return;
948
971
  }
949
972
  }
950
- unsupportedDropNotifiedRef.current = false;
951
973
  setCompositionDropPreview(null);
952
974
  }, []);
953
975
  const onDragEnd = (0, react_1.useCallback)(() => {
954
- unsupportedDropNotifiedRef.current = false;
955
976
  setCompositionDropPreview(null);
956
977
  }, []);
957
978
  const onDrop = (0, react_1.useCallback)(async (event) => {
958
979
  var _a, _b;
959
980
  var _c, _d;
960
- const unsupportedDropWasNotified = unsupportedDropNotifiedRef.current;
961
- unsupportedDropNotifiedRef.current = false;
962
981
  setCompositionDropPreview(null);
963
982
  if (!(0, drop_handler_data_1.isSupportedDropEvent)(event) || !isDragEventInsideCanvas(event)) {
964
983
  return;
@@ -984,15 +1003,17 @@ const Canvas = ({ canvasContent, size }) => {
984
1003
  }
985
1004
  }
986
1005
  }
987
- if (cannotAddSequence) {
1006
+ const canDropElementIntoNewComposition = cannotAddSequence &&
1007
+ canReceiveElementInstallRequest &&
1008
+ !isAddingAsset &&
1009
+ (0, element_drag_and_drop_1.getElementDragData)(event.dataTransfer) !== null;
1010
+ if (cannotAddSequence && !canDropElementIntoNewComposition) {
988
1011
  event.preventDefault();
989
1012
  event.stopPropagation();
990
- if (!unsupportedDropWasNotified) {
991
- (0, NotificationCenter_1.showCannotAddSequenceDropNotification)();
992
- }
1013
+ (0, NotificationCenter_1.showNotification)('Cannot insert this item: This composition component cannot accept a new <Sequence>.', 3000);
993
1014
  return;
994
1015
  }
995
- if (!canDropAssets ||
1016
+ if ((!canDropAssets && !canDropElementIntoNewComposition) ||
996
1017
  compositionFile === null ||
997
1018
  currentCompositionId === null ||
998
1019
  config === null) {
@@ -1019,7 +1040,7 @@ const Canvas = ({ canvasContent, size }) => {
1019
1040
  size,
1020
1041
  });
1021
1042
  if (dropPosition !== null &&
1022
- isComposition &&
1043
+ ((metadata === null || metadata === void 0 ? void 0 : metadata.type) === 'composition' || (metadata === null || metadata === void 0 ? void 0 : metadata.type) === 'element') &&
1023
1044
  metadata.width !== undefined &&
1024
1045
  metadata.height !== undefined &&
1025
1046
  contentDimensions !== null &&
@@ -1034,6 +1055,9 @@ const Canvas = ({ canvasContent, size }) => {
1034
1055
  },
1035
1056
  destinationDimensions: contentDimensions,
1036
1057
  dropPosition,
1058
+ guides: editorShowGuides
1059
+ ? guidesList.filter((guide) => guide.compositionId === currentCompositionId)
1060
+ : [],
1037
1061
  scale: calculateCanvasScale({
1038
1062
  addFitPadding,
1039
1063
  canvasSize: size,
@@ -1041,7 +1065,7 @@ const Canvas = ({ canvasContent, size }) => {
1041
1065
  compositionWidth: contentDimensions.width,
1042
1066
  previewSize: previewSize.size,
1043
1067
  }),
1044
- });
1068
+ }).dropPosition;
1045
1069
  }
1046
1070
  await (0, handle_drop_1.handleDrop)({
1047
1071
  chooseSvgImportMode,
@@ -1063,12 +1087,16 @@ const Canvas = ({ canvasContent, size }) => {
1063
1087
  addFitPadding,
1064
1088
  canDropAssets,
1065
1089
  cannotAddSequence,
1090
+ canReceiveElementInstallRequest,
1066
1091
  chooseSvgImportMode,
1067
1092
  compositionFile,
1068
1093
  config,
1069
1094
  contentDimensions,
1070
1095
  currentCompositionId,
1096
+ editorShowGuides,
1071
1097
  editorSnapping,
1098
+ guidesList,
1099
+ isAddingAsset,
1072
1100
  previewSize,
1073
1101
  size,
1074
1102
  setSelectedModal,
@@ -1210,7 +1238,44 @@ const Canvas = ({ canvasContent, size }) => {
1210
1238
  zIndex: 1,
1211
1239
  };
1212
1240
  }, [compositionDropPreview, contentDimensions, previewSize, size]);
1241
+ const compositionDropSnapLines = (0, react_1.useMemo)(() => {
1242
+ if (compositionDropPreview === null ||
1243
+ compositionDropPreview.snapPoints.length === 0 ||
1244
+ contentDimensions === null ||
1245
+ contentDimensions === 'none') {
1246
+ return null;
1247
+ }
1248
+ const scale = calculateCanvasScale({
1249
+ addFitPadding,
1250
+ canvasSize: size,
1251
+ compositionHeight: contentDimensions.height,
1252
+ compositionWidth: contentDimensions.width,
1253
+ previewSize: previewSize.size,
1254
+ });
1255
+ const left = size.width / 2 -
1256
+ (contentDimensions.width * scale) / 2 -
1257
+ previewSize.translation.x;
1258
+ const top = size.height / 2 -
1259
+ (contentDimensions.height * scale) / 2 -
1260
+ previewSize.translation.y;
1261
+ return (jsx_runtime_1.jsx("svg", { "aria-hidden": "true", "data-testid": "canvas-drop-snap-lines", style: {
1262
+ position: 'absolute',
1263
+ left,
1264
+ top,
1265
+ width: contentDimensions.width * scale,
1266
+ height: contentDimensions.height * scale,
1267
+ pointerEvents: 'none',
1268
+ overflow: 'visible',
1269
+ zIndex: 2,
1270
+ }, children: jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapLines, { compositionHeight: contentDimensions.height, compositionWidth: contentDimensions.width, scale: scale, snapPoints: compositionDropPreview.snapPoints }) }));
1271
+ }, [
1272
+ addFitPadding,
1273
+ compositionDropPreview,
1274
+ contentDimensions,
1275
+ previewSize,
1276
+ size,
1277
+ ]);
1213
1278
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1214
- jsx_runtime_1.jsxs("div", { ref: canvas_ref_1.canvasRef, style: getContainerStyle(editorZoomGestures), children: [size ? (jsx_runtime_1.jsx(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, onRetryAssetMetadata: fetchMetadata })) : null, compositionDropPreviewStyle === null ? null : (jsx_runtime_1.jsx("div", { className: "css-reset", "data-testid": "composition-drop-preview", style: compositionDropPreviewStyle })), isFit ? null : (jsx_runtime_1.jsx("div", { style: resetZoom, className: "css-reset", children: jsx_runtime_1.jsx(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && canvasContent.type === 'composition' && (jsx_runtime_1.jsx(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && (jsx_runtime_1.jsx(EditorRuler_1.EditorRulers, { canCreateGuides: canvasContent.type === 'composition', contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
1279
+ jsx_runtime_1.jsxs("div", { ref: canvas_ref_1.canvasRef, style: getContainerStyle(editorZoomGestures), children: [size ? (jsx_runtime_1.jsx(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, onRetryAssetMetadata: fetchMetadata })) : null, compositionDropPreviewStyle === null ? null : (jsx_runtime_1.jsx("div", { className: "css-reset", "data-testid": "composition-drop-preview", style: compositionDropPreviewStyle })), compositionDropSnapLines, isFit ? null : (jsx_runtime_1.jsx("div", { style: resetZoom, className: "css-reset", children: jsx_runtime_1.jsx(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && canvasContent.type === 'composition' && (jsx_runtime_1.jsx(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && (jsx_runtime_1.jsx(EditorRuler_1.EditorRulers, { canCreateGuides: canvasContent.type === 'composition', contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
1215
1280
  };
1216
1281
  exports.Canvas = Canvas;
@@ -5,6 +5,7 @@ const react_1 = require("react");
5
5
  const modals_1 = require("../state/modals");
6
6
  const canvas_capture_drop_1 = require("./canvas-capture-drop");
7
7
  const drop_handler_data_1 = require("./drop-handler-data");
8
+ const canvasCaptureMessagePrefix = 'remotion-canvas-capture';
8
9
  const CanvasCaptureDropHandler = ({ readOnlyStudio }) => {
9
10
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
10
11
  const onDragOver = (0, react_1.useCallback)((event) => {
@@ -37,6 +38,68 @@ const CanvasCaptureDropHandler = ({ readOnlyStudio }) => {
37
38
  document.removeEventListener('drop', onDrop);
38
39
  };
39
40
  }, [onDragOver, onDrop]);
41
+ (0, react_1.useEffect)(() => {
42
+ if (readOnlyStudio) {
43
+ return;
44
+ }
45
+ const handoffWindow = window.remotion_browserStudio && window.parent !== window
46
+ ? window.parent
47
+ : window;
48
+ const captureId = new URL(handoffWindow.location.href).searchParams.get('canvas-capture');
49
+ if (!captureId) {
50
+ return;
51
+ }
52
+ let incoming = null;
53
+ const onMessage = async (event) => {
54
+ if (event.source !== handoffWindow ||
55
+ event.origin !== handoffWindow.location.origin ||
56
+ typeof event.data !== 'object' ||
57
+ event.data === null ||
58
+ event.data.captureId !== captureId) {
59
+ return;
60
+ }
61
+ if (event.data.type === `${canvasCaptureMessagePrefix}-start` &&
62
+ typeof event.data.filename === 'string' &&
63
+ typeof event.data.mimeType === 'string' &&
64
+ Number.isSafeInteger(event.data.chunks) &&
65
+ event.data.chunks >= 0) {
66
+ incoming = {
67
+ captureId,
68
+ filename: event.data.filename,
69
+ mimeType: event.data.mimeType,
70
+ chunks: Array.from({ length: event.data.chunks }, () => null),
71
+ };
72
+ return;
73
+ }
74
+ if (event.data.type === `${canvasCaptureMessagePrefix}-chunk` &&
75
+ incoming &&
76
+ Number.isSafeInteger(event.data.index) &&
77
+ event.data.index >= 0 &&
78
+ event.data.index < incoming.chunks.length &&
79
+ typeof event.data.data === 'string') {
80
+ const binary = atob(event.data.data);
81
+ const buffer = new ArrayBuffer(binary.length);
82
+ const bytes = new Uint8Array(buffer);
83
+ for (let index = 0; index < binary.length; index++) {
84
+ bytes[index] = binary.charCodeAt(index);
85
+ }
86
+ incoming.chunks[event.data.index] = buffer;
87
+ return;
88
+ }
89
+ if (event.data.type === `${canvasCaptureMessagePrefix}-complete` &&
90
+ incoming &&
91
+ incoming.chunks.every((chunk) => chunk !== null)) {
92
+ const file = new File(incoming.chunks, incoming.filename, {
93
+ type: incoming.mimeType,
94
+ });
95
+ incoming = null;
96
+ await (0, canvas_capture_drop_1.handleCanvasCaptureDrop)({ files: [file], setSelectedModal });
97
+ }
98
+ };
99
+ handoffWindow.addEventListener('message', onMessage);
100
+ handoffWindow.postMessage({ type: `${canvasCaptureMessagePrefix}-ready`, captureId }, handoffWindow.location.origin);
101
+ return () => handoffWindow.removeEventListener('message', onMessage);
102
+ }, [readOnlyStudio, setSelectedModal]);
40
103
  return null;
41
104
  };
42
105
  exports.CanvasCaptureDropHandler = CanvasCaptureDropHandler;
@@ -6,6 +6,7 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const ErrorLoader_1 = require("../error-overlay/remotion-overlay/ErrorLoader");
8
8
  const colors_1 = require("../helpers/colors");
9
+ const url_state_1 = require("../helpers/url-state");
9
10
  const composition_list_1 = require("../state/composition-list");
10
11
  const timeline_zoom_1 = require("../state/timeline-zoom");
11
12
  const Canvas_1 = require("./Canvas");
@@ -26,6 +27,10 @@ const container = {
26
27
  backgroundColor: colors_1.BACKGROUND,
27
28
  flexDirection: 'column',
28
29
  };
30
+ const welcomeLabel = {
31
+ ...RunningCalculateMetadata_1.loaderLabel,
32
+ textAlign: 'center',
33
+ };
29
34
  const CanvasOrLoading = ({ size }) => {
30
35
  const resolved = remotion_1.Internals.useResolvedVideoConfig(null);
31
36
  const { setZoom } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
@@ -53,8 +58,11 @@ const CanvasOrLoading = ({ size }) => {
53
58
  if (compositionListState !== 'ready') {
54
59
  return null;
55
60
  }
56
- const compname = window.location.pathname.replace('/', '');
57
- return (jsx_runtime_1.jsx("div", { style: container, className: "css-reset", children: jsx_runtime_1.jsxs("div", { style: RunningCalculateMetadata_1.loaderLabel, children: ["Composition with ID ", compname, " not found."] }) }));
61
+ const route = (0, url_state_1.getRoute)();
62
+ if (route === '') {
63
+ return (jsx_runtime_1.jsx("div", { style: container, className: "css-reset", children: jsx_runtime_1.jsx("div", { style: welcomeLabel, children: "Select a composition to get started." }) }));
64
+ }
65
+ return (jsx_runtime_1.jsx("div", { style: container, className: "css-reset", children: jsx_runtime_1.jsxs("div", { style: RunningCalculateMetadata_1.loaderLabel, children: ["Composition with ID ", decodeURIComponent(route.substring(1)), " not found."] }) }));
58
66
  }
59
67
  const content = (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
60
68
  jsx_runtime_1.jsx(ZoomPersistor_1.ZoomPersistor, {}), jsx_runtime_1.jsx(Canvas_1.Canvas, { size: size, canvasContent: canvasContent }), (resolved === null || resolved === void 0 ? void 0 : resolved.type) === 'success-and-refreshing' ? (jsx_runtime_1.jsx(RefreshCompositionOverlay_1.RefreshCompositionOverlay, {})) : null] }));
@@ -60,6 +60,8 @@ const readOnlyStatus = {
60
60
  };
61
61
  const CaptionInspector = ({ captions, expanded, onTextChange, onTextSave, onTextCancel, onReplaceCaptions, onToggle, readOnly, readOnlyTitle, }) => {
62
62
  const fileInput = (0, react_1.useRef)(null);
63
+ const expansionRef = (0, react_1.useRef)({ expanded, onToggle });
64
+ expansionRef.current = { expanded, onToggle };
63
65
  const [isImporting, setIsImporting] = (0, react_1.useState)(false);
64
66
  const { setSelectedModal } = react_1.default.useContext(modals_1.SetSelectedModalContext);
65
67
  const importCaptions = (0, react_1.useCallback)(async ({ fileName, contents, }) => {
@@ -68,10 +70,14 @@ const CaptionInspector = ({ captions, expanded, onTextChange, onTextSave, onText
68
70
  }
69
71
  setIsImporting(true);
70
72
  try {
71
- onReplaceCaptions((0, parse_caption_file_1.parseCaptionFile)({
73
+ const imported = (0, parse_caption_file_1.parseCaptionFile)({
72
74
  fileName,
73
75
  contents: await contents,
74
- }));
76
+ });
77
+ onReplaceCaptions(imported);
78
+ if (imported.length > 0 && !expansionRef.current.expanded) {
79
+ expansionRef.current.onToggle();
80
+ }
75
81
  }
76
82
  catch (error) {
77
83
  (0, NotificationCenter_1.showNotification)(`Could not import ${fileName}: ${error instanceof Error ? error.message : String(error)}`, 5000);
@@ -112,6 +118,6 @@ const CaptionInspector = ({ captions, expanded, onTextChange, onTextSave, onText
112
118
  }, [importCaptions, setSelectedModal]);
113
119
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
114
120
  jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: jsx_runtime_1.jsx(CollapsibleInspectorSectionHeader_1.CollapsibleInspectorSectionHeader, { action: jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderEnd, children: [onReplaceCaptions === null ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
115
- jsx_runtime_1.jsx("input", { ref: fileInput, accept: ".json", "aria-label": "Import captions file", hidden: true, onChange: onFileSelected, type: "file" }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { "aria-label": "Import captions", className: hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME, disabled: isImporting, onClick: openCaptionSelection, renderAction: (color) => (jsx_runtime_1.jsx(upload_1.UploadIcon, { "aria-hidden": "true", color: color, focusable: "false", style: { height: 14, width: 14 } })), title: importTooltip, variant: null })] })), readOnly ? (jsx_runtime_1.jsx("div", { style: readOnlyStatus, title: readOnlyTitle !== null && readOnlyTitle !== void 0 ? readOnlyTitle : undefined, children: "Read only" })) : null] }), expanded: expanded, label: "Captions", onToggle: onToggle }) }), expanded ? (jsx_runtime_1.jsx(CaptionTextEditor_1.CaptionTextEditor, { captions: captions, onChange: onTextChange, onSave: onTextSave, onCancel: onTextCancel, readOnly: readOnly })) : null] }));
121
+ jsx_runtime_1.jsx("input", { ref: fileInput, accept: ".json", "aria-label": "Import captions file", hidden: true, onChange: onFileSelected, type: "file" }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { "aria-label": "Import captions", className: hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME, disabled: isImporting, onClick: openCaptionSelection, renderAction: (color) => (jsx_runtime_1.jsx(upload_1.UploadIcon, { "aria-hidden": "true", color: color, focusable: "false", style: { height: 14, width: 14 } })), title: importTooltip, variant: null })] })), readOnly ? (jsx_runtime_1.jsx("div", { style: readOnlyStatus, title: readOnlyTitle !== null && readOnlyTitle !== void 0 ? readOnlyTitle : undefined, children: "Read only" })) : null] }), expanded: expanded, label: "Captions", onToggle: captions.length > 0 ? onToggle : null }) }), expanded || captions.length === 0 ? (jsx_runtime_1.jsx(CaptionTextEditor_1.CaptionTextEditor, { captions: captions, onChange: onTextChange, onSave: onTextSave, onCancel: onTextCancel, readOnly: readOnly })) : null] }));
116
122
  };
117
123
  exports.CaptionInspector = CaptionInspector;
@@ -3,4 +3,6 @@ import React from 'react';
3
3
  export declare const CodeFrame: React.FC<{
4
4
  readonly source: ScriptLine[];
5
5
  readonly lineNumberWidth: number;
6
+ readonly fontSize: number;
7
+ readonly horizontalMargin: number;
6
8
  }>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeFrame = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const colors_1 = require("../helpers/colors");
6
+ const LazySyntaxHighlightedSource_1 = require("./LazySyntaxHighlightedSource");
7
+ const is_menu_item_1 = require("./Menu/is-menu-item");
8
+ const frame = {
9
+ backgroundColor: colors_1.ERROR_CODE_FRAME_BACKGROUND,
10
+ borderRadius: 6,
11
+ display: 'flex',
12
+ marginBottom: 20,
13
+ overflow: 'hidden',
14
+ };
15
+ const sourceContainer = {
16
+ flex: 1,
17
+ minWidth: 0,
18
+ overflowX: 'auto',
19
+ overscrollBehaviorX: 'none',
20
+ };
21
+ const lineNumberColumn = {
22
+ flexShrink: 0,
23
+ width: 60,
24
+ };
25
+ const lineNumber = {
26
+ whiteSpace: 'pre',
27
+ paddingRight: 12,
28
+ color: 'inherit',
29
+ lineHeight: 1.7,
30
+ width: 60,
31
+ flexShrink: 0,
32
+ display: 'flex',
33
+ alignItems: 'center',
34
+ justifyContent: 'flex-end',
35
+ fontFamily: 'monospace',
36
+ };
37
+ const CodeFrame = ({ source, lineNumberWidth, fontSize, horizontalMargin }) => {
38
+ return (jsx_runtime_1.jsxs("div", { style: {
39
+ ...frame,
40
+ marginLeft: horizontalMargin,
41
+ marginRight: horizontalMargin,
42
+ }, children: [
43
+ jsx_runtime_1.jsx("div", { style: lineNumberColumn, children: source.map((s, j) => {
44
+ return (jsx_runtime_1.jsx("div", { style: {
45
+ ...lineNumber,
46
+ fontSize,
47
+ backgroundColor: s.highlight
48
+ ? colors_1.ERROR_CODE_FRAME_BACKGROUND
49
+ : colors_1.ERROR_CODE_FRAME_LINE_BACKGROUND,
50
+ backgroundImage: s.highlight
51
+ ? `linear-gradient(${colors_1.SELECTED_BACKGROUND}, ${colors_1.SELECTED_BACKGROUND})`
52
+ : undefined,
53
+ color: s.highlight ? colors_1.WHITE : colors_1.WHITE_ALPHA_40,
54
+ }, children: String(s.lineNumber).padStart(lineNumberWidth, ' ') }, j));
55
+ }) }), jsx_runtime_1.jsx("div", { style: sourceContainer, className: is_menu_item_1.HORIZONTAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx("div", { style: { minWidth: '100%', width: 'max-content' }, children: source.map((s, j) => {
56
+ return (jsx_runtime_1.jsx("div", { style: {
57
+ backgroundColor: s.highlight
58
+ ? colors_1.SELECTED_BACKGROUND
59
+ : colors_1.TRANSPARENT,
60
+ }, children: jsx_runtime_1.jsx("code", { className: "language-tsx", style: {
61
+ display: 'block',
62
+ fontFamily: 'monospace',
63
+ fontSize,
64
+ color: '#9cdcfe',
65
+ whiteSpace: 'pre',
66
+ tabSize: 2,
67
+ backgroundColor: colors_1.TRANSPARENT,
68
+ lineHeight: 1.7,
69
+ paddingRight: 12,
70
+ paddingLeft: 12,
71
+ paddingTop: 0,
72
+ paddingBottom: 0,
73
+ }, children: jsx_runtime_1.jsx(LazySyntaxHighlightedSource_1.LazySyntaxHighlightedSource, { source: s.content }) }) }, j));
74
+ }) }) })
75
+ ] }));
76
+ };
77
+ exports.CodeFrame = CodeFrame;
@@ -4,7 +4,6 @@ exports.CompositionSelectorItem = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
7
- const client_id_1 = require("../helpers/client-id");
8
7
  const colors_1 = require("../helpers/colors");
9
8
  const hoverable_1 = require("../helpers/hoverable");
10
9
  const noop_1 = require("../helpers/noop");
@@ -23,7 +22,7 @@ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
23
22
  const actions_1 = require("./RenderQueue/actions");
24
23
  const SidebarRenderButton_1 = require("./SidebarRenderButton");
25
24
  const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
26
- const use_default_editor_info_1 = require("./use-default-editor-info");
25
+ const use_open_in_menu_apps_1 = require("./use-open-in-menu-apps");
27
26
  const itemStyle = {
28
27
  paddingRight: 2,
29
28
  paddingTop: 5,
@@ -43,6 +42,7 @@ const itemStyle = {
43
42
  textAlign: 'left',
44
43
  height: layout_1.COMPACT_CONTROL_ROW_HEIGHT,
45
44
  userSelect: 'none',
45
+ WebkitUserSelect: 'none',
46
46
  };
47
47
  const labelStyle = {
48
48
  textAlign: 'left',
@@ -193,9 +193,7 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
193
193
  }
194
194
  }, [onClick]);
195
195
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
196
- const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
197
- .previewServerState.type;
198
- const { defaultEditorId, defaultEditorName } = (0, use_default_editor_info_1.useEditorOpening)(connectionStatus === 'connected');
196
+ const { connectionStatus, openInApps } = (0, use_open_in_menu_apps_1.useOpenInMenuApps)();
199
197
  const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(item.type === 'composition' ? item.composition.stack : item.folder.stack);
200
198
  const getContextMenuItems = (0, react_1.useCallback)(() => {
201
199
  if (item.type === 'composition') {
@@ -203,9 +201,8 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
203
201
  closeMenu: noop_1.noop,
204
202
  composition: item.composition,
205
203
  connectionStatus,
206
- editorId: defaultEditorId,
207
- editorName: defaultEditorName,
208
204
  includeCompositionManagementItems: true,
205
+ openInApps,
209
206
  resolvedLocation,
210
207
  setSelectedModal,
211
208
  readOnlyStudio: window.remotion_isReadOnlyStudio,
@@ -214,21 +211,14 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
214
211
  return (0, folder_menu_items_1.getFolderMenuItems)({
215
212
  closeMenu: noop_1.noop,
216
213
  connectionStatus,
217
- editorId: defaultEditorId,
218
- editorName: defaultEditorName,
214
+ editorId: openInApps.defaultEditorId,
215
+ editorName: openInApps.defaultEditorName,
219
216
  folder: item.folder,
220
217
  resolvedLocation,
221
218
  setSelectedModal,
222
219
  readOnlyStudio: window.remotion_isReadOnlyStudio,
223
220
  });
224
- }, [
225
- connectionStatus,
226
- defaultEditorId,
227
- defaultEditorName,
228
- item,
229
- resolvedLocation,
230
- setSelectedModal,
231
- ]);
221
+ }, [connectionStatus, item, openInApps, resolvedLocation, setSelectedModal]);
232
222
  const onItemDragStart = (0, react_1.useCallback)((event) => {
233
223
  var _a, _b, _c, _d, _e;
234
224
  if (window.remotion_isReadOnlyStudio) {