@remotion/studio 4.0.521 → 4.0.523

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/dist/api/install-package.js +4 -2
  2. package/dist/components/AssetAudioVolume.d.ts +5 -0
  3. package/dist/components/AssetAudioVolume.js +33 -0
  4. package/dist/components/Canvas.js +5 -6
  5. package/dist/components/CanvasIfSizeIsAvailable.js +7 -0
  6. package/dist/components/CaptionInspector.js +74 -20
  7. package/dist/components/CheckboardToggle.js +8 -6
  8. package/dist/components/Checkbox.d.ts +1 -0
  9. package/dist/components/Checkbox.js +2 -2
  10. package/dist/components/CompositionContextButton.js +4 -1
  11. package/dist/components/CompositionSelectorItem.js +2 -2
  12. package/dist/components/ConfigureLicenseModal.js +1 -1
  13. package/dist/components/CopyButton.js +7 -14
  14. package/dist/components/CurrentAsset.js +40 -6
  15. package/dist/components/Editor.js +6 -5
  16. package/dist/components/EditorContent.js +1 -1
  17. package/dist/components/EditorContexts.js +3 -1
  18. package/dist/components/ElementInstallConfirmation.js +290 -136
  19. package/dist/components/FixComputedValueModal.js +56 -16
  20. package/dist/components/FullscreenToggle.js +9 -8
  21. package/dist/components/GlobalKeybindings.js +50 -49
  22. package/dist/components/HighlightedElementSource.d.ts +5 -0
  23. package/dist/components/HighlightedElementSource.js +78 -0
  24. package/dist/components/InspectorLocationCopy.js +10 -5
  25. package/dist/components/InspectorPanel/MultiSequenceField.d.ts +12 -0
  26. package/dist/components/InspectorPanel/MultiSequenceField.js +131 -0
  27. package/dist/components/InspectorPanel/MultiSequenceInspector.d.ts +8 -0
  28. package/dist/components/InspectorPanel/MultiSequenceInspector.js +102 -0
  29. package/dist/components/InspectorPanel/MultiSequenceNumberField.d.ts +9 -0
  30. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +88 -0
  31. package/dist/components/InspectorPanel.js +4 -0
  32. package/dist/components/InspectorSequenceSection.js +64 -1
  33. package/dist/components/InstallPackage.js +4 -5
  34. package/dist/components/KeyboardShortcutsSettings.js +212 -33
  35. package/dist/components/MenuBuildIndicator.js +7 -2
  36. package/dist/components/MenuCompositionName.js +62 -6
  37. package/dist/components/MenuToolbar.js +7 -5
  38. package/dist/components/ModalContainer.d.ts +1 -0
  39. package/dist/components/ModalContainer.js +2 -2
  40. package/dist/components/Modals.js +3 -1
  41. package/dist/components/ModelManager.d.ts +16 -0
  42. package/dist/components/ModelManager.js +200 -0
  43. package/dist/components/ModelsSettings.d.ts +2 -0
  44. package/dist/components/ModelsSettings.js +133 -0
  45. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  46. package/dist/components/NewComposition/DismissableModal.js +2 -2
  47. package/dist/components/NewComposition/InputDragger.d.ts +2 -2
  48. package/dist/components/NewComposition/InputDragger.js +6 -6
  49. package/dist/components/NewComposition/NewFolder.js +11 -8
  50. package/dist/components/NewComposition/RenameFolder.js +17 -10
  51. package/dist/components/OptionalPackageModal.d.ts +11 -0
  52. package/dist/components/OptionalPackageModal.js +155 -0
  53. package/dist/components/PlayPause.js +4 -8
  54. package/dist/components/PlaybackKeyboardShortcutsManager.js +3 -6
  55. package/dist/components/PreviewToolbarOverflowButton.js +11 -2
  56. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +5 -2
  57. package/dist/components/RadioButton.d.ts +1 -0
  58. package/dist/components/RadioButton.js +2 -2
  59. package/dist/components/RenderButton.js +5 -1
  60. package/dist/components/RenderModal/CliCopyButton.js +13 -27
  61. package/dist/components/RenderModal/NumberSetting.d.ts +6 -1
  62. package/dist/components/RenderModal/NumberSetting.js +2 -2
  63. package/dist/components/RenderModal/RenderModalBasic.js +1 -1
  64. package/dist/components/RenderModal/RenderModalOutputName.d.ts +3 -1
  65. package/dist/components/RenderModal/RenderModalOutputName.js +4 -4
  66. package/dist/components/RenderModal/SeparateAudioOption.js +1 -1
  67. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  68. package/dist/components/RenderQueue/CaptionQueueItem.d.ts +6 -0
  69. package/dist/components/RenderQueue/CaptionQueueItem.js +129 -0
  70. package/dist/components/RenderQueue/CaptionQueueProcessor.d.ts +1 -0
  71. package/dist/components/RenderQueue/CaptionQueueProcessor.js +110 -0
  72. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.d.ts +2 -0
  73. package/dist/components/RenderQueue/CaptionQueueProcessorLoader.js +54 -0
  74. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +7 -4
  75. package/dist/components/RenderQueue/RenderQueueItem.js +3 -3
  76. package/dist/components/RenderQueue/VideoMattingQueueItem.d.ts +6 -0
  77. package/dist/components/RenderQueue/VideoMattingQueueItem.js +129 -0
  78. package/dist/components/RenderQueue/VideoMattingQueueProcessor.d.ts +1 -0
  79. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +105 -0
  80. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.d.ts +2 -0
  81. package/dist/components/RenderQueue/VideoMattingQueueProcessorLoader.js +54 -0
  82. package/dist/components/RenderQueue/caption-job-types.d.ts +47 -0
  83. package/dist/components/RenderQueue/caption-job-types.js +7 -0
  84. package/dist/components/RenderQueue/context.d.ts +16 -0
  85. package/dist/components/RenderQueue/context.js +224 -11
  86. package/dist/components/RenderQueue/index.js +34 -10
  87. package/dist/components/RenderQueue/item-style.d.ts +1 -0
  88. package/dist/components/RenderQueue/item-style.js +2 -1
  89. package/dist/components/RenderQueue/load-model-for-job.d.ts +11 -0
  90. package/dist/components/RenderQueue/load-model-for-job.js +14 -0
  91. package/dist/components/RenderQueue/video-matting-job-types.d.ts +38 -0
  92. package/dist/components/RenderQueue/video-matting-job-types.js +5 -0
  93. package/dist/components/RendersTab.js +4 -4
  94. package/dist/components/SegmentedControl.d.ts +2 -2
  95. package/dist/components/SegmentedControl.js +38 -13
  96. package/dist/components/SelectedOutlinePolygon.js +8 -2
  97. package/dist/components/SettingsButton.d.ts +4 -0
  98. package/dist/components/SettingsButton.js +49 -0
  99. package/dist/components/SettingsModal.d.ts +1 -1
  100. package/dist/components/SettingsModal.js +3 -1
  101. package/dist/components/ShowOutlinesProvider.js +12 -0
  102. package/dist/components/SidebarCollapserControls.js +21 -16
  103. package/dist/components/SizeSelector.js +10 -2
  104. package/dist/components/SkillsSettings.js +11 -8
  105. package/dist/components/SnappingToggle.js +5 -2
  106. package/dist/components/Splitter/SplitterContainer.js +63 -10
  107. package/dist/components/Splitter/SplitterContext.d.ts +3 -0
  108. package/dist/components/Splitter/SplitterContext.js +5 -1
  109. package/dist/components/Splitter/SplitterElement.js +11 -2
  110. package/dist/components/Splitter/SplitterHandle.d.ts +1 -0
  111. package/dist/components/Splitter/SplitterHandle.js +55 -25
  112. package/dist/components/Tabs/vertical.d.ts +1 -0
  113. package/dist/components/Tabs/vertical.js +2 -2
  114. package/dist/components/TimeValue.js +2 -3
  115. package/dist/components/Timeline/SequencePropsObserver.js +4 -0
  116. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -1
  117. package/dist/components/Timeline/SubscribeToNodePaths.js +2 -1
  118. package/dist/components/Timeline/Timeline.js +17 -46
  119. package/dist/components/Timeline/TimelineClipboardKeybindings.js +2 -4
  120. package/dist/components/Timeline/TimelineDeleteKeybindings.js +3 -18
  121. package/dist/components/Timeline/TimelineDragHandler.js +11 -6
  122. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  123. package/dist/components/Timeline/TimelinePinchZoom.js +6 -30
  124. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +1 -7
  125. package/dist/components/Timeline/TimelineRowChrome.js +11 -3
  126. package/dist/components/Timeline/TimelineSchemaField.js +8 -4
  127. package/dist/components/Timeline/TimelineSelection.d.ts +2 -0
  128. package/dist/components/Timeline/TimelineSelection.js +55 -2
  129. package/dist/components/Timeline/TimelineSequence.js +148 -25
  130. package/dist/components/Timeline/TimelineSequenceItem.d.ts +0 -1
  131. package/dist/components/Timeline/TimelineSequenceItem.js +220 -112
  132. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +35 -5
  133. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +233 -138
  134. package/dist/components/Timeline/TimelineSlider.js +1 -4
  135. package/dist/components/Timeline/TimelineTimeIndicators.js +1 -0
  136. package/dist/components/Timeline/TimelineWidthProvider.js +2 -5
  137. package/dist/components/Timeline/TimelineZoomControls.js +20 -20
  138. package/dist/components/Timeline/get-sequence-split-menu-item.d.ts +11 -0
  139. package/dist/components/Timeline/get-sequence-split-menu-item.js +55 -0
  140. package/dist/components/Timeline/use-asset-timeline-context-menu.d.ts +2 -0
  141. package/dist/components/Timeline/use-asset-timeline-context-menu.js +52 -0
  142. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -2
  143. package/dist/components/Timeline/use-sequence-props-subscription.js +4 -10
  144. package/dist/components/TimelineInOutToggle.js +20 -17
  145. package/dist/components/TopPanel.js +3 -19
  146. package/dist/components/Transcription/LazyModels.d.ts +1 -0
  147. package/dist/components/Transcription/LazyModels.js +5 -0
  148. package/dist/components/Transcription/Models.d.ts +6 -0
  149. package/dist/components/Transcription/Models.js +18 -0
  150. package/dist/components/Transcription/TranscriptionModal.d.ts +3 -0
  151. package/dist/components/Transcription/TranscriptionModal.js +428 -0
  152. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.d.ts +5 -0
  153. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +48 -0
  154. package/dist/components/Transcription/caption-output-name.d.ts +2 -0
  155. package/dist/components/Transcription/caption-output-name.js +10 -0
  156. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +6 -0
  157. package/dist/components/Transcription/resample-media-to-16-khz.js +82 -0
  158. package/dist/components/Transcription/whisper-languages.d.ts +2 -0
  159. package/dist/components/Transcription/whisper-languages.js +104 -0
  160. package/dist/components/Transcription/whisper-webgpu-capability.d.ts +2 -0
  161. package/dist/components/Transcription/whisper-webgpu-capability.js +7 -0
  162. package/dist/components/UndoRedoButtons.js +13 -38
  163. package/dist/components/UpdatesSettings.js +17 -17
  164. package/dist/components/VideoMatting/LazyModels.d.ts +1 -0
  165. package/dist/components/VideoMatting/LazyModels.js +5 -0
  166. package/dist/components/VideoMatting/Models.d.ts +6 -0
  167. package/dist/components/VideoMatting/Models.js +18 -0
  168. package/dist/components/VideoMatting/VideoMattingModal.d.ts +3 -0
  169. package/dist/components/VideoMatting/VideoMattingModal.js +207 -0
  170. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.d.ts +5 -0
  171. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +46 -0
  172. package/dist/components/VideoMatting/video-matting-capability.d.ts +2 -0
  173. package/dist/components/VideoMatting/video-matting-capability.js +7 -0
  174. package/dist/components/WebMcp.js +439 -22
  175. package/dist/components/ZoomPersistor.js +6 -3
  176. package/dist/components/composition-menu-items.js +1 -1
  177. package/dist/components/import-assets.d.ts +3 -2
  178. package/dist/components/import-assets.js +5 -9
  179. package/dist/components/keyboard-shortcuts.d.ts +17 -1
  180. package/dist/components/keyboard-shortcuts.js +177 -89
  181. package/dist/components/public-output-name.d.ts +5 -0
  182. package/dist/components/public-output-name.js +60 -0
  183. package/dist/components/use-model-cache-status.d.ts +7 -0
  184. package/dist/components/use-model-cache-status.js +35 -0
  185. package/dist/esm/CaptionQueueProcessor-k0yrm3dj.mjs +211 -0
  186. package/dist/esm/HighlightedElementSource-jfc66k4p.mjs +1236 -0
  187. package/dist/esm/LazyModels-2trdm224.mjs +11 -0
  188. package/dist/esm/LazyModels-fjb5ckaq.mjs +11 -0
  189. package/dist/esm/TranscriptionModal-916jqhry.mjs +1011 -0
  190. package/dist/esm/VideoMattingModal-2tm79s9b.mjs +374 -0
  191. package/dist/esm/VideoMattingQueueProcessor-t1hgm2rm.mjs +109 -0
  192. package/dist/esm/index-1x7bsdh6.mjs +261 -0
  193. package/dist/esm/index-3hgr6gjx.mjs +41 -0
  194. package/dist/esm/index-5qddp5h7.mjs +36 -0
  195. package/dist/esm/index-5zrb1ft4.mjs +39 -0
  196. package/dist/esm/index-6cvm9a65.mjs +45923 -0
  197. package/dist/esm/index-7tt71e8n.mjs +36 -0
  198. package/dist/esm/index-9x6e1dq0.mjs +428 -0
  199. package/dist/esm/index-cw0pnpg5.mjs +50 -0
  200. package/dist/esm/index-czwvnn9g.mjs +35 -0
  201. package/dist/esm/index-hy4xcgty.mjs +1366 -0
  202. package/dist/esm/{chunk-je0h1bgt.js → index-jg13hf2g.mjs} +3 -1
  203. package/dist/esm/{chunk-6jf1natv.js → index-rcv7qkt5.mjs} +18 -1
  204. package/dist/esm/index-sgtmgc4h.mjs +423 -0
  205. package/dist/esm/index-te66vvrp.mjs +142 -0
  206. package/dist/esm/index-v4tr1bft.mjs +20 -0
  207. package/dist/esm/index-x7t2y7ws.mjs +54194 -0
  208. package/dist/esm/index-xhe2m2qr.mjs +1146 -0
  209. package/dist/esm/index.mjs +45 -933
  210. package/dist/esm/internals.mjs +13 -114127
  211. package/dist/esm/previewEntry.mjs +387 -114784
  212. package/dist/esm/renderEntry.mjs +3 -3
  213. package/dist/esm/{chunk-m0jqdbkr.js → resolve-composition-component-location-14148845.mjs} +1 -1
  214. package/dist/helpers/copy-text.js +1 -2
  215. package/dist/helpers/drag-aware-double-click.d.ts +2 -1
  216. package/dist/helpers/drag-aware-double-click.js +12 -1
  217. package/dist/helpers/get-asset-metadata.d.ts +1 -0
  218. package/dist/helpers/get-asset-metadata.js +4 -0
  219. package/dist/helpers/hoverable.js +8 -0
  220. package/dist/helpers/inject-css.js +2 -0
  221. package/dist/helpers/optional-package-dependencies.d.ts +3 -0
  222. package/dist/helpers/optional-package-dependencies.js +24 -0
  223. package/dist/helpers/pointer-session.d.ts +6 -0
  224. package/dist/helpers/pointer-session.js +36 -14
  225. package/dist/helpers/prism-tomorrow.d.ts +1 -0
  226. package/dist/helpers/prism-tomorrow.js +151 -0
  227. package/dist/helpers/sequence-node-path-mutations.js +11 -0
  228. package/dist/helpers/slugify-name.d.ts +1 -0
  229. package/dist/helpers/slugify-name.js +14 -0
  230. package/dist/helpers/studio-runtime-config.d.ts +1 -0
  231. package/dist/helpers/studio-runtime-config.js +6 -1
  232. package/dist/helpers/use-copy-feedback.d.ts +4 -0
  233. package/dist/helpers/use-copy-feedback.js +19 -0
  234. package/dist/helpers/use-keybinding.d.ts +9 -3
  235. package/dist/helpers/use-keybinding.js +8 -9
  236. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -0
  237. package/dist/helpers/use-keyboard-shortcut-label.js +15 -0
  238. package/dist/helpers/use-menu-structure.js +58 -13
  239. package/dist/icons/copy.d.ts +5 -0
  240. package/dist/icons/copy.js +12 -0
  241. package/dist/icons/input-props.d.ts +1 -1
  242. package/dist/icons/input-props.js +2 -2
  243. package/dist/icons/models.d.ts +4 -0
  244. package/dist/icons/models.js +7 -0
  245. package/dist/icons/separation.d.ts +4 -0
  246. package/dist/icons/separation.js +7 -0
  247. package/dist/icons/transcription.d.ts +4 -0
  248. package/dist/icons/transcription.js +7 -0
  249. package/dist/icons/upload.js +1 -1
  250. package/dist/state/canvas-ref.d.ts +1 -0
  251. package/dist/state/canvas-ref.js +2 -1
  252. package/dist/state/modals.d.ts +14 -2
  253. package/dist/state/sidebar.d.ts +3 -0
  254. package/dist/state/sidebar.js +6 -1
  255. package/dist/state/timeline-zoom.d.ts +1 -1
  256. package/dist/state/timeline-zoom.js +3 -3
  257. package/dist/visual-controls/VisualControls.js +4 -0
  258. package/package.json +34 -20
  259. package/dist/components/UpdateCheck.d.ts +0 -1
  260. package/dist/components/UpdateCheck.js +0 -79
  261. package/dist/esm/chunk-emw4k5b0.js +0 -99527
  262. package/dist/esm/chunk-vkrvnx2h.js +0 -99378
  263. package/dist/helpers/use-max-media-duration.d.ts +0 -2
  264. package/dist/helpers/use-max-media-duration.js +0 -61
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SplitterContext = exports.getClampedSplitterFlex = exports.getSplitterFlexBounds = void 0;
6
+ exports.SplitterLayoutContext = exports.SplitterContext = exports.getClampedSplitterFlex = exports.getSplitterFlexBounds = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const getSplitterFlexBounds = ({ availableSize, maxAntiFlexerSize, maxFlex, maxFlexerSize, minAntiFlexerSize, minFlex, minFlexerSize, }) => {
9
9
  if (availableSize === null || availableSize <= 0) {
@@ -21,6 +21,8 @@ const getClampedSplitterFlex = ({ flexValue, ...bounds }) => {
21
21
  exports.getClampedSplitterFlex = getClampedSplitterFlex;
22
22
  exports.SplitterContext = react_1.default.createContext({
23
23
  flexValue: 1,
24
+ collapsedDuringDrag: null,
25
+ setCollapsedDuringDrag: () => undefined,
24
26
  ref: { current: null },
25
27
  setFlexValue: () => undefined,
26
28
  isDragging: { current: false },
@@ -35,3 +37,5 @@ exports.SplitterContext = react_1.default.createContext({
35
37
  id: '--',
36
38
  persistFlex: () => undefined,
37
39
  });
40
+ // Propagate layout changes only through the affected splitter subtree.
41
+ exports.SplitterLayoutContext = react_1.default.createContext(null);
@@ -15,7 +15,9 @@ const SplitterElement = ({ children, type, sticky }) => {
15
15
  flex:
16
16
  // Multiply by 1000 because if flex values don't add up to at least 1, they will not fill up the screen
17
17
  (type === 'flexer' ? context.flexValue : 1 - context.flexValue) * 1000,
18
- display: 'flex',
18
+ display: context.collapsedDuringDrag === (type === 'flexer' ? 'left' : 'right')
19
+ ? 'none'
20
+ : 'flex',
19
21
  position: 'relative',
20
22
  overflow: 'hidden',
21
23
  flexDirection: 'column',
@@ -28,7 +30,14 @@ const SplitterElement = ({ children, type, sticky }) => {
28
30
  ? (minSize !== null && minSize !== void 0 ? minSize : undefined)
29
31
  : undefined,
30
32
  };
31
- }, [context.flexValue, context.orientation, maxSize, minSize, type]);
33
+ }, [
34
+ context.collapsedDuringDrag,
35
+ context.flexValue,
36
+ context.orientation,
37
+ maxSize,
38
+ minSize,
39
+ type,
40
+ ]);
32
41
  const stickStyle = (0, react_1.useMemo)(() => {
33
42
  return {
34
43
  position: 'absolute',
@@ -3,4 +3,5 @@ export declare const SPLITTER_HANDLE_SIZE = 3;
3
3
  export declare const SplitterHandle: React.FC<{
4
4
  readonly allowToCollapse: 'right' | 'left' | 'none';
5
5
  readonly onCollapse: () => void;
6
+ readonly onCollapseDuringDrag: ((side: 'left' | 'right' | null) => void) | null;
6
7
  }>;
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SplitterHandle = exports.SPLITTER_HANDLE_SIZE = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const player_1 = require("@remotion/player");
6
5
  const react_1 = require("react");
7
6
  const pointer_session_1 = require("../../helpers/pointer-session");
8
7
  const ForceSpecificCursor_1 = require("../ForceSpecificCursor");
@@ -11,10 +10,14 @@ exports.SPLITTER_HANDLE_SIZE = 3;
11
10
  const containerRow = {
12
11
  height: exports.SPLITTER_HANDLE_SIZE,
13
12
  };
13
+ const collapsedContainer = {
14
+ width: 0,
15
+ height: 0,
16
+ };
14
17
  const containerColumn = {
15
18
  width: exports.SPLITTER_HANDLE_SIZE,
16
19
  };
17
- const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
20
+ const SplitterHandle = ({ allowToCollapse, onCollapse, onCollapseDuringDrag }) => {
18
21
  const context = (0, react_1.useContext)(SplitterContext_1.SplitterContext);
19
22
  if (!context) {
20
23
  throw new Error('Cannot find splitter context');
@@ -22,8 +25,13 @@ const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
22
25
  const ref = (0, react_1.useRef)(null);
23
26
  // Keep the latest props/context readable inside the long-lived pointerdown
24
27
  // listener without re-subscribing it on every render.
25
- const latest = (0, react_1.useRef)({ context, allowToCollapse, onCollapse });
26
- latest.current = { context, allowToCollapse, onCollapse };
28
+ const latest = (0, react_1.useRef)({
29
+ context,
30
+ allowToCollapse,
31
+ onCollapse,
32
+ onCollapseDuringDrag,
33
+ });
34
+ latest.current = { context, allowToCollapse, onCollapse, onCollapseDuringDrag };
27
35
  (0, react_1.useEffect)(() => {
28
36
  const { current } = ref;
29
37
  if (!current) {
@@ -75,41 +83,59 @@ const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
75
83
  }
76
84
  return newFlex;
77
85
  };
86
+ const getCollapsedSide = (ev) => {
87
+ const collapse = latest.current.allowToCollapse;
88
+ const unclamped = getNewValue(ev, false);
89
+ if (collapse === 'left' && unclamped < dragContext.minFlex / 2) {
90
+ return 'left';
91
+ }
92
+ if (collapse === 'right' &&
93
+ 1 - unclamped < (1 - dragContext.maxFlex) / 2) {
94
+ return 'right';
95
+ }
96
+ return null;
97
+ };
98
+ let lastFlex = startFlex;
99
+ let lastCollapsedSide = null;
78
100
  const onPointerMove = (ev) => {
101
+ var _a, _b;
79
102
  if (!dragContext.isDragging.current) {
80
103
  return;
81
104
  }
82
- dragContext.setFlexValue(getNewValue(ev, true));
83
- const collapse = latest.current.allowToCollapse;
84
- if (collapse === 'left') {
85
- const unclamped = getNewValue(ev, false);
86
- if (unclamped < dragContext.minFlex / 2) {
87
- endDrag === null || endDrag === void 0 ? void 0 : endDrag();
88
- latest.current.onCollapse();
89
- }
90
- }
91
- else if (collapse === 'right') {
92
- const unclamped = 1 - getNewValue(ev, false);
93
- if (unclamped < (1 - dragContext.maxFlex) / 2) {
94
- endDrag === null || endDrag === void 0 ? void 0 : endDrag();
95
- latest.current.onCollapse();
96
- }
97
- }
105
+ // Keep the handle mounted and captured until release, even while
106
+ // the panel is hidden, so moving inward can restore it.
107
+ lastCollapsedSide = getCollapsedSide(ev);
108
+ lastFlex = getNewValue(ev, true);
109
+ (_b = (_a = latest.current).onCollapseDuringDrag) === null || _b === void 0 ? void 0 : _b.call(_a, lastCollapsedSide);
110
+ dragContext.setCollapsedDuringDrag(lastCollapsedSide);
111
+ dragContext.setFlexValue(lastFlex);
98
112
  };
99
113
  endDrag = (0, pointer_session_1.startCapturedPointerSession)({
100
114
  event: e,
101
115
  captureTarget: current,
102
116
  onMove: onPointerMove,
103
117
  onEnd: (reason, endEvent) => {
118
+ var _a, _b;
104
119
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
105
- endEvent &&
106
- dragContext.isDragging.current) {
107
- dragContext.persistFlex(getNewValue(endEvent, true));
120
+ endEvent) {
121
+ lastFlex = getNewValue(endEvent, true);
122
+ lastCollapsedSide = getCollapsedSide(endEvent);
123
+ }
124
+ // Capture loss and cancellation may have no usable coordinates.
125
+ // Commit the last displayed state instead of resetting the panel.
126
+ if (reason !== 'manual' && dragContext.isDragging.current) {
127
+ const savedFlex = lastCollapsedSide === null ? lastFlex : startFlex;
128
+ dragContext.setFlexValue(savedFlex);
129
+ dragContext.persistFlex(savedFlex);
130
+ if (lastCollapsedSide !== null) {
131
+ latest.current.onCollapse();
132
+ }
108
133
  }
134
+ (_b = (_a = latest.current).onCollapseDuringDrag) === null || _b === void 0 ? void 0 : _b.call(_a, null);
135
+ dragContext.setCollapsedDuringDrag(null);
109
136
  dragContext.isDragging.current = false;
110
137
  (0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
111
138
  endDrag = null;
112
- player_1.PlayerInternals.updateAllElementsSizes();
113
139
  },
114
140
  });
115
141
  };
@@ -124,6 +150,10 @@ const SplitterHandle = ({ allowToCollapse, onCollapse }) => {
124
150
  context.orientation === 'horizontal'
125
151
  ? 'remotion-splitter-horizontal'
126
152
  : 'remotion-splitter-vertical',
127
- ].join(' '), style: context.orientation === 'horizontal' ? containerRow : containerColumn }));
153
+ ].join(' '), style: context.collapsedDuringDrag !== null
154
+ ? collapsedContainer
155
+ : context.orientation === 'horizontal'
156
+ ? containerRow
157
+ : containerColumn }));
128
158
  };
129
159
  exports.SplitterHandle = SplitterHandle;
@@ -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
  ]);
@@ -1,9 +1,10 @@
1
1
  import { type FC } from 'react';
2
- import type { EffectDefinition, JsxComponentIdentity, InteractivitySchema } from 'remotion';
2
+ import type { EffectDefinition, JsxComponentIdentity, InteractivitySchema, VideoConfigValues } from 'remotion';
3
3
  export declare const SubscribeToNodePaths: FC<{
4
4
  readonly overrideId: string;
5
5
  readonly componentIdentity: JsxComponentIdentity | null;
6
6
  readonly schema: InteractivitySchema;
7
7
  readonly getStack: () => string | null;
8
8
  readonly effects: readonly EffectDefinition<unknown>[];
9
+ readonly videoConfigValues: VideoConfigValues | null;
9
10
  }>;
@@ -5,7 +5,7 @@ const react_1 = require("react");
5
5
  const no_react_1 = require("remotion/no-react");
6
6
  const use_resolved_stack_react_to_change_1 = require("./use-resolved-stack-react-to-change");
7
7
  const use_sequence_props_subscription_1 = require("./use-sequence-props-subscription");
8
- const SubscribeToNodePaths = ({ overrideId, componentIdentity, schema, getStack, effects }) => {
8
+ const SubscribeToNodePaths = ({ overrideId, componentIdentity, schema, getStack, effects, videoConfigValues, }) => {
9
9
  const { resolvedLocation, stack, preferMappedNodePath } = (0, use_resolved_stack_react_to_change_1.useResolveStackAndReactToChange)(getStack, overrideId);
10
10
  const effectSubscriptions = (0, react_1.useMemo)(() => {
11
11
  return effects
@@ -22,6 +22,7 @@ const SubscribeToNodePaths = ({ overrideId, componentIdentity, schema, getStack,
22
22
  originalLocation: resolvedLocation,
23
23
  preferMappedNodePath,
24
24
  stack,
25
+ videoConfigValues,
25
26
  });
26
27
  return null;
27
28
  };
@@ -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;
@@ -356,9 +316,20 @@ const TimelineInner = () => {
356
316
  timeline,
357
317
  ]);
358
318
  const durationInFrames = (_a = videoConfig === null || videoConfig === void 0 ? void 0 : videoConfig.durationInFrames) !== null && _a !== void 0 ? _a : 0;
319
+ const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
359
320
  const filtered = (0, react_1.useMemo)(() => {
360
- return timeline.filter((t) => (0, should_show_track_in_timeline_1.shouldShowTrackInTimeline)(t, durationInFrames));
361
- }, [durationInFrames, timeline]);
321
+ return timeline.filter((t) => {
322
+ // Moving outside the composition can reduce the displayed duration to
323
+ // zero. Keep the drag owner mounted until its pending edit is saved.
324
+ if (t.sequence.showInTimeline &&
325
+ t.nodePathInfo !== null &&
326
+ getDragOverrides(t.nodePathInfo.sequenceSubscriptionKey).from !==
327
+ undefined) {
328
+ return true;
329
+ }
330
+ return (0, should_show_track_in_timeline_1.shouldShowTrackInTimeline)(t, durationInFrames);
331
+ });
332
+ }, [durationInFrames, getDragOverrides, timeline]);
362
333
  // Keep `filtered` complete so a future toggle can show every programmatic
363
334
  // instance without recalculating the timeline or losing its instance index.
364
335
  const collapsed = (0, react_1.useMemo)(() => {
@@ -388,10 +359,10 @@ const TimelineInner = () => {
388
359
  if (!(0, should_subscribe_to_sequence_props_1.shouldSubscribeToSequenceProps)(sequence, previewInteractive)) {
389
360
  return null;
390
361
  }
391
- return (jsx_runtime_1.jsx(SubscribeToNodePaths_1.SubscribeToNodePaths, { overrideId: sequence.controls.overrideId, componentIdentity: sequence.controls.componentIdentity, schema: sequence.controls.schema, getStack: sequence.getStack, effects: sequence.effects }, sequence.id));
362
+ return (jsx_runtime_1.jsx(SubscribeToNodePaths_1.SubscribeToNodePaths, { overrideId: sequence.controls.overrideId, componentIdentity: sequence.controls.componentIdentity, schema: sequence.controls.schema, getStack: sequence.getStack, effects: sequence.effects, videoConfigValues: sequence.controls.videoConfigValues }, sequence.id));
392
363
  }), (0, interactivity_enabled_1.isStudioInteractivityEnabled)() ? jsx_runtime_1.jsx(SequencePropsObserver_1.SequencePropsObserver, {}) : null, jsx_runtime_1.jsx(TimelineLayerChildren_1.TimelineLayerChildrenProvider, { value: layerChildrenValue, children: jsx_runtime_1.jsx(TimelineKeyframeTracksContext_1.TimelineKeyframeTracksProvider, { tracks: filtered, children: jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectableItemsProvider, { timeline: shown, children: jsx_runtime_1.jsxs(TimelineVirtualization_1.TimelineVirtualizationProvider, { hasBeenCut: hasBeenCut, isStill: isStill, timeline: shown, children: [(0, interactivity_enabled_1.isStudioInteractivityEnabled)() ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectAllKeybindings, { timeline: shown })) : null, jsx_runtime_1.jsx(TimelineHeightContainer_1.TimelineHeightContainer, { children: isStill ? (jsx_runtime_1.jsx(TimelineList_1.TimelineList, {})) : (jsx_runtime_1.jsxs(TimelineWidthProvider_1.TimelineWidthProvider, { children: [
393
364
  jsx_runtime_1.jsx(TimelinePinchZoom_1.TimelinePinchZoom, {}), jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { orientation: "vertical", defaultFlex: 0.2, id: "names-to-timeline", maxFlex: 0.5, minFlex: 0.15, maxFlexerSize: null, minFlexerSize: MIN_TIMELINE_LABELS_WIDTH, maxAntiFlexerSize: null, minAntiFlexerSize: null, children: [
394
- jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "flexer", sticky: jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimePlaceholders, {}), children: jsx_runtime_1.jsx(TimelineList_1.TimelineList, {}) }), jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { onCollapse: noop, allowToCollapse: "none" }), jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "anti-flexer", sticky: jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
365
+ jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "flexer", sticky: jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimePlaceholders, {}), children: jsx_runtime_1.jsx(TimelineList_1.TimelineList, {}) }), jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { onCollapse: noop, onCollapseDuringDrag: null, allowToCollapse: "none" }), jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "anti-flexer", sticky: jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
395
366
  jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimeIndicators, {}), jsx_runtime_1.jsx(TimelineSlider_1.TimelineSlider, {})
396
367
  ] }), children: jsx_runtime_1.jsxs(TimelineScrollable_1.TimelineScrollable, { children: [
397
368
  jsx_runtime_1.jsx(TimelineTracks_1.TimelineTracks, { hasBeenCut: hasBeenCut }), jsx_runtime_1.jsx(TimelinePlayCursorSyncer_1.TimelinePlayCursorSyncer, {}), jsx_runtime_1.jsx(TimelineInOutPointer_1.TimelineInOutPointer, {}), jsx_runtime_1.jsx(TimelineDragHandler_1.TimelineDragHandler, {}), (0, interactivity_enabled_1.isStudioInteractivityEnabled)() ? (jsx_runtime_1.jsx(TimelineInOutDragHandler_1.TimelineInOutDragHandler, {})) : null] }) })
@@ -402,6 +373,6 @@ const TimelineInner = () => {
402
373
  };
403
374
  const MemoizedTimelineInner = react_1.default.memo(TimelineInner);
404
375
  const Timeline = () => {
405
- 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, {}) }) }));
406
377
  };
407
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();
@@ -80,6 +80,7 @@ const TimelineDragHandler = () => {
80
80
  });
81
81
  const { zoom: zoomMap } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
82
82
  const { canvasContent, currentAssetMetadata } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
83
+ const videoId = video === null || video === void 0 ? void 0 : video.id;
83
84
  const containerStyle = (0, react_1.useMemo)(() => {
84
85
  var _a;
85
86
  var _b, _c, _d, _e;
@@ -90,16 +91,20 @@ const TimelineDragHandler = () => {
90
91
  const zoom = (0, get_timeline_max_zoom_1.getTimelineZoom)({
91
92
  durationInFrames,
92
93
  timelineViewportWidth: (_d = (_c = timelineSize === null || timelineSize === void 0 ? void 0 : timelineSize.width) !== null && _c !== void 0 ? _c : (_a = timeline_refs_1.scrollableRef.current) === null || _a === void 0 ? void 0 : _a.clientWidth) !== null && _d !== void 0 ? _d : 0,
93
- zoom: canvasContent.type === 'composition'
94
- ? ((_e = zoomMap[canvasContent.compositionId]) !== null && _e !== void 0 ? _e : null)
95
- : null,
94
+ zoom: videoId ? ((_e = zoomMap[videoId]) !== null && _e !== void 0 ? _e : null) : null,
96
95
  });
97
96
  return {
98
97
  ...container,
99
98
  width: (0, get_timeline_max_zoom_1.getTimelineWidth)({ durationInFrames, zoom }),
100
99
  height: TimelineTimeIndicators_1.TIMELINE_TIME_INDICATOR_HEIGHT,
101
100
  };
102
- }, [canvasContent, timelineSize === null || timelineSize === void 0 ? void 0 : timelineSize.width, video === null || video === void 0 ? void 0 : video.durationInFrames, zoomMap]);
101
+ }, [
102
+ canvasContent,
103
+ timelineSize === null || timelineSize === void 0 ? void 0 : timelineSize.width,
104
+ video === null || video === void 0 ? void 0 : video.durationInFrames,
105
+ videoId,
106
+ zoomMap,
107
+ ]);
103
108
  const hasPlayableContent = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ||
104
109
  ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset' &&
105
110
  (currentAssetMetadata === null || currentAssetMetadata === void 0 ? void 0 : currentAssetMetadata.asset) === canvasContent.asset);
@@ -110,7 +115,7 @@ const TimelineDragHandler = () => {
110
115
  };
111
116
  exports.TimelineDragHandler = TimelineDragHandler;
112
117
  const TimelineDragHandlerInner = () => {
113
- var _a;
118
+ var _a, _b;
114
119
  const videoConfig = (0, remotion_1.useVideoConfig)();
115
120
  const size = player_1.PlayerInternals.useElementSize(timeline_refs_1.scrollableRef, {
116
121
  triggerOnWindowResize: true,
@@ -315,6 +320,6 @@ const TimelineDragHandlerInner = () => {
315
320
  current.removeEventListener('scroll', onScroll);
316
321
  };
317
322
  }, []);
318
- 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 }) }));
319
324
  };
320
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,