@remotion/studio 4.0.503 → 4.0.505

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 (181) hide show
  1. package/dist/api/install-package.d.ts +2 -1
  2. package/dist/api/install-package.js +6 -2
  3. package/dist/components/AssetSelectorItem.js +4 -16
  4. package/dist/components/AudioWaveform.d.ts +1 -1
  5. package/dist/components/AudioWaveform.js +36 -3
  6. package/dist/components/Canvas.js +12 -5
  7. package/dist/components/CheckboardToggle.js +3 -1
  8. package/dist/components/CompositionContextButton.d.ts +1 -1
  9. package/dist/components/CompositionContextButton.js +2 -2
  10. package/dist/components/CompositionSelector.js +2 -2
  11. package/dist/components/CompositionSelectorItem.js +6 -7
  12. package/dist/components/ContextMenu.d.ts +5 -7
  13. package/dist/components/ContextMenu.js +54 -21
  14. package/dist/components/ControlButton.d.ts +4 -2
  15. package/dist/components/ControlButton.js +6 -20
  16. package/dist/components/EditorContent.js +1 -1
  17. package/dist/components/EditorGuides/Guide.js +2 -2
  18. package/dist/components/EffectPickerModal.js +70 -9
  19. package/dist/components/FullscreenToggle.js +1 -2
  20. package/dist/components/InitialCompositionLoader.js +1 -14
  21. package/dist/components/InlineAction.d.ts +3 -4
  22. package/dist/components/InlineAction.js +16 -13
  23. package/dist/components/InlineDropdown.d.ts +3 -2
  24. package/dist/components/InlineDropdown.js +16 -5
  25. package/dist/components/InspectorPanel/CompositionMetadata.js +7 -6
  26. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +2 -2
  27. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -3
  28. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  29. package/dist/components/InspectorPanel/common.js +24 -34
  30. package/dist/components/InspectorPanel/styles.js +4 -0
  31. package/dist/components/InspectorSequenceSection.js +1 -1
  32. package/dist/components/LoopToggle.js +1 -1
  33. package/dist/components/Menu/MenuItem.js +16 -12
  34. package/dist/components/MenuBuildIndicator.d.ts +3 -1
  35. package/dist/components/MenuBuildIndicator.js +14 -59
  36. package/dist/components/MenuCompositionName.js +3 -63
  37. package/dist/components/MenuToolbar.js +23 -3
  38. package/dist/components/MobilePanel.d.ts +1 -2
  39. package/dist/components/MobilePanel.js +6 -10
  40. package/dist/components/MuteToggle.js +2 -1
  41. package/dist/components/NewComposition/ComboBox.d.ts +1 -0
  42. package/dist/components/NewComposition/ComboBox.js +2 -2
  43. package/dist/components/NewComposition/InputDragger.d.ts +5 -0
  44. package/dist/components/NewComposition/InputDragger.js +11 -6
  45. package/dist/components/NewComposition/MenuContent.d.ts +1 -1
  46. package/dist/components/NewComposition/menu-typeahead.d.ts +1 -1
  47. package/dist/components/Notifications/NotificationCenter.js +12 -2
  48. package/dist/components/OutlineToggle.js +10 -2
  49. package/dist/components/PlayPause.js +2 -6
  50. package/dist/components/PlaybackRateSelector.js +4 -9
  51. package/dist/components/PreviewToolbar.js +12 -8
  52. package/dist/components/PreviewToolbarOverflowButton.d.ts +0 -1
  53. package/dist/components/PreviewToolbarOverflowButton.js +2 -75
  54. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -2
  55. package/dist/components/RenderButton.d.ts +1 -1
  56. package/dist/components/RenderButton.js +55 -37
  57. package/dist/components/RenderModal/FrameRangeSetting.js +6 -1
  58. package/dist/components/RenderModal/MultiRangeSlider.js +8 -8
  59. package/dist/components/RenderModal/RenderModalEnvironmentVariables.js +1 -9
  60. package/dist/components/RenderModal/RenderModalOutputName.js +11 -2
  61. package/dist/components/RenderModal/ServerRenderModal.js +2 -17
  62. package/dist/components/RenderModal/WebRenderModal.js +3 -17
  63. package/dist/components/RenderModal/layout.js +7 -5
  64. package/dist/components/RenderModal/render-modals.js +18 -15
  65. package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -14
  66. package/dist/components/SelectedOutlineElement.js +13 -22
  67. package/dist/components/SelectedOutlineOverlay.js +5 -1
  68. package/dist/components/SidebarRenderButton.js +1 -15
  69. package/dist/components/SizeSelector.js +4 -9
  70. package/dist/components/SnappingToggle.js +1 -2
  71. package/dist/components/Spinner.d.ts +1 -0
  72. package/dist/components/Spinner.js +2 -2
  73. package/dist/components/Splitter/SplitterContainer.d.ts +1 -0
  74. package/dist/components/Splitter/SplitterContainer.js +4 -1
  75. package/dist/components/Splitter/SplitterContext.d.ts +4 -3
  76. package/dist/components/Splitter/SplitterContext.js +3 -2
  77. package/dist/components/Splitter/SplitterElement.js +6 -1
  78. package/dist/components/Splitter/SplitterHandle.js +1 -0
  79. package/dist/components/Tabs/vertical.d.ts +1 -0
  80. package/dist/components/Tabs/vertical.js +8 -10
  81. package/dist/components/TimeValue.js +26 -8
  82. package/dist/components/Timeline/Timeline.js +5 -5
  83. package/dist/components/Timeline/TimelineClipboardKeybindings.js +3 -6
  84. package/dist/components/Timeline/TimelineDeleteKeybindings.js +5 -7
  85. package/dist/components/Timeline/TimelineDragHandler.js +3 -0
  86. package/dist/components/Timeline/TimelineEffectItem.js +6 -2
  87. package/dist/components/Timeline/TimelineEffectPropItem.js +6 -3
  88. package/dist/components/Timeline/TimelineExpandedKeyframeRow.d.ts +6 -6
  89. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +34 -2
  90. package/dist/components/Timeline/TimelineHeightContainer.d.ts +1 -0
  91. package/dist/components/Timeline/TimelineHeightContainer.js +2 -2
  92. package/dist/components/Timeline/TimelineInOutDragHandler.js +3 -3
  93. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +5 -3
  94. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +32 -30
  95. package/dist/components/Timeline/TimelineList.d.ts +1 -0
  96. package/dist/components/Timeline/TimelineList.js +2 -3
  97. package/dist/components/Timeline/TimelineScaleField.js +1 -1
  98. package/dist/components/Timeline/TimelineSelection.js +2 -3
  99. package/dist/components/Timeline/TimelineSequence.js +34 -28
  100. package/dist/components/Timeline/TimelineSequenceItem.d.ts +3 -3
  101. package/dist/components/Timeline/TimelineSequenceItem.js +34 -23
  102. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +10 -2
  103. package/dist/components/Timeline/TimelineSequencePropItem.js +64 -12
  104. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +2 -2
  105. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +38 -5
  106. package/dist/components/Timeline/TimelineTimeIndicators.js +36 -3
  107. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -1
  108. package/dist/components/Timeline/TimelineVideoInfo.js +36 -3
  109. package/dist/components/Timeline/TimelineZoomControls.d.ts +3 -1
  110. package/dist/components/Timeline/TimelineZoomControls.js +59 -20
  111. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +2 -3
  112. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +1 -1
  113. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -18
  114. package/dist/components/Timeline/use-timeline-asset-drop.js +3 -3
  115. package/dist/components/Timeline/use-timeline-height.d.ts +2 -1
  116. package/dist/components/Timeline/use-timeline-height.js +3 -2
  117. package/dist/components/TimelineCombobox.d.ts +11 -0
  118. package/dist/components/TimelineCombobox.js +181 -0
  119. package/dist/components/TimelineInOutToggle.js +3 -3
  120. package/dist/components/TopPanel.js +8 -8
  121. package/dist/components/UndoRedoButtons.js +6 -5
  122. package/dist/components/UpdateCheck.js +18 -5
  123. package/dist/components/UpdateModal/UpdateModal.js +35 -12
  124. package/dist/components/composition-menu-items.d.ts +2 -4
  125. package/dist/components/composition-menu-items.js +31 -54
  126. package/dist/components/import-assets.d.ts +2 -1
  127. package/dist/components/import-assets.js +1 -1
  128. package/dist/components/selected-outline-types.d.ts +1 -1
  129. package/dist/esm/{chunk-bj1r1hh5.js → chunk-7pgk8h5m.js} +9174 -8486
  130. package/dist/esm/internals.mjs +9174 -8486
  131. package/dist/esm/previewEntry.mjs +8991 -8303
  132. package/dist/esm/renderEntry.mjs +1 -1
  133. package/dist/helpers/hoverable.d.ts +11 -0
  134. package/dist/helpers/hoverable.js +70 -0
  135. package/dist/helpers/inject-css.js +43 -23
  136. package/dist/helpers/install-required-package.d.ts +3 -2
  137. package/dist/helpers/install-required-package.js +20 -15
  138. package/dist/helpers/use-is-fullscreen.d.ts +1 -0
  139. package/dist/helpers/use-is-fullscreen.js +25 -0
  140. package/dist/helpers/use-menu-structure.js +88 -59
  141. package/dist/icons/audio.d.ts +1 -1
  142. package/dist/icons/audio.js +1 -1
  143. package/dist/icons/canvas-zoom.d.ts +10 -0
  144. package/dist/icons/canvas-zoom.js +21 -0
  145. package/dist/icons/caret.js +1 -1
  146. package/dist/icons/certificate.d.ts +1 -1
  147. package/dist/icons/certificate.js +1 -1
  148. package/dist/icons/data.d.ts +1 -1
  149. package/dist/icons/data.js +2 -2
  150. package/dist/icons/effects.d.ts +5 -0
  151. package/dist/icons/effects.js +8 -0
  152. package/dist/icons/ellipsis.js +1 -1
  153. package/dist/icons/external-link.d.ts +5 -0
  154. package/dist/icons/external-link.js +10 -0
  155. package/dist/icons/fullscreen.js +1 -1
  156. package/dist/icons/gear.d.ts +1 -1
  157. package/dist/icons/gear.js +1 -1
  158. package/dist/icons/gif.d.ts +1 -1
  159. package/dist/icons/gif.js +1 -1
  160. package/dist/icons/input-props.d.ts +2 -0
  161. package/dist/icons/input-props.js +9 -0
  162. package/dist/icons/jump-to-start.js +2 -2
  163. package/dist/icons/magnet.d.ts +3 -1
  164. package/dist/icons/magnet.js +2 -2
  165. package/dist/icons/media-volume.d.ts +6 -2
  166. package/dist/icons/media-volume.js +8 -6
  167. package/dist/icons/minus.d.ts +3 -1
  168. package/dist/icons/minus.js +2 -2
  169. package/dist/icons/pause.js +1 -1
  170. package/dist/icons/play.js +1 -1
  171. package/dist/icons/playback-rate.d.ts +5 -0
  172. package/dist/icons/playback-rate.js +31 -0
  173. package/dist/icons/plus.js +1 -1
  174. package/dist/icons/redo.js +2 -2
  175. package/dist/icons/search.d.ts +5 -0
  176. package/dist/icons/search.js +10 -0
  177. package/dist/icons/step-back.js +2 -2
  178. package/dist/icons/step-forward.js +2 -2
  179. package/dist/icons/timelineInOutPointer.js +2 -2
  180. package/dist/icons/undo.js +2 -2
  181. package/package.json +12 -12
@@ -1,2 +1,3 @@
1
+ import type { ElementDependency } from '@remotion/studio-protocol';
1
2
  import type { InstallPackageResponse } from '@remotion/studio-shared';
2
- export declare const installPackages: (packageNames: string[]) => Promise<InstallPackageResponse>;
3
+ export declare const installPackages: (dependencies: (string | ElementDependency)[]) => Promise<InstallPackageResponse>;
@@ -3,13 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.installPackages = void 0;
4
4
  const remotion_1 = require("remotion");
5
5
  const call_api_1 = require("../components/call-api");
6
- const installPackages = (packageNames) => {
6
+ const installPackages = (dependencies) => {
7
7
  if (!(0, remotion_1.getRemotionEnvironment)().isStudio) {
8
8
  throw new Error('installPackages() is only available in the Studio');
9
9
  }
10
10
  if (window.remotion_isReadOnlyStudio) {
11
11
  throw new Error('installPackages() is not available in Read-Only Studio');
12
12
  }
13
- return (0, call_api_1.callApi)('/api/install-package', { packageNames });
13
+ return (0, call_api_1.callApi)('/api/install-package', {
14
+ dependencies: dependencies.map((dependency) => typeof dependency === 'string'
15
+ ? { name: dependency, version: null }
16
+ : dependency),
17
+ });
14
18
  };
15
19
  exports.installPackages = installPackages;
@@ -46,7 +46,6 @@ const colors_1 = require("../helpers/colors");
46
46
  const copy_text_1 = require("../helpers/copy-text");
47
47
  const get_file_manager_name_1 = require("../helpers/get-file-manager-name");
48
48
  const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
49
- const mobile_layout_1 = require("../helpers/mobile-layout");
50
49
  const sidebar_scroll_into_view_1 = require("../helpers/sidebar-scroll-into-view");
51
50
  const url_state_1 = require("../helpers/url-state");
52
51
  const use_asset_drag_events_1 = __importStar(require("../helpers/use-asset-drag-events"));
@@ -55,7 +54,6 @@ const use_media_metadata_1 = require("../helpers/use-media-metadata");
55
54
  const clipboard_1 = require("../icons/clipboard");
56
55
  const folder_1 = require("../icons/folder");
57
56
  const modals_1 = require("../state/modals");
58
- const sidebar_1 = require("../state/sidebar");
59
57
  const AssetFileIcon_1 = require("./AssetFileIcon");
60
58
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
61
59
  const ContextMenu_1 = require("./ContextMenu");
@@ -260,10 +258,8 @@ const AssetFolderTree = ({ item, level, name, parentFolder, toggleFolder, tabInd
260
258
  exports.AssetFolderTree = AssetFolderTree;
261
259
  const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio }) => {
262
260
  const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
263
- const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
264
261
  const [hovered, setHovered] = (0, react_1.useState)(false);
265
262
  const [isDragging, setIsDragging] = (0, react_1.useState)(false);
266
- const { setSidebarCollapsedState } = (0, react_1.useContext)(sidebar_1.SidebarContext);
267
263
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
268
264
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
269
265
  const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
@@ -303,15 +299,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
303
299
  (0, sidebar_scroll_into_view_1.markAssetSidebarScrollFromRowClick)(relativePath);
304
300
  setCanvasContent({ type: 'asset', asset: relativePath });
305
301
  (0, url_state_1.pushUrl)(`/assets/${relativePath}`);
306
- if (isMobileLayout) {
307
- setSidebarCollapsedState({ left: 'collapsed', right: 'collapsed' });
308
- }
309
- }, [
310
- isMobileLayout,
311
- relativePath,
312
- setCanvasContent,
313
- setSidebarCollapsedState,
314
- ]);
302
+ }, [relativePath, setCanvasContent]);
315
303
  const onDragStart = (0, react_1.useCallback)((e) => {
316
304
  var _a, _b, _c, _d;
317
305
  if (!canDragAsset) {
@@ -436,7 +424,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
436
424
  relativePath,
437
425
  });
438
426
  }, [relativePath, setSelectedModal]);
439
- const contextMenu = (0, react_1.useMemo)(() => {
427
+ const getContextMenuItems = (0, react_1.useCallback)(() => {
440
428
  return (0, exports.getAssetContextMenuItems)({
441
429
  relativePath,
442
430
  fileManagerName,
@@ -467,8 +455,8 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
467
455
  e.stopPropagation();
468
456
  copyStaticFilePath();
469
457
  }, [copyStaticFilePath]);
470
- return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenu, onOpen: null, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("div", { ref: rowRef, style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onClick: onClick, draggable: canDragAsset, onDragStart: onDragStart, onDragEnd: onDragEnd, tabIndex: tabIndex, title: item.name, children: [
471
- jsx_runtime_1.jsx(AssetFileIcon_1.AssetFileIcon, { fileType: previewFileType, style: iconStyle, color: colors_1.LIGHT_TEXT }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.name }), hovered && !isDragging ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
458
+ return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("div", { ref: rowRef, style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onClick: onClick, draggable: canDragAsset, onDragStart: onDragStart, onDragEnd: onDragEnd, tabIndex: tabIndex, title: item.name, children: [
459
+ jsx_runtime_1.jsx(AssetFileIcon_1.AssetFileIcon, { fileType: previewFileType, style: iconStyle, color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.name }), hovered && !isDragging ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
472
460
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, title: "Copy staticFile() path", renderAction: renderCopyAction, onClick: copyToClipboard }), fileExplorerDisabled ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
473
461
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, title: `Show in ${fileManagerName}`, renderAction: renderFileExplorerAction, onClick: revealInExplorer })
474
462
  ] }))] })) : null] }) }) }));
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { LoopDisplay } from 'remotion';
3
- export declare const AudioWaveform: React.FC<{
3
+ export declare const AudioWaveform: React.NamedExoticComponent<{
4
4
  readonly src: string;
5
5
  readonly height: number;
6
6
  readonly visualizationWidth: number;
@@ -1,9 +1,42 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.AudioWaveform = void 0;
4
37
  const jsx_runtime_1 = require("react/jsx-runtime");
5
38
  const timeline_utils_1 = require("@remotion/timeline-utils");
6
- const react_1 = require("react");
39
+ const react_1 = __importStar(require("react"));
7
40
  const remotion_1 = require("remotion");
8
41
  const colors_1 = require("../helpers/colors");
9
42
  const timeline_layout_1 = require("../helpers/timeline-layout");
@@ -76,7 +109,7 @@ const drawLoopedWaveform = ({ canvas, peaks, volume, visualizationWidth, loopWid
76
109
  ctx.fillStyle = pattern;
77
110
  ctx.fillRect(0, 0, w, h);
78
111
  };
79
- const AudioWaveform = ({ src, height, startFrom, durationInFrames, visualizationWidth, volume, doesVolumeChange, playbackRate, loopDisplay, }) => {
112
+ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualizationWidth, volume, doesVolumeChange, playbackRate, loopDisplay, }) => {
80
113
  const [peaks, setPeaks] = (0, react_1.useState)(null);
81
114
  const [error, setError] = (0, react_1.useState)(null);
82
115
  const [waveformCanvasKey, setWaveformCanvasKey] = (0, react_1.useState)(0);
@@ -300,4 +333,4 @@ const AudioWaveform = ({ src, height, startFrom, durationInFrames, visualization
300
333
  return (jsx_runtime_1.jsxs("div", { style: getContainerStyle(height), children: [
301
334
  jsx_runtime_1.jsx("canvas", { ref: waveformCanvas, style: waveformCanvasStyle }, waveformCanvasKey), shouldRenderVolumeOverlay ? (jsx_runtime_1.jsx("canvas", { ref: volumeCanvas, style: volumeCanvasStyle })) : null] }));
302
335
  };
303
- exports.AudioWaveform = AudioWaveform;
336
+ exports.AudioWaveform = react_1.default.memo(AudioWaveformInner);
@@ -646,11 +646,18 @@ const Canvas = ({ canvasContent, size }) => {
646
646
  if (canceled) {
647
647
  return;
648
648
  }
649
- const declaredDependencies = Array.from(new Set(activeElementInstallRequest.element.dependencies));
650
- const missingPackages = (0, install_required_package_1.getMissingPackages)(declaredDependencies);
651
- const ignoredDependencies = declaredDependencies.filter((packageName) => elementInstallDependencyIgnoreList.includes(packageName) &&
652
- !missingPackages.includes(packageName));
653
- const dependenciesToReview = declaredDependencies.filter((packageName) => !ignoredDependencies.includes(packageName));
649
+ const declaredDependencies = Array.from(new Map(activeElementInstallRequest.element.dependencies.map((dependency) => [
650
+ dependency.name,
651
+ dependency,
652
+ ])).values());
653
+ const missingPackages = (0, install_required_package_1.getMissingPackages)(declaredDependencies).map((dependency) => dependency.name);
654
+ const ignoredDependencies = declaredDependencies.filter((dependency) => elementInstallDependencyIgnoreList.includes(dependency.name) &&
655
+ !missingPackages.includes(dependency.name));
656
+ const dependenciesToReview = declaredDependencies
657
+ .filter((dependency) => !ignoredDependencies.includes(dependency))
658
+ .map((dependency) => dependency.version === null
659
+ ? dependency.name
660
+ : `${dependency.name}@${dependency.version}`);
654
661
  const sourceLabel = activeElementInstallRequest.source.type === 'studio-protocol'
655
662
  ? activeElementInstallRequest.source.origin
656
663
  : 'Unverified drag-and-drop payload';
@@ -21,6 +21,8 @@ const CheckboardToggle = () => {
21
21
  return !c;
22
22
  });
23
23
  }, [setCheckerboard]);
24
- return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, onClick: onClick, children: jsx_runtime_1.jsx("svg", { "aria-hidden": "true", focusable: "false", "data-prefix": "fas", "data-icon": "game-board-alt", className: "svg-inline--fa fa-game-board-alt fa-w-16", role: "img", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", style: { width: 16, height: 16 }, children: jsx_runtime_1.jsx("path", { fill: checkerboard ? colors_1.BLUE : colors_1.WHITE, d: "M480 0H32A32 32 0 0 0 0 32v448a32 32 0 0 0 32 32h448a32 32 0 0 0 32-32V32a32 32 0 0 0-32-32zm-32 256H256v192H64V256h192V64h192z" }) }) }));
24
+ return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, onClick: onClick, children: (color) => (jsx_runtime_1.jsxs("svg", { "aria-hidden": "true", focusable: "false", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", style: { width: 18, height: 18 }, fill: "none", children: [
25
+ jsx_runtime_1.jsx("path", { fill: checkerboard ? colors_1.BLUE : color, d: "M256 48h184c13.3 0 24 10.7 24 24v184H256V48zM48 256h208v208H72c-13.3 0-24-10.7-24-24V256z" }), jsx_runtime_1.jsx("rect", { x: "48", y: "48", width: "416", height: "416", rx: "24", stroke: checkerboard ? colors_1.BLUE : color, strokeWidth: "32" }), jsx_runtime_1.jsx("path", { d: "M256 48v416M48 256h416", stroke: checkerboard ? colors_1.BLUE : color, strokeWidth: "32" })
26
+ ] })) }));
25
27
  };
26
28
  exports.CheckboardToggle = CheckboardToggle;
@@ -2,5 +2,5 @@ import React from 'react';
2
2
  import type { ComboboxValue } from './NewComposition/ComboBox';
3
3
  export declare const CompositionContextButton: React.FC<{
4
4
  readonly visible: boolean;
5
- readonly values: ComboboxValue[];
5
+ readonly getItems: () => ComboboxValue[];
6
6
  }>;
@@ -6,7 +6,7 @@ const react_1 = require("react");
6
6
  const client_id_1 = require("../helpers/client-id");
7
7
  const ellipsis_1 = require("../icons/ellipsis");
8
8
  const InlineDropdown_1 = require("./InlineDropdown");
9
- const CompositionContextButton = ({ visible, values }) => {
9
+ const CompositionContextButton = ({ visible, getItems }) => {
10
10
  const iconStyle = (0, react_1.useMemo)(() => {
11
11
  return {
12
12
  style: {
@@ -22,6 +22,6 @@ const CompositionContextButton = ({ visible, values }) => {
22
22
  if (!visible || connectionStatus !== 'connected') {
23
23
  return null;
24
24
  }
25
- return (jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { renderAction: renderAction, values: values, variant: null }));
25
+ return (jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { renderAction: renderAction, getItems: getItems, variant: null }));
26
26
  };
27
27
  exports.CompositionContextButton = CompositionContextButton;
@@ -90,7 +90,7 @@ const CompositionSelector = () => {
90
90
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
91
91
  const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
92
92
  .previewServerState.type;
93
- const rootContextMenuItems = (0, react_1.useMemo)(() => {
93
+ const getRootContextMenuItems = (0, react_1.useCallback)(() => {
94
94
  return (0, root_composition_menu_items_1.getRootCompositionMenuItems)({
95
95
  connectionStatus,
96
96
  readOnlyStudio: window.remotion_isReadOnlyStudio,
@@ -234,7 +234,7 @@ const CompositionSelector = () => {
234
234
  }
235
235
  }, [compositions, stopCompositionListAutoScroll]);
236
236
  return (jsx_runtime_1.jsxs("div", { style: container, children: [
237
- jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: listRef, values: rootContextMenuItems, onOpen: null }), jsx_runtime_1.jsx(ExplorerQuickSwitcherTrigger_1.ExplorerQuickSwitcherTrigger, { mode: "compositions", showShortcut: true, tabIndex: tabIndex }), jsx_runtime_1.jsx("div", { ref: listRef, className: "__remotion-vertical-scrollbar", style: list, onDragOverCapture: onCompositionListDragOverCapture, onDragEndCapture: stopCompositionListAutoScroll, onDragOver: onRootDragOver, onDragLeave: onRootDragLeave, onDropCapture: stopCompositionListAutoScroll, onDrop: onRootDrop, children: items.map((c) => {
237
+ jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: listRef, getItems: getRootContextMenuItems }), jsx_runtime_1.jsx(ExplorerQuickSwitcherTrigger_1.ExplorerQuickSwitcherTrigger, { mode: "compositions", showShortcut: true, tabIndex: tabIndex }), jsx_runtime_1.jsx("div", { ref: listRef, className: "__remotion-vertical-scrollbar", style: list, onDragOverCapture: onCompositionListDragOverCapture, onDragEndCapture: stopCompositionListAutoScroll, onDragOver: onRootDragOver, onDragLeave: onRootDragLeave, onDropCapture: stopCompositionListAutoScroll, onDrop: onRootDrop, children: items.map((c) => {
238
238
  return (jsx_runtime_1.jsx(CompositionSelectorItem_1.CompositionSelectorItem, { level: 0, currentComposition: canvasContent && canvasContent.type === 'composition'
239
239
  ? canvasContent.compositionId
240
240
  : null, selectComposition: selectComposition, toggleFolder: toggleFolder, clearRootDragHover: clearRootDragHover, tabIndex: tabIndex, item: c }, c.key + c.type));
@@ -23,7 +23,7 @@ const actions_1 = require("./RenderQueue/actions");
23
23
  const SidebarRenderButton_1 = require("./SidebarRenderButton");
24
24
  const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
25
25
  const itemStyle = {
26
- paddingRight: 10,
26
+ paddingRight: 2,
27
27
  paddingTop: 5,
28
28
  paddingBottom: 5,
29
29
  fontSize: 13,
@@ -33,11 +33,10 @@ const itemStyle = {
33
33
  alignItems: 'center',
34
34
  marginBottom: 1,
35
35
  marginLeft: 4,
36
- marginRight: 4,
37
36
  appearance: 'none',
38
37
  border: 'none',
39
38
  borderRadius: 4,
40
- width: 'calc(100% - 8px)',
39
+ width: 'calc(100% - 4px)',
41
40
  textAlign: 'left',
42
41
  backgroundColor: colors_1.BACKGROUND,
43
42
  height: layout_1.COMPACT_CONTROL_ROW_HEIGHT,
@@ -121,7 +120,7 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
121
120
  const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
122
121
  .previewServerState.type;
123
122
  const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(item.type === 'composition' ? item.composition.stack : item.folder.stack);
124
- const contextMenu = (0, react_1.useMemo)(() => {
123
+ const getContextMenuItems = (0, react_1.useCallback)(() => {
125
124
  if (item.type === 'composition') {
126
125
  return (0, composition_menu_items_1.getCompositionContextMenuItems)({
127
126
  closeMenu: noop_1.noop,
@@ -242,13 +241,13 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
242
241
  }, [clearRootDragHover, item, toggleFolder]);
243
242
  if (item.type === 'folder') {
244
243
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
245
- jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenu, onOpen: null, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("div", { style: style, className: "__remotion-composition-selector-item", onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, onKeyDown: onKeyDown, onDragOver: onFolderDragOver, onDragLeave: onFolderDragLeave, onDrop: onFolderDrop, title: item.folderName, role: "button", children: [item.expanded ? (jsx_runtime_1.jsx(folder_1.ExpandedFolderIcon, { style: iconStyle, color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT })) : (jsx_runtime_1.jsx(folder_1.CollapsedFolderIcon, { color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.folderName }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(CompositionContextButton_1.CompositionContextButton, { values: contextMenu, visible: hovered })
244
+ jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("div", { style: style, className: "__remotion-composition-selector-item", onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, onKeyDown: onKeyDown, onDragOver: onFolderDragOver, onDragLeave: onFolderDragLeave, onDrop: onFolderDrop, title: item.folderName, role: "button", children: [item.expanded ? (jsx_runtime_1.jsx(folder_1.ExpandedFolderIcon, { style: iconStyle, color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT })) : (jsx_runtime_1.jsx(folder_1.CollapsedFolderIcon, { color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.folderName }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(CompositionContextButton_1.CompositionContextButton, { getItems: getContextMenuItems, visible: hovered })
246
245
  ] }) }) }), item.expanded ? (jsx_runtime_1.jsx("div", { onDragOver: onFolderChildListDragOver, onDrop: onFolderDrop, children: item.items.map((childItem) => {
247
246
  return (jsx_runtime_1.jsx(exports.CompositionSelectorItem, { currentComposition: currentComposition, selectComposition: selectComposition, item: childItem, tabIndex: tabIndex, level: level + 1, toggleFolder: toggleFolder, clearRootDragHover: clearRootDragHover }, childItem.key + childItem.type));
248
247
  }) })) : null] }));
249
248
  }
250
- return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenu, onOpen: null, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("a", { ref: compositionRowRef, style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, onKeyDown: onKeyDown, draggable: !window.remotion_isReadOnlyStudio, onDragStart: onCompositionDragStart, onDragEnd: onCompositionDragEnd, type: "button", title: item.composition.id, className: "__remotion-composition __remotion-composition-selector-item", "data-compname": item.composition.id, children: [
251
- jsx_runtime_1.jsx(CompositionOrStillIcon_1.CompositionOrStillIcon, { composition: item.composition, color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.composition.id }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(CompositionContextButton_1.CompositionContextButton, { values: contextMenu, visible: hovered && !isDragging }), jsx_runtime_1.jsx(SidebarRenderButton_1.SidebarRenderButton, { visible: hovered && !isDragging, composition: item.composition })
249
+ return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: jsx_runtime_1.jsx(layout_1.Row, { align: "center", children: jsx_runtime_1.jsxs("a", { ref: compositionRowRef, style: style, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, tabIndex: tabIndex, onClick: onClick, onKeyDown: onKeyDown, draggable: !window.remotion_isReadOnlyStudio, onDragStart: onCompositionDragStart, onDragEnd: onCompositionDragEnd, type: "button", title: item.composition.id, className: "__remotion-composition __remotion-composition-selector-item", "data-compname": item.composition.id, children: [
250
+ jsx_runtime_1.jsx(CompositionOrStillIcon_1.CompositionOrStillIcon, { composition: item.composition, color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: label, children: item.composition.id }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(CompositionContextButton_1.CompositionContextButton, { getItems: getContextMenuItems, visible: hovered && !isDragging }), jsx_runtime_1.jsx(SidebarRenderButton_1.SidebarRenderButton, { visible: hovered && !isDragging, composition: item.composition })
252
251
  ] }) }) }));
253
252
  };
254
253
  exports.CompositionSelectorItem = CompositionSelectorItem;
@@ -1,12 +1,11 @@
1
1
  import React from 'react';
2
2
  import type { ComboboxValue } from './NewComposition/ComboBox';
3
- type ContextMenuOpenHandler = () => false | void;
4
- type ContextMenuTargetOpenResult = false | void | readonly ComboboxValue[];
5
- type ContextMenuTargetOpenHandler = (event: MouseEvent) => ContextMenuTargetOpenResult | Promise<ContextMenuTargetOpenResult>;
3
+ type ContextMenuItemsResult = false | readonly ComboboxValue[];
4
+ export type ContextMenuItemsFactory = (event: MouseEvent) => ContextMenuItemsResult | Promise<ContextMenuItemsResult>;
5
+ export declare const resolveContextMenuItems: (getItems: ContextMenuItemsFactory, event: MouseEvent) => Promise<readonly ComboboxValue[] | null>;
6
6
  type ContextMenuProps = {
7
7
  readonly children: React.ReactNode;
8
- readonly values: ComboboxValue[];
9
- readonly onOpen: ContextMenuOpenHandler | null;
8
+ readonly getItems: ContextMenuItemsFactory;
10
9
  readonly style?: React.CSSProperties;
11
10
  readonly className?: string;
12
11
  readonly onPointerDown?: React.PointerEventHandler<HTMLDivElement>;
@@ -14,7 +13,6 @@ type ContextMenuProps = {
14
13
  export declare const ContextMenu: React.ForwardRefExoticComponent<ContextMenuProps & React.RefAttributes<HTMLDivElement>>;
15
14
  export declare const ContextMenuForTarget: React.FC<{
16
15
  readonly triggerRef: React.RefObject<HTMLElement | SVGElement | null>;
17
- readonly values: ComboboxValue[];
18
- readonly onOpen: ContextMenuTargetOpenHandler | null;
16
+ readonly getItems: ContextMenuItemsFactory;
19
17
  }>;
20
18
  export {};
@@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.ContextMenuForTarget = exports.ContextMenu = void 0;
39
+ exports.ContextMenuForTarget = exports.ContextMenu = exports.resolveContextMenuItems = void 0;
40
40
  const jsx_runtime_1 = require("react/jsx-runtime");
41
41
  const player_1 = require("@remotion/player");
42
42
  const react_1 = __importStar(require("react"));
@@ -47,6 +47,14 @@ const z_index_1 = require("../state/z-index");
47
47
  const portals_1 = require("./Menu/portals");
48
48
  const styles_1 = require("./Menu/styles");
49
49
  const MenuContent_1 = require("./NewComposition/MenuContent");
50
+ const resolveContextMenuItems = async (getItems, event) => {
51
+ const result = await getItems(event);
52
+ if (result === false || result.length === 0) {
53
+ return null;
54
+ }
55
+ return [...result];
56
+ };
57
+ exports.resolveContextMenuItems = resolveContextMenuItems;
50
58
  const contextMenuFullScreenOverlay = {
51
59
  ...styles_1.fullScreenOverlay,
52
60
  pointerEvents: 'none',
@@ -62,7 +70,7 @@ const notifyContextMenuOpened = (id) => {
62
70
  detail: id,
63
71
  }));
64
72
  };
65
- const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened, values }) => {
73
+ const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened }) => {
66
74
  const menuRef = (0, react_1.useRef)(null);
67
75
  const size = player_1.PlayerInternals.useElementSize(sizeSource, {
68
76
  triggerOnWindowResize: true,
@@ -154,11 +162,14 @@ const ContextMenuPortal = ({ sizeSource, currentZIndex, onHide, opened, values }
154
162
  if (!portalStyle) {
155
163
  return null;
156
164
  }
157
- 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: 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", { 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));
158
166
  };
159
- exports.ContextMenu = react_1.default.forwardRef(({ children, values, onOpen, style = undefined, className = undefined, onPointerDown = undefined, }, forwardedRef) => {
167
+ exports.ContextMenu = react_1.default.forwardRef(({ children, getItems, style = undefined, className = undefined, onPointerDown = undefined, }, forwardedRef) => {
160
168
  const ref = (0, react_1.useRef)(null);
161
169
  const idRef = (0, react_1.useRef)(nextContextMenuId++);
170
+ const invocationRef = (0, react_1.useRef)(0);
171
+ const getItemsRef = (0, react_1.useRef)(getItems);
172
+ getItemsRef.current = getItems;
162
173
  const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
163
174
  const { currentZIndex } = (0, z_index_1.useZIndex)();
164
175
  const setRef = (0, react_1.useCallback)((node) => {
@@ -177,21 +188,34 @@ exports.ContextMenu = react_1.default.forwardRef(({ children, values, onOpen, st
177
188
  if (!current) {
178
189
  return;
179
190
  }
180
- const onClick = (e) => {
191
+ const onClick = async (e) => {
181
192
  e.preventDefault();
182
193
  e.stopPropagation();
183
- if ((onOpen === null || onOpen === void 0 ? void 0 : onOpen()) === false) {
194
+ const currentInvocation = ++invocationRef.current;
195
+ const values = await (0, exports.resolveContextMenuItems)(getItemsRef.current, e);
196
+ if (currentInvocation !== invocationRef.current || values === null) {
184
197
  return false;
185
198
  }
186
199
  notifyContextMenuOpened(idRef.current);
187
- setOpened({ type: 'open', left: e.clientX, top: e.clientY });
200
+ setOpened({
201
+ type: 'open',
202
+ left: e.clientX,
203
+ top: e.clientY,
204
+ values,
205
+ });
188
206
  return false;
189
207
  };
190
208
  current.addEventListener('contextmenu', onClick);
191
209
  return () => {
192
210
  current.removeEventListener('contextmenu', onClick);
193
211
  };
194
- }, [onOpen]);
212
+ }, []);
213
+ (0, react_1.useEffect)(() => {
214
+ const invocation = invocationRef;
215
+ return () => {
216
+ invocation.current++;
217
+ };
218
+ }, []);
195
219
  const onHide = (0, react_1.useCallback)(() => {
196
220
  setOpened({ type: 'not-open' });
197
221
  }, []);
@@ -208,13 +232,15 @@ exports.ContextMenu = react_1.default.forwardRef(({ children, values, onOpen, st
208
232
  };
209
233
  }, [onHide]);
210
234
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
211
- 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, values: values })) : null] }));
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] }));
212
236
  });
213
237
  exports.ContextMenu.displayName = 'ContextMenu';
214
- const ContextMenuForTarget = ({ triggerRef, values, onOpen }) => {
238
+ const ContextMenuForTarget = ({ triggerRef, getItems }) => {
215
239
  const idRef = (0, react_1.useRef)(nextContextMenuId++);
240
+ const invocationRef = (0, react_1.useRef)(0);
241
+ const getItemsRef = (0, react_1.useRef)(getItems);
242
+ getItemsRef.current = getItems;
216
243
  const [opened, setOpened] = (0, react_1.useState)({ type: 'not-open' });
217
- const [openedValues, setOpenedValues] = (0, react_1.useState)(values);
218
244
  const [body, setBody] = (0, react_1.useState)(null);
219
245
  const { currentZIndex } = (0, z_index_1.useZIndex)();
220
246
  (0, react_1.useEffect)(() => {
@@ -231,24 +257,31 @@ const ContextMenuForTarget = ({ triggerRef, values, onOpen }) => {
231
257
  const e = event;
232
258
  e.preventDefault();
233
259
  e.stopPropagation();
234
- const result = await (onOpen === null || onOpen === void 0 ? void 0 : onOpen(e));
235
- if (result === false) {
236
- return false;
237
- }
238
- const nextValues = Array.isArray(result) ? result : values;
239
- if (nextValues.length === 0) {
260
+ const currentInvocation = ++invocationRef.current;
261
+ const values = await (0, exports.resolveContextMenuItems)(getItemsRef.current, e);
262
+ if (currentInvocation !== invocationRef.current || values === null) {
240
263
  return false;
241
264
  }
242
265
  notifyContextMenuOpened(idRef.current);
243
- setOpenedValues(nextValues);
244
- setOpened({ type: 'open', left: e.clientX, top: e.clientY });
266
+ setOpened({
267
+ type: 'open',
268
+ left: e.clientX,
269
+ top: e.clientY,
270
+ values,
271
+ });
245
272
  return false;
246
273
  };
247
274
  current.addEventListener('contextmenu', onClick);
248
275
  return () => {
249
276
  current.removeEventListener('contextmenu', onClick);
250
277
  };
251
- }, [onOpen, triggerRef, values]);
278
+ }, [triggerRef]);
279
+ (0, react_1.useEffect)(() => {
280
+ const invocation = invocationRef;
281
+ return () => {
282
+ invocation.current++;
283
+ };
284
+ }, []);
252
285
  const onHide = (0, react_1.useCallback)(() => {
253
286
  setOpened({ type: 'not-open' });
254
287
  }, []);
@@ -264,6 +297,6 @@ const ContextMenuForTarget = ({ triggerRef, values, onOpen }) => {
264
297
  window.removeEventListener(contextMenuOpenedEvent, onOtherContextMenuOpened);
265
298
  };
266
299
  }, [onHide]);
267
- return opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { sizeSource: body, currentZIndex: currentZIndex, onHide: onHide, opened: opened, values: [...openedValues] })) : null;
300
+ return opened.type === 'open' ? (jsx_runtime_1.jsx(ContextMenuPortal, { sizeSource: body, currentZIndex: currentZIndex, onHide: onHide, opened: opened })) : null;
268
301
  };
269
302
  exports.ContextMenuForTarget = ContextMenuForTarget;
@@ -1,6 +1,8 @@
1
1
  import React from 'react';
2
+ import type { RenderInlineAction } from './InlineAction';
2
3
  export declare const CONTROL_BUTTON_PADDING = 6;
3
- export declare const CONTROL_BUTTON_SIZE = 30;
4
- export declare const ControlButton: (props: React.ClassAttributes<HTMLButtonElement> & React.ButtonHTMLAttributes<HTMLButtonElement> & {
4
+ export declare const ControlButton: (props: Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "children" | "onClick" | "title"> & {
5
5
  readonly title: string;
6
+ readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
7
+ readonly children: RenderInlineAction | React.ReactNode;
6
8
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1,27 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ControlButton = exports.CONTROL_BUTTON_SIZE = exports.CONTROL_BUTTON_PADDING = void 0;
3
+ exports.ControlButton = exports.CONTROL_BUTTON_PADDING = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("react");
6
- const z_index_1 = require("../state/z-index");
5
+ const colors_1 = require("../helpers/colors");
6
+ const InlineAction_1 = require("./InlineAction");
7
7
  exports.CONTROL_BUTTON_PADDING = 6;
8
- exports.CONTROL_BUTTON_SIZE = 30;
9
8
  const ControlButton = (props) => {
10
- const style = (0, react_1.useMemo)(() => {
11
- return {
12
- opacity: props.disabled ? 0.5 : 1,
13
- display: 'inline-flex',
14
- alignItems: 'center',
15
- justifyContent: 'center',
16
- width: exports.CONTROL_BUTTON_SIZE,
17
- height: exports.CONTROL_BUTTON_SIZE,
18
- flexShrink: 0,
19
- background: 'none',
20
- border: 'none',
21
- padding: 0,
22
- };
23
- }, [props.disabled]);
24
- const { tabIndex } = (0, z_index_1.useZIndex)();
25
- return (jsx_runtime_1.jsx("button", { type: 'button', tabIndex: tabIndex, ...props, style: style }));
9
+ const { children, onClick, title, ...buttonProps } = props;
10
+ const renderAction = typeof children === 'function' ? children : () => children;
11
+ return (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { ...buttonProps, title: title, onClick: onClick, renderAction: renderAction, variant: null, unhoveredColor: colors_1.WHITE_ALPHA_80 }));
26
12
  };
27
13
  exports.ControlButton = ControlButton;
@@ -35,7 +35,7 @@ const StudioClearSelectionArea = ({ children }) => {
35
35
  const EditorContent = ({ readOnlyStudio, children }) => {
36
36
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
37
37
  const showTimeline = canvasContent !== null && canvasContent.type === 'composition';
38
- 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, children: [
38
+ 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
39
  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
40
  ] }));
41
41
  return (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionProvider, { children: jsx_runtime_1.jsxs(StudioClearSelectionArea, { children: [
@@ -165,7 +165,7 @@ const GuideComp = ({ guide, canvasDimensions, scale }) => {
165
165
  .filter(no_react_1.NoReactInternals.truthy)
166
166
  .join(' ');
167
167
  }, [activeClassName]);
168
- const values = (0, react_1.useMemo)(() => {
168
+ const getContextMenuItems = (0, react_1.useCallback)(() => {
169
169
  return [
170
170
  {
171
171
  id: '1',
@@ -191,6 +191,6 @@ const GuideComp = ({ guide, canvasDimensions, scale }) => {
191
191
  },
192
192
  ];
193
193
  }, [clearSelection, guide.id, selected, setGuidesList]);
194
- return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: values, onOpen: null, children: jsx_runtime_1.jsx("div", { style: guideStyle, onPointerDown: onPointerDown, onClick: onClick, className: "__remotion_editor_guide", [should_clear_selection_on_pointer_down_1.PREVENT_CLEAR_SELECTION_ON_POINTER_DOWN_ATTR]: 'true', onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsx("div", { style: guideContentStyle, className: guideClassName }) }) }));
194
+ return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: jsx_runtime_1.jsx("div", { style: guideStyle, onPointerDown: onPointerDown, onClick: onClick, className: "__remotion_editor_guide", [should_clear_selection_on_pointer_down_1.PREVENT_CLEAR_SELECTION_ON_POINTER_DOWN_ATTR]: 'true', onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsx("div", { style: guideContentStyle, className: guideClassName }) }) }));
195
195
  };
196
196
  exports.default = (0, react_1.memo)(GuideComp);