@remotion/studio 4.0.526 → 4.0.528

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 (309) hide show
  1. package/dist/components/AgentPrompt.js +1 -2
  2. package/dist/components/AudioWaveform.d.ts +1 -0
  3. package/dist/components/AudioWaveform.js +10 -14
  4. package/dist/components/Canvas.js +88 -26
  5. package/dist/components/CanvasCaptureDropHandler.js +63 -0
  6. package/dist/components/CanvasOrLoading.js +10 -2
  7. package/dist/components/CodeFrame.js +1 -1
  8. package/dist/components/ColorPicker/checker.d.ts +1 -1
  9. package/dist/components/CompositionSelectorItem.js +1 -0
  10. package/dist/components/CurrentAsset.js +4 -2
  11. package/dist/components/EditorRuler/Ruler.js +6 -3
  12. package/dist/components/EffectPickerModal.js +69 -43
  13. package/dist/components/ElementInstallConfirmation.js +3 -3
  14. package/dist/components/ElementLibrariesSettings.d.ts +2 -0
  15. package/dist/components/ElementLibrariesSettings.js +200 -0
  16. package/dist/components/InitialCompositionLoader.js +4 -2
  17. package/dist/components/InlineDropdown.js +26 -2
  18. package/dist/components/InlineEditableTitle.js +1 -0
  19. package/dist/components/InspectorOpenInEditor.js +13 -0
  20. package/dist/components/InspectorPanel/AlignmentControls.js +28 -9
  21. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +2 -1
  22. package/dist/components/InspectorPanel/CompositionInspector.js +3 -3
  23. package/dist/components/InspectorPanel/CompositionMetadata.js +4 -0
  24. package/dist/components/InspectorPanel/EasingInspector.js +6 -2
  25. package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -1
  26. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +1 -1
  27. package/dist/components/InspectorPanel/KeyframeInspector.js +28 -24
  28. package/dist/components/InspectorPanel/MultiSequenceInspector.js +32 -1
  29. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +1 -1
  30. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -1
  31. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +70 -2
  32. package/dist/components/InspectorPanel/SequenceWrapAction.d.ts +8 -0
  33. package/dist/components/InspectorPanel/SequenceWrapAction.js +151 -0
  34. package/dist/components/InspectorPanel/common.js +1 -0
  35. package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +2 -1
  36. package/dist/components/InspectorPanel/easing-inspector-selection.js +4 -3
  37. package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +2 -1
  38. package/dist/components/InspectorPanel/keyframe-inspector-frame.js +2 -2
  39. package/dist/components/InspectorPanel/styles.js +2 -0
  40. package/dist/components/InspectorPanel/use-composition-actions.js +1 -0
  41. package/dist/components/InspectorSequenceSection.d.ts +1 -0
  42. package/dist/components/InspectorSequenceSection.js +7 -5
  43. package/dist/components/InspectorSourceLocation.js +3 -0
  44. package/dist/components/KeyboardShortcutsSettings.js +1 -1
  45. package/dist/components/Menu/styles.d.ts +2 -2
  46. package/dist/components/MenuBuildIndicator.js +1 -0
  47. package/dist/components/Modals.js +7 -6
  48. package/dist/components/ModelManager.js +10 -9
  49. package/dist/components/NewComposition/CancelButton.js +11 -5
  50. package/dist/components/NewComposition/InputDragger.d.ts +3 -1
  51. package/dist/components/NewComposition/InputDragger.js +28 -9
  52. package/dist/components/NewComposition/NewComposition.js +7 -6
  53. package/dist/components/NewComposition/RemInput.d.ts +1 -1
  54. package/dist/components/NewComposition/menu-typeahead.js +1 -1
  55. package/dist/components/Preview.js +4 -0
  56. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -0
  57. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
  58. package/dist/components/RadioButton.js +1 -0
  59. package/dist/components/RenderModal/DataEditor.js +4 -1
  60. package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +1 -2
  61. package/dist/components/RenderModal/WebRenderModalPicture.js +1 -2
  62. package/dist/components/RenderQueue/CaptionQueueItem.js +19 -7
  63. package/dist/components/RenderQueue/CaptionQueueProcessor.js +65 -15
  64. package/dist/components/RenderQueue/QueueJobError.d.ts +8 -0
  65. package/dist/components/RenderQueue/QueueJobError.js +24 -0
  66. package/dist/components/RenderQueue/QueueJobErrorModal.d.ts +8 -0
  67. package/dist/components/RenderQueue/QueueJobErrorModal.js +63 -0
  68. package/dist/components/RenderQueue/RenderQueueItemCancelButton.d.ts +3 -1
  69. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +11 -4
  70. package/dist/components/RenderQueue/RenderQueueRepeat.d.ts +3 -1
  71. package/dist/components/RenderQueue/RenderQueueRepeat.js +20 -3
  72. package/dist/components/RenderQueue/VideoMattingQueueItem.js +25 -27
  73. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +68 -28
  74. package/dist/components/RenderQueue/caption-job-types.d.ts +9 -1
  75. package/dist/components/RenderQueue/context.d.ts +4 -0
  76. package/dist/components/RenderQueue/context.js +58 -8
  77. package/dist/components/RenderQueue/index.js +3 -3
  78. package/dist/components/RenderQueue/load-model-for-job.d.ts +2 -1
  79. package/dist/components/RenderQueue/load-model-for-job.js +5 -1
  80. package/dist/components/RenderQueue/video-matting-job-types.d.ts +13 -6
  81. package/dist/components/RendersTab.js +2 -0
  82. package/dist/components/SelectedOutlineCropControls.js +2 -1
  83. package/dist/components/SelectedOutlineEditingHandles.js +9 -2
  84. package/dist/components/SelectedOutlineElement.js +9 -3
  85. package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -4
  86. package/dist/components/SelectedOutlineKeyboardControls.js +4 -22
  87. package/dist/components/SelectedOutlineOverlay.js +152 -106
  88. package/dist/components/SelectedOutlinePathPoints.d.ts +8 -0
  89. package/dist/components/SelectedOutlinePathPoints.js +433 -0
  90. package/dist/components/SelectedOutlinePolygon.js +21 -46
  91. package/dist/components/SelectedOutlineRenderer.d.ts +3 -5
  92. package/dist/components/SelectedOutlineRenderer.js +32 -136
  93. package/dist/components/SelectedOutlineSnapIndicators.d.ts +6 -0
  94. package/dist/components/SelectedOutlineSnapIndicators.js +16 -12
  95. package/dist/components/SelectedOutlineTransformOriginHandle.js +3 -2
  96. package/dist/components/SelectedOutlineUvControls.js +12 -7
  97. package/dist/components/SequencePropsSubscriptionProvider.d.ts +3 -0
  98. package/dist/components/SequencePropsSubscriptionProvider.js +8 -6
  99. package/dist/components/SettingsModal.js +30 -3
  100. package/dist/components/SettingsModalFooter.d.ts +1 -0
  101. package/dist/components/SettingsModalFooter.js +7 -3
  102. package/dist/components/ShowOutlinesProvider.js +1 -1
  103. package/dist/components/SkillsSettings.d.ts +0 -1
  104. package/dist/components/SkillsSettings.js +13 -14
  105. package/dist/components/Splitter/SplitterElement.js +1 -2
  106. package/dist/components/TimeValue.js +1 -1
  107. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +1 -0
  108. package/dist/components/Timeline/LoopedTimelineIndicators.js +7 -6
  109. package/dist/components/Timeline/TimelineArrayField.js +1 -1
  110. package/dist/components/Timeline/TimelineClipboardKeybindings.js +0 -1
  111. package/dist/components/Timeline/TimelineColorField.js +1 -1
  112. package/dist/components/Timeline/TimelineDeleteKeybindings.js +6 -9
  113. package/dist/components/Timeline/TimelineDragHandler.js +1 -1
  114. package/dist/components/Timeline/TimelineEffectItem.js +1 -0
  115. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  116. package/dist/components/Timeline/TimelineEffectPropItem.js +12 -5
  117. package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -0
  118. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -0
  119. package/dist/components/Timeline/TimelineExpandedRow.js +6 -4
  120. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -0
  121. package/dist/components/Timeline/TimelineExpandedSection.js +2 -2
  122. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +1 -0
  123. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +3 -1
  124. package/dist/components/Timeline/TimelineFieldLabel.js +1 -0
  125. package/dist/components/Timeline/TimelineFontFamilyField.js +12 -12
  126. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -0
  127. package/dist/components/Timeline/TimelineKeyframeControls.js +40 -28
  128. package/dist/components/Timeline/TimelineLayerChildren.js +1 -1
  129. package/dist/components/Timeline/TimelineList.js +1 -1
  130. package/dist/components/Timeline/TimelineNumberField.js +2 -4
  131. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  132. package/dist/components/Timeline/TimelineSelection.d.ts +9 -9
  133. package/dist/components/Timeline/TimelineSelection.js +16 -9
  134. package/dist/components/Timeline/TimelineSequence.d.ts +3 -1
  135. package/dist/components/Timeline/TimelineSequence.js +65 -21
  136. package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
  137. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  138. package/dist/components/Timeline/TimelineSequenceItem.js +46 -8
  139. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +3 -0
  140. package/dist/components/Timeline/TimelineSequencePropItem.js +262 -25
  141. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +11 -13
  142. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +98 -77
  143. package/dist/components/Timeline/TimelineTextContentField.js +27 -4
  144. package/dist/components/Timeline/TimelineTimeIndicators.js +10 -5
  145. package/dist/components/Timeline/TimelineTrack.js +1 -1
  146. package/dist/components/Timeline/TimelineTrimTooltip.d.ts +11 -0
  147. package/dist/components/Timeline/TimelineTrimTooltip.js +41 -0
  148. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  149. package/dist/components/Timeline/TimelineVideoInfo.js +13 -10
  150. package/dist/components/Timeline/TimelineViewport.d.ts +1 -0
  151. package/dist/components/Timeline/TimelineViewport.js +10 -1
  152. package/dist/components/Timeline/delete-selected-keyframe.js +22 -8
  153. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +1 -5
  154. package/dist/components/Timeline/delete-selected-timeline-item.js +9 -95
  155. package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +2 -1
  156. package/dist/components/Timeline/get-animation-item-selection-for-frame.js +7 -5
  157. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.d.ts +23 -0
  158. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.js +57 -0
  159. package/dist/components/Timeline/get-node-keyframes.d.ts +2 -1
  160. package/dist/components/Timeline/get-node-keyframes.js +6 -4
  161. package/dist/components/Timeline/get-playback-rate-keyframe-changes.d.ts +21 -0
  162. package/dist/components/Timeline/get-playback-rate-keyframe-changes.js +142 -0
  163. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +3 -1
  164. package/dist/components/Timeline/get-sequence-context-menu-items.js +13 -1
  165. package/dist/components/Timeline/get-timeline-keyframes.d.ts +15 -2
  166. package/dist/components/Timeline/get-timeline-keyframes.js +44 -6
  167. package/dist/components/Timeline/keyframe-clipboard.js +17 -3
  168. package/dist/components/Timeline/split-selected-timeline-item.d.ts +13 -10
  169. package/dist/components/Timeline/split-selected-timeline-item.js +61 -35
  170. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  171. package/dist/components/Timeline/timeline-field-row-layout.js +1 -0
  172. package/dist/components/Timeline/use-delete-timeline-items.js +17 -11
  173. package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +2 -1
  174. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +3 -1
  175. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -3
  176. package/dist/components/Timeline/use-timeline-keyframe-drag.js +28 -19
  177. package/dist/components/TimelineCombobox.js +1 -0
  178. package/dist/components/Transcription/Models.js +1 -1
  179. package/dist/components/Transcription/TranscriptionModal.js +18 -11
  180. package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +1 -1
  181. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +2 -1
  182. package/dist/components/Transcription/resample-media-to-16-khz.js +20 -2
  183. package/dist/components/UpdatesSettings.js +2 -0
  184. package/dist/components/VideoMatting/Models.js +1 -1
  185. package/dist/components/VideoMatting/VideoMattingModal.js +30 -47
  186. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +1 -1
  187. package/dist/components/WebMcp.js +23 -40
  188. package/dist/components/composition-drop-preview.d.ts +9 -2
  189. package/dist/components/composition-drop-preview.js +8 -4
  190. package/dist/components/composition-menu-items.js +4 -4
  191. package/dist/components/delete-jsx-nodes-api.d.ts +2 -0
  192. package/dist/components/{delete-jsx-node-api.js → delete-jsx-nodes-api.js} +5 -5
  193. package/dist/components/effect-drag-and-drop.d.ts +13 -5
  194. package/dist/components/effect-drag-and-drop.js +19 -4
  195. package/dist/components/get-open-in-menu-items.d.ts +2 -1
  196. package/dist/components/get-open-in-menu-items.js +24 -8
  197. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  198. package/dist/components/keyboard-shortcuts.js +3 -1
  199. package/dist/components/public-output-name.d.ts +1 -0
  200. package/dist/components/public-output-name.js +7 -3
  201. package/dist/components/selected-outline-drag.d.ts +1 -6
  202. package/dist/components/selected-outline-drag.js +22 -6
  203. package/dist/components/selected-outline-geometry.d.ts +2 -18
  204. package/dist/components/selected-outline-measurement.d.ts +23 -41
  205. package/dist/components/selected-outline-measurement.js +14 -252
  206. package/dist/components/selected-outline-order.d.ts +4 -11
  207. package/dist/components/selected-outline-order.js +2 -254
  208. package/dist/components/selected-outline-snap.d.ts +1 -1
  209. package/dist/components/selected-outline-snap.js +2 -1
  210. package/dist/components/selected-outline-types.d.ts +18 -28
  211. package/dist/components/selected-outline-uv.d.ts +4 -4
  212. package/dist/components/selected-outline-uv.js +6 -111
  213. package/dist/components/sequence-props-api.js +0 -10
  214. package/dist/components/use-selected-outline-control-target.js +12 -21
  215. package/dist/components/wrap-jsx-node-api.d.ts +2 -0
  216. package/dist/components/wrap-jsx-node-api.js +13 -0
  217. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +45 -2
  218. package/dist/error-overlay/remotion-overlay/StackFrame.js +32 -3
  219. package/dist/esm/{CaptionQueueProcessor-k0yrm3dj.mjs → CaptionQueueProcessor-nr7hjcga.mjs} +96 -19
  220. package/dist/esm/LazyModels-ajkn7fs3.mjs +12 -0
  221. package/dist/esm/LazyModels-g1g7cf4e.mjs +12 -0
  222. package/dist/esm/{TranscriptionModal-ymnx1c7m.mjs → TranscriptionModal-e18bzbkb.mjs} +30 -22
  223. package/dist/esm/{VideoMattingModal-05vpczks.mjs → VideoMattingModal-5bz2s4rs.mjs} +47 -62
  224. package/dist/esm/{VideoMattingQueueProcessor-t1hgm2rm.mjs → VideoMattingQueueProcessor-4tkj0f4k.mjs} +69 -26
  225. package/dist/esm/{index-v4tr1bft.mjs → index-09txs1bj.mjs} +5 -0
  226. package/dist/esm/{index-4dsz9035.mjs → index-5ycb9e9q.mjs} +2 -4
  227. package/dist/esm/index-890dd9b3.mjs +768 -0
  228. package/dist/esm/{index-5bfxbpca.mjs → index-8nt6a0mw.mjs} +3 -3
  229. package/dist/esm/{index-5gd8k9yv.mjs → index-9q9w8v9p.mjs} +3 -3
  230. package/dist/esm/{index-x40wwfmt.mjs → index-c2wabcdt.mjs} +8 -6
  231. package/dist/esm/index-dfy1t576.mjs +129 -0
  232. package/dist/esm/index-dh3zk2hv.mjs +220 -0
  233. package/dist/esm/{index-0gewwxse.mjs → index-dpyss74p.mjs} +6179 -5011
  234. package/dist/esm/{index-9x6e1dq0.mjs → index-hqxc6tzp.mjs} +40 -6
  235. package/dist/esm/{index-cdy8v54v.mjs → index-qve7mdfp.mjs} +36 -539
  236. package/dist/esm/{index-eb5txqp6.mjs → index-s6qya2gg.mjs} +8 -88
  237. package/dist/esm/index-t7tbt980.mjs +103 -0
  238. package/dist/esm/{index-g7k2dvar.mjs → index-t7xnxdf8.mjs} +44 -26
  239. package/dist/esm/index-wqc43mw0.mjs +158 -0
  240. package/dist/esm/{index-bs39wngg.mjs → index-x6r9bn12.mjs} +5623 -6218
  241. package/dist/esm/{index-f97r9e2g.mjs → index-xac20sv4.mjs} +46 -57
  242. package/dist/esm/index.mjs +4 -4
  243. package/dist/esm/internals.mjs +13 -10
  244. package/dist/esm/previewEntry.mjs +18 -12
  245. package/dist/esm/renderEntry.mjs +5 -1
  246. package/dist/esm/{resolve-composition-component-location-bt2d6qxq.mjs → resolve-composition-component-location-2hgf6g0a.mjs} +1 -1
  247. package/dist/helpers/calculate-timeline.d.ts +5 -1
  248. package/dist/helpers/calculate-timeline.js +1 -1
  249. package/dist/helpers/checkerboard-background.d.ts +2 -2
  250. package/dist/helpers/colors.d.ts +132 -112
  251. package/dist/helpers/colors.js +117 -95
  252. package/dist/helpers/copy-text.js +1 -16
  253. package/dist/helpers/create-folder-tree.js +2 -1
  254. package/dist/helpers/editor-guide-selection.d.ts +1 -1
  255. package/dist/helpers/editor-ruler.js +23 -12
  256. package/dist/helpers/get-connected-compositions.d.ts +6 -1
  257. package/dist/helpers/get-connected-compositions.js +1 -1
  258. package/dist/helpers/get-sequence-double-click-action.js +1 -1
  259. package/dist/helpers/get-sequence-visible-range.d.ts +1 -1
  260. package/dist/helpers/get-sequence-visible-range.js +2 -5
  261. package/dist/helpers/get-timeline-nestedness.d.ts +1 -1
  262. package/dist/helpers/get-timeline-nestedness.js +1 -1
  263. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
  264. package/dist/helpers/get-timeline-sequence-sort-key.js +1 -1
  265. package/dist/helpers/hoverable.js +6 -5
  266. package/dist/helpers/inject-css.js +5 -7
  267. package/dist/helpers/open-in-editor.js +1 -1
  268. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -1
  269. package/dist/helpers/prism-vsc-dark-plus.js +52 -51
  270. package/dist/helpers/resolve-studio-color.d.ts +1 -0
  271. package/dist/helpers/resolve-studio-color.js +11 -0
  272. package/dist/helpers/studio-css-variables.d.ts +1 -0
  273. package/dist/helpers/studio-css-variables.js +105 -0
  274. package/dist/helpers/studio-pixel-ratio.d.ts +1 -0
  275. package/dist/helpers/studio-pixel-ratio.js +7 -0
  276. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  277. package/dist/helpers/timeline-node-path-key.d.ts +1 -1
  278. package/dist/helpers/timeline-node-path-key.js +2 -2
  279. package/dist/helpers/use-keybinding.d.ts +1 -1
  280. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  281. package/dist/helpers/use-menu-structure.js +15 -9
  282. package/dist/helpers/use-runtime-values.js +2 -28
  283. package/dist/hot-middleware-client/client.js +5 -3
  284. package/dist/icons/align-center-horizontal.js +2 -1
  285. package/dist/icons/align-left.js +2 -1
  286. package/dist/icons/align-right.js +2 -1
  287. package/dist/icons/{separation.d.ts → background-removal.d.ts} +1 -1
  288. package/dist/icons/background-removal.js +9 -0
  289. package/dist/icons/wrap.d.ts +4 -0
  290. package/dist/icons/wrap.js +10 -0
  291. package/dist/previewEntry.js +2 -0
  292. package/dist/renderEntry.js +2 -0
  293. package/dist/state/modals.d.ts +20 -1
  294. package/dist/state/timeline-sequence-hover.d.ts +6 -16
  295. package/dist/state/timeline-sequence-hover.js +6 -67
  296. package/dist/state/timeline-zoom.js +4 -0
  297. package/package.json +20 -19
  298. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +0 -15
  299. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +0 -31
  300. package/dist/components/delete-jsx-node-api.d.ts +0 -2
  301. package/dist/esm/LazyModels-mtggyjye.mjs +0 -11
  302. package/dist/esm/LazyModels-nk7py0zt.mjs +0 -11
  303. package/dist/esm/index-cw0pnpg5.mjs +0 -50
  304. package/dist/esm/index-k426ye99.mjs +0 -139
  305. package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
  306. package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
  307. package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
  308. package/dist/helpers/get-box-quads-ponyfill.js +0 -23
  309. package/dist/icons/separation.js +0 -7
@@ -4,11 +4,11 @@ exports.getNodeHasKeyframes = exports.getNodeKeyframes = void 0;
4
4
  const remotion_1 = require("remotion");
5
5
  const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
6
6
  const hasOverride = (overrides, key) => Object.prototype.hasOwnProperty.call(overrides, key);
7
- const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, timelinePosition, dragOverrideValue, hasDragOverride, }) => {
7
+ const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, timelinePosition, dragOverrideValue, hasDragOverride, }) => {
8
8
  if ((dragOverrideValue === null || dragOverrideValue === void 0 ? void 0 : dragOverrideValue.type) === 'keyframed') {
9
- return (0, get_timeline_keyframes_1.getTimelineKeyframes)(dragOverrideValue.status, keyframeDisplayOffset);
9
+ return (0, get_timeline_keyframes_1.getTimelineKeyframes)(dragOverrideValue.status, keyframeDisplayOffset, keyframePlaybackRate);
10
10
  }
11
- const keyframes = (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset);
11
+ const keyframes = (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset, keyframePlaybackRate);
12
12
  if (!hasDragOverride || (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'keyframed') {
13
13
  return keyframes;
14
14
  }
@@ -22,7 +22,7 @@ const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, timelineP
22
22
  }
23
23
  return [...keyframes, dragKeyframe].sort((first, second) => first.frame - second.frame);
24
24
  };
25
- const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset, getDragOverrides, getEffectDragOverrides, timelinePosition, }) => {
25
+ const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset, keyframePlaybackRate, getDragOverrides, getEffectDragOverrides, timelinePosition, }) => {
26
26
  var _a, _b;
27
27
  if (node.kind !== 'field' || node.field === null) {
28
28
  return [];
@@ -32,6 +32,7 @@ const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset,
32
32
  return withDragOverrideKeyframe({
33
33
  propStatus: (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[node.field.key],
34
34
  keyframeDisplayOffset,
35
+ keyframePlaybackRate,
35
36
  timelinePosition,
36
37
  dragOverrideValue: dragOverrides[node.field.key],
37
38
  hasDragOverride: hasOverride(dragOverrides, node.field.key),
@@ -48,6 +49,7 @@ const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset,
48
49
  ? (_b = effectStatus.props) === null || _b === void 0 ? void 0 : _b[node.field.key]
49
50
  : null,
50
51
  keyframeDisplayOffset,
52
+ keyframePlaybackRate,
51
53
  timelinePosition,
52
54
  dragOverrideValue: effectDragOverrides[node.field.key],
53
55
  hasDragOverride: hasOverride(effectDragOverrides, node.field.key),
@@ -0,0 +1,21 @@
1
+ import type { CanUpdateSequencePropStatusKeyframed, OverrideIdToNodePaths, PropStatuses, SequencePropsSubscriptionKey, TSequence } from 'remotion';
2
+ import type { MoveEffectKeyframeChange, MoveSequenceKeyframeChange } from './call-move-keyframe';
3
+ type KeyframePreview = {
4
+ readonly nodePath: SequencePropsSubscriptionKey;
5
+ readonly fieldKey: string;
6
+ readonly effectIndex: number | null;
7
+ readonly status: CanUpdateSequencePropStatusKeyframed;
8
+ };
9
+ export declare const getPlaybackRateKeyframeChanges: ({ nodePath, sequences, overrideIdsToNodePaths, propStatuses, previousPlaybackRate, playbackRate, }: {
10
+ readonly nodePath: SequencePropsSubscriptionKey;
11
+ readonly sequences: TSequence[];
12
+ readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
13
+ readonly propStatuses: PropStatuses;
14
+ readonly previousPlaybackRate: number;
15
+ readonly playbackRate: number;
16
+ }) => {
17
+ readonly sequenceKeyframes: MoveSequenceKeyframeChange[];
18
+ readonly effectKeyframes: MoveEffectKeyframeChange[];
19
+ readonly previews: KeyframePreview[];
20
+ };
21
+ export {};
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPlaybackRateKeyframeChanges = void 0;
4
+ const studio_shared_1 = require("@remotion/studio-shared");
5
+ const get_keyframed_sequence_drag_targets_1 = require("./get-keyframed-sequence-drag-targets");
6
+ const getPlaybackRateKeyframeChanges = ({ nodePath, sequences, overrideIdsToNodePaths, propStatuses, previousPlaybackRate, playbackRate, }) => {
7
+ var _a;
8
+ var _b;
9
+ const sequenceKeyframes = [];
10
+ const effectKeyframes = [];
11
+ const previews = [];
12
+ if (previousPlaybackRate === playbackRate ||
13
+ !Number.isFinite(previousPlaybackRate) ||
14
+ previousPlaybackRate <= 0 ||
15
+ !Number.isFinite(playbackRate) ||
16
+ playbackRate <= 0) {
17
+ return { sequenceKeyframes, effectKeyframes, previews };
18
+ }
19
+ const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath);
20
+ const root = sequences.find((sequence) => {
21
+ var _a;
22
+ const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
23
+ const path = overrideId ? overrideIdsToNodePaths[overrideId] : undefined;
24
+ return path && (0, studio_shared_1.stringifySequenceSubscriptionKey)(path) === key;
25
+ });
26
+ if (!root) {
27
+ return { sequenceKeyframes, effectKeyframes, previews };
28
+ }
29
+ const sequencesById = new Map(sequences.map((sequence) => [sequence.id, sequence]));
30
+ const ratio = previousPlaybackRate / playbackRate;
31
+ const includedNodePaths = new Set();
32
+ for (const sequence of sequences) {
33
+ let ancestorId = sequence.id;
34
+ let belongsToRoot = false;
35
+ let descendantOffset = 0;
36
+ while (ancestorId !== null) {
37
+ if (ancestorId === root.id) {
38
+ belongsToRoot = true;
39
+ break;
40
+ }
41
+ const ancestor = sequencesById.get(ancestorId);
42
+ if (!ancestor) {
43
+ break;
44
+ }
45
+ descendantOffset += ancestor.from - ((_b = ancestor.trimBefore) !== null && _b !== void 0 ? _b : 0);
46
+ ancestorId = ancestor.parent;
47
+ }
48
+ if (!belongsToRoot) {
49
+ continue;
50
+ }
51
+ const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
52
+ const descendantNodePath = overrideId
53
+ ? overrideIdsToNodePaths[overrideId]
54
+ : undefined;
55
+ if (!descendantNodePath) {
56
+ continue;
57
+ }
58
+ const descendantKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)(descendantNodePath);
59
+ if (includedNodePaths.has(descendantKey)) {
60
+ continue;
61
+ }
62
+ includedNodePaths.add(descendantKey);
63
+ // Local-clock descendant keyframes already follow their parent's rate.
64
+ // The shared collector includes only outer-clock descendants.
65
+ const targets = (0, get_keyframed_sequence_drag_targets_1.getKeyframedSequenceDragTargets)({
66
+ nodePath: descendantNodePath,
67
+ sequence,
68
+ sequences,
69
+ propStatuses,
70
+ isDescendant: sequence.id !== root.id,
71
+ });
72
+ const addMoves = (target, effectIndex) => {
73
+ var _a;
74
+ const adjustment = (_a = target.status.keyframeDisplayOffsetAdjustment) !== null && _a !== void 0 ? _a : 0;
75
+ // The adjustment includes the timing offsets between this element and
76
+ // the useCurrentFrame() binding. Remove the descendant offsets to find
77
+ // the edited element's start in that binding's source clock.
78
+ const anchor = sequence.id === root.id
79
+ ? root.from - adjustment
80
+ : -adjustment - descendantOffset;
81
+ if (!Number.isFinite(anchor)) {
82
+ return;
83
+ }
84
+ const nextKeyframes = target.status.keyframes.map((keyframe) => {
85
+ const frame = anchor + (keyframe.frame - anchor) * ratio;
86
+ const nearestInteger = Math.round(frame);
87
+ return {
88
+ ...keyframe,
89
+ frame: Math.abs(frame - nearestInteger) <=
90
+ Number.EPSILON * Math.max(1, Math.abs(frame)) * 2
91
+ ? nearestInteger
92
+ : frame,
93
+ };
94
+ });
95
+ if (nextKeyframes.some((keyframe) => !Number.isFinite(keyframe.frame)) ||
96
+ new Set(nextKeyframes.map((keyframe) => keyframe.frame)).size !==
97
+ nextKeyframes.length) {
98
+ return;
99
+ }
100
+ const moves = target.status.keyframes.flatMap((keyframe, index) => {
101
+ var _a;
102
+ const toFrame = (_a = nextKeyframes[index]) === null || _a === void 0 ? void 0 : _a.frame;
103
+ if (toFrame === undefined || toFrame === keyframe.frame) {
104
+ return [];
105
+ }
106
+ return [
107
+ {
108
+ fileName: target.fileName,
109
+ nodePath: target.nodePath,
110
+ fieldKey: target.fieldKey,
111
+ fromFrame: keyframe.frame,
112
+ toFrame,
113
+ schema: target.schema,
114
+ },
115
+ ];
116
+ });
117
+ if (moves.length === 0) {
118
+ return;
119
+ }
120
+ previews.push({
121
+ nodePath: target.nodePath,
122
+ fieldKey: target.fieldKey,
123
+ effectIndex,
124
+ status: { ...target.status, keyframes: nextKeyframes },
125
+ });
126
+ if (effectIndex === null) {
127
+ sequenceKeyframes.push(...moves);
128
+ }
129
+ else {
130
+ effectKeyframes.push(...moves.map((move) => ({ ...move, effectIndex })));
131
+ }
132
+ };
133
+ for (const target of targets.sequenceKeyframes) {
134
+ addMoves(target, null);
135
+ }
136
+ for (const target of targets.effectKeyframes) {
137
+ addMoves(target, target.effectIndex);
138
+ }
139
+ }
140
+ return { sequenceKeyframes, effectKeyframes, previews };
141
+ };
142
+ exports.getPlaybackRateKeyframeChanges = getPlaybackRateKeyframeChanges;
@@ -3,11 +3,13 @@ import type { ResolvedStackLocation, TSequence } from 'remotion';
3
3
  import type { ComboboxValue } from '../NewComposition/ComboBox';
4
4
  import type { TimelineAssetLinkInfo } from './timeline-asset-link';
5
5
  export declare const findCopyableFrameElement: (element: Element | null) => Element | null;
6
- export declare const getMultiSequenceContextMenuItems: ({ deleteDisabled, duplicateDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, }: {
6
+ export declare const getMultiSequenceContextMenuItems: ({ deleteDisabled, duplicateDisabled, splitDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, onSplitSelectedSequences, }: {
7
7
  readonly deleteDisabled: boolean;
8
8
  readonly duplicateDisabled: boolean;
9
+ readonly splitDisabled: boolean;
9
10
  readonly onDeleteSelectedSequences: () => void;
10
11
  readonly onDuplicateSelectedSequences: () => void;
12
+ readonly onSplitSelectedSequences: () => void;
11
13
  }) => ComboboxValue[];
12
14
  export declare const getSequenceContextMenuItems: ({ assetLinkInfo, canOpenInEditor, copyImageElement, deleteDisabled, disableInteractivityDisabled, duplicateDisabled, isProgrammaticallyDuplicated, includeSourceEditItems, codingAgentInfo, editorInfo, onConfigureApps, onDeleteSequenceFromSource, onDisableSequenceInteractivity, onDuplicateSequenceFromSource, openInCodingAgent, openInEditor, originalLocation, selectAsset, sequence, sourceActions, }: {
13
15
  readonly assetLinkInfo: TimelineAssetLinkInfo | null;
@@ -96,7 +96,7 @@ const copyImageToClipboard = async (element) => {
96
96
  }),
97
97
  ]);
98
98
  };
99
- const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, }) => {
99
+ const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, splitDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, onSplitSelectedSequences, }) => {
100
100
  return [
101
101
  {
102
102
  type: 'item',
@@ -110,6 +110,18 @@ const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, o
110
110
  subMenu: null,
111
111
  value: 'duplicate-selected-sequences',
112
112
  },
113
+ {
114
+ type: 'item',
115
+ id: 'split-selected-sequences',
116
+ keyHint: null,
117
+ label: 'Split selected at playhead',
118
+ leftItem: null,
119
+ disabled: splitDisabled,
120
+ onClick: onSplitSelectedSequences,
121
+ quickSwitcherLabel: null,
122
+ subMenu: null,
123
+ value: 'split-selected-sequences',
124
+ },
113
125
  {
114
126
  type: 'divider',
115
127
  id: 'duplicate-delete-selected-sequences-divider',
@@ -1,9 +1,22 @@
1
1
  import type { CanUpdateSequencePropStatus } from 'remotion';
2
- export declare const getTimelineKeyframes: (propStatus: CanUpdateSequencePropStatus | null | undefined, keyframeDisplayOffset?: number) => {
2
+ export type KeyframeSourceFrame = number | {
3
+ readonly displayFrame: number;
4
+ readonly keyframeDisplayOffset: number;
5
+ readonly keyframePlaybackRate: number;
6
+ };
7
+ export declare const getKeyframeSourceFrame: ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }: {
8
+ displayFrame: number;
9
+ keyframeDisplayOffset: number;
10
+ keyframePlaybackRate: number;
11
+ propStatus: CanUpdateSequencePropStatus | null;
12
+ }) => number;
13
+ export declare const resolveKeyframeSourceFrame: (sourceFrame: KeyframeSourceFrame, propStatus: CanUpdateSequencePropStatus | null) => number;
14
+ export declare const getTimelineKeyframes: (propStatus: CanUpdateSequencePropStatus | null | undefined, keyframeDisplayOffset?: number, keyframePlaybackRate?: number) => {
3
15
  frame: number;
4
16
  value: unknown;
5
17
  }[];
6
- export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, }: {
18
+ export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }: {
7
19
  propStatus: CanUpdateSequencePropStatus | null | undefined;
8
20
  keyframeDisplayOffset: number;
21
+ keyframePlaybackRate: number;
9
22
  }) => number;
@@ -1,7 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = void 0;
4
- const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0) => {
3
+ exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = exports.resolveKeyframeSourceFrame = exports.getKeyframeSourceFrame = void 0;
4
+ const getKeyframeSourceFrame = ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }) => {
5
+ const sourceFrame = (displayFrame - keyframeDisplayOffset) * keyframePlaybackRate;
6
+ if ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'keyframed') {
7
+ return sourceFrame;
8
+ }
9
+ // Converting a displayed keyframe back to source frames may introduce rounding
10
+ // error. Resolve its original frame so edits keep the existing keyframe identity,
11
+ // including when source keyframes themselves have fractional frames.
12
+ const tolerance = Number.EPSILON *
13
+ Math.max(1, Math.abs(displayFrame), Math.abs(keyframeDisplayOffset)) *
14
+ keyframePlaybackRate *
15
+ 8;
16
+ let closestFrame = sourceFrame;
17
+ let closestDistance = Infinity;
18
+ for (const keyframe of propStatus.keyframes) {
19
+ const distance = Math.abs(keyframe.frame - sourceFrame);
20
+ if (distance <= tolerance && distance < closestDistance) {
21
+ closestFrame = keyframe.frame;
22
+ closestDistance = distance;
23
+ }
24
+ }
25
+ return closestFrame;
26
+ };
27
+ exports.getKeyframeSourceFrame = getKeyframeSourceFrame;
28
+ const resolveKeyframeSourceFrame = (sourceFrame, propStatus) => {
29
+ return (0, exports.getKeyframeSourceFrame)({
30
+ ...(typeof sourceFrame === 'number'
31
+ ? {
32
+ displayFrame: sourceFrame,
33
+ keyframeDisplayOffset: 0,
34
+ keyframePlaybackRate: 1,
35
+ }
36
+ : sourceFrame),
37
+ propStatus,
38
+ });
39
+ };
40
+ exports.resolveKeyframeSourceFrame = resolveKeyframeSourceFrame;
41
+ const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0, keyframePlaybackRate = 1) => {
5
42
  if (!propStatus) {
6
43
  return [];
7
44
  }
@@ -12,22 +49,23 @@ const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0) => {
12
49
  const resolvedKeyframeDisplayOffset = (0, exports.getKeyframeDisplayOffset)({
13
50
  propStatus,
14
51
  keyframeDisplayOffset,
52
+ keyframePlaybackRate,
15
53
  });
16
- if (resolvedKeyframeDisplayOffset === 0) {
54
+ if (resolvedKeyframeDisplayOffset === 0 && keyframePlaybackRate === 1) {
17
55
  return keyframes;
18
56
  }
19
57
  return keyframes.map((keyframe) => ({
20
58
  ...keyframe,
21
- frame: keyframe.frame + resolvedKeyframeDisplayOffset,
59
+ frame: keyframe.frame / keyframePlaybackRate + resolvedKeyframeDisplayOffset,
22
60
  }));
23
61
  };
24
62
  exports.getTimelineKeyframes = getTimelineKeyframes;
25
- const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, }) => {
63
+ const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }) => {
26
64
  return (keyframeDisplayOffset +
27
65
  ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' || (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static'
28
66
  ? propStatus.keyframeDisplayOffsetAdjustment === null
29
67
  ? 0
30
- : propStatus.keyframeDisplayOffsetAdjustment
68
+ : propStatus.keyframeDisplayOffsetAdjustment / keyframePlaybackRate
31
69
  : 0));
32
70
  };
33
71
  exports.getKeyframeDisplayOffset = getKeyframeDisplayOffset;
@@ -69,9 +69,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
69
69
  fieldKey: identity.fieldKey,
70
70
  }),
71
71
  propStatus: sequencePropStatus,
72
+ keyframePlaybackRate: track.keyframePlaybackRate,
72
73
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
73
74
  propStatus: sequencePropStatus,
74
75
  keyframeDisplayOffset: track.keyframeDisplayOffset,
76
+ keyframePlaybackRate: track.keyframePlaybackRate,
75
77
  }),
76
78
  };
77
79
  }
@@ -97,9 +99,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
97
99
  fieldKey: identity.fieldKey,
98
100
  }),
99
101
  propStatus: effectPropStatus,
102
+ keyframePlaybackRate: track.keyframePlaybackRate,
100
103
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
101
104
  propStatus: effectPropStatus,
102
105
  keyframeDisplayOffset: track.keyframeDisplayOffset,
106
+ keyframePlaybackRate: track.keyframePlaybackRate,
103
107
  }),
104
108
  };
105
109
  };
@@ -147,7 +151,12 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
147
151
  }
148
152
  const keyframes = [];
149
153
  for (const { selection } of resolvedFields) {
150
- const sourceFrame = selection.frame - firstResolved.keyframeDisplayOffset;
154
+ const sourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
155
+ displayFrame: selection.frame,
156
+ keyframeDisplayOffset: firstResolved.keyframeDisplayOffset,
157
+ keyframePlaybackRate: firstResolved.keyframePlaybackRate,
158
+ propStatus: keyframedPropStatus,
159
+ });
151
160
  const keyframe = keyframedPropStatus.keyframes.find((item) => item.frame === sourceFrame);
152
161
  if (keyframe === undefined ||
153
162
  JSON.stringify(keyframe.value) === undefined) {
@@ -195,7 +204,7 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
195
204
  },
196
205
  keyframes: keyframes.map((keyframe) => {
197
206
  return {
198
- frameOffset: keyframe.frame - firstFrame,
207
+ frameOffset: (keyframe.frame - firstFrame) / firstResolved.keyframePlaybackRate,
199
208
  value: keyframe.value,
200
209
  };
201
210
  }),
@@ -260,7 +269,12 @@ const getPasteKeyframeTarget = ({ selectedItems, payload, timelinePosition, sequ
260
269
  return { type: 'multiple' };
261
270
  }
262
271
  const keyframes = payload.keyframes.map((keyframe) => ({
263
- sourceFrame: timelinePosition - resolved.keyframeDisplayOffset + keyframe.frameOffset,
272
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
273
+ displayFrame: timelinePosition + keyframe.frameOffset,
274
+ keyframeDisplayOffset: resolved.keyframeDisplayOffset,
275
+ keyframePlaybackRate: resolved.keyframePlaybackRate,
276
+ propStatus: resolved.propStatus,
277
+ }),
264
278
  value: keyframe.value,
265
279
  }));
266
280
  const firstFrame = (_b = keyframes[0]) === null || _b === void 0 ? void 0 : _b.sourceFrame;
@@ -17,20 +17,23 @@ export declare const splitTimelineSequenceFromSource: ({ nodePathInfo, splitFram
17
17
  nodePathInfo: SequenceNodePathInfo;
18
18
  splitFrame: number;
19
19
  }) => Promise<boolean>;
20
- export declare const shouldHandleTimelineDuplicateShortcut: ({ shiftKey, }: {
21
- readonly shiftKey: boolean;
22
- }) => boolean;
23
- export declare const shouldHandleTimelineSplitShortcut: ({ shiftKey, }: {
24
- readonly shiftKey: boolean;
25
- }) => boolean;
26
- export declare const splitSelectedTimelineItems: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequence, }: {
20
+ export declare const splitTimelineSequencesFromSource: ({ sequences, }: {
21
+ sequences: {
22
+ nodePathInfo: SequenceNodePathInfo;
23
+ splitFrame: number;
24
+ }[];
25
+ }) => Promise<boolean>;
26
+ export declare const splitSelectedTimelineItems: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequences, notify, }: {
27
27
  selections: readonly import("@remotion/canvas").CanvasSelectionItem[];
28
28
  sequences: TSequence[];
29
29
  overrideIdsToNodePaths: OverrideIdToNodePaths;
30
30
  propStatuses: PropStatuses | undefined;
31
31
  splitFrame: number;
32
- splitSequence?: ((options: {
33
- nodePathInfo: SequenceNodePathInfo;
34
- splitFrame: number;
32
+ splitSequences?: ((options: {
33
+ sequences: {
34
+ nodePathInfo: SequenceNodePathInfo;
35
+ splitFrame: number;
36
+ }[];
35
37
  }) => Promise<boolean>) | undefined;
38
+ notify?: ((message: string, durationInMs: number) => void) | undefined;
36
39
  }) => Promise<boolean> | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.splitSelectedTimelineItems = exports.shouldHandleTimelineSplitShortcut = exports.shouldHandleTimelineDuplicateShortcut = exports.splitTimelineSequenceFromSource = exports.getTimelineSequenceSplitEligibility = void 0;
3
+ exports.splitSelectedTimelineItems = exports.splitTimelineSequencesFromSource = exports.splitTimelineSequenceFromSource = exports.getTimelineSequenceSplitEligibility = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const remotion_1 = require("remotion");
6
6
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
@@ -88,12 +88,22 @@ const getTimelineSequenceSplitEligibility = ({ selection, sequence, splitFrame,
88
88
  };
89
89
  exports.getTimelineSequenceSplitEligibility = getTimelineSequenceSplitEligibility;
90
90
  const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
91
- const nodePath = nodePathInfo.sequenceSubscriptionKey;
91
+ return (0, exports.splitTimelineSequencesFromSource)({
92
+ sequences: [{ nodePathInfo, splitFrame }],
93
+ });
94
+ };
95
+ exports.splitTimelineSequenceFromSource = splitTimelineSequenceFromSource;
96
+ const splitTimelineSequencesFromSource = ({ sequences, }) => {
92
97
  return (0, split_jsx_sequence_api_1.splitJsxSequence)({
93
- fileName: nodePath.absolutePath,
94
- nodePath: nodePath.nodePath,
95
- sequenceKeys: nodePath.sequenceKeys,
96
- splitFrame,
98
+ sequences: sequences.map(({ nodePathInfo, splitFrame }) => {
99
+ const nodePath = nodePathInfo.sequenceSubscriptionKey;
100
+ return {
101
+ fileName: nodePath.absolutePath,
102
+ nodePath: nodePath.nodePath,
103
+ sequenceKeys: nodePath.sequenceKeys,
104
+ splitFrame,
105
+ };
106
+ }),
97
107
  })
98
108
  .then((result) => {
99
109
  if (result.success) {
@@ -107,41 +117,57 @@ const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
107
117
  return false;
108
118
  });
109
119
  };
110
- exports.splitTimelineSequenceFromSource = splitTimelineSequenceFromSource;
111
- const shouldHandleTimelineDuplicateShortcut = ({ shiftKey, }) => !shiftKey;
112
- exports.shouldHandleTimelineDuplicateShortcut = shouldHandleTimelineDuplicateShortcut;
113
- const shouldHandleTimelineSplitShortcut = ({ shiftKey, }) => shiftKey;
114
- exports.shouldHandleTimelineSplitShortcut = shouldHandleTimelineSplitShortcut;
115
- const splitSelectedTimelineItems = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequence = exports.splitTimelineSequenceFromSource, }) => {
120
+ exports.splitTimelineSequencesFromSource = splitTimelineSequencesFromSource;
121
+ const splitSelectedTimelineItems = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequences = exports.splitTimelineSequencesFromSource, notify = NotificationCenter_1.showNotification, }) => {
116
122
  var _a;
117
- if (selections.length !== 1) {
123
+ if (selections.length === 0 ||
124
+ selections.some((selection) => selection.type !== 'sequence')) {
118
125
  return null;
119
126
  }
120
- const [selection] = selections;
121
- if (selection.type !== 'sequence') {
122
- return null;
127
+ const eligible = [];
128
+ const skippedReasons = [];
129
+ for (const selection of selections) {
130
+ if (selection.type !== 'sequence') {
131
+ continue;
132
+ }
133
+ const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
134
+ sequences,
135
+ overrideIdsToNodePaths,
136
+ nodePathInfo: selection.nodePathInfo,
137
+ });
138
+ const sequencePropStatuses = propStatuses
139
+ ? remotion_1.Internals.getPropStatusesCtx(propStatuses, selection.nodePathInfo.sequenceSubscriptionKey)
140
+ : undefined;
141
+ const eligibility = (0, exports.getTimelineSequenceSplitEligibility)({
142
+ selection,
143
+ sequence: (_a = track === null || track === void 0 ? void 0 : track.sequence) !== null && _a !== void 0 ? _a : null,
144
+ splitFrame,
145
+ propStatuses: sequencePropStatuses,
146
+ });
147
+ if (eligibility.canSplit) {
148
+ eligible.push({
149
+ nodePathInfo: eligibility.nodePathInfo,
150
+ splitFrame: track
151
+ ? (splitFrame - track.keyframeDisplayOffset) *
152
+ track.keyframePlaybackRate
153
+ : splitFrame,
154
+ });
155
+ }
156
+ else {
157
+ skippedReasons.push(eligibility.reason);
158
+ }
123
159
  }
124
- const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
125
- sequences,
126
- overrideIdsToNodePaths,
127
- nodePathInfo: selection.nodePathInfo,
128
- });
129
- const sequencePropStatuses = propStatuses
130
- ? remotion_1.Internals.getPropStatusesCtx(propStatuses, selection.nodePathInfo.sequenceSubscriptionKey)
131
- : undefined;
132
- const eligibility = (0, exports.getTimelineSequenceSplitEligibility)({
133
- selection,
134
- sequence: (_a = track === null || track === void 0 ? void 0 : track.sequence) !== null && _a !== void 0 ? _a : null,
135
- splitFrame,
136
- propStatuses: sequencePropStatuses,
137
- });
138
- if (!eligibility.canSplit) {
139
- (0, NotificationCenter_1.showNotification)(eligibility.reason, 4000);
160
+ if (eligible.length === 0) {
161
+ notify(selections.length === 1
162
+ ? skippedReasons[0]
163
+ : `None of the ${selections.length} selected clips can be split at the playhead`, 4000);
140
164
  return Promise.resolve(false);
141
165
  }
142
- return splitSequence({
143
- nodePathInfo: eligibility.nodePathInfo,
144
- splitFrame,
166
+ return splitSequences({ sequences: eligible }).then((success) => {
167
+ if (success && skippedReasons.length > 0) {
168
+ notify(`Split ${eligible.length} ${eligible.length === 1 ? 'clip' : 'clips'}. Skipped ${skippedReasons.length} ${skippedReasons.length === 1 ? 'clip' : 'clips'} that could not be split.`, 4000);
169
+ }
170
+ return success;
145
171
  });
146
172
  };
147
173
  exports.splitSelectedTimelineItems = splitSelectedTimelineItems;
@@ -240,6 +240,7 @@ const formatTimelineFieldValueForDisplay = ({ fieldSchema, value, }) => {
240
240
  case 'uv-coordinate':
241
241
  return ((_e = formatUvCoordinateTimelineFieldValueForDisplay({ fieldSchema, value })) !== null && _e !== void 0 ? _e : formatUnknownTimelineValueForDisplay(value));
242
242
  case 'text-content':
243
+ case 'svg-path':
243
244
  return String(value);
244
245
  case 'asset':
245
246
  case 'array':
@@ -6,6 +6,7 @@ const timeline_row_layout_1 = require("./timeline-row-layout");
6
6
  exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
7
7
  const isTimelineFieldStacked = ({ field, transform3DMode, }) => {
8
8
  return (field.typeName === 'text-content' ||
9
+ field.typeName === 'svg-path' ||
9
10
  (transform3DMode &&
10
11
  (field.typeName === 'translate' ||
11
12
  field.typeName === 'rotation-css' ||
@@ -55,17 +55,9 @@ const useDeleteTimelineItems = () => {
55
55
  timelinePosition,
56
56
  });
57
57
  if (deletePromise !== null) {
58
- deletePromise
59
- .then((deleted) => {
60
- if (!deleted) {
61
- return;
62
- }
58
+ const updateSelectionAfterDeletion = () => {
63
59
  const nextSelection = (0, delete_selected_timeline_item_1.getTimelineSelectionAfterDeletingItems)({
64
60
  selections: selectedItems,
65
- sequences,
66
- overrideIdsToNodePaths: overrideIdToNodePathMappings,
67
- propStatuses,
68
- timelinePosition,
69
61
  });
70
62
  if (nextSelection.length === 0) {
71
63
  clearSelection();
@@ -73,8 +65,22 @@ const useDeleteTimelineItems = () => {
73
65
  else {
74
66
  selectItems(nextSelection);
75
67
  }
76
- })
77
- .catch(() => undefined);
68
+ };
69
+ if (selectedItems.some((item) => item.type === 'keyframe')) {
70
+ // Keyframes are removed optimistically. Update selection in the same
71
+ // event so easing segments cannot inherit the deleted segments' indices.
72
+ updateSelectionAfterDeletion();
73
+ deletePromise.catch(() => undefined);
74
+ }
75
+ else {
76
+ deletePromise
77
+ .then((deleted) => {
78
+ if (deleted) {
79
+ updateSelectionAfterDeletion();
80
+ }
81
+ })
82
+ .catch(() => undefined);
83
+ }
78
84
  return;
79
85
  }
80
86
  const easingSelections = (0, update_selected_easing_1.getEasingSelections)(selectedItems);
@@ -8,10 +8,11 @@ export type ExpandedTrackKeyframeRow = {
8
8
  readonly nodePathInfo: SequenceNodePathInfo;
9
9
  readonly rowKey: string;
10
10
  };
11
- export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, }: {
11
+ export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, }: {
12
12
  sequence: TSequence;
13
13
  nodePathInfo: SequenceNodePathInfo;
14
14
  keyframeDisplayOffset: number;
15
+ keyframePlaybackRate: number;
15
16
  }) => {
16
17
  readonly rows: ExpandedTrackKeyframeRow[];
17
18
  readonly expandedHeight: number;