@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
@@ -8,7 +8,7 @@ const element_install_request_1 = require("./element-install-request");
8
8
  const import_assets_1 = require("./import-assets");
9
9
  const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, localFiles, preferCompositionStart, }) => {
10
10
  var _a;
11
- var _b, _c, _d;
11
+ var _b, _c, _d, _e;
12
12
  if (localFiles !== null || (0, drop_handler_data_1.isFileDragEvent)(event)) {
13
13
  const files = localFiles !== null && localFiles !== void 0 ? localFiles : Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
14
14
  if (files.length === 0) {
@@ -91,7 +91,8 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
91
91
  element: {
92
92
  ...element.element,
93
93
  durationInFrames: (_c = element.element.durationInFrames) !== null && _c !== void 0 ? _c : null,
94
- installationMode: (_d = element.element.installationMode) !== null && _d !== void 0 ? _d : null,
94
+ initialProps: (_d = element.element.initialProps) !== null && _d !== void 0 ? _d : null,
95
+ installationMode: (_e = element.element.installationMode) !== null && _e !== void 0 ? _e : null,
95
96
  },
96
97
  from: (0, import_assets_1.getFromForDrop)({
97
98
  durationInFrames: element.element.durationInFrames,
@@ -156,7 +156,8 @@ export declare const insertComposition: ({ composition, compositionFile, composi
156
156
  from: number | null;
157
157
  preferCompositionStart: boolean | null;
158
158
  }) => Promise<void>;
159
- export declare const insertElement: ({ compositionFile, compositionId, element, expectedFileState, position, from, overwriteExisting, }: {
159
+ export declare const insertElement: ({ installationName, compositionFile, compositionId, element, expectedFileState, position, from, overwriteExisting, }: {
160
+ installationName: string | null;
160
161
  compositionFile: string;
161
162
  compositionId: string;
162
163
  element: InstallableElement;
@@ -164,4 +165,4 @@ export declare const insertElement: ({ compositionFile, compositionId, element,
164
165
  position: InsertableCompositionElementPosition | null;
165
166
  from: number | null;
166
167
  overwriteExisting: boolean;
167
- }) => Promise<void>;
168
+ }) => Promise<boolean>;
@@ -479,13 +479,6 @@ const insertCompositionElement = async ({ compositionFile, compositionId, elemen
479
479
  (0, NotificationCenter_1.showNotification)(result.reason, 4000);
480
480
  return false;
481
481
  }
482
- if (result.insertedNodePath !== null) {
483
- (0, inserted_element_selection_1.requestInsertedElementSelection)({
484
- compositionId,
485
- nodePath: result.insertedNodePath,
486
- notification: null,
487
- });
488
- }
489
482
  return true;
490
483
  };
491
484
  const downloadRemoteAsset = (url) => {
@@ -882,12 +875,13 @@ const insertComposition = async ({ composition, compositionFile, compositionId,
882
875
  }
883
876
  };
884
877
  exports.insertComposition = insertComposition;
885
- const insertElement = async ({ compositionFile, compositionId, element, expectedFileState, position, from, overwriteExisting, }) => {
878
+ const insertElement = async ({ installationName, compositionFile, compositionId, element, expectedFileState, position, from, overwriteExisting, }) => {
886
879
  try {
887
880
  if ((0, browser_studio_operations_1.getBrowserStudioOperations)() === null) {
888
881
  await (0, install_required_package_1.installRequiredPackages)(element.dependencies);
889
882
  }
890
883
  const response = await (0, element_install_api_1.installElement)({
884
+ installationName,
891
885
  compositionFile,
892
886
  compositionId,
893
887
  element,
@@ -901,16 +895,18 @@ const insertElement = async ({ compositionFile, compositionId, element, expected
901
895
  ? response.reason
902
896
  : `Element file changed: ${response.conflict.filePath}`;
903
897
  (0, NotificationCenter_1.showNotification)(`Could not add Element: ${reason}`, 4000);
904
- return;
898
+ return false;
905
899
  }
906
900
  (0, inserted_element_selection_1.requestInsertedElementSelection)({
907
901
  compositionId,
908
902
  nodePath: null,
909
903
  notification: `Installed ${element.displayName}`,
910
904
  });
905
+ return true;
911
906
  }
912
907
  catch (error) {
913
908
  (0, NotificationCenter_1.showNotification)(`Could not add Element: ${error instanceof Error ? error.message : String(error)}`, 4000);
909
+ return false;
914
910
  }
915
911
  };
916
912
  exports.insertElement = insertElement;
@@ -1,10 +1,26 @@
1
+ import type { StudioKeyboardShortcut, StudioKeyboardShortcutAction, StudioKeyboardShortcutValue } from '@remotion/studio-shared';
1
2
  export type KeyboardShortcut = {
2
3
  readonly action: string;
3
- readonly chords: readonly (readonly string[])[];
4
+ readonly actionId: StudioKeyboardShortcutAction | null;
5
+ readonly fixedChords?: readonly (readonly string[])[];
6
+ readonly fixedReason?: string;
4
7
  };
5
8
  export type KeyboardShortcutGroup = {
6
9
  readonly name: string;
7
10
  readonly shortcuts: readonly KeyboardShortcut[];
8
11
  };
12
+ export declare const defaultKeyboardShortcuts: Record<StudioKeyboardShortcutAction, readonly StudioKeyboardShortcut[]>;
9
13
  export declare const keyboardShortcutGroups: readonly KeyboardShortcutGroup[];
10
14
  export declare const askAIKeyboardShortcutGroup: KeyboardShortcutGroup;
15
+ export declare const getKeyboardShortcutsForAction: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut", configured?: Partial<Record<"askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut", StudioKeyboardShortcutValue>> | null) => readonly StudioKeyboardShortcut[];
16
+ export declare const keyboardEventMatchesShortcut: ({ event, shortcut: value, }: {
17
+ readonly event: KeyboardEvent;
18
+ readonly shortcut: StudioKeyboardShortcut;
19
+ }) => boolean;
20
+ export declare const keyboardShortcutsOverlap: (first: StudioKeyboardShortcut, second: StudioKeyboardShortcut) => boolean;
21
+ export declare const keyboardEventMatchesAction: (event: KeyboardEvent, action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => boolean;
22
+ export declare const formatKeyboardShortcut: (value: StudioKeyboardShortcut) => readonly string[];
23
+ export declare const formatKeyboardShortcutForAria: (value: StudioKeyboardShortcut) => string;
24
+ export declare const getKeyboardShortcutLabel: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
25
+ export declare const getKeyboardShortcutAriaKeyShortcuts: (action: "askAI" | "clearInOutPoints" | "copyEffectsAndValues" | "cutEffects" | "deleteSelection" | "duplicateSequences" | "enterFullscreen" | "goToFrame" | "jumpToBeginning" | "jumpToEnd" | "nextComposition" | "pauseAndReturnToPlaybackStart" | "pausePlayback" | "playForward" | "playPause" | "previousComposition" | "quickSwitcher" | "redo" | "render" | "resetZoom" | "reversePlayback" | "selectAllSequenceRows" | "selectOpacityProp" | "selectRotateProp" | "selectScaleProp" | "selectTranslateProp" | "setInPoint" | "setOutPoint" | "showKeyboardShortcuts" | "toggleBothSidebars" | "toggleCheckerboard" | "toggleLeftSidebar" | "toggleLoop" | "toggleMute" | "toggleOutlines" | "toggleRightSidebar" | "toggleRulersAndGuides" | "toggleSnapping" | "undo" | "zoomIn" | "zoomOut") => string;
26
+ export declare const shortcutFromKeyboardEvent: (event: KeyboardEvent) => StudioKeyboardShortcut | null;
@@ -1,135 +1,237 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.askAIKeyboardShortcutGroup = exports.keyboardShortcutGroups = void 0;
4
- const ShortcutHint_1 = require("../error-overlay/remotion-overlay/ShortcutHint");
3
+ exports.shortcutFromKeyboardEvent = exports.getKeyboardShortcutAriaKeyShortcuts = exports.getKeyboardShortcutLabel = exports.formatKeyboardShortcutForAria = exports.formatKeyboardShortcut = exports.keyboardEventMatchesAction = exports.keyboardShortcutsOverlap = exports.keyboardEventMatchesShortcut = exports.getKeyboardShortcutsForAction = exports.askAIKeyboardShortcutGroup = exports.keyboardShortcutGroups = exports.defaultKeyboardShortcuts = void 0;
5
4
  const is_mac_1 = require("../helpers/is-mac");
5
+ const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
6
+ const shortcut = (action, actionId) => ({ action, actionId });
7
+ const fixedShortcut = (action, fixedChords, fixedReason) => ({ action, actionId: null, fixedChords, fixedReason });
8
+ exports.defaultKeyboardShortcuts = {
9
+ playPause: [{ key: 'Space' }],
10
+ toggleMute: [{ key: 'm', shift: false }],
11
+ toggleLoop: [{ key: 'l', shift: true }],
12
+ jumpToBeginning: [{ key: 'a' }],
13
+ jumpToEnd: [{ key: 'e' }],
14
+ reversePlayback: [{ key: 'j' }],
15
+ pausePlayback: [{ key: 'k' }],
16
+ playForward: [{ key: 'l', shift: false }],
17
+ goToFrame: [{ key: 'g' }],
18
+ pauseAndReturnToPlaybackStart: [{ key: 'Enter' }],
19
+ toggleLeftSidebar: [{ key: 'b', commandOrControl: true }],
20
+ toggleRightSidebar: [{ key: 'j', commandOrControl: true }],
21
+ toggleBothSidebars: [{ key: 'g', commandOrControl: true }],
22
+ enterFullscreen: [{ key: 'f' }],
23
+ toggleSnapping: [{ key: 'm', shift: true }],
24
+ toggleOutlines: [{ key: 'o', shift: true }],
25
+ toggleRulersAndGuides: [{ key: 'r', shift: true }],
26
+ previousComposition: [{ key: 'PageUp' }],
27
+ nextComposition: [{ key: 'PageDown' }],
28
+ showKeyboardShortcuts: [{ key: '?', shift: true }],
29
+ quickSwitcher: [{ key: 'k', commandOrControl: true }],
30
+ render: [{ key: 'r', shift: false }],
31
+ toggleCheckerboard: [{ key: 't' }],
32
+ setInPoint: [{ key: 'i' }],
33
+ setOutPoint: [{ key: 'o', shift: false }],
34
+ clearInOutPoints: [{ key: 'x' }],
35
+ zoomIn: [{ key: '+', shift: true }, { key: '+' }],
36
+ zoomOut: [{ key: '-' }],
37
+ resetZoom: [{ key: '0' }],
38
+ undo: [{ key: 'z', commandOrControl: true }],
39
+ redo: [
40
+ ...(is_mac_1.isMac ? [] : [{ key: 'y', commandOrControl: true }]),
41
+ { key: 'z', commandOrControl: true, shift: true },
42
+ ],
43
+ selectAllSequenceRows: [{ key: 'a', commandOrControl: true }],
44
+ selectTranslateProp: [{ key: 'p' }],
45
+ selectOpacityProp: [{ key: 't' }],
46
+ selectRotateProp: [{ key: 'r', shift: false }],
47
+ selectScaleProp: [{ key: 's' }],
48
+ duplicateSequences: [{ key: 'd', commandOrControl: true }],
49
+ copyEffectsAndValues: [{ key: 'c', commandOrControl: true }],
50
+ cutEffects: [{ key: 'x', commandOrControl: true }],
51
+ deleteSelection: [{ key: 'Backspace' }, { key: 'Delete' }],
52
+ askAI: [{ key: 'i', commandOrControl: true }],
53
+ };
6
54
  exports.keyboardShortcutGroups = [
7
55
  {
8
56
  name: 'Playback',
9
57
  shortcuts: [
10
- { action: '1 second back', chords: [['Shift', '←']] },
11
- { action: 'Previous frame', chords: [['←']] },
12
- { action: 'Play / Pause', chords: [['Space']] },
13
- { action: 'Next frame', chords: [['→']] },
14
- { action: '1 second forward', chords: [['Shift', '→']] },
15
- { action: 'Jump to beginning', chords: [['A']] },
16
- { action: 'Jump to end', chords: [['E']] },
17
- { action: 'Reverse playback', chords: [['J']] },
18
- { action: 'Pause', chords: [['K']] },
19
- { action: 'Play / Speed up', chords: [['L']] },
20
- { action: 'Go to frame', chords: [['G']] },
21
- {
22
- action: 'Pause & return to playback start',
23
- chords: [['Enter']],
24
- },
58
+ fixedShortcut('1 second back', [['Shift', '←']], 'Context-sensitive timeline control'),
59
+ fixedShortcut('Previous frame', [['←']], 'Context-sensitive timeline control'),
60
+ shortcut('Play / Pause', 'playPause'),
61
+ shortcut('Mute / Unmute', 'toggleMute'),
62
+ shortcut('Loop', 'toggleLoop'),
63
+ fixedShortcut('Next frame', [['→']], 'Context-sensitive timeline control'),
64
+ fixedShortcut('1 second forward', [['Shift', '→']], 'Context-sensitive timeline control'),
65
+ shortcut('Jump to beginning', 'jumpToBeginning'),
66
+ shortcut('Jump to end', 'jumpToEnd'),
67
+ shortcut('Reverse playback', 'reversePlayback'),
68
+ shortcut('Pause', 'pausePlayback'),
69
+ shortcut('Play / Speed up', 'playForward'),
70
+ shortcut('Go to frame', 'goToFrame'),
71
+ shortcut('Pause & return to playback start', 'pauseAndReturnToPlaybackStart'),
25
72
  ],
26
73
  },
27
74
  {
28
75
  name: 'Sidebar',
29
76
  shortcuts: [
30
- {
31
- action: 'Toggle left sidebar',
32
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'B']],
33
- },
34
- {
35
- action: 'Toggle right sidebar',
36
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'J']],
37
- },
38
- {
39
- action: 'Toggle both sidebars',
40
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'G']],
41
- },
77
+ shortcut('Toggle left sidebar', 'toggleLeftSidebar'),
78
+ shortcut('Toggle right sidebar', 'toggleRightSidebar'),
79
+ shortcut('Toggle both sidebars', 'toggleBothSidebars'),
42
80
  ],
43
81
  },
44
82
  {
45
83
  name: 'View',
46
84
  shortcuts: [
47
- { action: 'Enter fullscreen', chords: [['F']] },
48
- { action: 'Exit fullscreen', chords: [['Esc']] },
49
- { action: 'Enable snapping', chords: [['Shift', 'M']] },
85
+ shortcut('Enter fullscreen', 'enterFullscreen'),
86
+ fixedShortcut('Exit fullscreen', [['Esc']], 'Handled by the browser'),
87
+ shortcut('Enable snapping', 'toggleSnapping'),
88
+ shortcut('Outlines', 'toggleOutlines'),
89
+ shortcut('Rulers and guides', 'toggleRulersAndGuides'),
50
90
  ],
51
91
  },
52
92
  {
53
93
  name: 'Navigation',
54
94
  shortcuts: [
55
- { action: 'Previous composition', chords: [['PageUp']] },
56
- { action: 'Next composition', chords: [['PageDown']] },
57
- {
58
- action: 'Render, unless a sequence or prop is selected',
59
- chords: [['R']],
60
- },
61
- {
62
- action: 'Checkerboard, unless a sequence or prop is selected',
63
- chords: [['T']],
64
- },
65
- { action: 'Show keyboard shortcuts', chords: [['?']] },
66
- {
67
- action: 'Quick Switcher',
68
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'K']],
69
- },
95
+ shortcut('Previous composition', 'previousComposition'),
96
+ shortcut('Next composition', 'nextComposition'),
97
+ shortcut('Render, unless a sequence or prop is selected', 'render'),
98
+ shortcut('Checkerboard, unless a sequence or prop is selected', 'toggleCheckerboard'),
99
+ shortcut('Show keyboard shortcuts', 'showKeyboardShortcuts'),
100
+ shortcut('Quick Switcher', 'quickSwitcher'),
70
101
  ],
71
102
  },
72
103
  {
73
104
  name: 'Playback range',
74
105
  shortcuts: [
75
- { action: 'Set In Point', chords: [['I']] },
76
- { action: 'Set Out Point', chords: [['O']] },
77
- { action: 'Clear In/Out Points', chords: [['X']] },
106
+ shortcut('Set In Point', 'setInPoint'),
107
+ shortcut('Set Out Point', 'setOutPoint'),
108
+ shortcut('Clear In/Out Points', 'clearInOutPoints'),
78
109
  ],
79
110
  },
80
111
  {
81
112
  name: 'Zoom',
82
113
  shortcuts: [
83
- { action: 'Zoom in', chords: [['+']] },
84
- { action: 'Zoom out', chords: [['-']] },
85
- { action: 'Reset zoom', chords: [['0']] },
114
+ shortcut('Zoom in', 'zoomIn'),
115
+ shortcut('Zoom out', 'zoomOut'),
116
+ shortcut('Reset zoom', 'resetZoom'),
86
117
  ],
87
118
  },
88
119
  {
89
120
  name: 'Props Editor',
90
- shortcuts: [
91
- { action: 'Undo', chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'Z']] },
92
- {
93
- action: 'Redo',
94
- chords: [
95
- is_mac_1.isMac
96
- ? [ShortcutHint_1.cmdOrCtrlCharacter, 'Shift', 'Z']
97
- : [ShortcutHint_1.cmdOrCtrlCharacter, 'Y'],
98
- ],
99
- },
100
- ],
121
+ shortcuts: [shortcut('Undo', 'undo'), shortcut('Redo', 'redo')],
101
122
  },
102
123
  {
103
124
  name: 'Interactivity',
104
125
  shortcuts: [
105
- { action: 'Select range / axis lock drag', chords: [['Shift']] },
106
- { action: 'Toggle selection', chords: [[ShortcutHint_1.cmdOrCtrlCharacter]] },
107
- {
108
- action: 'Select sequence rows',
109
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'A']],
110
- },
111
- { action: 'Select translate prop', chords: [['P']] },
112
- { action: 'Select opacity prop', chords: [['T']] },
113
- { action: 'Select rotate prop', chords: [['R']] },
114
- { action: 'Select scale prop', chords: [['S']] },
115
- {
116
- action: 'Duplicate sequences',
117
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'D']],
118
- },
119
- {
120
- action: 'Copy effects / values',
121
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'C']],
122
- },
123
- { action: 'Cut effects', chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'X']] },
124
- {
125
- action: 'Paste effects / values',
126
- chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'V']],
127
- },
128
- { action: 'Delete / reset selection', chords: [['Del'], ['⌫']] },
126
+ fixedShortcut('Select range / axis lock drag', [['Shift']], 'Gesture modifier'),
127
+ fixedShortcut('Toggle selection', [[is_mac_1.isMac ? '⌘' : 'Ctrl']], 'Gesture modifier'),
128
+ shortcut('Select sequence rows', 'selectAllSequenceRows'),
129
+ shortcut('Select translate prop', 'selectTranslateProp'),
130
+ shortcut('Select opacity prop', 'selectOpacityProp'),
131
+ shortcut('Select rotate prop', 'selectRotateProp'),
132
+ shortcut('Select scale prop', 'selectScaleProp'),
133
+ shortcut('Duplicate sequences', 'duplicateSequences'),
134
+ shortcut('Copy effects / values', 'copyEffectsAndValues'),
135
+ shortcut('Cut effects', 'cutEffects'),
136
+ fixedShortcut('Paste effects / values', [[is_mac_1.isMac ? '⌘' : 'Ctrl', 'V']], 'Handled by the browser clipboard event'),
137
+ shortcut('Delete / reset selection', 'deleteSelection'),
129
138
  ],
130
139
  },
131
140
  ];
132
141
  exports.askAIKeyboardShortcutGroup = {
133
142
  name: 'AI',
134
- shortcuts: [{ action: 'Ask AI', chords: [[ShortcutHint_1.cmdOrCtrlCharacter, 'I']] }],
143
+ shortcuts: [shortcut('Ask AI', 'askAI')],
144
+ };
145
+ const getKeyboardShortcutsForAction = (action, configured = (0, studio_runtime_config_1.getStudioKeyboardShortcuts)()) => {
146
+ if (configured !== null &&
147
+ Object.prototype.hasOwnProperty.call(configured, action)) {
148
+ const value = configured[action];
149
+ if (value === null) {
150
+ return [];
151
+ }
152
+ return Array.isArray(value)
153
+ ? value
154
+ : [
155
+ value,
156
+ ];
157
+ }
158
+ return exports.defaultKeyboardShortcuts[action];
159
+ };
160
+ exports.getKeyboardShortcutsForAction = getKeyboardShortcutsForAction;
161
+ const normalizeKey = (key) => (key === 'Space' ? ' ' : key);
162
+ const keyboardEventMatchesShortcut = ({ event, shortcut: value, }) => {
163
+ var _a;
164
+ const commandOrControl = is_mac_1.isMac ? event.metaKey : event.ctrlKey;
165
+ return (event.key.toLowerCase() === normalizeKey(value.key).toLowerCase() &&
166
+ commandOrControl === ((_a = value.commandOrControl) !== null && _a !== void 0 ? _a : false) &&
167
+ (is_mac_1.isMac ? !event.ctrlKey : !event.metaKey) &&
168
+ (value.shift === undefined || event.shiftKey === value.shift) &&
169
+ (value.alt === undefined || event.altKey === value.alt));
170
+ };
171
+ exports.keyboardEventMatchesShortcut = keyboardEventMatchesShortcut;
172
+ const keyboardShortcutsOverlap = (first, second) => {
173
+ var _a, _b;
174
+ return first.key.toLowerCase() === second.key.toLowerCase() &&
175
+ ((_a = first.commandOrControl) !== null && _a !== void 0 ? _a : false) === ((_b = second.commandOrControl) !== null && _b !== void 0 ? _b : false) &&
176
+ (first.shift === undefined ||
177
+ second.shift === undefined ||
178
+ first.shift === second.shift) &&
179
+ (first.alt === undefined ||
180
+ second.alt === undefined ||
181
+ first.alt === second.alt);
182
+ };
183
+ exports.keyboardShortcutsOverlap = keyboardShortcutsOverlap;
184
+ const keyboardEventMatchesAction = (event, action) => (0, exports.getKeyboardShortcutsForAction)(action).some((value) => (0, exports.keyboardEventMatchesShortcut)({ event, shortcut: value }));
185
+ exports.keyboardEventMatchesAction = keyboardEventMatchesAction;
186
+ const displayKey = (keyboardKey) => {
187
+ if (keyboardKey === 'ArrowLeft')
188
+ return '←';
189
+ if (keyboardKey === 'ArrowRight')
190
+ return '→';
191
+ if (keyboardKey === 'Delete')
192
+ return 'Del';
193
+ if (keyboardKey === 'Backspace')
194
+ return '⌫';
195
+ if (keyboardKey === 'Escape')
196
+ return 'Esc';
197
+ return keyboardKey.length === 1 ? keyboardKey.toUpperCase() : keyboardKey;
198
+ };
199
+ const formatKeyboardShortcut = (value) => [
200
+ ...(value.commandOrControl ? [is_mac_1.isMac ? '⌘' : 'Ctrl'] : []),
201
+ ...(value.alt ? [is_mac_1.isMac ? 'Option' : 'Alt'] : []),
202
+ ...(value.shift && !['+', '?'].includes(value.key) ? ['Shift'] : []),
203
+ displayKey(value.key),
204
+ ];
205
+ exports.formatKeyboardShortcut = formatKeyboardShortcut;
206
+ const formatKeyboardShortcutForAria = (value) => [
207
+ ...(value.commandOrControl ? [is_mac_1.isMac ? 'Meta' : 'Control'] : []),
208
+ ...(value.alt ? ['Alt'] : []),
209
+ ...(value.shift ? ['Shift'] : []),
210
+ value.key,
211
+ ].join('+');
212
+ exports.formatKeyboardShortcutForAria = formatKeyboardShortcutForAria;
213
+ const getKeyboardShortcutLabel = (action) => (0, exports.getKeyboardShortcutsForAction)(action)
214
+ .map((value) => (0, exports.formatKeyboardShortcut)(value).join('+'))
215
+ .join(' / ');
216
+ exports.getKeyboardShortcutLabel = getKeyboardShortcutLabel;
217
+ const getKeyboardShortcutAriaKeyShortcuts = (action) => (0, exports.getKeyboardShortcutsForAction)(action)
218
+ .map(exports.formatKeyboardShortcutForAria)
219
+ .join(' ');
220
+ exports.getKeyboardShortcutAriaKeyShortcuts = getKeyboardShortcutAriaKeyShortcuts;
221
+ const shortcutFromKeyboardEvent = (event) => {
222
+ if (['Alt', 'Control', 'Meta', 'Shift'].includes(event.key)) {
223
+ return null;
224
+ }
225
+ if (is_mac_1.isMac ? event.ctrlKey : event.metaKey) {
226
+ return null;
227
+ }
228
+ return {
229
+ key: event.key === ' ' ? 'Space' : event.key,
230
+ ...((is_mac_1.isMac ? event.metaKey : event.ctrlKey)
231
+ ? { commandOrControl: true }
232
+ : {}),
233
+ shift: event.shiftKey,
234
+ alt: event.altKey,
235
+ };
135
236
  };
237
+ exports.shortcutFromKeyboardEvent = shortcutFromKeyboardEvent;
@@ -0,0 +1,5 @@
1
+ export declare const getDefaultOutputBaseName: (src: string, displayName: string, fallbackName: string) => string;
2
+ export declare const validatePublicOutputName: ({ extension, outName, }: {
3
+ extension: string;
4
+ outName: string;
5
+ }) => string | null;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePublicOutputName = exports.getDefaultOutputBaseName = void 0;
4
+ const invalidCharacters = ['?', '*', '+', ':', '%'];
5
+ const getDefaultOutputBaseName = (src, displayName, fallbackName) => {
6
+ var _a;
7
+ let pathname = displayName;
8
+ if (!/^(data|blob):/i.test(src.trimStart())) {
9
+ pathname = (_a = src.split(/[?#]/)[0]) !== null && _a !== void 0 ? _a : src;
10
+ try {
11
+ pathname = new URL(src, typeof window === 'undefined'
12
+ ? 'http://localhost'
13
+ : window.location.href).pathname;
14
+ }
15
+ catch (_b) {
16
+ // Fall back to the source as-is if it cannot be parsed as a URL.
17
+ }
18
+ }
19
+ const lastPathSegment = pathname.split('/').filter(Boolean).at(-1);
20
+ let decoded = lastPathSegment !== null && lastPathSegment !== void 0 ? lastPathSegment : displayName;
21
+ try {
22
+ decoded = decodeURIComponent(decoded);
23
+ }
24
+ catch (_c) {
25
+ // Keep the encoded name if it contains an invalid escape sequence.
26
+ }
27
+ return (decoded
28
+ .replace(/\.[^/.]+$/, '')
29
+ .replace(/[^a-zA-Z0-9-_ ]/g, '-')
30
+ .trim()
31
+ .replace(/\s+/g, '-')
32
+ .replace(/^-+|-+$/g, '') || fallbackName);
33
+ };
34
+ exports.getDefaultOutputBaseName = getDefaultOutputBaseName;
35
+ const validatePublicOutputName = ({ extension, outName, }) => {
36
+ if (outName.trim() === '')
37
+ return 'Enter an output file';
38
+ if (outName !== outName.trim())
39
+ return 'The output file must not start or end with whitespace';
40
+ if (outName.startsWith('/') || /^[a-zA-Z]:/.test(outName))
41
+ return 'The output file must be relative to the public folder';
42
+ if (outName.includes('\\'))
43
+ return 'Use forward slashes in the output file';
44
+ if (outName.includes('\0'))
45
+ return 'The output file must not contain null characters';
46
+ const segments = outName.split('/');
47
+ if (segments.some((segment) => segment === ''))
48
+ return 'The output file must not contain empty path segments';
49
+ if (segments.some((segment) => segment === '.'))
50
+ return 'The output file must not contain "." path segments';
51
+ if (segments.some((segment) => segment.startsWith('..')))
52
+ return 'The output file must stay inside the public folder';
53
+ const invalidCharacter = invalidCharacters.find((character) => outName.includes(character));
54
+ if (invalidCharacter)
55
+ return `The output file must not contain "${invalidCharacter}"`;
56
+ if (!outName.toLowerCase().endsWith(extension))
57
+ return `The output file must end in ${extension}`;
58
+ return null;
59
+ };
60
+ exports.validatePublicOutputName = validatePublicOutputName;
@@ -0,0 +1,7 @@
1
+ export declare const useModelCacheStatus: <Model extends string>({ isModelCached, models, refreshKey, }: {
2
+ readonly isModelCached: (model: Model) => Promise<boolean>;
3
+ readonly models: readonly {
4
+ readonly name: Model;
5
+ }[];
6
+ readonly refreshKey: string;
7
+ }) => ReadonlySet<Model>;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useModelCacheStatus = void 0;
4
+ const react_1 = require("react");
5
+ const useModelCacheStatus = ({ isModelCached, models, refreshKey, }) => {
6
+ const [cachedModels, setCachedModels] = (0, react_1.useState)(new Set());
7
+ (0, react_1.useEffect)(() => {
8
+ let cancelled = false;
9
+ Promise.all(models.map(async ({ name }) => ({
10
+ cached: await isModelCached(name),
11
+ name,
12
+ })))
13
+ .then((results) => {
14
+ if (!cancelled) {
15
+ const nextCachedModels = new Set();
16
+ for (const result of results) {
17
+ if (result.cached) {
18
+ nextCachedModels.add(result.name);
19
+ }
20
+ }
21
+ setCachedModels(nextCachedModels);
22
+ }
23
+ })
24
+ .catch(() => {
25
+ if (!cancelled) {
26
+ setCachedModels(new Set());
27
+ }
28
+ });
29
+ return () => {
30
+ cancelled = true;
31
+ };
32
+ }, [isModelCached, models, refreshKey]);
33
+ return cachedModels;
34
+ };
35
+ exports.useModelCacheStatus = useModelCacheStatus;
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CodeFrame = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const LazySyntaxHighlightedSource_1 = require("../../components/LazySyntaxHighlightedSource");
5
6
  const is_menu_item_1 = require("../../components/Menu/is-menu-item");
6
7
  const colors_1 = require("../../helpers/colors");
7
8
  const container = {
@@ -13,6 +14,8 @@ const frame = {
13
14
  backgroundColor: colors_1.ERROR_CODE_FRAME_BACKGROUND,
14
15
  borderRadius: 6,
15
16
  marginBottom: 20,
17
+ marginLeft: 14,
18
+ marginRight: 14,
16
19
  overflowY: 'auto',
17
20
  };
18
21
  const lineNumber = {
@@ -29,23 +32,31 @@ const lineNumber = {
29
32
  fontFamily: 'monospace',
30
33
  };
31
34
  const CodeFrame = ({ source, lineNumberWidth }) => {
32
- return (jsx_runtime_1.jsx("div", { style: frame, className: is_menu_item_1.HORIZONTAL_SCROLLBAR_CLASSNAME, children: source.map((s, j) => {
33
- return (jsx_runtime_1.jsxs("div", { style: container, children: [
34
- jsx_runtime_1.jsx("div", { style: {
35
- ...lineNumber,
36
- backgroundColor: colors_1.ERROR_CODE_FRAME_LINE_BACKGROUND,
37
- color: s.highlight ? colors_1.WHITE : colors_1.WHITE_ALPHA_40,
38
- }, children: String(s.lineNumber).padStart(lineNumberWidth, ' ') }), jsx_runtime_1.jsx("div", { style: {
39
- fontFamily: 'monospace',
40
- whiteSpace: 'pre',
41
- tabSize: 2,
42
- color: s.highlight ? colors_1.WHITE : colors_1.WHITE_ALPHA_40,
43
- backgroundColor: colors_1.TRANSPARENT,
44
- lineHeight: 1.7,
45
- paddingRight: 12,
46
- paddingLeft: 12,
47
- }, children: s.content })
48
- ] }, j));
49
- }) }));
35
+ return (jsx_runtime_1.jsx("div", { style: frame, className: is_menu_item_1.HORIZONTAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx("div", { style: { minWidth: '100%', width: 'max-content' }, children: source.map((s, j) => {
36
+ return (jsx_runtime_1.jsxs("div", { style: {
37
+ ...container,
38
+ backgroundColor: s.highlight
39
+ ? colors_1.SELECTED_BACKGROUND
40
+ : colors_1.TRANSPARENT,
41
+ }, children: [
42
+ jsx_runtime_1.jsx("div", { style: {
43
+ ...lineNumber,
44
+ backgroundColor: s.highlight
45
+ ? colors_1.TRANSPARENT
46
+ : colors_1.ERROR_CODE_FRAME_LINE_BACKGROUND,
47
+ color: s.highlight ? colors_1.WHITE : colors_1.WHITE_ALPHA_40,
48
+ }, children: String(s.lineNumber).padStart(lineNumberWidth, ' ') }), jsx_runtime_1.jsx("code", { className: "language-tsx", style: {
49
+ fontFamily: 'monospace',
50
+ fontSize: 14,
51
+ color: '#9cdcfe',
52
+ whiteSpace: 'pre',
53
+ tabSize: 2,
54
+ backgroundColor: colors_1.TRANSPARENT,
55
+ lineHeight: 1.7,
56
+ paddingRight: 12,
57
+ paddingLeft: 12,
58
+ }, children: jsx_runtime_1.jsx(LazySyntaxHighlightedSource_1.LazySyntaxHighlightedSource, { source: s.content }) })
59
+ ] }, j));
60
+ }) }) }));
50
61
  };
51
62
  exports.CodeFrame = CodeFrame;