@remotion/studio 4.0.513 → 4.0.514

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 (174) hide show
  1. package/dist/Studio.js +2 -1
  2. package/dist/components/AskAiModal.js +1 -1
  3. package/dist/components/AssetSelector.js +2 -0
  4. package/dist/components/AssetSelectorItem.js +1 -2
  5. package/dist/components/AudioWaveform.d.ts +3 -0
  6. package/dist/components/AudioWaveform.js +55 -67
  7. package/dist/components/Canvas.js +40 -5
  8. package/dist/components/CanvasOrLoading.js +5 -0
  9. package/dist/components/CompositionSelector.js +2 -0
  10. package/dist/components/ConfigureDefaultEditorModal.js +17 -11
  11. package/dist/components/Editor.js +16 -1
  12. package/dist/components/ElementInstallConfirmation.d.ts +1 -0
  13. package/dist/components/ElementInstallConfirmation.js +4 -2
  14. package/dist/components/FixComputedValueModal.d.ts +9 -0
  15. package/dist/components/FixComputedValueModal.js +217 -0
  16. package/dist/components/InitialCompositionLoader.js +19 -0
  17. package/dist/components/InlineDropdown.js +4 -4
  18. package/dist/components/InspectorInfoHeader.js +3 -3
  19. package/dist/components/InspectorOpenInEditor.js +3 -1
  20. package/dist/components/InspectorPanel/CompositionInspector.js +11 -1
  21. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +2 -2
  22. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +1 -1
  23. package/dist/components/InspectorPanel/EasingInspector.js +1 -1
  24. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -2
  25. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +1 -1
  26. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +35 -6
  27. package/dist/components/InspectorPanel/common.d.ts +5 -5
  28. package/dist/components/InspectorPanel/common.js +8 -8
  29. package/dist/components/InspectorPanel/styles.d.ts +1 -1
  30. package/dist/components/InspectorPanel/styles.js +4 -2
  31. package/dist/components/InspectorSourceLocation.d.ts +1 -1
  32. package/dist/components/InspectorSourceLocation.js +2 -2
  33. package/dist/components/LicenseKeyValidation.js +2 -2
  34. package/dist/components/Modals.js +2 -1
  35. package/dist/components/NewComposition/CodemodFooter.d.ts +1 -0
  36. package/dist/components/NewComposition/CodemodFooter.js +10 -8
  37. package/dist/components/NewComposition/DeleteComposition.js +1 -1
  38. package/dist/components/NewComposition/DeleteFolder.js +1 -1
  39. package/dist/components/NewComposition/DuplicateComposition.js +7 -2
  40. package/dist/components/NewComposition/NewComposition.js +1 -1
  41. package/dist/components/NewComposition/NewFolder.js +1 -1
  42. package/dist/components/NewComposition/RenameComposition.js +1 -1
  43. package/dist/components/NewComposition/RenameFolder.js +1 -1
  44. package/dist/components/NewComposition/duplicate-composition-api.d.ts +16 -0
  45. package/dist/components/NewComposition/duplicate-composition-api.js +16 -0
  46. package/dist/components/NoRegisterRoot.js +1 -1
  47. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +4 -3
  48. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  49. package/dist/components/QuickSwitcher/fuzzy-search.js +1 -1
  50. package/dist/components/RefreshCompositionOverlay.js +1 -1
  51. package/dist/components/RenderButton.js +6 -3
  52. package/dist/components/RenderModal/WebRenderModal.js +6 -2
  53. package/dist/components/RenderModal/WebRenderModalAdvanced.d.ts +2 -0
  54. package/dist/components/RenderModal/WebRenderModalAdvanced.js +9 -2
  55. package/dist/components/RenderModal/render-modals.js +5 -1
  56. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +5 -1
  57. package/dist/components/RenderQueue/actions.js +12 -2
  58. package/dist/components/RenderQueue/client-side-render-types.d.ts +1 -0
  59. package/dist/components/RenderingSettings.d.ts +2 -0
  60. package/dist/components/RenderingSettings.js +355 -0
  61. package/dist/components/SelectedOutlineElement.js +3 -3
  62. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  63. package/dist/components/SelectedOutlinePolygon.js +53 -9
  64. package/dist/components/SettingsContext.d.ts +4 -1
  65. package/dist/components/SettingsContext.js +9 -2
  66. package/dist/components/SettingsModal.d.ts +1 -1
  67. package/dist/components/SettingsModal.js +10 -1
  68. package/dist/components/SettingsModalFooter.js +1 -1
  69. package/dist/components/StudioSettings.d.ts +2 -0
  70. package/dist/components/StudioSettings.js +185 -0
  71. package/dist/components/Timeline/LoopedIndicator.js +1 -1
  72. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +3 -0
  73. package/dist/components/Timeline/LoopedTimelineIndicators.js +22 -14
  74. package/dist/components/Timeline/Timeline.js +11 -9
  75. package/dist/components/Timeline/TimelineAssetField.d.ts +2 -2
  76. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  77. package/dist/components/Timeline/TimelineDragHandler.js +62 -76
  78. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  79. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +4 -2
  80. package/dist/components/Timeline/TimelineEffectPropItem.js +16 -11
  81. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -1
  82. package/dist/components/Timeline/TimelineExpandedRow.js +4 -4
  83. package/dist/components/Timeline/TimelineExpandedSection.js +1 -1
  84. package/dist/components/Timeline/TimelineHeightContainer.d.ts +0 -4
  85. package/dist/components/Timeline/TimelineHeightContainer.js +4 -4
  86. package/dist/components/Timeline/TimelineImageInfo.d.ts +1 -0
  87. package/dist/components/Timeline/TimelineImageInfo.js +3 -2
  88. package/dist/components/Timeline/TimelineKeyframeControls.js +6 -1
  89. package/dist/components/Timeline/TimelineList.d.ts +1 -5
  90. package/dist/components/Timeline/TimelineList.js +14 -9
  91. package/dist/components/Timeline/TimelinePinchZoom.js +5 -5
  92. package/dist/components/Timeline/TimelineRowChrome.d.ts +0 -2
  93. package/dist/components/Timeline/TimelineRowChrome.js +12 -5
  94. package/dist/components/Timeline/TimelineSchemaField.d.ts +7 -3
  95. package/dist/components/Timeline/TimelineSchemaField.js +71 -13
  96. package/dist/components/Timeline/TimelineScrollable.js +3 -1
  97. package/dist/components/Timeline/TimelineSelection.d.ts +5 -2
  98. package/dist/components/Timeline/TimelineSelection.js +90 -103
  99. package/dist/components/Timeline/TimelineSequence.js +59 -25
  100. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -1
  101. package/dist/components/Timeline/TimelineSequenceItem.js +15 -9
  102. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +2 -1
  103. package/dist/components/Timeline/TimelineSequencePropItem.js +3 -3
  104. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +33 -10
  105. package/dist/components/Timeline/TimelineSlider.js +42 -33
  106. package/dist/components/Timeline/TimelineTimeIndicators.js +90 -98
  107. package/dist/components/Timeline/TimelineTracks.d.ts +0 -2
  108. package/dist/components/Timeline/TimelineTracks.js +11 -4
  109. package/dist/components/Timeline/TimelineTransformOriginField.js +1 -1
  110. package/dist/components/Timeline/TimelineVideoInfo.d.ts +4 -4
  111. package/dist/components/Timeline/TimelineVideoInfo.js +151 -61
  112. package/dist/components/Timeline/TimelineViewport.d.ts +12 -0
  113. package/dist/components/Timeline/TimelineViewport.js +62 -0
  114. package/dist/components/Timeline/TimelineVirtualization.d.ts +22 -0
  115. package/dist/components/Timeline/TimelineVirtualization.js +144 -0
  116. package/dist/components/Timeline/TimelineZoomControls.js +16 -8
  117. package/dist/components/Timeline/call-add-keyframe.js +31 -3
  118. package/dist/components/Timeline/call-delete-keyframe.js +13 -3
  119. package/dist/components/Timeline/call-move-keyframe.js +11 -1
  120. package/dist/components/Timeline/call-update-keyframe-settings.js +31 -3
  121. package/dist/components/Timeline/delete-selected-timeline-item.js +2 -1
  122. package/dist/components/Timeline/get-timeline-keyframes.d.ts +1 -2
  123. package/dist/components/Timeline/get-timeline-keyframes.js +1 -8
  124. package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +30 -0
  125. package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +61 -0
  126. package/dist/components/Timeline/split-selected-timeline-item.js +2 -2
  127. package/dist/components/Timeline/timeline-scroll-logic.d.ts +24 -0
  128. package/dist/components/Timeline/timeline-scroll-logic.js +127 -4
  129. package/dist/components/Timeline/use-timeline-height.d.ts +3 -5
  130. package/dist/components/Timeline/use-timeline-height.js +16 -18
  131. package/dist/components/UpdateCheck.d.ts +2 -10
  132. package/dist/components/UpdateCheck.js +8 -2
  133. package/dist/components/VisualControls/VisualControlHandle.js +8 -0
  134. package/dist/components/delete-jsx-node-api.d.ts +2 -0
  135. package/dist/components/delete-jsx-node-api.js +12 -0
  136. package/dist/components/element-install-api.d.ts +3 -0
  137. package/dist/components/element-install-api.js +19 -0
  138. package/dist/components/import-assets.js +20 -9
  139. package/dist/components/reorder-sequence-api.d.ts +2 -0
  140. package/dist/components/reorder-sequence-api.js +12 -0
  141. package/dist/components/split-jsx-sequence-api.d.ts +2 -0
  142. package/dist/components/split-jsx-sequence-api.js +12 -0
  143. package/dist/components/split-video-from-audio-api.d.ts +2 -0
  144. package/dist/components/split-video-from-audio-api.js +12 -0
  145. package/dist/error-overlay/remotion-overlay/Overlay.js +1 -1
  146. package/dist/esm/{chunk-tv7r0jy3.js → chunk-xn2q7eem.js} +11073 -7495
  147. package/dist/esm/index.mjs +7 -5
  148. package/dist/esm/internals.mjs +11073 -7495
  149. package/dist/esm/previewEntry.mjs +10905 -7327
  150. package/dist/esm/renderEntry.mjs +2 -3
  151. package/dist/helpers/browser-studio-operations.d.ts +2 -0
  152. package/dist/helpers/browser-studio-operations.js +10 -1
  153. package/dist/helpers/get-timeline-max-zoom.d.ts +26 -0
  154. package/dist/helpers/get-timeline-max-zoom.js +45 -0
  155. package/dist/helpers/inject-css.js +2 -2
  156. package/dist/helpers/render-codec-label.d.ts +1 -1
  157. package/dist/helpers/retry-payload.js +1 -0
  158. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  159. package/dist/helpers/studio-runtime-config.js +2 -3
  160. package/dist/helpers/timeline-layout.d.ts +3 -1
  161. package/dist/helpers/timeline-layout.js +6 -1
  162. package/dist/helpers/url-state.js +3 -2
  163. package/dist/helpers/use-menu-structure.js +1 -5
  164. package/dist/helpers/use-runtime-values.d.ts +2 -1
  165. package/dist/helpers/use-runtime-values.js +7 -3
  166. package/dist/icons/remotion-triangle.d.ts +2 -0
  167. package/dist/icons/remotion-triangle.js +7 -0
  168. package/dist/renderEntry.js +1 -1
  169. package/dist/state/composition-list.d.ts +13 -0
  170. package/dist/state/composition-list.js +21 -0
  171. package/dist/state/modals.d.ts +7 -1
  172. package/dist/state/timeline-zoom.d.ts +1 -2
  173. package/dist/state/timeline-zoom.js +9 -5
  174. package/package.json +14 -13
package/dist/Studio.js CHANGED
@@ -12,13 +12,14 @@ const use_static_files_1 = require("./components/use-static-files");
12
12
  const FastRefreshProvider_1 = require("./FastRefreshProvider");
13
13
  const inject_css_1 = require("./helpers/inject-css");
14
14
  const ResolveCompositionConfigInStudio_1 = require("./ResolveCompositionConfigInStudio");
15
+ const composition_list_1 = require("./state/composition-list");
15
16
  const getServerDisconnectedDomElement = () => {
16
17
  return document.getElementById('server-disconnected-overlay');
17
18
  };
18
19
  const StudioInner = ({ rootComponent, readOnly }) => {
19
20
  var _a, _b, _c;
20
21
  return (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], initialCanvasContent: null, children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: window.remotion_numberOfAudioTags, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', previewSampleRate: window.remotion_previewSampleRate, _experimentalKeepAudioContextAlive: (_c = window.remotion_experimentalKeepAudioContextAlive) !== null && _c !== void 0 ? _c : false, children: jsx_runtime_1.jsx(use_static_files_1.StaticFilesProvider, { children: jsx_runtime_1.jsx(ResolveCompositionConfigInStudio_1.ResolveCompositionConfigInStudio, { children: jsx_runtime_1.jsxs(EditorContexts_1.EditorContexts, { children: [
21
- jsx_runtime_1.jsx(Editor_1.Editor, { readOnlyStudio: readOnly, Root: rootComponent }), readOnly
22
+ jsx_runtime_1.jsx(composition_list_1.CompositionListProvider, { children: jsx_runtime_1.jsx(Editor_1.Editor, { readOnlyStudio: readOnly, Root: rootComponent }) }), readOnly
22
23
  ? null
23
24
  : (0, react_dom_1.createPortal)(jsx_runtime_1.jsx(ServerDisconnected_1.ServerDisconnected, {}), getServerDisconnectedDomElement())] }) }) }) }) }));
24
25
  };
@@ -63,7 +63,7 @@ const AskAiModal = () => {
63
63
  if (state === 'never-opened') {
64
64
  return null;
65
65
  }
66
- return (jsx_runtime_1.jsx(remotion_1.AbsoluteFill, { style: { display: state === 'visible' ? 'block' : 'none' }, children: jsx_runtime_1.jsxs(ModalContainer_1.ModalContainer, { noZIndex: state === 'hidden', onOutsideClick: onQuit, onEscape: onQuit, children: [
66
+ return (jsx_runtime_1.jsx(remotion_1.Internals.AbsoluteFillElement, { style: { display: state === 'visible' ? 'block' : 'none' }, children: jsx_runtime_1.jsxs(ModalContainer_1.ModalContainer, { noZIndex: state === 'hidden', onOutsideClick: onQuit, onEscape: onQuit, children: [
67
67
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Ask AI", onClose: onQuit }), jsx_runtime_1.jsx("iframe", { ref: iframe, frameBorder: 0, style: container, src: "https://www.remotion.dev/ai-embed", allow: "clipboard-read; clipboard-write" })
68
68
  ] }) }));
69
69
  };
@@ -75,6 +75,8 @@ const label = {
75
75
  };
76
76
  const baseList = {
77
77
  overflowY: 'auto',
78
+ paddingTop: 4,
79
+ paddingBottom: 4,
78
80
  };
79
81
  const AssetSelector = ({ readOnlyStudio }) => {
80
82
  const { tabIndex } = (0, z_index_1.useZIndex)();
@@ -80,11 +80,10 @@ const itemStyle = {
80
80
  alignItems: 'center',
81
81
  marginBottom: 1,
82
82
  marginLeft: 4,
83
- marginRight: 4,
84
83
  appearance: 'none',
85
84
  border: 'none',
86
85
  borderRadius: 4,
87
- width: 'calc(100% - 8px)',
86
+ width: 'calc(100% - 4px)',
88
87
  textAlign: 'left',
89
88
  backgroundColor: colors_1.BACKGROUND,
90
89
  height: layout_1.COMPACT_CONTROL_ROW_HEIGHT,
@@ -6,8 +6,11 @@ export declare const AudioWaveform: React.NamedExoticComponent<{
6
6
  readonly visualizationWidth: number;
7
7
  readonly startFrom: number;
8
8
  readonly durationInFrames: number;
9
+ readonly displayOffsetInFrames: number;
10
+ readonly displayDurationInFrames: number;
9
11
  readonly volume: string | number;
10
12
  readonly doesVolumeChange: boolean;
13
+ readonly muted: boolean;
11
14
  readonly playbackRate: number;
12
15
  readonly loopDisplay: LoopDisplay | undefined;
13
16
  }>;
@@ -74,6 +74,8 @@ const waveformCanvasStyle = {
74
74
  };
75
75
  const volumeCanvasStyle = {
76
76
  position: 'absolute',
77
+ width: '100%',
78
+ height: '100%',
77
79
  };
78
80
  const parseVolume = (volume) => {
79
81
  if (typeof volume === 'number') {
@@ -81,35 +83,7 @@ const parseVolume = (volume) => {
81
83
  }
82
84
  return volume.split(',').map((v) => Number(v));
83
85
  };
84
- const drawLoopedWaveform = ({ canvas, peaks, volume, visualizationWidth, loopWidth, }) => {
85
- const h = canvas.height;
86
- const w = Math.ceil(visualizationWidth);
87
- const targetCanvas = document.createElement('canvas');
88
- targetCanvas.width = Math.max(1, Math.ceil(loopWidth));
89
- targetCanvas.height = h;
90
- (0, timeline_utils_1.drawBars)({
91
- canvas: targetCanvas,
92
- peaks,
93
- color: colors_1.WHITE_ALPHA_60,
94
- volume,
95
- width: targetCanvas.width,
96
- });
97
- canvas.width = w;
98
- canvas.height = h;
99
- const ctx = canvas.getContext('2d');
100
- if (!ctx) {
101
- throw new Error('Failed to get canvas context');
102
- }
103
- const pattern = ctx.createPattern(targetCanvas, 'repeat-x');
104
- if (!pattern) {
105
- return;
106
- }
107
- pattern.setTransform(new DOMMatrix().scaleSelf(loopWidth / targetCanvas.width, 1));
108
- ctx.clearRect(0, 0, w, h);
109
- ctx.fillStyle = pattern;
110
- ctx.fillRect(0, 0, w, h);
111
- };
112
- const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualizationWidth, volume, doesVolumeChange, playbackRate, loopDisplay, }) => {
86
+ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, displayOffsetInFrames, displayDurationInFrames, visualizationWidth, volume, doesVolumeChange, muted, playbackRate, loopDisplay, }) => {
113
87
  const [peaks, setPeaks] = (0, react_1.useState)(null);
114
88
  const [error, setError] = (0, react_1.useState)(null);
115
89
  const [waveformCanvasKey, setWaveformCanvasKey] = (0, react_1.useState)(0);
@@ -125,6 +99,23 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
125
99
  const latestRequestId = (0, react_1.useRef)(0);
126
100
  const shouldRenderVolumeOverlay = doesVolumeChange && typeof volume === 'string';
127
101
  const parsedVolume = (0, react_1.useMemo)(() => parseVolume(volume), [volume]);
102
+ const visibleVolume = (0, react_1.useMemo)(() => {
103
+ if (muted) {
104
+ return 0;
105
+ }
106
+ return (0, timeline_utils_1.getVisibleWaveformVolume)({
107
+ displayDurationInFrames,
108
+ displayOffsetInFrames,
109
+ loopDisplay,
110
+ volume: parsedVolume,
111
+ });
112
+ }, [
113
+ displayDurationInFrames,
114
+ displayOffsetInFrames,
115
+ loopDisplay,
116
+ muted,
117
+ parsedVolume,
118
+ ]);
128
119
  (0, react_1.useEffect)(() => {
129
120
  if (canUseWorkerPath) {
130
121
  return;
@@ -203,17 +194,20 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
203
194
  if (canUseWorkerPath || !peaks) {
204
195
  return null;
205
196
  }
206
- return (0, timeline_utils_1.sliceWaveformPeaks)({
207
- durationInFrames: (0, timeline_utils_1.shouldTileLoopDisplay)(loopDisplay)
208
- ? loopDisplay.durationInFrames
209
- : durationInFrames,
197
+ return (0, timeline_utils_1.sliceVisibleWaveformPeaks)({
198
+ displayDurationInFrames,
199
+ displayOffsetInFrames,
200
+ durationInFrames,
210
201
  fps: vidConf.fps,
202
+ loopDisplay,
211
203
  peaks,
212
204
  playbackRate,
213
205
  startFrom,
214
206
  });
215
207
  }, [
216
208
  canUseWorkerPath,
209
+ displayDurationInFrames,
210
+ displayOffsetInFrames,
217
211
  durationInFrames,
218
212
  loopDisplay,
219
213
  peaks,
@@ -226,8 +220,9 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
226
220
  if (!canvasElement) {
227
221
  return;
228
222
  }
229
- const h = height;
230
- const w = Math.ceil(visualizationWidth);
223
+ const pixelRatio = window.devicePixelRatio;
224
+ const h = Math.ceil(height * pixelRatio);
225
+ const w = Math.ceil(visualizationWidth * pixelRatio);
231
226
  if (canUseWorkerPath) {
232
227
  const worker = waveformWorker.current;
233
228
  if (!worker || !hasTransferredCanvas.current) {
@@ -241,9 +236,11 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
241
236
  src,
242
237
  width: w,
243
238
  height: h,
244
- volume: parsedVolume,
239
+ volume: visibleVolume,
245
240
  startFrom,
246
241
  durationInFrames,
242
+ displayOffsetInFrames,
243
+ displayDurationInFrames,
247
244
  fps: vidConf.fps,
248
245
  playbackRate,
249
246
  loopDisplay,
@@ -253,39 +250,27 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
253
250
  }
254
251
  canvasElement.width = w;
255
252
  canvasElement.height = h;
256
- if ((0, timeline_utils_1.shouldTileLoopDisplay)(loopDisplay)) {
257
- drawLoopedWaveform({
258
- canvas: canvasElement,
259
- peaks: portionPeaks !== null && portionPeaks !== void 0 ? portionPeaks : EMPTY_PEAKS,
260
- volume: parsedVolume,
261
- visualizationWidth,
262
- loopWidth: (0, timeline_utils_1.getLoopDisplayWidth)({
263
- visualizationWidth,
264
- loopDisplay,
265
- }),
266
- });
267
- }
268
- else {
269
- (0, timeline_utils_1.drawBars)({
270
- canvas: canvasElement,
271
- peaks: portionPeaks !== null && portionPeaks !== void 0 ? portionPeaks : EMPTY_PEAKS,
272
- color: colors_1.WHITE_ALPHA_60,
273
- volume: parsedVolume,
274
- width: w,
275
- });
276
- }
253
+ (0, timeline_utils_1.drawBars)({
254
+ canvas: canvasElement,
255
+ peaks: portionPeaks !== null && portionPeaks !== void 0 ? portionPeaks : EMPTY_PEAKS,
256
+ color: colors_1.WHITE_ALPHA_60,
257
+ volume: visibleVolume,
258
+ width: w,
259
+ });
277
260
  }, [
278
261
  canUseWorkerPath,
262
+ displayDurationInFrames,
263
+ displayOffsetInFrames,
279
264
  durationInFrames,
280
265
  height,
281
266
  loopDisplay,
282
267
  playbackRate,
283
- parsedVolume,
284
268
  portionPeaks,
285
269
  src,
286
270
  startFrom,
287
271
  vidConf.fps,
288
272
  visualizationWidth,
273
+ visibleVolume,
289
274
  waveformCanvasKey,
290
275
  ]);
291
276
  (0, react_1.useEffect)(() => {
@@ -296,24 +281,26 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
296
281
  if (!volumeCanvasElement) {
297
282
  return;
298
283
  }
299
- const h = height;
284
+ const pixelRatio = window.devicePixelRatio;
285
+ const h = Math.ceil(height * pixelRatio);
286
+ const w = Math.ceil(visualizationWidth * pixelRatio);
300
287
  const context = volumeCanvasElement.getContext('2d');
301
288
  if (!context) {
302
289
  return;
303
290
  }
304
- volumeCanvasElement.width = Math.ceil(visualizationWidth);
291
+ volumeCanvasElement.width = w;
305
292
  volumeCanvasElement.height = h;
306
- context.clearRect(0, 0, visualizationWidth, h);
307
- if (!Array.isArray(parsedVolume)) {
293
+ context.clearRect(0, 0, w, h);
294
+ if (!Array.isArray(visibleVolume)) {
308
295
  return;
309
296
  }
310
297
  context.beginPath();
311
298
  context.moveTo(0, h);
312
- parsedVolume.forEach((v, index) => {
313
- const x = parsedVolume.length <= 1
299
+ visibleVolume.forEach((v, index) => {
300
+ const x = visibleVolume.length <= 1
314
301
  ? 0
315
- : (index / (parsedVolume.length - 1)) * visualizationWidth;
316
- const y = (1 - v) * (h - timeline_layout_1.TIMELINE_BORDER * 2) + 1;
302
+ : (index / (visibleVolume.length - 1)) * w;
303
+ const y = (1 - v) * (h - timeline_layout_1.TIMELINE_BORDER * 2 * pixelRatio) + pixelRatio;
317
304
  if (index === 0) {
318
305
  context.moveTo(x, y);
319
306
  }
@@ -322,8 +309,9 @@ const AudioWaveformInner = ({ src, height, startFrom, durationInFrames, visualiz
322
309
  }
323
310
  });
324
311
  context.strokeStyle = colors_1.WHITE_ALPHA_70;
312
+ context.lineWidth = pixelRatio;
325
313
  context.stroke();
326
- }, [height, parsedVolume, shouldRenderVolumeOverlay, visualizationWidth]);
314
+ }, [height, shouldRenderVolumeOverlay, visibleVolume, visualizationWidth]);
327
315
  if (error) {
328
316
  return null;
329
317
  }
@@ -9,6 +9,7 @@ const studio_protocol_1 = require("@remotion/studio-protocol");
9
9
  const react_1 = require("react");
10
10
  const remotion_1 = require("remotion");
11
11
  const get_static_files_1 = require("../api/get-static-files");
12
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
12
13
  const client_id_1 = require("../helpers/client-id");
13
14
  const clipboard_figma_1 = require("../helpers/clipboard-figma");
14
15
  const clipboard_images_1 = require("../helpers/clipboard-images");
@@ -35,6 +36,7 @@ const EditorGuides_1 = __importDefault(require("./EditorGuides"));
35
36
  const EditorRuler_1 = require("./EditorRuler");
36
37
  const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
37
38
  const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
39
+ const element_install_api_1 = require("./element-install-api");
38
40
  const element_install_request_1 = require("./element-install-request");
39
41
  const ElementInstallConfirmation_1 = require("./ElementInstallConfirmation");
40
42
  const handle_drop_1 = require("./handle-drop");
@@ -618,6 +620,33 @@ const Canvas = ({ canvasContent, size }) => {
618
620
  setPendingElementInstallRequests((requests) => [...requests, request]);
619
621
  });
620
622
  }, []);
623
+ (0, react_1.useEffect)(() => {
624
+ var _a;
625
+ var _b;
626
+ if (!canInstallElements ||
627
+ compositionFile === null ||
628
+ currentCompositionId === null) {
629
+ return;
630
+ }
631
+ const initialElement = (_b = (_a = (0, browser_studio_operations_1.getBrowserStudioOperations)()) === null || _a === void 0 ? void 0 : _a.consumeInitialElement()) !== null && _b !== void 0 ? _b : null;
632
+ if (initialElement === null) {
633
+ return;
634
+ }
635
+ (0, element_install_request_1.enqueueElementInstallRequest)({
636
+ clientId: 'browser-studio',
637
+ compositionFile,
638
+ compositionId: currentCompositionId,
639
+ createdAt: Date.now(),
640
+ element: initialElement.element,
641
+ from: null,
642
+ id: crypto.randomUUID(),
643
+ position: null,
644
+ source: {
645
+ origin: initialElement.sourceOrigin,
646
+ type: 'browser-studio-link',
647
+ },
648
+ });
649
+ }, [canInstallElements, compositionFile, currentCompositionId]);
621
650
  (0, react_1.useEffect)(() => {
622
651
  if (activeElementInstallRequest !== null ||
623
652
  pendingElementInstallRequests.length === 0) {
@@ -636,8 +665,9 @@ const Canvas = ({ canvasContent, size }) => {
636
665
  }
637
666
  let canceled = false;
638
667
  const handleInstallRequest = async () => {
668
+ var _a;
639
669
  setInstallingElementName(activeElementInstallRequest.element.displayName);
640
- const preflight = await (0, call_api_1.callApi)('/api/prepare-element-install', {
670
+ const preflight = await (0, element_install_api_1.prepareElementInstall)({
641
671
  compositionFile: activeElementInstallRequest.compositionFile,
642
672
  compositionId: activeElementInstallRequest.compositionId,
643
673
  element: activeElementInstallRequest.element,
@@ -661,12 +691,17 @@ const Canvas = ({ canvasContent, size }) => {
661
691
  .map((dependency) => dependency.version === null
662
692
  ? dependency.name
663
693
  : `${dependency.name}@${dependency.version}`);
664
- const sourceLabel = activeElementInstallRequest.source.type === 'studio-protocol'
665
- ? activeElementInstallRequest.source.origin
666
- : 'Unverified drag-and-drop payload';
694
+ const { source } = activeElementInstallRequest;
695
+ const sourceLabel = source.type === 'studio-protocol'
696
+ ? source.origin
697
+ : source.type === 'browser-studio-link'
698
+ ? ((_a = source.origin) !== null && _a !== void 0 ? _a : 'Unverified Browser Studio link')
699
+ : 'Unverified drag-and-drop payload';
700
+ const sourceIsUnverified = source.type === 'drag-and-drop' ||
701
+ (source.type === 'browser-studio-link' && source.origin === null);
667
702
  const accepted = await confirm({
668
703
  title: 'Install Element',
669
- message: (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { displayName: activeElementInstallRequest.element.displayName, sourceLabel: sourceLabel, sourceIsUnverified: activeElementInstallRequest.source.type === 'drag-and-drop', compositionId: activeElementInstallRequest.compositionId, filePath: preflight.plan.filePath, overwritesExistingFile: preflight.plan.expectedFileState.exists, dependenciesToReview: dependenciesToReview, missingPackages: missingPackages, sourceCode: activeElementInstallRequest.element.sourceCode })),
704
+ message: (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { displayName: activeElementInstallRequest.element.displayName, sourceLabel: sourceLabel, sourceIsUnverified: sourceIsUnverified, compositionId: activeElementInstallRequest.compositionId, filePath: preflight.plan.filePath, overwritesExistingFile: preflight.plan.expectedFileState.exists, dependenciesToReview: dependenciesToReview, missingPackages: missingPackages, sourceCode: activeElementInstallRequest.element.sourceCode, usesBrowserDependencyResolution: (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null })),
670
705
  confirmLabel: 'Install',
671
706
  cancelLabel: 'Cancel',
672
707
  });
@@ -6,6 +6,7 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const ErrorLoader_1 = require("../error-overlay/remotion-overlay/ErrorLoader");
8
8
  const colors_1 = require("../helpers/colors");
9
+ const composition_list_1 = require("../state/composition-list");
9
10
  const timeline_zoom_1 = require("../state/timeline-zoom");
10
11
  const Canvas_1 = require("./Canvas");
11
12
  const FramePersistor_1 = require("./FramePersistor");
@@ -29,6 +30,7 @@ const CanvasOrLoading = ({ size }) => {
29
30
  const resolved = remotion_1.Internals.useResolvedVideoConfig(null);
30
31
  const { setZoom } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
31
32
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
33
+ const { compositionListState } = (0, react_1.useContext)(composition_list_1.CompositionListContext);
32
34
  const { error: renderError } = (0, react_1.useContext)(RenderErrorContext_1.RenderErrorContext);
33
35
  (0, react_1.useEffect)(() => {
34
36
  if ((resolved === null || resolved === void 0 ? void 0 : resolved.type) !== 'success' &&
@@ -48,6 +50,9 @@ const CanvasOrLoading = ({ size }) => {
48
50
  return (jsx_runtime_1.jsx(ErrorLoading, { error: renderError, calculateMetadataContext: false }));
49
51
  }
50
52
  if (!canvasContent) {
53
+ if (compositionListState !== 'ready') {
54
+ return null;
55
+ }
51
56
  const compname = window.location.pathname.replace('/', '');
52
57
  return (jsx_runtime_1.jsx("div", { style: container, className: "css-reset", children: jsx_runtime_1.jsxs("div", { style: RunningCalculateMetadata_1.loaderLabel, children: ["Composition with ID ", compname, " not found."] }) }));
53
58
  }
@@ -116,6 +116,8 @@ const CompositionSelector = () => {
116
116
  return {
117
117
  flex: 1,
118
118
  overflowY: 'auto',
119
+ paddingTop: 4,
120
+ paddingBottom: 4,
119
121
  backgroundColor: rootDragHovered ? colors_1.WHITE_ALPHA_12 : colors_1.BACKGROUND,
120
122
  };
121
123
  }, [rootDragHovered]);
@@ -10,6 +10,7 @@ const CodingAgentIcon_1 = require("./CodingAgentIcon");
10
10
  const layout_1 = require("./layout");
11
11
  const ComboBox_1 = require("./NewComposition/ComboBox");
12
12
  const ValidationMessage_1 = require("./NewComposition/ValidationMessage");
13
+ const layout_2 = require("./RenderModal/layout");
13
14
  const SettingsContext_1 = require("./SettingsContext");
14
15
  const use_auto_save_config_1 = require("./use-auto-save-config");
15
16
  const container = {
@@ -20,7 +21,6 @@ const container = {
20
21
  };
21
22
  const content = {
22
23
  flex: 1,
23
- padding: 16,
24
24
  };
25
25
  const description = {
26
26
  color: colors_1.LIGHT_TEXT,
@@ -29,16 +29,18 @@ const description = {
29
29
  lineHeight: 1.5,
30
30
  margin: 0,
31
31
  };
32
- const title = {
33
- color: colors_1.LIGHT_TEXT,
34
- fontFamily: 'sans-serif',
35
- fontSize: 14,
36
- lineHeight: 1.5,
37
- margin: 0,
38
- };
39
32
  const comboBoxStyle = {
40
33
  boxSizing: 'border-box',
41
- width: '100%',
34
+ width: 180,
35
+ };
36
+ const rightDescription = {
37
+ ...description,
38
+ textAlign: 'right',
39
+ };
40
+ const rightColumn = {
41
+ ...layout_2.rightRow,
42
+ alignItems: 'flex-end',
43
+ flexDirection: 'column',
42
44
  };
43
45
  const appLabel = {
44
46
  display: 'flex',
@@ -192,8 +194,12 @@ const DefaultEditorSettings = () => {
192
194
  });
193
195
  const displayedError = error !== null && error !== void 0 ? error : settingsError;
194
196
  return (jsx_runtime_1.jsx("div", { style: container, children: jsx_runtime_1.jsxs("div", { style: content, children: [
195
- jsx_runtime_1.jsx("p", { style: title, children: "Default editor" }), jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), editorInfo === null && displayedError === null ? (jsx_runtime_1.jsx("p", { style: description, children: "Loading installed editors..." })) : null, (editorInfo === null || editorInfo === void 0 ? void 0 : editorInfo.installedEditors.length) === 0 ? (jsx_runtime_1.jsx("p", { style: description, children: "No supported editors were found on this computer." })) : null, editorInfo === null ? null : (jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: editorValues, selectedId: selectedEditor !== null && selectedEditor !== void 0 ? selectedEditor : NO_PREFERENCE_ID, style: comboBoxStyle, title: "Default editor" })), jsx_runtime_1.jsx(layout_1.Spacing, { y: 2, block: true }), jsx_runtime_1.jsx("p", { style: title, children: "Default coding agent" }), jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), codingAgentInfo === null && displayedError === null ? (jsx_runtime_1.jsx("p", { style: description, children: "Loading installed coding agents..." })) : null, (codingAgentInfo === null || codingAgentInfo === void 0 ? void 0 : codingAgentInfo.installedCodingAgents.length) === 0 ? (jsx_runtime_1.jsx("p", { style: description, children: "No supported coding agents were found on this computer." })) : null, codingAgentInfo === null ? null : (jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: codingAgentValues, selectedId: selectedCodingAgent !== null && selectedCodingAgent !== void 0 ? selectedCodingAgent : NO_PREFERENCE_ID, style: comboBoxStyle, title: "Default coding agent" })), displayedError ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
196
- jsx_runtime_1.jsx(layout_1.Spacing, { y: 1.5 }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: displayedError, align: "flex-start", type: "error" })
197
+ jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
198
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Default editor" }), jsx_runtime_1.jsxs("div", { style: rightColumn, children: [editorInfo === null && displayedError === null ? (jsx_runtime_1.jsx("p", { style: rightDescription, children: "Loading installed editors..." })) : null, (editorInfo === null || editorInfo === void 0 ? void 0 : editorInfo.installedEditors.length) === 0 ? (jsx_runtime_1.jsx("p", { style: rightDescription, children: "No supported editors were found on this computer." })) : null, editorInfo === null ? null : (jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: editorValues, selectedId: selectedEditor !== null && selectedEditor !== void 0 ? selectedEditor : NO_PREFERENCE_ID, style: comboBoxStyle, title: "Default editor" }))] })
199
+ ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
200
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Default coding agent" }), jsx_runtime_1.jsxs("div", { style: rightColumn, children: [codingAgentInfo === null && displayedError === null ? (jsx_runtime_1.jsx("p", { style: rightDescription, children: "Loading installed coding agents..." })) : null, (codingAgentInfo === null || codingAgentInfo === void 0 ? void 0 : codingAgentInfo.installedCodingAgents.length) === 0 ? (jsx_runtime_1.jsx("p", { style: rightDescription, children: "No supported coding agents were found on this computer." })) : null, codingAgentInfo === null ? null : (jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: codingAgentValues, selectedId: selectedCodingAgent !== null && selectedCodingAgent !== void 0 ? selectedCodingAgent : NO_PREFERENCE_ID, style: comboBoxStyle, title: "Default coding agent" }))] })
201
+ ] }), displayedError ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
202
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1.5 }), jsx_runtime_1.jsx("div", { style: { paddingLeft: 16, paddingRight: 16 }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: displayedError, align: "flex-start", type: "error" }) })
197
203
  ] })) : null] }) }));
198
204
  };
199
205
  exports.DefaultEditorSettings = DefaultEditorSettings;
@@ -44,6 +44,7 @@ const noop_1 = require("../helpers/noop");
44
44
  const studio_fit_padding_1 = require("../helpers/studio-fit-padding");
45
45
  const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
46
46
  const canvas_ref_1 = require("../state/canvas-ref");
47
+ const composition_list_1 = require("../state/composition-list");
47
48
  const scale_lock_1 = require("../state/scale-lock");
48
49
  const timeline_zoom_1 = require("../state/timeline-zoom");
49
50
  const z_index_1 = require("../state/z-index");
@@ -62,6 +63,20 @@ const background = {
62
63
  flexDirection: 'column',
63
64
  position: 'absolute',
64
65
  };
66
+ const RootCompositionLoader = ({ Root }) => {
67
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
68
+ jsx_runtime_1.jsx(Root, {}), jsx_runtime_1.jsx(CompositionListRenderMarker, {})
69
+ ] }));
70
+ };
71
+ const CompositionListRenderMarker = () => {
72
+ (0, react_1.useLayoutEffect)(() => {
73
+ composition_list_1.compositionListRenderedRef.current = true;
74
+ return () => {
75
+ composition_list_1.compositionListRenderedRef.current = false;
76
+ };
77
+ }, []);
78
+ return null;
79
+ };
65
80
  const Editor = ({ Root, readOnlyStudio }) => {
66
81
  (0, client_id_1.useStudioConfigRevision)();
67
82
  const [drawElement, setDrawElement] = (0, react_1.useState)(null);
@@ -97,7 +112,7 @@ const Editor = ({ Root, readOnlyStudio }) => {
97
112
  return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: noop_1.noop, onOutsideClick: noop_1.noop, children: jsx_runtime_1.jsx(timeline_zoom_1.TimelineZoomContext, { children: jsx_runtime_1.jsxs(SequencePropsSubscriptionProvider_1.SequencePropsSubscriptionProvider, { children: [
98
113
  jsx_runtime_1.jsxs(remotion_1.Internals.CurrentScaleContext.Provider, { value: value, children: [
99
114
  jsx_runtime_1.jsx(ForceSpecificCursor_1.ForceSpecificCursor, {}), jsx_runtime_1.jsx(scale_lock_1.ScaleLockProvider, { children: jsx_runtime_1.jsxs("div", { style: background, children: [
100
- jsx_runtime_1.jsx(remotion_1.Internals.CompositionRenderErrorContext.Provider, { value: compositionRenderErrorContextValue, children: canvasMounted ? jsx_runtime_1.jsx(MemoRoot, {}) : null }), jsx_runtime_1.jsx(remotion_1.Internals.CanUseRemotionHooksProvider, { children: jsx_runtime_1.jsx(RenderErrorContext_1.RenderErrorContext.Provider, { value: renderErrorContextValue, children: jsx_runtime_1.jsx(EditorContent_1.EditorContent, { readOnlyStudio: readOnlyStudio, children: jsx_runtime_1.jsx(TopPanel_1.TopPanel, { drawRef: setDrawRef, bufferStateDelayInMilliseconds: (0, studio_runtime_config_1.getStudioBufferStateDelayInMilliseconds)(), onMounted: onMounted, readOnlyStudio: readOnlyStudio }) }) }) })
115
+ jsx_runtime_1.jsx(remotion_1.Internals.CompositionRenderErrorContext.Provider, { value: compositionRenderErrorContextValue, children: canvasMounted ? (jsx_runtime_1.jsx(RootCompositionLoader, { Root: MemoRoot })) : null }), jsx_runtime_1.jsx(remotion_1.Internals.CanUseRemotionHooksProvider, { children: jsx_runtime_1.jsx(RenderErrorContext_1.RenderErrorContext.Provider, { value: renderErrorContextValue, children: jsx_runtime_1.jsx(EditorContent_1.EditorContent, { readOnlyStudio: readOnlyStudio, children: jsx_runtime_1.jsx(TopPanel_1.TopPanel, { drawRef: setDrawRef, bufferStateDelayInMilliseconds: (0, studio_runtime_config_1.getStudioBufferStateDelayInMilliseconds)(), onMounted: onMounted, readOnlyStudio: readOnlyStudio }) }) }) })
101
116
  ] }) })
102
117
  ] }), jsx_runtime_1.jsx(Modals_1.Modals, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(NotificationCenter_1.NotificationCenter, {})
103
118
  ] }) }) }));
@@ -9,4 +9,5 @@ export declare const ElementInstallConfirmation: React.FC<{
9
9
  readonly dependenciesToReview: string[];
10
10
  readonly missingPackages: string[];
11
11
  readonly sourceCode: string;
12
+ readonly usesBrowserDependencyResolution: boolean;
12
13
  }>;
@@ -171,7 +171,7 @@ const makeSourceControlsVisible = (sourceCode) => {
171
171
  return `\\u${(_a = character.codePointAt(0)) === null || _a === void 0 ? void 0 : _a.toString(16).padStart(4, '0')}`;
172
172
  });
173
173
  };
174
- const ElementInstallConfirmation = ({ displayName, sourceLabel, sourceIsUnverified, compositionId, filePath, overwritesExistingFile, dependenciesToReview, missingPackages, sourceCode, }) => {
174
+ const ElementInstallConfirmation = ({ displayName, sourceLabel, sourceIsUnverified, compositionId, filePath, overwritesExistingFile, dependenciesToReview, missingPackages, sourceCode, usesBrowserDependencyResolution, }) => {
175
175
  return (jsx_runtime_1.jsxs("div", { style: container, children: [
176
176
  jsx_runtime_1.jsxs("dl", { style: metadataStyle, "aria-label": "Installation details", children: [
177
177
  jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
@@ -196,7 +196,9 @@ const ElementInstallConfirmation = ({ displayName, sourceLabel, sourceIsUnverifi
196
196
  ] }, packageName));
197
197
  }) })
198
198
  ] })) : null, jsx_runtime_1.jsxs("div", { style: warningStyle, children: [
199
- jsx_runtime_1.jsx(ValidationMessage_1.WarningTriangle, { style: warningIconStyle }), jsx_runtime_1.jsx("p", { style: warningDescriptionStyle, children: "This adds executable source code to your project. Package lifecycle scripts may also run during installation, with access to your files and the network." })
199
+ jsx_runtime_1.jsx(ValidationMessage_1.WarningTriangle, { style: warningIconStyle }), jsx_runtime_1.jsxs("p", { style: warningDescriptionStyle, children: ["This adds executable source code to your project.", usesBrowserDependencyResolution
200
+ ? null
201
+ : ' Package lifecycle scripts may also run during installation, with access to your files and the network.'] })
200
202
  ] }), jsx_runtime_1.jsxs("details", { style: sourceDetailsStyle, children: [
201
203
  jsx_runtime_1.jsx("summary", { style: sourceSummaryStyle, children: "Source code" }), jsx_runtime_1.jsx("pre", { style: sourceCodeBlockStyle, children: jsx_runtime_1.jsx("code", { style: sourceCodeStyle, children: makeSourceControlsVisible(sourceCode) }) })
202
204
  ] })
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { ModalState } from '../state/modals';
3
+ type FixComputedValueModalState = Extract<ModalState, {
4
+ type: 'fix-computed-value';
5
+ }>;
6
+ export declare const FixComputedValueModal: React.FC<{
7
+ readonly state: FixComputedValueModalState;
8
+ }>;
9
+ export {};