@remotion/studio 4.0.525 → 4.0.527

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 (195) 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/AgentPrompt.d.ts +6 -0
  5. package/dist/components/AgentPrompt.js +107 -0
  6. package/dist/components/AssetFileIcon.js +2 -0
  7. package/dist/components/AssetSelectorItem.d.ts +1 -23
  8. package/dist/components/AssetSelectorItem.js +10 -200
  9. package/dist/components/Canvas.js +109 -44
  10. package/dist/components/CanvasCaptureDropHandler.js +63 -0
  11. package/dist/components/CanvasOrLoading.js +10 -2
  12. package/dist/components/CaptionInspector.js +9 -3
  13. package/dist/{error-overlay/remotion-overlay → components}/CodeFrame.d.ts +2 -0
  14. package/dist/components/CodeFrame.js +77 -0
  15. package/dist/components/CompositionSelectorItem.js +7 -17
  16. package/dist/components/CurrentAsset.js +6 -4
  17. package/dist/components/ElementInstallConfirmation.js +69 -38
  18. package/dist/components/FilePreview.js +4 -0
  19. package/dist/components/FixComputedValueModal.js +64 -96
  20. package/dist/components/GenerateWithAgentModal.d.ts +9 -0
  21. package/dist/components/GenerateWithAgentModal.js +39 -0
  22. package/dist/components/InitialCompositionLoader.js +1 -1
  23. package/dist/components/InlineDropdown.js +26 -2
  24. package/dist/components/InlineEditableTitle.js +3 -0
  25. package/dist/components/InspectorOpenInEditor.js +8 -4
  26. package/dist/components/InspectorPanel/CollapsibleInspectorSection.d.ts +7 -0
  27. package/dist/components/InspectorPanel/CollapsibleInspectorSection.js +14 -0
  28. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +1 -1
  29. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +20 -8
  30. package/dist/components/InspectorPanel/CompositionInspector.js +32 -15
  31. package/dist/components/InspectorPanel/CompositionMetadata.js +7 -0
  32. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +6 -12
  33. package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -0
  34. package/dist/components/InspectorPanel/GuideInspector.js +2 -3
  35. package/dist/components/InspectorPanel/KeyframeSettings.js +5 -6
  36. package/dist/components/InspectorPanel/MultiSequenceInspector.js +34 -2
  37. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +45 -4
  38. package/dist/components/InspectorPanel/common.d.ts +4 -0
  39. package/dist/components/InspectorPanel/common.js +15 -2
  40. package/dist/components/InspectorPanel/styles.d.ts +0 -3
  41. package/dist/components/InspectorPanel/styles.js +3 -27
  42. package/dist/components/InspectorPanel/use-composition-actions.d.ts +2 -0
  43. package/dist/components/InspectorPanel/use-composition-actions.js +16 -0
  44. package/dist/components/InspectorPanel/use-inspector-section-expanded.d.ts +1 -0
  45. package/dist/components/InspectorPanel/use-inspector-section-expanded.js +21 -0
  46. package/dist/components/InspectorSequenceSection.js +44 -35
  47. package/dist/components/InspectorSourceLocation.js +4 -0
  48. package/dist/components/KeyboardShortcutsSettings.js +12 -4
  49. package/dist/components/LutPreview.d.ts +4 -0
  50. package/dist/components/LutPreview.js +192 -0
  51. package/dist/components/MenuBuildIndicator.js +1 -0
  52. package/dist/components/MenuCompositionName.js +4 -9
  53. package/dist/components/Modals.js +3 -6
  54. package/dist/components/ModelsSettings.js +15 -4
  55. package/dist/components/NewComposition/CancelButton.js +1 -1
  56. package/dist/components/Notifications/NotificationCenter.d.ts +0 -1
  57. package/dist/components/Notifications/NotificationCenter.js +1 -22
  58. package/dist/components/Preview.js +3 -0
  59. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -0
  60. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  61. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +4 -9
  62. package/dist/components/RadioButton.js +1 -0
  63. package/dist/components/RenderModal/DataEditor.js +4 -1
  64. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.d.ts +1 -0
  65. package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.js +2 -1
  66. package/dist/components/RenderModal/WebRenderModal.js +10 -2
  67. package/dist/components/RenderQueue/CaptionQueueItem.js +5 -2
  68. package/dist/components/RenderQueue/CaptionQueueProcessor.js +35 -8
  69. package/dist/components/RenderQueue/VideoMattingQueueItem.js +1 -0
  70. package/dist/components/RenderQueue/caption-job-types.d.ts +6 -0
  71. package/dist/components/RenderQueue/index.js +1 -0
  72. package/dist/components/RendersTab.js +4 -0
  73. package/dist/components/SelectedOutlineElement.js +6 -0
  74. package/dist/components/SelectedOutlineSnapIndicators.d.ts +6 -0
  75. package/dist/components/SelectedOutlineSnapIndicators.js +16 -12
  76. package/dist/components/SequencePropsSubscriptionProvider.d.ts +3 -0
  77. package/dist/components/SequencePropsSubscriptionProvider.js +8 -6
  78. package/dist/components/SettingsButton.js +11 -2
  79. package/dist/components/SettingsModal.d.ts +1 -2
  80. package/dist/components/SettingsModal.js +24 -6
  81. package/dist/components/SettingsModalFooter.js +17 -3
  82. package/dist/components/SkillsSettings.d.ts +5 -0
  83. package/dist/components/SkillsSettings.js +29 -26
  84. package/dist/components/Timeline/Timeline.js +10 -11
  85. package/dist/components/Timeline/TimelineAssetField.js +81 -51
  86. package/dist/components/Timeline/TimelineDeleteKeybindings.js +6 -9
  87. package/dist/components/Timeline/TimelineEffectItem.js +1 -0
  88. package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -0
  89. package/dist/components/Timeline/TimelineExpandedRow.js +1 -0
  90. package/dist/components/Timeline/TimelineFieldLabel.js +1 -0
  91. package/dist/components/Timeline/TimelineHeightContainer.js +11 -1
  92. package/dist/components/Timeline/TimelineKeyframeControls.js +16 -1
  93. package/dist/components/Timeline/TimelineLayerChildren.d.ts +3 -3
  94. package/dist/components/Timeline/TimelineLayerChildren.js +11 -9
  95. package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -1
  96. package/dist/components/Timeline/TimelineLayerEye.js +6 -3
  97. package/dist/components/Timeline/TimelineList.js +9 -3
  98. package/dist/components/Timeline/TimelineSchemaField.js +2 -6
  99. package/dist/components/Timeline/TimelineSelection.d.ts +14 -3
  100. package/dist/components/Timeline/TimelineSelection.js +91 -49
  101. package/dist/components/Timeline/TimelineSequence.js +28 -2
  102. package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
  103. package/dist/components/Timeline/TimelineSequenceItem.d.ts +2 -0
  104. package/dist/components/Timeline/TimelineSequenceItem.js +45 -13
  105. package/dist/components/Timeline/TimelineViewport.d.ts +1 -0
  106. package/dist/components/Timeline/TimelineViewport.js +10 -1
  107. package/dist/components/Timeline/TimelineVirtualization.d.ts +3 -3
  108. package/dist/components/Timeline/delete-selected-timeline-item.js +2 -2
  109. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -2
  110. package/dist/components/Timeline/get-sequence-context-menu-items.js +143 -46
  111. package/dist/components/Timeline/normalize-font-weight-for-keyframe.d.ts +1 -0
  112. package/dist/components/Timeline/normalize-font-weight-for-keyframe.js +19 -0
  113. package/dist/components/Timeline/split-selected-timeline-item.d.ts +13 -10
  114. package/dist/components/Timeline/split-selected-timeline-item.js +58 -35
  115. package/dist/components/Timeline/timeline-display-groups.d.ts +9 -0
  116. package/dist/components/Timeline/timeline-display-groups.js +66 -0
  117. package/dist/components/Timeline/use-timeline-asset-drop.js +21 -21
  118. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +2 -1
  119. package/dist/components/Timeline/use-timeline-expanded-tree.js +1 -2
  120. package/dist/components/TimelineCombobox.js +1 -0
  121. package/dist/components/Transcription/TranscriptionModal.js +16 -11
  122. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +1 -1
  123. package/dist/components/UpdateStatusContext.d.ts +2 -2
  124. package/dist/components/UpdateStatusContext.js +6 -7
  125. package/dist/components/UpdatesSettings.js +6 -6
  126. package/dist/components/WebMcp.js +41 -41
  127. package/dist/components/asset-context-menu.d.ts +32 -0
  128. package/dist/components/asset-context-menu.js +242 -0
  129. package/dist/components/composition-drop-preview.d.ts +9 -2
  130. package/dist/components/composition-drop-preview.js +7 -4
  131. package/dist/components/composition-menu-items.d.ts +4 -6
  132. package/dist/components/composition-menu-items.js +191 -75
  133. package/dist/components/delete-jsx-nodes-api.d.ts +2 -0
  134. package/dist/components/{delete-jsx-node-api.js → delete-jsx-nodes-api.js} +5 -5
  135. package/dist/components/get-open-in-menu-items.d.ts +6 -5
  136. package/dist/components/get-open-in-menu-items.js +22 -16
  137. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  138. package/dist/components/keyboard-shortcuts.js +3 -1
  139. package/dist/components/public-output-name.d.ts +1 -0
  140. package/dist/components/public-output-name.js +7 -3
  141. package/dist/components/selected-outline-order.js +18 -12
  142. package/dist/components/use-open-in-menu-apps.d.ts +14 -0
  143. package/dist/components/use-open-in-menu-apps.js +33 -0
  144. package/dist/error-overlay/remotion-overlay/ErrorDisplay.js +2 -2
  145. package/dist/error-overlay/remotion-overlay/OpenInEditor.d.ts +1 -0
  146. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +3 -3
  147. package/dist/error-overlay/remotion-overlay/StackFrame.d.ts +5 -1
  148. package/dist/error-overlay/remotion-overlay/StackFrame.js +26 -19
  149. package/dist/esm/{CaptionQueueProcessor-k0yrm3dj.mjs → CaptionQueueProcessor-npa6szn1.mjs} +39 -8
  150. package/dist/esm/{LazyModels-gfmpcy4h.mjs → LazyModels-nh3c8h9p.mjs} +4 -3
  151. package/dist/esm/{LazyModels-m1rf06wh.mjs → LazyModels-rr5v8h5y.mjs} +4 -3
  152. package/dist/esm/{TranscriptionModal-8pvrehg4.mjs → TranscriptionModal-79m5wgcj.mjs} +25 -17
  153. package/dist/esm/{VideoMattingModal-fefbzgka.mjs → VideoMattingModal-31pew0xj.mjs} +9 -6
  154. package/dist/esm/index-21hxsfaa.mjs +239 -0
  155. package/dist/esm/{index-s848rffx.mjs → index-4zen9prq.mjs} +5438 -4686
  156. package/dist/esm/index-5t2dwxsk.mjs +530 -0
  157. package/dist/esm/{index-vsxrxfpj.mjs → index-614tdz2q.mjs} +1 -1
  158. package/dist/esm/{index-0x13f28h.mjs → index-9xxg6218.mjs} +20 -541
  159. package/dist/esm/{index-hbezgbbq.mjs → index-ac5550e7.mjs} +1 -1
  160. package/dist/esm/{index-41kqns5c.mjs → index-e855w59j.mjs} +15 -92
  161. package/dist/esm/{index-tzxb8808.mjs → index-n5gmcvhz.mjs} +8 -8
  162. package/dist/esm/{index-ggqpre9v.mjs → index-ppspzgn9.mjs} +4963 -4178
  163. package/dist/esm/{index-jrw61pkj.mjs → index-r0ejh5sy.mjs} +1 -1
  164. package/dist/esm/index-r1gr3j3a.mjs +80 -0
  165. package/dist/esm/{index-mww32xc8.mjs → index-s7qa3xbw.mjs} +6 -4
  166. package/dist/esm/{index-1089795y.mjs → index-vxwg66ar.mjs} +7 -22
  167. package/dist/esm/index.mjs +13 -6
  168. package/dist/esm/internals.mjs +10 -7
  169. package/dist/esm/previewEntry.mjs +10 -7
  170. package/dist/esm/{resolve-composition-component-location-bt2d6qxq.mjs → resolve-composition-component-location-qrp05g62.mjs} +1 -1
  171. package/dist/helpers/client-id.d.ts +1 -0
  172. package/dist/helpers/client-id.js +8 -4
  173. package/dist/helpers/copy-text.js +1 -16
  174. package/dist/helpers/cube-lut.d.ts +12 -0
  175. package/dist/helpers/cube-lut.js +160 -0
  176. package/dist/helpers/get-preview-file-type.d.ts +1 -1
  177. package/dist/helpers/get-preview-file-type.js +3 -0
  178. package/dist/helpers/hoverable.js +2 -1
  179. package/dist/helpers/open-in-editor.d.ts +5 -2
  180. package/dist/helpers/open-in-editor.js +13 -5
  181. package/dist/helpers/settings-tab-availability.d.ts +14 -0
  182. package/dist/helpers/settings-tab-availability.js +35 -0
  183. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  184. package/dist/helpers/use-keybinding.d.ts +1 -1
  185. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  186. package/dist/helpers/use-menu-structure.js +31 -21
  187. package/dist/icons/lut.d.ts +4 -0
  188. package/dist/icons/lut.js +6 -0
  189. package/dist/icons/sparkles.d.ts +4 -0
  190. package/dist/icons/sparkles.js +6 -0
  191. package/dist/state/modals.d.ts +17 -2
  192. package/dist/state/timeline-zoom.js +4 -0
  193. package/package.json +19 -19
  194. package/dist/components/delete-jsx-node-api.d.ts +0 -2
  195. package/dist/error-overlay/remotion-overlay/CodeFrame.js +0 -62
@@ -5,12 +5,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const colors_1 = require("../../helpers/colors");
6
6
  const hoverable_1 = require("../../helpers/hoverable");
7
7
  const styles_1 = require("./styles");
8
- const collapsibleSectionHeaderButton = {
9
- appearance: 'none',
10
- backgroundColor: 'transparent',
11
- border: 'none',
12
- borderRadius: 3,
13
- cursor: 'default',
8
+ const sectionTitle = {
14
9
  display: 'block',
15
10
  flex: 1,
16
11
  fontFamily: 'Arial, Helvetica, sans-serif',
@@ -24,7 +19,20 @@ const collapsibleSectionHeaderButton = {
24
19
  textAlign: 'left',
25
20
  textOverflow: 'ellipsis',
26
21
  userSelect: 'none',
22
+ WebkitUserSelect: 'none',
27
23
  whiteSpace: 'nowrap',
24
+ };
25
+ const staticSectionTitle = {
26
+ ...sectionTitle,
27
+ color: colors_1.LIGHT_TEXT,
28
+ };
29
+ const collapsibleSectionHeaderButton = {
30
+ ...sectionTitle,
31
+ appearance: 'none',
32
+ backgroundColor: 'transparent',
33
+ border: 'none',
34
+ borderRadius: 3,
35
+ cursor: 'default',
28
36
  ...(0, hoverable_1.hoverableStyle)({
29
37
  idleBackground: colors_1.TRANSPARENT,
30
38
  hoverBackground: colors_1.TRANSPARENT,
@@ -32,8 +40,12 @@ const collapsibleSectionHeaderButton = {
32
40
  hoverColor: colors_1.WHITE,
33
41
  }),
34
42
  };
43
+ const stopActivationKeyPropagation = (event) => {
44
+ if (event.key === 'Enter' || event.key === ' ') {
45
+ event.stopPropagation();
46
+ }
47
+ };
35
48
  const CollapsibleInspectorSectionHeader = ({ action, expanded, label, onToggle }) => {
36
- return (jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [
37
- jsx_runtime_1.jsx("button", { type: "button", "aria-expanded": expanded, "aria-label": `${expanded ? 'Collapse' : 'Expand'} ${label}`, className: `__remotion-inspector-section-title ${hoverable_1.HOVERABLE_CLASS_NAME}`, onClick: onToggle, style: collapsibleSectionHeaderButton, children: label }), action] }));
49
+ return (jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [onToggle === null ? (jsx_runtime_1.jsx("div", { style: staticSectionTitle, children: label })) : (jsx_runtime_1.jsx("button", { type: "button", "aria-expanded": expanded, "aria-label": `${expanded ? 'Collapse' : 'Expand'} ${label}`, className: `__remotion-inspector-section-title ${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, onClick: onToggle, onKeyDown: stopActivationKeyPropagation, onKeyUp: stopActivationKeyPropagation, style: collapsibleSectionHeaderButton, children: label })), action] }));
38
50
  };
39
51
  exports.CollapsibleInspectorSectionHeader = CollapsibleInspectorSectionHeader;
@@ -11,6 +11,7 @@ const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
11
11
  const cloud_download_1 = require("../../icons/cloud-download");
12
12
  const frame_1 = require("../../icons/frame");
13
13
  const solid_1 = require("../../icons/solid");
14
+ const sparkles_1 = require("../../icons/sparkles");
14
15
  const video_1 = require("../../icons/video");
15
16
  const VisualControls_1 = require("../../visual-controls/VisualControls");
16
17
  const ConfirmationDialog_1 = require("../ConfirmationDialog");
@@ -22,16 +23,20 @@ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
22
23
  const ObserveDefaultPropsContext_1 = require("../ObserveDefaultPropsContext");
23
24
  const DataEditor_1 = require("../RenderModal/DataEditor");
24
25
  const infer_zod_schema_from_value_1 = require("../RenderModal/SchemaEditor/infer-zod-schema-from-value");
26
+ const scroll_to_default_props_path_1 = require("../RenderModal/SchemaEditor/scroll-to-default-props-path");
25
27
  const zod_schema_type_1 = require("../RenderModal/SchemaEditor/zod-schema-type");
26
28
  const WarningIndicatorButton_1 = require("../RenderModal/WarningIndicatorButton");
27
29
  const SegmentedControl_1 = require("../SegmentedControl");
28
30
  const VisualControlsContent_1 = require("../VisualControls/VisualControlsContent");
31
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
32
+ const CollapsibleInspectorSectionHeader_1 = require("./CollapsibleInspectorSectionHeader");
29
33
  const common_1 = require("./common");
30
34
  const CompositionInspectorHeader_1 = require("./CompositionInspectorHeader");
31
35
  const CompositionMetadata_1 = require("./CompositionMetadata");
32
36
  const ElementLibraryButton_1 = require("./ElementLibraryButton");
33
37
  const styles_1 = require("./styles");
34
38
  const use_composition_actions_1 = require("./use-composition-actions");
39
+ const use_inspector_section_expanded_1 = require("./use-inspector-section-expanded");
35
40
  const actionIconStyle = {
36
41
  height: 18,
37
42
  width: 18,
@@ -53,7 +58,7 @@ const downloadLicenseLink = {
53
58
  const CompositionActions = () => {
54
59
  var _a;
55
60
  var _b;
56
- const { canInsertAsset, canInsertComposition, canInsertSolid, canShowInsertAsset, canShowInsertComposition, canShowInsertSolid, insertAsset, insertComposition, insertSolid, } = (0, use_composition_actions_1.useCompositionActions)();
61
+ const { canInsertAsset, canInsertComposition, canInsertSolid, canShowInsertAsset, canShowInsertComposition, canShowInsertSolid, insertAsset, insertComposition, insertSolid, generateWithAgent, canShowGenerateWithAgent, } = (0, use_composition_actions_1.useCompositionActions)();
57
62
  const downloadProject = (_b = (_a = (0, browser_studio_operations_1.getBrowserStudioOperations)()) === null || _a === void 0 ? void 0 : _a.downloadProject) !== null && _b !== void 0 ? _b : null;
58
63
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
59
64
  const onDownloadProject = (0, react_1.useCallback)(async () => {
@@ -84,12 +89,11 @@ const CompositionActions = () => {
84
89
  if (!canShowInsertAsset &&
85
90
  !canShowInsertComposition &&
86
91
  !canShowInsertSolid &&
92
+ !canShowGenerateWithAgent &&
87
93
  downloadProject === null) {
88
94
  return null;
89
95
  }
90
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
91
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Actions" }), jsx_runtime_1.jsxs(common_1.InspectorQuickActionsSection, { children: [canShowInsertSolid ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertSolid, onClick: insertSolid, renderIcon: (color) => (jsx_runtime_1.jsx(solid_1.SolidIcon, { color: color, style: actionIconStyle })), children: "Add Solid" })) : null, canShowInsertAsset ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertAsset, onClick: insertAsset, renderIcon: (color) => (jsx_runtime_1.jsx(frame_1.PicIcon, { color: color, style: actionIconStyle })), children: "Add asset..." })) : null, canShowInsertComposition ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertComposition, onClick: insertComposition, renderIcon: (color) => (jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: actionIconStyle })), children: "Add composition..." })) : null, canShowInsertAsset ? jsx_runtime_1.jsx(ElementLibraryButton_1.ElementLibraryButton, {}) : null, downloadProject ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: false, onClick: onDownloadProject, renderIcon: (color) => (jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: actionIconStyle })), children: "Download project" })) : null] })
92
- ] }));
96
+ return (jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Actions", sectionId: "composition-actions", children: jsx_runtime_1.jsxs(common_1.InspectorQuickActionsSection, { children: [canShowInsertSolid ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertSolid, onClick: insertSolid, renderIcon: (color) => (jsx_runtime_1.jsx(solid_1.SolidIcon, { color: color, style: actionIconStyle })), children: "Add Solid" })) : null, canShowInsertAsset ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertAsset, onClick: insertAsset, renderIcon: (color) => (jsx_runtime_1.jsx(frame_1.PicIcon, { color: color, style: actionIconStyle })), children: "Add asset..." })) : null, canShowInsertComposition ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canInsertComposition, onClick: insertComposition, renderIcon: (color) => (jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: actionIconStyle })), children: "Add composition..." })) : null, canShowGenerateWithAgent ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: false, onClick: generateWithAgent, renderIcon: (color) => (jsx_runtime_1.jsx(sparkles_1.SparklesIcon, { color: color, style: actionIconStyle })), children: "Generate with agent..." })) : null, canShowInsertAsset ? jsx_runtime_1.jsx(ElementLibraryButton_1.ElementLibraryButton, {}) : null, downloadProject ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: false, onClick: onDownloadProject, renderIcon: (color) => (jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: actionIconStyle })), children: "Download project" })) : null] }) }));
93
97
  };
94
98
  const CompositionDefaultPropsSection = ({ composition, currentDefaultProps, readOnlyStudio, setDefaultProps }) => {
95
99
  var _a;
@@ -97,6 +101,23 @@ const CompositionDefaultPropsSection = ({ composition, currentDefaultProps, read
97
101
  const zodTypes = (0, get_zod_if_possible_1.useZodTypesIfPossible)();
98
102
  const canSaveDefaultProps = (0, react_1.useContext)(ObserveDefaultPropsContext_1.ObserveDefaultPropsContext);
99
103
  const [defaultPropsMode, setDefaultPropsMode] = (0, react_1.useState)('schema');
104
+ const [expanded, setExpanded] = (0, use_inspector_section_expanded_1.useInspectorSectionExpanded)('composition-default-props');
105
+ const pendingScroll = (0, react_1.useRef)(null);
106
+ (0, react_1.useImperativeHandle)(scroll_to_default_props_path_1.expandDefaultPropsEditorRef, () => (onExpanded) => {
107
+ if (expanded) {
108
+ onExpanded();
109
+ return;
110
+ }
111
+ pendingScroll.current = onExpanded;
112
+ setExpanded(true);
113
+ }, [expanded, setExpanded]);
114
+ (0, react_1.useLayoutEffect)(() => {
115
+ if (expanded && pendingScroll.current !== null) {
116
+ const scroll = pendingScroll.current;
117
+ pendingScroll.current = null;
118
+ scroll();
119
+ }
120
+ }, [expanded]);
100
121
  const compositionId = composition.id;
101
122
  (0, react_1.useEffect)(() => {
102
123
  setDefaultPropsMode('schema');
@@ -142,17 +163,15 @@ const CompositionDefaultPropsSection = ({ composition, currentDefaultProps, read
142
163
  defaultProps: currentDefaultProps,
143
164
  mode: defaultPropsMode,
144
165
  propsEditType: 'default-props',
145
- showCannotSaveDefaultPropsWarning: canShowDefaultPropsSection,
166
+ showCannotSaveDefaultPropsWarning: canShowDefaultPropsSection && !readOnlyStudio,
146
167
  });
147
- if (readOnlyStudio || !canShowDefaultPropsSection) {
168
+ if (!canShowDefaultPropsSection) {
148
169
  return null;
149
170
  }
150
171
  return (jsx_runtime_1.jsxs("div", { style: styles_1.compositionDefaultPropsSection, children: [
151
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [
152
- jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderStart, children: [
153
- jsx_runtime_1.jsx("span", { style: styles_1.sectionHeaderTitle, children: "Default Props" }), jsx_runtime_1.jsx(SegmentedControl_1.SegmentedControl, { items: defaultPropsModeItems, needsWrapping: false, size: "compact" })
154
- ] }), jsx_runtime_1.jsx("div", { style: styles_1.sectionHeaderEnd, children: defaultPropsWarnings.length > 0 ? (jsx_runtime_1.jsx(WarningIndicatorButton_1.WarningIndicatorButton, { setShowWarning: setShowWarning, showWarning: showWarning, warningCount: defaultPropsWarnings.length, size: "compact" })) : null })
155
- ] }) }), defaultPropsWarnings.length > 0 && showWarning ? (jsx_runtime_1.jsx("div", { style: styles_1.defaultPropsWarningContainer, children: jsx_runtime_1.jsx(common_1.InspectorDefaultPropsWarnings, { warnings: defaultPropsWarnings }) })) : null, jsx_runtime_1.jsx(DefaultPropsEditor_1.DefaultPropsEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, propsEditType: "default-props", schemaErrorMode: "compact", layout: "inspector", mode: defaultPropsMode, onModeChange: setDefaultPropsMode, hideModeControls: canShowDefaultPropsSection, warnings: defaultPropsWarnings, showWarning: false, setShowWarning: setShowWarning, hideWarningButton: true }, composition.id)
172
+ jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: jsx_runtime_1.jsx(CollapsibleInspectorSectionHeader_1.CollapsibleInspectorSectionHeader, { action: expanded ? (jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [
173
+ jsx_runtime_1.jsx(SegmentedControl_1.SegmentedControl, { items: defaultPropsModeItems, needsWrapping: false, size: "compact" }), defaultPropsWarnings.length > 0 ? (jsx_runtime_1.jsx(WarningIndicatorButton_1.WarningIndicatorButton, { setShowWarning: setShowWarning, showWarning: showWarning, warningCount: defaultPropsWarnings.length, size: "compact" })) : null] })) : null, expanded: expanded, label: readOnlyStudio ? 'Props' : 'Default Props', onToggle: () => setExpanded(!expanded) }) }), jsx_runtime_1.jsxs(common_1.InspectorSectionBody, { expanded: expanded, children: [defaultPropsWarnings.length > 0 && showWarning ? (jsx_runtime_1.jsx("div", { style: styles_1.defaultPropsWarningContainer, children: jsx_runtime_1.jsx(common_1.InspectorDefaultPropsWarnings, { warnings: defaultPropsWarnings }) })) : null, jsx_runtime_1.jsx(DefaultPropsEditor_1.DefaultPropsEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, propsEditType: "default-props", schemaErrorMode: "compact", layout: "inspector", mode: defaultPropsMode, onModeChange: setDefaultPropsMode, hideModeControls: canShowDefaultPropsSection, warnings: defaultPropsWarnings, showWarning: false, setShowWarning: setShowWarning, hideWarningButton: true }, composition.id)
174
+ ] })
156
175
  ] }));
157
176
  };
158
177
  const CompositionVisualControlsSection = ({ readOnlyStudio }) => {
@@ -163,15 +182,13 @@ const CompositionVisualControlsSection = ({ readOnlyStudio }) => {
163
182
  if (!hasVisualControls) {
164
183
  return null;
165
184
  }
166
- return (jsx_runtime_1.jsxs("div", { style: styles_1.compositionVisualControlsSection, children: [
167
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Visual Controls" }), jsx_runtime_1.jsx(VisualControlsContent_1.VisualControlsContent, {})
168
- ] }));
185
+ return (jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Visual Controls", sectionId: "composition-visual-controls", children: jsx_runtime_1.jsx(VisualControlsContent_1.VisualControlsContent, {}) }));
169
186
  };
170
187
  const CompositionInspector = ({ composition, currentDefaultProps, readOnlyStudio, setDefaultProps }) => {
171
188
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
172
189
  return (jsx_runtime_1.jsxs("div", { style: styles_1.scrollableContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
173
190
  jsx_runtime_1.jsxs("div", { style: styles_1.inspectorOverviewSection, children: [
174
- jsx_runtime_1.jsx(CompositionInspectorHeader_1.CompositionInspectorHeader, {}), jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Metadata" }), jsx_runtime_1.jsx(CompositionMetadata_1.CompositionMetadata, { compositionId: composition.id, disabled: readOnlyStudio || previewServerState.type !== 'connected', stack: composition.stack })
191
+ jsx_runtime_1.jsx(CompositionInspectorHeader_1.CompositionInspectorHeader, {}), jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Metadata", sectionId: "composition-metadata", children: jsx_runtime_1.jsx(CompositionMetadata_1.CompositionMetadata, { compositionId: composition.id, disabled: readOnlyStudio || previewServerState.type !== 'connected', stack: composition.stack }) })
175
192
  ] }), jsx_runtime_1.jsx(CompositionDefaultPropsSection, { composition: composition, currentDefaultProps: currentDefaultProps, readOnlyStudio: readOnlyStudio, setDefaultProps: setDefaultProps }), jsx_runtime_1.jsx(CompositionVisualControlsSection, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(CompositionActions, {})
176
193
  ] }));
177
194
  };
@@ -31,6 +31,7 @@ const computedContainerStyle = {
31
31
  ...InputDragger_1.inputDraggerContainerStyle,
32
32
  textAlign: 'right',
33
33
  userSelect: 'none',
34
+ WebkitUserSelect: 'none',
34
35
  };
35
36
  const computedValueStyle = {
36
37
  color: colors_1.WHITE_ALPHA_40,
@@ -38,9 +39,13 @@ const computedValueStyle = {
38
39
  fontSize: 12,
39
40
  fontStyle: 'italic',
40
41
  lineHeight: '20px',
42
+ userSelect: 'none',
43
+ WebkitUserSelect: 'none',
41
44
  };
42
45
  const metadataFormatterStyle = {
43
46
  fontSize: 13,
47
+ userSelect: 'none',
48
+ WebkitUserSelect: 'none',
44
49
  };
45
50
  const metadataDraggerStyles = {
46
51
  durationInFrames: {
@@ -110,6 +115,8 @@ const metadataLabelText = {
110
115
  minWidth: 0,
111
116
  overflow: 'hidden',
112
117
  textOverflow: 'ellipsis',
118
+ userSelect: 'none',
119
+ WebkitUserSelect: 'none',
113
120
  whiteSpace: 'nowrap',
114
121
  };
115
122
  const dimensionPresets = [
@@ -4,7 +4,6 @@ exports.ConnectedCompositionsSection = exports.useConnectedCompositions = 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 get_connected_compositions_1 = require("../../helpers/get-connected-compositions");
9
8
  const noop_1 = require("../../helpers/noop");
10
9
  const modals_1 = require("../../state/modals");
@@ -13,7 +12,8 @@ const CompositionOrStillIcon_1 = require("../CompositionOrStillIcon");
13
12
  const ContextMenu_1 = require("../ContextMenu");
14
13
  const InitialCompositionLoader_1 = require("../InitialCompositionLoader");
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");
16
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
17
17
  const common_1 = require("./common");
18
18
  const compositionIconStyle = {
19
19
  height: 18,
@@ -36,33 +36,27 @@ const useConnectedCompositions = ({ track, }) => {
36
36
  };
37
37
  exports.useConnectedCompositions = useConnectedCompositions;
38
38
  const ConnectedCompositionsSection = ({ connectedCompositions }) => {
39
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
40
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Connected compositions" }), jsx_runtime_1.jsx("div", { style: compositionListStyle, children: connectedCompositions.map((composition) => (jsx_runtime_1.jsx(ConnectedCompositionRow, { composition: composition }, composition.id))) })
41
- ] }));
39
+ return (jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Connected compositions", sectionId: "connected-compositions", children: jsx_runtime_1.jsx("div", { style: compositionListStyle, children: connectedCompositions.map((composition) => (jsx_runtime_1.jsx(ConnectedCompositionRow, { composition: composition }, composition.id))) }) }));
42
40
  };
43
41
  exports.ConnectedCompositionsSection = ConnectedCompositionsSection;
44
42
  const ConnectedCompositionRow = ({ composition }) => {
45
43
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
46
44
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
47
- const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
48
- .previewServerState.type;
49
- const { defaultEditorId, defaultEditorName } = (0, use_default_editor_info_1.useEditorOpening)(connectionStatus === 'connected');
45
+ const { connectionStatus, openInApps } = (0, use_open_in_menu_apps_1.useOpenInMenuApps)();
50
46
  const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(composition.stack);
51
47
  const getContextMenuItems = (0, react_1.useCallback)(() => (0, composition_menu_items_1.getCompositionContextMenuItems)({
52
48
  closeMenu: noop_1.noop,
53
49
  composition,
54
50
  connectionStatus,
55
- editorId: defaultEditorId,
56
- editorName: defaultEditorName,
57
51
  includeCompositionManagementItems: false,
52
+ openInApps,
58
53
  readOnlyStudio: window.remotion_isReadOnlyStudio,
59
54
  resolvedLocation,
60
55
  setSelectedModal,
61
56
  }), [
62
57
  composition,
63
58
  connectionStatus,
64
- defaultEditorId,
65
- defaultEditorName,
59
+ openInApps,
66
60
  resolvedLocation,
67
61
  setSelectedModal,
68
62
  ]);
@@ -44,6 +44,8 @@ const elementLibraryDropdownLabelStyle = {
44
44
  overflow: 'hidden',
45
45
  textAlign: 'left',
46
46
  textOverflow: 'ellipsis',
47
+ userSelect: 'none',
48
+ WebkitUserSelect: 'none',
47
49
  whiteSpace: 'nowrap',
48
50
  };
49
51
  const elementLibraryDropdownCaretStyle = {
@@ -6,6 +6,7 @@ const react_1 = require("react");
6
6
  const editor_guides_1 = require("../../state/editor-guides");
7
7
  const is_menu_item_1 = require("../Menu/is-menu-item");
8
8
  const InputDragger_1 = require("../NewComposition/InputDragger");
9
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
9
10
  const common_1 = require("./common");
10
11
  const styles_1 = require("./styles");
11
12
  const updateGuidePosition = ({ guideId, persist, position, setGuidesList, }) => {
@@ -48,8 +49,6 @@ const GuideInspector = ({ selection }) => {
48
49
  if (!guide) {
49
50
  return jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Guide unavailable" });
50
51
  }
51
- return (jsx_runtime_1.jsxs("div", { style: styles_1.selectedContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
52
- jsx_runtime_1.jsxs(common_1.InspectorSectionHeader, { children: [guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal', " guide"] }), jsx_runtime_1.jsx("div", { style: styles_1.guideDetailsContainer, children: jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: guide.orientation === 'vertical' ? 'X position' : 'Y position', children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: guide.position, status: "ok", onValueChange: onValueChange, onValueChangeEnd: onValueChangeEnd, onTextChange: () => undefined, step: 1, formatter: (value) => String(Math.round(Number(value))), rightAlign: true, small: true }) }) })
53
- ] }));
52
+ return (jsx_runtime_1.jsx("div", { style: styles_1.selectedContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: `${guide.orientation === 'vertical' ? 'Vertical' : 'Horizontal'} guide`, sectionId: "guide", children: jsx_runtime_1.jsx("div", { style: styles_1.guideDetailsContainer, children: jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: guide.orientation === 'vertical' ? 'X position' : 'Y position', children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: guide.position, status: "ok", onValueChange: onValueChange, onValueChangeEnd: onValueChangeEnd, onTextChange: () => undefined, step: 1, formatter: (value) => String(Math.round(Number(value))), rightAlign: true, small: true }) }) }) }) }));
54
53
  };
55
54
  exports.GuideInspector = GuideInspector;
@@ -8,6 +8,7 @@ const client_id_1 = require("../../helpers/client-id");
8
8
  const ComboBox_1 = require("../NewComposition/ComboBox");
9
9
  const InputDragger_1 = require("../NewComposition/InputDragger");
10
10
  const call_update_keyframe_settings_1 = require("../Timeline/call-update-keyframe-settings");
11
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
11
12
  const common_1 = require("./common");
12
13
  const styles_1 = require("./styles");
13
14
  const comboStyle = {
@@ -132,11 +133,9 @@ const KeyframeSettings = ({ update }) => {
132
133
  const posterizeFormatter = (0, react_1.useCallback)((value) => {
133
134
  return String(Math.round(Number(value)));
134
135
  }, []);
135
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
136
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Keyframe settings" }), jsx_runtime_1.jsxs("div", { style: keyframeSettingsContainer, children: [canEditInterpolationSettings ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
137
- jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Extrapolate left", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: leftValues, selectedId: propStatus.clamping.left, title: "Extrapolate left", style: comboStyle, size: "small" }) }), jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Extrapolate right", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: rightValues, selectedId: propStatus.clamping.right, title: "Extrapolate right", style: comboStyle, size: "small" }) }), jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Output", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: outputValues, selectedId: (_b = propStatus.output) !== null && _b !== void 0 ? _b : 'linear', title: "Output", style: comboStyle, size: "small" }) })
138
- ] })) : null, jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Posterize", children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: posterize, status: "ok", onValueChange: onPosterizeChange, onValueChangeEnd: onPosterizeChangeEnd, onTextChange: () => undefined, min: 0, step: 1, formatter: posterizeFormatter, rightAlign: true, small: true, disabled: disabled }) })
139
- ] })
140
- ] }));
136
+ return (jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Keyframe settings", sectionId: "keyframe-settings", children: jsx_runtime_1.jsxs("div", { style: keyframeSettingsContainer, children: [canEditInterpolationSettings ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
137
+ jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Extrapolate left", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: leftValues, selectedId: propStatus.clamping.left, title: "Extrapolate left", style: comboStyle, size: "small" }) }), jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Extrapolate right", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: rightValues, selectedId: propStatus.clamping.right, title: "Extrapolate right", style: comboStyle, size: "small" }) }), jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Output", children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: outputValues, selectedId: (_b = propStatus.output) !== null && _b !== void 0 ? _b : 'linear', title: "Output", style: comboStyle, size: "small" }) })
138
+ ] })) : null, jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Posterize", children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: posterize, status: "ok", onValueChange: onPosterizeChange, onValueChangeEnd: onPosterizeChangeEnd, onTextChange: () => undefined, min: 0, step: 1, formatter: posterizeFormatter, rightAlign: true, small: true, disabled: disabled }) })
139
+ ] }) }));
141
140
  };
142
141
  exports.KeyframeSettings = KeyframeSettings;
@@ -7,12 +7,16 @@ const react_1 = require("react");
7
7
  const remotion_1 = require("remotion");
8
8
  const calculate_timeline_1 = require("../../helpers/calculate-timeline");
9
9
  const colors_1 = require("../../helpers/colors");
10
+ const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
10
11
  const timeline_layout_1 = require("../../helpers/timeline-layout");
12
+ const scissors_1 = require("../../icons/scissors");
11
13
  const InspectorInfoHeader_1 = require("../InspectorInfoHeader");
12
14
  const InspectorPanelLayout_1 = require("../InspectorPanelLayout");
13
15
  const layout_1 = require("../layout");
14
16
  const is_menu_item_1 = require("../Menu/is-menu-item");
17
+ const split_selected_timeline_item_1 = require("../Timeline/split-selected-timeline-item");
15
18
  const TimelineRowLayoutContext_1 = require("../Timeline/TimelineRowLayoutContext");
19
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
16
20
  const common_1 = require("./common");
17
21
  const MultiSequenceField_1 = require("./MultiSequenceField");
18
22
  const styles_1 = require("./styles");
@@ -27,8 +31,14 @@ const selectionCountStyle = {
27
31
  textOverflow: 'ellipsis',
28
32
  whiteSpace: 'nowrap',
29
33
  };
34
+ const actionIconStyle = {
35
+ display: 'block',
36
+ height: 16,
37
+ width: 16,
38
+ };
30
39
  const MultiSequenceInspector = ({ selections, readOnlyStudio }) => {
31
40
  const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
41
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
32
42
  const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
33
43
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
34
44
  const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -92,11 +102,33 @@ const MultiSequenceInspector = ({ selections, readOnlyStudio }) => {
92
102
  });
93
103
  return ((_a = allFields[0]) !== null && _a !== void 0 ? _a : []).filter((field) => allFields.every((candidate) => candidate.some((other) => other.key === field.key && other.fieldSchema === field.fieldSchema)));
94
104
  }, [getDragOverrides, propStatuses, runtimeValues, targets]);
105
+ const canSplit = !readOnlyStudio && (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
106
+ const onSplit = (0, react_1.useCallback)(() => {
107
+ var _a;
108
+ if (!canSplit) {
109
+ return;
110
+ }
111
+ (_a = (0, split_selected_timeline_item_1.splitSelectedTimelineItems)({
112
+ selections,
113
+ sequences,
114
+ overrideIdsToNodePaths: overrideIdToNodePathMappings,
115
+ propStatuses,
116
+ splitFrame: timelinePosition,
117
+ })) === null || _a === void 0 ? void 0 : _a.catch(() => undefined);
118
+ }, [
119
+ canSplit,
120
+ overrideIdToNodePathMappings,
121
+ propStatuses,
122
+ selections,
123
+ sequences,
124
+ timelinePosition,
125
+ ]);
95
126
  return (jsx_runtime_1.jsxs("div", { style: styles_1.scrollableContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
96
127
  jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoHeader, { padding: "4px 0", children: jsx_runtime_1.jsxs("div", { style: selectionCountStyle, children: [selections.length, " sequences selected"] }) }), jsx_runtime_1.jsx("div", { role: "separator", style: styles_1.sequenceHeaderDivider }), targets === null ? (jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Sequence controls unavailable" })) : fields.length === 0 ? (jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "No shared controls" })) : (jsx_runtime_1.jsx(TimelineRowLayoutContext_1.TimelineRowLayoutContext.Provider, { value: TimelineRowLayoutContext_1.INSPECTOR_TIMELINE_ROW_LAYOUT, children: timeline_layout_1.SCHEMA_FIELD_GROUPS.map((group) => {
97
128
  const groupedFields = fields.filter((field) => field.group === group.id);
98
- return groupedFields.length === 0 ? null : (jsx_runtime_1.jsx(common_1.InspectorSection, { header: group.label, children: groupedFields.map((field) => (jsx_runtime_1.jsx(MultiSequenceField_1.MultiSequenceField, { field: field, targets: targets, readOnlyStudio: readOnlyStudio }, JSON.stringify(targets.map((target) => target.nodePath)) +
129
+ return groupedFields.length === 0 ? null : (jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: group.label, sectionId: `multi-sequence-${group.id}`, children: groupedFields.map((field) => (jsx_runtime_1.jsx(MultiSequenceField_1.MultiSequenceField, { field: field, targets: targets, readOnlyStudio: readOnlyStudio }, JSON.stringify(targets.map((target) => target.nodePath)) +
99
130
  field.key))) }, group.id));
100
- }) }))] }));
131
+ }) })), jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Actions", sectionId: "multi-sequence-actions", children: jsx_runtime_1.jsx(common_1.InspectorQuickActionsSection, { children: jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canSplit, onClick: onSplit, title: canSplit ? undefined : 'Studio is read-only', renderIcon: (color) => (jsx_runtime_1.jsx(scissors_1.ScissorsIcon, { style: actionIconStyle, color: color })), children: "Split selected" }) }) })
132
+ ] }));
101
133
  };
102
134
  exports.MultiSequenceInspector = MultiSequenceInspector;
@@ -6,15 +6,19 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const client_id_1 = require("../../helpers/client-id");
8
8
  const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
9
+ const use_media_metadata_1 = require("../../helpers/use-media-metadata");
9
10
  const audio_1 = require("../../icons/audio");
10
11
  const duplicate_1 = require("../../icons/duplicate");
11
12
  const scissors_1 = require("../../icons/scissors");
12
13
  const snowflake_1 = require("../../icons/snowflake");
14
+ const transcription_1 = require("../../icons/transcription");
13
15
  const trash_1 = require("../../icons/trash");
16
+ const modals_1 = require("../../state/modals");
14
17
  const ConfirmationDialog_1 = require("../ConfirmationDialog");
15
18
  const InspectorSequenceSection_1 = require("../InspectorSequenceSection");
16
19
  const is_menu_item_1 = require("../Menu/is-menu-item");
17
20
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
21
+ const public_output_name_1 = require("../public-output-name");
18
22
  const split_video_from_audio_api_1 = require("../split-video-from-audio-api");
19
23
  const duplicate_selected_timeline_item_1 = require("../Timeline/duplicate-selected-timeline-item");
20
24
  const split_selected_timeline_item_1 = require("../Timeline/split-selected-timeline-item");
@@ -22,6 +26,7 @@ const TimelineSelection_1 = require("../Timeline/TimelineSelection");
22
26
  const use_delete_timeline_items_1 = require("../Timeline/use-delete-timeline-items");
23
27
  const use_sequence_freeze_frame_menu_item_1 = require("../Timeline/use-sequence-freeze-frame-menu-item");
24
28
  const AlignmentControls_1 = require("./AlignmentControls");
29
+ const CollapsibleInspectorSection_1 = require("./CollapsibleInspectorSection");
25
30
  const common_1 = require("./common");
26
31
  const ConnectedCompositionsSection_1 = require("./ConnectedCompositionsSection");
27
32
  const SequenceInspectorHeader_1 = require("./SequenceInspectorHeader");
@@ -69,8 +74,10 @@ const SplitSequenceQuickAction = ({ selection, track }) => {
69
74
  return (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: !canSplit, onClick: onSplit, title: disabledReason, renderIcon: (color) => (jsx_runtime_1.jsx(scissors_1.ScissorsIcon, { style: actionIconStyle, color: color })), children: "Split clip" }));
70
75
  };
71
76
  const SequenceSourceQuickActions = ({ selection, track, validatedSource }) => {
77
+ var _a;
72
78
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
73
79
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
80
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
74
81
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
75
82
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
76
83
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
@@ -89,6 +96,40 @@ const SequenceSourceQuickActions = ({ selection, track, validatedSource }) => {
89
96
  validatedSource,
90
97
  });
91
98
  const sourceActionsDisabled = previewServerState.type !== 'connected' || !(0, interactivity_enabled_1.isStudioInteractivityEnabled)();
99
+ const mediaSequence = track.sequence.type === 'video' || track.sequence.type === 'audio'
100
+ ? track.sequence
101
+ : null;
102
+ const mediaMetadata = (0, use_media_metadata_1.useMediaMetadata)((_a = mediaSequence === null || mediaSequence === void 0 ? void 0 : mediaSequence.src) !== null && _a !== void 0 ? _a : null);
103
+ const transcriptionDisabledReason = sourceActionsDisabled
104
+ ? 'Studio is read-only'
105
+ : selection.nodePathInfo.numberOfSequencesWithThisNodePath > 1
106
+ ? 'Programmatically duplicated media cannot be transcribed from source'
107
+ : undefined;
108
+ const onGenerateCaptions = (0, react_1.useCallback)(() => {
109
+ if (transcriptionDisabledReason !== undefined || mediaSequence === null) {
110
+ return;
111
+ }
112
+ const nodePath = selection.nodePathInfo.sequenceSubscriptionKey;
113
+ setSelectedModal({
114
+ type: 'transcribe',
115
+ src: mediaSequence.src,
116
+ displayName: (0, public_output_name_1.getMediaFileName)(mediaSequence.src, mediaSequence.displayName),
117
+ audioStreamIndex: null,
118
+ requestInit: null,
119
+ target: {
120
+ fileName: nodePath.absolutePath,
121
+ nodePath,
122
+ durationInFrames: Number.isFinite(mediaSequence.duration)
123
+ ? mediaSequence.duration
124
+ : null,
125
+ },
126
+ });
127
+ }, [
128
+ selection.nodePathInfo,
129
+ setSelectedModal,
130
+ mediaSequence,
131
+ transcriptionDisabledReason,
132
+ ]);
92
133
  const onDuplicate = (0, react_1.useCallback)(() => {
93
134
  if (sourceActionsDisabled) {
94
135
  return;
@@ -124,7 +165,7 @@ const SequenceSourceQuickActions = ({ selection, track, validatedSource }) => {
124
165
  (0, NotificationCenter_1.showNotification)(err.message, 4000);
125
166
  });
126
167
  }, [selection.nodePathInfo, splitVideoFromAudioDisabledReason]);
127
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [(freezeFrameMenuItem === null || freezeFrameMenuItem === void 0 ? void 0 : freezeFrameMenuItem.type) === 'item' ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: Boolean(freezeFrameMenuItem.disabled), onClick: () => freezeFrameMenuItem.onClick(freezeFrameMenuItem.id, null), renderIcon: (color) => (jsx_runtime_1.jsx(snowflake_1.SnowflakeIcon, { style: largeActionIconStyle, color: color })), children: freezeFrameMenuItem.label })) : null, track.sequence.type === 'video' ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: splitVideoFromAudioDisabledReason !== undefined, onClick: onSplitVideoFromAudio, title: splitVideoFromAudioDisabledReason, renderIcon: (color) => (jsx_runtime_1.jsx(audio_1.AudioIcon, { style: actionIconStyle, color: color })), children: "Split video from audio" })) : null, jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: sourceActionsDisabled, onClick: onDuplicate, renderIcon: (color) => (jsx_runtime_1.jsx(duplicate_1.DuplicateIcon, { style: largeActionIconStyle, color: color })), children: "Duplicate" }), jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: sourceActionsDisabled, onClick: onDelete, renderIcon: (color) => (jsx_runtime_1.jsx(trash_1.TrashIcon, { style: actionIconStyle, color: color })), children: "Delete" })] }));
168
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [(freezeFrameMenuItem === null || freezeFrameMenuItem === void 0 ? void 0 : freezeFrameMenuItem.type) === 'item' ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: Boolean(freezeFrameMenuItem.disabled), onClick: () => freezeFrameMenuItem.onClick(freezeFrameMenuItem.id, null), renderIcon: (color) => (jsx_runtime_1.jsx(snowflake_1.SnowflakeIcon, { style: largeActionIconStyle, color: color })), children: freezeFrameMenuItem.label })) : null, track.sequence.type === 'video' ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: splitVideoFromAudioDisabledReason !== undefined, onClick: onSplitVideoFromAudio, title: splitVideoFromAudioDisabledReason, renderIcon: (color) => (jsx_runtime_1.jsx(audio_1.AudioIcon, { style: actionIconStyle, color: color })), children: "Split video from audio" })) : null, mediaSequence !== null && (mediaMetadata === null || mediaMetadata === void 0 ? void 0 : mediaMetadata.hasAudioTrack) !== false ? (jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: transcriptionDisabledReason !== undefined, onClick: onGenerateCaptions, title: transcriptionDisabledReason, renderIcon: (color) => (jsx_runtime_1.jsx(transcription_1.TranscriptionIcon, { style: actionIconStyle, color: color })), children: "Generate captions" })) : null, jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: sourceActionsDisabled, onClick: onDuplicate, renderIcon: (color) => (jsx_runtime_1.jsx(duplicate_1.DuplicateIcon, { style: largeActionIconStyle, color: color })), children: "Duplicate" }), jsx_runtime_1.jsx(common_1.InspectorQuickAction, { disabled: sourceActionsDisabled, onClick: onDelete, renderIcon: (color) => (jsx_runtime_1.jsx(trash_1.TrashIcon, { style: actionIconStyle, color: color })), children: "Delete" })] }));
128
169
  };
129
170
  const SequenceExpandedInspector = ({ track, readOnlyStudio }) => {
130
171
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
@@ -169,9 +210,9 @@ const SequenceExpandedInspector = ({ track, readOnlyStudio }) => {
169
210
  return jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Sequence inspector unavailable" });
170
211
  }
171
212
  return (jsx_runtime_1.jsxs("div", { style: styles_1.selectedContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, onPointerDown: selectSequenceOnInspectorPointerDown, children: [
172
- jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorHeader, { sourceLocation: sourceLocation, track: track }, stackKey !== null && stackKey !== void 0 ? stackKey : track.sequence.id), jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorDuplicationSection, { track: track }), connectedCompositions.length > 0 ? (jsx_runtime_1.jsx(ConnectedCompositionsSection_1.ConnectedCompositionsSection, { connectedCompositions: connectedCompositions })) : null, validatedLocation ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx(InspectorSequenceSection_1.InspectorSequenceSection, { sequence: track.sequence, readOnlyStudio: readOnlyStudio, validatedLocation: validatedLocation, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, renderTransformControls: () => jsx_runtime_1.jsx(AlignmentControls_1.AlignmentControls, { track: track }) }), jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Actions" }), jsx_runtime_1.jsxs(common_1.InspectorQuickActionsSection, { children: [
173
- jsx_runtime_1.jsx(SplitSequenceQuickAction, { selection: sequenceSelection, track: track }), jsx_runtime_1.jsx(SequenceSourceQuickActions, { selection: sequenceSelection, track: track, validatedSource: validatedLocation.source })
174
- ] })
213
+ jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorHeader, { sourceLocation: sourceLocation, track: track }, stackKey !== null && stackKey !== void 0 ? stackKey : track.sequence.id), jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorDuplicationSection, { track: track }), connectedCompositions.length > 0 ? (jsx_runtime_1.jsx(ConnectedCompositionsSection_1.ConnectedCompositionsSection, { connectedCompositions: connectedCompositions })) : null, validatedLocation ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [jsx_runtime_1.jsx(InspectorSequenceSection_1.InspectorSequenceSection, { sequence: track.sequence, readOnlyStudio: readOnlyStudio, validatedLocation: validatedLocation, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, renderTransformControls: () => jsx_runtime_1.jsx(AlignmentControls_1.AlignmentControls, { track: track }) }), jsx_runtime_1.jsx(CollapsibleInspectorSection_1.CollapsibleInspectorSection, { collapsible: true, label: "Actions", sectionId: "sequence-actions", children: jsx_runtime_1.jsxs(common_1.InspectorQuickActionsSection, { children: [
214
+ jsx_runtime_1.jsx(SplitSequenceQuickAction, { selection: sequenceSelection, track: track }), jsx_runtime_1.jsx(SequenceSourceQuickActions, { selection: sequenceSelection, track: track, validatedSource: validatedLocation.source })
215
+ ] }) })
175
216
  ] })) : (jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Source controls unavailable" }))] }));
176
217
  };
177
218
  const SequenceSelectionInspector = ({ selection, readOnlyStudio }) => {
@@ -6,6 +6,10 @@ export declare const InspectorSectionHeader: React.FC<{
6
6
  export declare const InspectorQuickActionsSection: React.FC<{
7
7
  readonly children: React.ReactNode;
8
8
  }>;
9
+ export declare const InspectorSectionBody: React.FC<{
10
+ readonly children: React.ReactNode;
11
+ readonly expanded: boolean;
12
+ }>;
9
13
  export declare const InspectorSection: React.FC<{
10
14
  readonly children: React.ReactNode;
11
15
  readonly header: React.ReactNode;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.InspectorDefaultPropsWarnings = exports.InspectorQuickAction = exports.InspectorDetailRow = exports.InspectorMessage = exports.InspectorBackAction = exports.InspectorSection = exports.InspectorQuickActionsSection = exports.InspectorSectionHeader = void 0;
6
+ exports.InspectorDefaultPropsWarnings = exports.InspectorQuickAction = exports.InspectorDetailRow = exports.InspectorMessage = exports.InspectorBackAction = exports.InspectorSection = exports.InspectorSectionBody = exports.InspectorQuickActionsSection = exports.InspectorSectionHeader = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_1 = __importDefault(require("react"));
9
9
  const colors_1 = require("../../helpers/colors");
@@ -16,9 +16,21 @@ const InspectorSectionHeader = ({ children }) => jsx_runtime_1.jsx("div", { styl
16
16
  exports.InspectorSectionHeader = InspectorSectionHeader;
17
17
  const InspectorQuickActionsSection = ({ children }) => jsx_runtime_1.jsx("div", { style: styles_1.inspectorQuickActionsSection, children: children });
18
18
  exports.InspectorQuickActionsSection = InspectorQuickActionsSection;
19
+ const collapsedSectionBody = {
20
+ ...styles_1.inspectorSectionBody,
21
+ display: 'none',
22
+ };
23
+ const InspectorSectionBody = ({ children, expanded }) => {
24
+ if (children === null) {
25
+ return null;
26
+ }
27
+ return (jsx_runtime_1.jsx("div", { hidden: !expanded, style: expanded ? styles_1.inspectorSectionBody : collapsedSectionBody, children: children }));
28
+ };
29
+ exports.InspectorSectionBody = InspectorSectionBody;
19
30
  const InspectorSection = ({ children, header }) => {
20
31
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
21
- jsx_runtime_1.jsx(exports.InspectorSectionHeader, { children: header }), children === null ? null : (jsx_runtime_1.jsx("div", { style: styles_1.inspectorSectionBody, children: children }))] }));
32
+ jsx_runtime_1.jsx(exports.InspectorSectionHeader, { children: header }), jsx_runtime_1.jsx(exports.InspectorSectionBody, { expanded: true, children: children })
33
+ ] }));
22
34
  };
23
35
  exports.InspectorSection = InspectorSection;
24
36
  const backArrowIcon = {
@@ -77,6 +89,7 @@ const inlineLabelText = {
77
89
  overflow: 'hidden',
78
90
  textOverflow: 'ellipsis',
79
91
  userSelect: 'none',
92
+ WebkitUserSelect: 'none',
80
93
  whiteSpace: 'nowrap',
81
94
  };
82
95
  const inlineLabelIcon = {
@@ -2,15 +2,12 @@ import type React from 'react';
2
2
  export declare const container: React.CSSProperties;
3
3
  export declare const scrollableContainer: React.CSSProperties;
4
4
  export declare const compositionDefaultPropsSection: React.CSSProperties;
5
- export declare const compositionVisualControlsSection: React.CSSProperties;
6
5
  export declare const inspectorOverviewSection: React.CSSProperties;
7
6
  export declare const sequenceHeaderDivider: React.CSSProperties;
8
7
  export declare const sectionHeader: React.CSSProperties;
9
8
  export declare const inspectorSectionBody: React.CSSProperties;
10
9
  export declare const sequenceHeaderSubtitle: React.CSSProperties;
11
10
  export declare const sectionHeaderRow: React.CSSProperties;
12
- export declare const sectionHeaderTitle: React.CSSProperties;
13
- export declare const sectionHeaderStart: React.CSSProperties;
14
11
  export declare const sectionHeaderEnd: React.CSSProperties;
15
12
  export declare const defaultPropsWarningContainer: React.CSSProperties;
16
13
  export declare const defaultPropsWarningMessages: React.CSSProperties;