@remotion/studio 4.0.522 → 4.0.524

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 (259) hide show
  1. package/dist/api/install-package.js +4 -2
  2. package/dist/components/ActionTooltip.d.ts +9 -0
  3. package/dist/components/ActionTooltip.js +143 -0
  4. package/dist/components/AssetAudioVolume.d.ts +5 -0
  5. package/dist/components/AssetAudioVolume.js +33 -0
  6. package/dist/components/Canvas.js +8 -8
  7. package/dist/components/CaptionInspector.js +74 -20
  8. package/dist/components/CheckboardToggle.js +9 -10
  9. package/dist/components/Checkbox.d.ts +1 -0
  10. package/dist/components/Checkbox.js +2 -2
  11. package/dist/components/CompositionContextButton.js +4 -1
  12. package/dist/components/CompositionSelectorItem.js +2 -2
  13. package/dist/components/ConfigureLicenseModal.js +1 -1
  14. package/dist/components/CurrentAsset.js +40 -6
  15. package/dist/components/EditorContexts.js +3 -1
  16. package/dist/components/ElementInstallConfirmation.js +254 -137
  17. package/dist/components/FixComputedValueModal.js +38 -8
  18. package/dist/components/FullscreenToggle.js +8 -10
  19. package/dist/components/GlobalKeybindings.js +107 -49
  20. package/dist/components/InspectorPanel/MultiSequenceField.d.ts +12 -0
  21. package/dist/components/InspectorPanel/MultiSequenceField.js +131 -0
  22. package/dist/components/InspectorPanel/MultiSequenceInspector.d.ts +8 -0
  23. package/dist/components/InspectorPanel/MultiSequenceInspector.js +102 -0
  24. package/dist/components/InspectorPanel/MultiSequenceNumberField.d.ts +9 -0
  25. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +88 -0
  26. package/dist/components/InspectorPanel.js +4 -0
  27. package/dist/components/InspectorSequenceSection.js +69 -6
  28. package/dist/components/InstallPackage.js +4 -5
  29. package/dist/components/KeyboardShortcutsSettings.js +212 -33
  30. package/dist/components/LazySyntaxHighlightedSource.d.ts +4 -0
  31. package/dist/components/LazySyntaxHighlightedSource.js +43 -0
  32. package/dist/components/LoopToggle.js +8 -2
  33. package/dist/components/MenuToolbar.js +11 -7
  34. package/dist/components/ModalContainer.d.ts +1 -0
  35. package/dist/components/ModalContainer.js +2 -2
  36. package/dist/components/Modals.js +3 -1
  37. package/dist/components/ModelManager.d.ts +16 -0
  38. package/dist/components/ModelManager.js +200 -0
  39. package/dist/components/ModelsSettings.d.ts +2 -0
  40. package/dist/components/ModelsSettings.js +133 -0
  41. package/dist/components/MuteToggle.d.ts +1 -0
  42. package/dist/components/MuteToggle.js +16 -6
  43. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  44. package/dist/components/NewComposition/DismissableModal.js +2 -2
  45. package/dist/components/NewComposition/InputDragger.d.ts +2 -2
  46. package/dist/components/NewComposition/InputDragger.js +6 -6
  47. package/dist/components/NewComposition/NewComposition.d.ts +1 -0
  48. package/dist/components/NewComposition/NewComposition.js +5 -4
  49. package/dist/components/NewComposition/NewFolder.js +9 -8
  50. package/dist/components/NewComposition/RenameComposition.js +3 -2
  51. package/dist/components/NewComposition/RenameFolder.js +15 -10
  52. package/dist/components/NewComposition/SlugPreview.d.ts +7 -0
  53. package/dist/components/NewComposition/SlugPreview.js +18 -0
  54. package/dist/components/OptionalPackageModal.d.ts +11 -0
  55. package/dist/components/OptionalPackageModal.js +155 -0
  56. package/dist/components/OutlineToggle.js +16 -10
  57. package/dist/components/PlayPause.js +11 -9
  58. package/dist/components/PlaybackKeyboardShortcutsManager.d.ts +2 -0
  59. package/dist/components/PlaybackKeyboardShortcutsManager.js +39 -7
  60. package/dist/components/PlaybackRateSelector.js +2 -2
  61. package/dist/components/PreviewToolbar.js +1 -1
  62. package/dist/components/PreviewToolbarOverflowButton.js +19 -4
  63. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +5 -2
  64. package/dist/components/RadioButton.d.ts +1 -0
  65. package/dist/components/RadioButton.js +2 -2
  66. package/dist/components/RenderButton.js +5 -1
  67. package/dist/components/RenderModal/NumberSetting.d.ts +6 -1
  68. package/dist/components/RenderModal/NumberSetting.js +2 -2
  69. package/dist/components/RenderModal/RenderModalBasic.js +1 -1
  70. package/dist/components/RenderModal/RenderModalOutputName.d.ts +3 -1
  71. package/dist/components/RenderModal/RenderModalOutputName.js +4 -4
  72. package/dist/components/RenderModal/SeparateAudioOption.js +1 -1
  73. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  74. package/dist/components/RenderQueue/CaptionQueueItem.d.ts +6 -0
  75. package/dist/components/RenderQueue/CaptionQueueItem.js +130 -0
  76. package/dist/components/RenderQueue/CaptionQueueProcessor.d.ts +1 -0
  77. package/dist/components/RenderQueue/CaptionQueueProcessor.js +110 -0
  78. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.d.ts +2 -0
  79. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.js +54 -0
  80. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +2 -1
  81. package/dist/components/RenderQueue/RenderQueueDownloadItem.js +2 -1
  82. package/dist/components/RenderQueue/RenderQueueItem.js +3 -3
  83. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +2 -1
  84. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +2 -1
  85. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +2 -1
  86. package/dist/components/RenderQueue/RenderQueueRepeat.js +2 -1
  87. package/dist/components/RenderQueue/VideoMattingQueueItem.d.ts +6 -0
  88. package/dist/components/RenderQueue/VideoMattingQueueItem.js +130 -0
  89. package/dist/components/RenderQueue/VideoMattingQueueProcessor.d.ts +1 -0
  90. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +105 -0
  91. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.d.ts +2 -0
  92. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.js +54 -0
  93. package/dist/components/RenderQueue/caption-job-types.d.ts +47 -0
  94. package/dist/components/RenderQueue/caption-job-types.js +7 -0
  95. package/dist/components/RenderQueue/context.d.ts +16 -0
  96. package/dist/components/RenderQueue/context.js +224 -11
  97. package/dist/components/RenderQueue/index.js +34 -10
  98. package/dist/components/RenderQueue/item-style.d.ts +1 -0
  99. package/dist/components/RenderQueue/item-style.js +2 -1
  100. package/dist/components/RenderQueue/load-model-for-job.d.ts +11 -0
  101. package/dist/components/RenderQueue/load-model-for-job.js +14 -0
  102. package/dist/components/RenderQueue/video-matting-job-types.d.ts +38 -0
  103. package/dist/components/RenderQueue/video-matting-job-types.js +5 -0
  104. package/dist/components/RendersTab.js +4 -4
  105. package/dist/components/RulersAndGuidesToggle.js +7 -1
  106. package/dist/components/SegmentedControl.d.ts +2 -2
  107. package/dist/components/SegmentedControl.js +38 -13
  108. package/dist/components/SelectedOutlinePolygon.js +8 -2
  109. package/dist/components/SettingsButton.d.ts +4 -0
  110. package/dist/components/SettingsButton.js +51 -0
  111. package/dist/components/SettingsModal.d.ts +1 -1
  112. package/dist/components/SettingsModal.js +3 -1
  113. package/dist/components/ShowOutlinesProvider.js +12 -0
  114. package/dist/components/SidebarCollapserControls.js +17 -21
  115. package/dist/components/SizeSelector.js +12 -4
  116. package/dist/components/SkillsSettings.js +2 -3
  117. package/dist/components/SnappingToggle.js +9 -8
  118. package/dist/components/StudioSettings.js +32 -18
  119. package/dist/components/SyntaxHighlightedSource.d.ts +5 -0
  120. package/dist/components/SyntaxHighlightedSource.js +78 -0
  121. package/dist/components/Tabs/vertical.d.ts +1 -0
  122. package/dist/components/Tabs/vertical.js +2 -2
  123. package/dist/components/TimeValue.js +2 -3
  124. package/dist/components/Timeline/SequencePropsObserver.js +4 -0
  125. package/dist/components/Timeline/Timeline.js +49 -81
  126. package/dist/components/Timeline/TimelineClipboardKeybindings.js +2 -4
  127. package/dist/components/Timeline/TimelineDeleteKeybindings.js +3 -18
  128. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  129. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  130. package/dist/components/Timeline/TimelineLayerChildren.js +12 -9
  131. package/dist/components/Timeline/TimelineRowChrome.js +11 -3
  132. package/dist/components/Timeline/TimelineSchemaField.js +8 -4
  133. package/dist/components/Timeline/TimelineSelection.d.ts +2 -0
  134. package/dist/components/Timeline/TimelineSelection.js +55 -2
  135. package/dist/components/Timeline/TimelineSequence.js +75 -17
  136. package/dist/components/Timeline/TimelineSequenceItem.d.ts +0 -1
  137. package/dist/components/Timeline/TimelineSequenceItem.js +208 -111
  138. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +23 -3
  139. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +73 -25
  140. package/dist/components/Timeline/TimelineTimeIndicators.js +1 -0
  141. package/dist/components/Timeline/TimelineZoomControls.js +2 -1
  142. package/dist/components/Timeline/timeline-field-display-utils.js +8 -5
  143. package/dist/components/Timeline/use-asset-timeline-context-menu.d.ts +2 -0
  144. package/dist/components/Timeline/use-asset-timeline-context-menu.js +52 -0
  145. package/dist/components/TimelineCombobox.d.ts +1 -0
  146. package/dist/components/TimelineCombobox.js +8 -4
  147. package/dist/components/TimelineInOutToggle.js +14 -18
  148. package/dist/components/Transcription/LazyModels.d.ts +1 -0
  149. package/dist/components/Transcription/LazyModels.js +5 -0
  150. package/dist/components/Transcription/Models.d.ts +6 -0
  151. package/dist/components/Transcription/Models.js +18 -0
  152. package/dist/components/Transcription/TranscriptionModal.d.ts +3 -0
  153. package/dist/components/Transcription/TranscriptionModal.js +428 -0
  154. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.d.ts +5 -0
  155. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +48 -0
  156. package/dist/components/Transcription/caption-output-name.d.ts +2 -0
  157. package/dist/components/Transcription/caption-output-name.js +10 -0
  158. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +6 -0
  159. package/dist/components/Transcription/resample-media-to-16-khz.js +82 -0
  160. package/dist/components/Transcription/whisper-languages.d.ts +2 -0
  161. package/dist/components/Transcription/whisper-languages.js +104 -0
  162. package/dist/components/Transcription/whisper-webgpu-capability.d.ts +2 -0
  163. package/dist/components/Transcription/whisper-webgpu-capability.js +7 -0
  164. package/dist/components/UndoRedoButtons.js +13 -38
  165. package/dist/components/UpdatesSettings.js +8 -12
  166. package/dist/components/VideoMatting/LazyModels.d.ts +1 -0
  167. package/dist/components/VideoMatting/LazyModels.js +5 -0
  168. package/dist/components/VideoMatting/Models.d.ts +6 -0
  169. package/dist/components/VideoMatting/Models.js +18 -0
  170. package/dist/components/VideoMatting/VideoMattingModal.d.ts +3 -0
  171. package/dist/components/VideoMatting/VideoMattingModal.js +207 -0
  172. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.d.ts +5 -0
  173. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +46 -0
  174. package/dist/components/VideoMatting/video-matting-capability.d.ts +2 -0
  175. package/dist/components/VideoMatting/video-matting-capability.js +7 -0
  176. package/dist/components/WebMcp.js +439 -22
  177. package/dist/components/handle-drop.js +3 -2
  178. package/dist/components/import-assets.d.ts +3 -2
  179. package/dist/components/import-assets.js +5 -9
  180. package/dist/components/keyboard-shortcuts.d.ts +17 -1
  181. package/dist/components/keyboard-shortcuts.js +191 -89
  182. package/dist/components/public-output-name.d.ts +5 -0
  183. package/dist/components/public-output-name.js +60 -0
  184. package/dist/components/use-model-cache-status.d.ts +7 -0
  185. package/dist/components/use-model-cache-status.js +35 -0
  186. package/dist/error-overlay/remotion-overlay/CodeFrame.js +29 -18
  187. package/dist/esm/CaptionQueueProcessor-k0yrm3dj.mjs +211 -0
  188. package/dist/esm/LazyModels-hc33szyn.mjs +11 -0
  189. package/dist/esm/LazyModels-sg40rjw6.mjs +11 -0
  190. package/dist/esm/SyntaxHighlightedSource-3xks91rz.mjs +1236 -0
  191. package/dist/esm/TranscriptionModal-3ctnxpt6.mjs +1011 -0
  192. package/dist/esm/VideoMattingModal-b0r7e60n.mjs +374 -0
  193. package/dist/esm/VideoMattingQueueProcessor-t1hgm2rm.mjs +109 -0
  194. package/dist/esm/index-1b9skrrd.mjs +142 -0
  195. package/dist/esm/index-2j3d1g81.mjs +261 -0
  196. package/dist/esm/index-5zrb1ft4.mjs +39 -0
  197. package/dist/esm/index-7tt71e8n.mjs +36 -0
  198. package/dist/esm/index-9qtvmwtx.mjs +1366 -0
  199. package/dist/esm/index-9x6e1dq0.mjs +428 -0
  200. package/dist/esm/index-c37kme2v.mjs +46209 -0
  201. package/dist/esm/index-cw0pnpg5.mjs +50 -0
  202. package/dist/esm/index-e3zwf3e7.mjs +36 -0
  203. package/dist/esm/index-er3mh6em.mjs +54688 -0
  204. package/dist/esm/{chunk-je0h1bgt.js → index-k426ye99.mjs} +4 -1
  205. package/dist/esm/index-q2epbw93.mjs +423 -0
  206. package/dist/esm/index-q5xv20xx.mjs +41 -0
  207. package/dist/esm/{chunk-6jf1natv.js → index-rcv7qkt5.mjs} +18 -1
  208. package/dist/esm/index-v4tr1bft.mjs +20 -0
  209. package/dist/esm/index-wbmp5srk.mjs +35 -0
  210. package/dist/esm/index-yfrysr5f.mjs +1154 -0
  211. package/dist/esm/index.mjs +45 -933
  212. package/dist/esm/internals.mjs +13 -114393
  213. package/dist/esm/previewEntry.mjs +387 -115050
  214. package/dist/esm/renderEntry.mjs +5 -5
  215. package/dist/esm/{chunk-m0jqdbkr.js → resolve-composition-component-location-bt2d6qxq.mjs} +1 -1
  216. package/dist/helpers/colors.d.ts +1 -0
  217. package/dist/helpers/colors.js +4 -3
  218. package/dist/helpers/drag-aware-double-click.d.ts +2 -1
  219. package/dist/helpers/drag-aware-double-click.js +12 -1
  220. package/dist/helpers/get-asset-metadata.d.ts +1 -0
  221. package/dist/helpers/get-asset-metadata.js +4 -0
  222. package/dist/helpers/hoverable.js +8 -0
  223. package/dist/helpers/inject-css.js +2 -0
  224. package/dist/helpers/optional-package-dependencies.d.ts +3 -0
  225. package/dist/helpers/optional-package-dependencies.js +24 -0
  226. package/dist/helpers/pointer-session.d.ts +6 -0
  227. package/dist/helpers/pointer-session.js +36 -14
  228. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -0
  229. package/dist/helpers/prism-vsc-dark-plus.js +305 -0
  230. package/dist/helpers/sequence-node-path-mutations.js +11 -0
  231. package/dist/helpers/slugify-name.d.ts +1 -0
  232. package/dist/helpers/slugify-name.js +14 -0
  233. package/dist/helpers/studio-runtime-config.d.ts +1 -0
  234. package/dist/helpers/studio-runtime-config.js +6 -1
  235. package/dist/helpers/use-create-composition.d.ts +1 -0
  236. package/dist/helpers/use-create-composition.js +12 -7
  237. package/dist/helpers/use-keybinding.d.ts +9 -3
  238. package/dist/helpers/use-keybinding.js +8 -9
  239. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -0
  240. package/dist/helpers/use-keyboard-shortcut-label.js +15 -0
  241. package/dist/helpers/use-menu-structure.js +59 -14
  242. package/dist/helpers/use-rename-composition.d.ts +1 -0
  243. package/dist/helpers/use-rename-composition.js +11 -5
  244. package/dist/icons/input-props.d.ts +1 -1
  245. package/dist/icons/input-props.js +2 -2
  246. package/dist/icons/models.d.ts +4 -0
  247. package/dist/icons/models.js +7 -0
  248. package/dist/icons/separation.d.ts +4 -0
  249. package/dist/icons/separation.js +7 -0
  250. package/dist/icons/skills.js +1 -1
  251. package/dist/icons/transcription.d.ts +4 -0
  252. package/dist/icons/transcription.js +7 -0
  253. package/dist/icons/upload.js +1 -1
  254. package/dist/renderEntry.js +2 -2
  255. package/dist/state/modals.d.ts +14 -2
  256. package/package.json +35 -21
  257. package/dist/components/UpdateCheck.d.ts +0 -1
  258. package/dist/components/UpdateCheck.js +0 -79
  259. package/dist/esm/chunk-3netyjd9.js +0 -99793
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiSequenceInspector = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const studio_shared_1 = require("@remotion/studio-shared");
6
+ const react_1 = require("react");
7
+ const remotion_1 = require("remotion");
8
+ const calculate_timeline_1 = require("../../helpers/calculate-timeline");
9
+ const colors_1 = require("../../helpers/colors");
10
+ const timeline_layout_1 = require("../../helpers/timeline-layout");
11
+ const InspectorInfoHeader_1 = require("../InspectorInfoHeader");
12
+ const InspectorPanelLayout_1 = require("../InspectorPanelLayout");
13
+ const layout_1 = require("../layout");
14
+ const is_menu_item_1 = require("../Menu/is-menu-item");
15
+ const TimelineRowLayoutContext_1 = require("../Timeline/TimelineRowLayoutContext");
16
+ const common_1 = require("./common");
17
+ const MultiSequenceField_1 = require("./MultiSequenceField");
18
+ const styles_1 = require("./styles");
19
+ const selectionCountStyle = {
20
+ color: colors_1.LIGHT_TEXT,
21
+ fontFamily: 'sans-serif',
22
+ fontSize: 13,
23
+ height: layout_1.COMPACT_CONTROL_ROW_HEIGHT,
24
+ lineHeight: `${layout_1.COMPACT_CONTROL_ROW_HEIGHT}px`,
25
+ overflow: 'hidden',
26
+ padding: `0 ${InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING}px`,
27
+ textOverflow: 'ellipsis',
28
+ whiteSpace: 'nowrap',
29
+ };
30
+ const MultiSequenceInspector = ({ selections, readOnlyStudio }) => {
31
+ const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
32
+ const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
33
+ const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
34
+ const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
35
+ const targets = (0, react_1.useMemo)(() => {
36
+ const tracks = (0, calculate_timeline_1.calculateTimeline)({
37
+ sequences,
38
+ overrideIdsToNodePaths: overrideIdToNodePathMappings,
39
+ });
40
+ const result = [];
41
+ const seen = new Set();
42
+ for (const selection of selections) {
43
+ const key = (0, studio_shared_1.stringifySequenceExpandedRowKey)(selection.nodePathInfo.sequenceSubscriptionKey);
44
+ const track = tracks.find((candidate) => candidate.nodePathInfo !== null &&
45
+ (0, studio_shared_1.stringifySequenceExpandedRowKey)(candidate.nodePathInfo.sequenceSubscriptionKey) === key &&
46
+ candidate.nodePathInfo.index === selection.nodePathInfo.index);
47
+ if (!(track === null || track === void 0 ? void 0 : track.sequence.controls) || !track.nodePathInfo) {
48
+ return null;
49
+ }
50
+ // Multiple rendered instances can share the same editable source.
51
+ if (seen.has(key)) {
52
+ continue;
53
+ }
54
+ seen.add(key);
55
+ result.push({
56
+ nodePath: track.nodePathInfo.sequenceSubscriptionKey,
57
+ controls: track.sequence.controls,
58
+ });
59
+ }
60
+ return result;
61
+ }, [overrideIdToNodePathMappings, selections, sequences]);
62
+ const store = (0, react_1.useMemo)(() => {
63
+ const stores = (targets !== null && targets !== void 0 ? targets : []).map((target) => target.controls.runtimeValues);
64
+ let snapshots = stores.map((value) => value.getSnapshot());
65
+ return {
66
+ subscribe: (listener) => {
67
+ const unsubscribes = stores.map((value) => value.subscribe(listener));
68
+ return () => unsubscribes.forEach((unsubscribe) => unsubscribe());
69
+ },
70
+ getSnapshot: () => {
71
+ const next = stores.map((value) => value.getSnapshot());
72
+ if (next.some((value, index) => value !== snapshots[index])) {
73
+ snapshots = next;
74
+ }
75
+ return snapshots;
76
+ },
77
+ };
78
+ }, [targets]);
79
+ const runtimeValues = (0, react_1.useSyncExternalStore)(store.subscribe, store.getSnapshot, store.getSnapshot);
80
+ const fields = (0, react_1.useMemo)(() => {
81
+ var _a;
82
+ const allFields = (targets !== null && targets !== void 0 ? targets : []).map((target, index) => {
83
+ var _a;
84
+ return (_a = (0, timeline_layout_1.getFieldsToShow)({
85
+ schema: target.controls.schema,
86
+ currentRuntimeValueDotNotation: runtimeValues[index],
87
+ getDragOverrides,
88
+ propStatuses,
89
+ nodePath: target.nodePath,
90
+ includeTextContent: true,
91
+ })) !== null && _a !== void 0 ? _a : [];
92
+ });
93
+ 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
+ }, [getDragOverrides, propStatuses, runtimeValues, targets]);
95
+ return (jsx_runtime_1.jsxs("div", { style: styles_1.scrollableContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
96
+ 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
+ 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)) +
99
+ field.key))) }, group.id));
100
+ }) }))] }));
101
+ };
102
+ exports.MultiSequenceInspector = MultiSequenceInspector;
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import type { SchemaFieldInfo } from '../../helpers/timeline-layout';
3
+ export declare const MultiSequenceNumberField: React.FC<{
4
+ readonly field: SchemaFieldInfo;
5
+ readonly values: unknown[];
6
+ readonly onPreview: (values: unknown[]) => void;
7
+ readonly onSave: (values: unknown[]) => Promise<void>;
8
+ readonly onClear: () => void;
9
+ }>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MultiSequenceNumberField = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const noop_1 = require("../../helpers/noop");
7
+ const InputDragger_1 = require("../NewComposition/InputDragger");
8
+ const timeline_field_display_utils_1 = require("../Timeline/timeline-field-display-utils");
9
+ const timeline_field_utils_1 = require("../Timeline/timeline-field-utils");
10
+ const timeline_translate_utils_1 = require("../Timeline/timeline-translate-utils");
11
+ const NumericAxis = ({ field, values, axis, onPreview, onSave, onClear }) => {
12
+ var _a, _b, _c, _d;
13
+ const [dragValue, setDragValue] = (0, react_1.useState)(null);
14
+ const initialValues = (0, react_1.useRef)(null);
15
+ const coordinates = values.map((value) => {
16
+ var _a;
17
+ return axis === null ? Number(value) : ((_a = (0, timeline_translate_utils_1.parseTranslate)(String(value))[axis]) !== null && _a !== void 0 ? _a : 0);
18
+ });
19
+ const mixed = coordinates.some((value) => value !== coordinates[0]);
20
+ const schema = field.fieldSchema;
21
+ const step = 'step' in schema ? ((_a = schema.step) !== null && _a !== void 0 ? _a : 1) : 1;
22
+ const decimalPlaces = (0, timeline_field_utils_1.getTimelineDisplayDecimalPlaces)({
23
+ defaultDecimalPlaces: 1,
24
+ step,
25
+ });
26
+ const min = schema.type === 'number' ? ((_b = schema.min) !== null && _b !== void 0 ? _b : -Infinity) : -Infinity;
27
+ const max = schema.type === 'number' ? ((_c = schema.max) !== null && _c !== void 0 ? _c : Infinity) : Infinity;
28
+ const nextValues = (value, source) => {
29
+ var _a, _b;
30
+ const baseline = (_a = initialValues.current) !== null && _a !== void 0 ? _a : values;
31
+ const first = axis === null
32
+ ? Number(baseline[0])
33
+ : ((_b = (0, timeline_translate_utils_1.parseTranslate)(String(baseline[0]))[axis]) !== null && _b !== void 0 ? _b : 0);
34
+ return baseline.map((original) => {
35
+ var _a;
36
+ const coordinatesForValue = axis === null ? null : (0, timeline_translate_utils_1.parseTranslate)(String(original));
37
+ const current = coordinatesForValue === null || axis === null
38
+ ? Number(original)
39
+ : ((_a = coordinatesForValue[axis]) !== null && _a !== void 0 ? _a : 0);
40
+ const next = Math.min(max, Math.max(min, source === 'drag'
41
+ ? (0, timeline_field_utils_1.roundToDecimalPlaces)(current + value - first, Math.max((0, timeline_field_utils_1.getDecimalPlaces)(current), (0, timeline_field_utils_1.getDecimalPlaces)(value), (0, timeline_field_utils_1.getDecimalPlaces)(first)))
42
+ : value));
43
+ if (coordinatesForValue === null || axis === null) {
44
+ return next;
45
+ }
46
+ const [x, y, z] = coordinatesForValue;
47
+ return (0, timeline_translate_utils_1.serializeTranslate)([axis === 0 ? next : x, axis === 1 ? next : y, axis === 2 ? next : z], decimalPlaces);
48
+ });
49
+ };
50
+ const clear = () => {
51
+ initialValues.current = null;
52
+ setDragValue(null);
53
+ onClear();
54
+ };
55
+ return (jsx_runtime_1.jsx("span", { onKeyDownCapture: (event) => {
56
+ if (event.key === 'Escape') {
57
+ clear();
58
+ }
59
+ }, onPointerCancelCapture: clear, onBlurCapture: (event) => {
60
+ if (event.target instanceof HTMLInputElement &&
61
+ event.target.value.trim() === '') {
62
+ clear();
63
+ }
64
+ }, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragValue !== null && dragValue !== void 0 ? dragValue : coordinates[0], "aria-label": axis === null
65
+ ? ((_d = field.description) !== null && _d !== void 0 ? _d : field.key)
66
+ : `Offset ${['X', 'Y', 'Z'][axis]}`, title: "Type to set all values; drag to adjust each value", status: "ok", small: true, rightAlign: false, min: min, max: max, step: step, snapToStep: axis === null, dragDecimalPlaces: decimalPlaces, dragSensitivity: axis === null ? 1 : 3, buttonStyle: { paddingLeft: 0 }, style: { width: 70 }, formatter: (value) => mixed && dragValue === null
67
+ ? 'Mixed'
68
+ : (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({ fieldSchema: schema, value }), onTextChange: noop_1.noop, onValueChange: (value, source) => {
69
+ var _a;
70
+ (_a = initialValues.current) !== null && _a !== void 0 ? _a : (initialValues.current = values);
71
+ setDragValue(value);
72
+ onPreview(nextValues(value, source));
73
+ }, onValueChangeEnd: (value, source) => {
74
+ if (initialValues.current === null) {
75
+ return;
76
+ }
77
+ onSave(nextValues(value, source)).finally(clear);
78
+ } }) }));
79
+ };
80
+ const MultiSequenceNumberField = (props) => {
81
+ const axes = props.field.typeName === 'translate'
82
+ ? props.values.some((value) => (0, timeline_translate_utils_1.parseTranslate)(String(value))[2] !== null)
83
+ ? [0, 1, 2]
84
+ : [0, 1]
85
+ : [null];
86
+ return (jsx_runtime_1.jsx("span", { style: { display: 'flex', gap: 4 }, children: axes.map((axis) => (jsx_runtime_1.jsx(NumericAxis, { ...props, axis: axis }, axis !== null && axis !== void 0 ? axis : 'value'))) }));
87
+ };
88
+ exports.MultiSequenceNumberField = MultiSequenceNumberField;
@@ -8,6 +8,7 @@ const AssetInspector_1 = require("./InspectorPanel/AssetInspector");
8
8
  const common_1 = require("./InspectorPanel/common");
9
9
  const CompositionInspector_1 = require("./InspectorPanel/CompositionInspector");
10
10
  const inspector_selection_1 = require("./InspectorPanel/inspector-selection");
11
+ const MultiSequenceInspector_1 = require("./InspectorPanel/MultiSequenceInspector");
11
12
  const SelectedInspector_1 = require("./InspectorPanel/SelectedInspector");
12
13
  const styles_1 = require("./InspectorPanel/styles");
13
14
  const TimelineSelection_1 = require("./Timeline/TimelineSelection");
@@ -28,6 +29,9 @@ const InspectorPanel = ({ composition, currentDefaultProps, readOnlyStudio, setD
28
29
  if (sameSequenceInspectorSelection) {
29
30
  return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsx(SelectedInspector_1.SelectedInspector, { selection: sameSequenceInspectorSelection, readOnlyStudio: readOnlyStudio }) }));
30
31
  }
32
+ if (selectedItems.every((item) => item.type === 'sequence')) {
33
+ return (jsx_runtime_1.jsx(MultiSequenceInspector_1.MultiSequenceInspector, { selections: selectedItems, readOnlyStudio: readOnlyStudio }));
34
+ }
31
35
  return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsxs(common_1.InspectorMessage, { children: [selectedItems.length, " items selected"] }) }));
32
36
  }
33
37
  return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsx(SelectedInspector_1.SelectedInspector, { selection: selectedItems[0], readOnlyStudio: readOnlyStudio }) }));
@@ -213,6 +213,15 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
213
213
  includeTextContent: true,
214
214
  includeSourceControls: true,
215
215
  });
216
+ const { selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
217
+ const selectedEffect = selectedItems.length === 1 &&
218
+ (selectedItems[0].type === 'sequence-effect' ||
219
+ selectedItems[0].type === 'sequence-effect-prop')
220
+ ? selectedItems[0]
221
+ : null;
222
+ const selectedEffectKey = selectedEffect === null ? null : (0, TimelineSelection_1.getTimelineSelectionKey)(selectedEffect);
223
+ const selectedEffectRowRef = (0, react_1.useRef)(null);
224
+ const scrolledEffectKey = (0, react_1.useRef)(null);
216
225
  const [collapsedKeys, setCollapsedKeys] = (0, react_1.useState)(loadInspectorCollapsedKeys);
217
226
  const [sectionExpansionOverrides, setSectionExpansionOverrides] = (0, react_1.useState)(loadInspectorSectionExpansionOverrides);
218
227
  const [automaticSectionExpansion, setAutomaticSectionExpansion] = (0, react_1.useState)({});
@@ -299,6 +308,55 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
299
308
  }),
300
309
  };
301
310
  }, [getIsExpanded, tree]);
311
+ (0, react_1.useEffect)(() => {
312
+ if (selectedEffectKey === null ||
313
+ scrolledEffectKey.current === selectedEffectKey) {
314
+ return;
315
+ }
316
+ const rows = (0, timeline_layout_1.flattenVisibleTreeNodes)({
317
+ nodes: tree,
318
+ getIsExpanded: () => true,
319
+ });
320
+ const targetIndex = rows.findIndex(({ node }) => {
321
+ const selection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(node.nodePathInfo);
322
+ return (selection !== null &&
323
+ (0, TimelineSelection_1.getTimelineSelectionKey)(selection) === selectedEffectKey);
324
+ });
325
+ if (targetIndex === -1) {
326
+ return;
327
+ }
328
+ const parentKeys = [];
329
+ let { depth } = rows[targetIndex];
330
+ for (let i = targetIndex - 1; i >= 0 && depth > 0; i--) {
331
+ if (rows[i].depth < depth) {
332
+ parentKeys.push(getInspectorExpansionKey(rows[i].node.nodePathInfo));
333
+ depth = rows[i].depth;
334
+ }
335
+ }
336
+ setCollapsedKeys((previous) => {
337
+ if (!parentKeys.some((key) => previous.has(key))) {
338
+ return previous;
339
+ }
340
+ const next = new Set(previous);
341
+ for (const key of parentKeys) {
342
+ next.delete(key);
343
+ }
344
+ persistInspectorCollapsedKeys(next);
345
+ return next;
346
+ });
347
+ }, [selectedEffectKey, tree]);
348
+ (0, react_1.useEffect)(() => {
349
+ if (selectedEffectKey === null) {
350
+ scrolledEffectKey.current = null;
351
+ return;
352
+ }
353
+ if (scrolledEffectKey.current === selectedEffectKey ||
354
+ selectedEffectRowRef.current === null) {
355
+ return;
356
+ }
357
+ selectedEffectRowRef.current.scrollIntoView({ block: 'center' });
358
+ scrolledEffectKey.current = selectedEffectKey;
359
+ }, [effectRows, selectedEffectKey]);
302
360
  const effectSelectableItems = (0, react_1.useMemo)(() => (0, exports.getInspectorSelectableItems)(effectRows), [effectRows]);
303
361
  const controlGroups = (0, react_1.useMemo)(() => getInspectorControlGroups(controlRows), [controlRows]);
304
362
  const layoutGroup = controlGroups.find((group) => group.id === 'layout');
@@ -426,11 +484,11 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
426
484
  return node.kind === 'field' && ((_a = node.field) === null || _a === void 0 ? void 0 : _a.key) === border_radius_representation_1.BORDER_RADIUS_SHORTHAND_KEY;
427
485
  });
428
486
  const borderRadiusConversion = (0, border_radius_representation_1.getBorderRadiusConversion)(sequencePropStatuses, getDragOverrides(nodePathInfo.sequenceSubscriptionKey));
429
- const inlineCaptionValue = ((_a = schema.captions) === null || _a === void 0 ? void 0 : _a.type) === 'remotion-captions'
430
- ? runtimeValues.captions
431
- : null;
432
- const inlineCaptions = Array.isArray(inlineCaptionValue)
433
- ? inlineCaptionValue
487
+ const hasCaptionsSchema = ((_a = schema.captions) === null || _a === void 0 ? void 0 : _a.type) === 'remotion-captions';
488
+ const inlineCaptions = hasCaptionsSchema
489
+ ? Array.isArray(runtimeValues.captions)
490
+ ? runtimeValues.captions
491
+ : []
434
492
  : null;
435
493
  const showEffectsSection = nodePathInfo.supportsEffects || effectRows.length > 0;
436
494
  const canAddEffect = nodePathInfo.supportsEffects &&
@@ -516,7 +574,12 @@ const InspectorSequenceSection = ({ sequence, readOnlyStudio, validatedLocation,
516
574
  inlineCaptions === null) {
517
575
  return (jsx_runtime_1.jsx("div", { style: container, children: jsx_runtime_1.jsx(common_1.InspectorSection, { header: "Controls", children: jsx_runtime_1.jsx("div", { style: emptyState, children: "No schema" }) }) }));
518
576
  }
519
- return (jsx_runtime_1.jsx(TimelineAssetField_1.AssetSelectionContext.Provider, { value: assetSelectionContextValue, children: jsx_runtime_1.jsxs("div", { style: container, children: [controlRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: controlGroupsWithoutLayout.map((group) => (jsx_runtime_1.jsx(common_1.InspectorSection, { header: renderControlGroupHeader(group), children: isControlGroupExpanded(group) ? (group.id === 'transforms' ? (jsx_runtime_1.jsxs(Transform3DModeContext_1.Transform3DModeContext.Provider, { value: show3DTransformControls, children: [renderTransformControls(), group.rows.map(renderRow)] })) : (group.rows.map(renderRow))) : null }, group.id))) })) : null, inlineCaptions ? (jsx_runtime_1.jsx(InlineCaptionInspector_1.InlineCaptionInspector, { captions: inlineCaptions, controls: sequence.controls, expanded: captionsExpanded, nodePath: nodePathInfo.sequenceSubscriptionKey, onToggle: () => toggleAdditionalSection('captions'), readOnlyStudio: readOnlyStudio, validatedLocation: validatedLocation })) : null, showEffectsSection ? (jsx_runtime_1.jsx(common_1.InspectorSection, { header: effectsHeader, children: effectRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: effectSelectableItems, children: effectRows.map(renderRow) })) : null })) : null, layoutGroup ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: jsx_runtime_1.jsx(common_1.InspectorSection, { header: renderControlGroupHeader(layoutGroup), children: isControlGroupExpanded(layoutGroup)
577
+ return (jsx_runtime_1.jsx(TimelineAssetField_1.AssetSelectionContext.Provider, { value: assetSelectionContextValue, children: jsx_runtime_1.jsxs("div", { style: container, children: [controlRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: controlGroupsWithoutLayout.map((group) => (jsx_runtime_1.jsx(common_1.InspectorSection, { header: renderControlGroupHeader(group), children: isControlGroupExpanded(group) ? (group.id === 'transforms' ? (jsx_runtime_1.jsxs(Transform3DModeContext_1.Transform3DModeContext.Provider, { value: show3DTransformControls, children: [renderTransformControls(), group.rows.map(renderRow)] })) : (group.rows.map(renderRow))) : null }, group.id))) })) : null, inlineCaptions ? (jsx_runtime_1.jsx(InlineCaptionInspector_1.InlineCaptionInspector, { captions: inlineCaptions, controls: sequence.controls, expanded: captionsExpanded, nodePath: nodePathInfo.sequenceSubscriptionKey, onToggle: () => toggleAdditionalSection('captions'), readOnlyStudio: readOnlyStudio, validatedLocation: validatedLocation })) : null, showEffectsSection ? (jsx_runtime_1.jsx(common_1.InspectorSection, { header: effectsHeader, children: effectRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: effectSelectableItems, children: effectRows.map((row) => {
578
+ const selection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(row.node.nodePathInfo);
579
+ const selected = selection !== null &&
580
+ (0, TimelineSelection_1.getTimelineSelectionKey)(selection) === selectedEffectKey;
581
+ return (jsx_runtime_1.jsx("div", { ref: selected ? selectedEffectRowRef : null, children: renderRow(row) }, getInspectorExpansionKey(row.node.nodePathInfo)));
582
+ }) })) : null })) : null, layoutGroup ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: jsx_runtime_1.jsx(common_1.InspectorSection, { header: renderControlGroupHeader(layoutGroup), children: isControlGroupExpanded(layoutGroup)
520
583
  ? layoutGroup.rows.map(renderRow)
521
584
  : null }) })) : null] }) }));
522
585
  };
@@ -55,6 +55,7 @@ const layout_1 = require("./layout");
55
55
  const is_menu_item_1 = require("./Menu/is-menu-item");
56
56
  const ModalButton_1 = require("./ModalButton");
57
57
  const ModalFooter_1 = require("./ModalFooter");
58
+ const OptionalPackageModal_1 = require("./OptionalPackageModal");
58
59
  const container = {
59
60
  boxSizing: 'border-box',
60
61
  flex: 1,
@@ -103,7 +104,6 @@ const InstallPackageSettings = ({ footerContainer, packageManager }) => {
103
104
  });
104
105
  });
105
106
  const onClick = (0, react_1.useCallback)(async () => {
106
- var _a;
107
107
  if (state.type === 'done') {
108
108
  if (packageManager === null) {
109
109
  setSelectedModal(null);
@@ -116,10 +116,9 @@ const InstallPackageSettings = ({ footerContainer, packageManager }) => {
116
116
  setState({ type: 'installing' });
117
117
  try {
118
118
  await (0, install_package_1.installPackages)(selectedPackageSpecs);
119
- window.remotion_installedPackages = Array.from(new Set([
120
- ...((_a = window.remotion_installedPackages) !== null && _a !== void 0 ? _a : []),
121
- ...selectedPackages,
122
- ]));
119
+ for (const packageName of selectedPackages) {
120
+ (0, OptionalPackageModal_1.markOptionalPackageInstalled)(packageName);
121
+ }
123
122
  setState({ type: 'done' });
124
123
  }
125
124
  catch (err) {