@remotion/studio 4.0.524 → 4.0.526

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 (230) hide show
  1. package/dist/api/focus-default-props-path.js +7 -1
  2. package/dist/api/restart-studio.d.ts +1 -1
  3. package/dist/api/restart-studio.js +1 -1
  4. package/dist/components/ActionTooltip.d.ts +2 -0
  5. package/dist/components/ActionTooltip.js +14 -4
  6. package/dist/components/AgentPrompt.d.ts +6 -0
  7. package/dist/components/AgentPrompt.js +107 -0
  8. package/dist/components/AppLaunchButton.js +2 -0
  9. package/dist/components/AssetFileIcon.js +2 -0
  10. package/dist/components/AssetSelectorItem.d.ts +1 -23
  11. package/dist/components/AssetSelectorItem.js +10 -200
  12. package/dist/components/AssetSelectorModal.d.ts +6 -0
  13. package/dist/components/AssetSelectorModal.js +174 -0
  14. package/dist/components/Canvas.js +21 -4
  15. package/dist/components/CaptionInspector.js +9 -3
  16. package/dist/components/CheckboardToggle.js +2 -1
  17. package/dist/{error-overlay/remotion-overlay → components}/CodeFrame.d.ts +2 -0
  18. package/dist/components/CodeFrame.js +77 -0
  19. package/dist/components/ColorPicker/AlphaSlider.js +1 -1
  20. package/dist/components/ColorPicker/HueSlider.js +1 -1
  21. package/dist/components/ColorPicker/SaturationValueArea.js +1 -1
  22. package/dist/components/CompositionSelector.js +1 -0
  23. package/dist/components/CompositionSelectorItem.js +7 -17
  24. package/dist/components/CurrentAsset.js +5 -4
  25. package/dist/components/EditorGuides/Guide.js +1 -1
  26. package/dist/components/ElementInstallConfirmation.js +100 -61
  27. package/dist/components/FilePreview.js +4 -0
  28. package/dist/components/FixComputedValueModal.js +64 -96
  29. package/dist/components/FullscreenToggle.js +1 -1
  30. package/dist/components/GenerateWithAgentModal.d.ts +9 -0
  31. package/dist/components/GenerateWithAgentModal.js +39 -0
  32. package/dist/components/GlobalKeybindings.js +14 -0
  33. package/dist/components/InlineEditableTitle.js +2 -0
  34. package/dist/components/InspectorLocationCopy.js +1 -1
  35. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  36. package/dist/components/InspectorOpenInEditor.js +25 -18
  37. package/dist/components/InspectorPanel/CollapsibleInspectorSection.d.ts +7 -0
  38. package/dist/components/InspectorPanel/CollapsibleInspectorSection.js +14 -0
  39. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +1 -1
  40. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +19 -8
  41. package/dist/components/InspectorPanel/CompositionInspector.js +30 -13
  42. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +6 -7
  43. package/dist/components/InspectorPanel/CompositionMetadata.js +4 -0
  44. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +6 -12
  45. package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -0
  46. package/dist/components/InspectorPanel/GuideInspector.js +2 -3
  47. package/dist/components/InspectorPanel/KeyframeSettings.js +5 -6
  48. package/dist/components/InspectorPanel/MultiSequenceInspector.js +2 -1
  49. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +4 -12
  50. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +4 -3
  51. package/dist/components/InspectorPanel/common.d.ts +4 -0
  52. package/dist/components/InspectorPanel/common.js +14 -2
  53. package/dist/components/InspectorPanel/styles.d.ts +0 -3
  54. package/dist/components/InspectorPanel/styles.js +1 -27
  55. package/dist/components/InspectorPanel/use-composition-actions.d.ts +2 -0
  56. package/dist/components/InspectorPanel/use-composition-actions.js +15 -0
  57. package/dist/components/InspectorPanel/use-inspector-section-expanded.d.ts +1 -0
  58. package/dist/components/InspectorPanel/use-inspector-section-expanded.js +21 -0
  59. package/dist/components/InspectorSequenceSection.js +61 -43
  60. package/dist/components/InspectorSourceLocation.js +1 -0
  61. package/dist/components/KeyboardShortcutsSettings.js +12 -4
  62. package/dist/components/LoopToggle.js +2 -1
  63. package/dist/components/LutPreview.d.ts +4 -0
  64. package/dist/components/LutPreview.js +192 -0
  65. package/dist/components/Menu/MenuItem.js +1 -2
  66. package/dist/components/MenuBuildIndicator.js +1 -1
  67. package/dist/components/MenuCompositionName.js +4 -9
  68. package/dist/components/Modals.js +4 -6
  69. package/dist/components/ModelsSettings.js +15 -4
  70. package/dist/components/MuteToggle.js +2 -1
  71. package/dist/components/NewComposition/CodemodFooter.js +1 -0
  72. package/dist/components/NewComposition/DeleteComposition.js +42 -6
  73. package/dist/components/NewComposition/DeleteFolder.js +1 -0
  74. package/dist/components/NewComposition/DuplicateComposition.js +5 -0
  75. package/dist/components/NewComposition/InputDragger.js +2 -2
  76. package/dist/components/NewComposition/NewFolder.js +29 -2
  77. package/dist/components/NewComposition/RenameFolder.js +1 -0
  78. package/dist/components/NewComposition/duplicate-composition-api.d.ts +3 -2
  79. package/dist/components/NewComposition/duplicate-composition-api.js +9 -2
  80. package/dist/components/OutlineToggle.js +2 -1
  81. package/dist/components/PlayPause.js +1 -1
  82. package/dist/components/Preview.js +0 -3
  83. package/dist/components/PreviewToolbar.js +3 -6
  84. package/dist/components/PreviewToolbarOverflowButton.js +2 -1
  85. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  86. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +4 -9
  87. package/dist/components/RenderButton.js +40 -4
  88. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.d.ts +1 -0
  89. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.js +2 -1
  90. package/dist/components/RenderModal/WebRenderModal.js +10 -2
  91. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  92. package/dist/components/RenderModal/render-modals.js +3 -0
  93. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +1 -1
  94. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +1 -1
  95. package/dist/components/RenderQueue/actions.d.ts +2 -1
  96. package/dist/components/RenderQueue/actions.js +2 -1
  97. package/dist/components/RendersTab.js +2 -0
  98. package/dist/components/RulersAndGuidesToggle.js +2 -1
  99. package/dist/components/SegmentedButton.d.ts +1 -0
  100. package/dist/components/SegmentedButton.js +9 -3
  101. package/dist/components/SelectedOutlineElement.js +22 -6
  102. package/dist/components/SelectedOutlinePolygon.js +4 -2
  103. package/dist/components/SettingsButton.js +11 -2
  104. package/dist/components/SettingsContext.d.ts +8 -0
  105. package/dist/components/SettingsContext.js +57 -2
  106. package/dist/components/SettingsModal.d.ts +1 -2
  107. package/dist/components/SettingsModal.js +27 -6
  108. package/dist/components/SettingsModalFooter.js +17 -3
  109. package/dist/components/SidebarCollapserControls.js +1 -1
  110. package/dist/components/SkillsSettings.d.ts +5 -0
  111. package/dist/components/SkillsSettings.js +49 -15
  112. package/dist/components/SnappingToggle.js +2 -1
  113. package/dist/components/Splitter/SplitterHandle.js +1 -2
  114. package/dist/components/Tabs/vertical.d.ts +1 -1
  115. package/dist/components/Tabs/vertical.js +16 -2
  116. package/dist/components/Timeline/EasingEditorModal.js +2 -2
  117. package/dist/components/Timeline/Timeline.js +10 -11
  118. package/dist/components/Timeline/TimelineAssetField.js +178 -9
  119. package/dist/components/Timeline/TimelineDragHandler.js +1 -2
  120. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  121. package/dist/components/Timeline/TimelineEffectItem.js +2 -2
  122. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  123. package/dist/components/Timeline/TimelineEffectPropItem.js +2 -2
  124. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  125. package/dist/components/Timeline/TimelineHeightContainer.js +11 -1
  126. package/dist/components/Timeline/TimelineInOutDragHandler.js +1 -2
  127. package/dist/components/Timeline/TimelineKeyframeControls.js +15 -1
  128. package/dist/components/Timeline/TimelineLayerChildren.d.ts +3 -3
  129. package/dist/components/Timeline/TimelineLayerChildren.js +11 -9
  130. package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -1
  131. package/dist/components/Timeline/TimelineLayerEye.js +6 -3
  132. package/dist/components/Timeline/TimelineList.js +9 -3
  133. package/dist/components/Timeline/TimelineSchemaField.js +10 -7
  134. package/dist/components/Timeline/TimelineSelection.d.ts +17 -4
  135. package/dist/components/Timeline/TimelineSelection.js +121 -52
  136. package/dist/components/Timeline/TimelineSequence.js +8 -8
  137. package/dist/components/Timeline/TimelineSequenceItem.d.ts +2 -0
  138. package/dist/components/Timeline/TimelineSequenceItem.js +29 -23
  139. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +3 -12
  140. package/dist/components/Timeline/TimelineTranslateField.js +25 -12
  141. package/dist/components/Timeline/TimelineVirtualization.d.ts +3 -3
  142. package/dist/components/Timeline/TimelineZoomControls.js +1 -1
  143. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +3 -1
  144. package/dist/components/Timeline/get-sequence-context-menu-items.js +152 -51
  145. package/dist/components/Timeline/normalize-font-weight-for-keyframe.d.ts +1 -0
  146. package/dist/components/Timeline/normalize-font-weight-for-keyframe.js +19 -0
  147. package/dist/components/Timeline/timeline-display-groups.d.ts +9 -0
  148. package/dist/components/Timeline/timeline-display-groups.js +66 -0
  149. package/dist/components/Timeline/timeline-field-display-utils.js +4 -2
  150. package/dist/components/Timeline/timeline-translate-utils.d.ts +17 -0
  151. package/dist/components/Timeline/timeline-translate-utils.js +53 -12
  152. package/dist/components/Timeline/use-open-sequence-in-apps.d.ts +2 -0
  153. package/dist/components/Timeline/use-open-sequence-in-apps.js +17 -0
  154. package/dist/components/Timeline/use-timeline-asset-drop.js +20 -6
  155. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +2 -1
  156. package/dist/components/Timeline/use-timeline-expanded-tree.js +1 -2
  157. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  158. package/dist/components/TimelineCombobox.js +1 -0
  159. package/dist/components/UndoRedoButtons.js +11 -0
  160. package/dist/components/UpdateStatusContext.d.ts +2 -2
  161. package/dist/components/UpdateStatusContext.js +6 -7
  162. package/dist/components/UpdatesSettings.js +6 -6
  163. package/dist/components/WebMcp.js +40 -41
  164. package/dist/components/asset-context-menu.d.ts +32 -0
  165. package/dist/components/asset-context-menu.js +242 -0
  166. package/dist/components/composition-menu-items.d.ts +4 -6
  167. package/dist/components/composition-menu-items.js +212 -42
  168. package/dist/components/folder-menu-items.js +44 -0
  169. package/dist/components/get-open-in-menu-items.d.ts +6 -5
  170. package/dist/components/get-open-in-menu-items.js +16 -10
  171. package/dist/components/import-assets.d.ts +24 -1
  172. package/dist/components/import-assets.js +3 -1
  173. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  174. package/dist/components/keyboard-shortcuts.js +5 -0
  175. package/dist/components/selected-outline-order.js +18 -12
  176. package/dist/components/use-open-in-menu-apps.d.ts +14 -0
  177. package/dist/components/use-open-in-menu-apps.js +33 -0
  178. package/dist/error-overlay/remotion-overlay/ErrorDisplay.js +2 -2
  179. package/dist/error-overlay/remotion-overlay/OpenInEditor.d.ts +1 -0
  180. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +3 -3
  181. package/dist/error-overlay/remotion-overlay/StackFrame.d.ts +5 -1
  182. package/dist/error-overlay/remotion-overlay/StackFrame.js +26 -19
  183. package/dist/esm/{LazyModels-hc33szyn.mjs → LazyModels-mtggyjye.mjs} +3 -3
  184. package/dist/esm/{LazyModels-sg40rjw6.mjs → LazyModels-nk7py0zt.mjs} +3 -3
  185. package/dist/esm/{TranscriptionModal-3ctnxpt6.mjs → TranscriptionModal-ymnx1c7m.mjs} +6 -6
  186. package/dist/esm/{VideoMattingModal-b0r7e60n.mjs → VideoMattingModal-05vpczks.mjs} +6 -6
  187. package/dist/esm/{index-er3mh6em.mjs → index-0gewwxse.mjs} +7031 -5834
  188. package/dist/esm/{index-q5xv20xx.mjs → index-4dsz9035.mjs} +8 -8
  189. package/dist/esm/{index-wbmp5srk.mjs → index-5bfxbpca.mjs} +1 -1
  190. package/dist/esm/{index-e3zwf3e7.mjs → index-5gd8k9yv.mjs} +1 -1
  191. package/dist/esm/{index-c37kme2v.mjs → index-bs39wngg.mjs} +4929 -3801
  192. package/dist/esm/{index-yfrysr5f.mjs → index-cdy8v54v.mjs} +17 -3
  193. package/dist/esm/{index-9qtvmwtx.mjs → index-eb5txqp6.mjs} +12 -9
  194. package/dist/esm/{index-q2epbw93.mjs → index-f97r9e2g.mjs} +4 -21
  195. package/dist/esm/{index-2j3d1g81.mjs → index-g7k2dvar.mjs} +1 -1
  196. package/dist/esm/{index-1b9skrrd.mjs → index-x40wwfmt.mjs} +3 -3
  197. package/dist/esm/index.mjs +12 -6
  198. package/dist/esm/internals.mjs +7 -7
  199. package/dist/esm/previewEntry.mjs +7 -7
  200. package/dist/helpers/client-id.d.ts +1 -0
  201. package/dist/helpers/client-id.js +8 -4
  202. package/dist/helpers/cube-lut.d.ts +12 -0
  203. package/dist/helpers/cube-lut.js +160 -0
  204. package/dist/helpers/get-git-menu-item.d.ts +4 -0
  205. package/dist/helpers/get-git-menu-item.js +8 -1
  206. package/dist/helpers/get-preview-file-type.d.ts +1 -1
  207. package/dist/helpers/get-preview-file-type.js +3 -0
  208. package/dist/helpers/get-sequence-double-click-action.d.ts +3 -3
  209. package/dist/helpers/get-sequence-double-click-action.js +2 -2
  210. package/dist/helpers/open-in-editor.d.ts +5 -2
  211. package/dist/helpers/open-in-editor.js +12 -4
  212. package/dist/helpers/pointer-session.d.ts +1 -0
  213. package/dist/helpers/pointer-session.js +10 -1
  214. package/dist/helpers/settings-tab-availability.d.ts +14 -0
  215. package/dist/helpers/settings-tab-availability.js +35 -0
  216. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  217. package/dist/helpers/use-create-composition.js +5 -0
  218. package/dist/helpers/use-keybinding.d.ts +1 -1
  219. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  220. package/dist/helpers/use-media-metadata.js +5 -1
  221. package/dist/helpers/use-menu-structure.js +21 -13
  222. package/dist/helpers/use-rename-composition.js +6 -1
  223. package/dist/icons/lut.d.ts +4 -0
  224. package/dist/icons/lut.js +6 -0
  225. package/dist/icons/sparkles.d.ts +4 -0
  226. package/dist/icons/sparkles.js +6 -0
  227. package/dist/state/modals.d.ts +25 -3
  228. package/dist/state/z-index.js +1 -3
  229. package/package.json +19 -19
  230. package/dist/error-overlay/remotion-overlay/CodeFrame.js +0 -62
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LutPreview = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const player_1 = require("@remotion/player");
6
+ const react_1 = require("react");
7
+ const colors_1 = require("../helpers/colors");
8
+ const cube_lut_1 = require("../helpers/cube-lut");
9
+ const hoverable_1 = require("../helpers/hoverable");
10
+ const z_index_1 = require("../state/z-index");
11
+ const sampleImage = 'https://remotion.media/transition-bg-blue.jpg';
12
+ const previewWidth = 640;
13
+ const previewHeight = 427;
14
+ const container = {
15
+ padding: 24,
16
+ flex: 1,
17
+ display: 'flex',
18
+ alignItems: 'center',
19
+ justifyContent: 'center',
20
+ fontFamily: 'sans-serif',
21
+ fontSize: 13,
22
+ minHeight: 0,
23
+ };
24
+ const comparison = {
25
+ position: 'relative',
26
+ flexShrink: 0,
27
+ userSelect: 'none',
28
+ WebkitUserSelect: 'none',
29
+ };
30
+ const canvasStyle = {
31
+ display: 'block',
32
+ width: '100%',
33
+ height: 'auto',
34
+ borderRadius: 4,
35
+ userSelect: 'none',
36
+ WebkitUserSelect: 'none',
37
+ };
38
+ const sliderStyle = {
39
+ ...(0, hoverable_1.hoverableStyle)({
40
+ idleBackground: colors_1.TRANSPARENT,
41
+ hoverBackground: colors_1.TRANSPARENT,
42
+ idleColor: colors_1.LIGHT_TEXT,
43
+ hoverColor: colors_1.WHITE,
44
+ }),
45
+ position: 'absolute',
46
+ inset: 0,
47
+ borderRadius: 4,
48
+ cursor: 'default',
49
+ touchAction: 'none',
50
+ userSelect: 'none',
51
+ WebkitUserSelect: 'none',
52
+ };
53
+ const dividerStyle = {
54
+ position: 'absolute',
55
+ top: 0,
56
+ bottom: 0,
57
+ width: 2,
58
+ backgroundColor: colors_1.CURRENT_COLOR,
59
+ transform: 'translateX(-50%)',
60
+ pointerEvents: 'none',
61
+ };
62
+ const handleStyle = {
63
+ position: 'absolute',
64
+ top: '50%',
65
+ left: '50%',
66
+ transform: 'translate(-50%, -50%)',
67
+ width: 32,
68
+ height: 32,
69
+ borderRadius: '50%',
70
+ border: `2px solid ${colors_1.CURRENT_COLOR}`,
71
+ backgroundColor: colors_1.BACKGROUND,
72
+ display: 'flex',
73
+ alignItems: 'center',
74
+ justifyContent: 'center',
75
+ };
76
+ const message = {
77
+ color: colors_1.LIGHT_TEXT,
78
+ textAlign: 'center',
79
+ overflowWrap: 'anywhere',
80
+ };
81
+ const LutPreview = ({ src }) => {
82
+ const containerRef = (0, react_1.useRef)(null);
83
+ const beforeRef = (0, react_1.useRef)(null);
84
+ const afterRef = (0, react_1.useRef)(null);
85
+ const [state, setState] = (0, react_1.useState)({ type: 'loading' });
86
+ const [position, setPosition] = (0, react_1.useState)(50);
87
+ const { tabIndex } = (0, z_index_1.useZIndex)();
88
+ const size = player_1.PlayerInternals.useElementSize(containerRef, {
89
+ triggerOnWindowResize: true,
90
+ shouldApplyCssTransforms: true,
91
+ });
92
+ const updatePosition = (0, react_1.useCallback)((event) => {
93
+ const rect = event.currentTarget.getBoundingClientRect();
94
+ setPosition(Math.max(0, Math.min(100, ((event.clientX - rect.left) / rect.width) * 100)));
95
+ }, []);
96
+ const onPointerDown = (0, react_1.useCallback)((event) => {
97
+ if (event.button !== 0 || !event.isPrimary) {
98
+ return;
99
+ }
100
+ event.currentTarget.setPointerCapture(event.pointerId);
101
+ updatePosition(event);
102
+ }, [updatePosition]);
103
+ const onPointerMove = (0, react_1.useCallback)((event) => {
104
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) {
105
+ updatePosition(event);
106
+ }
107
+ }, [updatePosition]);
108
+ const onKeyDown = (0, react_1.useCallback)((event) => {
109
+ const step = event.shiftKey ? 10 : 1;
110
+ if (event.key === 'Home') {
111
+ setPosition(0);
112
+ }
113
+ else if (event.key === 'End') {
114
+ setPosition(100);
115
+ }
116
+ else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {
117
+ setPosition((value) => Math.max(0, value - step));
118
+ }
119
+ else if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {
120
+ setPosition((value) => Math.min(100, value + step));
121
+ }
122
+ else {
123
+ return;
124
+ }
125
+ event.preventDefault();
126
+ event.stopPropagation();
127
+ }, []);
128
+ (0, react_1.useEffect)(() => {
129
+ const controller = new AbortController();
130
+ const image = new Image();
131
+ image.crossOrigin = 'anonymous';
132
+ setState({ type: 'loading' });
133
+ const load = async () => {
134
+ var _a, _b;
135
+ const response = await fetch(src, { signal: controller.signal });
136
+ if (!response.ok) {
137
+ throw new Error(`Could not load LUT (HTTP ${response.status}).`);
138
+ }
139
+ const lut = (0, cube_lut_1.parseCubeLut)(await response.text());
140
+ if (controller.signal.aborted) {
141
+ return;
142
+ }
143
+ image.src = sampleImage;
144
+ try {
145
+ await image.decode();
146
+ }
147
+ catch (_c) {
148
+ throw new Error('Could not load the LUT sample image. Check your internet connection.');
149
+ }
150
+ if (controller.signal.aborted) {
151
+ return;
152
+ }
153
+ const before = (_a = beforeRef.current) === null || _a === void 0 ? void 0 : _a.getContext('2d');
154
+ const after = (_b = afterRef.current) === null || _b === void 0 ? void 0 : _b.getContext('2d');
155
+ if (!before || !after) {
156
+ throw new Error('Could not create the LUT preview canvas.');
157
+ }
158
+ before.drawImage(image, 0, 0, previewWidth, previewHeight);
159
+ const pixels = before.getImageData(0, 0, previewWidth, previewHeight);
160
+ (0, cube_lut_1.applyCubeLut)(pixels.data, lut);
161
+ after.putImageData(pixels, 0, 0);
162
+ setState({ type: 'loaded' });
163
+ };
164
+ load().catch((error) => {
165
+ if (!controller.signal.aborted) {
166
+ setState({
167
+ type: 'error',
168
+ error: error instanceof Error ? error.message : String(error),
169
+ });
170
+ }
171
+ });
172
+ return () => {
173
+ controller.abort();
174
+ image.removeAttribute('src');
175
+ };
176
+ }, [src]);
177
+ return (jsx_runtime_1.jsxs("div", { ref: containerRef, style: container, children: [state.type === 'error' ? (jsx_runtime_1.jsxs("div", { style: message, role: "alert", children: ["Could not preview LUT: ", state.error] })) : state.type === 'loading' ? (jsx_runtime_1.jsx("div", { style: message, role: "status", children: "Loading LUT preview..." })) : null, jsx_runtime_1.jsxs("div", { style: {
178
+ ...comparison,
179
+ width: size
180
+ ? Math.max(0, Math.min(960, size.width - 48, ((size.height - 48) * previewWidth) / previewHeight))
181
+ : 0,
182
+ display: state.type === 'loaded' ? 'block' : 'none',
183
+ }, children: [
184
+ jsx_runtime_1.jsx("canvas", { ref: afterRef, width: previewWidth, height: previewHeight, style: canvasStyle, role: "img", "aria-label": "Sample image after LUT" }), jsx_runtime_1.jsx("div", { style: {
185
+ position: 'absolute',
186
+ inset: 0,
187
+ clipPath: `inset(0 ${100 - position}% 0 0)`,
188
+ }, children: jsx_runtime_1.jsx("canvas", { ref: beforeRef, width: previewWidth, height: previewHeight, style: canvasStyle, role: "img", "aria-label": "Sample image before LUT" }) }), jsx_runtime_1.jsx("div", { role: "slider", "aria-label": "Before and after comparison", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": Math.round(position), "aria-valuetext": `${Math.round(position)}% before, ${100 - Math.round(position)}% after`, tabIndex: tabIndex, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, style: sliderStyle, onPointerDown: onPointerDown, onPointerMove: onPointerMove, onKeyDown: onKeyDown, children: jsx_runtime_1.jsx("div", { "aria-hidden": true, style: { ...dividerStyle, left: `${position}%` }, children: jsx_runtime_1.jsx("div", { style: handleStyle, children: jsx_runtime_1.jsx("svg", { width: 20, height: 20, viewBox: "0 0 24 24", fill: "none", children: jsx_runtime_1.jsx("path", { d: "M8 8 4 12l4 4M16 8l4 4-4 4", stroke: colors_1.CURRENT_COLOR, strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" }) }) }) }) })
189
+ ] })
190
+ ] }));
191
+ };
192
+ exports.LutPreview = LutPreview;
@@ -86,8 +86,7 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
86
86
  event: e.nativeEvent,
87
87
  captureTarget: e.currentTarget,
88
88
  onEnd: (reason, evt) => {
89
- if ((reason === 'pointerup' || reason === 'buttons-released') &&
90
- evt) {
89
+ if ((0, pointer_session_1.isPointerSessionRelease)(reason, evt)) {
91
90
  const target = document.elementFromPoint(evt.clientX, evt.clientY);
92
91
  if (!target || !(0, is_menu_item_1.isMenuItem)(target)) {
93
92
  onItemQuit();
@@ -53,7 +53,7 @@ const MenuBuildIndicator = ({ mobileLayout }) => {
53
53
  };
54
54
  }, []);
55
55
  return (jsx_runtime_1.jsxs("div", { style: cwd, title: window.remotion_cwd, children: [
56
- jsx_runtime_1.jsx(layout_1.Spacing, { x: mobileLayout ? 0.5 : 2 }), window.remotion_projectName, jsx_runtime_1.jsx(MenuCompositionName_1.MenuCompositionName, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: openInEditor, children: jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: folderLocation, locationType: "folder" }) }), mobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), mobileLayout ? (isBuilding ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
56
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: mobileLayout ? 0.5 : 2 }), window.remotion_projectName, jsx_runtime_1.jsx(MenuCompositionName_1.MenuCompositionName, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: openInEditor, children: jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: folderLocation, locationType: "folder", showTooltips: true }) }), mobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), mobileLayout ? (isBuilding ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
57
57
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx("div", { style: spinner, children: jsx_runtime_1.jsx(Spinner_1.Spinner, { duration: 0.5, size: spinnerSize, color: colors_1.WHITE_ALPHA_80 }) })
58
58
  ] })) : null) : isBuilding ? (jsx_runtime_1.jsx("div", { style: spinner, children: jsx_runtime_1.jsx(Spinner_1.Spinner, { duration: 0.5, size: spinnerSize, color: colors_1.WHITE_ALPHA_80 }) })) : (jsx_runtime_1.jsx("div", { style: noSpinner }))] }));
59
59
  };
@@ -4,7 +4,6 @@ exports.MenuCompositionName = 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 client_id_1 = require("../helpers/client-id");
8
7
  const colors_1 = require("../helpers/colors");
9
8
  const hoverable_1 = require("../helpers/hoverable");
10
9
  const noop_1 = require("../helpers/noop");
@@ -13,7 +12,7 @@ const composition_menu_items_1 = require("./composition-menu-items");
13
12
  const ContextMenu_1 = require("./ContextMenu");
14
13
  const InlineDropdown_1 = require("./InlineDropdown");
15
14
  const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
16
- const use_default_editor_info_1 = require("./use-default-editor-info");
15
+ const use_open_in_menu_apps_1 = require("./use-open-in-menu-apps");
17
16
  const baseStyle = {
18
17
  cursor: 'default',
19
18
  textDecoration: 'none',
@@ -66,18 +65,15 @@ const MenuCompositionName = () => {
66
65
  }, [canvasContent, compositions]);
67
66
  const asset = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset' ? canvasContent.asset : null;
68
67
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
69
- const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
70
- .previewServerState.type;
71
- const { defaultEditorId, defaultEditorName } = (0, use_default_editor_info_1.useEditorOpening)(connectionStatus === 'connected');
68
+ const { connectionStatus, openInApps } = (0, use_open_in_menu_apps_1.useOpenInMenuApps)();
72
69
  const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)((_a = composition === null || composition === void 0 ? void 0 : composition.stack) !== null && _a !== void 0 ? _a : null);
73
70
  const getContextMenuItems = (0, react_1.useCallback)(() => {
74
71
  return (0, composition_menu_items_1.getCompositionContextMenuItems)({
75
72
  closeMenu: noop_1.noop,
76
73
  composition,
77
74
  connectionStatus,
78
- editorId: defaultEditorId,
79
- editorName: defaultEditorName,
80
75
  includeCompositionManagementItems: true,
76
+ openInApps,
81
77
  resolvedLocation,
82
78
  setSelectedModal,
83
79
  readOnlyStudio: window.remotion_isReadOnlyStudio,
@@ -85,8 +81,7 @@ const MenuCompositionName = () => {
85
81
  }, [
86
82
  composition,
87
83
  connectionStatus,
88
- defaultEditorId,
89
- defaultEditorName,
84
+ openInApps,
90
85
  resolvedLocation,
91
86
  setSelectedModal,
92
87
  ]);
@@ -11,12 +11,14 @@ const client_id_1 = require("../helpers/client-id");
11
11
  const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
12
12
  const modals_1 = require("../state/modals");
13
13
  const AskAiModal_1 = require("./AskAiModal");
14
+ const AssetSelectorModal_1 = require("./AssetSelectorModal");
14
15
  const call_api_1 = require("./call-api");
15
16
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
16
17
  const EffectPickerModal_1 = require("./EffectPickerModal");
17
18
  const ElementInstallConfirmation_1 = require("./ElementInstallConfirmation");
18
19
  const ElementLibraryModal_1 = require("./ElementLibraryModal");
19
20
  const FixComputedValueModal_1 = require("./FixComputedValueModal");
21
+ const GenerateWithAgentModal_1 = require("./GenerateWithAgentModal");
20
22
  const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
21
23
  const DeleteFolder_1 = require("./NewComposition/DeleteFolder");
22
24
  const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
@@ -103,12 +105,8 @@ const Modals = ({ readOnlyStudio }) => {
103
105
  })();
104
106
  });
105
107
  }, [confirm, isBrowserStudio, previewServerState, subscribeToEvent]);
106
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack, canvasCapture: modalContextType.canvasCapture })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType &&
107
- modalContextType.type === 'settings' &&
108
- (!isBrowserStudio ||
109
- modalContextType.initialTab === 'packages' ||
110
- modalContextType.initialTab === 'shortcuts') ? (jsx_runtime_1.jsx(SettingsModal_1.SettingsModal, { initialTab: modalContextType.initialTab, initialPublicLicenseKey: modalContextType.initialPublicLicenseKey }, `${modalContextType.initialTab}-${modalContextType.initialPublicLicenseKey}`)) : null, modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
108
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack, canvasCapture: modalContextType.canvasCapture })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'settings' ? (jsx_runtime_1.jsx(SettingsModal_1.SettingsModal, { initialTab: modalContextType.initialTab, initialPublicLicenseKey: modalContextType.initialPublicLicenseKey }, `${modalContextType.initialTab}-${modalContextType.initialPublicLicenseKey}`)) : null, modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
111
109
  modalContextType.type === 'server-render' &&
112
- (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'transcribe' ? (jsx_runtime_1.jsx(TranscriptionModalWithOptionalWhisper_1.TranscriptionModalWithOptionalWhisper, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'video-matting' ? (jsx_runtime_1.jsx(VideoMattingModalWithOptionalPackage_1.VideoMattingModalWithOptionalPackage, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'element-install' && (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { state: modalContextType })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
110
+ (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'transcribe' ? (jsx_runtime_1.jsx(TranscriptionModalWithOptionalWhisper_1.TranscriptionModalWithOptionalWhisper, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'video-matting' ? (jsx_runtime_1.jsx(VideoMattingModalWithOptionalPackage_1.VideoMattingModalWithOptionalPackage, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'generate-with-agent' ? (jsx_runtime_1.jsx(GenerateWithAgentModal_1.GenerateWithAgentModal, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'asset-selection' ? (jsx_runtime_1.jsx(AssetSelectorModal_1.AssetSelectorModal, { readOnlyStudio: readOnlyStudio, state: modalContextType })) : null, modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'element-install' && (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { state: modalContextType })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
113
111
  };
114
112
  exports.Modals = Modals;
@@ -36,8 +36,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.ModelsSettings = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
40
+ const client_id_1 = require("../helpers/client-id");
39
41
  const colors_1 = require("../helpers/colors");
40
42
  const optional_package_dependencies_1 = require("../helpers/optional-package-dependencies");
43
+ const settings_tab_availability_1 = require("../helpers/settings-tab-availability");
41
44
  const Button_1 = require("./Button");
42
45
  const styles_1 = require("./InspectorPanel/styles");
43
46
  const OptionalPackageModal_1 = require("./OptionalPackageModal");
@@ -104,7 +107,7 @@ const errorStyle = {
104
107
  lineHeight: 1.4,
105
108
  margin: '8px 0 0',
106
109
  };
107
- const OptionalModelPackage = ({ children, label, packageName, style }) => {
110
+ const OptionalModelPackage = ({ canInstall, children, label, packageName, style }) => {
108
111
  const installed = (0, OptionalPackageModal_1.useOptionalPackageInstalled)(packageName);
109
112
  const [installState, setInstallState] = (0, react_1.useState)({
110
113
  type: 'idle',
@@ -122,12 +125,20 @@ const OptionalModelPackage = ({ children, label, packageName, style }) => {
122
125
  jsx_runtime_1.jsxs("div", { style: headingRow, children: [
123
126
  jsx_runtime_1.jsxs("div", { children: [
124
127
  jsx_runtime_1.jsx("h3", { style: title, children: label }), jsx_runtime_1.jsx("p", { style: packageNameStyle, children: packageName })
125
- ] }), installed ? null : (jsx_runtime_1.jsx(Button_1.Button, { disabled: installState.type === 'installing', onClick: install, size: "compact", style: installButton, children: installState.type === 'installing' ? 'Installing…' : 'Install' }))] }), installed ? (jsx_runtime_1.jsx(react_1.Suspense, { fallback: jsx_runtime_1.jsx("p", { style: missingText, children: "Loading models\u2026" }), children: children })) : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
126
- jsx_runtime_1.jsxs("p", { style: missingDescription, children: ["Install the package and ", optional_package_dependencies_1.TRANSFORMERS_PACKAGE, " to download and manage its models."] }), installState.type === 'error' ? (jsx_runtime_1.jsx("p", { style: errorStyle, children: installState.message })) : null] }))] }));
128
+ ] }), installed || !canInstall ? null : (jsx_runtime_1.jsx(Button_1.Button, { disabled: installState.type === 'installing', onClick: install, size: "compact", style: installButton, children: installState.type === 'installing' ? 'Installing…' : 'Install' }))] }), installed ? (jsx_runtime_1.jsx(react_1.Suspense, { fallback: jsx_runtime_1.jsx("p", { style: missingText, children: "Loading models\u2026" }), children: children })) : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
129
+ jsx_runtime_1.jsx("p", { style: missingDescription, children: canInstall
130
+ ? `Install the package and ${optional_package_dependencies_1.TRANSFORMERS_PACKAGE} to download and manage its models.`
131
+ : 'Reconnect the Studio server to install this package and manage its models.' }), installState.type === 'error' ? (jsx_runtime_1.jsx("p", { style: errorStyle, children: installState.message })) : null] }))] }));
127
132
  };
128
133
  const ModelsSettings = () => {
134
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
135
+ const canInstall = (0, settings_tab_availability_1.canInstallPackagesInStudio)({
136
+ isBrowserStudio: (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null,
137
+ previewServerConnected: previewServerState.type === 'connected',
138
+ readOnlyStudio: window.remotion_isReadOnlyStudio,
139
+ });
129
140
  return (jsx_runtime_1.jsxs("div", { style: container, children: [
130
- jsx_runtime_1.jsx("p", { style: overview, children: "Models are downloaded automatically when needed. You can also manage the browser cache here." }), jsx_runtime_1.jsx(OptionalModelPackage, { label: "Transcription", packageName: whisper_webgpu_capability_1.WHISPER_WEBGPU_PACKAGE, style: section, children: jsx_runtime_1.jsx(LazyWhisperModels, { description: null, indent: false, visible: true }) }), jsx_runtime_1.jsx(OptionalModelPackage, { label: "Video matting", packageName: video_matting_capability_1.VIDEO_MATTING_PACKAGE, style: lastSection, children: jsx_runtime_1.jsx(LazyVideoMattingModels, { description: null, indent: false, visible: true }) })
141
+ jsx_runtime_1.jsx("p", { style: overview, children: "Models are downloaded automatically when needed. You can also manage the browser cache here." }), jsx_runtime_1.jsx(OptionalModelPackage, { canInstall: canInstall, label: "Transcription", packageName: whisper_webgpu_capability_1.WHISPER_WEBGPU_PACKAGE, style: section, children: jsx_runtime_1.jsx(LazyWhisperModels, { description: null, indent: false, visible: true }) }), jsx_runtime_1.jsx(OptionalModelPackage, { canInstall: canInstall, label: "Video matting", packageName: video_matting_capability_1.VIDEO_MATTING_PACKAGE, style: lastSection, children: jsx_runtime_1.jsx(LazyVideoMattingModels, { description: null, indent: false, visible: true }) })
131
142
  ] }));
132
143
  };
133
144
  exports.ModelsSettings = ModelsSettings;
@@ -10,6 +10,7 @@ const media_volume_1 = require("../icons/media-volume");
10
10
  const mute_1 = require("../state/mute");
11
11
  const ActionTooltip_1 = require("./ActionTooltip");
12
12
  const ControlButton_1 = require("./ControlButton");
13
+ const buttonStyle = { width: 30 };
13
14
  const toggleMute = (setMuted) => {
14
15
  setMuted((muted) => {
15
16
  (0, mute_1.persistMuteOption)(!muted);
@@ -25,6 +26,6 @@ const MuteToggle = ({ muted, setMuted }) => {
25
26
  (0, exports.toggleMute)(setMuted);
26
27
  }, [setMuted]);
27
28
  const accessibilityLabel = muted ? 'Unmute video' : 'Mute video';
28
- return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: accessibilityLabel, shortcut: shortcutsDisabled ? null : shortcut, delay: 800, dismissOnClick: false, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: "", "aria-label": accessibilityLabel, "aria-keyshortcuts": shortcutsDisabled ? undefined : ariaShortcut || undefined, onClick: onClick, children: (color) => muted ? (jsx_runtime_1.jsx(media_volume_1.VolumeOffIcon, { color: colors_1.BLUE })) : (jsx_runtime_1.jsx(media_volume_1.VolumeOnIcon, { color: color })) }) }));
29
+ return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Mute", shortcut: shortcutsDisabled ? null : shortcut, delay: 800, dismissOnClick: false, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: "", "aria-label": accessibilityLabel, "aria-keyshortcuts": shortcutsDisabled ? undefined : ariaShortcut || undefined, onClick: onClick, style: buttonStyle, children: (color) => muted ? (jsx_runtime_1.jsx(media_volume_1.VolumeOffIcon, { color: colors_1.BLUE })) : (jsx_runtime_1.jsx(media_volume_1.VolumeOnIcon, { color: color })) }) }));
29
30
  };
30
31
  exports.MuteToggle = MuteToggle;
@@ -80,6 +80,7 @@ const CodemodFooter = ({ codemod, stack, valid, loadingNotification, errorNotifi
80
80
  dryRun: true,
81
81
  symbolicatedStack,
82
82
  signal,
83
+ undoRedoNavigation: null,
83
84
  });
84
85
  if (res.success) {
85
86
  setCanApplyCodemod({ type: 'success', diff: res.diff });
@@ -3,6 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DeleteComposition = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const url_state_1 = require("../../helpers/url-state");
8
+ const InitialCompositionLoader_1 = require("../InitialCompositionLoader");
9
+ const load_canvas_content_from_url_1 = require("../load-canvas-content-from-url");
6
10
  const styles_1 = require("../Menu/styles");
7
11
  const ModalFooter_1 = require("../ModalFooter");
8
12
  const ModalHeader_1 = require("../ModalHeader");
@@ -24,6 +28,10 @@ const DeleteCompositionLoaded = ({ compositionId }) => {
24
28
  }
25
29
  const { unresolved } = context;
26
30
  const compositionStack = (_a = unresolved.stack) !== null && _a !== void 0 ? _a : null;
31
+ const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
32
+ const { setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionSetters);
33
+ const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
34
+ const navigationAfterDelete = (0, react_1.useRef)(undefined);
27
35
  const codemod = (0, react_1.useMemo)(() => {
28
36
  return {
29
37
  type: 'delete-composition',
@@ -33,18 +41,46 @@ const DeleteCompositionLoaded = ({ compositionId }) => {
33
41
  const onSubmit = (0, react_1.useCallback)((e) => {
34
42
  e.preventDefault();
35
43
  }, []);
44
+ const onSuccess = (0, react_1.useCallback)(() => {
45
+ if (navigationAfterDelete.current === undefined) {
46
+ return;
47
+ }
48
+ if (navigationAfterDelete.current === null) {
49
+ (0, url_state_1.pushUrl)('/');
50
+ setCanvasContent(null);
51
+ return;
52
+ }
53
+ selectComposition(navigationAfterDelete.current, true);
54
+ }, [selectComposition, setCanvasContent]);
36
55
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
37
56
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: 'Delete composition' }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
38
57
  jsx_runtime_1.jsxs("div", { style: content, children: ["Do you want to delete the", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: unresolved.durationInFrames === 1 ? `<Still>` : '<Composition>' }), ' ', "with ID ", '"', unresolved.id, '"', "?",
39
58
  jsx_runtime_1.jsx("br", {}),
40
59
  "The associated ",
41
60
  jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: "component" }),
42
- " will remain in your code."] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { errorNotification: `Could not delete composition`, loadingNotification: 'Deleting', genericSubmitLabel: `Delete`, submitLabel: ({ relativeRootPath }) => `Delete from ${relativeRootPath}`, codemod: codemod, stack: compositionStack, valid: true, onSuccess: null, applyCodemod: ({ signal, symbolicatedStack }) => (0, actions_1.applyCodemod)({
43
- codemod,
44
- dryRun: false,
45
- signal,
46
- symbolicatedStack,
47
- }), applyCodemodForPreview: null }) })
61
+ " will remain in your code."] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { errorNotification: `Could not delete composition`, loadingNotification: 'Deleting', genericSubmitLabel: `Delete`, submitLabel: ({ relativeRootPath }) => `Delete from ${relativeRootPath}`, codemod: codemod, stack: compositionStack, valid: true, onSuccess: onSuccess, applyCodemod: ({ signal, symbolicatedStack }) => {
62
+ var _a;
63
+ const currentRoute = (0, url_state_1.getRoute)();
64
+ const currentCanvasContent = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
65
+ const isSelected = (currentCanvasContent === null || currentCanvasContent === void 0 ? void 0 : currentCanvasContent.type) === 'composition' &&
66
+ currentCanvasContent.compositionId === compositionId;
67
+ const fallback = isSelected
68
+ ? ((_a = compositions.find(({ id }) => id !== compositionId)) !== null && _a !== void 0 ? _a : null)
69
+ : undefined;
70
+ navigationAfterDelete.current = fallback;
71
+ return (0, actions_1.applyCodemod)({
72
+ codemod,
73
+ dryRun: false,
74
+ signal,
75
+ symbolicatedStack,
76
+ undoRedoNavigation: fallback === undefined
77
+ ? null
78
+ : {
79
+ undoRoute: currentRoute,
80
+ redoRoute: fallback === null ? '/' : `/${fallback.id}`,
81
+ },
82
+ });
83
+ }, applyCodemodForPreview: null }) })
48
84
  ] })
49
85
  ] }));
50
86
  };
@@ -38,6 +38,7 @@ const DeleteFolder = ({ folderName, parentName, stack }) => {
38
38
  dryRun: false,
39
39
  signal,
40
40
  symbolicatedStack,
41
+ undoRedoNavigation: null,
41
42
  }), applyCodemodForPreview: null }) })
42
43
  ] })
43
44
  ] }));
@@ -208,11 +208,16 @@ const DuplicateCompositionLoaded = ({ initialType }) => {
208
208
  dryRun: false,
209
209
  signal,
210
210
  symbolicatedStack,
211
+ undoRedoNavigation: {
212
+ undoRoute: (0, url_state_1.getRoute)(),
213
+ redoRoute: `/${newId}`,
214
+ },
211
215
  }), applyCodemodForPreview: ({ signal, symbolicatedStack }) => (0, duplicate_composition_api_1.duplicateComposition)({
212
216
  codemod,
213
217
  dryRun: true,
214
218
  signal,
215
219
  symbolicatedStack,
220
+ undoRedoNavigation: null,
216
221
  }) }) })
217
222
  ] })
218
223
  ] }));
@@ -490,11 +490,11 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
490
490
  event: e.nativeEvent,
491
491
  captureTarget: target,
492
492
  onMove: moveListener,
493
- onEnd: (reason) => {
493
+ onEnd: (reason, endEvent) => {
494
494
  pointerDownRef.current = false;
495
495
  setDragging(false);
496
496
  (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
497
- const commit = reason === 'pointerup' || reason === 'buttons-released';
497
+ const commit = (0, pointer_session_1.isPointerSessionRelease)(reason, endEvent);
498
498
  if (commit && lastDragValue !== null && onValueChangeEnd) {
499
499
  onValueChangeEnd(lastDragValue, 'drag');
500
500
  }
@@ -4,8 +4,11 @@ exports.NewFolder = 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 create_folder_tree_1 = require("../../helpers/create-folder-tree");
8
+ const persist_open_folders_1 = require("../../helpers/persist-open-folders");
7
9
  const slugify_name_1 = require("../../helpers/slugify-name");
8
10
  const validate_new_folder_name_1 = require("../../helpers/validate-new-folder-name");
11
+ const folders_1 = require("../../state/folders");
9
12
  const layout_1 = require("../layout");
10
13
  const ModalFooter_1 = require("../ModalFooter");
11
14
  const ModalHeader_1 = require("../ModalHeader");
@@ -24,6 +27,10 @@ const content = {
24
27
  fontSize: 13,
25
28
  minWidth: 500,
26
29
  };
30
+ const parentNameStyle = {
31
+ ...layout_2.rightRow,
32
+ fontSize: 13,
33
+ };
27
34
  const getUniqueFolderName = ({ folders, parentName, }) => {
28
35
  let counter = 1;
29
36
  while (true) {
@@ -37,6 +44,7 @@ const getUniqueFolderName = ({ folders, parentName, }) => {
37
44
  };
38
45
  const NewFolder = ({ parentName, stack }) => {
39
46
  const { folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
47
+ const { setCompositionFoldersExpanded } = (0, react_1.useContext)(folders_1.FolderContext);
40
48
  const [newName, setName] = (0, react_1.useState)(() => getUniqueFolderName({ folders, parentName }));
41
49
  const inputRef = (0, react_1.useRef)(null);
42
50
  (0, react_1.useEffect)(() => {
@@ -63,21 +71,40 @@ const NewFolder = ({ parentName, stack }) => {
63
71
  const onSubmit = (0, react_1.useCallback)((e) => {
64
72
  e.preventDefault();
65
73
  }, []);
74
+ const onSuccess = (0, react_1.useCallback)(() => {
75
+ if (parentName === null) {
76
+ return;
77
+ }
78
+ const parentFolder = (0, create_folder_tree_1.splitParentIntoNameAndParent)(parentName);
79
+ const parentFolderName = parentFolder.name;
80
+ if (parentFolderName === null) {
81
+ return;
82
+ }
83
+ setCompositionFoldersExpanded((previousState) => {
84
+ const foldersExpanded = { ...previousState };
85
+ for (const key of (0, create_folder_tree_1.getKeysToExpand)(parentFolderName, parentFolder.parent)) {
86
+ foldersExpanded[key] = true;
87
+ }
88
+ (0, persist_open_folders_1.persistExpandedFolders)('compositions', foldersExpanded);
89
+ return foldersExpanded;
90
+ });
91
+ }, [parentName, setCompositionFoldersExpanded]);
66
92
  return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
67
93
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "New folder" }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
68
94
  jsx_runtime_1.jsxs("div", { style: content, children: [parentName ? (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
69
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Parent" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: parentName })
95
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Parent" }), jsx_runtime_1.jsx("div", { style: parentNameStyle, children: parentName })
70
96
  ] })) : null, jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
71
97
  jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Name" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
72
98
  jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, value: newName, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Folder name", status: "ok", rightAlign: true }), jsx_runtime_1.jsx(SlugPreview_1.SlugPreview, { action: "create", currentName: null, input: newName, slug: folderName }), folderNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
73
99
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: folderNameErrMessage, type: "error" })
74
100
  ] })) : null] }) })
75
101
  ] })
76
- ] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: 'Creating folder...', errorNotification: 'Could not create folder', genericSubmitLabel: 'Add to root file', submitLabel: ({ relativeRootPath }) => `Add to ${relativeRootPath}`, codemod: codemod, stack: stack, valid: valid, onSuccess: null, fallbackToRootFile: true, applyCodemod: ({ signal, symbolicatedStack }) => (0, actions_1.applyCodemod)({
102
+ ] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: 'Creating folder...', errorNotification: 'Could not create folder', genericSubmitLabel: 'Add to root file', submitLabel: ({ relativeRootPath }) => `Add to ${relativeRootPath}`, codemod: codemod, stack: stack, valid: valid, onSuccess: onSuccess, fallbackToRootFile: true, applyCodemod: ({ signal, symbolicatedStack }) => (0, actions_1.applyCodemod)({
77
103
  codemod,
78
104
  dryRun: false,
79
105
  signal,
80
106
  symbolicatedStack,
107
+ undoRedoNavigation: null,
81
108
  }), applyCodemodForPreview: null }) })
82
109
  ] })
83
110
  ] }));
@@ -72,6 +72,7 @@ const RenameFolder = ({ folderName, parentName, stack }) => {
72
72
  dryRun: false,
73
73
  signal,
74
74
  symbolicatedStack,
75
+ undoRedoNavigation: null,
75
76
  }), applyCodemodForPreview: null }) })
76
77
  ] })
77
78
  ] }));
@@ -1,5 +1,5 @@
1
- import type { DuplicateCompositionResponse, SymbolicatedStackFrame } from '@remotion/studio-shared';
2
- export declare const duplicateComposition: ({ codemod, dryRun, signal, symbolicatedStack, }: {
1
+ import type { DuplicateCompositionResponse, SymbolicatedStackFrame, UndoRedoNavigation } from '@remotion/studio-shared';
2
+ export declare const duplicateComposition: ({ codemod, dryRun, signal, symbolicatedStack, undoRedoNavigation, }: {
3
3
  codemod: {
4
4
  type: "duplicate-composition";
5
5
  idToDuplicate: string;
@@ -13,4 +13,5 @@ export declare const duplicateComposition: ({ codemod, dryRun, signal, symbolica
13
13
  dryRun: boolean;
14
14
  signal: AbortSignal;
15
15
  symbolicatedStack: SymbolicatedStackFrame | null;
16
+ undoRedoNavigation: UndoRedoNavigation | null;
16
17
  }) => Promise<DuplicateCompositionResponse>;