@remotion/studio 4.0.527 → 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 (258) 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/CodeFrame.js +1 -1
  5. package/dist/components/ColorPicker/checker.d.ts +1 -1
  6. package/dist/components/CurrentAsset.js +3 -2
  7. package/dist/components/EditorRuler/Ruler.js +6 -3
  8. package/dist/components/EffectPickerModal.js +69 -43
  9. package/dist/components/ElementInstallConfirmation.js +3 -3
  10. package/dist/components/ElementLibrariesSettings.d.ts +2 -0
  11. package/dist/components/ElementLibrariesSettings.js +200 -0
  12. package/dist/components/InitialCompositionLoader.js +3 -1
  13. package/dist/components/InspectorOpenInEditor.js +13 -0
  14. package/dist/components/InspectorPanel/AlignmentControls.js +28 -9
  15. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +1 -1
  16. package/dist/components/InspectorPanel/EasingInspector.js +6 -2
  17. package/dist/components/InspectorPanel/ElementLibraryButton.js +1 -1
  18. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +1 -1
  19. package/dist/components/InspectorPanel/KeyframeInspector.js +28 -24
  20. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +1 -1
  21. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -1
  22. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +30 -2
  23. package/dist/components/InspectorPanel/SequenceWrapAction.d.ts +8 -0
  24. package/dist/components/InspectorPanel/SequenceWrapAction.js +151 -0
  25. package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +2 -1
  26. package/dist/components/InspectorPanel/easing-inspector-selection.js +4 -3
  27. package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +2 -1
  28. package/dist/components/InspectorPanel/keyframe-inspector-frame.js +2 -2
  29. package/dist/components/InspectorSequenceSection.d.ts +1 -0
  30. package/dist/components/InspectorSequenceSection.js +7 -5
  31. package/dist/components/KeyboardShortcutsSettings.js +1 -1
  32. package/dist/components/Menu/styles.d.ts +2 -2
  33. package/dist/components/Modals.js +7 -6
  34. package/dist/components/ModelManager.js +10 -9
  35. package/dist/components/NewComposition/CancelButton.js +10 -4
  36. package/dist/components/NewComposition/InputDragger.d.ts +3 -1
  37. package/dist/components/NewComposition/InputDragger.js +28 -9
  38. package/dist/components/NewComposition/NewComposition.js +7 -6
  39. package/dist/components/NewComposition/RemInput.d.ts +1 -1
  40. package/dist/components/NewComposition/menu-typeahead.js +1 -1
  41. package/dist/components/Preview.js +3 -2
  42. package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +1 -2
  43. package/dist/components/RenderModal/WebRenderModalPicture.js +1 -2
  44. package/dist/components/RenderQueue/CaptionQueueItem.js +14 -5
  45. package/dist/components/RenderQueue/CaptionQueueProcessor.js +30 -7
  46. package/dist/components/RenderQueue/QueueJobError.d.ts +8 -0
  47. package/dist/components/RenderQueue/QueueJobError.js +24 -0
  48. package/dist/components/RenderQueue/QueueJobErrorModal.d.ts +8 -0
  49. package/dist/components/RenderQueue/QueueJobErrorModal.js +63 -0
  50. package/dist/components/RenderQueue/RenderQueueItemCancelButton.d.ts +3 -1
  51. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +11 -4
  52. package/dist/components/RenderQueue/RenderQueueRepeat.d.ts +3 -1
  53. package/dist/components/RenderQueue/RenderQueueRepeat.js +20 -3
  54. package/dist/components/RenderQueue/VideoMattingQueueItem.js +24 -27
  55. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +68 -28
  56. package/dist/components/RenderQueue/caption-job-types.d.ts +3 -1
  57. package/dist/components/RenderQueue/context.d.ts +4 -0
  58. package/dist/components/RenderQueue/context.js +58 -8
  59. package/dist/components/RenderQueue/index.js +2 -3
  60. package/dist/components/RenderQueue/load-model-for-job.d.ts +2 -1
  61. package/dist/components/RenderQueue/load-model-for-job.js +5 -1
  62. package/dist/components/RenderQueue/video-matting-job-types.d.ts +13 -6
  63. package/dist/components/SelectedOutlineCropControls.js +2 -1
  64. package/dist/components/SelectedOutlineEditingHandles.js +9 -2
  65. package/dist/components/SelectedOutlineElement.js +9 -3
  66. package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -4
  67. package/dist/components/SelectedOutlineKeyboardControls.js +4 -22
  68. package/dist/components/SelectedOutlineOverlay.js +152 -106
  69. package/dist/components/SelectedOutlinePathPoints.d.ts +8 -0
  70. package/dist/components/SelectedOutlinePathPoints.js +433 -0
  71. package/dist/components/SelectedOutlinePolygon.js +21 -46
  72. package/dist/components/SelectedOutlineRenderer.d.ts +3 -5
  73. package/dist/components/SelectedOutlineRenderer.js +32 -136
  74. package/dist/components/SelectedOutlineTransformOriginHandle.js +3 -2
  75. package/dist/components/SelectedOutlineUvControls.js +12 -7
  76. package/dist/components/SettingsModal.js +30 -3
  77. package/dist/components/SettingsModalFooter.d.ts +1 -0
  78. package/dist/components/SettingsModalFooter.js +7 -3
  79. package/dist/components/ShowOutlinesProvider.js +1 -1
  80. package/dist/components/SkillsSettings.d.ts +0 -1
  81. package/dist/components/SkillsSettings.js +13 -14
  82. package/dist/components/Splitter/SplitterElement.js +1 -2
  83. package/dist/components/TimeValue.js +1 -1
  84. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +1 -0
  85. package/dist/components/Timeline/LoopedTimelineIndicators.js +7 -6
  86. package/dist/components/Timeline/TimelineArrayField.js +1 -1
  87. package/dist/components/Timeline/TimelineClipboardKeybindings.js +0 -1
  88. package/dist/components/Timeline/TimelineColorField.js +1 -1
  89. package/dist/components/Timeline/TimelineDragHandler.js +1 -1
  90. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  91. package/dist/components/Timeline/TimelineEffectPropItem.js +12 -5
  92. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -0
  93. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  94. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -0
  95. package/dist/components/Timeline/TimelineExpandedSection.js +2 -2
  96. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +1 -0
  97. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +3 -1
  98. package/dist/components/Timeline/TimelineFontFamilyField.js +12 -12
  99. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -0
  100. package/dist/components/Timeline/TimelineKeyframeControls.js +39 -28
  101. package/dist/components/Timeline/TimelineLayerChildren.js +1 -1
  102. package/dist/components/Timeline/TimelineList.js +1 -1
  103. package/dist/components/Timeline/TimelineNumberField.js +2 -4
  104. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  105. package/dist/components/Timeline/TimelineSelection.d.ts +9 -9
  106. package/dist/components/Timeline/TimelineSelection.js +16 -9
  107. package/dist/components/Timeline/TimelineSequence.d.ts +3 -1
  108. package/dist/components/Timeline/TimelineSequence.js +39 -21
  109. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  110. package/dist/components/Timeline/TimelineSequenceItem.js +18 -8
  111. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +3 -0
  112. package/dist/components/Timeline/TimelineSequencePropItem.js +262 -25
  113. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +11 -13
  114. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +98 -77
  115. package/dist/components/Timeline/TimelineTextContentField.js +27 -4
  116. package/dist/components/Timeline/TimelineTimeIndicators.js +10 -5
  117. package/dist/components/Timeline/TimelineTrack.js +1 -1
  118. package/dist/components/Timeline/TimelineTrimTooltip.d.ts +11 -0
  119. package/dist/components/Timeline/TimelineTrimTooltip.js +41 -0
  120. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  121. package/dist/components/Timeline/TimelineVideoInfo.js +13 -10
  122. package/dist/components/Timeline/delete-selected-keyframe.js +22 -8
  123. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +1 -5
  124. package/dist/components/Timeline/delete-selected-timeline-item.js +7 -93
  125. package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +2 -1
  126. package/dist/components/Timeline/get-animation-item-selection-for-frame.js +7 -5
  127. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.d.ts +23 -0
  128. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.js +57 -0
  129. package/dist/components/Timeline/get-node-keyframes.d.ts +2 -1
  130. package/dist/components/Timeline/get-node-keyframes.js +6 -4
  131. package/dist/components/Timeline/get-playback-rate-keyframe-changes.d.ts +21 -0
  132. package/dist/components/Timeline/get-playback-rate-keyframe-changes.js +142 -0
  133. package/dist/components/Timeline/get-timeline-keyframes.d.ts +15 -2
  134. package/dist/components/Timeline/get-timeline-keyframes.js +44 -6
  135. package/dist/components/Timeline/keyframe-clipboard.js +17 -3
  136. package/dist/components/Timeline/split-selected-timeline-item.js +4 -1
  137. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  138. package/dist/components/Timeline/timeline-field-row-layout.js +1 -0
  139. package/dist/components/Timeline/use-delete-timeline-items.js +17 -11
  140. package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +2 -1
  141. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +3 -1
  142. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -3
  143. package/dist/components/Timeline/use-timeline-keyframe-drag.js +28 -19
  144. package/dist/components/Transcription/Models.js +1 -1
  145. package/dist/components/Transcription/TranscriptionModal.js +3 -1
  146. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +2 -1
  147. package/dist/components/Transcription/resample-media-to-16-khz.js +20 -2
  148. package/dist/components/UpdatesSettings.js +2 -0
  149. package/dist/components/VideoMatting/Models.js +1 -1
  150. package/dist/components/VideoMatting/VideoMattingModal.js +30 -47
  151. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +1 -1
  152. package/dist/components/WebMcp.js +22 -40
  153. package/dist/components/composition-drop-preview.js +1 -0
  154. package/dist/components/effect-drag-and-drop.d.ts +13 -5
  155. package/dist/components/effect-drag-and-drop.js +19 -4
  156. package/dist/components/get-open-in-menu-items.d.ts +2 -1
  157. package/dist/components/get-open-in-menu-items.js +17 -1
  158. package/dist/components/selected-outline-drag.d.ts +1 -6
  159. package/dist/components/selected-outline-drag.js +22 -6
  160. package/dist/components/selected-outline-geometry.d.ts +2 -18
  161. package/dist/components/selected-outline-measurement.d.ts +23 -41
  162. package/dist/components/selected-outline-measurement.js +14 -252
  163. package/dist/components/selected-outline-order.d.ts +4 -11
  164. package/dist/components/selected-outline-order.js +2 -254
  165. package/dist/components/selected-outline-snap.d.ts +1 -1
  166. package/dist/components/selected-outline-snap.js +2 -1
  167. package/dist/components/selected-outline-types.d.ts +18 -28
  168. package/dist/components/selected-outline-uv.d.ts +4 -4
  169. package/dist/components/selected-outline-uv.js +6 -111
  170. package/dist/components/sequence-props-api.js +0 -10
  171. package/dist/components/use-selected-outline-control-target.js +12 -21
  172. package/dist/components/wrap-jsx-node-api.d.ts +2 -0
  173. package/dist/components/wrap-jsx-node-api.js +13 -0
  174. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +45 -2
  175. package/dist/error-overlay/remotion-overlay/StackFrame.js +32 -3
  176. package/dist/esm/{CaptionQueueProcessor-npa6szn1.mjs → CaptionQueueProcessor-nr7hjcga.mjs} +63 -17
  177. package/dist/esm/LazyModels-ajkn7fs3.mjs +12 -0
  178. package/dist/esm/LazyModels-g1g7cf4e.mjs +12 -0
  179. package/dist/esm/{TranscriptionModal-79m5wgcj.mjs → TranscriptionModal-e18bzbkb.mjs} +15 -15
  180. package/dist/esm/{VideoMattingModal-31pew0xj.mjs → VideoMattingModal-5bz2s4rs.mjs} +47 -65
  181. package/dist/esm/{VideoMattingQueueProcessor-t1hgm2rm.mjs → VideoMattingQueueProcessor-4tkj0f4k.mjs} +69 -26
  182. package/dist/esm/{index-v4tr1bft.mjs → index-09txs1bj.mjs} +5 -0
  183. package/dist/esm/{index-n5gmcvhz.mjs → index-5ycb9e9q.mjs} +2 -4
  184. package/dist/esm/{index-5t2dwxsk.mjs → index-890dd9b3.mjs} +259 -21
  185. package/dist/esm/{index-ac5550e7.mjs → index-8nt6a0mw.mjs} +3 -3
  186. package/dist/esm/{index-614tdz2q.mjs → index-9q9w8v9p.mjs} +3 -3
  187. package/dist/esm/{index-s7qa3xbw.mjs → index-c2wabcdt.mjs} +6 -6
  188. package/dist/esm/{index-r1gr3j3a.mjs → index-dfy1t576.mjs} +50 -1
  189. package/dist/esm/{index-21hxsfaa.mjs → index-dh3zk2hv.mjs} +6 -25
  190. package/dist/esm/{index-4zen9prq.mjs → index-dpyss74p.mjs} +6563 -5485
  191. package/dist/esm/{index-9x6e1dq0.mjs → index-hqxc6tzp.mjs} +40 -6
  192. package/dist/esm/{index-9xxg6218.mjs → index-qve7mdfp.mjs} +19 -1
  193. package/dist/esm/{index-e855w59j.mjs → index-s6qya2gg.mjs} +3 -5
  194. package/dist/esm/index-t7tbt980.mjs +103 -0
  195. package/dist/esm/{index-r0ejh5sy.mjs → index-t7xnxdf8.mjs} +44 -26
  196. package/dist/esm/index-wqc43mw0.mjs +158 -0
  197. package/dist/esm/{index-ppspzgn9.mjs → index-x6r9bn12.mjs} +4026 -4761
  198. package/dist/esm/{index-vxwg66ar.mjs → index-xac20sv4.mjs} +44 -57
  199. package/dist/esm/index.mjs +4 -5
  200. package/dist/esm/internals.mjs +13 -13
  201. package/dist/esm/previewEntry.mjs +18 -15
  202. package/dist/esm/renderEntry.mjs +5 -1
  203. package/dist/helpers/calculate-timeline.d.ts +5 -1
  204. package/dist/helpers/calculate-timeline.js +1 -1
  205. package/dist/helpers/checkerboard-background.d.ts +2 -2
  206. package/dist/helpers/colors.d.ts +132 -112
  207. package/dist/helpers/colors.js +117 -95
  208. package/dist/helpers/create-folder-tree.js +2 -1
  209. package/dist/helpers/editor-guide-selection.d.ts +1 -1
  210. package/dist/helpers/editor-ruler.js +23 -12
  211. package/dist/helpers/get-connected-compositions.d.ts +6 -1
  212. package/dist/helpers/get-connected-compositions.js +1 -1
  213. package/dist/helpers/get-sequence-double-click-action.js +1 -1
  214. package/dist/helpers/get-sequence-visible-range.d.ts +1 -1
  215. package/dist/helpers/get-sequence-visible-range.js +2 -5
  216. package/dist/helpers/get-timeline-nestedness.d.ts +1 -1
  217. package/dist/helpers/get-timeline-nestedness.js +1 -1
  218. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
  219. package/dist/helpers/get-timeline-sequence-sort-key.js +1 -1
  220. package/dist/helpers/hoverable.js +4 -4
  221. package/dist/helpers/inject-css.js +5 -7
  222. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -1
  223. package/dist/helpers/prism-vsc-dark-plus.js +52 -51
  224. package/dist/helpers/resolve-studio-color.d.ts +1 -0
  225. package/dist/helpers/resolve-studio-color.js +11 -0
  226. package/dist/helpers/studio-css-variables.d.ts +1 -0
  227. package/dist/helpers/studio-css-variables.js +105 -0
  228. package/dist/helpers/studio-pixel-ratio.d.ts +1 -0
  229. package/dist/helpers/studio-pixel-ratio.js +7 -0
  230. package/dist/helpers/timeline-node-path-key.d.ts +1 -1
  231. package/dist/helpers/timeline-node-path-key.js +2 -2
  232. package/dist/helpers/use-runtime-values.js +2 -28
  233. package/dist/hot-middleware-client/client.js +5 -3
  234. package/dist/icons/align-center-horizontal.js +2 -1
  235. package/dist/icons/align-left.js +2 -1
  236. package/dist/icons/align-right.js +2 -1
  237. package/dist/icons/{separation.d.ts → background-removal.d.ts} +1 -1
  238. package/dist/icons/background-removal.js +9 -0
  239. package/dist/icons/wrap.d.ts +4 -0
  240. package/dist/icons/wrap.js +10 -0
  241. package/dist/previewEntry.js +2 -0
  242. package/dist/renderEntry.js +2 -0
  243. package/dist/state/modals.d.ts +15 -1
  244. package/dist/state/timeline-sequence-hover.d.ts +6 -16
  245. package/dist/state/timeline-sequence-hover.js +6 -67
  246. package/package.json +20 -19
  247. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +0 -15
  248. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +0 -31
  249. package/dist/esm/LazyModels-nh3c8h9p.mjs +0 -12
  250. package/dist/esm/LazyModels-rr5v8h5y.mjs +0 -12
  251. package/dist/esm/index-cw0pnpg5.mjs +0 -50
  252. package/dist/esm/index-k426ye99.mjs +0 -139
  253. package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
  254. package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
  255. package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
  256. package/dist/helpers/get-box-quads-ponyfill.js +0 -23
  257. package/dist/icons/separation.js +0 -7
  258. /package/dist/esm/{resolve-composition-component-location-qrp05g62.mjs → resolve-composition-component-location-2hgf6g0a.mjs} +0 -0
@@ -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;
@@ -75,6 +75,7 @@ const use_asset_timeline_context_menu_1 = require("./use-asset-timeline-context-
75
75
  const use_delete_timeline_items_1 = require("./use-delete-timeline-items");
76
76
  const use_open_sequence_in_apps_1 = require("./use-open-sequence-in-apps");
77
77
  const use_sequence_freeze_frame_menu_item_1 = require("./use-sequence-freeze-frame-menu-item");
78
+ const { getTimelineVisibleDuration, getTimelineVisibleStart } = canvas_1.CanvasInternals;
78
79
  const TimelineSequenceFn = ({ s, connectedCompositions, nodePathInfo, sequenceFrameOffset, cascadedStart, localStart, }) => {
79
80
  const windowWidth = (0, react_1.useContext)(TimelineWidthProvider_1.TimelineWidthContext);
80
81
  if (windowWidth === null) {
@@ -127,6 +128,7 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
127
128
  const isAsset = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset';
128
129
  const ref = (0, react_1.useRef)(null);
129
130
  const { onSelect, selectable, selected, selectionItem } = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
131
+ const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(nodePathInfo);
130
132
  (0, TimelineSelection_1.useTimelineMarqueeSelectableItem)(selectionItem, ref);
131
133
  const onPointerDown = (0, react_1.useCallback)((e) => {
132
134
  if (e.button === 0) {
@@ -149,7 +151,7 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
149
151
  }, [fromCanUpdate, onMoveDragPointerDown, onSelect, selected]);
150
152
  const frame = (0, remotion_1.useCurrentFrame)();
151
153
  const relativeFrame = frame - s.from;
152
- const sequenceFrame = relativeFrame + sequenceFrameOffset;
154
+ const sequenceFrame = relativeFrame * s.sequencePlaybackRate + sequenceFrameOffset;
153
155
  const relativeFrameWithPremount = relativeFrame + ((_a = s.premountDisplay) !== null && _a !== void 0 ? _a : 0);
154
156
  const relativeFrameWithPostmount = relativeFrame - displayDurationInFrames;
155
157
  const roundedFrame = Math.round(sequenceFrame * 100) / 100;
@@ -168,9 +170,9 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
168
170
  ...style,
169
171
  background: negativeStart ? colors_1.TRANSPARENT : style.background,
170
172
  border: negativeStart ? 'none' : style.border,
171
- opacity: selected || isAsset ? 1 : 0.75,
173
+ opacity: selected || containsSelection || isAsset ? 1 : 0.75,
172
174
  };
173
- }, [isAsset, negativeStart, selected, style]);
175
+ }, [containsSelection, isAsset, negativeStart, selected, style]);
174
176
  const content = (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [premount ? (jsx_runtime_1.jsx("div", { style: {
175
177
  left: premount.left,
176
178
  width: premount.width,
@@ -240,8 +242,8 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
240
242
  // If a duration is 1, it is essentially a still and it should have width 0
241
243
  // Some compositions may not be longer than their media duration,
242
244
  // if that is the case, it needs to be asynchronously determined
243
- var _a, _b, _c, _d, _e;
244
- 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;
245
247
  const video = remotion_1.Internals.useVideo();
246
248
  const { sequences } = (0, react_1.useContext)(remotion_1.Internals.SequenceManager);
247
249
  const overrideIdToNodePathMappingsRef = (0, react_1.useContext)(SequencePropsSubscriptionProvider_1.OverrideIdToNodePathMappingsRefContext);
@@ -250,17 +252,30 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
250
252
  const dragAwareDoubleClick = (0, react_1.useMemo)(() => (0, drag_aware_double_click_1.createDragAwareDoubleClickTracker)(), []);
251
253
  const mediaMetadata = (0, use_media_metadata_1.useMediaMetadata)(s.type === 'audio' || s.type === 'video' ? s.src : null);
252
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);
253
268
  const naturalMediaDuration = (s.type === 'audio' || s.type === 'video') &&
254
269
  mediaMetadata !== null &&
255
270
  s.playbackRate > 0
256
- ? 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) -
257
272
  (0, get_timeline_media_start_frame_1.getTimelineMediaStartFrame)({
258
273
  startMediaFrom: s.startMediaFrom,
259
274
  mediaFrameAtSequenceZero: s.mediaFrameAtSequenceZero,
260
275
  sequenceFrameOffset,
261
276
  playbackRate: s.playbackRate,
262
277
  })) /
263
- s.playbackRate)
278
+ (s.playbackRate * s.sequencePlaybackRate))
264
279
  : null;
265
280
  const maxMediaDuration = s.type === 'sequence' || s.type === 'image' || extendVideoLastFrame
266
281
  ? Infinity
@@ -281,22 +296,22 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
281
296
  };
282
297
  }, [originalLocation]);
283
298
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
284
- 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;
285
300
  const propStatusesForOverride = (0, react_1.useMemo)(() => {
286
301
  return nodePath
287
302
  ? remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)
288
303
  : undefined;
289
304
  }, [propStatuses, nodePath]);
290
305
  const durationCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
291
- ((_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');
292
307
  const durationCanResize = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
293
308
  (0, TimelineSequenceRightEdgeDragHandle_1.canResizeTimelineSequenceDuration)({
294
309
  status: propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.durationInFrames,
295
310
  }));
296
311
  const fromCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
297
- ((_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');
298
313
  const trimBeforeCanUpdate = Boolean((0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
299
- ((_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');
300
315
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
301
316
  const previewConnected = previewServerState.type === 'connected';
302
317
  const previewInteractive = previewConnected && (0, interactivity_enabled_1.isStudioInteractivityEnabled)();
@@ -359,7 +374,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
359
374
  const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenSource;
360
375
  const canDeleteFromSource = Boolean(nodePath && (validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source));
361
376
  const deleteDisabled = !previewInteractive || !s.controls || !canDeleteFromSource;
362
- 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;
363
378
  const duplicateDisabled = deleteDisabled || isProgrammaticallyDuplicated;
364
379
  const disableInteractivityDisabled = !previewInteractive ||
365
380
  !s.showInTimeline ||
@@ -560,7 +575,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
560
575
  const { onPointerDown: onMoveDragPointerDown } = (0, TimelineSequenceRightEdgeDragHandle_1.useTimelineSequenceFromDrag)({
561
576
  nodePathInfo,
562
577
  windowWidth,
563
- 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,
564
579
  onDragEnd: dragAwareDoubleClick.endPointerGesture,
565
580
  });
566
581
  if (!video) {
@@ -622,7 +637,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
622
637
  }, [visibleLayout]);
623
638
  const showLeftBorderRadius = (visibleLayout === null || visibleLayout === void 0 ? void 0 : visibleLayout.leftEdgeVisible) === true &&
624
639
  localStart >= 0 &&
625
- ((_k = s.trimBefore) !== null && _k !== void 0 ? _k : 0) === 0 &&
640
+ ((_p = s.trimBefore) !== null && _p !== void 0 ? _p : 0) === 0 &&
626
641
  (s.type === 'sequence' ||
627
642
  s.type === 'image' ||
628
643
  (0, get_timeline_media_start_frame_1.getTimelineMediaStartFrame)({
@@ -642,15 +657,15 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
642
657
  Math.ceil(Math.min(s.duration, video.durationInFrames - s.from, maxMediaDuration !== null && maxMediaDuration !== void 0 ? maxMediaDuration : Infinity)) === Math.ceil(naturalMediaDuration);
643
658
  const parentSequence = sequences.find((candidate) => candidate.id === s.parent);
644
659
  const parentEnd = parentSequence
645
- ? (0, canvas_1.getTimelineVisibleStart)(parentSequence, sequences) +
646
- (0, canvas_1.getTimelineVisibleDuration)(parentSequence, sequences)
660
+ ? getTimelineVisibleStart(parentSequence, sequences) +
661
+ getTimelineVisibleDuration(parentSequence, sequences)
647
662
  : video.durationInFrames;
648
663
  const endsAtContainerBoundary = Math.ceil(s.from + displayDurationInFrames) >=
649
664
  Math.ceil(Math.min(parentEnd, video.durationInFrames));
650
665
  const hasImplicitMediaDuration = (s.type === 'audio' || s.type === 'video') &&
651
- ((_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' &&
652
667
  propStatusesForOverride.durationInFrames.codeValue === undefined;
653
- 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'
654
669
  ? propStatusesForOverride.durationInFrames.codeValue
655
670
  : null;
656
671
  const explicitDurationInFrames = typeof durationInFramesCodeValue === 'number' &&
@@ -664,7 +679,9 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
664
679
  displayDurationInFrames: s.duration,
665
680
  displayStart: s.from,
666
681
  effectiveMaxMediaDuration,
667
- explicitDurationInFrames,
682
+ explicitDurationInFrames: explicitDurationInFrames === null
683
+ ? null
684
+ : explicitDurationInFrames / s.sequencePlaybackRate,
668
685
  hasImplicitDuration: hasImplicitMediaDuration,
669
686
  naturalMediaDuration,
670
687
  timelineDurationInFrames: video.durationInFrames,
@@ -751,10 +768,11 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
751
768
  visibleLayout.leftEdgeVisible &&
752
769
  negativeStartWidth === 0 &&
753
770
  nodePathInfo &&
754
- 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 &&
755
772
  visibleLayout.rightEdgeVisible &&
756
773
  nodePathInfo &&
757
- 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 }))] }));
758
776
  return previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: sequence })) : (sequence);
759
777
  };
760
778
  exports.TimelineSequence = react_1.default.memo(TimelineSequenceFn);
@@ -8,6 +8,7 @@ export declare const TimelineSequenceItem: React.NamedExoticComponent<{
8
8
  readonly nestedDepth: number;
9
9
  readonly nodePathInfo: SequenceNodePathInfo | null;
10
10
  readonly keyframeDisplayOffset: number;
11
+ readonly keyframePlaybackRate: number;
11
12
  readonly sequenceFrameOffset: number;
12
13
  readonly siblingIndex: number;
13
14
  readonly numberOfHiddenDuplicates: number;
@@ -173,7 +173,7 @@ const getSequencePointerDropTargetAtPoint = ({ clientX, clientY, }) => {
173
173
  return null;
174
174
  };
175
175
  const SEQUENCE_REORDER_POINTER_THRESHOLD = 3;
176
- const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions, nestedDepth, sequence, nodePathInfo, keyframeDisplayOffset, sequenceFrameOffset, siblingIndex, numberOfHiddenDuplicates, showProvisionalVisibilityToggle, }) => {
176
+ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions, nestedDepth, sequence, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, sequenceFrameOffset, siblingIndex, numberOfHiddenDuplicates, showProvisionalVisibilityToggle, }) => {
177
177
  var _a, _b;
178
178
  var _c, _d, _e;
179
179
  const nodePath = (_c = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.sequenceSubscriptionKey) !== null && _c !== void 0 ? _c : null;
@@ -195,6 +195,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
195
195
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
196
196
  const deleteTimelineItems = (0, use_delete_timeline_items_1.useDeleteTimelineItems)();
197
197
  const { onSelect, selectable, selected, selectedItems, selectItem } = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
198
+ const { selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
198
199
  const selectedSequenceNodePathInfos = (0, react_1.useMemo)(() => {
199
200
  if (!selected ||
200
201
  selectedItems.length < 2 ||
@@ -775,7 +776,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
775
776
  const onAddEffect = (0, react_1.useCallback)(() => {
776
777
  if (!canAddEffect ||
777
778
  previewServerState.type !== 'connected' ||
778
- !nodePath ||
779
+ nodePathInfo === null ||
779
780
  !(validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source)) {
780
781
  return;
781
782
  }
@@ -783,13 +784,15 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
783
784
  type: 'add-effect',
784
785
  clientId: previewServerState.clientId,
785
786
  fileName: validatedLocation.source,
786
- nodePath,
787
+ nodePathInfo,
788
+ selectItems,
787
789
  });
788
790
  }, [
789
791
  canAddEffect,
790
- nodePath,
792
+ nodePathInfo,
791
793
  previewServerState,
792
794
  setSelectedModal,
795
+ selectItems,
793
796
  validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source,
794
797
  ]);
795
798
  const onCrop = (0, react_1.useCallback)(() => {
@@ -1041,7 +1044,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
1041
1044
  const onEffectDrop = (0, react_1.useCallback)(async (e) => {
1042
1045
  if (!canDropEffect ||
1043
1046
  previewServerState.type !== 'connected' ||
1044
- nodePath === null ||
1047
+ nodePathInfo === null ||
1045
1048
  validatedLocation === null ||
1046
1049
  !(0, effect_drag_and_drop_1.hasEffectDragType)(e.dataTransfer)) {
1047
1050
  return;
@@ -1062,10 +1065,17 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
1062
1065
  await (0, effect_drag_and_drop_1.addEffectFromDragData)({
1063
1066
  dragData,
1064
1067
  fileName: validatedLocation.source,
1065
- nodePath,
1068
+ nodePathInfo,
1066
1069
  clientId: previewServerState.clientId,
1070
+ selectItems,
1067
1071
  });
1068
- }, [canDropEffect, nodePath, previewServerState, validatedLocation]);
1072
+ }, [
1073
+ canDropEffect,
1074
+ nodePathInfo,
1075
+ previewServerState,
1076
+ selectItems,
1077
+ validatedLocation,
1078
+ ]);
1069
1079
  const trackRow = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: nestedDepth, eye: showVisibilityToggle ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: sequence.type === 'audio' ? 'speaker' : 'eye', hidden: isItemHidden, onInvoked: canToggleVisibility ? onToggleVisibility : null })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: jsx_runtime_1.jsx(TimelineLayerChildren_1.TimelineLayerChildrenToggle, { sequence: sequence }), style: rowStyle, selected: selected, selectable: selectable, onSelect: onSelect, showSelectedBackground: true, containsSelection: containsSelection, hovered: hovered, outerHeight: outerHeight, onDragLeave: canDropEffect ? onEffectDragLeave : undefined, onDragOver: canDropEffect ? onEffectDragOver : undefined, onDrop: canDropEffect ? onEffectDrop : undefined, onDoubleClick: canHandleSequenceDoubleClick ? onSequenceDoubleClick : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsxs("div", { style: labelContainerStyle, children: [connectedCompositions.length > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1070
1080
  jsx_runtime_1.jsx(CompositionOrStillIcon_1.CompositionOrStillIcon, { color: (0, TimelineSelection_1.getTimelineColor)(false, false), composition: connectedCompositions[0], style: connectedCompositionIconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
1071
1081
  ] })) : null, jsx_runtime_1.jsx(TimelineSequenceName_1.TimelineSequenceName, { displayName: timelineDisplayName, fallbackDisplayName: fallbackDisplayName, selected: selected, containsSelection: containsSelection, editing: isRenaming, onCancelEditing: onCancelRenaming, onSaveName: onSaveName }), numberOfHiddenDuplicates > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
@@ -1086,6 +1096,6 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
1086
1096
  isExpanded &&
1087
1097
  hasExpandableContent &&
1088
1098
  nodePathInfo &&
1089
- validatedLocation ? (jsx_runtime_1.jsx(TimelineExpandedSection_1.TimelineExpandedSection, { sequence: sequence, validatedLocation: validatedLocation, nodePathInfo: nodePathInfo, nestedDepth: nestedDepth, keyframeDisplayOffset: keyframeDisplayOffset })) : null] }));
1099
+ validatedLocation ? (jsx_runtime_1.jsx(TimelineExpandedSection_1.TimelineExpandedSection, { sequence: sequence, validatedLocation: validatedLocation, nodePathInfo: nodePathInfo, nestedDepth: nestedDepth, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate })) : null] }));
1090
1100
  };
1091
1101
  exports.TimelineSequenceItem = react_1.default.memo(TimelineSequenceItemInner);
@@ -14,9 +14,11 @@ type TimelineSequenceKeyframedValueBaseProps = {
14
14
  type TimelineSequenceKeyframedValueProps = TimelineSequenceKeyframedValueBaseProps & ({
15
15
  readonly sourceFrame: number;
16
16
  readonly keyframeDisplayOffset?: never;
17
+ readonly keyframePlaybackRate?: never;
17
18
  } | {
18
19
  readonly sourceFrame?: never;
19
20
  readonly keyframeDisplayOffset: number;
21
+ readonly keyframePlaybackRate: number;
20
22
  });
21
23
  export declare const TimelineSequenceKeyframedValue: React.NamedExoticComponent<TimelineSequenceKeyframedValueProps>;
22
24
  export declare const TimelineSequencePropItem: React.FC<{
@@ -27,6 +29,7 @@ export declare const TimelineSequencePropItem: React.FC<{
27
29
  readonly nodePathInfo: SequenceNodePathInfo;
28
30
  readonly schema: InteractivitySchema;
29
31
  readonly keyframeDisplayOffset: number;
32
+ readonly keyframePlaybackRate: number;
30
33
  readonly keyframeControlsMode: TimelineKeyframeControlsMode;
31
34
  readonly runtimeValue: unknown;
32
35
  }>;