@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
@@ -13,7 +13,6 @@ const timeline_node_path_key_1 = require("../../helpers/timeline-node-path-key")
13
13
  const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
14
14
  const call_add_keyframe_1 = require("./call-add-keyframe");
15
15
  const call_delete_keyframe_1 = require("./call-delete-keyframe");
16
- const get_easing_selection_after_keyframe_delete_1 = require("./get-easing-selection-after-keyframe-delete");
17
16
  const get_keyframe_navigation_1 = require("./get-keyframe-navigation");
18
17
  const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
19
18
  const normalize_font_weight_for_keyframe_1 = require("./normalize-font-weight-for-keyframe");
@@ -21,7 +20,6 @@ const timeline_scroll_logic_1 = require("./timeline-scroll-logic");
21
20
  const TimelineKeyframeDiamondIcon_1 = require("./TimelineKeyframeDiamondIcon");
22
21
  const TimelineKeyframeTracksContext_1 = require("./TimelineKeyframeTracksContext");
23
22
  const TimelineSelection_1 = require("./TimelineSelection");
24
- const update_selected_easing_1 = require("./update-selected-easing");
25
23
  const NAV_BUTTON_SIZE = 14;
26
24
  const INSPECTOR_NAV_BUTTON_WIDTH = NAV_BUTTON_SIZE / 2;
27
25
  const INSPECTOR_PREVIOUS_BUTTON_EXTRA_GAP = 1;
@@ -52,6 +50,7 @@ const navButtonStyle = {
52
50
  outline: 'none',
53
51
  padding: 0,
54
52
  userSelect: 'none',
53
+ WebkitUserSelect: 'none',
55
54
  width: NAV_BUTTON_SIZE,
56
55
  };
57
56
  const inspectorNavButtonStyle = {
@@ -154,15 +153,22 @@ const resolveKeyframeControlTarget = ({ nodePathInfo, tracks, propStatuses, getD
154
153
  propStatus: sequenceSelectedPropStatus,
155
154
  nodePath,
156
155
  fileName: nodePath.absolutePath,
156
+ keyframePlaybackRate: track.keyframePlaybackRate,
157
157
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
158
158
  propStatus: sequenceSelectedPropStatus,
159
159
  keyframeDisplayOffset: track.keyframeDisplayOffset,
160
+ keyframePlaybackRate: track.keyframePlaybackRate,
160
161
  }),
161
- sourceFrame: timelinePosition -
162
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
162
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
163
+ displayFrame: timelinePosition,
164
+ propStatus: sequenceSelectedPropStatus,
165
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
163
166
  propStatus: sequenceSelectedPropStatus,
164
167
  keyframeDisplayOffset: track.keyframeDisplayOffset,
168
+ keyframePlaybackRate: track.keyframePlaybackRate,
165
169
  }),
170
+ keyframePlaybackRate: track.keyframePlaybackRate,
171
+ }),
166
172
  defaultValue: fieldNode.field.fieldSchema.default,
167
173
  dragOverrideValue: ((_c = getDragOverrides(nodePath)) !== null && _c !== void 0 ? _c : {})[fieldNode.field.key],
168
174
  schema: track.sequence.controls.schema,
@@ -186,15 +192,22 @@ const resolveKeyframeControlTarget = ({ nodePathInfo, tracks, propStatuses, getD
186
192
  propStatus: effectSelectedPropStatus,
187
193
  nodePath,
188
194
  fileName: nodePath.absolutePath,
195
+ keyframePlaybackRate: track.keyframePlaybackRate,
189
196
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
190
197
  propStatus: effectSelectedPropStatus,
191
198
  keyframeDisplayOffset: track.keyframeDisplayOffset,
199
+ keyframePlaybackRate: track.keyframePlaybackRate,
192
200
  }),
193
- sourceFrame: timelinePosition -
194
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
201
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
202
+ displayFrame: timelinePosition,
203
+ propStatus: effectSelectedPropStatus,
204
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
195
205
  propStatus: effectSelectedPropStatus,
196
206
  keyframeDisplayOffset: track.keyframeDisplayOffset,
207
+ keyframePlaybackRate: track.keyframePlaybackRate,
197
208
  }),
209
+ keyframePlaybackRate: track.keyframePlaybackRate,
210
+ }),
198
211
  defaultValue: fieldNode.field.fieldSchema.default,
199
212
  dragOverrideValue: getEffectDragOverrides(nodePath, fieldNode.field.effectIndex)[fieldNode.field.key],
200
213
  schema: fieldNode.field.effectSchema,
@@ -314,10 +327,10 @@ const shouldShowTimelineKeyframeNavigation = ({ propStatus, selected, }) => {
314
327
  return isKeyframedStatus(propStatus);
315
328
  };
316
329
  exports.shouldShowTimelineKeyframeNavigation = shouldShowTimelineKeyframeNavigation;
317
- const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, mode = 'timeline', }) => {
330
+ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, keyframePlaybackRate, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, mode = 'timeline', }) => {
318
331
  const videoConfig = (0, remotion_1.useVideoConfig)();
319
332
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
320
- const setFrame = remotion_1.Internals.useTimelineSetFrame();
333
+ const setFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
321
334
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
322
335
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
323
336
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -331,9 +344,15 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
331
344
  const resolvedKeyframeDisplayOffset = (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
332
345
  propStatus,
333
346
  keyframeDisplayOffset,
347
+ keyframePlaybackRate,
334
348
  });
335
- const jsxFrame = timelinePosition - resolvedKeyframeDisplayOffset;
336
- const keyframes = (0, react_1.useMemo)(() => (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset), [propStatus, keyframeDisplayOffset]);
349
+ const jsxFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
350
+ displayFrame: timelinePosition,
351
+ keyframeDisplayOffset: resolvedKeyframeDisplayOffset,
352
+ keyframePlaybackRate,
353
+ propStatus,
354
+ });
355
+ const keyframes = (0, react_1.useMemo)(() => (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset, keyframePlaybackRate), [propStatus, keyframeDisplayOffset, keyframePlaybackRate]);
337
356
  const hasKeyframeAtCurrentFrame = (0, react_1.useMemo)(() => {
338
357
  if (!isKeyframedStatus(propStatus)) {
339
358
  return false;
@@ -373,6 +392,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
373
392
  nodePath,
374
393
  fileName,
375
394
  keyframeDisplayOffset: resolvedKeyframeDisplayOffset,
395
+ keyframePlaybackRate,
376
396
  sourceFrame: jsxFrame,
377
397
  defaultValue,
378
398
  dragOverrideValue,
@@ -386,6 +406,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
386
406
  fileName,
387
407
  jsxFrame,
388
408
  resolvedKeyframeDisplayOffset,
409
+ keyframePlaybackRate,
389
410
  nodePath,
390
411
  nodePathInfo,
391
412
  propStatus,
@@ -452,19 +473,13 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
452
473
  const change = getDeleteChange(target);
453
474
  return change === null ? [] : [{ target, change }];
454
475
  });
455
- const singleDeleteTarget = deleteTargets[0];
456
- const easingSelection = deleteTargets.length === 1 &&
457
- singleDeleteTarget &&
458
- isKeyframedStatus(singleDeleteTarget.target.propStatus) &&
459
- (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(singleDeleteTarget.target.propStatus.interpolationFunction)
460
- ? (0, get_easing_selection_after_keyframe_delete_1.getEasingSelectionAfterKeyframeDelete)({
461
- deletedSourceFrames: [singleDeleteTarget.target.sourceFrame],
462
- keyframeDisplayOffset: singleDeleteTarget.target.keyframeDisplayOffset,
463
- nodePathInfo: singleDeleteTarget.target.nodePathInfo,
464
- propStatus: singleDeleteTarget.target.propStatus,
465
- timelinePosition,
466
- })
467
- : null;
476
+ if (deleteTargets.length === 0) {
477
+ return;
478
+ }
479
+ selectItems(deleteTargets.flatMap(({ target }) => {
480
+ const propertySelection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(target.nodePathInfo);
481
+ return propertySelection === null ? [] : [propertySelection];
482
+ }), { reveal: true });
468
483
  const deleteChanges = deleteTargets.map(({ change }) => change);
469
484
  await (0, call_delete_keyframe_1.callDeleteKeyframes)({
470
485
  sequenceKeyframes: deleteChanges.filter((change) => !hasEffectIndex(change)),
@@ -472,9 +487,6 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
472
487
  setPropStatuses,
473
488
  clientId,
474
489
  });
475
- if (mode === 'timeline' && easingSelection !== null) {
476
- selectItems([easingSelection], { reveal: true });
477
- }
478
490
  return;
479
491
  }
480
492
  const addChanges = keyframeToggleTargets.flatMap((target) => {
@@ -498,7 +510,8 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
498
510
  selectItems(addChanges.map(({ target }) => ({
499
511
  type: 'keyframe',
500
512
  nodePathInfo: target.nodePathInfo,
501
- frame: target.sourceFrame + target.keyframeDisplayOffset,
513
+ frame: target.sourceFrame / target.keyframePlaybackRate +
514
+ target.keyframeDisplayOffset,
502
515
  })), { reveal: true });
503
516
  }
504
517
  }, [
@@ -510,7 +523,6 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
510
523
  mode,
511
524
  selectItems,
512
525
  setPropStatuses,
513
- timelinePosition,
514
526
  ]);
515
527
  const previousDisabled = previousDisplayFrame === null;
516
528
  const nextDisabled = nextDisplayFrame === null;
@@ -129,6 +129,6 @@ const TimelineLayerChildrenToggle = ({ sequence }) => {
129
129
  border: 'none',
130
130
  padding: 0,
131
131
  cursor: 'default',
132
- }, children: jsx_runtime_1.jsx(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: isCollapsed, color: "currentColor" }) }));
132
+ }, children: jsx_runtime_1.jsx(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: isCollapsed, color: colors_1.CURRENT_COLOR }) }));
133
133
  };
134
134
  exports.TimelineLayerChildrenToggle = TimelineLayerChildrenToggle;
@@ -19,7 +19,7 @@ const TimelineListTrack = react_1.default.memo(({ row }) => {
19
19
  var _a;
20
20
  var _b, _c;
21
21
  const { afterDropLineOffset, siblingIndex, track } = row;
22
- return (jsx_runtime_1.jsx(TimelineSequenceItem_1.TimelineSequenceItem, { afterDropLineOffset: afterDropLineOffset, siblingIndex: siblingIndex, connectedCompositions: (_b = track.connectedCompositions) !== null && _b !== void 0 ? _b : noConnectedCompositions, nestedDepth: track.depth, sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, sequenceFrameOffset: track.sequenceFrameOffset, numberOfHiddenDuplicates: Math.max(0, ((_c = (_a = track.displayGroup) === null || _a === void 0 ? void 0 : _a.numberOfSequences) !== null && _c !== void 0 ? _c : 1) - 1), showProvisionalVisibilityToggle: track.nodePathInfo === null && track.displayGroup !== null }));
22
+ return (jsx_runtime_1.jsx(TimelineSequenceItem_1.TimelineSequenceItem, { afterDropLineOffset: afterDropLineOffset, siblingIndex: siblingIndex, connectedCompositions: (_b = track.connectedCompositions) !== null && _b !== void 0 ? _b : noConnectedCompositions, nestedDepth: track.depth, sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, keyframePlaybackRate: track.keyframePlaybackRate, sequenceFrameOffset: track.sequenceFrameOffset, numberOfHiddenDuplicates: Math.max(0, ((_c = (_a = track.displayGroup) === null || _a === void 0 ? void 0 : _a.numberOfSequences) !== null && _c !== void 0 ? _c : 1) - 1), showProvisionalVisibilityToggle: track.nodePathInfo === null && track.displayGroup !== null }));
23
23
  });
24
24
  const TimelineList = () => {
25
25
  const { rows, tracksEnd, virtualItems } = (0, TimelineVirtualization_1.useTimelineVirtualization)();
@@ -39,9 +39,7 @@ const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange,
39
39
  const step = field.fieldSchema.type === 'font-weight' && currentValue % 100 === 0
40
40
  ? 100
41
41
  : (configuredStep !== null && configuredStep !== void 0 ? configuredStep : 1);
42
- const allowStepMismatch = field.fieldSchema.type === 'font-weight' ||
43
- field.group === 'crop' ||
44
- ('kind' in field && field.kind === 'effect-field');
42
+ const integerOnly = field.fieldSchema.type === 'number' && field.fieldSchema.integer === true;
45
43
  const formatter = (0, react_1.useCallback)((v) => {
46
44
  return (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
47
45
  fieldSchema: field.fieldSchema,
@@ -56,6 +54,6 @@ const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange,
56
54
  ? ((_b = field.fieldSchema.max) !== null && _b !== void 0 ? _b : Infinity)
57
55
  : field.fieldSchema.type === 'font-weight'
58
56
  ? 1000
59
- : Infinity, step: step, dragSensitivity: field.fieldSchema.type === 'font-weight' && step === 100 ? 0.1 : 1, formatter: formatter, rightAlign: false, allowStepMismatch: allowStepMismatch }));
57
+ : Infinity, step: step, dragSensitivity: field.fieldSchema.type === 'font-weight' && step === 100 ? 0.1 : 1, formatter: formatter, rightAlign: false, allowStepMismatch: true, integerOnly: integerOnly }));
60
58
  };
61
59
  exports.TimelineNumberField = TimelineNumberField;
@@ -62,7 +62,7 @@ const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragE
62
62
  if (field.typeName === 'enum') {
63
63
  return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineEnumField_1.TimelineEnumField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
64
64
  }
65
- if (field.typeName === 'text-content') {
65
+ if (field.typeName === 'text-content' || field.typeName === 'svg-path') {
66
66
  return (jsx_runtime_1.jsx(TimelineTextContentField_1.TimelineTextContentField, { effectiveValue: effectiveValue, field: field, nodePath: scaleLockNodePath, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }));
67
67
  }
68
68
  if (field.typeName === 'font-family') {
@@ -1,17 +1,17 @@
1
- import { type CanvasSelectionInteraction, type CanvasSelectionItem, type CanvasSelectionSnapshot } from '@remotion/canvas';
1
+ import type { CanvasSelectionInteraction, CanvasSelectionItem, CanvasSelectionSnapshot } from '@remotion/canvas';
2
2
  import { type SequenceNodePathMutation } from '@remotion/studio-shared';
3
3
  import React, { type CSSProperties } from 'react';
4
4
  import { type GetDragOverrides, type GetEffectDragOverrides, type PropStatuses } from 'remotion';
5
5
  import type { SequenceNodePathInfo, TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
6
6
  import { type GetIsExpanded } from '../ExpandedTracksProvider';
7
- export declare const TIMELINE_SELECTED_BACKGROUND = "#3B3F42";
8
- export declare const TIMELINE_EXPANDED_SELECTED_BACKGROUND = "rgb(31,36,40)";
9
- export declare const TIMELINE_HOVER_BACKGROUND = "rgba(255, 255, 255, 0.05)";
10
- export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "#B0B0B0";
11
- export declare const TIMELINE_SELECTED_LABEL_TEXT = "black";
7
+ export declare const TIMELINE_SELECTED_BACKGROUND = "var(--remotion-studio-timeline-selected-background-color)";
8
+ export declare const TIMELINE_EXPANDED_SELECTED_BACKGROUND = "var(--remotion-studio-background)";
9
+ export declare const TIMELINE_HOVER_BACKGROUND = "var(--remotion-studio-white-alpha-05)";
10
+ export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "var(--remotion-studio-timeline-selected-label-background-color)";
11
+ export declare const TIMELINE_SELECTED_LABEL_TEXT = "var(--remotion-studio-black)";
12
12
  export declare const TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = 2;
13
13
  export declare const getTimelineSelectedLabelStyle: (selected: boolean, subcategory: boolean) => CSSProperties;
14
- export declare const getTimelineColor: (selected: boolean, subcategory: boolean) => "black" | "rgba(255, 255, 255, 0.8)";
14
+ export declare const getTimelineColor: (selected: boolean, subcategory: boolean) => "var(--remotion-studio-black)" | "var(--remotion-studio-white-alpha-80)";
15
15
  export declare const getTimelineSelectedTrackHighlightStyle: (timelineWidth: number, backgroundColor?: string) => CSSProperties;
16
16
  export declare const getTimelineRowHighlightBackground: ({ showSelectedBackground, selected, containsSelection, hovered, selectedBackground, }: {
17
17
  readonly showSelectedBackground: boolean;
@@ -20,8 +20,8 @@ export declare const getTimelineRowHighlightBackground: ({ showSelectedBackgroun
20
20
  readonly hovered: boolean;
21
21
  readonly selectedBackground: string;
22
22
  }) => string | undefined;
23
- export declare const TIMELINE_BACKGROUND = "#15181B";
24
- export declare const TIMELINE_TICKS_BACKGROUND = "rgb(31,36,40)";
23
+ export declare const TIMELINE_BACKGROUND = "var(--remotion-studio-timeline-background-color)";
24
+ export declare const TIMELINE_TICKS_BACKGROUND = "var(--remotion-studio-background)";
25
25
  export type TimelineSelection = CanvasSelectionItem;
26
26
  export type TimelineEasingSelection = Extract<TimelineSelection, {
27
27
  type: 'easing';
@@ -27,6 +27,7 @@ const timeline_refs_1 = require("./timeline-refs");
27
27
  const timeline_scroll_logic_1 = require("./timeline-scroll-logic");
28
28
  const TimelineClipboardKeybindings_1 = require("./TimelineClipboardKeybindings");
29
29
  const TimelineDeleteKeybindings_1 = require("./TimelineDeleteKeybindings");
30
+ const { EMPTY_CANVAS_SELECTION, getCanvasSelectionAfterInteraction, getCanvasSequenceSelectionKey, useCanvasSelectionController, } = canvas_1.CanvasInternals;
30
31
  exports.TIMELINE_SELECTED_BACKGROUND = colors_1.TIMELINE_SELECTED_BACKGROUND_COLOR;
31
32
  exports.TIMELINE_EXPANDED_SELECTED_BACKGROUND = colors_1.BACKGROUND;
32
33
  exports.TIMELINE_HOVER_BACKGROUND = colors_1.WHITE_ALPHA_05;
@@ -81,8 +82,8 @@ const shouldSelectTimelineRowOnPointerDown = ({ selected, shiftKey, metaKey, ctr
81
82
  return (!selected || (0, exports.isTimelineSelectionModifierEvent)({ shiftKey, metaKey, ctrlKey }));
82
83
  };
83
84
  exports.shouldSelectTimelineRowOnPointerDown = shouldSelectTimelineRowOnPointerDown;
84
- exports.EMPTY_TIMELINE_SELECTION_STATE = canvas_1.EMPTY_CANVAS_SELECTION;
85
- exports.getTimelineSelectionAfterInteraction = canvas_1.getCanvasSelectionAfterInteraction;
85
+ exports.EMPTY_TIMELINE_SELECTION_STATE = EMPTY_CANVAS_SELECTION;
86
+ exports.getTimelineSelectionAfterInteraction = getCanvasSelectionAfterInteraction;
86
87
  const getAvailableTimelineSelectionState = ({ availableKeys, availableItemsByKey, state, }) => {
87
88
  if (state.selectedItems.length === 0 && state.anchor === null) {
88
89
  return state;
@@ -292,6 +293,11 @@ const nodePathDescendsFrom = (descendant, ancestor) => {
292
293
  }
293
294
  return ancestor.auxiliaryKeys.every((key, i) => descendant.auxiliaryKeys[i] === key);
294
295
  };
296
+ const timelineRowContainsSelection = (nodePathInfo, selection) => selection.type !== 'guide' &&
297
+ (nodePathDescendsFrom(selection.nodePathInfo, nodePathInfo) ||
298
+ ((selection.type === 'keyframe' || selection.type === 'easing') &&
299
+ (0, timeline_node_path_key_1.timelineNodePathInfoToKey)(selection.nodePathInfo) ===
300
+ (0, timeline_node_path_key_1.timelineNodePathInfoToKey)(nodePathInfo)));
295
301
  const getSelectableTimelineSequenceSelections = (tracks) => {
296
302
  return tracks.flatMap((track) => {
297
303
  if (track.nodePathInfo === null ||
@@ -377,6 +383,7 @@ const getSelectableTimelineItems = ({ getDragOverrides, getEffectDragOverrides,
377
383
  nodePath: nodePathInfo.sequenceSubscriptionKey,
378
384
  propStatuses,
379
385
  keyframeDisplayOffset: track.keyframeDisplayOffset,
386
+ keyframePlaybackRate: track.keyframePlaybackRate,
380
387
  getDragOverrides,
381
388
  getEffectDragOverrides,
382
389
  timelinePosition,
@@ -405,7 +412,7 @@ const getSelectableTimelineItems = ({ getDragOverrides, getEffectDragOverrides,
405
412
  });
406
413
  };
407
414
  exports.getSelectableTimelineItems = getSelectableTimelineItems;
408
- exports.getTimelineSequenceSelectionKey = canvas_1.getCanvasSequenceSelectionKey;
415
+ exports.getTimelineSequenceSelectionKey = getCanvasSequenceSelectionKey;
409
416
  const TimelineSelectAllKeybindings = ({ timeline }) => {
410
417
  const keybindings = (0, use_keybinding_1.useKeybinding)();
411
418
  const { canSelect } = (0, exports.useTimelineSelection)();
@@ -539,7 +546,8 @@ const TimelineSelectionProvider = ({ children }) => {
539
546
  (previewServerState.type === 'connected' ||
540
547
  window.remotion_isReadOnlyStudio);
541
548
  const keyframeOperationsAvailable = (0, browser_studio_operations_1.canUseKeyframeOperations)();
542
- const selectionController = (0, canvas_1.useCanvasSelectionController)();
549
+ const effectOperationsAvailable = (0, browser_studio_operations_1.canUseEffectOperations)();
550
+ const selectionController = useCanvasSelectionController();
543
551
  const selectionState = (0, canvas_1.useCanvasSelection)(selectionController);
544
552
  const selectionScope = (0, react_1.useRef)(null);
545
553
  const marqueeSelectableItems = (0, react_1.useRef)(new Map());
@@ -558,7 +566,8 @@ const TimelineSelectionProvider = ({ children }) => {
558
566
  const canSelectItem = (0, react_1.useCallback)((item) => canSelect &&
559
567
  (!window.remotion_isReadOnlyStudio ||
560
568
  keyframeOperationsAvailable ||
561
- item.type === 'sequence'), [canSelect, keyframeOperationsAvailable]);
569
+ (effectOperationsAvailable && item.type === 'sequence-effect') ||
570
+ item.type === 'sequence'), [canSelect, effectOperationsAvailable, keyframeOperationsAvailable]);
562
571
  const availableSelectionState = selectionScope.current === timelineSelectionScope
563
572
  ? selectionState
564
573
  : exports.EMPTY_TIMELINE_SELECTION_STATE;
@@ -713,8 +722,7 @@ const TimelineSelectionProvider = ({ children }) => {
713
722
  selectionController.clear();
714
723
  }, [selectionController]);
715
724
  const containsSelection = (0, react_1.useCallback)((nodePathInfo) => {
716
- return availableSelectedItems.some((selected) => selected.type !== 'guide' &&
717
- nodePathDescendsFrom(selected.nodePathInfo, nodePathInfo));
725
+ return availableSelectedItems.some((selected) => timelineRowContainsSelection(nodePathInfo, selected));
718
726
  }, [availableSelectedItems]);
719
727
  const remapSelectionNodePaths = (0, react_1.useCallback)((mutations) => {
720
728
  const remapItem = (item) => {
@@ -1111,8 +1119,7 @@ const useTimelineRowContainsSelection = (nodePathInfo) => {
1111
1119
  }
1112
1120
  return selectionContext
1113
1121
  .getSnapshot()
1114
- .selectedItems.some((selected) => selected.type !== 'guide' &&
1115
- nodePathDescendsFrom(selected.nodePathInfo, nodePathInfo));
1122
+ .selectedItems.some((selected) => timelineRowContainsSelection(nodePathInfo, selected));
1116
1123
  }, [nodePathInfo, selectionContext]);
1117
1124
  return (0, use_sync_external_store_1.useSyncExternalStore)(selectionContext.subscribe, getContainsSelection, getContainsSelection);
1118
1125
  };
@@ -2,7 +2,9 @@ import React from 'react';
2
2
  import type { TSequence } from 'remotion';
3
3
  import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
4
4
  export declare const TimelineSequence: React.NamedExoticComponent<{
5
- readonly s: TSequence;
5
+ readonly s: TSequence & {
6
+ loopDisplay: import("@remotion/canvas").TimelineLoopDisplay | undefined;
7
+ };
6
8
  readonly connectedCompositions: readonly import("remotion").AnyComposition[];
7
9
  readonly nodePathInfo: SequenceNodePathInfo | null;
8
10
  readonly sequenceFrameOffset: number;
@@ -52,6 +52,7 @@ const AudioWaveform_1 = require("../AudioWaveform");
52
52
  const ConfirmationDialog_1 = require("../ConfirmationDialog");
53
53
  const ContextMenu_1 = require("../ContextMenu");
54
54
  const InitialCompositionLoader_1 = require("../InitialCompositionLoader");
55
+ const SequencePropsSubscriptionProvider_1 = require("../SequencePropsSubscriptionProvider");
55
56
  const use_select_asset_1 = require("../use-select-asset");
56
57
  const disable_sequence_interactivity_1 = require("./disable-sequence-interactivity");
57
58
  const duplicate_selected_timeline_item_1 = require("./duplicate-selected-timeline-item");
@@ -61,6 +62,7 @@ const get_timeline_media_start_frame_1 = require("./get-timeline-media-start-fra
61
62
  const get_timeline_sequence_visible_layout_1 = require("./get-timeline-sequence-visible-layout");
62
63
  const imperative_state_1 = require("./imperative-state");
63
64
  const LoopedTimelineIndicators_1 = require("./LoopedTimelineIndicators");
65
+ const split_selected_timeline_item_1 = require("./split-selected-timeline-item");
64
66
  const timeline_asset_link_1 = require("./timeline-asset-link");
65
67
  const TimelineImageInfo_1 = require("./TimelineImageInfo");
66
68
  const TimelineSelection_1 = require("./TimelineSelection");
@@ -73,6 +75,7 @@ const use_asset_timeline_context_menu_1 = require("./use-asset-timeline-context-
73
75
  const use_delete_timeline_items_1 = require("./use-delete-timeline-items");
74
76
  const use_open_sequence_in_apps_1 = require("./use-open-sequence-in-apps");
75
77
  const use_sequence_freeze_frame_menu_item_1 = require("./use-sequence-freeze-frame-menu-item");
78
+ const { getTimelineVisibleDuration, getTimelineVisibleStart } = canvas_1.CanvasInternals;
76
79
  const TimelineSequenceFn = ({ s, connectedCompositions, nodePathInfo, sequenceFrameOffset, cascadedStart, localStart, }) => {
77
80
  const windowWidth = (0, react_1.useContext)(TimelineWidthProvider_1.TimelineWidthContext);
78
81
  if (windowWidth === null) {
@@ -125,6 +128,7 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
125
128
  const isAsset = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset';
126
129
  const ref = (0, react_1.useRef)(null);
127
130
  const { onSelect, selectable, selected, selectionItem } = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
131
+ const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(nodePathInfo);
128
132
  (0, TimelineSelection_1.useTimelineMarqueeSelectableItem)(selectionItem, ref);
129
133
  const onPointerDown = (0, react_1.useCallback)((e) => {
130
134
  if (e.button === 0) {
@@ -147,7 +151,7 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
147
151
  }, [fromCanUpdate, onMoveDragPointerDown, onSelect, selected]);
148
152
  const frame = (0, remotion_1.useCurrentFrame)();
149
153
  const relativeFrame = frame - s.from;
150
- const sequenceFrame = relativeFrame + sequenceFrameOffset;
154
+ const sequenceFrame = relativeFrame * s.sequencePlaybackRate + sequenceFrameOffset;
151
155
  const relativeFrameWithPremount = relativeFrame + ((_a = s.premountDisplay) !== null && _a !== void 0 ? _a : 0);
152
156
  const relativeFrameWithPostmount = relativeFrame - displayDurationInFrames;
153
157
  const roundedFrame = Math.round(sequenceFrame * 100) / 100;
@@ -166,9 +170,9 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
166
170
  ...style,
167
171
  background: negativeStart ? colors_1.TRANSPARENT : style.background,
168
172
  border: negativeStart ? 'none' : style.border,
169
- opacity: selected || isAsset ? 1 : 0.75,
173
+ opacity: selected || containsSelection || isAsset ? 1 : 0.75,
170
174
  };
171
- }, [isAsset, negativeStart, selected, style]);
175
+ }, [containsSelection, isAsset, negativeStart, selected, style]);
172
176
  const content = (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [premount ? (jsx_runtime_1.jsx("div", { style: {
173
177
  left: premount.left,
174
178
  width: premount.width,
@@ -238,26 +242,40 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
238
242
  // If a duration is 1, it is essentially a still and it should have width 0
239
243
  // Some compositions may not be longer than their media duration,
240
244
  // if that is the case, it needs to be asynchronously determined
241
- var _a, _b, _c, _d, _e;
242
- var _f, _g, _h, _j, _k, _l, _m;
245
+ var _a, _b, _c, _d, _e, _f, _g, _h;
246
+ var _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
243
247
  const video = remotion_1.Internals.useVideo();
244
248
  const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
249
+ const overrideIdToNodePathMappingsRef = (0, react_1.useContext)(SequencePropsSubscriptionProvider_1.OverrideIdToNodePathMappingsRefContext);
245
250
  const renderWindow = (0, react_1.useContext)(TimelineViewport_1.TimelineViewportContext);
246
251
  const mediaDurationDragLimitsRegistry = (0, react_1.useContext)(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceMediaDurationDragLimitsContext);
247
252
  const dragAwareDoubleClick = (0, react_1.useMemo)(() => (0, drag_aware_double_click_1.createDragAwareDoubleClickTracker)(), []);
248
253
  const mediaMetadata = (0, use_media_metadata_1.useMediaMetadata)(s.type === 'audio' || s.type === 'video' ? s.src : null);
249
254
  const extendVideoLastFrame = (0, is_video_with_last_frame_hold_1.isVideoWithLastFrameHold)(s);
255
+ const mediaStartFrame = s.type === 'audio' || s.type === 'video'
256
+ ? (0, get_timeline_media_start_frame_1.getTimelineMediaStartFrame)({
257
+ startMediaFrom: s.startMediaFrom,
258
+ mediaFrameAtSequenceZero: s.mediaFrameAtSequenceZero,
259
+ sequenceFrameOffset,
260
+ playbackRate: s.playbackRate,
261
+ })
262
+ : 0;
263
+ const mediaLoopStartFrame = mediaStartFrame -
264
+ ((_j = (_a = s.loopDisplay) === null || _a === void 0 ? void 0 : _a.mediaOffsetInFrames) !== null && _j !== void 0 ? _j : 0) *
265
+ (s.type === 'audio' || s.type === 'video'
266
+ ? s.playbackRate * s.sequencePlaybackRate
267
+ : 0);
250
268
  const naturalMediaDuration = (s.type === 'audio' || s.type === 'video') &&
251
269
  mediaMetadata !== null &&
252
270
  s.playbackRate > 0
253
- ? Math.max(0, (mediaMetadata.duration * ((_f = video === null || video === void 0 ? void 0 : video.fps) !== null && _f !== void 0 ? _f : 30) -
271
+ ? Math.max(0, (mediaMetadata.duration * ((_k = video === null || video === void 0 ? void 0 : video.fps) !== null && _k !== void 0 ? _k : 30) -
254
272
  (0, get_timeline_media_start_frame_1.getTimelineMediaStartFrame)({
255
273
  startMediaFrom: s.startMediaFrom,
256
274
  mediaFrameAtSequenceZero: s.mediaFrameAtSequenceZero,
257
275
  sequenceFrameOffset,
258
276
  playbackRate: s.playbackRate,
259
277
  })) /
260
- s.playbackRate)
278
+ (s.playbackRate * s.sequencePlaybackRate))
261
279
  : null;
262
280
  const maxMediaDuration = s.type === 'sequence' || s.type === 'image' || extendVideoLastFrame
263
281
  ? Infinity
@@ -278,22 +296,22 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
278
296
  };
279
297
  }, [originalLocation]);
280
298
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
281
- const nodePath = (_g = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.sequenceSubscriptionKey) !== null && _g !== void 0 ? _g : null;
299
+ const nodePath = (_l = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.sequenceSubscriptionKey) !== null && _l !== void 0 ? _l : null;
282
300
  const propStatusesForOverride = (0, react_1.useMemo)(() => {
283
301
  return nodePath
284
302
  ? remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)
285
303
  : undefined;
286
304
  }, [propStatuses, nodePath]);
287
305
  const durationCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
288
- ((_a = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _a === void 0 ? void 0 : _a.status) === 'static');
306
+ ((_b = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _b === void 0 ? void 0 : _b.status) === 'static');
289
307
  const durationCanResize = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
290
308
  (0, TimelineSequenceRightEdgeDragHandle_1.canResizeTimelineSequenceDuration)({
291
309
  status: propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames,
292
310
  }));
293
311
  const fromCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
294
- ((_b = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.from) === null || _b === void 0 ? void 0 : _b.status) === 'static');
312
+ ((_c = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.from) === null || _c === void 0 ? void 0 : _c.status) === 'static');
295
313
  const trimBeforeCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
296
- ((_c = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.trimBefore) === null || _c === void 0 ? void 0 : _c.status) === 'static');
314
+ ((_d = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.trimBefore) === null || _d === void 0 ? void 0 : _d.status) === 'static');
297
315
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
298
316
  const previewConnected = previewServerState.type === 'connected';
299
317
  const previewInteractive = previewConnected && (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
@@ -356,7 +374,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
356
374
  const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenSource;
357
375
  const canDeleteFromSource = Boolean(nodePath && (validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source));
358
376
  const deleteDisabled = !previewInteractive || !s.controls || !canDeleteFromSource;
359
- const isProgrammaticallyDuplicated = ((_h = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.numberOfSequencesWithThisNodePath) !== null && _h !== void 0 ? _h : 1) > 1;
377
+ const isProgrammaticallyDuplicated = ((_m = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.numberOfSequencesWithThisNodePath) !== null && _m !== void 0 ? _m : 1) > 1;
360
378
  const duplicateDisabled = deleteDisabled || isProgrammaticallyDuplicated;
361
379
  const disableInteractivityDisabled = !previewInteractive ||
362
380
  !s.showInTimeline ||
@@ -377,6 +395,26 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
377
395
  }
378
396
  (0, duplicate_selected_timeline_item_1.duplicateSequencesFromSource)(selectedSequenceNodePathInfos, confirm).catch(() => undefined);
379
397
  }, [confirm, previewInteractive, selectedSequenceNodePathInfos]);
398
+ const onSplitSelectedSequences = (0, react_1.useCallback)(() => {
399
+ var _a;
400
+ if (!previewInteractive || selectedSequenceNodePathInfos === null) {
401
+ return;
402
+ }
403
+ (_a = (0, split_selected_timeline_item_1.splitSelectedTimelineItems)({
404
+ selections: selectedItems,
405
+ sequences,
406
+ overrideIdsToNodePaths: overrideIdToNodePathMappingsRef.current,
407
+ propStatuses,
408
+ splitFrame: (0, imperative_state_1.getCurrentFrame)(),
409
+ })) === null || _a === void 0 ? void 0 : _a.catch(() => undefined);
410
+ }, [
411
+ overrideIdToNodePathMappingsRef,
412
+ previewInteractive,
413
+ propStatuses,
414
+ selectedItems,
415
+ selectedSequenceNodePathInfos,
416
+ sequences,
417
+ ]);
380
418
  const onDeleteSequenceFromSource = (0, react_1.useCallback)(() => {
381
419
  if (!(validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source) ||
382
420
  !nodePath ||
@@ -433,8 +471,10 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
433
471
  return (0, get_sequence_context_menu_items_1.getMultiSequenceContextMenuItems)({
434
472
  deleteDisabled: !previewInteractive,
435
473
  duplicateDisabled: !previewInteractive,
474
+ splitDisabled: !previewInteractive,
436
475
  onDeleteSelectedSequences,
437
476
  onDuplicateSelectedSequences,
477
+ onSplitSelectedSequences,
438
478
  });
439
479
  }
440
480
  const splitMenuItem = (0, get_sequence_split_menu_item_1.getSequenceSplitMenuItem)({
@@ -513,6 +553,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
513
553
  onDisableSequenceInteractivity,
514
554
  onDuplicateSequenceFromSource,
515
555
  onDuplicateSelectedSequences,
556
+ onSplitSelectedSequences,
516
557
  openInCodingAgent,
517
558
  openInEditor,
518
559
  originalLocation,
@@ -534,7 +575,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
534
575
  const { onPointerDown: onMoveDragPointerDown } = (0, TimelineSequenceRightEdgeDragHandle_1.useTimelineSequenceFromDrag)({
535
576
  nodePathInfo,
536
577
  windowWidth,
537
- timelineDurationInFrames: (_j = video === null || video === void 0 ? void 0 : video.durationInFrames) !== null && _j !== void 0 ? _j : 1,
578
+ timelineDurationInFrames: (_o = video === null || video === void 0 ? void 0 : video.durationInFrames) !== null && _o !== void 0 ? _o : 1,
538
579
  onDragEnd: dragAwareDoubleClick.endPointerGesture,
539
580
  });
540
581
  if (!video) {
@@ -596,7 +637,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
596
637
  }, [visibleLayout]);
597
638
  const showLeftBorderRadius = (visibleLayout === null || visibleLayout === void 0 ? void 0 : visibleLayout.leftEdgeVisible) === true &&
598
639
  localStart >= 0 &&
599
- ((_k = s.trimBefore) !== null && _k !== void 0 ? _k : 0) === 0 &&
640
+ ((_p = s.trimBefore) !== null && _p !== void 0 ? _p : 0) === 0 &&
600
641
  (s.type === 'sequence' ||
601
642
  s.type === 'image' ||
602
643
  (0, get_timeline_media_start_frame_1.getTimelineMediaStartFrame)({
@@ -616,15 +657,15 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
616
657
  Math.ceil(Math.min(s.duration, video.durationInFrames - s.from, maxMediaDuration !== null && maxMediaDuration !== void 0 ? maxMediaDuration : Infinity)) === Math.ceil(naturalMediaDuration);
617
658
  const parentSequence = sequences.find((candidate) => candidate.id === s.parent);
618
659
  const parentEnd = parentSequence
619
- ? (0, canvas_1.getTimelineVisibleStart)(parentSequence, sequences) +
620
- (0, canvas_1.getTimelineVisibleDuration)(parentSequence, sequences)
660
+ ? getTimelineVisibleStart(parentSequence, sequences) +
661
+ getTimelineVisibleDuration(parentSequence, sequences)
621
662
  : video.durationInFrames;
622
663
  const endsAtContainerBoundary = Math.ceil(s.from + displayDurationInFrames) >=
623
664
  Math.ceil(Math.min(parentEnd, video.durationInFrames));
624
665
  const hasImplicitMediaDuration = (s.type === 'audio' || s.type === 'video') &&
625
- ((_d = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _d === void 0 ? void 0 : _d.status) === 'static' &&
666
+ ((_e = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _e === void 0 ? void 0 : _e.status) === 'static' &&
626
667
  propStatusesForOverride.durationInFrames.codeValue === undefined;
627
- const durationInFramesCodeValue = ((_e = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _e === void 0 ? void 0 : _e.status) === 'static'
668
+ const durationInFramesCodeValue = ((_f = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames) === null || _f === void 0 ? void 0 : _f.status) === 'static'
628
669
  ? propStatusesForOverride.durationInFrames.codeValue
629
670
  : null;
630
671
  const explicitDurationInFrames = typeof durationInFramesCodeValue === 'number' &&
@@ -638,7 +679,9 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
638
679
  displayDurationInFrames: s.duration,
639
680
  displayStart: s.from,
640
681
  effectiveMaxMediaDuration,
641
- explicitDurationInFrames,
682
+ explicitDurationInFrames: explicitDurationInFrames === null
683
+ ? null
684
+ : explicitDurationInFrames / s.sequencePlaybackRate,
642
685
  hasImplicitDuration: hasImplicitMediaDuration,
643
686
  naturalMediaDuration,
644
687
  timelineDurationInFrames: video.durationInFrames,
@@ -725,10 +768,11 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
725
768
  visibleLayout.leftEdgeVisible &&
726
769
  negativeStartWidth === 0 &&
727
770
  nodePathInfo &&
728
- validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceLeftEdgeDragHandle, { nodePathInfo: nodePathInfo, windowWidth: windowWidth, timelineDurationInFrames: (_l = video.durationInFrames) !== null && _l !== void 0 ? _l : 1, onDragEnd: dragAwareDoubleClick.endPointerGesture, onSelect: onSelect, selected: selected })) : null, showRightEdgeDragHandle &&
771
+ validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceLeftEdgeDragHandle, { cursor: (0, TimelineSequenceRightEdgeDragHandle_1.isCascadingSequence)(s) ? 'ew-resize' : 'e-resize', nodePathInfo: nodePathInfo, windowWidth: windowWidth, timelineDurationInFrames: (_q = video.durationInFrames) !== null && _q !== void 0 ? _q : 1, initialEdgeFrame: s.from, fps: video.fps, onDragEnd: dragAwareDoubleClick.endPointerGesture, onSelect: onSelect, selected: selected })) : null, showRightEdgeDragHandle &&
729
772
  visibleLayout.rightEdgeVisible &&
730
773
  nodePathInfo &&
731
- validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceRightEdgeDragHandle, { nodePathInfo: nodePathInfo, mediaDurationDragLimits: mediaDurationDragLimits, windowWidth: windowWidth, timelineDurationInFrames: (_m = video.durationInFrames) !== null && _m !== void 0 ? _m : 1, onDragEnd: dragAwareDoubleClick.endPointerGesture, onSelect: onSelect, selected: selected })) : null] }), children: [s.type === 'audio' && visibleLayout.media ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(AudioWaveform_1.AudioWaveform, { src: s.src, height: timeline_layout_1.TIMELINE_LAYER_HEIGHT_AUDIO, doesVolumeChange: s.doesVolumeChange, muted: s.muted, visualizationWidth: visibleLayout.media.width, startFrom: s.startMediaFrom, durationInFrames: s.duration, displayOffsetInFrames: mediaDisplayOffsetInFrames, displayDurationInFrames: mediaDisplayDurationInFrames, volume: s.volume, playbackRate: s.playbackRate, loopDisplay: s.loopDisplay }) })) : null, s.type === 'video' && visibleLayout.media ? (jsx_runtime_1.jsx(TimelineVideoInfo_1.TimelineVideoInfo, { src: s.src, visualizationWidth: visibleLayout.media.width, displayOffsetInFrames: mediaDisplayOffsetInFrames, displayDurationInFrames: mediaDisplayDurationInFrames, startMediaFrom: s.startMediaFrom, mediaFrameAtSequenceZero: s.mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, playbackRate: s.playbackRate, volume: s.volume, muted: s.muted, doesVolumeChange: s.doesVolumeChange, marginLeft: visibleLayout.media.left, loopDisplay: s.loopDisplay, frozenMediaFrame: s.frozenMediaFrame, extendLastFrame: extendVideoLastFrame })) : null, s.type === 'image' && visibleLayout.media ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(TimelineImageInfo_1.TimelineImageInfo, { src: s.src, offsetInPixels: visibleLayout.media.offset }) })) : null, s.loopDisplay === undefined ? null : (jsx_runtime_1.jsx(LoopedTimelineIndicators_1.LoopedTimelineIndicator, { loops: s.loopDisplay.numberOfTimes, fullWidth: width, visibleOffset: visibleLayout.cropLeft, visibleWidth: visibleLayout.width }))] }));
774
+ validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceRightEdgeDragHandle, { cursor: (0, TimelineSequenceRightEdgeDragHandle_1.isCascadingSequence)(s) ? 'ew-resize' : 'w-resize', nodePathInfo: nodePathInfo, mediaDurationDragLimits: mediaDurationDragLimits, windowWidth: windowWidth, timelineDurationInFrames: (_r = video.durationInFrames) !== null && _r !== void 0 ? _r : 1, initialEdgeFrame: s.from +
775
+ Math.max(0, Math.min(displayDurationInFrames, effectiveMaxMediaDuration !== null && effectiveMaxMediaDuration !== void 0 ? effectiveMaxMediaDuration : Infinity, video.durationInFrames - s.from)), fps: video.fps, onDragEnd: dragAwareDoubleClick.endPointerGesture, onSelect: onSelect, selected: selected })) : null] }), children: [s.type === 'audio' && visibleLayout.media ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(AudioWaveform_1.AudioWaveform, { src: s.src, height: timeline_layout_1.TIMELINE_LAYER_HEIGHT_AUDIO, doesVolumeChange: s.doesVolumeChange, muted: s.muted, visualizationWidth: visibleLayout.media.width, startFrom: mediaLoopStartFrame, durationInFrames: s.duration, displayOffsetInFrames: mediaDisplayOffsetInFrames, displayDurationInFrames: mediaDisplayDurationInFrames, volume: s.volume, playbackRate: s.playbackRate * s.sequencePlaybackRate, loopDisplay: s.loopDisplay, loopDisplayOffsetInFrames: (_s = (_g = s.loopDisplay) === null || _g === void 0 ? void 0 : _g.phaseOffsetInFrames) !== null && _s !== void 0 ? _s : 0 }) })) : null, s.type === 'video' && visibleLayout.media ? (jsx_runtime_1.jsx(TimelineVideoInfo_1.TimelineVideoInfo, { src: s.src, visualizationWidth: visibleLayout.media.width, displayOffsetInFrames: mediaDisplayOffsetInFrames, displayDurationInFrames: mediaDisplayDurationInFrames, startMediaFrom: s.startMediaFrom, mediaFrameAtSequenceZero: mediaLoopStartFrame, sequenceFrameOffset: 0, playbackRate: s.playbackRate * s.sequencePlaybackRate, volume: s.volume, muted: s.muted, doesVolumeChange: s.doesVolumeChange, marginLeft: visibleLayout.media.left, loopDisplay: s.loopDisplay, loopDisplayOffsetInFrames: (_t = (_h = s.loopDisplay) === null || _h === void 0 ? void 0 : _h.phaseOffsetInFrames) !== null && _t !== void 0 ? _t : 0, frozenMediaFrame: s.frozenMediaFrame, extendLastFrame: extendVideoLastFrame })) : null, s.type === 'image' && visibleLayout.media ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(TimelineImageInfo_1.TimelineImageInfo, { src: s.src, offsetInPixels: visibleLayout.media.offset }) })) : null, s.loopDisplay === undefined ? null : (jsx_runtime_1.jsx(LoopedTimelineIndicators_1.LoopedTimelineIndicator, { loops: s.loopDisplay.numberOfTimes, phase: s.loopDisplay.phaseOffsetInFrames / s.loopDisplay.durationInFrames, fullWidth: width, visibleOffset: visibleLayout.cropLeft, visibleWidth: visibleLayout.width }))] }));
732
776
  return previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: sequence })) : (sequence);
733
777
  };
734
778
  exports.TimelineSequence = react_1.default.memo(TimelineSequenceFn);
@@ -15,6 +15,7 @@ const relativeFrameStyle = {
15
15
  whiteSpace: 'nowrap',
16
16
  pointerEvents: 'none',
17
17
  userSelect: 'none',
18
+ WebkitUserSelect: 'none',
18
19
  };
19
20
  const snowflakeStyle = {
20
21
  flexShrink: 0,