@remotion/studio 4.0.522 → 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 (220) 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/CaptionInspector.js +74 -20
  6. package/dist/components/CheckboardToggle.js +8 -6
  7. package/dist/components/Checkbox.d.ts +1 -0
  8. package/dist/components/Checkbox.js +2 -2
  9. package/dist/components/CompositionContextButton.js +4 -1
  10. package/dist/components/CompositionSelectorItem.js +2 -2
  11. package/dist/components/ConfigureLicenseModal.js +1 -1
  12. package/dist/components/CurrentAsset.js +40 -6
  13. package/dist/components/EditorContexts.js +3 -1
  14. package/dist/components/ElementInstallConfirmation.js +287 -135
  15. package/dist/components/FixComputedValueModal.js +38 -8
  16. package/dist/components/FullscreenToggle.js +9 -8
  17. package/dist/components/GlobalKeybindings.js +50 -49
  18. package/dist/components/HighlightedElementSource.d.ts +5 -0
  19. package/dist/components/HighlightedElementSource.js +78 -0
  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 +64 -1
  28. package/dist/components/InstallPackage.js +4 -5
  29. package/dist/components/KeyboardShortcutsSettings.js +212 -33
  30. package/dist/components/MenuToolbar.js +7 -5
  31. package/dist/components/ModalContainer.d.ts +1 -0
  32. package/dist/components/ModalContainer.js +2 -2
  33. package/dist/components/Modals.js +3 -1
  34. package/dist/components/ModelManager.d.ts +16 -0
  35. package/dist/components/ModelManager.js +200 -0
  36. package/dist/components/ModelsSettings.d.ts +2 -0
  37. package/dist/components/ModelsSettings.js +133 -0
  38. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  39. package/dist/components/NewComposition/DismissableModal.js +2 -2
  40. package/dist/components/NewComposition/InputDragger.d.ts +2 -2
  41. package/dist/components/NewComposition/InputDragger.js +6 -6
  42. package/dist/components/NewComposition/NewFolder.js +11 -8
  43. package/dist/components/NewComposition/RenameFolder.js +17 -10
  44. package/dist/components/OptionalPackageModal.d.ts +11 -0
  45. package/dist/components/OptionalPackageModal.js +155 -0
  46. package/dist/components/PlayPause.js +4 -8
  47. package/dist/components/PlaybackKeyboardShortcutsManager.js +3 -6
  48. package/dist/components/PreviewToolbarOverflowButton.js +11 -2
  49. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +5 -2
  50. package/dist/components/RadioButton.d.ts +1 -0
  51. package/dist/components/RadioButton.js +2 -2
  52. package/dist/components/RenderButton.js +5 -1
  53. package/dist/components/RenderModal/NumberSetting.d.ts +6 -1
  54. package/dist/components/RenderModal/NumberSetting.js +2 -2
  55. package/dist/components/RenderModal/RenderModalBasic.js +1 -1
  56. package/dist/components/RenderModal/RenderModalOutputName.d.ts +3 -1
  57. package/dist/components/RenderModal/RenderModalOutputName.js +4 -4
  58. package/dist/components/RenderModal/SeparateAudioOption.js +1 -1
  59. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  60. package/dist/components/RenderQueue/CaptionQueueItem.d.ts +6 -0
  61. package/dist/components/RenderQueue/CaptionQueueItem.js +129 -0
  62. package/dist/components/RenderQueue/CaptionQueueProcessor.d.ts +1 -0
  63. package/dist/components/RenderQueue/CaptionQueueProcessor.js +110 -0
  64. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.d.ts +2 -0
  65. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.js +54 -0
  66. package/dist/components/RenderQueue/RenderQueueItem.js +3 -3
  67. package/dist/components/RenderQueue/VideoMattingQueueItem.d.ts +6 -0
  68. package/dist/components/RenderQueue/VideoMattingQueueItem.js +129 -0
  69. package/dist/components/RenderQueue/VideoMattingQueueProcessor.d.ts +1 -0
  70. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +105 -0
  71. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.d.ts +2 -0
  72. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.js +54 -0
  73. package/dist/components/RenderQueue/caption-job-types.d.ts +47 -0
  74. package/dist/components/RenderQueue/caption-job-types.js +7 -0
  75. package/dist/components/RenderQueue/context.d.ts +16 -0
  76. package/dist/components/RenderQueue/context.js +224 -11
  77. package/dist/components/RenderQueue/index.js +34 -10
  78. package/dist/components/RenderQueue/item-style.d.ts +1 -0
  79. package/dist/components/RenderQueue/item-style.js +2 -1
  80. package/dist/components/RenderQueue/load-model-for-job.d.ts +11 -0
  81. package/dist/components/RenderQueue/load-model-for-job.js +14 -0
  82. package/dist/components/RenderQueue/video-matting-job-types.d.ts +38 -0
  83. package/dist/components/RenderQueue/video-matting-job-types.js +5 -0
  84. package/dist/components/RendersTab.js +4 -4
  85. package/dist/components/SegmentedControl.d.ts +2 -2
  86. package/dist/components/SegmentedControl.js +38 -13
  87. package/dist/components/SelectedOutlinePolygon.js +8 -2
  88. package/dist/components/SettingsButton.d.ts +4 -0
  89. package/dist/components/SettingsButton.js +49 -0
  90. package/dist/components/SettingsModal.d.ts +1 -1
  91. package/dist/components/SettingsModal.js +3 -1
  92. package/dist/components/ShowOutlinesProvider.js +12 -0
  93. package/dist/components/SidebarCollapserControls.js +10 -11
  94. package/dist/components/SizeSelector.js +10 -2
  95. package/dist/components/SkillsSettings.js +2 -3
  96. package/dist/components/SnappingToggle.js +5 -2
  97. package/dist/components/Tabs/vertical.d.ts +1 -0
  98. package/dist/components/Tabs/vertical.js +2 -2
  99. package/dist/components/TimeValue.js +2 -3
  100. package/dist/components/Timeline/SequencePropsObserver.js +4 -0
  101. package/dist/components/Timeline/Timeline.js +2 -42
  102. package/dist/components/Timeline/TimelineClipboardKeybindings.js +2 -4
  103. package/dist/components/Timeline/TimelineDeleteKeybindings.js +3 -18
  104. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  105. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  106. package/dist/components/Timeline/TimelineRowChrome.js +11 -3
  107. package/dist/components/Timeline/TimelineSchemaField.js +8 -4
  108. package/dist/components/Timeline/TimelineSelection.d.ts +2 -0
  109. package/dist/components/Timeline/TimelineSelection.js +55 -2
  110. package/dist/components/Timeline/TimelineSequence.js +75 -17
  111. package/dist/components/Timeline/TimelineSequenceItem.d.ts +0 -1
  112. package/dist/components/Timeline/TimelineSequenceItem.js +208 -111
  113. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +23 -3
  114. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +73 -25
  115. package/dist/components/Timeline/TimelineTimeIndicators.js +1 -0
  116. package/dist/components/Timeline/use-asset-timeline-context-menu.d.ts +2 -0
  117. package/dist/components/Timeline/use-asset-timeline-context-menu.js +52 -0
  118. package/dist/components/TimelineInOutToggle.js +20 -17
  119. package/dist/components/Transcription/LazyModels.d.ts +1 -0
  120. package/dist/components/Transcription/LazyModels.js +5 -0
  121. package/dist/components/Transcription/Models.d.ts +6 -0
  122. package/dist/components/Transcription/Models.js +18 -0
  123. package/dist/components/Transcription/TranscriptionModal.d.ts +3 -0
  124. package/dist/components/Transcription/TranscriptionModal.js +428 -0
  125. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.d.ts +5 -0
  126. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +48 -0
  127. package/dist/components/Transcription/caption-output-name.d.ts +2 -0
  128. package/dist/components/Transcription/caption-output-name.js +10 -0
  129. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +6 -0
  130. package/dist/components/Transcription/resample-media-to-16-khz.js +82 -0
  131. package/dist/components/Transcription/whisper-languages.d.ts +2 -0
  132. package/dist/components/Transcription/whisper-languages.js +104 -0
  133. package/dist/components/Transcription/whisper-webgpu-capability.d.ts +2 -0
  134. package/dist/components/Transcription/whisper-webgpu-capability.js +7 -0
  135. package/dist/components/UndoRedoButtons.js +13 -38
  136. package/dist/components/UpdatesSettings.js +8 -12
  137. package/dist/components/VideoMatting/LazyModels.d.ts +1 -0
  138. package/dist/components/VideoMatting/LazyModels.js +5 -0
  139. package/dist/components/VideoMatting/Models.d.ts +6 -0
  140. package/dist/components/VideoMatting/Models.js +18 -0
  141. package/dist/components/VideoMatting/VideoMattingModal.d.ts +3 -0
  142. package/dist/components/VideoMatting/VideoMattingModal.js +207 -0
  143. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.d.ts +5 -0
  144. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +46 -0
  145. package/dist/components/VideoMatting/video-matting-capability.d.ts +2 -0
  146. package/dist/components/VideoMatting/video-matting-capability.js +7 -0
  147. package/dist/components/WebMcp.js +439 -22
  148. package/dist/components/import-assets.d.ts +3 -2
  149. package/dist/components/import-assets.js +5 -9
  150. package/dist/components/keyboard-shortcuts.d.ts +17 -1
  151. package/dist/components/keyboard-shortcuts.js +177 -89
  152. package/dist/components/public-output-name.d.ts +5 -0
  153. package/dist/components/public-output-name.js +60 -0
  154. package/dist/components/use-model-cache-status.d.ts +7 -0
  155. package/dist/components/use-model-cache-status.js +35 -0
  156. package/dist/esm/CaptionQueueProcessor-k0yrm3dj.mjs +211 -0
  157. package/dist/esm/HighlightedElementSource-jfc66k4p.mjs +1236 -0
  158. package/dist/esm/LazyModels-2trdm224.mjs +11 -0
  159. package/dist/esm/LazyModels-fjb5ckaq.mjs +11 -0
  160. package/dist/esm/TranscriptionModal-916jqhry.mjs +1011 -0
  161. package/dist/esm/VideoMattingModal-2tm79s9b.mjs +374 -0
  162. package/dist/esm/VideoMattingQueueProcessor-t1hgm2rm.mjs +109 -0
  163. package/dist/esm/index-1x7bsdh6.mjs +261 -0
  164. package/dist/esm/index-3hgr6gjx.mjs +41 -0
  165. package/dist/esm/index-5qddp5h7.mjs +36 -0
  166. package/dist/esm/index-5zrb1ft4.mjs +39 -0
  167. package/dist/esm/index-6cvm9a65.mjs +45923 -0
  168. package/dist/esm/index-7tt71e8n.mjs +36 -0
  169. package/dist/esm/index-9x6e1dq0.mjs +428 -0
  170. package/dist/esm/index-cw0pnpg5.mjs +50 -0
  171. package/dist/esm/index-czwvnn9g.mjs +35 -0
  172. package/dist/esm/index-hy4xcgty.mjs +1366 -0
  173. package/dist/esm/{chunk-je0h1bgt.js → index-jg13hf2g.mjs} +3 -1
  174. package/dist/esm/{chunk-6jf1natv.js → index-rcv7qkt5.mjs} +18 -1
  175. package/dist/esm/index-sgtmgc4h.mjs +423 -0
  176. package/dist/esm/index-te66vvrp.mjs +142 -0
  177. package/dist/esm/index-v4tr1bft.mjs +20 -0
  178. package/dist/esm/index-x7t2y7ws.mjs +54194 -0
  179. package/dist/esm/index-xhe2m2qr.mjs +1146 -0
  180. package/dist/esm/index.mjs +45 -933
  181. package/dist/esm/internals.mjs +13 -114393
  182. package/dist/esm/previewEntry.mjs +387 -115050
  183. package/dist/esm/renderEntry.mjs +3 -3
  184. package/dist/esm/{chunk-m0jqdbkr.js → resolve-composition-component-location-14148845.mjs} +1 -1
  185. package/dist/helpers/drag-aware-double-click.d.ts +2 -1
  186. package/dist/helpers/drag-aware-double-click.js +12 -1
  187. package/dist/helpers/get-asset-metadata.d.ts +1 -0
  188. package/dist/helpers/get-asset-metadata.js +4 -0
  189. package/dist/helpers/hoverable.js +8 -0
  190. package/dist/helpers/inject-css.js +2 -0
  191. package/dist/helpers/optional-package-dependencies.d.ts +3 -0
  192. package/dist/helpers/optional-package-dependencies.js +24 -0
  193. package/dist/helpers/pointer-session.d.ts +6 -0
  194. package/dist/helpers/pointer-session.js +36 -14
  195. package/dist/helpers/prism-tomorrow.d.ts +1 -0
  196. package/dist/helpers/prism-tomorrow.js +151 -0
  197. package/dist/helpers/sequence-node-path-mutations.js +11 -0
  198. package/dist/helpers/slugify-name.d.ts +1 -0
  199. package/dist/helpers/slugify-name.js +14 -0
  200. package/dist/helpers/studio-runtime-config.d.ts +1 -0
  201. package/dist/helpers/studio-runtime-config.js +6 -1
  202. package/dist/helpers/use-keybinding.d.ts +9 -3
  203. package/dist/helpers/use-keybinding.js +8 -9
  204. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -0
  205. package/dist/helpers/use-keyboard-shortcut-label.js +15 -0
  206. package/dist/helpers/use-menu-structure.js +58 -13
  207. package/dist/icons/input-props.d.ts +1 -1
  208. package/dist/icons/input-props.js +2 -2
  209. package/dist/icons/models.d.ts +4 -0
  210. package/dist/icons/models.js +7 -0
  211. package/dist/icons/separation.d.ts +4 -0
  212. package/dist/icons/separation.js +7 -0
  213. package/dist/icons/transcription.d.ts +4 -0
  214. package/dist/icons/transcription.js +7 -0
  215. package/dist/icons/upload.js +1 -1
  216. package/dist/state/modals.d.ts +14 -2
  217. package/package.json +34 -20
  218. package/dist/components/UpdateCheck.d.ts +0 -1
  219. package/dist/components/UpdateCheck.js +0 -79
  220. package/dist/esm/chunk-3netyjd9.js +0 -99793
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const SettingsButton: React.FC<{
3
+ readonly showUpdates: boolean;
4
+ }>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsButton = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
7
+ const colors_1 = require("../helpers/colors");
8
+ const gear_1 = require("../icons/gear");
9
+ const modals_1 = require("../state/modals");
10
+ const InlineAction_1 = require("./InlineAction");
11
+ const UpdateStatusContext_1 = require("./UpdateStatusContext");
12
+ const SettingsButton = ({ showUpdates }) => {
13
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
14
+ const { info, knownBugs } = (0, UpdateStatusContext_1.useUpdateStatus)();
15
+ const updateAvailable = showUpdates &&
16
+ Boolean((info === null || info === void 0 ? void 0 : info.updateAvailable) || (info === null || info === void 0 ? void 0 : info.skillsUpdateAvailable));
17
+ const hasBugfixesAvailable = showUpdates &&
18
+ Boolean((info === null || info === void 0 ? void 0 : info.updateAvailable) && knownBugs && knownBugs.length > 0);
19
+ const openModal = (0, react_1.useCallback)(() => {
20
+ var _a;
21
+ var _b;
22
+ setSelectedModal({
23
+ type: 'settings',
24
+ initialTab: updateAvailable
25
+ ? 'updates'
26
+ : (0, browser_studio_operations_1.getBrowserStudioOperations)() === null
27
+ ? 'rendering'
28
+ : 'shortcuts',
29
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
30
+ });
31
+ }, [setSelectedModal, updateAvailable]);
32
+ const renderGearIcon = (0, react_1.useCallback)((color) => {
33
+ return jsx_runtime_1.jsx(gear_1.GearIcon, { color: color, width: 16, height: 16 });
34
+ }, []);
35
+ const renderUpdateIcon = (0, react_1.useCallback)((color) => {
36
+ return (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
37
+ height: 16,
38
+ width: 16,
39
+ color,
40
+ flexShrink: 0,
41
+ }, viewBox: "0 0 512 512", children: jsx_runtime_1.jsx("path", { fill: color, d: "M256 32a224 224 0 1 1 0 448 224 224 0 1 1 0-448zm0 480a256 256 0 1 0 0-512 256 256 0 1 0 0 512zM377 231L273 127c-9.4-9.4-24.6-9.4-33.9 0L135 231c-6.9 6.9-8.9 17.2-5.2 26.2S142.3 272 152 272l40 0 0 72c0 22.1 17.9 40 40 40l48 0c22.1 0 40-17.9 40-40l0-72 40 0c9.7 0 18.5-5.8 22.2-14.8s1.7-19.3-5.2-26.2z" }) }));
42
+ }, []);
43
+ return (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: openModal, renderAction: updateAvailable ? renderUpdateIcon : renderGearIcon, unhoveredColor: hasBugfixesAvailable ? colors_1.WARNING_COLOR : colors_1.WHITE_ALPHA_80, title: hasBugfixesAvailable
44
+ ? 'Bugfixes available'
45
+ : updateAvailable
46
+ ? 'Update available'
47
+ : 'Settings' }));
48
+ };
49
+ exports.SettingsButton = SettingsButton;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- type SettingsTab = 'apps' | 'rendering' | 'studio' | 'packages' | 'shortcuts' | 'skills' | 'license' | 'updates';
2
+ type SettingsTab = 'apps' | 'rendering' | 'studio' | 'packages' | 'models' | 'shortcuts' | 'skills' | 'license' | 'updates';
3
3
  export declare const SettingsModal: React.FC<{
4
4
  readonly initialTab: SettingsTab;
5
5
  readonly initialPublicLicenseKey: string | null;
@@ -10,6 +10,7 @@ const apps_1 = require("../icons/apps");
10
10
  const cloud_download_1 = require("../icons/cloud-download");
11
11
  const keyboard_1 = require("../icons/keyboard");
12
12
  const license_1 = require("../icons/license");
13
+ const models_1 = require("../icons/models");
13
14
  const package_1 = require("../icons/package");
14
15
  const remotion_triangle_1 = require("../icons/remotion-triangle");
15
16
  const skills_1 = require("../icons/skills");
@@ -21,6 +22,7 @@ const InstallPackage_1 = require("./InstallPackage");
21
22
  const KeyboardShortcutsSettings_1 = require("./KeyboardShortcutsSettings");
22
23
  const is_menu_item_1 = require("./Menu/is-menu-item");
23
24
  const ModalHeader_1 = require("./ModalHeader");
25
+ const ModelsSettings_1 = require("./ModelsSettings");
24
26
  const DismissableModal_1 = require("./NewComposition/DismissableModal");
25
27
  const RenderingSettings_1 = require("./RenderingSettings");
26
28
  const render_modals_1 = require("./RenderModal/render-modals");
@@ -102,6 +104,6 @@ const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
102
104
  }, [initialPublicLicenseKey, setPublicLicenseKey]);
103
105
  return (jsx_runtime_1.jsx(DismissableModal_1.DismissableModal, { panelStyle: render_modals_1.outerModalStyle, children: jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
104
106
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Settings", onClose: dismiss }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
105
- jsx_runtime_1.jsxs("div", { style: settingsLeftSidebar, children: [isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'rendering', onClick: () => selectTab('rendering'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: render_modals_1.icon }) })), children: "Defaults" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'studio', onClick: () => selectTab('studio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(remotion_triangle_1.RemotionTriangleIcon, { color: color, style: render_modals_1.icon }) })), children: "Studio" })), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'shortcuts', onClick: () => selectTab('shortcuts'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(keyboard_1.KeyboardIcon, { color: color, style: keyboardIcon }) })), children: "Shortcuts" }), showPackages ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'packages', onClick: () => selectTab('packages'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(package_1.PackageIcon, { color: color, style: render_modals_1.icon }) })), children: "Packages" })) : null, isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'skills', onClick: () => selectTab('skills'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(skills_1.SkillsIcon, { color: color, style: skillsIcon }) })), children: "Skills" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(license_1.LicenseIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })), showUpdates ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'updates', onClick: () => selectTab('updates'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: render_modals_1.icon }) })), children: "Updates" })) : null] }), openedTabs.includes('packages') ? (jsx_runtime_1.jsx("div", { style: tab === 'packages' ? render_modals_1.optionsPanel : hiddenPanel, children: jsx_runtime_1.jsx(InstallPackage_1.InstallPackageSettings, { footerContainer: packagesFooterContainer, packageManager: packageManager }) })) : null, openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, {}) })) : null, openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, {}) })) : null, openedTabs.includes('skills') ? (jsx_runtime_1.jsx("div", { style: tab === 'skills' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(SkillsSettings_1.SkillsSettings, {}) })) : null, openedTabs.includes('shortcuts') ? (jsx_runtime_1.jsx("div", { style: tab === 'shortcuts' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(KeyboardShortcutsSettings_1.KeyboardShortcutsSettings, {}) })) : null, openedTabs.includes('rendering') ? (jsx_runtime_1.jsx("div", { style: tab === 'rendering' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(RenderingSettings_1.RenderingSettings, {}) })) : null, openedTabs.includes('studio') ? (jsx_runtime_1.jsx("div", { style: tab === 'studio' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(StudioSettings_1.StudioSettings, {}) })) : null, showUpdates && openedTabs.includes('updates') ? (jsx_runtime_1.jsx("div", { style: tab === 'updates' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(UpdatesSettings_1.UpdatesSettings, {}) })) : null] }), tab === 'packages' ? (jsx_runtime_1.jsx("div", { ref: setPackagesFooterContainer })) : isBrowserStudio || tab === 'updates' ? null : (jsx_runtime_1.jsx(SettingsModalFooter_1.SettingsModalFooter, { showLicenseFaq: tab === 'license' }))] }) }));
107
+ jsx_runtime_1.jsxs("div", { style: settingsLeftSidebar, children: [isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'rendering', onClick: () => selectTab('rendering'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: render_modals_1.icon }) })), children: "Defaults" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'studio', onClick: () => selectTab('studio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(remotion_triangle_1.RemotionTriangleIcon, { color: color, style: render_modals_1.icon }) })), children: "Studio" })), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'shortcuts', onClick: () => selectTab('shortcuts'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(keyboard_1.KeyboardIcon, { color: color, style: keyboardIcon }) })), children: "Shortcuts" }), showPackages ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'packages', onClick: () => selectTab('packages'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(package_1.PackageIcon, { color: color, style: render_modals_1.icon }) })), children: "Packages" })) : null, isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'skills', onClick: () => selectTab('skills'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(skills_1.SkillsIcon, { color: color, style: skillsIcon }) })), children: "Skills" })), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'models', onClick: () => selectTab('models'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(models_1.ModelsIcon, { color: color, style: render_modals_1.icon }) })), children: "Models" }), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(license_1.LicenseIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })), showUpdates ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'updates', onClick: () => selectTab('updates'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: render_modals_1.icon }) })), children: "Updates" })) : null] }), openedTabs.includes('packages') ? (jsx_runtime_1.jsx("div", { style: tab === 'packages' ? render_modals_1.optionsPanel : hiddenPanel, children: jsx_runtime_1.jsx(InstallPackage_1.InstallPackageSettings, { footerContainer: packagesFooterContainer, packageManager: packageManager }) })) : null, openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, {}) })) : null, openedTabs.includes('models') ? (jsx_runtime_1.jsx("div", { style: tab === 'models' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ModelsSettings_1.ModelsSettings, {}) })) : null, openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, {}) })) : null, openedTabs.includes('skills') ? (jsx_runtime_1.jsx("div", { style: tab === 'skills' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(SkillsSettings_1.SkillsSettings, {}) })) : null, openedTabs.includes('shortcuts') ? (jsx_runtime_1.jsx("div", { style: tab === 'shortcuts' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(KeyboardShortcutsSettings_1.KeyboardShortcutsSettings, {}) })) : null, openedTabs.includes('rendering') ? (jsx_runtime_1.jsx("div", { style: tab === 'rendering' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(RenderingSettings_1.RenderingSettings, {}) })) : null, openedTabs.includes('studio') ? (jsx_runtime_1.jsx("div", { style: tab === 'studio' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(StudioSettings_1.StudioSettings, {}) })) : null, showUpdates && openedTabs.includes('updates') ? (jsx_runtime_1.jsx("div", { style: tab === 'updates' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(UpdatesSettings_1.UpdatesSettings, {}) })) : null] }), tab === 'packages' ? (jsx_runtime_1.jsx("div", { ref: setPackagesFooterContainer })) : isBrowserStudio || tab === 'models' || tab === 'updates' ? null : (jsx_runtime_1.jsx(SettingsModalFooter_1.SettingsModalFooter, { showLicenseFaq: tab === 'license' }))] }) }));
106
108
  };
107
109
  exports.SettingsModal = SettingsModal;
@@ -5,9 +5,21 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const editor_outlines_1 = require("../state/editor-outlines");
7
7
  const timeline_sequence_hover_1 = require("../state/timeline-sequence-hover");
8
+ const browserStudioPointerLeaveEvent = 'remotion-browser-studio-pointerleave';
8
9
  const ShowOutlinesProvider = ({ children }) => {
9
10
  const [editorShowOutlines, setEditorShowOutlinesState] = (0, react_1.useState)(() => (0, editor_outlines_1.loadEditorShowOutlinesOption)());
10
11
  const timelineSequenceHoverStore = (0, react_1.useMemo)(() => (0, timeline_sequence_hover_1.createTimelineSequenceHoverStore)(), []);
12
+ (0, react_1.useEffect)(() => {
13
+ const onPointerLeave = () => {
14
+ timelineSequenceHoverStore.setHoveredSequence((hover) => (hover === null || hover === void 0 ? void 0 : hover.source) === 'timeline' ? null : hover);
15
+ };
16
+ window.addEventListener('pointerleave', onPointerLeave);
17
+ window.addEventListener(browserStudioPointerLeaveEvent, onPointerLeave);
18
+ return () => {
19
+ window.removeEventListener('pointerleave', onPointerLeave);
20
+ window.removeEventListener(browserStudioPointerLeaveEvent, onPointerLeave);
21
+ };
22
+ }, [timelineSequenceHoverStore]);
11
23
  const setEditorShowOutlines = (0, react_1.useCallback)((newValue) => {
12
24
  setEditorShowOutlinesState((prevState) => {
13
25
  const newVal = newValue(prevState);
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SidebarCollapserControl = 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 colors_1 = require("../helpers/colors");
8
7
  const use_keybinding_1 = require("../helpers/use-keybinding");
8
+ const use_keyboard_shortcut_label_1 = require("../helpers/use-keyboard-shortcut-label");
9
9
  const sidebar_1 = require("../state/sidebar");
10
10
  const InlineAction_1 = require("./InlineAction");
11
11
  const TopPanel_1 = require("./TopPanel");
@@ -92,8 +92,7 @@ const SidebarCollapserControl = ({ side }) => {
92
92
  if (side === 'left') {
93
93
  const left = keybindings.registerKeybinding({
94
94
  event: 'keydown',
95
- key: 'b',
96
- commandCtrlKey: true,
95
+ action: 'toggleLeftSidebar',
97
96
  callback: toggleLeft,
98
97
  preventDefault: true,
99
98
  triggerIfInputFieldFocused: false,
@@ -101,8 +100,7 @@ const SidebarCollapserControl = ({ side }) => {
101
100
  });
102
101
  const zen = keybindings.registerKeybinding({
103
102
  event: 'keydown',
104
- key: 'g',
105
- commandCtrlKey: true,
103
+ action: 'toggleBothSidebars',
106
104
  callback: toggleBoth,
107
105
  preventDefault: true,
108
106
  triggerIfInputFieldFocused: false,
@@ -115,8 +113,7 @@ const SidebarCollapserControl = ({ side }) => {
115
113
  }
116
114
  const right = keybindings.registerKeybinding({
117
115
  event: 'keydown',
118
- key: 'j',
119
- commandCtrlKey: true,
116
+ action: 'toggleRightSidebar',
120
117
  callback: toggleRight,
121
118
  preventDefault: true,
122
119
  triggerIfInputFieldFocused: false,
@@ -126,12 +123,14 @@ const SidebarCollapserControl = ({ side }) => {
126
123
  right.unregister();
127
124
  };
128
125
  }, [keybindings, side, toggleBoth, toggleLeft, toggleRight]);
129
- const toggleLeftTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
126
+ const leftShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('toggleLeftSidebar');
127
+ const rightShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('toggleRightSidebar');
128
+ const toggleLeftTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)() || leftShortcut === ''
130
129
  ? 'Toggle Left Sidebar'
131
- : `Toggle Left Sidebar (${ShortcutHint_1.cmdOrCtrlCharacter}+B)`;
132
- const toggleRightTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
130
+ : `Toggle Left Sidebar (${leftShortcut})`;
131
+ const toggleRightTooltip = (0, use_keybinding_1.areKeyboardShortcutsDisabled)() || rightShortcut === ''
133
132
  ? 'Toggle Right Sidebar'
134
- : `Toggle Right Sidebar (${ShortcutHint_1.cmdOrCtrlCharacter}+J)`;
133
+ : `Toggle Right Sidebar (${rightShortcut})`;
135
134
  const colorStyle = (0, react_1.useCallback)((color) => {
136
135
  return {
137
136
  ...style,
@@ -6,6 +6,8 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const colors_1 = require("../helpers/colors");
8
8
  const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
9
+ const use_keybinding_1 = require("../helpers/use-keybinding");
10
+ const use_keyboard_shortcut_label_1 = require("../helpers/use-keyboard-shortcut-label");
9
11
  const canvas_zoom_1 = require("../icons/canvas-zoom");
10
12
  const Checkmark_1 = require("../icons/Checkmark");
11
13
  const TimelineCombobox_1 = require("./TimelineCombobox");
@@ -87,6 +89,10 @@ const usePreviewSizeMenuItems = () => {
87
89
  }
88
90
  return false;
89
91
  }, [canvasContent]);
92
+ const configuredResetZoomShortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('resetZoom');
93
+ const resetZoomShortcut = (0, use_keybinding_1.areKeyboardShortcutsDisabled)()
94
+ ? ''
95
+ : configuredResetZoomShortcut;
90
96
  const items = (0, react_1.useMemo)(() => {
91
97
  return (0, exports.getUniqueSizes)(size).map((newSize) => {
92
98
  return {
@@ -99,13 +105,15 @@ const usePreviewSizeMenuItems = () => {
99
105
  },
100
106
  type: 'item',
101
107
  value: newSize.size,
102
- keyHint: newSize.size === 'auto' ? '0' : null,
108
+ keyHint: newSize.size === 'auto' && resetZoomShortcut !== ''
109
+ ? resetZoomShortcut
110
+ : null,
103
111
  leftItem: String(size.size) === String(newSize.size) ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
104
112
  subMenu: null,
105
113
  quickSwitcherLabel: null,
106
114
  };
107
115
  });
108
- }, [setSize, size]);
116
+ }, [resetZoomShortcut, setSize, size]);
109
117
  return {
110
118
  items,
111
119
  selectedId: String(size.size),
@@ -8,7 +8,6 @@ const copy_text_1 = require("../helpers/copy-text");
8
8
  const use_copy_feedback_1 = require("../helpers/use-copy-feedback");
9
9
  const check_circle_filled_1 = require("../icons/check-circle-filled");
10
10
  const copy_1 = require("../icons/copy");
11
- const minus_1 = require("../icons/minus");
12
11
  const InlineAction_1 = require("./InlineAction");
13
12
  const ValidationMessage_1 = require("./NewComposition/ValidationMessage");
14
13
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
@@ -126,8 +125,8 @@ const SkillsSettings = () => {
126
125
  : 'Not installed';
127
126
  return (jsx_runtime_1.jsxs("div", { role: "listitem", style: index === remotionSkillsInfo.skills.length - 1
128
127
  ? lastSkillRow
129
- : skillRow, children: [installed ? (jsx_runtime_1.jsx(check_circle_filled_1.CheckCircleFilled, { "aria-hidden": true, style: { ...statusIcon, fill: colors_1.BLUE } })) : (jsx_runtime_1.jsx(minus_1.Minus, { "aria-hidden": true, color: colors_1.LIGHT_TEXT, style: statusIcon })), jsx_runtime_1.jsxs("span", { style: skillName, children: ["/", skill.name] }), jsx_runtime_1.jsx("span", { style: status, children: installedLocation })
130
- ] }, skill.name));
128
+ : skillRow, children: [
129
+ jsx_runtime_1.jsxs("span", { style: skillName, children: ["/", skill.name] }), jsx_runtime_1.jsx("span", { style: status, children: installedLocation }), installed ? (jsx_runtime_1.jsx(check_circle_filled_1.CheckCircleFilled, { "aria-hidden": true, style: { ...statusIcon, fill: colors_1.BLUE } })) : null] }, skill.name));
131
130
  }) })) : null] }));
132
131
  };
133
132
  exports.SkillsSettings = SkillsSettings;
@@ -6,6 +6,7 @@ const react_1 = require("react");
6
6
  const no_react_1 = require("remotion/no-react");
7
7
  const colors_1 = require("../helpers/colors");
8
8
  const use_keybinding_1 = require("../helpers/use-keybinding");
9
+ const use_keyboard_shortcut_label_1 = require("../helpers/use-keyboard-shortcut-label");
9
10
  const magnet_1 = require("../icons/magnet");
10
11
  const editor_snapping_1 = require("../state/editor-snapping");
11
12
  const ControlButton_1 = require("./ControlButton");
@@ -14,12 +15,14 @@ const SnappingToggle = () => {
14
15
  const onClick = (0, react_1.useCallback)(() => {
15
16
  setEditorSnapping((current) => !current);
16
17
  }, [setEditorSnapping]);
18
+ const shortcut = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutLabel)('toggleSnapping');
19
+ const ariaKeyShortcuts = (0, use_keyboard_shortcut_label_1.useKeyboardShortcutAriaKeyShortcuts)('toggleSnapping');
17
20
  const accessibilityLabel = [
18
21
  editorSnapping ? 'Disable snapping' : 'Enable snapping',
19
- (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? null : '(Shift+M)',
22
+ (0, use_keybinding_1.areKeyboardShortcutsDisabled)() || shortcut === '' ? null : `(${shortcut})`,
20
23
  ]
21
24
  .filter(no_react_1.NoReactInternals.truthy)
22
25
  .join(' ');
23
- return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, "aria-pressed": editorSnapping, "aria-keyshortcuts": "Shift+M", onClick: onClick, children: (color) => (jsx_runtime_1.jsx(magnet_1.MagnetIcon, { style: { width: 18, height: 18, transform: 'translateY(1px)' }, color: editorSnapping ? colors_1.BLUE : color, "aria-hidden": "true", focusable: "false" })) }));
26
+ return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, "aria-pressed": editorSnapping, "aria-keyshortcuts": ariaKeyShortcuts || undefined, onClick: onClick, children: (color) => (jsx_runtime_1.jsx(magnet_1.MagnetIcon, { style: { width: 18, height: 18, transform: 'translateY(1px)' }, color: editorSnapping ? colors_1.BLUE : color, "aria-hidden": "true", focusable: "false" })) }));
24
27
  };
25
28
  exports.SnappingToggle = SnappingToggle;
@@ -5,4 +5,5 @@ export declare const VerticalTab: React.FC<{
5
5
  readonly renderIcon?: (color: string) => React.ReactNode;
6
6
  readonly style?: React.CSSProperties;
7
7
  readonly selected: boolean;
8
+ readonly autoFocus?: boolean;
8
9
  }>;
@@ -19,7 +19,7 @@ const selectorButton = {
19
19
  userSelect: 'none',
20
20
  WebkitUserSelect: 'none',
21
21
  };
22
- const VerticalTab = ({ children, onClick, renderIcon, style, selected }) => {
22
+ const VerticalTab = ({ children, onClick, renderIcon, style, selected, autoFocus }) => {
23
23
  const [hovered, setHovered] = (0, react_1.useState)(false);
24
24
  const { tabIndex } = (0, z_index_1.useZIndex)();
25
25
  const onPointerEnter = (0, react_1.useCallback)(() => {
@@ -38,6 +38,6 @@ const VerticalTab = ({ children, onClick, renderIcon, style, selected }) => {
38
38
  ...style,
39
39
  };
40
40
  }, [color, hovered, selected, style]);
41
- return (jsx_runtime_1.jsxs("button", { style: definiteStyle, type: "button", onClick: onClick, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: [renderIcon ? renderIcon(color) : null, children] }));
41
+ return (jsx_runtime_1.jsxs("button", { autoFocus: autoFocus, style: definiteStyle, type: "button", onClick: onClick, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: [renderIcon ? renderIcon(color) : null, children] }));
42
42
  };
43
43
  exports.VerticalTab = VerticalTab;
@@ -102,13 +102,12 @@ const TimeValue = () => {
102
102
  }), [seek, play, pause, toggle]);
103
103
  (0, react_1.useEffect)(() => {
104
104
  const gKey = keybindings.registerKeybinding({
105
- event: 'keypress',
106
- key: 'g',
105
+ event: 'keydown',
106
+ action: 'goToFrame',
107
107
  callback: () => {
108
108
  var _a;
109
109
  (_a = ref.current) === null || _a === void 0 ? void 0 : _a.click();
110
110
  },
111
- commandCtrlKey: false,
112
111
  preventDefault: true,
113
112
  triggerIfInputFieldFocused: false,
114
113
  keepRegisteredWhenNotHighestContext: false,
@@ -8,6 +8,7 @@ const client_id_1 = require("../../helpers/client-id");
8
8
  const sequence_node_path_mutations_1 = require("../../helpers/sequence-node-path-mutations");
9
9
  const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
10
10
  const sequence_props_subscription_store_1 = require("./sequence-props-subscription-store");
11
+ const TimelineSelection_1 = require("./TimelineSelection");
11
12
  const SequencePropsObserver = () => {
12
13
  const { subscribeToEvent } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
13
14
  const { remapPropStatuses, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
@@ -18,6 +19,7 @@ const SequencePropsObserver = () => {
18
19
  const { setOverrideIdToNodePath } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsSettersContext);
19
20
  const { fastRefreshes } = (0, react_1.useContext)(fast_refresh_context_1.FastRefreshContext);
20
21
  const { migrateExpandedTracksForSubscriptionKey } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
22
+ const { remapSelectionNodePaths } = (0, TimelineSelection_1.useTimelineSelection)();
21
23
  (0, react_1.useEffect)(() => {
22
24
  const handleEvent = (event) => {
23
25
  if (event.type !== 'sequence-props-updated') {
@@ -36,6 +38,7 @@ const SequencePropsObserver = () => {
36
38
  if (mutations.length === 0) {
37
39
  return;
38
40
  }
41
+ remapSelectionNodePaths(mutations);
39
42
  const statusRemappings = [];
40
43
  const overrideUpdates = [];
41
44
  const overrideIdsToRefresh = new Set();
@@ -127,6 +130,7 @@ const SequencePropsObserver = () => {
127
130
  fastRefreshes,
128
131
  migrateExpandedTracksForSubscriptionKey,
129
132
  propStatusesRef,
133
+ remapSelectionNodePaths,
130
134
  remapPropStatuses,
131
135
  setOverrideIdToNodePath,
132
136
  ]);
@@ -63,7 +63,6 @@ const should_subscribe_to_sequence_props_1 = require("./should-subscribe-to-sequ
63
63
  const SubscribeToNodePaths_1 = require("./SubscribeToNodePaths");
64
64
  const timeline_asset_drop_context_1 = require("./timeline-asset-drop-context");
65
65
  const timeline_refs_1 = require("./timeline-refs");
66
- const timeline_scroll_logic_1 = require("./timeline-scroll-logic");
67
66
  const TimelineDragHandler_1 = require("./TimelineDragHandler");
68
67
  const TimelineHeightContainer_1 = require("./TimelineHeightContainer");
69
68
  const TimelineInOutDragHandler_1 = require("./TimelineInOutDragHandler");
@@ -75,7 +74,7 @@ const TimelinePinchZoom_1 = require("./TimelinePinchZoom");
75
74
  const TimelinePlayCursorSyncer_1 = require("./TimelinePlayCursorSyncer");
76
75
  const TimelineScrollable_1 = require("./TimelineScrollable");
77
76
  const TimelineSelection_1 = require("./TimelineSelection");
78
- const TimelineSequenceItem_1 = require("./TimelineSequenceItem");
77
+ const TimelineSequenceRightEdgeDragHandle_1 = require("./TimelineSequenceRightEdgeDragHandle");
79
78
  const TimelineSlider_1 = require("./TimelineSlider");
80
79
  const TimelineTickFormatProvider_1 = require("./TimelineTickFormatProvider");
81
80
  const TimelineTimeIndicators_1 = require("./TimelineTimeIndicators");
@@ -99,7 +98,6 @@ const TimelineContextMenuArea = ({ children }) => {
99
98
  const assetDropFrame = (0, use_timeline_asset_drop_1.useTimelineAssetDrop)();
100
99
  const { compositions, canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
101
100
  const videoConfig = remotion_1.Internals.useUnsafeVideoConfig();
102
- const isStill = (0, is_current_selected_still_1.useIsStill)();
103
101
  const [isAddingSolid, setIsAddingSolid] = (0, react_1.useState)(false);
104
102
  const [isAddingAsset, setIsAddingAsset] = (0, react_1.useState)(false);
105
103
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
@@ -107,44 +105,6 @@ const TimelineContextMenuArea = ({ children }) => {
107
105
  const previewInteractive = previewConnected && (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
108
106
  const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
109
107
  const browserStudioCanInsertSolid = browserStudioOperations !== null;
110
- (0, react_1.useEffect)(() => {
111
- const verticalScroll = timeline_refs_1.timelineVerticalScroll.current;
112
- if (!verticalScroll) {
113
- return;
114
- }
115
- const autoScroll = (0, timeline_scroll_logic_1.startTimelineEdgeAutoScroll)({
116
- includeHorizontal: false,
117
- includeVertical: true,
118
- verticalTopOffset: isStill ? 0 : TimelineTimeIndicators_1.TIMELINE_TIME_INDICATOR_HEIGHT,
119
- onTick: (directions) => {
120
- if (directions.y === null) {
121
- return;
122
- }
123
- verticalScroll.scrollTop +=
124
- directions.y === 'up'
125
- ? -timeline_scroll_logic_1.EDGE_SCROLL_VERTICAL_INCREMENT
126
- : timeline_scroll_logic_1.EDGE_SCROLL_VERTICAL_INCREMENT;
127
- },
128
- });
129
- const onDragOver = (event) => {
130
- if (!event.dataTransfer ||
131
- !Array.from(event.dataTransfer.types).includes(TimelineSequenceItem_1.SEQUENCE_REORDER_MIME_TYPE)) {
132
- autoScroll.stop();
133
- return;
134
- }
135
- autoScroll.update(event);
136
- };
137
- const stopAutoScroll = () => autoScroll.stop();
138
- verticalScroll.addEventListener('dragover', onDragOver, true);
139
- document.addEventListener('dragend', stopAutoScroll, true);
140
- document.addEventListener('drop', stopAutoScroll, true);
141
- return () => {
142
- autoScroll.stop();
143
- verticalScroll.removeEventListener('dragover', onDragOver, true);
144
- document.removeEventListener('dragend', stopAutoScroll, true);
145
- document.removeEventListener('drop', stopAutoScroll, true);
146
- };
147
- }, [isStill]);
148
108
  const currentCompositionId = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? canvasContent.compositionId : null;
149
109
  const currentComposition = (0, react_1.useMemo)(() => {
150
110
  var _a;
@@ -413,6 +373,6 @@ const TimelineInner = () => {
413
373
  };
414
374
  const MemoizedTimelineInner = react_1.default.memo(TimelineInner);
415
375
  const Timeline = () => {
416
- return (jsx_runtime_1.jsx(TimelineTickFormatProvider_1.TimelineTickFormatProvider, { children: jsx_runtime_1.jsx(MemoizedTimelineInner, {}) }));
376
+ return (jsx_runtime_1.jsx(TimelineTickFormatProvider_1.TimelineTickFormatProvider, { children: jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceMediaDurationDragLimitsProvider, { children: jsx_runtime_1.jsx(MemoizedTimelineInner, {}) }) }));
417
377
  };
418
378
  exports.Timeline = Timeline;
@@ -367,7 +367,7 @@ const TimelineClipboardKeybindings = () => {
367
367
  const { clientId } = previewServerState;
368
368
  const copy = keybindings.registerKeybinding({
369
369
  event: 'keydown',
370
- key: 'c',
370
+ action: 'copyEffectsAndValues',
371
371
  callback: (e) => {
372
372
  var _a, _b;
373
373
  const { selectedItems } = currentSelection.current;
@@ -509,14 +509,13 @@ const TimelineClipboardKeybindings = () => {
509
509
  (0, NotificationCenter_1.showNotification)(`Could not copy effects: ${err.message}`, 2000);
510
510
  });
511
511
  },
512
- commandCtrlKey: true,
513
512
  preventDefault: false,
514
513
  triggerIfInputFieldFocused: false,
515
514
  keepRegisteredWhenNotHighestContext: false,
516
515
  });
517
516
  const cut = keybindings.registerKeybinding({
518
517
  event: 'keydown',
519
- key: 'x',
518
+ action: 'cutEffects',
520
519
  callback: (e) => {
521
520
  const { selectedItems, clearSelection, selectItems } = currentSelection.current;
522
521
  if (selectedItems.length === 0) {
@@ -575,7 +574,6 @@ const TimelineClipboardKeybindings = () => {
575
574
  (0, NotificationCenter_1.showNotification)(`Could not cut effects: ${err.message}`, 2000);
576
575
  });
577
576
  },
578
- commandCtrlKey: true,
579
577
  preventDefault: false,
580
578
  triggerIfInputFieldFocused: false,
581
579
  keepRegisteredWhenNotHighestContext: false,
@@ -25,31 +25,18 @@ const TimelineDeleteKeybindings = () => {
25
25
  if (!canSelect || previewServerState.type !== 'connected') {
26
26
  return;
27
27
  }
28
- const backspace = keybindings.registerKeybinding({
29
- event: 'keydown',
30
- key: 'Backspace',
31
- callback: () => deleteTimelineItems(null),
32
- commandCtrlKey: false,
33
- preventDefault: true,
34
- triggerIfInputFieldFocused: false,
35
- keepRegisteredWhenNotHighestContext: false,
36
- });
37
28
  const deleteKey = keybindings.registerKeybinding({
38
29
  event: 'keydown',
39
- key: 'Delete',
30
+ action: 'deleteSelection',
40
31
  callback: () => deleteTimelineItems(null),
41
- commandCtrlKey: false,
42
32
  preventDefault: true,
43
33
  triggerIfInputFieldFocused: false,
44
34
  keepRegisteredWhenNotHighestContext: false,
45
35
  });
46
36
  const duplicate = keybindings.registerKeybinding({
47
37
  event: 'keydown',
48
- key: 'd',
49
- callback: (event) => {
50
- if (!(0, split_selected_timeline_item_1.shouldHandleTimelineDuplicateShortcut)(event)) {
51
- return;
52
- }
38
+ action: 'duplicateSequences',
39
+ callback: () => {
53
40
  const { selectedItems } = currentSelection.current;
54
41
  if (selectedItems.length === 0) {
55
42
  return;
@@ -63,7 +50,6 @@ const TimelineDeleteKeybindings = () => {
63
50
  }
64
51
  duplicatePromise.catch(() => undefined);
65
52
  },
66
- commandCtrlKey: true,
67
53
  preventDefault: true,
68
54
  triggerIfInputFieldFocused: false,
69
55
  keepRegisteredWhenNotHighestContext: false,
@@ -97,7 +83,6 @@ const TimelineDeleteKeybindings = () => {
97
83
  keepRegisteredWhenNotHighestContext: false,
98
84
  });
99
85
  return () => {
100
- backspace.unregister();
101
86
  deleteKey.unregister();
102
87
  duplicate.unregister();
103
88
  split.unregister();
@@ -115,7 +115,7 @@ const TimelineDragHandler = () => {
115
115
  };
116
116
  exports.TimelineDragHandler = TimelineDragHandler;
117
117
  const TimelineDragHandlerInner = () => {
118
- var _a;
118
+ var _a, _b;
119
119
  const videoConfig = (0, remotion_1.useVideoConfig)();
120
120
  const size = player_1.PlayerInternals.useElementSize(timeline_refs_1.scrollableRef, {
121
121
  triggerOnWindowResize: true,
@@ -320,6 +320,6 @@ const TimelineDragHandlerInner = () => {
320
320
  current.removeEventListener('scroll', onScroll);
321
321
  };
322
322
  }, []);
323
- return (jsx_runtime_1.jsx("div", { ref: ref, style: style, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx("div", { style: inner, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME }) }));
323
+ return (jsx_runtime_1.jsx("div", { ref: ref, style: { ...style, minWidth: (_b = size === null || size === void 0 ? void 0 : size.width) !== null && _b !== void 0 ? _b : 0 }, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx("div", { style: inner, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME }) }));
324
324
  };
325
325
  const TimelineDragHandlerInnerMemo = react_1.default.memo(TimelineDragHandlerInner);
@@ -47,6 +47,7 @@ const rowClipper = {
47
47
  boxSizing: 'border-box',
48
48
  marginLeft: -timeline_layout_1.TIMELINE_PADDING,
49
49
  marginRight: -timeline_layout_1.TIMELINE_PADDING,
50
+ minWidth: `calc(100% + ${timeline_layout_1.TIMELINE_PADDING * 2}px)`,
50
51
  overflow: 'hidden',
51
52
  paddingLeft: timeline_layout_1.TIMELINE_PADDING,
52
53
  paddingRight: timeline_layout_1.TIMELINE_PADDING,
@@ -37,6 +37,7 @@ exports.TimelineRowChrome = exports.TimelineRowKeyframeControlsColumn = exports.
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const colors_1 = require("../../helpers/colors");
40
+ const drag_aware_double_click_1 = require("../../helpers/drag-aware-double-click");
40
41
  const Padder_1 = require("./Padder");
41
42
  const timeline_row_layout_1 = require("./timeline-row-layout");
42
43
  const TimelineRowLayoutContext_1 = require("./TimelineRowLayoutContext");
@@ -72,6 +73,7 @@ exports.TimelineRowKeyframeControlsColumn = TimelineRowKeyframeControlsColumn;
72
73
  const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, style, selected, selectable, onSelect, showSelectedBackground, containsSelection, hovered = false, outerHeight, onDragLeave, onDragOver, onDrop, onDoubleClick, onPointerEnter, onPointerLeave, }) => {
73
74
  const { basePadding, rowBorderRadius, rowHorizontalMargin } = (0, react_1.useContext)(TimelineRowLayoutContext_1.TimelineRowLayoutContext);
74
75
  const selectedBackground = (0, react_1.useContext)(exports.TimelineRowSelectedBackgroundContext);
76
+ const doubleClickTracker = (0, react_1.useMemo)(() => (0, drag_aware_double_click_1.createDragAwareDoubleClickTracker)(), []);
75
77
  const indentWidth = (0, timeline_row_layout_1.getTimelineRowIndentWidth)(depth);
76
78
  const chromeColumnStyle = (0, react_1.useMemo)(() => ({
77
79
  alignItems: 'center',
@@ -95,7 +97,7 @@ const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, styl
95
97
  onSelect();
96
98
  }
97
99
  }, [onSelect, selected]);
98
- const onDoubleClickIfNotInteractive = (0, react_1.useCallback)((e) => {
100
+ const performDoubleClickIfNotInteractive = (0, react_1.useCallback)((e) => {
99
101
  const { target } = e;
100
102
  if (target instanceof Element &&
101
103
  e.currentTarget.contains(target.closest('button, input, select, textarea, a, [contenteditable="true"]'))) {
@@ -104,6 +106,12 @@ const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, styl
104
106
  }
105
107
  onDoubleClick === null || onDoubleClick === void 0 ? void 0 : onDoubleClick(e);
106
108
  }, [onDoubleClick]);
109
+ const onClick = (0, react_1.useCallback)((e) => {
110
+ if (!doubleClickTracker.acceptClickAsDoubleClick(e)) {
111
+ return;
112
+ }
113
+ performDoubleClickIfNotInteractive(e);
114
+ }, [doubleClickTracker, performDoubleClickIfNotInteractive]);
107
115
  const highlightBackground = (0, TimelineSelection_1.getTimelineRowHighlightBackground)({
108
116
  showSelectedBackground,
109
117
  selected,
@@ -139,8 +147,8 @@ const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, styl
139
147
  }, [outerHeight, highlightBackground]);
140
148
  const chrome = (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [keyframeControls ? (jsx_runtime_1.jsx(exports.TimelineRowKeyframeControlsColumn, { depth: depth, children: keyframeControls })) : (jsx_runtime_1.jsx("div", { style: leftChromeStyle, children: jsx_runtime_1.jsxs("div", { style: chromeColumnStyle, children: [eye, indentWidth > 0 ? jsx_runtime_1.jsx(Padder_1.Padder, { depth: depth }) : null, arrow] }) })), children] }));
141
149
  if (outerStyle) {
142
- return (jsx_runtime_1.jsx("div", { style: outerStyle, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClickIfNotInteractive, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsx("div", { style: innerRowStyle, children: chrome }) }));
150
+ return (jsx_runtime_1.jsx("div", { style: outerStyle, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDownCapture: doubleClickTracker.beginPointerGesture, onPointerDown: selectable ? onPointerDown : undefined, onClick: onClick, onContextMenu: selectable ? onContextMenu : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsx("div", { style: innerRowStyle, children: chrome }) }));
143
151
  }
144
- return (jsx_runtime_1.jsx("div", { onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClickIfNotInteractive, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, style: innerRowStyle, children: chrome }));
152
+ return (jsx_runtime_1.jsx("div", { onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDownCapture: doubleClickTracker.beginPointerGesture, onPointerDown: selectable ? onPointerDown : undefined, onClick: onClick, onContextMenu: selectable ? onContextMenu : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, style: innerRowStyle, children: chrome }));
145
153
  };
146
154
  exports.TimelineRowChrome = TimelineRowChrome;
@@ -52,8 +52,10 @@ const unsupportedStatusWrapper = {
52
52
  };
53
53
  const unsupportedLabel = {
54
54
  color: colors_1.WHITE_ALPHA_40,
55
+ fontFamily: 'Arial, Helvetica, sans-serif',
55
56
  fontSize: 12,
56
57
  fontStyle: 'italic',
58
+ lineHeight: '18px',
57
59
  };
58
60
  const computedValue = {
59
61
  color: colors_1.WHITE_ALPHA_40,
@@ -119,10 +121,12 @@ const TimelineNonEditableStatus = ({ propStatus, field, runtimeValue, validatedL
119
121
  });
120
122
  }, [field.key, remotionSkillsInfo, setSelectedModal, validatedLocation]);
121
123
  if (propStatus.status === 'computed') {
122
- return (jsx_runtime_1.jsx(exports.UnsupportedStatus, { label: (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
123
- fieldSchema: field.fieldSchema,
124
- value: runtimeValue,
125
- }), onFix: onFix, formattedValue: true }));
124
+ return (jsx_runtime_1.jsx(exports.UnsupportedStatus, { label: runtimeValue === undefined
125
+ ? 'computed'
126
+ : (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
127
+ fieldSchema: field.fieldSchema,
128
+ value: runtimeValue,
129
+ }), onFix: onFix, formattedValue: runtimeValue !== undefined }));
126
130
  }
127
131
  };
128
132
  exports.TimelineNonEditableStatus = TimelineNonEditableStatus;