@remotion/studio 4.0.506 → 4.0.508

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 (211) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/api/copy-render-output-to-asset.d.ts +4 -0
  3. package/dist/api/copy-render-output-to-asset.js +11 -0
  4. package/dist/components/AssetSelector.js +19 -4
  5. package/dist/components/AssetSelectorItem.js +2 -2
  6. package/dist/components/CodingAgentIcon.d.ts +6 -0
  7. package/dist/components/CodingAgentIcon.js +12 -0
  8. package/dist/components/ConfigureDefaultEditorModal.d.ts +1 -3
  9. package/dist/components/ConfigureDefaultEditorModal.js +67 -77
  10. package/dist/components/ConfigureLicenseModal.d.ts +1 -4
  11. package/dist/components/ConfigureLicenseModal.js +89 -81
  12. package/dist/components/ContextMenu.d.ts +1 -0
  13. package/dist/components/ContextMenu.js +42 -13
  14. package/dist/components/EditorContent.js +4 -3
  15. package/dist/components/EditorContexts.js +6 -5
  16. package/dist/components/ExpandedTracksProvider.js +10 -53
  17. package/dist/components/InlineAction.d.ts +2 -1
  18. package/dist/components/InlineAction.js +3 -3
  19. package/dist/components/InspectorLocationCopy.js +8 -8
  20. package/dist/components/InspectorOpenInEditor.d.ts +2 -0
  21. package/dist/components/InspectorOpenInEditor.js +81 -50
  22. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  23. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  24. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -0
  25. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +22 -4
  26. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  27. package/dist/components/InspectorPanel/styles.js +1 -1
  28. package/dist/components/InspectorSequenceSection.js +36 -4
  29. package/dist/components/Menu/MenuSectionHeader.d.ts +4 -0
  30. package/dist/components/Menu/MenuSectionHeader.js +20 -0
  31. package/dist/components/Menu/SubMenu.js +13 -2
  32. package/dist/components/Menu/menu-tree-context.d.ts +3 -0
  33. package/dist/components/Menu/menu-tree-context.js +13 -0
  34. package/dist/components/MenuBuildIndicator.js +1 -1
  35. package/dist/components/NewComposition/ComboBox.d.ts +6 -1
  36. package/dist/components/NewComposition/MenuContent.js +27 -19
  37. package/dist/components/NewComposition/menu-typeahead.js +2 -2
  38. package/dist/components/PlayPause.d.ts +1 -1
  39. package/dist/components/PlayPause.js +61 -12
  40. package/dist/components/Preview.js +29 -4
  41. package/dist/components/RenderButton.js +16 -12
  42. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  43. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  44. package/dist/components/RenderModal/InfoBubble.js +6 -4
  45. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  46. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  47. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  48. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  49. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  50. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  51. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  52. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  53. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  54. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  55. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.d.ts +1 -0
  56. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +3 -3
  57. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  58. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  59. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  60. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  61. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +8 -3
  62. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  63. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  64. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +2 -2
  65. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  66. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  67. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  68. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  69. package/dist/components/RenderModal/ServerRenderModal.js +4 -0
  70. package/dist/components/RenderQueue/RenderQueueItem.js +8 -2
  71. package/dist/components/RenderQueue/actions.d.ts +4 -2
  72. package/dist/components/RenderQueue/actions.js +4 -2
  73. package/dist/components/RenderQueue/index.js +3 -4
  74. package/dist/components/RenderQueue/use-render-output-file-drag.d.ts +8 -0
  75. package/dist/components/RenderQueue/use-render-output-file-drag.js +121 -0
  76. package/dist/components/SegmentedControl.js +0 -1
  77. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  78. package/dist/components/SelectedOutlineCanvasRotation.js +237 -0
  79. package/dist/components/SelectedOutlineElement.d.ts +16 -18
  80. package/dist/components/SelectedOutlineElement.js +144 -931
  81. package/dist/components/SelectedOutlineKeyboardControls.d.ts +7 -0
  82. package/dist/components/SelectedOutlineKeyboardControls.js +261 -0
  83. package/dist/components/SelectedOutlineOverlay.d.ts +7 -14
  84. package/dist/components/SelectedOutlineOverlay.js +378 -864
  85. package/dist/components/SelectedOutlinePolygon.d.ts +26 -0
  86. package/dist/components/SelectedOutlinePolygon.js +360 -0
  87. package/dist/components/SelectedOutlineRenderer.d.ts +19 -0
  88. package/dist/components/SelectedOutlineRenderer.js +225 -0
  89. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +17 -0
  90. package/dist/components/SelectedOutlineRotationCornerHandle.js +271 -0
  91. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +17 -0
  92. package/dist/components/SelectedOutlineScaleEdgeLine.js +215 -0
  93. package/dist/components/SelectedOutlineSnapIndicators.d.ts +9 -0
  94. package/dist/components/SelectedOutlineSnapIndicators.js +29 -0
  95. package/dist/components/SelectedOutlineTransformOriginHandle.d.ts +9 -0
  96. package/dist/components/SelectedOutlineTransformOriginHandle.js +312 -0
  97. package/dist/components/SelectedOutlineUvControls.d.ts +3 -9
  98. package/dist/components/SelectedOutlineUvControls.js +57 -12
  99. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  100. package/dist/components/SettingsContext.d.ts +15 -0
  101. package/dist/components/SettingsContext.js +116 -0
  102. package/dist/components/SettingsModal.js +10 -4
  103. package/dist/components/SettingsModalFooter.d.ts +1 -3
  104. package/dist/components/SettingsModalFooter.js +4 -6
  105. package/dist/components/ShowOutlinesProvider.js +2 -3
  106. package/dist/components/Timeline/EasingEditorModal.js +66 -22
  107. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  108. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  109. package/dist/components/Timeline/Timeline.js +22 -5
  110. package/dist/components/Timeline/TimelineDuplicateCount.d.ts +4 -0
  111. package/dist/components/Timeline/TimelineDuplicateCount.js +28 -0
  112. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  113. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +3 -23
  114. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +4 -2
  115. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +11 -1
  116. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  117. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  118. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  119. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  120. package/dist/components/Timeline/TimelineSelection.js +45 -2
  121. package/dist/components/Timeline/TimelineSequence.js +28 -25
  122. package/dist/components/Timeline/TimelineSequenceItem.js +91 -28
  123. package/dist/components/Timeline/TimelineSequencePropItem.js +5 -2
  124. package/dist/components/Timeline/TimelineTrack.js +2 -1
  125. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  126. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  127. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  128. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  129. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  130. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -3
  131. package/dist/components/Timeline/get-sequence-context-menu-items.js +69 -57
  132. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  133. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  134. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  135. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  136. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  137. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  138. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  139. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  140. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  141. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  142. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  143. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  144. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  145. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +36 -4
  146. package/dist/components/Timeline/{use-open-sequence-in-editor.d.ts → use-open-sequence-in-apps.d.ts} +4 -1
  147. package/dist/components/Timeline/{use-open-sequence-in-editor.js → use-open-sequence-in-apps.js} +21 -5
  148. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  149. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +45 -9
  150. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  151. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  152. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +4 -0
  153. package/dist/components/Timeline/use-timeline-expanded-tree.js +45 -1
  154. package/dist/components/call-api.js +2 -0
  155. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  156. package/dist/components/canvas-rotation-cursor.js +14 -0
  157. package/dist/components/get-open-in-menu-items.d.ts +17 -0
  158. package/dist/components/get-open-in-menu-items.js +144 -0
  159. package/dist/components/selected-outline-drag.d.ts +11 -5
  160. package/dist/components/selected-outline-drag.js +80 -42
  161. package/dist/components/selected-outline-measurement.d.ts +7 -2
  162. package/dist/components/selected-outline-measurement.js +28 -1
  163. package/dist/components/selected-outline-order.d.ts +12 -0
  164. package/dist/components/selected-outline-order.js +251 -0
  165. package/dist/components/selected-outline-types.d.ts +15 -10
  166. package/dist/components/svg-point-to-client-point.d.ts +2 -0
  167. package/dist/components/svg-point-to-client-point.js +10 -0
  168. package/dist/components/use-auto-save-config.d.ts +8 -0
  169. package/dist/components/use-auto-save-config.js +74 -0
  170. package/dist/components/use-default-editor-info.d.ts +1 -0
  171. package/dist/components/use-default-editor-info.js +10 -30
  172. package/dist/esm/{chunk-jefhcs5z.js → chunk-fgedsvhb.js} +1 -2
  173. package/dist/esm/{chunk-b49ec3nz.js → chunk-zpn4m49r.js} +12924 -10139
  174. package/dist/esm/index.mjs +357 -2
  175. package/dist/esm/internals.mjs +12923 -10138
  176. package/dist/esm/previewEntry.mjs +12771 -9986
  177. package/dist/esm/renderEntry.mjs +2 -2
  178. package/dist/helpers/are-sequence-node-path-infos-equal.d.ts +2 -0
  179. package/dist/helpers/are-sequence-node-path-infos-equal.js +27 -0
  180. package/dist/helpers/calculate-timeline.js +3 -3
  181. package/dist/helpers/client-id.js +8 -1
  182. package/dist/helpers/format-file-location.d.ts +1 -1
  183. package/dist/helpers/format-file-location.js +3 -3
  184. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  185. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  186. package/dist/helpers/open-in-editor.d.ts +4 -1
  187. package/dist/helpers/open-in-editor.js +9 -1
  188. package/dist/helpers/preview-server-events.js +4 -0
  189. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  190. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  191. package/dist/helpers/studio-runtime-config.js +3 -0
  192. package/dist/helpers/timeline-node-path-key.d.ts +2 -0
  193. package/dist/helpers/timeline-node-path-key.js +3 -1
  194. package/dist/helpers/use-asset-drag-events.d.ts +2 -1
  195. package/dist/helpers/use-asset-drag-events.js +14 -6
  196. package/dist/helpers/use-menu-structure.js +2 -2
  197. package/dist/helpers/use-runtime-values.d.ts +1 -3
  198. package/dist/icons/cube.d.ts +4 -0
  199. package/dist/icons/cube.js +6 -0
  200. package/dist/icons/finder.d.ts +4 -0
  201. package/dist/icons/finder.js +8 -0
  202. package/dist/icons/terminal.d.ts +6 -0
  203. package/dist/icons/terminal.js +46 -0
  204. package/dist/index.d.ts +15 -0
  205. package/dist/index.js +8 -0
  206. package/dist/state/timeline-sequence-hover.d.ts +9 -3
  207. package/dist/state/timeline-sequence-hover.js +63 -12
  208. package/dist/state/transform-3d-mode.d.ts +10 -0
  209. package/dist/state/transform-3d-mode.js +27 -0
  210. package/dist/state/z-index.js +5 -8
  211. package/package.json +12 -12
@@ -44,6 +44,7 @@ const react_dom_1 = __importDefault(require("react-dom"));
44
44
  const mobile_layout_1 = require("../helpers/mobile-layout");
45
45
  const noop_1 = require("../helpers/noop");
46
46
  const z_index_1 = require("../state/z-index");
47
+ const menu_tree_context_1 = require("./Menu/menu-tree-context");
47
48
  const portals_1 = require("./Menu/portals");
48
49
  const styles_1 = require("./Menu/styles");
49
50
  const MenuContent_1 = require("./NewComposition/MenuContent");
@@ -70,8 +71,7 @@ const notifyContextMenuOpened = (id) => {
70
71
  detail: id,
71
72
  }));
72
73
  };
73
- const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened }) => {
74
- const menuRef = (0, react_1.useRef)(null);
74
+ const ContextMenuPortal = ({ menuTreeId, sizeSource, currentZIndex, onHide, opened }) => {
75
75
  const size = player_1.PlayerInternals.useElementSize(sizeSource, {
76
76
  triggerOnWindowResize: true,
77
77
  shouldApplyCssTransforms: true,
@@ -138,11 +138,11 @@ const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened }) => {
138
138
  }, []);
139
139
  (0, react_1.useEffect)(() => {
140
140
  const dismissWithoutClickThrough = (event) => {
141
- var _a;
142
141
  if (event.button !== 0) {
143
142
  return;
144
143
  }
145
- if ((_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) {
144
+ const target = event.target;
145
+ if ((0, menu_tree_context_1.isNodeInMenuTree)(target, menuTreeId)) {
146
146
  return;
147
147
  }
148
148
  event.preventDefault();
@@ -154,7 +154,7 @@ const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened }) => {
154
154
  return () => {
155
155
  window.removeEventListener('pointerdown', dismissWithoutClickThrough, true);
156
156
  };
157
- }, [onHide]);
157
+ }, [menuTreeId, onHide]);
158
158
  // Prevent deselection of a selected item
159
159
  const onMenuPointerDown = (0, react_1.useCallback)((e) => {
160
160
  e.stopPropagation();
@@ -162,11 +162,12 @@ const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened }) => {
162
162
  if (!portalStyle) {
163
163
  return null;
164
164
  }
165
- return react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: contextMenuFullScreenOverlay, children: jsx_runtime_1.jsx("div", { style: contextMenuOuterPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, outsideClickButton: "primary", children: jsx_runtime_1.jsx("div", { ref: menuRef, style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: opened.values, onHide: onHide, leaveLeftSpace: true, preselectIndex: false, topItemCanBeUnselected: false, fixedHeight: null }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex));
165
+ return react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: contextMenuFullScreenOverlay, children: jsx_runtime_1.jsx("div", { style: contextMenuOuterPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, outsideClickButton: "primary", children: jsx_runtime_1.jsx("div", { "data-remotion-menu-tree-id": menuTreeId, style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(menu_tree_context_1.MenuTreeContext.Provider, { value: menuTreeId, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: opened.values, onHide: onHide, leaveLeftSpace: true, preselectIndex: false, topItemCanBeUnselected: false, fixedHeight: null }) }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex));
166
166
  };
167
167
  exports.ContextMenu = react_1.default.forwardRef(({ children, getItems, style = undefined, className = undefined, onPointerDown = undefined, }, forwardedRef) => {
168
168
  const ref = (0, react_1.useRef)(null);
169
169
  const idRef = (0, react_1.useRef)(nextContextMenuId++);
170
+ const menuTreeIdRef = (0, react_1.useRef)((0, menu_tree_context_1.getNextMenuTreeId)());
170
171
  const invocationRef = (0, react_1.useRef)(0);
171
172
  const getItemsRef = (0, react_1.useRef)(getItems);
172
173
  getItemsRef.current = getItems;
@@ -232,17 +233,29 @@ exports.ContextMenu = react_1.default.forwardRef(({ children, getItems, style =
232
233
  };
233
234
  }, [onHide]);
234
235
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
235
- 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, { sizeSource: ref, currentZIndex: currentZIndex, onHide: onHide, opened: opened })) : null] }));
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] }));
236
237
  });
237
238
  exports.ContextMenu.displayName = 'ContextMenu';
238
- const ContextMenuForTarget = ({ triggerRef, getItems }) => {
239
+ const ContextMenuForTarget = ({ triggerRef, getItems, onOpenChange = undefined }) => {
239
240
  const idRef = (0, react_1.useRef)(nextContextMenuId++);
241
+ const menuTreeIdRef = (0, react_1.useRef)((0, menu_tree_context_1.getNextMenuTreeId)());
240
242
  const invocationRef = (0, react_1.useRef)(0);
243
+ const isOpenRef = (0, react_1.useRef)(false);
241
244
  const getItemsRef = (0, react_1.useRef)(getItems);
245
+ const onOpenChangeRef = (0, react_1.useRef)(onOpenChange);
242
246
  getItemsRef.current = getItems;
247
+ onOpenChangeRef.current = onOpenChange;
243
248
  const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
244
249
  const [body, setBody] = (0, react_1.useState)(null);
245
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
+ }, []);
246
259
  (0, react_1.useEffect)(() => {
247
260
  // Access document.body after mount so importing this component stays safe
248
261
  // in DOM-less test environments.
@@ -258,8 +271,21 @@ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
258
271
  e.preventDefault();
259
272
  e.stopPropagation();
260
273
  const currentInvocation = ++invocationRef.current;
261
- 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
+ }
262
285
  if (currentInvocation !== invocationRef.current || values === null) {
286
+ if (currentInvocation === invocationRef.current) {
287
+ setOpenLifecycleState(false);
288
+ }
263
289
  return false;
264
290
  }
265
291
  notifyContextMenuOpened(idRef.current);
@@ -275,16 +301,19 @@ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
275
301
  return () => {
276
302
  current.removeEventListener('contextmenu', onClick);
277
303
  };
278
- }, [triggerRef]);
304
+ }, [setOpenLifecycleState, triggerRef]);
279
305
  (0, react_1.useEffect)(() => {
280
306
  const invocation = invocationRef;
281
307
  return () => {
282
308
  invocation.current++;
309
+ setOpenLifecycleState(false);
283
310
  };
284
- }, []);
311
+ }, [setOpenLifecycleState]);
285
312
  const onHide = (0, react_1.useCallback)(() => {
313
+ invocationRef.current++;
314
+ setOpenLifecycleState(false);
286
315
  setOpened({ type: 'not-open' });
287
- }, []);
316
+ }, [setOpenLifecycleState]);
288
317
  (0, react_1.useEffect)(() => {
289
318
  const onOtherContextMenuOpened = (event) => {
290
319
  if (event.detail === idRef.current) {
@@ -297,6 +326,6 @@ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
297
326
  window.removeEventListener(contextMenuOpenedEvent, onOtherContextMenuOpened);
298
327
  };
299
328
  }, [onHide]);
300
- return opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { sizeSource: body, currentZIndex: currentZIndex, onHide: onHide, opened: opened })) : null;
329
+ return opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { menuTreeId: menuTreeIdRef.current, sizeSource: body, currentZIndex: currentZIndex, onHide: onHide, opened: opened })) : null;
301
330
  };
302
331
  exports.ContextMenuForTarget = ContextMenuForTarget;
@@ -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;
@@ -18,6 +18,7 @@ const ModalsProvider_1 = require("./ModalsProvider");
18
18
  const ClientRenderQueueProcessor_1 = require("./RenderQueue/ClientRenderQueueProcessor");
19
19
  const context_1 = require("./RenderQueue/context");
20
20
  const SetTimelineInOutProvider_1 = require("./SetTimelineInOutProvider");
21
+ const SettingsContext_1 = require("./SettingsContext");
21
22
  const ShowGuidesProvider_1 = require("./ShowGuidesProvider");
22
23
  const ShowOutlinesProvider_1 = require("./ShowOutlinesProvider");
23
24
  const ShowRulersProvider_1 = require("./ShowRulersProvider");
@@ -25,10 +26,10 @@ const SnappingProvider_1 = require("./SnappingProvider");
25
26
  const VisualControlsUndoSync_1 = require("./VisualControls/VisualControlsUndoSync");
26
27
  const ZoomGesturesProvider_1 = require("./ZoomGesturesProvider");
27
28
  const EditorContexts = ({ children }) => {
28
- return (jsx_runtime_1.jsx(get_zod_if_possible_1.ZodProvider, { children: jsx_runtime_1.jsx(VisualControls_1.VisualControlsProvider, { children: jsx_runtime_1.jsxs(client_id_1.PreviewServerConnection, { children: [
29
- jsx_runtime_1.jsx(VisualControlsUndoSync_1.VisualControlsUndoSync, {}), jsx_runtime_1.jsxs(context_1.RenderQueueContextProvider, { children: [
30
- jsx_runtime_1.jsx(ClientRenderQueueProcessor_1.ClientRenderQueueProcessor, {}), jsx_runtime_1.jsx(keybindings_1.KeybindingContextProvider, { children: jsx_runtime_1.jsx(CheckerboardProvider_1.CheckerboardProvider, { children: jsx_runtime_1.jsx(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: jsx_runtime_1.jsx(ShowRulersProvider_1.ShowRulersProvider, { children: jsx_runtime_1.jsx(ShowGuidesProvider_1.ShowGuidesProvider, { children: jsx_runtime_1.jsx(ShowOutlinesProvider_1.ShowOutlinesProvider, { children: jsx_runtime_1.jsx(SnappingProvider_1.SnappingProvider, { children: jsx_runtime_1.jsx(preview_size_1.PreviewSizeProvider, { children: jsx_runtime_1.jsx(ModalsProvider_1.ModalsProvider, { children: jsx_runtime_1.jsx(MediaVolumeProvider_1.MediaVolumeProvider, { children: jsx_runtime_1.jsx(player_1.PlayerInternals.PlayerEmitterProvider, { currentPlaybackRate: null, children: jsx_runtime_1.jsx(sidebar_1.SidebarContextProvider, { children: jsx_runtime_1.jsx(folders_1.FolderContextProvider, { children: jsx_runtime_1.jsx(highest_z_index_1.HighestZIndexProvider, { children: jsx_runtime_1.jsx(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: jsx_runtime_1.jsx(ExpandedTracksProvider_1.ExpandedTracksProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) })
31
- ] })
32
- ] }) }) }));
29
+ return (jsx_runtime_1.jsx(get_zod_if_possible_1.ZodProvider, { children: jsx_runtime_1.jsx(VisualControls_1.VisualControlsProvider, { children: jsx_runtime_1.jsx(client_id_1.PreviewServerConnection, { children: jsx_runtime_1.jsxs(SettingsContext_1.SettingsProvider, { children: [
30
+ jsx_runtime_1.jsx(VisualControlsUndoSync_1.VisualControlsUndoSync, {}), jsx_runtime_1.jsxs(context_1.RenderQueueContextProvider, { children: [
31
+ jsx_runtime_1.jsx(ClientRenderQueueProcessor_1.ClientRenderQueueProcessor, {}), jsx_runtime_1.jsx(keybindings_1.KeybindingContextProvider, { children: jsx_runtime_1.jsx(CheckerboardProvider_1.CheckerboardProvider, { children: jsx_runtime_1.jsx(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: jsx_runtime_1.jsx(ShowRulersProvider_1.ShowRulersProvider, { children: jsx_runtime_1.jsx(ShowGuidesProvider_1.ShowGuidesProvider, { children: jsx_runtime_1.jsx(ShowOutlinesProvider_1.ShowOutlinesProvider, { children: jsx_runtime_1.jsx(SnappingProvider_1.SnappingProvider, { children: jsx_runtime_1.jsx(preview_size_1.PreviewSizeProvider, { children: jsx_runtime_1.jsx(ModalsProvider_1.ModalsProvider, { children: jsx_runtime_1.jsx(MediaVolumeProvider_1.MediaVolumeProvider, { children: jsx_runtime_1.jsx(player_1.PlayerInternals.PlayerEmitterProvider, { currentPlaybackRate: null, children: jsx_runtime_1.jsx(sidebar_1.SidebarContextProvider, { children: jsx_runtime_1.jsx(folders_1.FolderContextProvider, { children: jsx_runtime_1.jsx(highest_z_index_1.HighestZIndexProvider, { children: jsx_runtime_1.jsx(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: jsx_runtime_1.jsx(ExpandedTracksProvider_1.ExpandedTracksProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) })
32
+ ] })
33
+ ] }) }) }) }));
33
34
  };
34
35
  exports.EditorContexts = EditorContexts;
@@ -4,46 +4,11 @@ exports.ExpandedTracksProvider = exports.ExpandedTracksSetterContext = exports.E
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const migrate_expanded_tracks_for_subscription_key_1 = require("../helpers/migrate-expanded-tracks-for-subscription-key");
7
+ const persist_boolean_map_1 = require("../helpers/persist-boolean-map");
7
8
  const timeline_node_path_key_1 = require("../helpers/timeline-node-path-key");
8
- const SESSION_STORAGE_KEY = 'remotion.editor.expandedTracks';
9
- const onlyCollapsedTrackValues = (state) => {
10
- const result = {};
11
- for (const [key, value] of Object.entries(state)) {
12
- if (value === false) {
13
- result[key] = false;
14
- }
15
- }
16
- return result;
17
- };
9
+ const SESSION_STORAGE_KEY = 'remotion.editor.expandedTracks.v2';
18
10
  const loadExpandedTracks = () => {
19
- if (typeof window === 'undefined') {
20
- return {};
21
- }
22
- try {
23
- const raw = window.sessionStorage.getItem(SESSION_STORAGE_KEY);
24
- if (raw === null) {
25
- return {};
26
- }
27
- const parsed = JSON.parse(raw);
28
- if (!parsed || typeof parsed !== 'object') {
29
- return {};
30
- }
31
- return onlyCollapsedTrackValues(parsed);
32
- }
33
- catch (_a) {
34
- return {};
35
- }
36
- };
37
- const persistExpandedTracks = (state) => {
38
- if (typeof window === 'undefined') {
39
- return;
40
- }
41
- try {
42
- window.sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(onlyCollapsedTrackValues(state)));
43
- }
44
- catch (_a) {
45
- // Ignore quota errors or disabled storage.
46
- }
11
+ return (0, persist_boolean_map_1.loadPersistedBooleanMap)(SESSION_STORAGE_KEY);
47
12
  };
48
13
  exports.ExpandedTracksGetterContext = (0, react_1.createContext)({
49
14
  getIsExpanded: () => {
@@ -78,31 +43,23 @@ const ExpandedTracksProvider = ({ children }) => {
78
43
  let changed = false;
79
44
  const next = { ...prev };
80
45
  for (const key of keysToExpand) {
81
- if (next[key] === false) {
82
- delete next[key];
46
+ if (!next[key]) {
47
+ next[key] = true;
83
48
  changed = true;
84
49
  }
85
50
  }
86
51
  if (!changed) {
87
52
  return prev;
88
53
  }
89
- persistExpandedTracks(next);
54
+ (0, persist_boolean_map_1.persistBooleanMap)(SESSION_STORAGE_KEY, next);
90
55
  return next;
91
56
  });
92
57
  }, []);
93
58
  const toggleTrack = (0, react_1.useCallback)((nodePathInfo) => {
94
59
  setExpandedTracks((prev) => {
95
- var _a;
96
60
  const key = (0, timeline_node_path_key_1.timelineNodePathInfoToKey)(nodePathInfo);
97
- const next = { ...prev };
98
- const isExpanded = (_a = next[key]) !== null && _a !== void 0 ? _a : true;
99
- if (isExpanded) {
100
- next[key] = false;
101
- }
102
- else {
103
- delete next[key];
104
- }
105
- persistExpandedTracks(next);
61
+ const next = (0, persist_boolean_map_1.toggleBooleanMapKey)(prev, key);
62
+ (0, persist_boolean_map_1.persistBooleanMap)(SESSION_STORAGE_KEY, next);
106
63
  return next;
107
64
  });
108
65
  }, []);
@@ -112,14 +69,14 @@ const ExpandedTracksProvider = ({ children }) => {
112
69
  if (!next) {
113
70
  return prev;
114
71
  }
115
- persistExpandedTracks(next);
72
+ (0, persist_boolean_map_1.persistBooleanMap)(SESSION_STORAGE_KEY, next);
116
73
  return next;
117
74
  });
118
75
  }, []);
119
76
  const getterValue = (0, react_1.useMemo)(() => ({
120
77
  getIsExpanded: (nodePathInfo) => {
121
78
  var _a;
122
- return (_a = expandedTracks[(0, timeline_node_path_key_1.timelineNodePathInfoToKey)(nodePathInfo)]) !== null && _a !== void 0 ? _a : true;
79
+ return (_a = expandedTracks[(0, timeline_node_path_key_1.timelineNodePathInfoToKey)(nodePathInfo)]) !== null && _a !== void 0 ? _a : false;
123
80
  },
124
81
  }), [expandedTracks]);
125
82
  const setterValue = (0, react_1.useMemo)(() => ({
@@ -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) }));
@@ -38,8 +38,8 @@ const icon = {
38
38
  const InspectorLocationCopy = ({ children, location, name, openInEditorLocation }) => {
39
39
  const [hovered, setHovered] = (0, react_1.useState)(false);
40
40
  const [focusedWithin, setFocusedWithin] = (0, react_1.useState)(false);
41
- const textToCopy = (0, react_1.useMemo)(() => {
42
- return (0, format_file_location_1.formatLocationForAgents)({
41
+ const contextForAgents = (0, react_1.useMemo)(() => {
42
+ return (0, format_file_location_1.formatContextForAgents)({
43
43
  location,
44
44
  name,
45
45
  root: window.remotion_cwd,
@@ -50,20 +50,20 @@ const InspectorLocationCopy = ({ children, location, name, openInEditorLocation
50
50
  }, []);
51
51
  const onCopy = (0, react_1.useCallback)((event) => {
52
52
  event.stopPropagation();
53
- if (!textToCopy) {
53
+ if (!contextForAgents) {
54
54
  return;
55
55
  }
56
- navigator.clipboard.writeText(textToCopy).catch((err) => {
56
+ navigator.clipboard.writeText(contextForAgents).catch((err) => {
57
57
  (0, NotificationCenter_1.showNotification)(`Could not copy to clipboard: ${err.message}`, 2000);
58
58
  });
59
- }, [textToCopy]);
59
+ }, [contextForAgents]);
60
60
  const showAction = hovered || focusedWithin;
61
- return (jsx_runtime_1.jsxs("div", { style: row, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), onFocus: () => setFocusedWithin(true), onBlur: () => setFocusedWithin(false), children: [
62
- jsx_runtime_1.jsx("div", { style: content, children: children }), textToCopy || openInEditorLocation ? (jsx_runtime_1.jsxs("div", { style: {
61
+ return (jsx_runtime_1.jsxs("div", { "aria-label": "Inspector source location", role: "group", style: row, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), onFocus: () => setFocusedWithin(true), onBlur: () => setFocusedWithin(false), children: [
62
+ jsx_runtime_1.jsx("div", { style: content, children: children }), contextForAgents || openInEditorLocation ? (jsx_runtime_1.jsxs("div", { style: {
63
63
  ...action,
64
64
  opacity: showAction ? 1 : 0,
65
65
  pointerEvents: showAction ? 'auto' : 'none',
66
66
  }, children: [
67
- jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: openInEditorLocation }), textToCopy ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopy, renderAction: renderCopyAction, title: "Copy location 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;
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
2
  import type { OriginalPosition } from '../error-overlay/react-overlay/utils/get-source-map';
3
3
  export declare const InspectorOpenInEditor: React.FC<{
4
+ readonly contextForAgents?: string | null;
4
5
  readonly location: OriginalPosition | null;
5
6
  readonly label?: React.ReactNode;
7
+ readonly locationType: 'file' | 'folder' | null;
6
8
  }>;
@@ -10,8 +10,10 @@ const caret_1 = require("../icons/caret");
10
10
  const editor_1 = require("../icons/editor");
11
11
  const modals_1 = require("../state/modals");
12
12
  const z_index_1 = require("../state/z-index");
13
+ const get_open_in_menu_items_1 = require("./get-open-in-menu-items");
13
14
  const InlineDropdown_1 = require("./InlineDropdown");
14
15
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
16
+ const actions_1 = require("./RenderQueue/actions");
15
17
  const use_default_editor_info_1 = require("./use-default-editor-info");
16
18
  const splitButton = {
17
19
  alignItems: 'center',
@@ -38,23 +40,18 @@ const mainButtonBase = {
38
40
  padding: '0 6px',
39
41
  whiteSpace: 'nowrap',
40
42
  };
41
- const menuLabel = {
42
- color: 'inherit',
43
- fontFamily: 'sans-serif',
44
- fontSize: 13,
45
- lineHeight: '16px',
46
- };
47
43
  const editorButtonIconSize = 18;
48
- const editorMenuIconSize = 18;
49
- const InspectorOpenInEditor = ({ label, location }) => {
44
+ const InspectorOpenInEditor = ({ contextForAgents = null, label, location, locationType }) => {
50
45
  var _a;
51
46
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
52
47
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
53
48
  const { tabIndex } = (0, z_index_1.useZIndex)();
54
49
  const [hovered, setHovered] = (0, react_1.useState)(false);
55
50
  const [dropdownOpened, setDropdownOpened] = (0, react_1.useState)(false);
51
+ const ignorePointerEnter = (0, react_1.useRef)(false);
56
52
  const editorPickerAvailable = (0, use_default_editor_info_1.canUseEditorPicker)(previewServerState.type === 'connected');
57
53
  const editorInfo = (0, use_default_editor_info_1.useDefaultEditorInfo)(editorPickerAvailable);
54
+ const codingAgentInfo = (0, use_default_editor_info_1.useDefaultCodingAgentInfo)(editorPickerAvailable);
58
55
  const openWithEditor = (0, react_1.useCallback)(async (editorId) => {
59
56
  if (!location) {
60
57
  return;
@@ -67,12 +64,30 @@ const InspectorOpenInEditor = ({ label, location }) => {
67
64
  }
68
65
  }, [location]);
69
66
  const preferredEditorId = (0, use_default_editor_info_1.getPreferredEditorId)(editorInfo);
67
+ const openWithCodingAgent = (0, react_1.useCallback)(async (codingAgentId, codingAgentName) => {
68
+ try {
69
+ const response = await (0, open_in_editor_1.openInCodingAgent)(codingAgentId, codingAgentId === 'copilot' ? null : contextForAgents);
70
+ if (!response.success) {
71
+ (0, NotificationCenter_1.showNotification)(`Could not open ${codingAgentName}`, 2000);
72
+ }
73
+ }
74
+ catch (err) {
75
+ (0, NotificationCenter_1.showNotification)(err.message, 2000);
76
+ }
77
+ }, [contextForAgents]);
70
78
  const editorName = (_a = window.remotion_editorName) !== null && _a !== void 0 ? _a : 'default editor';
71
79
  const canOpenDefault = location !== null && window.remotion_editorName !== null;
72
80
  const onOpenDefault = (0, react_1.useCallback)((event) => {
73
81
  event.stopPropagation();
74
82
  openWithEditor(null).catch(() => undefined);
75
83
  }, [openWithEditor]);
84
+ const onDropdownOpenChange = (0, react_1.useCallback)((open) => {
85
+ setDropdownOpened(open);
86
+ if (!open) {
87
+ ignorePointerEnter.current = true;
88
+ setHovered(false);
89
+ }
90
+ }, []);
76
91
  const mainHovered = hovered && !dropdownOpened;
77
92
  const mainButtonStyle = (0, react_1.useMemo)(() => {
78
93
  return {
@@ -101,49 +116,58 @@ const InspectorOpenInEditor = ({ label, location }) => {
101
116
  return jsx_runtime_1.jsx(caret_1.CaretDown, { color: color, small: true });
102
117
  }, []);
103
118
  const menuItems = (0, react_1.useMemo)(() => {
104
- var _a;
105
- const alternateEditors = ((_a = editorInfo === null || editorInfo === void 0 ? void 0 : editorInfo.installedEditors) !== null && _a !== void 0 ? _a : [])
106
- .filter((editor) => editor.id !== preferredEditorId)
107
- .map((editor) => ({
108
- id: `open-in-${editor.id}`,
109
- keyHint: null,
110
- label: jsx_runtime_1.jsx("span", { style: menuLabel, children: editor.name }),
111
- leftItem: jsx_runtime_1.jsx(editor_1.EditorIcon, { editorId: editor.id, size: editorMenuIconSize }),
112
- onClick: () => {
113
- openWithEditor(editor.id).catch(() => undefined);
119
+ return (0, get_open_in_menu_items_1.getOpenInMenuItems)({
120
+ codingAgentInfo,
121
+ editorDisabled: location === null,
122
+ editorInfo,
123
+ excludeCodingAgentId: null,
124
+ excludeEditorId: preferredEditorId,
125
+ fileManagerDisabled: !(location === null || location === void 0 ? void 0 : location.source),
126
+ folder: locationType === 'folder',
127
+ onConfigureApps: () => {
128
+ var _a;
129
+ var _b;
130
+ setSelectedModal({
131
+ type: 'settings',
132
+ initialTab: 'apps',
133
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
134
+ });
135
+ },
136
+ onOpenInCodingAgent: (codingAgentId, codingAgentName) => {
137
+ openWithCodingAgent(codingAgentId, codingAgentName).catch(() => undefined);
138
+ },
139
+ onOpenInEditor: (editorId) => {
140
+ openWithEditor(editorId).catch(() => undefined);
141
+ },
142
+ onOpenInFileExplorer: () => {
143
+ if (!(location === null || location === void 0 ? void 0 : location.source)) {
144
+ return;
145
+ }
146
+ (0, actions_1.openInFileExplorer)({ directory: location.source }).catch((err) => {
147
+ (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
148
+ });
114
149
  },
115
- quickSwitcherLabel: null,
116
- subMenu: null,
117
- type: 'item',
118
- value: editor.id,
119
- }));
120
- const settingsItems = [
121
- ...(alternateEditors.length > 0
122
- ? [{ type: 'divider', id: 'editor-settings-divider' }]
123
- : []),
124
- {
125
- id: 'set-default-editor',
126
- keyHint: null,
127
- label: jsx_runtime_1.jsx("span", { style: menuLabel, children: "Set default editor..." }),
128
- leftItem: null,
129
- onClick: () => {
130
- var _a;
131
- var _b;
132
- setSelectedModal({
133
- type: 'settings',
134
- initialTab: 'apps',
135
- initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
136
- });
137
- },
138
- quickSwitcherLabel: null,
139
- subMenu: null,
140
- type: 'item',
141
- value: 'set-default-editor',
150
+ onOpenInTerminal: (terminalId) => {
151
+ if (!(location === null || location === void 0 ? void 0 : location.source) || locationType !== 'folder') {
152
+ return;
153
+ }
154
+ (0, open_in_editor_1.openInTerminal)(terminalId, location.source)
155
+ .then((response) => {
156
+ if (!response.success) {
157
+ (0, NotificationCenter_1.showNotification)('Could not open terminal', 2000);
158
+ }
159
+ })
160
+ .catch((err) => {
161
+ (0, NotificationCenter_1.showNotification)(`Could not open terminal: ${err.message}`, 2000);
162
+ });
142
163
  },
143
- ];
144
- return [...alternateEditors, ...settingsItems];
164
+ });
145
165
  }, [
146
- editorInfo === null || editorInfo === void 0 ? void 0 : editorInfo.installedEditors,
166
+ codingAgentInfo,
167
+ editorInfo,
168
+ location,
169
+ locationType,
170
+ openWithCodingAgent,
147
171
  openWithEditor,
148
172
  preferredEditorId,
149
173
  setSelectedModal,
@@ -151,9 +175,16 @@ const InspectorOpenInEditor = ({ label, location }) => {
151
175
  if (!editorPickerAvailable) {
152
176
  return null;
153
177
  }
154
- return (jsx_runtime_1.jsxs("div", { style: splitButton, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), children: [
178
+ return (jsx_runtime_1.jsxs("div", { style: splitButton, onPointerEnter: () => {
179
+ if (!ignorePointerEnter.current) {
180
+ setHovered(true);
181
+ }
182
+ }, onPointerLeave: () => {
183
+ ignorePointerEnter.current = false;
184
+ setHovered(false);
185
+ }, children: [
155
186
  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 })
156
- ] }), jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { onOpenChange: setDropdownOpened, renderAction: renderDropdownAction, style: dropdownStyle, title: "Open in another editor", unhoveredColor: dropdownForegroundColor, values: menuItems, variant: "compact" })
187
+ ] }), jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { onOpenChange: onDropdownOpenChange, renderAction: renderDropdownAction, style: dropdownStyle, title: "Open in another app", unhoveredColor: dropdownForegroundColor, values: menuItems, variant: "compact" })
157
188
  ] }));
158
189
  };
159
190
  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',
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CompositionInspector = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const client_id_1 = require("../../helpers/client-id");
6
7
  const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
7
8
  const browse_elements_1 = require("../../icons/browse-elements");
8
9
  const frame_1 = require("../../icons/frame");
@@ -123,9 +124,10 @@ const CompositionVisualControlsSection = ({ readOnlyStudio }) => {
123
124
  ] }));
124
125
  };
125
126
  const CompositionInspector = ({ composition, currentDefaultProps, readOnlyStudio, setDefaultProps }) => {
127
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
126
128
  return (jsx_runtime_1.jsxs("div", { style: styles_1.scrollableContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
127
129
  jsx_runtime_1.jsxs("div", { style: styles_1.inspectorOverviewSection, children: [
128
- jsx_runtime_1.jsx(CompositionInspectorHeader_1.CompositionInspectorHeader, {}), jsx_runtime_1.jsx(common_1.InspectorSectionDivider, {}), jsx_runtime_1.jsx(CompositionMetadata_1.CompositionMetadata, { compositionId: composition.id, disabled: readOnlyStudio, stack: composition.stack })
130
+ jsx_runtime_1.jsx(CompositionInspectorHeader_1.CompositionInspectorHeader, {}), jsx_runtime_1.jsx(common_1.InspectorSectionDivider, {}), jsx_runtime_1.jsx(CompositionMetadata_1.CompositionMetadata, { compositionId: composition.id, disabled: readOnlyStudio || previewServerState.type !== 'connected', stack: composition.stack })
129
131
  ] }), jsx_runtime_1.jsx(CompositionDefaultPropsSection, { composition: composition, currentDefaultProps: currentDefaultProps, readOnlyStudio: readOnlyStudio, setDefaultProps: setDefaultProps }), jsx_runtime_1.jsx(CompositionVisualControlsSection, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(CompositionActions, { readOnlyStudio: readOnlyStudio })
130
132
  ] }));
131
133
  };
@@ -11,6 +11,9 @@ export declare const SequenceInspectorHeader: React.FC<{
11
11
  readonly sourceLocation: SequenceInspectorSourceLocation;
12
12
  readonly track: TimelineTrackData;
13
13
  }>;
14
+ export declare const SequenceInspectorDuplicationSection: React.FC<{
15
+ readonly track: TimelineTrackData;
16
+ }>;
14
17
  export declare const SequenceInspectorSections: React.FC<{
15
18
  readonly track: TimelineTrackData;
16
19
  }>;