@remotion/studio 4.0.520 → 4.0.522

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 (117) hide show
  1. package/dist/api/shut-down-studio.d.ts +6 -0
  2. package/dist/api/shut-down-studio.js +23 -0
  3. package/dist/components/AudioWaveform.js +10 -6
  4. package/dist/components/Canvas.js +84 -12
  5. package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
  6. package/dist/components/CaptionInspector.d.ts +1 -0
  7. package/dist/components/CaptionInspector.js +43 -2
  8. package/dist/components/CaptionTextEditor.js +1 -1
  9. package/dist/components/CompositionSelector.js +41 -30
  10. package/dist/components/CompositionSelectorItem.d.ts +7 -0
  11. package/dist/components/CompositionSelectorItem.js +343 -67
  12. package/dist/components/CopyButton.js +7 -14
  13. package/dist/components/Editor.js +6 -5
  14. package/dist/components/EditorContent.js +1 -1
  15. package/dist/components/ElementInstallConfirmation.js +77 -65
  16. package/dist/components/ElementLibraryModal.js +3 -1
  17. package/dist/components/FixComputedValueModal.js +20 -10
  18. package/dist/components/InlineCaptionInspector.js +37 -1
  19. package/dist/components/InspectorLocationCopy.js +10 -5
  20. package/dist/components/InspectorPanel/ElementLibraryButton.js +3 -18
  21. package/dist/components/InspectorSequenceSection.js +1 -4
  22. package/dist/components/Menu/MenuSubItem.js +1 -1
  23. package/dist/components/MenuBuildIndicator.js +7 -2
  24. package/dist/components/MenuCompositionName.js +62 -6
  25. package/dist/components/ModalContainer.d.ts +1 -0
  26. package/dist/components/ModalContainer.js +2 -2
  27. package/dist/components/ModalHeader.js +5 -1
  28. package/dist/components/QuickSwitcher/asset-search.d.ts +0 -1
  29. package/dist/components/QuickSwitcher/asset-search.js +1 -16
  30. package/dist/components/RenderButton.js +2 -2
  31. package/dist/components/RenderModal/CliCopyButton.js +13 -27
  32. package/dist/components/RenderModal/RenderStatusModal.js +7 -1
  33. package/dist/components/RenderModal/ServerRenderModal.js +1 -1
  34. package/dist/components/RenderModal/WebRenderModal.js +1 -1
  35. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +1 -1
  36. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
  37. package/dist/components/SettingsModal.js +8 -5
  38. package/dist/components/SidebarCollapserControls.js +11 -5
  39. package/dist/components/SkillsSettings.js +9 -5
  40. package/dist/components/Splitter/SplitterContainer.js +63 -10
  41. package/dist/components/Splitter/SplitterContext.d.ts +3 -0
  42. package/dist/components/Splitter/SplitterContext.js +5 -1
  43. package/dist/components/Splitter/SplitterElement.js +11 -2
  44. package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
  45. package/dist/components/Splitter/SplitterHandle.js +55 -25
  46. package/dist/components/TimeValue.js +36 -7
  47. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  48. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  49. package/dist/components/Timeline/Timeline.d.ts +1 -1
  50. package/dist/components/Timeline/Timeline.js +45 -22
  51. package/dist/components/Timeline/TimelineAssetField.d.ts +0 -1
  52. package/dist/components/Timeline/TimelineAssetField.js +16 -9
  53. package/dist/components/Timeline/TimelineCollapseToggle.js +1 -1
  54. package/dist/components/Timeline/TimelineDragHandler.js +9 -4
  55. package/dist/components/Timeline/TimelineFontWeightField.d.ts +11 -0
  56. package/dist/components/Timeline/TimelineFontWeightField.js +65 -0
  57. package/dist/components/Timeline/TimelineLayerChildren.d.ts +21 -0
  58. package/dist/components/Timeline/TimelineLayerChildren.js +129 -0
  59. package/dist/components/Timeline/TimelineNumberField.js +13 -5
  60. package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
  61. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
  62. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
  63. package/dist/components/Timeline/TimelineSequence.js +113 -42
  64. package/dist/components/Timeline/TimelineSequenceItem.js +14 -2
  65. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +13 -3
  66. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +185 -126
  67. package/dist/components/Timeline/TimelineSlider.js +1 -4
  68. package/dist/components/Timeline/TimelineTickFormatProvider.d.ts +8 -0
  69. package/dist/components/Timeline/TimelineTickFormatProvider.js +16 -0
  70. package/dist/components/Timeline/TimelineTimeIndicators.js +7 -3
  71. package/dist/components/Timeline/TimelineVideoInfo.js +7 -3
  72. package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
  73. package/dist/components/Timeline/TimelineZoomControls.js +20 -20
  74. package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
  75. package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
  76. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  77. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
  78. package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
  79. package/dist/components/TopPanel.js +3 -19
  80. package/dist/components/UpdateStatusContext.d.ts +5 -0
  81. package/dist/components/UpdateStatusContext.js +53 -2
  82. package/dist/components/UpdatesSettings.js +34 -9
  83. package/dist/components/WebMcp.js +26 -0
  84. package/dist/components/ZoomPersistor.js +6 -3
  85. package/dist/components/composition-menu-items.js +1 -1
  86. package/dist/components/composition-selector-drag-data.d.ts +27 -0
  87. package/dist/components/composition-selector-drag-data.js +80 -0
  88. package/dist/components/import-assets.d.ts +2 -1
  89. package/dist/components/import-assets.js +11 -1
  90. package/dist/components/parse-caption-file.d.ts +5 -0
  91. package/dist/components/parse-caption-file.js +63 -0
  92. package/dist/esm/{chunk-np6q13k5.js → chunk-3netyjd9.js} +7943 -6314
  93. package/dist/esm/index.mjs +23 -8
  94. package/dist/esm/internals.mjs +7965 -6336
  95. package/dist/esm/previewEntry.mjs +8007 -6378
  96. package/dist/esm/renderEntry.mjs +1 -1
  97. package/dist/helpers/copy-text.js +1 -2
  98. package/dist/helpers/get-preview-file-type.js +22 -3
  99. package/dist/helpers/inserted-element-selection.d.ts +2 -1
  100. package/dist/helpers/use-copy-feedback.d.ts +4 -0
  101. package/dist/helpers/use-copy-feedback.js +19 -0
  102. package/dist/helpers/use-menu-structure.js +2 -2
  103. package/dist/icons/copy.d.ts +5 -0
  104. package/dist/icons/copy.js +12 -0
  105. package/dist/index.d.ts +1 -0
  106. package/dist/index.js +3 -1
  107. package/dist/state/canvas-ref.d.ts +1 -0
  108. package/dist/state/canvas-ref.js +2 -1
  109. package/dist/state/modals.d.ts +0 -2
  110. package/dist/state/sidebar.d.ts +3 -0
  111. package/dist/state/sidebar.js +6 -1
  112. package/dist/state/timeline-zoom.d.ts +1 -1
  113. package/dist/state/timeline-zoom.js +3 -3
  114. package/dist/visual-controls/VisualControls.js +4 -0
  115. package/package.json +16 -16
  116. package/dist/helpers/use-max-media-duration.d.ts +0 -2
  117. package/dist/helpers/use-max-media-duration.js +0 -61
@@ -39,7 +39,7 @@ const container = {
39
39
  const dialogContent = {
40
40
  ...container,
41
41
  padding: 16,
42
- width: 'min(640px, calc(100vw - 40px))',
42
+ width: 'min(520px, calc(100vw - 40px))',
43
43
  maxHeight: 'min(720px, calc(100vh - 140px))',
44
44
  overflowY: 'auto',
45
45
  };
@@ -85,8 +85,19 @@ const metadataDescriptionStyle = {
85
85
  lineHeight: 1.5,
86
86
  overflowWrap: 'anywhere',
87
87
  };
88
- const unverifiedSourceStyle = {
88
+ const requestSourceStyle = {
89
+ display: 'flex',
90
+ justifyContent: 'space-between',
91
+ gap: 16,
92
+ margin: 0,
93
+ };
94
+ const requestSourceDescriptionStyle = {
89
95
  ...metadataDescriptionStyle,
96
+ color: colors_1.LIGHT_TEXT,
97
+ textAlign: 'right',
98
+ };
99
+ const unverifiedRequestSourceStyle = {
100
+ ...requestSourceDescriptionStyle,
90
101
  color: colors_1.WARNING_COLOR,
91
102
  };
92
103
  const codeStyle = {
@@ -111,32 +122,13 @@ const dependencyListStyle = {
111
122
  padding: 0,
112
123
  listStyleType: 'none',
113
124
  };
114
- const dependencyRowStyle = {
115
- display: 'flex',
116
- alignItems: 'baseline',
117
- justifyContent: 'space-between',
118
- gap: 16,
119
- minWidth: 0,
120
- };
121
125
  const dependencyNameStyle = {
122
126
  minWidth: 0,
123
127
  color: colors_1.WHITE,
124
- fontFamily: 'monospace',
125
- fontSize: 13,
126
- lineHeight: 1.5,
127
- overflowWrap: 'anywhere',
128
- };
129
- const dependencyInstallStatusStyle = {
130
- flexShrink: 0,
131
- color: colors_1.WARNING_COLOR,
132
128
  fontFamily: 'sans-serif',
133
129
  fontSize: 13,
134
- fontWeight: 500,
135
130
  lineHeight: 1.5,
136
- };
137
- const dependencyInstalledStatusStyle = {
138
- ...dependencyInstallStatusStyle,
139
- color: colors_1.LIGHT_TEXT,
131
+ overflowWrap: 'anywhere',
140
132
  };
141
133
  const warningStyle = {
142
134
  display: 'flex',
@@ -160,6 +152,10 @@ const warningDescriptionStyle = {
160
152
  fontWeight: 400,
161
153
  lineHeight: 1.5,
162
154
  };
155
+ const installWarningDescriptionStyle = {
156
+ ...warningDescriptionStyle,
157
+ color: colors_1.WHITE,
158
+ };
163
159
  const browseElementsStyle = {
164
160
  color: 'inherit',
165
161
  fontFamily: 'inherit',
@@ -174,7 +170,7 @@ const sourceDetailsStyle = {
174
170
  lineHeight: 1.5,
175
171
  };
176
172
  const sourceSummaryStyle = {
177
- cursor: 'pointer',
173
+ cursor: 'default',
178
174
  color: colors_1.WHITE,
179
175
  fontFamily: 'sans-serif',
180
176
  fontSize: 13,
@@ -206,23 +202,29 @@ const destinationControlStyle = {
206
202
  display: 'flex',
207
203
  alignItems: 'center',
208
204
  justifyContent: 'space-between',
209
- gap: 16,
205
+ columnGap: 16,
206
+ rowGap: 10,
207
+ flexWrap: 'wrap',
210
208
  };
211
209
  const destinationOptionsStyle = {
212
210
  display: 'flex',
213
211
  overflow: 'hidden',
212
+ maxWidth: '100%',
213
+ marginLeft: 'auto',
214
214
  border: `1px solid ${colors_1.WHITE_ALPHA_12}`,
215
215
  borderRadius: 4,
216
216
  };
217
217
  const destinationOptionStyle = {
218
218
  appearance: 'none',
219
+ minHeight: 26,
219
220
  border: 0,
220
221
  cursor: 'default',
221
222
  fontFamily: 'sans-serif',
222
- fontSize: 11,
223
+ fontSize: 12,
223
224
  fontWeight: 400,
224
- lineHeight: 1.5,
225
- padding: '2px 7px',
225
+ lineHeight: '18px',
226
+ padding: '4px 8px',
227
+ whiteSpace: 'nowrap',
226
228
  };
227
229
  const getDestinationOptionStyle = ({ disabled, selected, }) => ({
228
230
  ...destinationOptionStyle,
@@ -240,6 +242,7 @@ const footerStyle = {
240
242
  const cancelStyle = {
241
243
  minWidth: 90,
242
244
  };
245
+ const elementInstallTitleId = 'remotion-element-install-title';
243
246
  const makeSourceControlsVisible = (sourceCode) => {
244
247
  return sourceCode.replace(/[\u200b-\u200f\u202a-\u202e\u2066-\u2069\ufeff]/g, (character) => {
245
248
  var _a;
@@ -264,8 +267,8 @@ const ElementLibraryAddConfirmation = ({ displayName, origin, url }) => {
264
267
  };
265
268
  exports.ElementLibraryAddConfirmation = ElementLibraryAddConfirmation;
266
269
  const ElementInstallConfirmation = ({ state }) => {
267
- var _a, _b;
268
- const { currentPlan, dependenciesToReview, missingPackages, newPlan, onClose, request, sourceIsUnverified, sourceLabel, } = state;
270
+ var _a;
271
+ const { currentPlan, missingPackages, newPlan, onClose, request, sourceIsUnverified, sourceLabel, } = state;
269
272
  const config = remotion_1.Internals.useUnsafeVideoConfig();
270
273
  const { canvasContent, compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
271
274
  const currentCompositionMetadata = config === null ||
@@ -280,9 +283,13 @@ const ElementInstallConfirmation = ({ state }) => {
280
283
  };
281
284
  const usesBrowserDependencyResolution = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
282
285
  const { currentZIndex } = (0, z_index_1.useZIndex)();
283
- const [mode, setMode] = (0, react_1.useState)(currentPlan === null ? 'new-composition' : 'current-composition');
286
+ const [mode, setMode] = (0, react_1.useState)(currentPlan === null || request.source.type === 'browser-studio-link'
287
+ ? 'new-composition'
288
+ : 'current-composition');
284
289
  const [submitting, setSubmitting] = (0, react_1.useState)(false);
285
290
  const inputRef = (0, react_1.useRef)(null);
291
+ const currentDestinationRef = (0, react_1.useRef)(null);
292
+ const newDestinationRef = (0, react_1.useRef)(null);
286
293
  const [newCompositionValues, setNewCompositionValues] = (0, react_1.useState)(() => {
287
294
  var _a, _b, _c, _d, _e;
288
295
  const elementComponentName = (_a = studio_protocol_1.StudioProtocolInternals.getElementComponentNameFromSourceCode(request.element.sourceCode)) !== null && _a !== void 0 ? _a : 'Element';
@@ -400,6 +407,7 @@ const ElementInstallConfirmation = ({ state }) => {
400
407
  const selectedPlan = mode === 'current-composition' ? currentPlan : selectedNewCompositionPlan;
401
408
  const folderTargetIsReady = selectedFolderStack === null ||
402
409
  ((0, use_resolved_stack_1.hasResolvedStack)(selectedFolderStack) && folderCompositionFile !== null);
410
+ const title = `Install ${request.element.displayName}${request.element.displayName.endsWith(' Element') ? '' : ' Element'}`;
403
411
  const canSubmit = !submitting &&
404
412
  (mode === 'current-composition'
405
413
  ? currentPlan !== null
@@ -468,63 +476,67 @@ const ElementInstallConfirmation = ({ state }) => {
468
476
  onClose();
469
477
  }
470
478
  }, [onClose, submitting]);
479
+ const onDestinationKeyDown = (0, react_1.useCallback)((event) => {
480
+ if (!['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'].includes(event.key)) {
481
+ return;
482
+ }
483
+ event.preventDefault();
484
+ if (currentPlan === null) {
485
+ return;
486
+ }
487
+ const nextMode = mode === 'current-composition'
488
+ ? 'new-composition'
489
+ : 'current-composition';
490
+ setMode(nextMode);
491
+ requestAnimationFrame(() => {
492
+ var _a, _b;
493
+ if (nextMode === 'current-composition') {
494
+ (_a = currentDestinationRef.current) === null || _a === void 0 ? void 0 : _a.focus();
495
+ }
496
+ else {
497
+ (_b = newDestinationRef.current) === null || _b === void 0 ? void 0 : _b.focus();
498
+ }
499
+ });
500
+ }, [currentPlan, mode]);
471
501
  const onSubmit = (0, react_1.useCallback)((event) => {
472
502
  event.preventDefault();
473
503
  submit();
474
504
  }, [submit]);
475
- return (0, react_dom_1.createPortal)(jsx_runtime_1.jsxs(ModalContainer_1.ModalContainer, { onOutsideClick: cancel, onEscape: cancel, children: [
476
- jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Install Element", onClose: cancel }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
505
+ return (0, react_dom_1.createPortal)(jsx_runtime_1.jsxs(ModalContainer_1.ModalContainer, { ariaLabelledBy: elementInstallTitleId, onOutsideClick: cancel, onEscape: cancel, children: [
506
+ jsx_runtime_1.jsx("div", { id: elementInstallTitleId, children: jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: title, onClose: cancel }) }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
477
507
  jsx_runtime_1.jsxs("div", { style: dialogContent, children: [
478
- jsx_runtime_1.jsxs("div", { style: destinationControlStyle, children: [
479
- jsx_runtime_1.jsx("div", { style: sectionTitleStyle, children: "Add to" }), jsx_runtime_1.jsxs("div", { "aria-label": "Installation destination", role: "group", style: destinationOptionsStyle, children: [
480
- jsx_runtime_1.jsx("button", { "aria-pressed": mode === 'current-composition', className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: currentPlan === null, onClick: () => setMode('current-composition'), style: getDestinationOptionStyle({
508
+ jsx_runtime_1.jsxs("dl", { style: requestSourceStyle, "aria-label": "Request source", children: [
509
+ jsx_runtime_1.jsx("dt", { style: sectionTitleStyle, children: "From" }), jsx_runtime_1.jsx("dd", { style: sourceIsUnverified
510
+ ? unverifiedRequestSourceStyle
511
+ : requestSourceDescriptionStyle, children: sourceLabel })
512
+ ] }), jsx_runtime_1.jsxs("div", { style: destinationControlStyle, children: [
513
+ jsx_runtime_1.jsx("div", { style: sectionTitleStyle, children: "Destination" }), jsx_runtime_1.jsxs("div", { "aria-label": "Installation destination", onKeyDown: onDestinationKeyDown, role: "radiogroup", style: destinationOptionsStyle, children: [
514
+ jsx_runtime_1.jsx("button", { ref: currentDestinationRef, "aria-checked": mode === 'current-composition', className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: currentPlan === null, onClick: () => setMode('current-composition'), role: "radio", style: getDestinationOptionStyle({
481
515
  disabled: currentPlan === null,
482
516
  selected: mode === 'current-composition',
483
- }), type: "button", children: "Current composition" }), jsx_runtime_1.jsx("button", { "aria-pressed": mode === 'new-composition', className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, onClick: () => {
517
+ }), tabIndex: mode === 'current-composition' ? 0 : -1, type: "button", children: "Current composition" }), jsx_runtime_1.jsx("button", { ref: newDestinationRef, "aria-checked": mode === 'new-composition', className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, onClick: () => {
484
518
  setMode('new-composition');
485
519
  requestAnimationFrame(() => {
486
520
  var _a;
487
521
  return (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.select();
488
522
  });
489
- }, style: {
523
+ }, role: "radio", style: {
490
524
  ...getDestinationOptionStyle({
491
525
  disabled: false,
492
526
  selected: mode === 'new-composition',
493
527
  }),
494
528
  borderLeft: `1px solid ${colors_1.WHITE_ALPHA_12}`,
495
- }, type: "button", children: "New composition" })
529
+ }, tabIndex: mode === 'new-composition' ? 0 : -1, type: "button", children: "New composition" })
496
530
  ] })
497
531
  ] }), currentPlan === null ? (jsx_runtime_1.jsxs("div", { style: warningStyle, role: "status", children: [
498
- jsx_runtime_1.jsx(ValidationMessage_1.WarningTriangle, { style: warningIconStyle }), jsx_runtime_1.jsxs("p", { style: warningDescriptionStyle, children: ["Studio could not find a safe place in \u201C", request.compositionId, "\u201D to insert the Element. Install it into a new composition instead."] })
532
+ jsx_runtime_1.jsx(ValidationMessage_1.WarningTriangle, { style: warningIconStyle }), jsx_runtime_1.jsxs("p", { style: installWarningDescriptionStyle, children: ["Studio could not find a safe place in \u201C", request.compositionId, "\u201D to insert the Element. Install it into a new composition instead."] })
499
533
  ] })) : null, mode === 'new-composition' ? (jsx_runtime_1.jsxs("section", { style: sectionStyle, "aria-label": "New composition settings", children: [
500
- jsx_runtime_1.jsx(NewComposition_1.NewCompositionFields, { heightValidationMessage: heightValidationMessage, inputRef: inputRef, nameValidationMessage: nameValidationMessage, setValues: setNewCompositionValues, values: newCompositionValues, widthValidationMessage: widthValidationMessage }), (activeNewCompositionPlanState === null || activeNewCompositionPlanState === void 0 ? void 0 : activeNewCompositionPlanState.type) === 'error' ? (jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: activeNewCompositionPlanState.reason, type: "error" })) : null] })) : null, jsx_runtime_1.jsxs("dl", { style: metadataStyle, "aria-label": "Installation details", children: [
501
- jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
502
- jsx_runtime_1.jsx("dt", { style: metadataTermStyle, children: "Element" }), jsx_runtime_1.jsx("dd", { style: metadataDescriptionStyle, children: request.element.displayName })
503
- ] }), jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
504
- jsx_runtime_1.jsx("dt", { style: metadataTermStyle, children: "Request source" }), jsx_runtime_1.jsx("dd", { style: sourceIsUnverified
505
- ? unverifiedSourceStyle
506
- : metadataDescriptionStyle, children: sourceLabel })
507
- ] }), jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
508
- jsx_runtime_1.jsx("dt", { style: metadataTermStyle, children: "Composition" }), jsx_runtime_1.jsx("dd", { style: metadataDescriptionStyle, children: jsx_runtime_1.jsx("code", { style: codeStyle, children: mode === 'current-composition'
509
- ? request.compositionId
510
- : newCompositionValues.id }) })
511
- ] }), jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
512
- jsx_runtime_1.jsx("dt", { style: metadataTermStyle, children: "Destination" }), jsx_runtime_1.jsx("dd", { style: metadataDescriptionStyle, children: jsx_runtime_1.jsx("code", { style: codeStyle, children: (_b = selectedPlan === null || selectedPlan === void 0 ? void 0 : selectedPlan.filePath) !== null && _b !== void 0 ? _b : 'Reviewing destination…' }) })
513
- ] }), (selectedPlan === null || selectedPlan === void 0 ? void 0 : selectedPlan.expectedFileState.exists) ? (jsx_runtime_1.jsxs("div", { style: metadataRowStyle, children: [
514
- jsx_runtime_1.jsx("dt", { style: metadataTermStyle, children: "File change" }), jsx_runtime_1.jsx("dd", { style: overwriteStyle, children: "Replace existing source file" })
515
- ] })) : null] }), dependenciesToReview.length > 0 ? (jsx_runtime_1.jsxs("section", { style: sectionStyle, "aria-labelledby": "element-install-dependencies", children: [
516
- jsx_runtime_1.jsx("h3", { id: "element-install-dependencies", style: sectionTitleStyle, children: "Dependencies" }), jsx_runtime_1.jsx("ul", { style: dependencyListStyle, role: "list", children: dependenciesToReview.map((packageName) => {
517
- const willInstall = missingPackages.includes(packageName);
518
- return (jsx_runtime_1.jsxs("li", { style: dependencyRowStyle, children: [
519
- jsx_runtime_1.jsx("div", { style: dependencyNameStyle, children: packageName }), jsx_runtime_1.jsx("div", { style: willInstall
520
- ? dependencyInstallStatusStyle
521
- : dependencyInstalledStatusStyle, children: willInstall ? 'Will be installed' : 'Installed' })
522
- ] }, packageName));
523
- }) })
534
+ jsx_runtime_1.jsx(NewComposition_1.NewCompositionFields, { heightValidationMessage: heightValidationMessage, inputRef: inputRef, nameValidationMessage: nameValidationMessage, setValues: setNewCompositionValues, values: newCompositionValues, widthValidationMessage: widthValidationMessage }), (activeNewCompositionPlanState === null || activeNewCompositionPlanState === void 0 ? void 0 : activeNewCompositionPlanState.type) === 'error' ? (jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: activeNewCompositionPlanState.reason, type: "error" })) : null] })) : null, (selectedPlan === null || selectedPlan === void 0 ? void 0 : selectedPlan.expectedFileState.exists) ? (jsx_runtime_1.jsx("p", { style: overwriteStyle, role: "status", children: "This will replace the existing Element source file." })) : null, missingPackages.length > 0 ? (jsx_runtime_1.jsxs("section", { style: sectionStyle, "aria-labelledby": "element-install-dependencies", children: [
535
+ jsx_runtime_1.jsx("h3", { id: "element-install-dependencies", style: sectionTitleStyle, children: "Packages to install" }), jsx_runtime_1.jsx("ul", { style: dependencyListStyle, role: "list", children: missingPackages.map((packageName) => (jsx_runtime_1.jsx("li", { style: dependencyNameStyle, children: packageName }, packageName))) })
524
536
  ] })) : null, jsx_runtime_1.jsxs("div", { style: warningStyle, children: [
525
- 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
537
+ jsx_runtime_1.jsx(ValidationMessage_1.WarningTriangle, { style: warningIconStyle }), jsx_runtime_1.jsxs("p", { style: installWarningDescriptionStyle, children: ["This adds executable source code to your project, with access to your files and the network.", usesBrowserDependencyResolution || missingPackages.length === 0
526
538
  ? null
527
- : ' Package lifecycle scripts may also run during installation, with access to your files and the network.'] })
539
+ : ' Package lifecycle scripts may also run during installation.'] })
528
540
  ] }), jsx_runtime_1.jsxs("details", { style: sourceDetailsStyle, children: [
529
541
  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(request.element.sourceCode) }) })
530
542
  ] })
@@ -15,6 +15,7 @@ const panelStyle = {
15
15
  };
16
16
  const iframeStyle = {
17
17
  border: 0,
18
+ colorScheme: 'dark',
18
19
  flex: 1,
19
20
  minHeight: 0,
20
21
  width: '100%',
@@ -31,10 +32,11 @@ const ElementLibraryModal = ({ name, url }) => {
31
32
  iframe.setAttribute('credentialless', '');
32
33
  const iframeUrl = new URL(url);
33
34
  iframeUrl.searchParams.set('remotion-studio', 'true');
35
+ iframeUrl.searchParams.set('docusaurus-theme', 'dark');
34
36
  iframe.src = iframeUrl.toString();
35
37
  }, [url]);
36
38
  return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { panelStyle: panelStyle, children: [
37
- jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: name }), jsx_runtime_1.jsx("iframe", { ref: iframeRef, allow: "local-network-access; loopback-network", style: iframeStyle, title: `${name} library` })
39
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: name }), jsx_runtime_1.jsx("iframe", { ref: iframeRef, allow: "local-network-access; loopback-network", "data-remotion-element-library": "", style: iframeStyle, title: `${name} library` })
38
40
  ] }));
39
41
  };
40
42
  exports.ElementLibraryModal = ElementLibraryModal;
@@ -5,7 +5,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const colors_1 = require("../helpers/colors");
7
7
  const copy_text_1 = require("../helpers/copy-text");
8
- const clipboard_1 = require("../icons/clipboard");
8
+ const use_copy_feedback_1 = require("../helpers/use-copy-feedback");
9
+ const copy_1 = require("../icons/copy");
9
10
  const CodingAgentButton_1 = require("./CodingAgentButton");
10
11
  const InlineAction_1 = require("./InlineAction");
11
12
  const ModalFooter_1 = require("./ModalFooter");
@@ -63,23 +64,32 @@ const FixComputedValueModal = ({ state }) => {
63
64
  const prompt = `/remotion-interactivity ${state.context} make "${state.prop}" interactive`;
64
65
  const installCommand = 'npx remotion skills add';
65
66
  const hasCodingAgent = ((_a = codingAgentInfo === null || codingAgentInfo === void 0 ? void 0 : codingAgentInfo.installedCodingAgents.length) !== null && _a !== void 0 ? _a : 0) > 0;
67
+ const { copied: promptCopied, markCopied: markPromptCopied } = (0, use_copy_feedback_1.useCopyFeedback)();
68
+ const { copied: installCommandCopied, markCopied: markInstallCommandCopied } = (0, use_copy_feedback_1.useCopyFeedback)();
66
69
  const onCopyPrompt = (0, react_1.useCallback)(() => {
67
- (0, copy_text_1.copyText)(prompt).catch((err) => {
70
+ (0, copy_text_1.copyText)(prompt)
71
+ .then(markPromptCopied)
72
+ .catch((err) => {
68
73
  (0, NotificationCenter_1.showNotification)(`Could not copy: ${err.message}`, 2000);
69
74
  });
70
- }, [prompt]);
75
+ }, [markPromptCopied, prompt]);
71
76
  const onCopyInstallCommand = (0, react_1.useCallback)(() => {
72
- (0, copy_text_1.copyText)(installCommand).catch((err) => {
77
+ (0, copy_text_1.copyText)(installCommand)
78
+ .then(markInstallCommandCopied)
79
+ .catch((err) => {
73
80
  (0, NotificationCenter_1.showNotification)(`Could not copy: ${err.message}`, 2000);
74
81
  });
75
- }, [installCommand]);
76
- const renderCopyAction = (0, react_1.useCallback)((color) => {
77
- return jsx_runtime_1.jsx(clipboard_1.ClipboardIcon, { color: color, style: copyIcon });
78
- }, []);
82
+ }, [installCommand, markInstallCommandCopied]);
83
+ const renderPromptCopyAction = (0, react_1.useCallback)((color) => {
84
+ return jsx_runtime_1.jsx(copy_1.CopyIcon, { copied: promptCopied, color: color, style: copyIcon });
85
+ }, [promptCopied]);
86
+ const renderInstallCommandCopyAction = (0, react_1.useCallback)((color) => {
87
+ return (jsx_runtime_1.jsx(copy_1.CopyIcon, { copied: installCommandCopied, color: color, style: copyIcon }));
88
+ }, [installCommandCopied]);
79
89
  return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { panelStyle: panelStyle, children: [
80
90
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Fix computed value" }), jsx_runtime_1.jsxs("div", { style: container, children: [state.remotionInteractivitySkillAvailable ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
81
91
  jsx_runtime_1.jsx("div", { style: text, children: "First, install the Remotion Agent Skills:" }), jsx_runtime_1.jsxs("div", { style: commandField, children: [
82
- jsx_runtime_1.jsx("pre", { style: code, children: installCommand }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopyInstallCommand, renderAction: renderCopyAction, title: "Copy command" })
92
+ jsx_runtime_1.jsx("pre", { style: code, children: installCommand }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopyInstallCommand, renderAction: renderInstallCommandCopyAction, title: "Copy command" })
83
93
  ] })
84
94
  ] })), jsx_runtime_1.jsx("div", { style: {
85
95
  ...text,
@@ -87,7 +97,7 @@ const FixComputedValueModal = ({ state }) => {
87
97
  }, children: state.remotionInteractivitySkillAvailable
88
98
  ? 'Paste this prompt into your coding agent to make this value editable in Studio:'
89
99
  : 'Then, paste this prompt into your coding agent:' }), jsx_runtime_1.jsxs("div", { style: commandField, children: [
90
- jsx_runtime_1.jsx("pre", { style: code, children: prompt }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopyPrompt, renderAction: renderCopyAction, title: "Copy prompt" })
100
+ jsx_runtime_1.jsx("pre", { style: code, children: prompt }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopyPrompt, renderAction: renderPromptCopyAction, title: "Copy prompt" })
91
101
  ] })
92
102
  ] }), hasCodingAgent ? (jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { style: footer, children: jsx_runtime_1.jsx(CodingAgentButton_1.CodingAgentButton, { label: "Open in", prompt: prompt, size: "compact", style: null }) })) : null] }));
93
103
  };
@@ -107,6 +107,42 @@ const InlineCaptionInspector = ({ captions, controls, expanded, nodePath, onTogg
107
107
  setPropStatuses,
108
108
  validatedLocation.source,
109
109
  ]);
110
+ const replaceCaptions = (0, react_1.useCallback)((nextCaptions) => {
111
+ if (!canSave || clientId === null) {
112
+ return;
113
+ }
114
+ setDraftCaptions(nextCaptions);
115
+ setDragOverrides(nodePath, 'captions', remotion_1.Internals.makeStaticDragOverride(nextCaptions));
116
+ savedCaptions.current = nextCaptions;
117
+ (0, save_sequence_prop_1.saveSequenceProps)({
118
+ changes: [
119
+ {
120
+ fileName: validatedLocation.source,
121
+ nodePath,
122
+ fieldKey: 'captions',
123
+ value: nextCaptions,
124
+ defaultValue: null,
125
+ schema: controls.schema,
126
+ },
127
+ ],
128
+ addedKeyframes: null,
129
+ movedKeyframes: null,
130
+ setPropStatuses,
131
+ clientId,
132
+ undoLabel: 'Import captions',
133
+ redoLabel: 'Import captions again',
134
+ });
135
+ clearDragOverrides(nodePath);
136
+ }, [
137
+ canSave,
138
+ clearDragOverrides,
139
+ clientId,
140
+ controls.schema,
141
+ nodePath,
142
+ setDragOverrides,
143
+ setPropStatuses,
144
+ validatedLocation.source,
145
+ ]);
110
146
  const readOnlyTitle = readOnlyStudio
111
147
  ? 'Caption editing is unavailable in read-only Studio'
112
148
  : clientId === null
@@ -114,6 +150,6 @@ const InlineCaptionInspector = ({ captions, controls, expanded, nodePath, onTogg
114
150
  : (captionStatus === null || captionStatus === void 0 ? void 0 : captionStatus.status) === 'computed'
115
151
  ? 'Captions must be a direct inline JSX array to edit them'
116
152
  : 'Captions are not ready for editing';
117
- return (jsx_runtime_1.jsx(CaptionInspector_1.CaptionInspector, { captions: draftCaptions, expanded: expanded, onTextChange: updateCaptions, onTextSave: saveCaptions, onTextCancel: cancelCaptions, onToggle: onToggle, readOnly: !canSave, readOnlyTitle: canSave ? null : readOnlyTitle }));
153
+ return (jsx_runtime_1.jsx(CaptionInspector_1.CaptionInspector, { captions: draftCaptions, expanded: expanded, onTextChange: updateCaptions, onTextSave: saveCaptions, onTextCancel: cancelCaptions, onToggle: onToggle, readOnly: !canSave, readOnlyTitle: canSave ? null : readOnlyTitle, onReplaceCaptions: canSave ? replaceCaptions : null }));
118
154
  };
119
155
  exports.InlineCaptionInspector = InlineCaptionInspector;
@@ -4,7 +4,8 @@ exports.InspectorLocationCopy = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const format_file_location_1 = require("../helpers/format-file-location");
7
- const clipboard_1 = require("../icons/clipboard");
7
+ const use_copy_feedback_1 = require("../helpers/use-copy-feedback");
8
+ const copy_1 = require("../icons/copy");
8
9
  const InlineAction_1 = require("./InlineAction");
9
10
  const InspectorOpenInEditor_1 = require("./InspectorOpenInEditor");
10
11
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
@@ -38,6 +39,7 @@ const icon = {
38
39
  const InspectorLocationCopy = ({ children, location, name, openInEditorLocation }) => {
39
40
  const [hovered, setHovered] = (0, react_1.useState)(false);
40
41
  const [focusedWithin, setFocusedWithin] = (0, react_1.useState)(false);
42
+ const { copied, markCopied } = (0, use_copy_feedback_1.useCopyFeedback)();
41
43
  const contextForAgents = (0, react_1.useMemo)(() => {
42
44
  return (0, format_file_location_1.formatContextForAgents)({
43
45
  location,
@@ -46,17 +48,20 @@ const InspectorLocationCopy = ({ children, location, name, openInEditorLocation
46
48
  });
47
49
  }, [location, name]);
48
50
  const renderCopyAction = (0, react_1.useCallback)((color) => {
49
- return jsx_runtime_1.jsx(clipboard_1.ClipboardIcon, { style: icon, color: color });
50
- }, []);
51
+ return jsx_runtime_1.jsx(copy_1.CopyIcon, { copied: copied, style: icon, color: color });
52
+ }, [copied]);
51
53
  const onCopy = (0, react_1.useCallback)((event) => {
52
54
  event.stopPropagation();
53
55
  if (!contextForAgents) {
54
56
  return;
55
57
  }
56
- navigator.clipboard.writeText(contextForAgents).catch((err) => {
58
+ navigator.clipboard
59
+ .writeText(contextForAgents)
60
+ .then(markCopied)
61
+ .catch((err) => {
57
62
  (0, NotificationCenter_1.showNotification)(`Could not copy to clipboard: ${err.message}`, 2000);
58
63
  });
59
- }, [contextForAgents]);
64
+ }, [contextForAgents, markCopied]);
60
65
  const showAction = hovered || focusedWithin;
61
66
  return (jsx_runtime_1.jsxs("div", { "aria-label": "Inspector source location", role: "group", style: row, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), onFocus: () => setFocusedWithin(true), onBlur: () => setFocusedWithin(false), children: [
62
67
  jsx_runtime_1.jsx("div", { style: content, children: children }), contextForAgents || openInEditorLocation ? (jsx_runtime_1.jsxs("div", { style: {
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ElementLibraryButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const browser_studio_operations_1 = require("../../helpers/browser-studio-operations");
7
6
  const colors_1 = require("../../helpers/colors");
8
7
  const browse_elements_1 = require("../../icons/browse-elements");
9
8
  const caret_1 = require("../../icons/caret");
@@ -23,13 +22,6 @@ const browseElementsIconContainerStyle = {
23
22
  marginRight: -2,
24
23
  width: 22,
25
24
  };
26
- const browseElementsArrowStyle = {
27
- display: 'inline-block',
28
- height: 12,
29
- marginLeft: 4,
30
- verticalAlign: -2,
31
- width: 12,
32
- };
33
25
  const elementLibraryDropdownStyle = {
34
26
  borderRadius: 4,
35
27
  height: 28,
@@ -63,19 +55,14 @@ const ElementLibraryButton = () => {
63
55
  var _a;
64
56
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
65
57
  const { studioRuntimeConfig } = (0, SettingsContext_1.useSettings)();
66
- const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
67
58
  const elementLibraries = (_a = studioRuntimeConfig === null || studioRuntimeConfig === void 0 ? void 0 : studioRuntimeConfig.elementLibraries) !== null && _a !== void 0 ? _a : noElementLibraries;
68
59
  const openElementLibrary = (0, react_1.useCallback)((name, url) => {
69
- if (isBrowserStudio) {
70
- window.open(url, '_blank', 'noopener,noreferrer');
71
- return;
72
- }
73
60
  setSelectedModal({
74
61
  type: 'element-library',
75
62
  name,
76
63
  url,
77
64
  });
78
- }, [isBrowserStudio, setSelectedModal]);
65
+ }, [setSelectedModal]);
79
66
  const openElementsLibrary = (0, react_1.useCallback)(() => {
80
67
  openElementLibrary('Remotion Elements', 'https://www.remotion.dev/elements');
81
68
  }, [openElementLibrary]);
@@ -129,11 +116,9 @@ const ElementLibraryButton = () => {
129
116
  ],
130
117
  },
131
118
  ], [elementLibraries, openElementLibrary, openElementsLibrary]);
132
- if (elementLibraries.length > 0 && !isBrowserStudio) {
119
+ if (elementLibraries.length > 0) {
133
120
  return (jsx_runtime_1.jsx(SegmentedButton_1.SegmentedButton, { segments: elementLibraryDropdownSegments, style: elementLibraryDropdownStyle, title: null }));
134
121
  }
135
- return (jsx_runtime_1.jsxs(common_1.InspectorQuickAction, { disabled: false, iconContainerStyle: browseElementsIconContainerStyle, onClick: openElementsLibrary, renderIcon: (color) => (jsx_runtime_1.jsx(browse_elements_1.BrowseElementsIcon, { color: color, style: browseElementsIconStyle })), title: isBrowserStudio
136
- ? 'Open the Remotion Elements library in a new tab. Install an Element there to send it to this composition.'
137
- : 'Browse the Remotion Elements library inside Studio.', children: ["Browse Elements", isBrowserStudio ? (jsx_runtime_1.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", style: browseElementsArrowStyle, children: jsx_runtime_1.jsx("path", { d: "M4 12 12 4M6 4h6v6", fill: "none", stroke: colors_1.CURRENT_COLOR, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.5" }) })) : null] }));
122
+ return (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: false, iconContainerStyle: browseElementsIconContainerStyle, onClick: openElementsLibrary, renderIcon: (color) => (jsx_runtime_1.jsx(browse_elements_1.BrowseElementsIcon, { color: color, style: browseElementsIconStyle })), title: "Browse the Remotion Elements library inside Studio.", children: "Browse Elements" }));
138
123
  };
139
124
  exports.ElementLibraryButton = ElementLibraryButton;
@@ -22,7 +22,6 @@ const CollapsibleInspectorSectionHeader_1 = require("./InspectorPanel/Collapsibl
22
22
  const common_1 = require("./InspectorPanel/common");
23
23
  const inspector_section_collapse_1 = require("./InspectorPanel/inspector-section-collapse");
24
24
  const styles_1 = require("./InspectorPanel/styles");
25
- const asset_search_1 = require("./QuickSwitcher/asset-search");
26
25
  const border_radius_representation_1 = require("./Timeline/border-radius-representation");
27
26
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
28
27
  const timeline_asset_link_1 = require("./Timeline/timeline-asset-link");
@@ -226,7 +225,6 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
226
225
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
227
226
  const selectAsset = (0, use_select_asset_1.useSelectAsset)();
228
227
  const mediaSrc = (0, timeline_asset_link_1.getTimelineAssetSrcFromSchema)(sequence.controls, runtimeValues);
229
- const assetSelectionInitialQuery = (0, asset_search_1.getAssetSearchQueryForComponent)(sequence.controls.componentIdentity);
230
228
  const getSourceAction = (0, react_1.useCallback)((src) => {
231
229
  var _a;
232
230
  const linkInfo = (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(src);
@@ -258,9 +256,8 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
258
256
  }, [getSourceAction, mediaSrc]);
259
257
  const assetSelectionContextValue = (0, react_1.useMemo)(() => ({
260
258
  getSourceAction,
261
- initialQuery: assetSelectionInitialQuery,
262
259
  sourceAction,
263
- }), [assetSelectionInitialQuery, getSourceAction, sourceAction]);
260
+ }), [getSourceAction, sourceAction]);
264
261
  const getIsExpanded = (0, react_1.useCallback)((candidate) => {
265
262
  return !collapsedKeys.has(getInspectorExpansionKey(candidate));
266
263
  }, [collapsedKeys]);
@@ -62,7 +62,7 @@ const MenuSubItem = ({ label, leaveLeftSpace, leftItem, onActionChosen, id, sele
62
62
  };
63
63
  }, [selected, disabled]);
64
64
  const onPointerUp = (0, react_1.useCallback)((e) => {
65
- if (disabled) {
65
+ if (disabled || e.button !== 0) {
66
66
  return;
67
67
  }
68
68
  if (subMenu) {
@@ -10,7 +10,7 @@ const MenuCompositionName_1 = require("./MenuCompositionName");
10
10
  const Spinner_1 = require("./Spinner");
11
11
  const cwd = {
12
12
  fontSize: 13,
13
- opacity: 0.8,
13
+ color: colors_1.WHITE_ALPHA_80,
14
14
  display: 'flex',
15
15
  alignItems: 'center',
16
16
  justifyContent: 'center',
@@ -19,9 +19,14 @@ const cwd = {
19
19
  };
20
20
  const spinnerSize = 14;
21
21
  const spinner = {
22
+ opacity: 0.8,
22
23
  position: 'relative',
23
24
  width: spinnerSize,
24
25
  };
26
+ const openInEditor = {
27
+ display: 'flex',
28
+ opacity: 0.8,
29
+ };
25
30
  const noSpinner = {
26
31
  position: 'relative',
27
32
  width: spinnerSize,
@@ -48,7 +53,7 @@ const MenuBuildIndicator = ({ mobileLayout }) => {
48
53
  };
49
54
  }, []);
50
55
  return (jsx_runtime_1.jsxs("div", { style: cwd, title: window.remotion_cwd, children: [
51
- 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(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" }) }), mobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), mobileLayout ? (isBuilding ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
52
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 }) })
53
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 }))] }));
54
59
  };