@remotion/studio 4.0.507 → 4.0.509

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 (191) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/Studio.d.ts +5 -0
  3. package/dist/Studio.js +2 -2
  4. package/dist/components/Canvas.js +35 -5
  5. package/dist/components/CodingAgentIcon.d.ts +3 -1
  6. package/dist/components/CodingAgentIcon.js +4 -9
  7. package/dist/components/ColorPicker/AlphaSlider.js +2 -2
  8. package/dist/components/ColorPicker/HueSlider.js +2 -2
  9. package/dist/components/ColorPicker/SaturationValueArea.js +2 -2
  10. package/dist/components/ConfigureDefaultEditorModal.js +1 -1
  11. package/dist/components/ContextMenu.d.ts +1 -0
  12. package/dist/components/ContextMenu.js +32 -5
  13. package/dist/components/EditorContent.js +4 -3
  14. package/dist/components/EditorGuides/Guide.js +2 -2
  15. package/dist/components/EditorRuler/index.js +2 -2
  16. package/dist/components/ExplorerPanel.js +19 -1
  17. package/dist/components/InlineAction.d.ts +2 -1
  18. package/dist/components/InlineAction.js +3 -3
  19. package/dist/components/InspectorLocationCopy.js +1 -1
  20. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  21. package/dist/components/InspectorOpenInEditor.js +52 -8
  22. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  23. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  24. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +3 -3
  25. package/dist/components/InspectorPanel/styles.js +1 -1
  26. package/dist/components/InspectorSequenceSection.js +36 -4
  27. package/dist/components/Menu/MenuItem.js +2 -2
  28. package/dist/components/MenuBuildIndicator.js +1 -1
  29. package/dist/components/ModalContainer.js +1 -1
  30. package/dist/components/Modals.js +2 -9
  31. package/dist/components/NewComposition/InputDragger.js +2 -2
  32. package/dist/components/NewComposition/NewComposition.d.ts +2 -0
  33. package/dist/components/NewComposition/NewComposition.js +38 -6
  34. package/dist/components/NewComposition/get-new-composition-defaults.d.ts +1 -1
  35. package/dist/components/NewComposition/get-new-composition-defaults.js +9 -1
  36. package/dist/components/PlayPause.d.ts +1 -1
  37. package/dist/components/PlayPause.js +61 -12
  38. package/dist/components/RenderButton.js +16 -12
  39. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  40. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  41. package/dist/components/RenderModal/InfoBubble.js +6 -4
  42. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  43. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  44. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  45. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  46. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  47. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  48. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  49. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  50. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  51. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  52. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  53. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  54. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  55. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  56. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  57. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +6 -1
  58. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  59. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  60. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  61. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  62. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  63. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  64. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  65. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  66. package/dist/components/SelectedOutlineCanvasRotation.js +239 -0
  67. package/dist/components/SelectedOutlineCropControls.js +2 -2
  68. package/dist/components/SelectedOutlineElement.d.ts +2 -1
  69. package/dist/components/SelectedOutlineElement.js +40 -5
  70. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  71. package/dist/components/SelectedOutlineOverlay.js +55 -26
  72. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  73. package/dist/components/SelectedOutlinePolygon.js +6 -5
  74. package/dist/components/SelectedOutlineRenderer.d.ts +1 -0
  75. package/dist/components/SelectedOutlineRenderer.js +24 -7
  76. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +6 -0
  77. package/dist/components/SelectedOutlineRotationCornerHandle.js +9 -7
  78. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +2 -0
  79. package/dist/components/SelectedOutlineScaleEdgeLine.js +11 -7
  80. package/dist/components/SelectedOutlineTransformOriginHandle.js +50 -24
  81. package/dist/components/SelectedOutlineUvControls.js +8 -8
  82. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  83. package/dist/components/SettingsModalFooter.js +1 -1
  84. package/dist/components/Splitter/SplitterHandle.js +2 -2
  85. package/dist/components/Tabs/index.d.ts +2 -0
  86. package/dist/components/Tabs/index.js +2 -2
  87. package/dist/components/Timeline/EasingEditorModal.js +2 -2
  88. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  89. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  90. package/dist/components/Timeline/Timeline.js +55 -1
  91. package/dist/components/Timeline/TimelineClipboardKeybindings.js +99 -35
  92. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  93. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  94. package/dist/components/Timeline/TimelineEffectPropItem.js +7 -0
  95. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  96. package/dist/components/Timeline/TimelineInOutDragHandler.js +2 -2
  97. package/dist/components/Timeline/TimelineLayerEye.js +2 -2
  98. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  99. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  100. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  101. package/dist/components/Timeline/TimelineSelection.js +47 -4
  102. package/dist/components/Timeline/TimelineSequenceItem.js +43 -25
  103. package/dist/components/Timeline/TimelineSequencePropItem.js +12 -3
  104. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +6 -6
  105. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  106. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  107. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  108. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  109. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  110. package/dist/components/Timeline/get-sequence-context-menu-items.js +14 -6
  111. package/dist/components/Timeline/keyframe-clipboard.d.ts +5 -1
  112. package/dist/components/Timeline/keyframe-clipboard.js +3 -2
  113. package/dist/components/Timeline/save-sequence-prop.js +16 -7
  114. package/dist/components/Timeline/sequence-prop-clipboard.d.ts +31 -0
  115. package/dist/components/Timeline/sequence-prop-clipboard.js +142 -0
  116. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  117. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  118. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  119. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  120. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  121. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  122. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  123. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  124. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  125. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  126. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  127. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  128. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  129. package/dist/components/Timeline/update-selected-easing.js +8 -0
  130. package/dist/components/Timeline/use-open-sequence-in-apps.js +3 -1
  131. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  132. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +67 -10
  133. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  134. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  135. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  136. package/dist/components/call-api.js +2 -0
  137. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  138. package/dist/components/canvas-rotation-cursor.js +14 -0
  139. package/dist/components/folder-menu-items.js +1 -0
  140. package/dist/components/get-open-in-menu-items.d.ts +8 -1
  141. package/dist/components/get-open-in-menu-items.js +93 -8
  142. package/dist/components/import-assets.js +7 -0
  143. package/dist/components/root-composition-menu-items.js +1 -0
  144. package/dist/components/selected-outline-control-layout.d.ts +14 -0
  145. package/dist/components/selected-outline-control-layout.js +94 -0
  146. package/dist/components/selected-outline-drag.d.ts +11 -5
  147. package/dist/components/selected-outline-drag.js +80 -42
  148. package/dist/components/selected-outline-measurement.d.ts +5 -0
  149. package/dist/components/selected-outline-measurement.js +28 -1
  150. package/dist/components/selected-outline-types.d.ts +6 -0
  151. package/dist/components/use-default-editor-info.js +28 -3
  152. package/dist/esm/{chunk-ptnd65a9.js → chunk-jdn6nkbk.js} +10087 -7919
  153. package/dist/esm/{chunk-fgedsvhb.js → chunk-r46yxrjr.js} +1 -2
  154. package/dist/esm/index.mjs +357 -2
  155. package/dist/esm/internals.mjs +10086 -7918
  156. package/dist/esm/previewEntry.mjs +9926 -7758
  157. package/dist/esm/renderEntry.mjs +4 -2
  158. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  159. package/dist/helpers/get-canvas-capture-import.d.ts +7 -0
  160. package/dist/helpers/get-canvas-capture-import.js +43 -0
  161. package/dist/helpers/get-git-menu-item.d.ts +1 -1
  162. package/dist/helpers/get-git-menu-item.js +33 -3
  163. package/dist/helpers/inserted-element-selection.d.ts +12 -0
  164. package/dist/helpers/inserted-element-selection.js +29 -0
  165. package/dist/helpers/open-in-editor.d.ts +3 -1
  166. package/dist/helpers/open-in-editor.js +5 -1
  167. package/dist/helpers/pointer-session.d.ts +6 -2
  168. package/dist/helpers/pointer-session.js +29 -12
  169. package/dist/helpers/preview-server-events.js +4 -0
  170. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  171. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  172. package/dist/helpers/use-create-composition.d.ts +15 -2
  173. package/dist/helpers/use-create-composition.js +11 -17
  174. package/dist/helpers/use-menu-structure.js +1 -0
  175. package/dist/icons/cube.d.ts +4 -0
  176. package/dist/icons/cube.js +6 -0
  177. package/dist/icons/finder.d.ts +4 -0
  178. package/dist/icons/finder.js +8 -0
  179. package/dist/icons/github.d.ts +4 -0
  180. package/dist/icons/github.js +11 -0
  181. package/dist/icons/terminal.d.ts +6 -0
  182. package/dist/icons/terminal.js +46 -0
  183. package/dist/index.d.ts +15 -0
  184. package/dist/index.js +8 -0
  185. package/dist/renderEntry.js +2 -2
  186. package/dist/state/modals.d.ts +9 -1
  187. package/dist/state/transform-3d-mode.d.ts +10 -0
  188. package/dist/state/transform-3d-mode.js +27 -0
  189. package/dist/state/z-index.d.ts +0 -1
  190. package/dist/state/z-index.js +28 -37
  191. package/package.json +12 -12
@@ -2,7 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FastRefreshProvider = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const studio_shared_1 = require("@remotion/studio-shared");
5
6
  const react_1 = require("react");
7
+ const react_dom_1 = require("react-dom");
6
8
  const fast_refresh_context_1 = require("./fast-refresh-context");
7
9
  const FastRefreshProvider = ({ children }) => {
8
10
  const [fastRefreshes, setFastRefreshes] = (0, react_1.useState)(0);
@@ -11,15 +13,17 @@ const FastRefreshProvider = ({ children }) => {
11
13
  setManualRefreshes((i) => i + 1);
12
14
  }, []);
13
15
  (0, react_1.useEffect)(() => {
14
- if (typeof __webpack_module__ !== 'undefined') {
15
- if (__webpack_module__.hot) {
16
- __webpack_module__.hot.addStatusHandler((status) => {
17
- if (status === 'idle') {
18
- setFastRefreshes((i) => i + 1);
19
- }
20
- });
21
- }
22
- }
16
+ const onReactRefreshFinished = () => {
17
+ // Commit consumers and their layout effects before the browser paints
18
+ // the refreshed composition with stale node-path statuses.
19
+ (0, react_dom_1.flushSync)(() => {
20
+ setFastRefreshes((i) => i + 1);
21
+ });
22
+ };
23
+ window.addEventListener(studio_shared_1.REACT_REFRESH_FINISHED_EVENT, onReactRefreshFinished);
24
+ return () => {
25
+ window.removeEventListener(studio_shared_1.REACT_REFRESH_FINISHED_EVENT, onReactRefreshFinished);
26
+ };
23
27
  }, []);
24
28
  const value = (0, react_1.useMemo)(() => ({ fastRefreshes, manualRefreshes, increaseManualRefreshes }), [fastRefreshes, manualRefreshes, increaseManualRefreshes]);
25
29
  return (jsx_runtime_1.jsx(fast_refresh_context_1.FastRefreshContext.Provider, { value: value, children: children }));
package/dist/Studio.d.ts CHANGED
@@ -1,4 +1,9 @@
1
1
  import React from 'react';
2
+ declare global {
3
+ interface Window {
4
+ remotion_experimentalKeepAudioContextAlive: boolean | undefined;
5
+ }
6
+ }
2
7
  export declare const Studio: React.FC<{
3
8
  readonly rootComponent: React.FC;
4
9
  readonly readOnly: boolean;
package/dist/Studio.js CHANGED
@@ -16,8 +16,8 @@ const getServerDisconnectedDomElement = () => {
16
16
  return document.getElementById('server-disconnected-overlay');
17
17
  };
18
18
  const StudioInner = ({ rootComponent, readOnly }) => {
19
- var _a, _b;
20
- return (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], initialCanvasContent: null, children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: window.remotion_numberOfAudioTags, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', previewSampleRate: window.remotion_previewSampleRate, children: jsx_runtime_1.jsx(use_static_files_1.StaticFilesProvider, { children: jsx_runtime_1.jsx(ResolveCompositionConfigInStudio_1.ResolveCompositionConfigInStudio, { children: jsx_runtime_1.jsxs(EditorContexts_1.EditorContexts, { children: [
19
+ var _a, _b, _c;
20
+ return (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], initialCanvasContent: null, children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: window.remotion_numberOfAudioTags, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', previewSampleRate: window.remotion_previewSampleRate, _experimentalKeepAudioContextAlive: (_c = window.remotion_experimentalKeepAudioContextAlive) !== null && _c !== void 0 ? _c : false, children: jsx_runtime_1.jsx(use_static_files_1.StaticFilesProvider, { children: jsx_runtime_1.jsx(ResolveCompositionConfigInStudio_1.ResolveCompositionConfigInStudio, { children: jsx_runtime_1.jsxs(EditorContexts_1.EditorContexts, { children: [
21
21
  jsx_runtime_1.jsx(Editor_1.Editor, { readOnlyStudio: readOnly, Root: rootComponent }), readOnly
22
22
  ? null
23
23
  : (0, react_dom_1.createPortal)(jsx_runtime_1.jsx(ServerDisconnected_1.ServerDisconnected, {}), getServerDisconnectedDomElement())] }) }) }) }) }));
@@ -15,6 +15,7 @@ const clipboard_images_1 = require("../helpers/clipboard-images");
15
15
  const clipboard_svg_1 = require("../helpers/clipboard-svg");
16
16
  const colors_1 = require("../helpers/colors");
17
17
  const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
18
+ const get_canvas_capture_import_1 = require("../helpers/get-canvas-capture-import");
18
19
  const get_effective_translation_1 = require("../helpers/get-effective-translation");
19
20
  const install_required_package_1 = require("../helpers/install-required-package");
20
21
  const open_in_editor_1 = require("../helpers/open-in-editor");
@@ -25,6 +26,7 @@ const canvas_ref_1 = require("../state/canvas-ref");
25
26
  const editor_guides_1 = require("../state/editor-guides");
26
27
  const editor_snapping_1 = require("../state/editor-snapping");
27
28
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
29
+ const modals_1 = require("../state/modals");
28
30
  const call_api_1 = require("./call-api");
29
31
  const composition_drop_preview_1 = require("./composition-drop-preview");
30
32
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
@@ -125,6 +127,7 @@ const Canvas = ({ canvasContent, size }) => {
125
127
  const keybindings = (0, use_keybinding_1.useKeybinding)();
126
128
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
127
129
  const chooseSvgImportMode = (0, SvgImportDialog_1.useSvgImportDialog)();
130
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
128
131
  const config = remotion_1.Internals.useUnsafeVideoConfig();
129
132
  const areRulersVisible = (0, use_is_ruler_visible_1.useIsRulerVisible)();
130
133
  const { editorShowGuides } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
@@ -703,13 +706,15 @@ const Canvas = ({ canvasContent, size }) => {
703
706
  setCompositionDropPreview(null);
704
707
  return;
705
708
  }
706
- if (!canDropAssets && !cannotAddSequence) {
709
+ const mayBeCanvasCapture = (0, drop_handler_data_1.isFileDragEvent)(event) && !window.remotion_isReadOnlyStudio;
710
+ if (!canDropAssets && !cannotAddSequence && !mayBeCanvasCapture) {
707
711
  setCompositionDropPreview(null);
708
712
  return;
709
713
  }
710
714
  event.preventDefault();
711
715
  if (event.dataTransfer) {
712
- event.dataTransfer.dropEffect = canDropAssets ? 'copy' : 'none';
716
+ event.dataTransfer.dropEffect =
717
+ canDropAssets || mayBeCanvasCapture ? 'copy' : 'none';
713
718
  }
714
719
  if (!canDropAssets ||
715
720
  contentDimensions === null ||
@@ -797,12 +802,36 @@ const Canvas = ({ canvasContent, size }) => {
797
802
  setCompositionDropPreview(null);
798
803
  }, []);
799
804
  const onDrop = (0, react_1.useCallback)(async (event) => {
800
- var _a;
801
- var _b;
805
+ var _a, _b;
806
+ var _c, _d;
802
807
  setCompositionDropPreview(null);
803
808
  if (!(0, drop_handler_data_1.isSupportedDropEvent)(event) || !isDragEventInsideCanvas(event)) {
804
809
  return;
805
810
  }
811
+ if ((0, drop_handler_data_1.isFileDragEvent)(event) && !window.remotion_isReadOnlyStudio) {
812
+ event.preventDefault();
813
+ event.stopPropagation();
814
+ const files = Array.from((_c = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _c !== void 0 ? _c : []);
815
+ if (files.length === 1) {
816
+ setIsAddingAsset(true);
817
+ try {
818
+ const canvasCapture = await (0, get_canvas_capture_import_1.getCanvasCaptureImport)(files[0]);
819
+ if (canvasCapture !== null) {
820
+ setSelectedModal({
821
+ type: 'new-comp',
822
+ canvasCapture,
823
+ folderName: null,
824
+ parentName: null,
825
+ stack: null,
826
+ });
827
+ return;
828
+ }
829
+ }
830
+ finally {
831
+ setIsAddingAsset(false);
832
+ }
833
+ }
834
+ }
806
835
  if (cannotAddSequence) {
807
836
  event.preventDefault();
808
837
  event.stopPropagation();
@@ -824,7 +853,7 @@ const Canvas = ({ canvasContent, size }) => {
824
853
  event.stopPropagation();
825
854
  setIsAddingAsset(true);
826
855
  try {
827
- const metadata = studio_protocol_1.StudioProtocolInternals.getDragPreviewMetadata((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []);
856
+ const metadata = studio_protocol_1.StudioProtocolInternals.getDragPreviewMetadata((_d = (_b = event.dataTransfer) === null || _b === void 0 ? void 0 : _b.types) !== null && _d !== void 0 ? _d : []);
828
857
  const isComposition = (metadata === null || metadata === void 0 ? void 0 : metadata.type) === 'composition';
829
858
  let dropPosition = getDropPosition({
830
859
  addFitPadding,
@@ -887,6 +916,7 @@ const Canvas = ({ canvasContent, size }) => {
887
916
  editorSnapping,
888
917
  previewSize,
889
918
  size,
919
+ setSelectedModal,
890
920
  ]);
891
921
  const onPaste = (0, react_1.useCallback)(async (event) => {
892
922
  const { activeElement } = document;
@@ -1,4 +1,6 @@
1
+ import type { DefaultCodingAgent } from '@remotion/renderer';
1
2
  import React from 'react';
2
3
  export declare const CodingAgentIcon: React.FC<{
3
- readonly iconDataUrl: string | null;
4
+ readonly codingAgentId: DefaultCodingAgent | null;
5
+ readonly size: number;
4
6
  }>;
@@ -3,15 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CodingAgentIcon = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const apps_1 = require("../icons/apps");
6
- const iconStyle = {
7
- flexShrink: 0,
8
- height: 18,
9
- width: 18,
10
- };
11
- const CodingAgentIcon = ({ iconDataUrl }) => {
12
- if (iconDataUrl === null) {
13
- return jsx_runtime_1.jsx(apps_1.AppsIcon, { height: 18, width: 18 });
6
+ const CodingAgentIcon = ({ codingAgentId, size }) => {
7
+ if (codingAgentId === null) {
8
+ return jsx_runtime_1.jsx(apps_1.AppsIcon, { height: size, width: size });
14
9
  }
15
- return (jsx_runtime_1.jsx("img", { alt: "", "aria-hidden": true, draggable: false, src: iconDataUrl, style: iconStyle }));
10
+ return (jsx_runtime_1.jsx("img", { alt: "", "aria-hidden": true, "data-coding-agent-icon": codingAgentId, draggable: false, src: `/api/app-icon/coding-agent/${codingAgentId}.png`, style: { flexShrink: 0, height: size, width: size } }));
16
11
  };
17
12
  exports.CodingAgentIcon = CodingAgentIcon;
@@ -59,9 +59,9 @@ const AlphaSlider = ({ hue, saturation, value, alpha, onChange, onChangeComplete
59
59
  e.preventDefault();
60
60
  updateFromEvent(e.clientX, false);
61
61
  let lastClientX = e.clientX;
62
- (0, pointer_session_1.startPointerSession)({
62
+ (0, pointer_session_1.startCapturedPointerSession)({
63
63
  event: e.nativeEvent,
64
- target: e.currentTarget,
64
+ captureTarget: e.currentTarget,
65
65
  onMove: (ev) => {
66
66
  lastClientX = ev.clientX;
67
67
  updateFromEvent(ev.clientX, false);
@@ -41,9 +41,9 @@ const HueSlider = ({ hue, onChange, onChangeComplete }) => {
41
41
  e.preventDefault();
42
42
  updateFromEvent(e.clientX, false);
43
43
  let lastClientX = e.clientX;
44
- (0, pointer_session_1.startPointerSession)({
44
+ (0, pointer_session_1.startCapturedPointerSession)({
45
45
  event: e.nativeEvent,
46
- target: e.currentTarget,
46
+ captureTarget: e.currentTarget,
47
47
  onMove: (ev) => {
48
48
  lastClientX = ev.clientX;
49
49
  updateFromEvent(ev.clientX, false);
@@ -55,9 +55,9 @@ const SaturationValueArea = ({ hue, saturation, value, onChange, onChangeComplet
55
55
  e.preventDefault();
56
56
  updateFromEvent(e.clientX, e.clientY, false);
57
57
  let lastPosition = { clientX: e.clientX, clientY: e.clientY };
58
- (0, pointer_session_1.startPointerSession)({
58
+ (0, pointer_session_1.startCapturedPointerSession)({
59
59
  event: e.nativeEvent,
60
- target: e.currentTarget,
60
+ captureTarget: e.currentTarget,
61
61
  onMove: (ev) => {
62
62
  lastPosition = { clientX: ev.clientX, clientY: ev.clientY };
63
63
  updateFromEvent(ev.clientX, ev.clientY, false);
@@ -125,7 +125,7 @@ const DefaultEditorSettings = () => {
125
125
  id: codingAgent.id,
126
126
  keyHint: null,
127
127
  label: (jsx_runtime_1.jsxs("span", { style: appLabel, children: [
128
- jsx_runtime_1.jsx(CodingAgentIcon_1.CodingAgentIcon, { iconDataUrl: codingAgent.iconDataUrl }), jsx_runtime_1.jsx("span", { style: appName, children: codingAgent.name })
128
+ jsx_runtime_1.jsx(CodingAgentIcon_1.CodingAgentIcon, { codingAgentId: codingAgent.id, size: 18 }), jsx_runtime_1.jsx("span", { style: appName, children: codingAgent.name })
129
129
  ] })),
130
130
  leftItem: selectedCodingAgent === codingAgent.id ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
131
131
  onClick: () => {
@@ -14,5 +14,6 @@ export declare const ContextMenu: React.ForwardRefExoticComponent<ContextMenuPro
14
14
  export declare const ContextMenuForTarget: React.FC<{
15
15
  readonly triggerRef: React.RefObject<HTMLElement | SVGElement | null>;
16
16
  readonly getItems: ContextMenuItemsFactory;
17
+ readonly onOpenChange?: (open: boolean) => void;
17
18
  }>;
18
19
  export {};
@@ -236,15 +236,26 @@ exports.ContextMenu = react_1.default.forwardRef(({ children, getItems, style =
236
236
  jsx_runtime_1.jsx("div", { ref: setRef, onContextMenu: () => false, style: style, className: className, onPointerDown: onPointerDown, children: children }), opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { menuTreeId: menuTreeIdRef.current, sizeSource: ref, currentZIndex: currentZIndex, onHide: onHide, opened: opened })) : null] }));
237
237
  });
238
238
  exports.ContextMenu.displayName = 'ContextMenu';
239
- const ContextMenuForTarget = ({ triggerRef, getItems }) => {
239
+ const ContextMenuForTarget = ({ triggerRef, getItems, onOpenChange = undefined }) => {
240
240
  const idRef = (0, react_1.useRef)(nextContextMenuId++);
241
241
  const menuTreeIdRef = (0, react_1.useRef)((0, menu_tree_context_1.getNextMenuTreeId)());
242
242
  const invocationRef = (0, react_1.useRef)(0);
243
+ const isOpenRef = (0, react_1.useRef)(false);
243
244
  const getItemsRef = (0, react_1.useRef)(getItems);
245
+ const onOpenChangeRef = (0, react_1.useRef)(onOpenChange);
244
246
  getItemsRef.current = getItems;
247
+ onOpenChangeRef.current = onOpenChange;
245
248
  const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
246
249
  const [body, setBody] = (0, react_1.useState)(null);
247
250
  const { currentZIndex } = (0, z_index_1.useZIndex)();
251
+ const setOpenLifecycleState = (0, react_1.useCallback)((open) => {
252
+ var _a;
253
+ if (isOpenRef.current === open) {
254
+ return;
255
+ }
256
+ isOpenRef.current = open;
257
+ (_a = onOpenChangeRef.current) === null || _a === void 0 ? void 0 : _a.call(onOpenChangeRef, open);
258
+ }, []);
248
259
  (0, react_1.useEffect)(() => {
249
260
  // Access document.body after mount so importing this component stays safe
250
261
  // in DOM-less test environments.
@@ -260,8 +271,21 @@ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
260
271
  e.preventDefault();
261
272
  e.stopPropagation();
262
273
  const currentInvocation = ++invocationRef.current;
263
- const values = await (0, exports.resolveContextMenuItems)(getItemsRef.current, e);
274
+ setOpenLifecycleState(true);
275
+ let values;
276
+ try {
277
+ values = await (0, exports.resolveContextMenuItems)(getItemsRef.current, e);
278
+ }
279
+ catch (err) {
280
+ if (currentInvocation === invocationRef.current) {
281
+ setOpenLifecycleState(false);
282
+ }
283
+ throw err;
284
+ }
264
285
  if (currentInvocation !== invocationRef.current || values === null) {
286
+ if (currentInvocation === invocationRef.current) {
287
+ setOpenLifecycleState(false);
288
+ }
265
289
  return false;
266
290
  }
267
291
  notifyContextMenuOpened(idRef.current);
@@ -277,16 +301,19 @@ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
277
301
  return () => {
278
302
  current.removeEventListener('contextmenu', onClick);
279
303
  };
280
- }, [triggerRef]);
304
+ }, [setOpenLifecycleState, triggerRef]);
281
305
  (0, react_1.useEffect)(() => {
282
306
  const invocation = invocationRef;
283
307
  return () => {
284
308
  invocation.current++;
309
+ setOpenLifecycleState(false);
285
310
  };
286
- }, []);
311
+ }, [setOpenLifecycleState]);
287
312
  const onHide = (0, react_1.useCallback)(() => {
313
+ invocationRef.current++;
314
+ setOpenLifecycleState(false);
288
315
  setOpened({ type: 'not-open' });
289
- }, []);
316
+ }, [setOpenLifecycleState]);
290
317
  (0, react_1.useEffect)(() => {
291
318
  const onOtherContextMenuOpened = (event) => {
292
319
  if (event.detail === idRef.current) {
@@ -4,6 +4,7 @@ exports.EditorContent = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
+ const transform_3d_mode_1 = require("../state/transform-3d-mode");
7
8
  const GlobalKeybindings_1 = require("./GlobalKeybindings");
8
9
  const InitialCompositionLoader_1 = require("./InitialCompositionLoader");
9
10
  const MenuToolbar_1 = require("./MenuToolbar");
@@ -38,8 +39,8 @@ const EditorContent = ({ readOnlyStudio, children }) => {
38
39
  const content = (jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { orientation: "horizontal", id: "top-to-bottom", maxFlex: 0.9, minFlex: 0.2, defaultFlex: 0.75, maxFlexerSize: null, minFlexerSize: null, maxAntiFlexerSize: null, minAntiFlexerSize: null, children: [
39
40
  jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "flexer", children: children }), jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { allowToCollapse: "none", onCollapse: noop }), jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "anti-flexer", children: showTimeline ? jsx_runtime_1.jsx(Timeline_1.Timeline, {}) : jsx_runtime_1.jsx(TimelineEmptyState_1.TimelineEmptyState, {}) })
40
41
  ] }));
41
- return (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionProvider, { children: jsx_runtime_1.jsxs(StudioClearSelectionArea, { children: [
42
- jsx_runtime_1.jsx(InitialCompositionLoader_1.InitialCompositionLoader, {}), jsx_runtime_1.jsx(MenuToolbar_1.MenuToolbar, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(GlobalKeybindings_1.GlobalKeybindings, {}), jsx_runtime_1.jsx(TimelineKeyframeDragState_1.TimelineKeyframeDragStateProvider, { children: content })
43
- ] }) }));
42
+ return (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionProvider, { children: jsx_runtime_1.jsx(transform_3d_mode_1.Transform3DModeStateProvider, { children: jsx_runtime_1.jsxs(StudioClearSelectionArea, { children: [
43
+ jsx_runtime_1.jsx(InitialCompositionLoader_1.InitialCompositionLoader, {}), jsx_runtime_1.jsx(MenuToolbar_1.MenuToolbar, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(GlobalKeybindings_1.GlobalKeybindings, {}), jsx_runtime_1.jsx(TimelineKeyframeDragState_1.TimelineKeyframeDragStateProvider, { children: content })
44
+ ] }) }) }));
44
45
  };
45
46
  exports.EditorContent = EditorContent;
@@ -115,9 +115,9 @@ const GuideComp = ({ guide, canvasDimensions, scale }) => {
115
115
  };
116
116
  shouldCreateGuideRef.current = false;
117
117
  setDraggingGuideId(() => guide.id);
118
- (0, pointer_session_1.startPointerSession)({
118
+ (0, pointer_session_1.startCapturedPointerSession)({
119
119
  event: e.nativeEvent,
120
- target: e.currentTarget,
120
+ captureTarget: e.currentTarget,
121
121
  onMove: (moveEvent) => {
122
122
  var _a;
123
123
  updateHasMovedGuide(moveEvent.clientX, moveEvent.clientY);
@@ -168,9 +168,9 @@ const EditorRulers = ({ contentDimensions, canvasSize, assetMetadata, containerR
168
168
  };
169
169
  }, [draggingGuideId, moveGuidePointerRef, onMouseMove]);
170
170
  const onPointerSessionStart = (0, react_1.useCallback)((event, guideId) => {
171
- (0, pointer_session_1.startPointerSession)({
171
+ (0, pointer_session_1.startCapturedPointerSession)({
172
172
  event: event.nativeEvent,
173
- target: event.currentTarget,
173
+ captureTarget: event.currentTarget,
174
174
  onMove: (moveEvent) => onMouseMove(moveEvent, guideId),
175
175
  onEnd: () => finishGuideInteraction(guideId),
176
176
  });
@@ -4,6 +4,7 @@ exports.ExplorerPanel = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const colors_1 = require("../helpers/colors");
7
+ const use_asset_drag_events_1 = require("../helpers/use-asset-drag-events");
7
8
  const AssetSelector_1 = require("./AssetSelector");
8
9
  const CompositionSelector_1 = require("./CompositionSelector");
9
10
  const CompSelectorRef_1 = require("./CompSelectorRef");
@@ -33,6 +34,7 @@ const persistSelectedOptionsSidebarPanel = (panel) => {
33
34
  };
34
35
  const ExplorerPanel = ({ readOnlyStudio }) => {
35
36
  const [panel, setPanel] = (0, react_1.useState)(() => getSelectedPanel());
37
+ const assetTabFocusTimer = (0, react_1.useRef)(null);
36
38
  const onCompositionsSelected = (0, react_1.useCallback)(() => {
37
39
  setPanel('compositions');
38
40
  persistSelectedOptionsSidebarPanel('compositions');
@@ -41,6 +43,22 @@ const ExplorerPanel = ({ readOnlyStudio }) => {
41
43
  setPanel('assets');
42
44
  persistSelectedOptionsSidebarPanel('assets');
43
45
  }, []);
46
+ const onAssetDragEnter = (0, react_1.useCallback)((event) => {
47
+ if ((0, use_asset_drag_events_1.isAssetUploadDragEvent)(event) &&
48
+ assetTabFocusTimer.current === null) {
49
+ assetTabFocusTimer.current = window.setTimeout(() => {
50
+ onAssetsSelected();
51
+ assetTabFocusTimer.current = null;
52
+ }, 500);
53
+ }
54
+ }, [onAssetsSelected]);
55
+ const onAssetDragLeave = (0, react_1.useCallback)((event) => {
56
+ if ((0, use_asset_drag_events_1.isAssetUploadDragEvent)(event) &&
57
+ assetTabFocusTimer.current !== null) {
58
+ window.clearTimeout(assetTabFocusTimer.current);
59
+ assetTabFocusTimer.current = null;
60
+ }
61
+ }, []);
44
62
  (0, react_1.useImperativeHandle)(ExplorerPanelRef_1.explorerSidebarTabs, () => {
45
63
  return {
46
64
  getSelectedPanel: () => panel,
@@ -60,7 +78,7 @@ const ExplorerPanel = ({ readOnlyStudio }) => {
60
78
  }, []);
61
79
  return (jsx_runtime_1.jsx(CompSelectorRef_1.CompSelectorRef, { children: jsx_runtime_1.jsxs("div", { style: container, className: "css-reset", onPointerDown: onPointerDown, children: [
62
80
  jsx_runtime_1.jsx("div", { style: tabsContainer, children: jsx_runtime_1.jsxs(Tabs_1.Tabs, { children: [
63
- jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'compositions', onClick: onCompositionsSelected, children: "Compositions" }), jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'assets', onClick: onAssetsSelected, children: "Assets" })
81
+ jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'compositions', onClick: onCompositionsSelected, children: "Compositions" }), jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'assets', onClick: onAssetsSelected, onDragEnter: onAssetDragEnter, onDragLeave: onAssetDragLeave, children: "Assets" })
64
82
  ] }) }), panel === 'compositions' ? (jsx_runtime_1.jsx(CompositionSelector_1.CompositionSelector, {})) : (jsx_runtime_1.jsx(AssetSelector_1.AssetSelector, { readOnlyStudio: readOnlyStudio }))] }) }));
65
83
  };
66
84
  exports.ExplorerPanel = ExplorerPanel;
@@ -3,8 +3,9 @@ export type RenderInlineAction = (color: string) => React.ReactNode;
3
3
  export type InlineActionProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'onClick' | 'style'> & {
4
4
  readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
5
5
  readonly renderAction: RenderInlineAction;
6
+ readonly hoveredColor?: string;
6
7
  readonly unhoveredColor?: string;
7
8
  readonly variant: 'compact' | null;
8
9
  readonly style?: React.CSSProperties;
9
10
  };
10
- export declare const InlineAction: ({ renderAction, onClick, disabled, title, unhoveredColor, variant, style: customStyle, className, ...buttonProps }: InlineActionProps) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const InlineAction: ({ renderAction, onClick, disabled, title, hoveredColor, unhoveredColor, variant, style: customStyle, className, ...buttonProps }: InlineActionProps) => import("react/jsx-runtime").JSX.Element;
@@ -6,7 +6,7 @@ const react_1 = require("react");
6
6
  const colors_1 = require("../helpers/colors");
7
7
  const hoverable_1 = require("../helpers/hoverable");
8
8
  const z_index_1 = require("../state/z-index");
9
- const InlineAction = ({ renderAction, onClick, disabled, title, unhoveredColor = colors_1.LIGHT_TEXT, variant, style: customStyle, className, ...buttonProps }) => {
9
+ const InlineAction = ({ renderAction, onClick, disabled, title, hoveredColor = colors_1.WHITE, unhoveredColor = colors_1.LIGHT_TEXT, variant, style: customStyle, className, ...buttonProps }) => {
10
10
  var _a;
11
11
  const { tabIndex } = (0, z_index_1.useZIndex)();
12
12
  const style = (0, react_1.useMemo)(() => {
@@ -27,11 +27,11 @@ const InlineAction = ({ renderAction, onClick, disabled, title, unhoveredColor =
27
27
  ? colors_1.TRANSPARENT
28
28
  : (0, colors_1.getBackgroundFromHoverState)({ hovered: true, selected: false }),
29
29
  idleColor: unhoveredColor,
30
- hoverColor: disabled ? unhoveredColor : colors_1.WHITE,
30
+ hoverColor: disabled ? unhoveredColor : hoveredColor,
31
31
  }),
32
32
  ...customStyle,
33
33
  };
34
- }, [customStyle, disabled, unhoveredColor, variant]);
34
+ }, [customStyle, disabled, hoveredColor, unhoveredColor, variant]);
35
35
  return (jsx_runtime_1.jsx("button", { ...buttonProps, type: "button", className: className
36
36
  ? `${hoverable_1.HOVERABLE_CLASS_NAME} ${className}`
37
37
  : hoverable_1.HOVERABLE_CLASS_NAME, disabled: disabled, onClick: onClick, style: style, tabIndex: tabIndex, title: title, "aria-label": (_a = buttonProps['aria-label']) !== null && _a !== void 0 ? _a : title, children: renderAction(colors_1.CURRENT_COLOR) }));
@@ -64,6 +64,6 @@ const InspectorLocationCopy = ({ children, location, name, openInEditorLocation
64
64
  opacity: showAction ? 1 : 0,
65
65
  pointerEvents: showAction ? 'auto' : 'none',
66
66
  }, children: [
67
- jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { contextForAgents: contextForAgents, location: openInEditorLocation }), contextForAgents ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopy, renderAction: renderCopyAction, title: "Copy context for agents" })) : null] })) : null] }));
67
+ jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { locationType: null, contextForAgents: contextForAgents, location: openInEditorLocation }), contextForAgents ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopy, renderAction: renderCopyAction, title: "Copy context for agents" })) : null] })) : null] }));
68
68
  };
69
69
  exports.InspectorLocationCopy = InspectorLocationCopy;
@@ -4,4 +4,5 @@ export declare const InspectorOpenInEditor: React.FC<{
4
4
  readonly contextForAgents?: string | null;
5
5
  readonly location: OriginalPosition | null;
6
6
  readonly label?: React.ReactNode;
7
+ readonly locationType: 'file' | 'folder' | null;
7
8
  }>;
@@ -13,6 +13,7 @@ const z_index_1 = require("../state/z-index");
13
13
  const get_open_in_menu_items_1 = require("./get-open-in-menu-items");
14
14
  const InlineDropdown_1 = require("./InlineDropdown");
15
15
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
16
+ const actions_1 = require("./RenderQueue/actions");
16
17
  const use_default_editor_info_1 = require("./use-default-editor-info");
17
18
  const splitButton = {
18
19
  alignItems: 'center',
@@ -40,13 +41,14 @@ const mainButtonBase = {
40
41
  whiteSpace: 'nowrap',
41
42
  };
42
43
  const editorButtonIconSize = 18;
43
- const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) => {
44
- var _a;
44
+ const InspectorOpenInEditor = ({ contextForAgents = null, label, location, locationType }) => {
45
+ var _a, _b;
45
46
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
46
47
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
47
48
  const { tabIndex } = (0, z_index_1.useZIndex)();
48
49
  const [hovered, setHovered] = (0, react_1.useState)(false);
49
50
  const [dropdownOpened, setDropdownOpened] = (0, react_1.useState)(false);
51
+ const ignorePointerEnter = (0, react_1.useRef)(false);
50
52
  const editorPickerAvailable = (0, use_default_editor_info_1.canUseEditorPicker)(previewServerState.type === 'connected');
51
53
  const editorInfo = (0, use_default_editor_info_1.useDefaultEditorInfo)(editorPickerAvailable);
52
54
  const codingAgentInfo = (0, use_default_editor_info_1.useDefaultCodingAgentInfo)(editorPickerAvailable);
@@ -62,6 +64,7 @@ const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) =>
62
64
  }
63
65
  }, [location]);
64
66
  const preferredEditorId = (0, use_default_editor_info_1.getPreferredEditorId)(editorInfo);
67
+ const preferredEditor = editorInfo === null || editorInfo === void 0 ? void 0 : editorInfo.installedEditors.find((editor) => editor.id === preferredEditorId);
65
68
  const openWithCodingAgent = (0, react_1.useCallback)(async (codingAgentId, codingAgentName) => {
66
69
  try {
67
70
  const response = await (0, open_in_editor_1.openInCodingAgent)(codingAgentId, codingAgentId === 'copilot' ? null : contextForAgents);
@@ -73,12 +76,20 @@ const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) =>
73
76
  (0, NotificationCenter_1.showNotification)(err.message, 2000);
74
77
  }
75
78
  }, [contextForAgents]);
76
- const editorName = (_a = window.remotion_editorName) !== null && _a !== void 0 ? _a : 'default editor';
77
- const canOpenDefault = location !== null && window.remotion_editorName !== null;
79
+ const editorName = (_b = (_a = window.remotion_editorName) !== null && _a !== void 0 ? _a : preferredEditor === null || preferredEditor === void 0 ? void 0 : preferredEditor.nameWithType) !== null && _b !== void 0 ? _b : 'default editor';
80
+ const canOpenDefault = location !== null &&
81
+ (window.remotion_editorName !== null || preferredEditorId !== null);
78
82
  const onOpenDefault = (0, react_1.useCallback)((event) => {
79
83
  event.stopPropagation();
80
- openWithEditor(null).catch(() => undefined);
81
- }, [openWithEditor]);
84
+ openWithEditor(window.remotion_editorName === null ? preferredEditorId : null).catch(() => undefined);
85
+ }, [openWithEditor, preferredEditorId]);
86
+ const onDropdownOpenChange = (0, react_1.useCallback)((open) => {
87
+ setDropdownOpened(open);
88
+ if (!open) {
89
+ ignorePointerEnter.current = true;
90
+ setHovered(false);
91
+ }
92
+ }, []);
82
93
  const mainHovered = hovered && !dropdownOpened;
83
94
  const mainButtonStyle = (0, react_1.useMemo)(() => {
84
95
  return {
@@ -113,6 +124,9 @@ const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) =>
113
124
  editorInfo,
114
125
  excludeCodingAgentId: null,
115
126
  excludeEditorId: preferredEditorId,
127
+ fileManagerDisabled: !(location === null || location === void 0 ? void 0 : location.source),
128
+ folder: locationType === 'folder',
129
+ location,
116
130
  onConfigureApps: () => {
117
131
  var _a;
118
132
  var _b;
@@ -128,11 +142,34 @@ const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) =>
128
142
  onOpenInEditor: (editorId) => {
129
143
  openWithEditor(editorId).catch(() => undefined);
130
144
  },
145
+ onOpenInFileExplorer: () => {
146
+ if (!(location === null || location === void 0 ? void 0 : location.source)) {
147
+ return;
148
+ }
149
+ (0, actions_1.openInFileExplorer)({ directory: location.source }).catch((err) => {
150
+ (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
151
+ });
152
+ },
153
+ onOpenInTerminal: (terminalId) => {
154
+ if (!(location === null || location === void 0 ? void 0 : location.source) || locationType !== 'folder') {
155
+ return;
156
+ }
157
+ (0, open_in_editor_1.openInTerminal)(terminalId, location.source)
158
+ .then((response) => {
159
+ if (!response.success) {
160
+ (0, NotificationCenter_1.showNotification)('Could not open terminal', 2000);
161
+ }
162
+ })
163
+ .catch((err) => {
164
+ (0, NotificationCenter_1.showNotification)(`Could not open terminal: ${err.message}`, 2000);
165
+ });
166
+ },
131
167
  });
132
168
  }, [
133
169
  codingAgentInfo,
134
170
  editorInfo,
135
171
  location,
172
+ locationType,
136
173
  openWithCodingAgent,
137
174
  openWithEditor,
138
175
  preferredEditorId,
@@ -141,9 +178,16 @@ const InspectorOpenInEditor = ({ contextForAgents = null, label, location }) =>
141
178
  if (!editorPickerAvailable) {
142
179
  return null;
143
180
  }
144
- return (jsx_runtime_1.jsxs("div", { style: splitButton, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), children: [
181
+ return (jsx_runtime_1.jsxs("div", { style: splitButton, onPointerEnter: () => {
182
+ if (!ignorePointerEnter.current) {
183
+ setHovered(true);
184
+ }
185
+ }, onPointerLeave: () => {
186
+ ignorePointerEnter.current = false;
187
+ setHovered(false);
188
+ }, children: [
145
189
  jsx_runtime_1.jsxs("button", { "aria-label": `Open in ${editorName}`, disabled: !canOpenDefault, onClick: onOpenDefault, style: mainButtonStyle, tabIndex: tabIndex, title: `Open in ${editorName}`, type: "button", children: [label, jsx_runtime_1.jsx(editor_1.EditorIcon, { editorId: preferredEditorId, size: editorButtonIconSize })
146
- ] }), jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { onOpenChange: setDropdownOpened, renderAction: renderDropdownAction, style: dropdownStyle, title: "Open in another app", unhoveredColor: dropdownForegroundColor, values: menuItems, variant: "compact" })
190
+ ] }), jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { onOpenChange: onDropdownOpenChange, renderAction: renderDropdownAction, style: dropdownStyle, title: "Open in another app", unhoveredColor: dropdownForegroundColor, values: menuItems, variant: "compact" })
147
191
  ] }));
148
192
  };
149
193
  exports.InspectorOpenInEditor = InspectorOpenInEditor;
@@ -119,7 +119,7 @@ const AlignmentControls = ({ track }) => {
119
119
  shouldResortToDefaultValueIfUndefined: true,
120
120
  })) !== null && _c !== void 0 ? _c : fieldSchema.default) !== null && _d !== void 0 ? _d : '0px 0px')
121
121
  : String((_e = fieldSchema.default) !== null && _e !== void 0 ? _e : '0px 0px');
122
- const [currentX, currentY] = (0, timeline_translate_utils_1.parseTranslate)(currentTranslate);
122
+ const [currentX, currentY, currentZ] = (0, timeline_translate_utils_1.parseTranslate)(currentTranslate);
123
123
  const { x: newX, y: newY } = (0, alignment_controls_1.computeAlignedTranslate)({
124
124
  direction,
125
125
  elementRect,
@@ -128,7 +128,7 @@ const AlignmentControls = ({ track }) => {
128
128
  currentTranslateY: currentY,
129
129
  scale,
130
130
  });
131
- const newValue = (0, timeline_translate_utils_1.serializeTranslate)(newX, newY);
131
+ const newValue = (0, timeline_translate_utils_1.serializeTranslate)([newX, newY, currentZ]);
132
132
  const undoLabels = {
133
133
  left: 'Align left',
134
134
  'center-h': 'Align center horizontally',