@remotion/studio 4.0.521 → 4.0.523

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 (264) hide show
  1. package/dist/api/install-package.js +4 -2
  2. package/dist/components/AssetAudioVolume.d.ts +5 -0
  3. package/dist/components/AssetAudioVolume.js +33 -0
  4. package/dist/components/Canvas.js +5 -6
  5. package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
  6. package/dist/components/CaptionInspector.js +74 -20
  7. package/dist/components/CheckboardToggle.js +8 -6
  8. package/dist/components/Checkbox.d.ts +1 -0
  9. package/dist/components/Checkbox.js +2 -2
  10. package/dist/components/CompositionContextButton.js +4 -1
  11. package/dist/components/CompositionSelectorItem.js +2 -2
  12. package/dist/components/ConfigureLicenseModal.js +1 -1
  13. package/dist/components/CopyButton.js +7 -14
  14. package/dist/components/CurrentAsset.js +40 -6
  15. package/dist/components/Editor.js +6 -5
  16. package/dist/components/EditorContent.js +1 -1
  17. package/dist/components/EditorContexts.js +3 -1
  18. package/dist/components/ElementInstallConfirmation.js +290 -136
  19. package/dist/components/FixComputedValueModal.js +56 -16
  20. package/dist/components/FullscreenToggle.js +9 -8
  21. package/dist/components/GlobalKeybindings.js +50 -49
  22. package/dist/components/HighlightedElementSource.d.ts +5 -0
  23. package/dist/components/HighlightedElementSource.js +78 -0
  24. package/dist/components/InspectorLocationCopy.js +10 -5
  25. package/dist/components/InspectorPanel/MultiSequenceField.d.ts +12 -0
  26. package/dist/components/InspectorPanel/MultiSequenceField.js +131 -0
  27. package/dist/components/InspectorPanel/MultiSequenceInspector.d.ts +8 -0
  28. package/dist/components/InspectorPanel/MultiSequenceInspector.js +102 -0
  29. package/dist/components/InspectorPanel/MultiSequenceNumberField.d.ts +9 -0
  30. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +88 -0
  31. package/dist/components/InspectorPanel.js +4 -0
  32. package/dist/components/InspectorSequenceSection.js +64 -1
  33. package/dist/components/InstallPackage.js +4 -5
  34. package/dist/components/KeyboardShortcutsSettings.js +212 -33
  35. package/dist/components/MenuBuildIndicator.js +7 -2
  36. package/dist/components/MenuCompositionName.js +62 -6
  37. package/dist/components/MenuToolbar.js +7 -5
  38. package/dist/components/ModalContainer.d.ts +1 -0
  39. package/dist/components/ModalContainer.js +2 -2
  40. package/dist/components/Modals.js +3 -1
  41. package/dist/components/ModelManager.d.ts +16 -0
  42. package/dist/components/ModelManager.js +200 -0
  43. package/dist/components/ModelsSettings.d.ts +2 -0
  44. package/dist/components/ModelsSettings.js +133 -0
  45. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  46. package/dist/components/NewComposition/DismissableModal.js +2 -2
  47. package/dist/components/NewComposition/InputDragger.d.ts +2 -2
  48. package/dist/components/NewComposition/InputDragger.js +6 -6
  49. package/dist/components/NewComposition/NewFolder.js +11 -8
  50. package/dist/components/NewComposition/RenameFolder.js +17 -10
  51. package/dist/components/OptionalPackageModal.d.ts +11 -0
  52. package/dist/components/OptionalPackageModal.js +155 -0
  53. package/dist/components/PlayPause.js +4 -8
  54. package/dist/components/PlaybackKeyboardShortcutsManager.js +3 -6
  55. package/dist/components/PreviewToolbarOverflowButton.js +11 -2
  56. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +5 -2
  57. package/dist/components/RadioButton.d.ts +1 -0
  58. package/dist/components/RadioButton.js +2 -2
  59. package/dist/components/RenderButton.js +5 -1
  60. package/dist/components/RenderModal/CliCopyButton.js +13 -27
  61. package/dist/components/RenderModal/NumberSetting.d.ts +6 -1
  62. package/dist/components/RenderModal/NumberSetting.js +2 -2
  63. package/dist/components/RenderModal/RenderModalBasic.js +1 -1
  64. package/dist/components/RenderModal/RenderModalOutputName.d.ts +3 -1
  65. package/dist/components/RenderModal/RenderModalOutputName.js +4 -4
  66. package/dist/components/RenderModal/SeparateAudioOption.js +1 -1
  67. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  68. package/dist/components/RenderQueue/CaptionQueueItem.d.ts +6 -0
  69. package/dist/components/RenderQueue/CaptionQueueItem.js +129 -0
  70. package/dist/components/RenderQueue/CaptionQueueProcessor.d.ts +1 -0
  71. package/dist/components/RenderQueue/CaptionQueueProcessor.js +110 -0
  72. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.d.ts +2 -0
  73. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.js +54 -0
  74. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
  75. package/dist/components/RenderQueue/RenderQueueItem.js +3 -3
  76. package/dist/components/RenderQueue/VideoMattingQueueItem.d.ts +6 -0
  77. package/dist/components/RenderQueue/VideoMattingQueueItem.js +129 -0
  78. package/dist/components/RenderQueue/VideoMattingQueueProcessor.d.ts +1 -0
  79. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +105 -0
  80. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.d.ts +2 -0
  81. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.js +54 -0
  82. package/dist/components/RenderQueue/caption-job-types.d.ts +47 -0
  83. package/dist/components/RenderQueue/caption-job-types.js +7 -0
  84. package/dist/components/RenderQueue/context.d.ts +16 -0
  85. package/dist/components/RenderQueue/context.js +224 -11
  86. package/dist/components/RenderQueue/index.js +34 -10
  87. package/dist/components/RenderQueue/item-style.d.ts +1 -0
  88. package/dist/components/RenderQueue/item-style.js +2 -1
  89. package/dist/components/RenderQueue/load-model-for-job.d.ts +11 -0
  90. package/dist/components/RenderQueue/load-model-for-job.js +14 -0
  91. package/dist/components/RenderQueue/video-matting-job-types.d.ts +38 -0
  92. package/dist/components/RenderQueue/video-matting-job-types.js +5 -0
  93. package/dist/components/RendersTab.js +4 -4
  94. package/dist/components/SegmentedControl.d.ts +2 -2
  95. package/dist/components/SegmentedControl.js +38 -13
  96. package/dist/components/SelectedOutlinePolygon.js +8 -2
  97. package/dist/components/SettingsButton.d.ts +4 -0
  98. package/dist/components/SettingsButton.js +49 -0
  99. package/dist/components/SettingsModal.d.ts +1 -1
  100. package/dist/components/SettingsModal.js +3 -1
  101. package/dist/components/ShowOutlinesProvider.js +12 -0
  102. package/dist/components/SidebarCollapserControls.js +21 -16
  103. package/dist/components/SizeSelector.js +10 -2
  104. package/dist/components/SkillsSettings.js +11 -8
  105. package/dist/components/SnappingToggle.js +5 -2
  106. package/dist/components/Splitter/SplitterContainer.js +63 -10
  107. package/dist/components/Splitter/SplitterContext.d.ts +3 -0
  108. package/dist/components/Splitter/SplitterContext.js +5 -1
  109. package/dist/components/Splitter/SplitterElement.js +11 -2
  110. package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
  111. package/dist/components/Splitter/SplitterHandle.js +55 -25
  112. package/dist/components/Tabs/vertical.d.ts +1 -0
  113. package/dist/components/Tabs/vertical.js +2 -2
  114. package/dist/components/TimeValue.js +2 -3
  115. package/dist/components/Timeline/SequencePropsObserver.js +4 -0
  116. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  117. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  118. package/dist/components/Timeline/Timeline.js +17 -46
  119. package/dist/components/Timeline/TimelineClipboardKeybindings.js +2 -4
  120. package/dist/components/Timeline/TimelineDeleteKeybindings.js +3 -18
  121. package/dist/components/Timeline/TimelineDragHandler.js +11 -6
  122. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  123. package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
  124. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
  125. package/dist/components/Timeline/TimelineRowChrome.js +11 -3
  126. package/dist/components/Timeline/TimelineSchemaField.js +8 -4
  127. package/dist/components/Timeline/TimelineSelection.d.ts +2 -0
  128. package/dist/components/Timeline/TimelineSelection.js +55 -2
  129. package/dist/components/Timeline/TimelineSequence.js +148 -25
  130. package/dist/components/Timeline/TimelineSequenceItem.d.ts +0 -1
  131. package/dist/components/Timeline/TimelineSequenceItem.js +220 -112
  132. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +35 -5
  133. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +233 -138
  134. package/dist/components/Timeline/TimelineSlider.js +1 -4
  135. package/dist/components/Timeline/TimelineTimeIndicators.js +1 -0
  136. package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
  137. package/dist/components/Timeline/TimelineZoomControls.js +20 -20
  138. package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
  139. package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
  140. package/dist/components/Timeline/use-asset-timeline-context-menu.d.ts +2 -0
  141. package/dist/components/Timeline/use-asset-timeline-context-menu.js +52 -0
  142. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
  143. package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
  144. package/dist/components/TimelineInOutToggle.js +20 -17
  145. package/dist/components/TopPanel.js +3 -19
  146. package/dist/components/Transcription/LazyModels.d.ts +1 -0
  147. package/dist/components/Transcription/LazyModels.js +5 -0
  148. package/dist/components/Transcription/Models.d.ts +6 -0
  149. package/dist/components/Transcription/Models.js +18 -0
  150. package/dist/components/Transcription/TranscriptionModal.d.ts +3 -0
  151. package/dist/components/Transcription/TranscriptionModal.js +428 -0
  152. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.d.ts +5 -0
  153. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +48 -0
  154. package/dist/components/Transcription/caption-output-name.d.ts +2 -0
  155. package/dist/components/Transcription/caption-output-name.js +10 -0
  156. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +6 -0
  157. package/dist/components/Transcription/resample-media-to-16-khz.js +82 -0
  158. package/dist/components/Transcription/whisper-languages.d.ts +2 -0
  159. package/dist/components/Transcription/whisper-languages.js +104 -0
  160. package/dist/components/Transcription/whisper-webgpu-capability.d.ts +2 -0
  161. package/dist/components/Transcription/whisper-webgpu-capability.js +7 -0
  162. package/dist/components/UndoRedoButtons.js +13 -38
  163. package/dist/components/UpdatesSettings.js +17 -17
  164. package/dist/components/VideoMatting/LazyModels.d.ts +1 -0
  165. package/dist/components/VideoMatting/LazyModels.js +5 -0
  166. package/dist/components/VideoMatting/Models.d.ts +6 -0
  167. package/dist/components/VideoMatting/Models.js +18 -0
  168. package/dist/components/VideoMatting/VideoMattingModal.d.ts +3 -0
  169. package/dist/components/VideoMatting/VideoMattingModal.js +207 -0
  170. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.d.ts +5 -0
  171. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +46 -0
  172. package/dist/components/VideoMatting/video-matting-capability.d.ts +2 -0
  173. package/dist/components/VideoMatting/video-matting-capability.js +7 -0
  174. package/dist/components/WebMcp.js +439 -22
  175. package/dist/components/ZoomPersistor.js +6 -3
  176. package/dist/components/composition-menu-items.js +1 -1
  177. package/dist/components/import-assets.d.ts +3 -2
  178. package/dist/components/import-assets.js +5 -9
  179. package/dist/components/keyboard-shortcuts.d.ts +17 -1
  180. package/dist/components/keyboard-shortcuts.js +177 -89
  181. package/dist/components/public-output-name.d.ts +5 -0
  182. package/dist/components/public-output-name.js +60 -0
  183. package/dist/components/use-model-cache-status.d.ts +7 -0
  184. package/dist/components/use-model-cache-status.js +35 -0
  185. package/dist/esm/CaptionQueueProcessor-k0yrm3dj.mjs +211 -0
  186. package/dist/esm/HighlightedElementSource-jfc66k4p.mjs +1236 -0
  187. package/dist/esm/LazyModels-2trdm224.mjs +11 -0
  188. package/dist/esm/LazyModels-fjb5ckaq.mjs +11 -0
  189. package/dist/esm/TranscriptionModal-916jqhry.mjs +1011 -0
  190. package/dist/esm/VideoMattingModal-2tm79s9b.mjs +374 -0
  191. package/dist/esm/VideoMattingQueueProcessor-t1hgm2rm.mjs +109 -0
  192. package/dist/esm/index-1x7bsdh6.mjs +261 -0
  193. package/dist/esm/index-3hgr6gjx.mjs +41 -0
  194. package/dist/esm/index-5qddp5h7.mjs +36 -0
  195. package/dist/esm/index-5zrb1ft4.mjs +39 -0
  196. package/dist/esm/index-6cvm9a65.mjs +45923 -0
  197. package/dist/esm/index-7tt71e8n.mjs +36 -0
  198. package/dist/esm/index-9x6e1dq0.mjs +428 -0
  199. package/dist/esm/index-cw0pnpg5.mjs +50 -0
  200. package/dist/esm/index-czwvnn9g.mjs +35 -0
  201. package/dist/esm/index-hy4xcgty.mjs +1366 -0
  202. package/dist/esm/{chunk-je0h1bgt.js → index-jg13hf2g.mjs} +3 -1
  203. package/dist/esm/{chunk-6jf1natv.js → index-rcv7qkt5.mjs} +18 -1
  204. package/dist/esm/index-sgtmgc4h.mjs +423 -0
  205. package/dist/esm/index-te66vvrp.mjs +142 -0
  206. package/dist/esm/index-v4tr1bft.mjs +20 -0
  207. package/dist/esm/index-x7t2y7ws.mjs +54194 -0
  208. package/dist/esm/index-xhe2m2qr.mjs +1146 -0
  209. package/dist/esm/index.mjs +45 -933
  210. package/dist/esm/internals.mjs +13 -114127
  211. package/dist/esm/previewEntry.mjs +387 -114784
  212. package/dist/esm/renderEntry.mjs +3 -3
  213. package/dist/esm/{chunk-m0jqdbkr.js → resolve-composition-component-location-14148845.mjs} +1 -1
  214. package/dist/helpers/copy-text.js +1 -2
  215. package/dist/helpers/drag-aware-double-click.d.ts +2 -1
  216. package/dist/helpers/drag-aware-double-click.js +12 -1
  217. package/dist/helpers/get-asset-metadata.d.ts +1 -0
  218. package/dist/helpers/get-asset-metadata.js +4 -0
  219. package/dist/helpers/hoverable.js +8 -0
  220. package/dist/helpers/inject-css.js +2 -0
  221. package/dist/helpers/optional-package-dependencies.d.ts +3 -0
  222. package/dist/helpers/optional-package-dependencies.js +24 -0
  223. package/dist/helpers/pointer-session.d.ts +6 -0
  224. package/dist/helpers/pointer-session.js +36 -14
  225. package/dist/helpers/prism-tomorrow.d.ts +1 -0
  226. package/dist/helpers/prism-tomorrow.js +151 -0
  227. package/dist/helpers/sequence-node-path-mutations.js +11 -0
  228. package/dist/helpers/slugify-name.d.ts +1 -0
  229. package/dist/helpers/slugify-name.js +14 -0
  230. package/dist/helpers/studio-runtime-config.d.ts +1 -0
  231. package/dist/helpers/studio-runtime-config.js +6 -1
  232. package/dist/helpers/use-copy-feedback.d.ts +4 -0
  233. package/dist/helpers/use-copy-feedback.js +19 -0
  234. package/dist/helpers/use-keybinding.d.ts +9 -3
  235. package/dist/helpers/use-keybinding.js +8 -9
  236. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -0
  237. package/dist/helpers/use-keyboard-shortcut-label.js +15 -0
  238. package/dist/helpers/use-menu-structure.js +58 -13
  239. package/dist/icons/copy.d.ts +5 -0
  240. package/dist/icons/copy.js +12 -0
  241. package/dist/icons/input-props.d.ts +1 -1
  242. package/dist/icons/input-props.js +2 -2
  243. package/dist/icons/models.d.ts +4 -0
  244. package/dist/icons/models.js +7 -0
  245. package/dist/icons/separation.d.ts +4 -0
  246. package/dist/icons/separation.js +7 -0
  247. package/dist/icons/transcription.d.ts +4 -0
  248. package/dist/icons/transcription.js +7 -0
  249. package/dist/icons/upload.js +1 -1
  250. package/dist/state/canvas-ref.d.ts +1 -0
  251. package/dist/state/canvas-ref.js +2 -1
  252. package/dist/state/modals.d.ts +14 -2
  253. package/dist/state/sidebar.d.ts +3 -0
  254. package/dist/state/sidebar.js +6 -1
  255. package/dist/state/timeline-zoom.d.ts +1 -1
  256. package/dist/state/timeline-zoom.js +3 -3
  257. package/dist/visual-controls/VisualControls.js +4 -0
  258. package/package.json +34 -20
  259. package/dist/components/UpdateCheck.d.ts +0 -1
  260. package/dist/components/UpdateCheck.js +0 -79
  261. package/dist/esm/chunk-emw4k5b0.js +0 -99527
  262. package/dist/esm/chunk-vkrvnx2h.js +0 -99378
  263. package/dist/helpers/use-max-media-duration.d.ts +0 -2
  264. package/dist/helpers/use-max-media-duration.js +0 -61
@@ -39,11 +39,14 @@ const react_1 = __importStar(require("react"));
39
39
  const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
40
40
  const colors_1 = require("../helpers/colors");
41
41
  const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
42
- const ConfigSelect_1 = require("./ConfigSelect");
42
+ const caret_1 = require("../icons/caret");
43
+ const Checkbox_1 = require("./Checkbox");
44
+ const InlineDropdown_1 = require("./InlineDropdown");
43
45
  const styles_1 = require("./InspectorPanel/styles");
44
46
  const keyboard_shortcuts_1 = require("./keyboard-shortcuts");
45
47
  const layout_1 = require("./layout");
46
48
  const ValidationMessage_1 = require("./NewComposition/ValidationMessage");
49
+ const layout_2 = require("./RenderModal/layout");
47
50
  const SettingsContext_1 = require("./SettingsContext");
48
51
  const use_auto_save_config_1 = require("./use-auto-save-config");
49
52
  const container = {
@@ -65,11 +68,11 @@ const shortcutSectionTitle = {
65
68
  const shortcutRow = {
66
69
  alignItems: 'center',
67
70
  borderBottom: colors_1.BORDER_WHITE_ALPHA_12,
68
- display: 'flex',
69
- gap: 16,
70
- justifyContent: 'space-between',
71
+ columnGap: 4,
72
+ display: 'grid',
73
+ gridTemplateColumns: 'minmax(0, 1fr) minmax(76px, max-content) 14px',
71
74
  margin: '0 16px',
72
- minHeight: 38,
75
+ minHeight: 42,
73
76
  };
74
77
  const lastShortcutRow = {
75
78
  ...shortcutRow,
@@ -81,11 +84,24 @@ const actionName = {
81
84
  lineHeight: 1.4,
82
85
  minWidth: 0,
83
86
  };
87
+ const shortcutCell = {
88
+ alignItems: 'center',
89
+ display: 'flex',
90
+ justifyContent: 'flex-end',
91
+ minWidth: 0,
92
+ };
93
+ const actionCell = {
94
+ alignItems: 'center',
95
+ display: 'flex',
96
+ gap: 6,
97
+ justifyContent: 'flex-start',
98
+ whiteSpace: 'nowrap',
99
+ };
84
100
  const chords = {
85
101
  alignItems: 'center',
86
102
  display: 'flex',
87
- flexShrink: 0,
88
103
  gap: 6,
104
+ whiteSpace: 'nowrap',
89
105
  };
90
106
  const chord = {
91
107
  alignItems: 'center',
@@ -105,50 +121,95 @@ const key = {
105
121
  padding: '1px 5px',
106
122
  textAlign: 'center',
107
123
  };
124
+ const chordButton = {
125
+ alignItems: 'center',
126
+ background: 'transparent',
127
+ border: 0,
128
+ cursor: 'pointer',
129
+ display: 'flex',
130
+ font: 'inherit',
131
+ margin: 0,
132
+ padding: '4px 0',
133
+ };
108
134
  const alternative = {
109
135
  color: colors_1.LIGHT_TEXT,
110
136
  fontSize: 11,
111
137
  };
138
+ const emptyShortcut = {
139
+ color: colors_1.LIGHT_TEXT,
140
+ fontSize: 12,
141
+ fontStyle: 'italic',
142
+ };
143
+ const isSameShortcut = (first, second) => {
144
+ var _a, _b, _c, _d, _e, _f;
145
+ return first.key.toLowerCase() === second.key.toLowerCase() &&
146
+ ((_a = first.commandOrControl) !== null && _a !== void 0 ? _a : false) === ((_b = second.commandOrControl) !== null && _b !== void 0 ? _b : false) &&
147
+ ((_c = first.shift) !== null && _c !== void 0 ? _c : false) === ((_d = second.shift) !== null && _d !== void 0 ? _d : false) &&
148
+ ((_e = first.alt) !== null && _e !== void 0 ? _e : false) === ((_f = second.alt) !== null && _f !== void 0 ? _f : false);
149
+ };
150
+ const ShortcutChords = ({ values }) => {
151
+ if (values.length === 0) {
152
+ return jsx_runtime_1.jsx("span", { style: emptyShortcut, children: "Unassigned" });
153
+ }
154
+ return (jsx_runtime_1.jsx("span", { style: chords, children: values.map((keys, chordIndex) => (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [chordIndex > 0 ? jsx_runtime_1.jsx("span", { style: alternative, children: "or" }) : null, jsx_runtime_1.jsx("span", { style: chord, children: keys.map((keyboardKey) => (jsx_runtime_1.jsx("kbd", { style: key, children: keyboardKey }, keyboardKey))) })
155
+ ] }, keys.join('-')))) }));
156
+ };
112
157
  const KeyboardShortcutsSettings = () => {
113
158
  var _a;
114
159
  const { error: settingsError, revision, studioRuntimeConfig } = (0, SettingsContext_1.useSettings)();
115
160
  const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
116
- const [enabled, setEnabled] = (0, react_1.useState)(null);
117
- const [edited, setEdited] = (0, react_1.useState)(false);
161
+ const [enabled, setEnabled] = (0, react_1.useState)(true);
162
+ const [configuredShortcuts, setConfiguredShortcuts] = (0, react_1.useState)({});
163
+ const [enabledEdited, setEnabledEdited] = (0, react_1.useState)(false);
164
+ const [shortcutsEdited, setShortcutsEdited] = (0, react_1.useState)(false);
165
+ const [recording, setRecording] = (0, react_1.useState)(null);
118
166
  const [syncedRevision, setSyncedRevision] = (0, react_1.useState)(-1);
119
167
  const [error, setError] = (0, react_1.useState)(null);
120
168
  const displayedShortcutGroups = (0, studio_runtime_config_1.getStudioAskAIEnabled)()
121
169
  ? [...keyboard_shortcuts_1.keyboardShortcutGroups, keyboard_shortcuts_1.askAIKeyboardShortcutGroup]
122
170
  : keyboard_shortcuts_1.keyboardShortcutGroups;
171
+ const visibleShortcutGroups = enabled ? displayedShortcutGroups : [];
123
172
  (0, react_1.useEffect)(() => {
124
173
  var _a;
125
174
  var _b;
126
175
  if (studioRuntimeConfig === null) {
127
176
  return;
128
177
  }
129
- setEnabled((_b = (_a = studioRuntimeConfig.configFileStudioSettings) === null || _a === void 0 ? void 0 : _a.keyboardShortcutsEnabled) !== null && _b !== void 0 ? _b : null);
130
- setEdited(false);
178
+ setEnabled(((_a = studioRuntimeConfig.configFileStudioSettings) === null || _a === void 0 ? void 0 : _a.keyboardShortcutsEnabled) !==
179
+ false);
180
+ setConfiguredShortcuts((_b = studioRuntimeConfig.keyboardShortcuts) !== null && _b !== void 0 ? _b : {});
181
+ setEnabledEdited(false);
182
+ setShortcutsEdited(false);
183
+ setRecording(null);
131
184
  setSyncedRevision(revision);
132
185
  setError(null);
133
186
  }, [revision, studioRuntimeConfig]);
134
- const onEnabledChange = (0, react_1.useCallback)((value) => {
135
- setEnabled(value);
136
- setEdited(true);
187
+ const onEnabledChange = (0, react_1.useCallback)((event) => {
188
+ setEnabled(event.target.checked);
189
+ setEnabledEdited(true);
137
190
  }, []);
138
191
  const updates = (0, react_1.useMemo)(() => {
139
- if (!edited) {
140
- return [];
141
- }
142
- return enabled === null
143
- ? [{ setter: 'setKeyboardShortcutsEnabled', type: 'delete' }]
144
- : [
145
- {
192
+ const nextUpdates = [];
193
+ if (enabledEdited) {
194
+ nextUpdates.push(enabled
195
+ ? { setter: 'setKeyboardShortcutsEnabled', type: 'delete' }
196
+ : {
146
197
  setter: 'setKeyboardShortcutsEnabled',
147
198
  type: 'set',
148
- value: enabled,
149
- },
150
- ];
151
- }, [edited, enabled]);
199
+ value: false,
200
+ });
201
+ }
202
+ if (shortcutsEdited) {
203
+ nextUpdates.push(Object.keys(configuredShortcuts).length === 0
204
+ ? { setter: 'setKeyboardShortcuts', type: 'delete' }
205
+ : {
206
+ setter: 'setKeyboardShortcuts',
207
+ type: 'set',
208
+ value: configuredShortcuts,
209
+ });
210
+ }
211
+ return nextUpdates;
212
+ }, [configuredShortcuts, enabled, enabledEdited, shortcutsEdited]);
152
213
  const ready = studioRuntimeConfig !== null && syncedRevision === revision;
153
214
  (0, use_auto_save_config_1.useAutoSaveConfig)({
154
215
  enabled: ready && !isBrowserStudio,
@@ -161,15 +222,133 @@ const KeyboardShortcutsSettings = () => {
161
222
  return null;
162
223
  }
163
224
  return (jsx_runtime_1.jsxs("div", { style: container, children: [isBrowserStudio ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
164
- jsx_runtime_1.jsx("p", { style: dividerLabel, children: "General" }), jsx_runtime_1.jsx(ConfigSelect_1.ConfigSelect, { defaultLabel: "Enabled", name: "Keyboard shortcuts", onChange: onEnabledChange, options: ConfigSelect_1.booleanOptions, value: enabled })
165
- ] })), displayedShortcutGroups.map((group, groupIndex) => (jsx_runtime_1.jsxs("div", { children: [
166
- jsx_runtime_1.jsx("p", { style: shortcutSectionTitle, children: group.name }), jsx_runtime_1.jsx("div", { role: "list", "aria-label": group.name, children: group.shortcuts.map((shortcut, shortcutIndex) => (jsx_runtime_1.jsxs("div", { role: "listitem", style: groupIndex === displayedShortcutGroups.length - 1 &&
167
- shortcutIndex === group.shortcuts.length - 1
168
- ? lastShortcutRow
169
- : shortcutRow, children: [
170
- jsx_runtime_1.jsx("span", { style: actionName, children: shortcut.action }), jsx_runtime_1.jsx("span", { style: chords, children: shortcut.chords.map((keys, chordIndex) => (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [chordIndex > 0 ? (jsx_runtime_1.jsx("span", { style: alternative, children: "or" })) : null, jsx_runtime_1.jsx("span", { style: chord, children: keys.map((keyboardKey) => (jsx_runtime_1.jsx("kbd", { style: key, children: keyboardKey }, keyboardKey))) })
171
- ] }, keys.join('-')))) })
172
- ] }, shortcut.action))) })
225
+ jsx_runtime_1.jsx("p", { style: dividerLabel, children: "General" }), jsx_runtime_1.jsxs("label", { style: layout_2.optionRow, children: [
226
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Keyboard shortcuts" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(Checkbox_1.Checkbox, { checked: enabled, name: "keyboard-shortcuts", onChange: onEnabledChange }) })
227
+ ] })
228
+ ] })), visibleShortcutGroups.map((group, groupIndex) => (jsx_runtime_1.jsxs("div", { children: [
229
+ jsx_runtime_1.jsx("p", { style: shortcutSectionTitle, children: group.name }), jsx_runtime_1.jsx("div", { role: "list", "aria-label": group.name, children: group.shortcuts.map((shortcut, shortcutIndex) => {
230
+ var _a;
231
+ const configured = shortcut.actionId === null
232
+ ? false
233
+ : Object.prototype.hasOwnProperty.call(configuredShortcuts, shortcut.actionId);
234
+ const shortcutValues = shortcut.actionId === null
235
+ ? ((_a = shortcut.fixedChords) !== null && _a !== void 0 ? _a : [])
236
+ : (0, keyboard_shortcuts_1.getKeyboardShortcutsForAction)(shortcut.actionId, configuredShortcuts).map(keyboard_shortcuts_1.formatKeyboardShortcut);
237
+ const shortcutButtonId = shortcut.actionId === null
238
+ ? null
239
+ : `keyboard-shortcut-${shortcut.actionId}`;
240
+ const shortcutMenuItems = shortcut.actionId === null
241
+ ? []
242
+ : [
243
+ {
244
+ id: 'remap-shortcut',
245
+ keyHint: null,
246
+ label: 'Remap shortcut',
247
+ leftItem: null,
248
+ onClick: () => {
249
+ setError(null);
250
+ setRecording(shortcut.actionId);
251
+ requestAnimationFrame(() => {
252
+ var _a;
253
+ (_a = document.getElementById(shortcutButtonId)) === null || _a === void 0 ? void 0 : _a.focus();
254
+ });
255
+ },
256
+ quickSwitcherLabel: null,
257
+ subMenu: null,
258
+ type: 'item',
259
+ value: 'remap-shortcut',
260
+ },
261
+ ...(configured
262
+ ? [
263
+ {
264
+ id: 'reset-shortcut',
265
+ keyHint: null,
266
+ label: 'Reset to default',
267
+ leftItem: null,
268
+ onClick: () => {
269
+ setConfiguredShortcuts((current) => {
270
+ const next = { ...current };
271
+ delete next[shortcut.actionId];
272
+ return next;
273
+ });
274
+ setShortcutsEdited(true);
275
+ },
276
+ quickSwitcherLabel: null,
277
+ subMenu: null,
278
+ type: 'item',
279
+ value: 'reset-shortcut',
280
+ },
281
+ ]
282
+ : []),
283
+ ...(configuredShortcuts[shortcut.actionId] !== null
284
+ ? [
285
+ {
286
+ id: 'disable-shortcut',
287
+ keyHint: null,
288
+ label: 'Disable shortcut',
289
+ leftItem: null,
290
+ onClick: () => {
291
+ setConfiguredShortcuts((current) => ({
292
+ ...current,
293
+ [shortcut.actionId]: null,
294
+ }));
295
+ setShortcutsEdited(true);
296
+ },
297
+ quickSwitcherLabel: null,
298
+ subMenu: null,
299
+ type: 'item',
300
+ value: 'disable-shortcut',
301
+ },
302
+ ]
303
+ : []),
304
+ ];
305
+ return (jsx_runtime_1.jsxs("div", { role: "listitem", style: groupIndex === displayedShortcutGroups.length - 1 &&
306
+ shortcutIndex === group.shortcuts.length - 1
307
+ ? lastShortcutRow
308
+ : shortcutRow, children: [
309
+ jsx_runtime_1.jsx("span", { style: actionName, children: shortcut.action }), shortcut.actionId === null || isBrowserStudio ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
310
+ jsx_runtime_1.jsx("span", { style: shortcutCell, children: jsx_runtime_1.jsx(ShortcutChords, { values: shortcutValues }) }), jsx_runtime_1.jsx("span", {})
311
+ ] })) : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
312
+ jsx_runtime_1.jsx("span", { style: shortcutCell, children: jsx_runtime_1.jsx("button", { id: shortcutButtonId, type: "button", style: chordButton, "aria-label": `Change shortcut for ${shortcut.action}`, onClick: () => {
313
+ setError(null);
314
+ setRecording(shortcut.actionId);
315
+ }, onKeyDown: (event) => {
316
+ if (recording !== shortcut.actionId)
317
+ return;
318
+ event.preventDefault();
319
+ event.stopPropagation();
320
+ if (event.key === 'Escape') {
321
+ setRecording(null);
322
+ return;
323
+ }
324
+ const value = (0, keyboard_shortcuts_1.shortcutFromKeyboardEvent)(event.nativeEvent);
325
+ if (value === null)
326
+ return;
327
+ const conflict = displayedShortcutGroups
328
+ .flatMap((item) => item.shortcuts)
329
+ .find((item) => item.actionId !== null &&
330
+ item.actionId !== shortcut.actionId &&
331
+ (0, keyboard_shortcuts_1.getKeyboardShortcutsForAction)(item.actionId, configuredShortcuts).some((candidate) => (0, keyboard_shortcuts_1.keyboardShortcutsOverlap)(candidate, value)));
332
+ if (conflict) {
333
+ setError(`Shortcut is already used by “${conflict.action}”.`);
334
+ return;
335
+ }
336
+ setConfiguredShortcuts((current) => {
337
+ if (keyboard_shortcuts_1.defaultKeyboardShortcuts[shortcut.actionId].some((defaultShortcut) => isSameShortcut(defaultShortcut, value))) {
338
+ const next = { ...current };
339
+ delete next[shortcut.actionId];
340
+ return next;
341
+ }
342
+ return {
343
+ ...current,
344
+ [shortcut.actionId]: value,
345
+ };
346
+ });
347
+ setShortcutsEdited(true);
348
+ setRecording(null);
349
+ }, children: recording === shortcut.actionId ? (jsx_runtime_1.jsx("span", { style: emptyShortcut, children: "Press shortcut\u2026" })) : (jsx_runtime_1.jsx(ShortcutChords, { values: shortcutValues })) }) }), jsx_runtime_1.jsx("span", { style: actionCell, children: jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { renderAction: (color) => jsx_runtime_1.jsx(caret_1.CaretDown, { color: color }), title: `Actions for ${shortcut.action}`, values: shortcutMenuItems, variant: "compact" }) })
350
+ ] }))] }, shortcut.action));
351
+ }) })
173
352
  ] }, group.name))), (error !== null && error !== void 0 ? error : settingsError) ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
174
353
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx("div", { style: { paddingLeft: 16, paddingRight: 16 }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: (_a = error !== null && error !== void 0 ? error : settingsError) !== null && _a !== void 0 ? _a : '', type: "error" }) })
175
354
  ] })) : null] }));
@@ -10,7 +10,7 @@ const MenuCompositionName_1 = require("./MenuCompositionName");
10
10
  const Spinner_1 = require("./Spinner");
11
11
  const cwd = {
12
12
  fontSize: 13,
13
- opacity: 0.8,
13
+ color: colors_1.WHITE_ALPHA_80,
14
14
  display: 'flex',
15
15
  alignItems: 'center',
16
16
  justifyContent: 'center',
@@ -19,9 +19,14 @@ const cwd = {
19
19
  };
20
20
  const spinnerSize = 14;
21
21
  const spinner = {
22
+ opacity: 0.8,
22
23
  position: 'relative',
23
24
  width: spinnerSize,
24
25
  };
26
+ const openInEditor = {
27
+ display: 'flex',
28
+ opacity: 0.8,
29
+ };
25
30
  const noSpinner = {
26
31
  position: 'relative',
27
32
  width: spinnerSize,
@@ -48,7 +53,7 @@ const MenuBuildIndicator = ({ mobileLayout }) => {
48
53
  };
49
54
  }, []);
50
55
  return (jsx_runtime_1.jsxs("div", { style: cwd, title: window.remotion_cwd, children: [
51
- jsx_runtime_1.jsx(layout_1.Spacing, { x: mobileLayout ? 0.5 : 2 }), window.remotion_projectName, jsx_runtime_1.jsx(MenuCompositionName_1.MenuCompositionName, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: folderLocation, locationType: "folder" }), mobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), mobileLayout ? (isBuilding ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
56
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: mobileLayout ? 0.5 : 2 }), window.remotion_projectName, jsx_runtime_1.jsx(MenuCompositionName_1.MenuCompositionName, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: openInEditor, children: jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: folderLocation, locationType: "folder" }) }), mobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), mobileLayout ? (isBuilding ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
52
57
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx("div", { style: spinner, children: jsx_runtime_1.jsx(Spinner_1.Spinner, { duration: 0.5, size: spinnerSize, color: colors_1.WHITE_ALPHA_80 }) })
53
58
  ] })) : null) : isBuilding ? (jsx_runtime_1.jsx("div", { style: spinner, children: jsx_runtime_1.jsx(Spinner_1.Spinner, { duration: 0.5, size: spinnerSize, color: colors_1.WHITE_ALPHA_80 }) })) : (jsx_runtime_1.jsx("div", { style: noSpinner }))] }));
54
59
  };
@@ -4,26 +4,58 @@ exports.MenuCompositionName = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
+ const client_id_1 = require("../helpers/client-id");
7
8
  const colors_1 = require("../helpers/colors");
9
+ const hoverable_1 = require("../helpers/hoverable");
10
+ const noop_1 = require("../helpers/noop");
11
+ const modals_1 = require("../state/modals");
12
+ const composition_menu_items_1 = require("./composition-menu-items");
13
+ const ContextMenu_1 = require("./ContextMenu");
14
+ const InlineDropdown_1 = require("./InlineDropdown");
15
+ const use_resolved_stack_1 = require("./Timeline/use-resolved-stack");
16
+ const use_default_editor_info_1 = require("./use-default-editor-info");
8
17
  const baseStyle = {
9
- color: 'inherit',
18
+ cursor: 'default',
10
19
  textDecoration: 'none',
11
20
  fontSize: 'inherit',
12
21
  textUnderlineOffset: 2,
13
22
  whiteSpace: 'nowrap',
14
23
  };
24
+ const assetNameStyle = {
25
+ ...baseStyle,
26
+ color: colors_1.WHITE_ALPHA_80,
27
+ };
28
+ const contextMenuStyle = {
29
+ alignItems: 'center',
30
+ color: 'inherit',
31
+ display: 'flex',
32
+ fontFamily: 'inherit',
33
+ fontSize: 'inherit',
34
+ lineHeight: 'inherit',
35
+ };
15
36
  const compositionNameStyle = {
16
37
  ...baseStyle,
17
- cursor: 'default',
38
+ appearance: 'none',
39
+ border: 'none',
40
+ backgroundColor: colors_1.TRANSPARENT,
41
+ fontFamily: 'inherit',
42
+ fontSize: 13,
43
+ height: 'auto',
44
+ lineHeight: 1.5,
45
+ margin: 0,
46
+ padding: 0,
47
+ width: 'auto',
48
+ ...hoverable_1.NO_HOVER_BACKGROUND_STYLE,
18
49
  };
19
50
  const slashStyle = {
20
51
  color: colors_1.LIGHT_TEXT,
21
52
  marginInline: 4,
53
+ opacity: 0.8,
22
54
  position: 'relative',
23
55
  top: 1,
24
56
  };
25
57
  const MenuCompositionName = () => {
26
- var _a;
58
+ var _a, _b;
27
59
  const { canvasContent, compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
28
60
  const composition = (0, react_1.useMemo)(() => {
29
61
  var _a;
@@ -33,12 +65,36 @@ const MenuCompositionName = () => {
33
65
  return ((_a = compositions.find((c) => c.id === canvasContent.compositionId)) !== null && _a !== void 0 ? _a : null);
34
66
  }, [canvasContent, compositions]);
35
67
  const asset = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset' ? canvasContent.asset : null;
68
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
69
+ const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
70
+ .previewServerState.type;
71
+ const { defaultEditorId, defaultEditorName } = (0, use_default_editor_info_1.useEditorOpening)(connectionStatus === 'connected');
72
+ const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)((_a = composition === null || composition === void 0 ? void 0 : composition.stack) !== null && _a !== void 0 ? _a : null);
73
+ const getContextMenuItems = (0, react_1.useCallback)(() => {
74
+ return (0, composition_menu_items_1.getCompositionContextMenuItems)({
75
+ closeMenu: noop_1.noop,
76
+ composition,
77
+ connectionStatus,
78
+ editorId: defaultEditorId,
79
+ editorName: defaultEditorName,
80
+ includeCompositionManagementItems: true,
81
+ resolvedLocation,
82
+ setSelectedModal,
83
+ readOnlyStudio: window.remotion_isReadOnlyStudio,
84
+ });
85
+ }, [
86
+ composition,
87
+ connectionStatus,
88
+ defaultEditorId,
89
+ defaultEditorName,
90
+ resolvedLocation,
91
+ setSelectedModal,
92
+ ]);
36
93
  if (!composition && asset === null) {
37
94
  return null;
38
95
  }
39
- const name = (_a = composition === null || composition === void 0 ? void 0 : composition.id) !== null && _a !== void 0 ? _a : asset;
96
+ const name = (_b = composition === null || composition === void 0 ? void 0 : composition.id) !== null && _b !== void 0 ? _b : asset;
40
97
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
41
- jsx_runtime_1.jsx("span", { style: slashStyle, children: "/" }), jsx_runtime_1.jsx("span", { style: compositionNameStyle, children: name })
42
- ] }));
98
+ jsx_runtime_1.jsx("span", { style: slashStyle, children: "/" }), composition ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, style: contextMenuStyle, children: jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { "aria-label": "Open composition menu", className: hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME, getItems: getContextMenuItems, hoveredColor: colors_1.WHITE, renderAction: () => composition.id, style: compositionNameStyle, title: "Open composition menu", unhoveredColor: colors_1.WHITE_ALPHA_80, variant: null }) })) : (jsx_runtime_1.jsx("span", { style: assetNameStyle, children: name }))] }));
43
99
  };
44
100
  exports.MenuCompositionName = MenuCompositionName;
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MenuToolbar = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const ShortcutHint_1 = require("../error-overlay/remotion-overlay/ShortcutHint");
7
6
  const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
8
7
  const can_show_updates_1 = require("../helpers/can-show-updates");
9
8
  const client_id_1 = require("../helpers/client-id");
10
9
  const colors_1 = require("../helpers/colors");
11
10
  const mobile_layout_1 = require("../helpers/mobile-layout");
12
11
  const use_keybinding_1 = require("../helpers/use-keybinding");
12
+ const use_keyboard_shortcut_label_1 = require("../helpers/use-keyboard-shortcut-label");
13
13
  const use_menu_structure_1 = require("../helpers/use-menu-structure");
14
14
  const search_1 = require("../icons/search");
15
15
  const modals_1 = require("../state/modals");
@@ -18,9 +18,9 @@ const layout_1 = require("./layout");
18
18
  const menu_toolbar_height_1 = require("./menu-toolbar-height");
19
19
  const MenuItem_1 = require("./Menu/MenuItem");
20
20
  const MenuBuildIndicator_1 = require("./MenuBuildIndicator");
21
+ const SettingsButton_1 = require("./SettingsButton");
21
22
  const SidebarCollapserControls_1 = require("./SidebarCollapserControls");
22
23
  const UndoRedoButtons_1 = require("./UndoRedoButtons");
23
- const UpdateCheck_1 = require("./UpdateCheck");
24
24
  const row = {
25
25
  alignItems: 'center',
26
26
  flexDirection: 'row',
@@ -132,13 +132,15 @@ const MenuToolbar = ({ readOnlyStudio }) => {
132
132
  const renderSearchIcon = (0, react_1.useCallback)((color) => {
133
133
  return jsx_runtime_1.jsx(search_1.SearchIcon, { color: color, width: 18, height: 18 });
134
134
  }, []);
135
- const searchTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
135
+ const quickSwitcherShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('quickSwitcher');
136
+ const searchTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)() || quickSwitcherShortcut === ''
136
137
  ? 'Quick Switcher'
137
- : `Quick Switcher (${ShortcutHint_1.cmdOrCtrlCharacter}+K)`;
138
+ : `Quick Switcher (${quickSwitcherShortcut})`;
138
139
  return (jsx_runtime_1.jsxs(layout_1.Row, { align: "center", className: "css-reset", style: row, onPointerDown: onPointerDown, children: [
139
140
  jsx_runtime_1.jsxs("div", { style: fixedWidthLeft, children: [mobileLayout ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: openQuickSwitcher, renderAction: renderSearchIcon, title: searchTooltip })) : (jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "left" })), jsx_runtime_1.jsx("div", { style: menuItems, children: structure.map((s) => {
140
141
  return (jsx_runtime_1.jsx(MenuItem_1.MenuItem, { selected: selected === s.id, onItemSelected: itemClicked, onItemHovered: itemHovered, id: s.id, label: s.label, onItemQuit: onItemQuit, menu: s, onPreviousMenu: onPreviousMenu, onNextMenu: onNextMenu, leaveLeftPadding: s.leaveLeftPadding }, s.id));
141
- }) }), showUpdates ? jsx_runtime_1.jsx(UpdateCheck_1.UpdateCheck, {}) : null] }), mobileLayout ? null : jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsx(MenuBuildIndicator_1.MenuBuildIndicator, { mobileLayout: mobileLayout }), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsxs("div", { style: fixedWidthRight, children: [canUndoAndRedo ? jsx_runtime_1.jsx(UndoRedoButtons_1.UndoRedoButtons, {}) : null, jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "right" })
142
+ }) })
143
+ ] }), mobileLayout ? null : jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsx(MenuBuildIndicator_1.MenuBuildIndicator, { mobileLayout: mobileLayout }), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsxs("div", { style: fixedWidthRight, children: [canUndoAndRedo ? jsx_runtime_1.jsx(UndoRedoButtons_1.UndoRedoButtons, {}) : null, jsx_runtime_1.jsx(SettingsButton_1.SettingsButton, { showUpdates: showUpdates }), jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "right" })
142
144
  ] })
143
145
  ] }));
144
146
  };
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  export declare const getMaxModalWidth: (width: number) => string;
3
3
  export declare const getMaxModalHeight: (height: number) => string;
4
4
  export declare const ModalContainer: React.FC<{
5
+ readonly ariaLabel?: string;
5
6
  readonly ariaLabelledBy?: string;
6
7
  readonly onEscape: () => void;
7
8
  readonly onOutsideClick: () => void;
@@ -29,11 +29,11 @@ const panel = {
29
29
  color: colors_1.WHITE,
30
30
  margin: 'auto',
31
31
  };
32
- const ModalContainer = ({ ariaLabelledBy, children, onEscape, onOutsideClick, noZIndex, panelStyle, }) => {
32
+ const ModalContainer = ({ ariaLabel, ariaLabelledBy, children, onEscape, onOutsideClick, noZIndex, panelStyle, }) => {
33
33
  const onPointerDown = (0, react_1.useCallback)((e) => {
34
34
  // Prevent deselection of currently selected items
35
35
  e.stopPropagation();
36
36
  }, []);
37
- return (jsx_runtime_1.jsx("div", { "aria-labelledby": ariaLabelledBy !== null && ariaLabelledBy !== void 0 ? ariaLabelledBy : undefined, "aria-modal": "true", className: "css-reset", role: "dialog", style: backgroundOverlay, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { disabled: noZIndex, onOutsideClick: onOutsideClick, onEscape: onEscape, children: jsx_runtime_1.jsx("div", { style: { ...panel, ...panelStyle }, children: children }) }) }));
37
+ return (jsx_runtime_1.jsx("div", { "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy !== null && ariaLabelledBy !== void 0 ? ariaLabelledBy : undefined, "aria-modal": "true", className: "css-reset", role: "dialog", style: backgroundOverlay, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { disabled: noZIndex, onOutsideClick: onOutsideClick, onEscape: onEscape, children: jsx_runtime_1.jsx("div", { style: { ...panel, ...panelStyle }, children: children }) }) }));
38
38
  };
39
39
  exports.ModalContainer = ModalContainer;
@@ -33,6 +33,8 @@ const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
33
33
  const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
34
34
  const SettingsModal_1 = require("./SettingsModal");
35
35
  const SvgImportDialog_1 = require("./SvgImportDialog");
36
+ const TranscriptionModalWithOptionalWhisper_1 = require("./Transcription/TranscriptionModalWithOptionalWhisper");
37
+ const VideoMattingModalWithOptionalPackage_1 = require("./VideoMatting/VideoMattingModalWithOptionalPackage");
36
38
  const Modals = ({ readOnlyStudio }) => {
37
39
  var _a;
38
40
  const modalContextType = (0, react_1.useContext)(modals_1.SelectedModalContext);
@@ -107,6 +109,6 @@ const Modals = ({ readOnlyStudio }) => {
107
109
  modalContextType.initialTab === 'packages' ||
108
110
  modalContextType.initialTab === 'shortcuts') ? (jsx_runtime_1.jsx(SettingsModal_1.SettingsModal, { initialTab: modalContextType.initialTab, initialPublicLicenseKey: modalContextType.initialPublicLicenseKey }, `${modalContextType.initialTab}-${modalContextType.initialPublicLicenseKey}`)) : null, modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
109
111
  modalContextType.type === 'server-render' &&
110
- (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'element-install' && (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { state: modalContextType })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
112
+ (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'transcribe' ? (jsx_runtime_1.jsx(TranscriptionModalWithOptionalWhisper_1.TranscriptionModalWithOptionalWhisper, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'video-matting' ? (jsx_runtime_1.jsx(VideoMattingModalWithOptionalPackage_1.VideoMattingModalWithOptionalPackage, { state: modalContextType })) : null, modalContextType && modalContextType.type === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'element-install' && (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementInstallConfirmation, { state: modalContextType })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
111
113
  };
112
114
  exports.Modals = Modals;
@@ -0,0 +1,16 @@
1
+ type ModelInfo<Model extends string> = {
2
+ readonly name: Model;
3
+ readonly webGpuDownloadSize: number;
4
+ };
5
+ export declare const ModelManager: <Model extends string>({ ariaLabel, availableModels, description, indent, isModelCached, loadModel, prepare, removeModel, visible, }: {
6
+ readonly ariaLabel: string;
7
+ readonly availableModels: readonly ModelInfo<Model>[];
8
+ readonly description: string | null;
9
+ readonly indent: boolean;
10
+ readonly isModelCached: (model: Model) => Promise<boolean>;
11
+ readonly loadModel: (model: Model, onProgress: (progress: number | null) => void) => Promise<unknown>;
12
+ readonly prepare: (() => Promise<void>) | null;
13
+ readonly removeModel: (model: Model) => Promise<void>;
14
+ readonly visible: boolean;
15
+ }) => import("react/jsx-runtime").JSX.Element;
16
+ export {};