@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
@@ -38,6 +38,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const remotion_1 = require("remotion");
40
40
  const colors_1 = require("../../helpers/colors");
41
+ const resolve_studio_color_1 = require("../../helpers/resolve-studio-color");
42
+ const studio_pixel_ratio_1 = require("../../helpers/studio-pixel-ratio");
41
43
  const timeline_layout_1 = require("../../helpers/timeline-layout");
42
44
  const render_frame_1 = require("../../state/render-frame");
43
45
  const TimeValue_1 = require("../TimeValue");
@@ -215,8 +217,11 @@ const TimelineTimeIndicatorsInner = react_1.default.memo(({ windowWidth, duratio
215
217
  (frameInterval * fps),
216
218
  });
217
219
  const draw = () => {
220
+ const computedStyle = getComputedStyle(canvas);
221
+ const tickColor = (0, resolve_studio_color_1.resolveStudioColor)(colors_1.WHITE_ALPHA_15, computedStyle);
222
+ const labelColor = (0, resolve_studio_color_1.resolveStudioColor)(colors_1.LIGHT_TEXT, computedStyle);
218
223
  const { clientWidth: width, scrollLeft } = scrollable;
219
- const pixelRatio = window.devicePixelRatio;
224
+ const pixelRatio = (0, studio_pixel_ratio_1.getStudioPixelRatio)();
220
225
  const canvasWidth = Math.ceil(width * pixelRatio);
221
226
  const canvasHeight = exports.TIMELINE_TIME_INDICATOR_HEIGHT * pixelRatio;
222
227
  if (canvas.width !== canvasWidth || canvas.height !== canvasHeight) {
@@ -228,7 +233,7 @@ const TimelineTimeIndicatorsInner = react_1.default.memo(({ windowWidth, duratio
228
233
  context.resetTransform();
229
234
  context.clearRect(0, 0, canvas.width, canvas.height);
230
235
  context.scale(pixelRatio, pixelRatio);
231
- context.fillStyle = colors_1.WHITE_ALPHA_15;
236
+ context.fillStyle = tickColor;
232
237
  const firstFrame = Math.max(0, Math.floor((scrollLeft - timeline_layout_1.TIMELINE_PADDING) / frameInterval));
233
238
  const lastFrame = Math.min(durationInFrames - 1, Math.ceil((scrollLeft + width - timeline_layout_1.TIMELINE_PADDING) / frameInterval));
234
239
  const xForFrame = (frame) => Math.round(frameInterval * frame + timeline_layout_1.TIMELINE_PADDING - scrollLeft) + 0.5;
@@ -243,11 +248,11 @@ const TimelineTimeIndicatorsInner = react_1.default.memo(({ windowWidth, duratio
243
248
  const frame = second * fps;
244
249
  drawTick(frame, 15);
245
250
  if (second > 0) {
246
- context.fillStyle = colors_1.LIGHT_TEXT;
247
- context.font = `${TICK_LABEL_FONT_SIZE}px ${getComputedStyle(canvas).fontFamily}`;
251
+ context.fillStyle = labelColor;
252
+ context.font = `${TICK_LABEL_FONT_SIZE}px ${computedStyle.fontFamily}`;
248
253
  context.textBaseline = 'top';
249
254
  context.fillText(showFrames ? `${Math.round(frame)}f` : (0, render_frame_1.renderFrame)(frame, fps), xForFrame(frame) + TICK_LABEL_MARGIN_LEFT, 7);
250
- context.fillStyle = colors_1.WHITE_ALPHA_15;
255
+ context.fillStyle = tickColor;
251
256
  }
252
257
  }
253
258
  const { minorTickEvery, mediumTickEvery } = tickScale;
@@ -66,6 +66,6 @@ const TimelineTrackUnmemoized = ({ track }) => {
66
66
  getIsExpanded(track.nodePathInfo);
67
67
  return (jsx_runtime_1.jsxs("div", { onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: [
68
68
  jsx_runtime_1.jsxs("div", { style: layerStyle, children: [rowHighlightBackground && timelineWidth !== null ? (jsx_runtime_1.jsx("div", { style: (0, TimelineSelection_1.getTimelineSelectedTrackHighlightStyle)(timelineWidth, rowHighlightBackground) })) : null, jsx_runtime_1.jsx(TimelineSequence_1.TimelineSequence, { s: track.sequence, cascadedStart: track.cascadedStart, localStart: track.localStart, connectedCompositions: (_a = track.connectedCompositions) !== null && _a !== void 0 ? _a : emptyConnectedCompositions, nodePathInfo: track.nodePathInfo, sequenceFrameOffset: track.sequenceFrameOffset })
69
- ] }), showExpandedKeyframes && track.nodePathInfo ? (jsx_runtime_1.jsx(TimelineExpandedTrackKeyframes_1.TimelineExpandedTrackKeyframes, { sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset })) : null] }));
69
+ ] }), showExpandedKeyframes && track.nodePathInfo ? (jsx_runtime_1.jsx(TimelineExpandedTrackKeyframes_1.TimelineExpandedTrackKeyframes, { sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, keyframePlaybackRate: track.keyframePlaybackRate })) : null] }));
70
70
  };
71
71
  exports.TimelineTrack = react_1.default.memo(TimelineTrackUnmemoized);
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export type TimelineTrimTooltipState = {
3
+ readonly deltaFrames: number;
4
+ readonly edgeFrame: number;
5
+ readonly x: number;
6
+ readonly y: number;
7
+ };
8
+ export declare const TimelineTrimTooltip: React.FC<{
9
+ readonly state: TimelineTrimTooltipState;
10
+ readonly fps: number;
11
+ }>;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimelineTrimTooltip = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_dom_1 = require("react-dom");
7
+ const colors_1 = require("../../helpers/colors");
8
+ const render_frame_1 = require("../../state/render-frame");
9
+ const TimelineTickFormatProvider_1 = require("./TimelineTickFormatProvider");
10
+ const tooltip = {
11
+ backgroundColor: colors_1.BLACK_ALPHA_85,
12
+ borderRadius: 2,
13
+ boxSizing: 'border-box',
14
+ color: colors_1.WHITE,
15
+ fontSize: 11,
16
+ fontVariantNumeric: 'tabular-nums',
17
+ lineHeight: '14px',
18
+ padding: '4px 7px',
19
+ pointerEvents: 'none',
20
+ position: 'fixed',
21
+ textAlign: 'right',
22
+ whiteSpace: 'nowrap',
23
+ zIndex: 2147483647,
24
+ };
25
+ const TimelineTrimTooltip = ({ state, fps }) => {
26
+ const { showFrames } = (0, react_1.useContext)(TimelineTickFormatProvider_1.TimelineTickFormatContext);
27
+ const delta = Math.round(state.deltaFrames);
28
+ const edge = Math.max(0, Math.round(state.edgeFrame));
29
+ const format = (frame) => showFrames ? `${frame}f` : (0, render_frame_1.renderFrame)(frame, fps);
30
+ const deltaLabel = delta === 0
31
+ ? format(0)
32
+ : `${delta < 0 ? '−' : '+'}${format(Math.abs(delta))}`;
33
+ const edgeLabel = format(edge);
34
+ const tooltipWidth = Math.max(82, Math.ceil(Math.max(deltaLabel.length, edgeLabel.length) * 7 + 14));
35
+ const left = Math.max(8, Math.min(state.x - tooltipWidth / 2, window.innerWidth - tooltipWidth - 8));
36
+ const top = Math.max(8, Math.min(state.y - 40, window.innerHeight - 44));
37
+ return (0, react_dom_1.createPortal)(jsx_runtime_1.jsxs("div", { "aria-hidden": "true", style: { ...tooltip, left, top, width: tooltipWidth }, "data-remotion-timeline-trim-tooltip": "true", children: [
38
+ jsx_runtime_1.jsx("div", { children: deltaLabel }), jsx_runtime_1.jsx("div", { style: { color: colors_1.LIGHT_TEXT }, children: edgeLabel })
39
+ ] }), document.body);
40
+ };
41
+ exports.TimelineTrimTooltip = TimelineTrimTooltip;
@@ -14,6 +14,7 @@ export declare const TimelineVideoInfo: React.NamedExoticComponent<{
14
14
  readonly muted: boolean;
15
15
  readonly marginLeft: number;
16
16
  readonly loopDisplay: LoopDisplay | undefined;
17
+ readonly loopDisplayOffsetInFrames: number;
17
18
  readonly frozenMediaFrame: number | null;
18
19
  readonly extendLastFrame: boolean;
19
20
  }>;
@@ -39,6 +39,7 @@ const timeline_utils_1 = require("@remotion/timeline-utils");
39
39
  const react_1 = __importStar(require("react"));
40
40
  const remotion_1 = require("remotion");
41
41
  const colors_1 = require("../../helpers/colors");
42
+ const studio_pixel_ratio_1 = require("../../helpers/studio-pixel-ratio");
42
43
  const timeline_layout_1 = require("../../helpers/timeline-layout");
43
44
  const AudioWaveform_1 = require("../AudioWaveform");
44
45
  const get_timeline_media_start_frame_1 = require("./get-timeline-media-start-frame");
@@ -60,7 +61,7 @@ const filmstripContainerStyle = {
60
61
  };
61
62
  const MAX_FROZEN_FRAME_CACHE_DEVIATION = timeline_utils_1.WEBCODECS_TIMESCALE * 0.05;
62
63
  const TimelineVideoInfoSegment = ({ src, visualizationWidth, startMediaFrom, mediaFrameAtSequenceZero, sequenceFrameOffset, durationInFrames, sourceOffsetInFrames, tiledLoop, playbackRate, volume, doesVolumeChange, muted, frozenMediaFrame, extendLastFrame, }) => {
63
- var _a, _b;
64
+ var _a, _b, _c;
64
65
  const { fps } = (0, remotion_1.useVideoConfig)();
65
66
  const resolvedSrc = remotion_1.Internals.usePreload(src);
66
67
  const ref = (0, react_1.useRef)(null);
@@ -83,7 +84,7 @@ const TimelineVideoInfoSegment = ({ src, visualizationWidth, startMediaFrom, med
83
84
  return;
84
85
  }
85
86
  const controller = new AbortController();
86
- const pixelRatio = window.devicePixelRatio;
87
+ const pixelRatio = (0, studio_pixel_ratio_1.getStudioPixelRatio)();
87
88
  const canvas = document.createElement('canvas');
88
89
  canvas.width = Math.ceil(visualizationWidth * pixelRatio);
89
90
  canvas.height = Math.ceil(timeline_layout_1.TIMELINE_LAYER_FILMSTRIP_HEIGHT * pixelRatio);
@@ -207,7 +208,8 @@ const TimelineVideoInfoSegment = ({ src, visualizationWidth, startMediaFrom, med
207
208
  if (!pattern) {
208
209
  return;
209
210
  }
210
- const phase = (tiledLoop.displayOffsetInFrames %
211
+ const phase = ((tiledLoop.displayOffsetInFrames +
212
+ tiledLoop.loopDisplayOffsetInFrames) %
211
213
  tiledLoop.loopDisplay.durationInFrames) *
212
214
  ((tiledLoop.loopWidth * pixelRatio) /
213
215
  tiledLoop.loopDisplay.durationInFrames);
@@ -387,13 +389,11 @@ const TimelineVideoInfoSegment = ({ src, visualizationWidth, startMediaFrom, med
387
389
  };
388
390
  }, [visualizationWidth]);
389
391
  return (jsx_runtime_1.jsxs("div", { style: segmentStyle, children: [
390
- jsx_runtime_1.jsx("div", { ref: ref, style: filmstripStyle }), jsx_runtime_1.jsx("div", { style: audioStyle, children: jsx_runtime_1.jsx(AudioWaveform_1.AudioWaveform, { src: src, height: timeline_layout_1.TIMELINE_VIDEO_INFO_WAVEFORM_HEIGHT, visualizationWidth: audioWidth, startFrom: mediaStartFrame, durationInFrames: durationInFrames, displayOffsetInFrames: (_a = tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.displayOffsetInFrames) !== null && _a !== void 0 ? _a : 0, displayDurationInFrames: (_b = tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.displayDurationInFrames) !== null && _b !== void 0 ? _b : durationInFrames, volume: volume, doesVolumeChange: doesVolumeChange, muted: muted, playbackRate: playbackRate, loopDisplay: tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.loopDisplay }) })
392
+ jsx_runtime_1.jsx("div", { ref: ref, style: filmstripStyle }), jsx_runtime_1.jsx("div", { style: audioStyle, children: jsx_runtime_1.jsx(AudioWaveform_1.AudioWaveform, { src: src, height: timeline_layout_1.TIMELINE_VIDEO_INFO_WAVEFORM_HEIGHT, visualizationWidth: audioWidth, startFrom: mediaStartFrame, durationInFrames: durationInFrames, displayOffsetInFrames: (_a = tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.displayOffsetInFrames) !== null && _a !== void 0 ? _a : 0, loopDisplayOffsetInFrames: (_b = tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.loopDisplayOffsetInFrames) !== null && _b !== void 0 ? _b : 0, displayDurationInFrames: (_c = tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.displayDurationInFrames) !== null && _c !== void 0 ? _c : durationInFrames, volume: volume, doesVolumeChange: doesVolumeChange, muted: muted, playbackRate: playbackRate, loopDisplay: tiledLoop === null || tiledLoop === void 0 ? void 0 : tiledLoop.loopDisplay }) })
391
393
  ] }));
392
394
  };
393
395
  const getVisibleSegments = ({ displayDurationInFrames, displayOffsetInFrames, loopDisplay, }) => {
394
- if (!loopDisplay ||
395
- loopDisplay.numberOfTimes <= 1 ||
396
- loopDisplay.durationInFrames <= 0) {
396
+ if (!loopDisplay || loopDisplay.durationInFrames <= 0) {
397
397
  return [
398
398
  {
399
399
  key: 'single',
@@ -416,7 +416,7 @@ const getVisibleSegments = ({ displayDurationInFrames, displayOffsetInFrames, lo
416
416
  };
417
417
  });
418
418
  };
419
- const TimelineVideoInfoInner = ({ src, visualizationWidth, displayOffsetInFrames, displayDurationInFrames, startMediaFrom, mediaFrameAtSequenceZero, sequenceFrameOffset, playbackRate, volume, doesVolumeChange, muted, marginLeft, loopDisplay, frozenMediaFrame, extendLastFrame, }) => {
419
+ const TimelineVideoInfoInner = ({ src, visualizationWidth, displayOffsetInFrames, displayDurationInFrames, startMediaFrom, mediaFrameAtSequenceZero, sequenceFrameOffset, playbackRate, volume, doesVolumeChange, muted, marginLeft, loopDisplay, loopDisplayOffsetInFrames, frozenMediaFrame, extendLastFrame, }) => {
420
420
  const pixelsPerFrame = visualizationWidth / displayDurationInFrames;
421
421
  const loopWidth = loopDisplay
422
422
  ? loopDisplay.durationInFrames * pixelsPerFrame
@@ -431,12 +431,14 @@ const TimelineVideoInfoInner = ({ src, visualizationWidth, displayOffsetInFrames
431
431
  return {
432
432
  displayDurationInFrames,
433
433
  displayOffsetInFrames,
434
+ loopDisplayOffsetInFrames,
434
435
  loopDisplay,
435
436
  loopWidth,
436
437
  };
437
438
  }, [
438
439
  displayDurationInFrames,
439
440
  displayOffsetInFrames,
441
+ loopDisplayOffsetInFrames,
440
442
  loopDisplay,
441
443
  loopWidth,
442
444
  shouldTileLoop,
@@ -447,12 +449,13 @@ const TimelineVideoInfoInner = ({ src, visualizationWidth, displayOffsetInFrames
447
449
  }
448
450
  return getVisibleSegments({
449
451
  displayDurationInFrames,
450
- displayOffsetInFrames,
452
+ displayOffsetInFrames: displayOffsetInFrames + loopDisplayOffsetInFrames,
451
453
  loopDisplay,
452
454
  });
453
455
  }, [
454
456
  displayDurationInFrames,
455
457
  displayOffsetInFrames,
458
+ loopDisplayOffsetInFrames,
456
459
  loopDisplay,
457
460
  shouldTileLoop,
458
461
  ]);
@@ -465,6 +468,6 @@ const TimelineVideoInfoInner = ({ src, visualizationWidth, displayOffsetInFrames
465
468
  .slice(Math.max(0, Math.floor(segmentDisplayOffsetInFrames)), Math.min(values.length, Math.ceil(segmentDisplayOffsetInFrames + segmentDurationInFrames)))
466
469
  .join(',');
467
470
  };
468
- return (jsx_runtime_1.jsx("div", { style: { display: 'flex', marginLeft, height: '100%' }, children: tiledLoop ? (jsx_runtime_1.jsx(TimelineVideoInfoSegment, { src: src, visualizationWidth: visualizationWidth, startMediaFrom: startMediaFrom, mediaFrameAtSequenceZero: mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, durationInFrames: tiledLoop.loopDisplay.durationInFrames, sourceOffsetInFrames: 0, tiledLoop: tiledLoop, playbackRate: playbackRate, volume: volume, doesVolumeChange: doesVolumeChange, muted: muted, frozenMediaFrame: frozenMediaFrame, extendLastFrame: extendLastFrame })) : (segments.map((segment) => (jsx_runtime_1.jsx(TimelineVideoInfoSegment, { src: src, visualizationWidth: segment.durationInFrames * pixelsPerFrame, startMediaFrom: startMediaFrom, mediaFrameAtSequenceZero: mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, durationInFrames: segment.durationInFrames, sourceOffsetInFrames: segment.sourceOffsetInFrames, tiledLoop: null, playbackRate: playbackRate, volume: getSegmentVolume(segment.sourceOffsetInFrames, segment.durationInFrames), doesVolumeChange: doesVolumeChange, muted: muted, frozenMediaFrame: frozenMediaFrame, extendLastFrame: extendLastFrame }, segment.key)))) }));
471
+ return (jsx_runtime_1.jsx("div", { style: { display: 'flex', marginLeft, height: '100%' }, children: tiledLoop ? (jsx_runtime_1.jsx(TimelineVideoInfoSegment, { src: src, visualizationWidth: visualizationWidth, startMediaFrom: startMediaFrom, mediaFrameAtSequenceZero: mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, durationInFrames: tiledLoop.loopDisplay.durationInFrames, sourceOffsetInFrames: 0, tiledLoop: tiledLoop, playbackRate: playbackRate, volume: volume, doesVolumeChange: doesVolumeChange, muted: muted, frozenMediaFrame: frozenMediaFrame, extendLastFrame: extendLastFrame })) : (segments.map((segment) => (jsx_runtime_1.jsx(TimelineVideoInfoSegment, { src: src, visualizationWidth: segment.durationInFrames * pixelsPerFrame, startMediaFrom: startMediaFrom, mediaFrameAtSequenceZero: mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, durationInFrames: segment.durationInFrames, sourceOffsetInFrames: segment.sourceOffsetInFrames, tiledLoop: null, playbackRate: playbackRate, volume: getSegmentVolume(segment.displayOffsetInFrames - loopDisplayOffsetInFrames, segment.durationInFrames), doesVolumeChange: doesVolumeChange, muted: muted, frozenMediaFrame: frozenMediaFrame, extendLastFrame: extendLastFrame }, segment.key)))) }));
469
472
  };
470
473
  exports.TimelineVideoInfo = react_1.default.memo(TimelineVideoInfoInner);
@@ -4,6 +4,7 @@ type TimelineRenderWindow = {
4
4
  readonly width: number;
5
5
  };
6
6
  export declare const TimelineViewportContext: React.Context<TimelineRenderWindow | null>;
7
+ export declare const syncTimelineViewport: () => void;
7
8
  export declare const getTimelineRenderWindow: (scrollable: HTMLDivElement) => TimelineRenderWindow;
8
9
  export declare const TimelineViewportProvider: React.FC<{
9
10
  readonly children: React.ReactNode;
@@ -1,9 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimelineViewportProvider = exports.getTimelineRenderWindow = exports.TimelineViewportContext = void 0;
3
+ exports.TimelineViewportProvider = exports.getTimelineRenderWindow = exports.syncTimelineViewport = exports.TimelineViewportContext = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  exports.TimelineViewportContext = (0, react_1.createContext)(null);
7
+ let updateTimelineViewport = null;
8
+ const syncTimelineViewport = () => {
9
+ updateTimelineViewport === null || updateTimelineViewport === void 0 ? void 0 : updateTimelineViewport();
10
+ };
11
+ exports.syncTimelineViewport = syncTimelineViewport;
7
12
  const getTimelineRenderWindow = (scrollable) => {
8
13
  const viewportWidth = scrollable.clientWidth;
9
14
  if (viewportWidth === 0) {
@@ -41,6 +46,7 @@ const TimelineViewportProvider = ({ children, scrollable }) => {
41
46
  (0, react_1.useLayoutEffect)(() => {
42
47
  let element = null;
43
48
  let resizeObserver = null;
49
+ updateTimelineViewport = update;
44
50
  const animationFrame = requestAnimationFrame(() => {
45
51
  element = scrollable.current;
46
52
  if (!element) {
@@ -52,6 +58,9 @@ const TimelineViewportProvider = ({ children, scrollable }) => {
52
58
  element.addEventListener('scroll', update);
53
59
  });
54
60
  return () => {
61
+ if (updateTimelineViewport === update) {
62
+ updateTimelineViewport = null;
63
+ }
55
64
  cancelAnimationFrame(animationFrame);
56
65
  resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
57
66
  element === null || element === void 0 ? void 0 : element.removeEventListener('scroll', update);
@@ -19,7 +19,7 @@ const getValueWhenLastKeyframeDeleted = ({ propStatus, playheadSourceFrame, }) =
19
19
  };
20
20
  const getSelectedKeyframeDeletion = ({ nodePathInfo, frame, sequences, overrideIdsToNodePaths, propStatuses, timelinePosition, }) => {
21
21
  var _a;
22
- var _b, _c, _d;
22
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k;
23
23
  const field = (0, parse_keyframe_field_from_node_path_1.parseKeyframeFieldFromNodePath)(nodePathInfo.auxiliaryKeys);
24
24
  if (field === null) {
25
25
  return null;
@@ -51,9 +51,16 @@ const getSelectedKeyframeDeletion = ({ nodePathInfo, frame, sequences, overrideI
51
51
  const effectKeyframeDisplayOffset = (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
52
52
  propStatus: effectPropStatus,
53
53
  keyframeDisplayOffset: (_c = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _c !== void 0 ? _c : 0,
54
+ keyframePlaybackRate: (_d = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _d !== void 0 ? _d : 1,
54
55
  });
55
- const effectSourceFrame = frame - effectKeyframeDisplayOffset;
56
- const effectPlayheadSourceFrame = timelinePosition - effectKeyframeDisplayOffset;
56
+ const effectSourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
57
+ displayFrame: frame,
58
+ keyframeDisplayOffset: effectKeyframeDisplayOffset,
59
+ keyframePlaybackRate: (_e = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _e !== void 0 ? _e : 1,
60
+ propStatus: effectPropStatus,
61
+ });
62
+ const effectPlayheadSourceFrame = (timelinePosition - effectKeyframeDisplayOffset) *
63
+ ((_f = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _f !== void 0 ? _f : 1);
57
64
  const effectValueWhenLastKeyframeDeleted = getValueWhenLastKeyframeDeleted({
58
65
  propStatus: effectPropStatus,
59
66
  playheadSourceFrame: effectPlayheadSourceFrame,
@@ -71,13 +78,20 @@ const getSelectedKeyframeDeletion = ({ nodePathInfo, frame, sequences, overrideI
71
78
  }
72
79
  const sequencePropStatus = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[field.fieldKey];
73
80
  const keyframeDisplayOffset = (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
74
- propStatus: sequencePropStatus,
75
- keyframeDisplayOffset: (_d = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _d !== void 0 ? _d : 0,
81
+ propStatus: sequencePropStatus !== null && sequencePropStatus !== void 0 ? sequencePropStatus : null,
82
+ keyframeDisplayOffset: (_g = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _g !== void 0 ? _g : 0,
83
+ keyframePlaybackRate: (_h = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _h !== void 0 ? _h : 1,
84
+ });
85
+ const sourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
86
+ displayFrame: frame,
87
+ keyframeDisplayOffset,
88
+ keyframePlaybackRate: (_j = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _j !== void 0 ? _j : 1,
89
+ propStatus: sequencePropStatus !== null && sequencePropStatus !== void 0 ? sequencePropStatus : null,
76
90
  });
77
- const sourceFrame = frame - keyframeDisplayOffset;
78
- const playheadSourceFrame = timelinePosition - keyframeDisplayOffset;
91
+ const playheadSourceFrame = (timelinePosition - keyframeDisplayOffset) *
92
+ ((_k = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _k !== void 0 ? _k : 1);
79
93
  const sequenceValueWhenLastKeyframeDeleted = getValueWhenLastKeyframeDeleted({
80
- propStatus: sequencePropStatus,
94
+ propStatus: sequencePropStatus !== null && sequencePropStatus !== void 0 ? sequencePropStatus : null,
81
95
  playheadSourceFrame,
82
96
  });
83
97
  return {
@@ -3,12 +3,8 @@ import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-s
3
3
  import type { ConfirmationDialogFunction } from '../ConfirmationDialog-types';
4
4
  import type { SetPropStatuses } from './save-sequence-prop';
5
5
  export declare const deleteSequencesFromSource: (nodePathInfos: SequenceNodePathInfo[], confirm: ConfirmationDialogFunction) => Promise<boolean>;
6
- export declare const getTimelineSelectionAfterDeletingItems: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, timelinePosition, }: {
6
+ export declare const getTimelineSelectionAfterDeletingItems: ({ selections, }: {
7
7
  readonly selections: readonly import("@remotion/canvas").CanvasSelectionItem[];
8
- readonly sequences?: TSequence[] | undefined;
9
- readonly overrideIdsToNodePaths?: OverrideIdToNodePaths | undefined;
10
- readonly propStatuses?: PropStatuses | undefined;
11
- readonly timelinePosition?: number | undefined;
12
8
  }) => readonly import("@remotion/canvas").CanvasSelectionItem[];
13
9
  export declare const deleteSelectedTimelineItems: ({ selections, sequences, overrideIdsToNodePaths, setPropStatuses, clientId, confirm, propStatuses, timelinePosition, }: {
14
10
  selections: readonly import("@remotion/canvas").CanvasSelectionItem[];
@@ -1,18 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.deleteSelectedTimelineItems = exports.getTimelineSelectionAfterDeletingItems = exports.deleteSequencesFromSource = void 0;
4
- const remotion_1 = require("remotion");
5
4
  const browser_studio_operations_1 = require("../../helpers/browser-studio-operations");
6
- const delete_jsx_node_api_1 = require("../delete-jsx-node-api");
5
+ const delete_jsx_nodes_api_1 = require("../delete-jsx-nodes-api");
7
6
  const effect_operations_api_1 = require("../effect-operations-api");
8
7
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
9
8
  const delete_selected_keyframe_1 = require("./delete-selected-keyframe");
10
- const find_track_for_node_path_info_1 = require("./find-track-for-node-path-info");
11
- const get_easing_selection_after_keyframe_delete_1 = require("./get-easing-selection-after-keyframe-delete");
12
- const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
13
- const parse_keyframe_field_from_node_path_1 = require("./parse-keyframe-field-from-node-path");
14
9
  const TimelineSelection_1 = require("./TimelineSelection");
15
- const update_selected_easing_1 = require("./update-selected-easing");
16
10
  const confirmDeletingDuplicatedSequences = (nodePathInfos, confirm) => {
17
11
  const duplicatedNodePathInfos = nodePathInfos.filter((nodePathInfo) => nodePathInfo.numberOfSequencesWithThisNodePath > 1);
18
12
  if (duplicatedNodePathInfos.length === 0) {
@@ -39,7 +33,7 @@ const deleteSequencesFromSource = async (nodePathInfos, confirm) => {
39
33
  if (!(await confirmDeletingDuplicatedSequences(nodePathInfos, confirm))) {
40
34
  return false;
41
35
  }
42
- return (0, delete_jsx_node_api_1.deleteJsxNode)({
36
+ return (0, delete_jsx_nodes_api_1.deleteJsxNodes)({
43
37
  nodes: nodePathInfos.map((nodePathInfo) => {
44
38
  const nodePath = nodePathInfo.sequenceSubscriptionKey;
45
39
  return {
@@ -111,95 +105,15 @@ const getSequenceSelectionAfterDeletingEffect = (selection) => {
111
105
  },
112
106
  };
113
107
  };
114
- const getEasingSelectionAfterDeletingKeyframes = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, timelinePosition, }) => {
115
- var _a;
116
- if (sequences === undefined ||
117
- overrideIdsToNodePaths === undefined ||
118
- propStatuses === undefined ||
119
- timelinePosition === undefined) {
120
- return null;
121
- }
122
- const keyframeSelections = selections.filter(isKeyframeSelection);
123
- if (keyframeSelections.length !== 1) {
124
- return null;
125
- }
126
- const [selection] = keyframeSelections;
127
- if (!selection) {
128
- return null;
129
- }
130
- const field = (0, parse_keyframe_field_from_node_path_1.parseKeyframeFieldFromNodePath)(selection.nodePathInfo.auxiliaryKeys);
131
- if (field === null) {
132
- return null;
133
- }
134
- const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
135
- sequences,
136
- overrideIdsToNodePaths,
137
- nodePathInfo: selection.nodePathInfo,
138
- });
139
- if (!track || !track.sequence.controls) {
140
- return null;
141
- }
142
- const nodePath = selection.nodePathInfo.sequenceSubscriptionKey;
143
- if (field.type === 'sequence') {
144
- const sequencePropStatus = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[field.fieldKey];
145
- if ((sequencePropStatus === null || sequencePropStatus === void 0 ? void 0 : sequencePropStatus.status) !== 'keyframed' ||
146
- !(0, update_selected_easing_1.canEditEasingForInterpolationFunction)(sequencePropStatus.interpolationFunction)) {
147
- return null;
148
- }
149
- return (0, get_easing_selection_after_keyframe_delete_1.getEasingSelectionAfterKeyframeDelete)({
150
- deletedSourceFrames: [
151
- selection.frame -
152
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
153
- propStatus: sequencePropStatus,
154
- keyframeDisplayOffset: track.keyframeDisplayOffset,
155
- }),
156
- ],
157
- keyframeDisplayOffset: track.keyframeDisplayOffset,
158
- nodePathInfo: selection.nodePathInfo,
159
- propStatus: sequencePropStatus,
160
- timelinePosition,
161
- });
162
- }
163
- const effectStatus = remotion_1.Internals.getEffectPropStatusesCtx({
164
- propStatuses,
165
- nodePath,
166
- effectIndex: field.effectIndex,
167
- });
168
- const effectPropStatus = effectStatus.type === 'can-update-effect'
169
- ? effectStatus.props[field.fieldKey]
170
- : null;
171
- if ((effectPropStatus === null || effectPropStatus === void 0 ? void 0 : effectPropStatus.status) !== 'keyframed' ||
172
- !(0, update_selected_easing_1.canEditEasingForInterpolationFunction)(effectPropStatus.interpolationFunction)) {
173
- return null;
174
- }
175
- return (0, get_easing_selection_after_keyframe_delete_1.getEasingSelectionAfterKeyframeDelete)({
176
- deletedSourceFrames: [
177
- selection.frame -
178
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
179
- propStatus: effectPropStatus,
180
- keyframeDisplayOffset: track.keyframeDisplayOffset,
181
- }),
182
- ],
183
- keyframeDisplayOffset: track.keyframeDisplayOffset,
184
- nodePathInfo: selection.nodePathInfo,
185
- propStatus: effectPropStatus,
186
- timelinePosition,
187
- });
188
- };
189
- const getTimelineSelectionAfterDeletingItems = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, timelinePosition, }) => {
190
- const easingSelection = getEasingSelectionAfterDeletingKeyframes({
191
- selections,
192
- sequences,
193
- overrideIdsToNodePaths,
194
- propStatuses,
195
- timelinePosition,
196
- });
197
- if (easingSelection !== null) {
198
- return [easingSelection];
199
- }
108
+ const getTimelineSelectionAfterDeletingItems = ({ selections, }) => {
200
109
  const nextSelections = new Map();
201
110
  for (const selection of selections) {
202
- const nextSelection = getSequenceSelectionAfterDeletingEffect(selection);
111
+ if (selection.type === 'easing') {
112
+ continue;
113
+ }
114
+ const nextSelection = selection.type === 'keyframe'
115
+ ? (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(selection.nodePathInfo)
116
+ : getSequenceSelectionAfterDeletingEffect(selection);
203
117
  if (!nextSelection) {
204
118
  return [];
205
119
  }
@@ -8,9 +8,10 @@ type AnimationItemSelection = Extract<TimelineSelection, {
8
8
  type AnimationKeyframe = {
9
9
  readonly frame: number;
10
10
  };
11
- export declare const getAnimationItemSelectionForSourceFrame: ({ includeEasings, keyframeDisplayOffset, keyframes, nodePathInfo, sourceFrame, }: {
11
+ export declare const getAnimationItemSelectionForSourceFrame: ({ includeEasings, keyframeDisplayOffset, keyframePlaybackRate, keyframes, nodePathInfo, sourceFrame, }: {
12
12
  readonly includeEasings: boolean;
13
13
  readonly keyframeDisplayOffset: number;
14
+ readonly keyframePlaybackRate: number;
14
15
  readonly keyframes: readonly AnimationKeyframe[];
15
16
  readonly nodePathInfo: SequenceNodePathInfo;
16
17
  readonly sourceFrame: number;
@@ -1,14 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAnimationItemSelectionForSourceFrame = void 0;
4
- const getKeyframeSelection = ({ keyframe, keyframeDisplayOffset, nodePathInfo, }) => {
4
+ const getKeyframeSelection = ({ keyframe, keyframeDisplayOffset, keyframePlaybackRate, nodePathInfo, }) => {
5
5
  return {
6
6
  type: 'keyframe',
7
7
  nodePathInfo,
8
- frame: keyframe.frame + keyframeDisplayOffset,
8
+ frame: keyframe.frame / keyframePlaybackRate + keyframeDisplayOffset,
9
9
  };
10
10
  };
11
- const getAnimationItemSelectionForSourceFrame = ({ includeEasings, keyframeDisplayOffset, keyframes, nodePathInfo, sourceFrame, }) => {
11
+ const getAnimationItemSelectionForSourceFrame = ({ includeEasings, keyframeDisplayOffset, keyframePlaybackRate, keyframes, nodePathInfo, sourceFrame, }) => {
12
12
  const firstKeyframe = keyframes[0];
13
13
  if (!firstKeyframe) {
14
14
  return null;
@@ -19,6 +19,7 @@ const getAnimationItemSelectionForSourceFrame = ({ includeEasings, keyframeDispl
19
19
  return getKeyframeSelection({
20
20
  keyframe,
21
21
  keyframeDisplayOffset,
22
+ keyframePlaybackRate,
22
23
  nodePathInfo,
23
24
  });
24
25
  }
@@ -33,8 +34,8 @@ const getAnimationItemSelectionForSourceFrame = ({ includeEasings, keyframeDispl
33
34
  return {
34
35
  type: 'easing',
35
36
  nodePathInfo,
36
- fromFrame: keyframe.frame + keyframeDisplayOffset,
37
- toFrame: nextKeyframe.frame + keyframeDisplayOffset,
37
+ fromFrame: keyframe.frame / keyframePlaybackRate + keyframeDisplayOffset,
38
+ toFrame: nextKeyframe.frame / keyframePlaybackRate + keyframeDisplayOffset,
38
39
  segmentIndex: i,
39
40
  };
40
41
  }
@@ -43,6 +44,7 @@ const getAnimationItemSelectionForSourceFrame = ({ includeEasings, keyframeDispl
43
44
  return getKeyframeSelection({
44
45
  keyframe: sourceFrame < firstKeyframe.frame ? firstKeyframe : lastKeyframe,
45
46
  keyframeDisplayOffset,
47
+ keyframePlaybackRate,
46
48
  nodePathInfo,
47
49
  });
48
50
  };
@@ -0,0 +1,23 @@
1
+ import type { CanUpdateSequencePropStatusKeyframed, InteractivitySchema, PropStatuses, SequencePropsSubscriptionKey, TSequence } from 'remotion';
2
+ export type TimelineSequenceKeyframeDragTarget = {
3
+ readonly parentPlaybackRate: number;
4
+ readonly fileName: string;
5
+ readonly fieldKey: string;
6
+ readonly isDescendant: boolean;
7
+ readonly nodePath: SequencePropsSubscriptionKey;
8
+ readonly schema: InteractivitySchema;
9
+ readonly status: CanUpdateSequencePropStatusKeyframed;
10
+ };
11
+ export type TimelineSequenceEffectKeyframeDragTarget = TimelineSequenceKeyframeDragTarget & {
12
+ readonly effectIndex: number;
13
+ };
14
+ export declare const getKeyframedSequenceDragTargets: ({ nodePath, sequence, sequences, propStatuses, isDescendant, }: {
15
+ readonly nodePath: SequencePropsSubscriptionKey;
16
+ readonly sequence: TSequence;
17
+ readonly sequences: TSequence[];
18
+ readonly propStatuses: PropStatuses;
19
+ readonly isDescendant: boolean;
20
+ }) => {
21
+ readonly effectKeyframes: TimelineSequenceEffectKeyframeDragTarget[];
22
+ readonly sequenceKeyframes: TimelineSequenceKeyframeDragTarget[];
23
+ };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getKeyframedSequenceDragTargets = void 0;
4
+ const canvas_1 = require("@remotion/canvas");
5
+ const remotion_1 = require("remotion");
6
+ const { getParentSequencePlaybackRate } = canvas_1.CanvasInternals;
7
+ const getKeyframedSequenceDragTargets = ({ nodePath, sequence, sequences, propStatuses, isDescendant, }) => {
8
+ var _a;
9
+ const status = propStatuses[remotion_1.Internals.makeSequencePropsSubscriptionKey(nodePath)];
10
+ if (status === null || status === undefined || !status.canUpdate) {
11
+ return { effectKeyframes: [], sequenceKeyframes: [] };
12
+ }
13
+ const sequenceSchema = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.schema;
14
+ const sequenceKeyframes = sequenceSchema === undefined
15
+ ? []
16
+ : Object.entries(status.props).flatMap(([fieldKey, propStatus]) => propStatus.status === 'keyframed' &&
17
+ (!isDescendant || propStatus.keyframeDisplayOffsetAdjustment !== null)
18
+ ? [
19
+ {
20
+ parentPlaybackRate: getParentSequencePlaybackRate(sequence, sequences),
21
+ fileName: nodePath.absolutePath,
22
+ fieldKey,
23
+ isDescendant,
24
+ nodePath,
25
+ schema: sequenceSchema,
26
+ status: propStatus,
27
+ },
28
+ ]
29
+ : []);
30
+ const effectKeyframes = status.effects.flatMap((effectStatus) => {
31
+ var _a;
32
+ if (!effectStatus.canUpdate) {
33
+ return [];
34
+ }
35
+ const effectSchema = (_a = sequence.effects[effectStatus.effectIndex]) === null || _a === void 0 ? void 0 : _a.schema;
36
+ if (effectSchema === undefined) {
37
+ return [];
38
+ }
39
+ return Object.entries(effectStatus.props).flatMap(([fieldKey, propStatus]) => propStatus.status === 'keyframed' &&
40
+ (!isDescendant || propStatus.keyframeDisplayOffsetAdjustment !== null)
41
+ ? [
42
+ {
43
+ effectIndex: effectStatus.effectIndex,
44
+ parentPlaybackRate: getParentSequencePlaybackRate(sequence, sequences),
45
+ fileName: nodePath.absolutePath,
46
+ fieldKey,
47
+ isDescendant,
48
+ nodePath,
49
+ schema: effectSchema,
50
+ status: propStatus,
51
+ },
52
+ ]
53
+ : []);
54
+ });
55
+ return { effectKeyframes, sequenceKeyframes };
56
+ };
57
+ exports.getKeyframedSequenceDragTargets = getKeyframedSequenceDragTargets;
@@ -1,10 +1,11 @@
1
1
  import { type GetDragOverrides, type GetEffectDragOverrides, type PropStatuses, type SequencePropsSubscriptionKey } from 'remotion';
2
2
  import type { TimelineTreeNode } from '../../helpers/timeline-layout';
3
- export declare const getNodeKeyframes: ({ node, nodePath, propStatuses, keyframeDisplayOffset, getDragOverrides, getEffectDragOverrides, timelinePosition, }: {
3
+ export declare const getNodeKeyframes: ({ node, nodePath, propStatuses, keyframeDisplayOffset, keyframePlaybackRate, getDragOverrides, getEffectDragOverrides, timelinePosition, }: {
4
4
  node: TimelineTreeNode;
5
5
  nodePath: SequencePropsSubscriptionKey;
6
6
  propStatuses: PropStatuses;
7
7
  keyframeDisplayOffset: number;
8
+ keyframePlaybackRate: number;
8
9
  getDragOverrides: GetDragOverrides;
9
10
  getEffectDragOverrides: GetEffectDragOverrides;
10
11
  timelinePosition: number;