@remotion/studio 4.0.527 → 4.0.529

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 (367) hide show
  1. package/dist/Studio.js +2 -0
  2. package/dist/components/AgentPrompt.js +3 -4
  3. package/dist/components/AppLaunchButton.d.ts +0 -1
  4. package/dist/components/AppLaunchButton.js +2 -5
  5. package/dist/components/AssetAudioVolume.js +2 -2
  6. package/dist/components/AssetSelectorItem.js +5 -5
  7. package/dist/components/AudioWaveform.d.ts +1 -0
  8. package/dist/components/AudioWaveform.js +10 -14
  9. package/dist/components/Button.d.ts +1 -1
  10. package/dist/components/Button.js +2 -2
  11. package/dist/components/CaptionInspector.js +1 -1
  12. package/dist/components/CaptionTextEditor.js +1 -1
  13. package/dist/components/CheckboardToggle.js +1 -1
  14. package/dist/components/CodeFrame.js +1 -1
  15. package/dist/components/CodingAgentButton.js +1 -1
  16. package/dist/components/ColorPicker/ColorPicker.d.ts +1 -1
  17. package/dist/components/ColorPicker/ColorPicker.js +2 -2
  18. package/dist/components/ColorPicker/ColorPickerPopup.js +1 -1
  19. package/dist/components/ColorPicker/checker.d.ts +1 -1
  20. package/dist/components/CompactExplanation.js +3 -3
  21. package/dist/components/CompositionSelectorItem.js +2 -2
  22. package/dist/components/ConfigSelect.js +1 -1
  23. package/dist/components/ConfigureDefaultEditorModal.js +2 -2
  24. package/dist/components/ControlButton.d.ts +0 -1
  25. package/dist/components/ControlButton.js +2 -2
  26. package/dist/components/CurrentAsset.js +4 -3
  27. package/dist/components/EditorRuler/Ruler.js +6 -3
  28. package/dist/components/EffectPickerModal.js +69 -43
  29. package/dist/components/ElementInstallConfirmation.js +3 -3
  30. package/dist/components/ElementLibrariesSettings.d.ts +2 -0
  31. package/dist/components/ElementLibrariesSettings.js +200 -0
  32. package/dist/components/ElementLibraryModal.js +1 -1
  33. package/dist/components/FramePersistor.js +3 -3
  34. package/dist/components/FullscreenToggle.js +1 -1
  35. package/dist/components/InitialCompositionLoader.js +5 -3
  36. package/dist/components/InlineAction.d.ts +2 -2
  37. package/dist/components/InlineAction.js +2 -3
  38. package/dist/components/InlineEditableTitle.d.ts +1 -1
  39. package/dist/components/InlineEditableTitle.js +3 -3
  40. package/dist/components/InspectorLocationCopy.js +1 -1
  41. package/dist/components/InspectorOpenInEditor.js +14 -3
  42. package/dist/components/InspectorPanel/AlignmentControls.js +31 -12
  43. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +1 -1
  44. package/dist/components/InspectorPanel/CompositionInspector.js +1 -5
  45. package/dist/components/InspectorPanel/CompositionMetadata.js +4 -4
  46. package/dist/components/InspectorPanel/EasingInspector.js +7 -3
  47. package/dist/components/InspectorPanel/ElementLibraryButton.js +3 -14
  48. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +6 -8
  49. package/dist/components/InspectorPanel/KeyframeInspector.js +29 -25
  50. package/dist/components/InspectorPanel/KeyframeSettings.js +16 -11
  51. package/dist/components/InspectorPanel/MultiSequenceField.js +1 -1
  52. package/dist/components/InspectorPanel/MultiSequenceInspector.js +2 -7
  53. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +2 -2
  54. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -1
  55. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +1 -1
  56. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +33 -14
  57. package/dist/components/InspectorPanel/SequenceWrapAction.d.ts +8 -0
  58. package/dist/components/InspectorPanel/SequenceWrapAction.js +143 -0
  59. package/dist/components/InspectorPanel/common.d.ts +6 -2
  60. package/dist/components/InspectorPanel/common.js +25 -9
  61. package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +2 -1
  62. package/dist/components/InspectorPanel/easing-inspector-selection.js +4 -3
  63. package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +2 -1
  64. package/dist/components/InspectorPanel/keyframe-inspector-frame.js +2 -2
  65. package/dist/components/InspectorSequenceSection.d.ts +1 -0
  66. package/dist/components/InspectorSequenceSection.js +12 -10
  67. package/dist/components/InspectorSourceLocation.js +2 -2
  68. package/dist/components/KeyboardShortcutsSettings.js +2 -2
  69. package/dist/components/LicenseKeyValidation.js +2 -2
  70. package/dist/components/LoopToggle.js +1 -1
  71. package/dist/components/Menu/MenuSubItem.js +4 -2
  72. package/dist/components/Menu/styles.d.ts +2 -2
  73. package/dist/components/MenuBuildIndicator.js +1 -1
  74. package/dist/components/MenuCompositionName.js +1 -1
  75. package/dist/components/Modals.js +7 -6
  76. package/dist/components/ModelManager.js +10 -9
  77. package/dist/components/MuteToggle.js +1 -1
  78. package/dist/components/NewComposition/CancelButton.js +10 -4
  79. package/dist/components/NewComposition/ComboBox.d.ts +1 -1
  80. package/dist/components/NewComposition/ComboBox.js +2 -2
  81. package/dist/components/NewComposition/DuplicateComposition.js +1 -1
  82. package/dist/components/NewComposition/InputDragger.d.ts +4 -2
  83. package/dist/components/NewComposition/InputDragger.js +29 -10
  84. package/dist/components/NewComposition/NewComposition.js +8 -7
  85. package/dist/components/NewComposition/RemInput.d.ts +1 -1
  86. package/dist/components/NewComposition/menu-typeahead.js +1 -1
  87. package/dist/components/OpenIssueButton.js +1 -1
  88. package/dist/components/OutlineToggle.js +1 -1
  89. package/dist/components/PlayPause.js +1 -1
  90. package/dist/components/PlaybackRateSelector.js +1 -1
  91. package/dist/components/PreviewToolbarOverflowButton.js +1 -1
  92. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
  93. package/dist/components/RenderButton.js +2 -4
  94. package/dist/components/RenderModal/InfoBubble.d.ts +1 -1
  95. package/dist/components/RenderModal/InfoBubble.js +2 -2
  96. package/dist/components/RenderModal/NumberSetting.js +1 -1
  97. package/dist/components/RenderModal/OptionExplainerBubble.js +2 -2
  98. package/dist/components/RenderModal/RenderModalAdvanced.js +2 -2
  99. package/dist/components/RenderModal/RenderModalAudio.js +2 -2
  100. package/dist/components/RenderModal/RenderModalBasic.js +3 -3
  101. package/dist/components/RenderModal/RenderModalEncoding.js +4 -4
  102. package/dist/components/RenderModal/RenderModalOutputName.js +1 -1
  103. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +1 -1
  104. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  105. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  106. package/dist/components/RenderModal/SchemaEditor/ZodFieldValidation.js +1 -1
  107. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  108. package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +1 -2
  109. package/dist/components/RenderModal/WebRenderModalAdvanced.js +2 -2
  110. package/dist/components/RenderModal/WebRenderModalAudio.js +2 -2
  111. package/dist/components/RenderModal/WebRenderModalBasic.js +3 -3
  112. package/dist/components/RenderModal/WebRenderModalPicture.js +2 -3
  113. package/dist/components/RenderQueue/CaptionQueueItem.js +14 -5
  114. package/dist/components/RenderQueue/CaptionQueueProcessor.js +30 -7
  115. package/dist/components/RenderQueue/QueueJobError.d.ts +8 -0
  116. package/dist/components/RenderQueue/QueueJobError.js +24 -0
  117. package/dist/components/RenderQueue/QueueJobErrorModal.d.ts +8 -0
  118. package/dist/components/RenderQueue/QueueJobErrorModal.js +63 -0
  119. package/dist/components/RenderQueue/RenderQueueError.js +1 -1
  120. package/dist/components/RenderQueue/RenderQueueItemCancelButton.d.ts +3 -1
  121. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +11 -4
  122. package/dist/components/RenderQueue/RenderQueueOutputName.js +1 -1
  123. package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
  124. package/dist/components/RenderQueue/RenderQueueRepeat.d.ts +3 -1
  125. package/dist/components/RenderQueue/RenderQueueRepeat.js +20 -3
  126. package/dist/components/RenderQueue/VideoMattingQueueItem.js +24 -27
  127. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +68 -28
  128. package/dist/components/RenderQueue/caption-job-types.d.ts +3 -1
  129. package/dist/components/RenderQueue/context.d.ts +4 -0
  130. package/dist/components/RenderQueue/context.js +58 -8
  131. package/dist/components/RenderQueue/index.js +2 -3
  132. package/dist/components/RenderQueue/load-model-for-job.d.ts +2 -1
  133. package/dist/components/RenderQueue/load-model-for-job.js +5 -1
  134. package/dist/components/RenderQueue/video-matting-job-types.d.ts +13 -6
  135. package/dist/components/RenderingSettings.js +6 -6
  136. package/dist/components/RulersAndGuidesToggle.js +1 -1
  137. package/dist/components/SegmentedButton.d.ts +0 -2
  138. package/dist/components/SegmentedButton.js +6 -6
  139. package/dist/components/SelectedOutlineCropControls.js +2 -1
  140. package/dist/components/SelectedOutlineEditingHandles.js +9 -2
  141. package/dist/components/SelectedOutlineElement.js +9 -3
  142. package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -4
  143. package/dist/components/SelectedOutlineKeyboardControls.js +4 -22
  144. package/dist/components/SelectedOutlineOverlay.js +165 -106
  145. package/dist/components/SelectedOutlinePathPoints.d.ts +8 -0
  146. package/dist/components/SelectedOutlinePathPoints.js +457 -0
  147. package/dist/components/SelectedOutlinePolygon.js +21 -46
  148. package/dist/components/SelectedOutlineRenderer.d.ts +3 -5
  149. package/dist/components/SelectedOutlineRenderer.js +32 -136
  150. package/dist/components/SelectedOutlineTransformOriginHandle.js +3 -2
  151. package/dist/components/SelectedOutlineUvControls.js +12 -7
  152. package/dist/components/SettingsButton.js +1 -1
  153. package/dist/components/SettingsModal.js +30 -3
  154. package/dist/components/SettingsModalFooter.d.ts +1 -0
  155. package/dist/components/SettingsModalFooter.js +7 -3
  156. package/dist/components/ShowOutlinesProvider.js +1 -1
  157. package/dist/components/SizeSelector.js +1 -1
  158. package/dist/components/SkillsSettings.d.ts +0 -1
  159. package/dist/components/SkillsSettings.js +14 -15
  160. package/dist/components/SnappingToggle.js +1 -1
  161. package/dist/components/Splitter/SplitterElement.js +1 -2
  162. package/dist/components/StudioSettings.js +2 -2
  163. package/dist/components/TimeValue.js +2 -4
  164. package/dist/components/Timeline/EasingEditorModal.js +3 -3
  165. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +1 -0
  166. package/dist/components/Timeline/LoopedTimelineIndicators.js +7 -6
  167. package/dist/components/Timeline/TimelineArrayField.js +3 -3
  168. package/dist/components/Timeline/TimelineAssetField.js +3 -3
  169. package/dist/components/Timeline/TimelineClipboardKeybindings.js +0 -1
  170. package/dist/components/Timeline/TimelineColorField.js +3 -3
  171. package/dist/components/Timeline/TimelineDragHandler.js +3 -3
  172. package/dist/components/Timeline/TimelineDuplicateCount.js +1 -1
  173. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  174. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  175. package/dist/components/Timeline/TimelineEffectPropItem.js +12 -5
  176. package/dist/components/Timeline/TimelineEnumField.js +1 -1
  177. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -0
  178. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  179. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -0
  180. package/dist/components/Timeline/TimelineExpandedSection.js +2 -2
  181. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +1 -0
  182. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +3 -1
  183. package/dist/components/Timeline/TimelineFieldLabel.js +1 -1
  184. package/dist/components/Timeline/TimelineFontFamilyField.js +14 -14
  185. package/dist/components/Timeline/TimelineFontWeightField.js +1 -1
  186. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -0
  187. package/dist/components/Timeline/TimelineKeyframeControls.js +42 -31
  188. package/dist/components/Timeline/TimelineKeyframeDiamond.js +1 -1
  189. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +1 -1
  190. package/dist/components/Timeline/TimelineLayerChildren.js +2 -2
  191. package/dist/components/Timeline/TimelineList.js +16 -8
  192. package/dist/components/Timeline/TimelineMediaInfo.js +1 -1
  193. package/dist/components/Timeline/TimelineNumberField.js +2 -4
  194. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  195. package/dist/components/Timeline/TimelineScaleField.js +1 -1
  196. package/dist/components/Timeline/TimelineSchemaField.js +2 -2
  197. package/dist/components/Timeline/TimelineSelection.d.ts +9 -9
  198. package/dist/components/Timeline/TimelineSelection.js +16 -9
  199. package/dist/components/Timeline/TimelineSequence.d.ts +3 -1
  200. package/dist/components/Timeline/TimelineSequence.js +40 -22
  201. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  202. package/dist/components/Timeline/TimelineSequenceItem.js +52 -24
  203. package/dist/components/Timeline/TimelineSequenceName.d.ts +1 -0
  204. package/dist/components/Timeline/TimelineSequenceName.js +38 -6
  205. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +3 -0
  206. package/dist/components/Timeline/TimelineSequencePropItem.js +266 -27
  207. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +11 -13
  208. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +98 -77
  209. package/dist/components/Timeline/TimelineTextContentField.js +27 -4
  210. package/dist/components/Timeline/TimelineTimeIndicators.js +10 -5
  211. package/dist/components/Timeline/TimelineTrack.js +1 -1
  212. package/dist/components/Timeline/TimelineTrimTooltip.d.ts +11 -0
  213. package/dist/components/Timeline/TimelineTrimTooltip.js +41 -0
  214. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  215. package/dist/components/Timeline/TimelineVideoInfo.js +13 -10
  216. package/dist/components/Timeline/TimelineZoomControls.js +2 -2
  217. package/dist/components/Timeline/delete-selected-keyframe.js +22 -8
  218. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +1 -5
  219. package/dist/components/Timeline/delete-selected-timeline-item.js +7 -93
  220. package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +2 -1
  221. package/dist/components/Timeline/get-animation-item-selection-for-frame.js +7 -5
  222. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.d.ts +23 -0
  223. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.js +57 -0
  224. package/dist/components/Timeline/get-node-keyframes.d.ts +2 -1
  225. package/dist/components/Timeline/get-node-keyframes.js +6 -4
  226. package/dist/components/Timeline/get-playback-rate-keyframe-changes.d.ts +21 -0
  227. package/dist/components/Timeline/get-playback-rate-keyframe-changes.js +142 -0
  228. package/dist/components/Timeline/get-sequence-split-menu-item.js +2 -2
  229. package/dist/components/Timeline/get-timeline-keyframes.d.ts +15 -2
  230. package/dist/components/Timeline/get-timeline-keyframes.js +44 -6
  231. package/dist/components/Timeline/keyframe-clipboard.js +17 -3
  232. package/dist/components/Timeline/split-selected-timeline-item.js +4 -1
  233. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  234. package/dist/components/Timeline/timeline-field-row-layout.js +1 -0
  235. package/dist/components/Timeline/use-delete-timeline-items.js +17 -11
  236. package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +2 -1
  237. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +3 -1
  238. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -3
  239. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +1 -1
  240. package/dist/components/Timeline/use-timeline-expanded-tree.js +3 -0
  241. package/dist/components/Timeline/use-timeline-keyframe-drag.js +28 -19
  242. package/dist/components/TimelineCombobox.d.ts +1 -1
  243. package/dist/components/TimelineCombobox.js +5 -6
  244. package/dist/components/TimelineInOutToggle.js +1 -1
  245. package/dist/components/Transcription/Models.js +1 -1
  246. package/dist/components/Transcription/TranscriptionModal.js +9 -7
  247. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +2 -1
  248. package/dist/components/Transcription/resample-media-to-16-khz.js +20 -2
  249. package/dist/components/UndoRedoButtons.js +1 -1
  250. package/dist/components/UpdatesSettings.js +4 -2
  251. package/dist/components/VideoMatting/Models.js +1 -1
  252. package/dist/components/VideoMatting/VideoMattingModal.js +34 -51
  253. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +1 -1
  254. package/dist/components/WebMcp.js +22 -40
  255. package/dist/components/composition-drop-preview.js +1 -0
  256. package/dist/components/effect-drag-and-drop.d.ts +13 -5
  257. package/dist/components/effect-drag-and-drop.js +19 -4
  258. package/dist/components/get-open-in-menu-items.d.ts +2 -1
  259. package/dist/components/get-open-in-menu-items.js +17 -1
  260. package/dist/components/selected-outline-drag.d.ts +1 -6
  261. package/dist/components/selected-outline-drag.js +22 -6
  262. package/dist/components/selected-outline-geometry.d.ts +2 -18
  263. package/dist/components/selected-outline-measurement.d.ts +23 -41
  264. package/dist/components/selected-outline-measurement.js +14 -252
  265. package/dist/components/selected-outline-order.d.ts +4 -11
  266. package/dist/components/selected-outline-order.js +2 -254
  267. package/dist/components/selected-outline-snap.d.ts +1 -1
  268. package/dist/components/selected-outline-snap.js +2 -1
  269. package/dist/components/selected-outline-types.d.ts +20 -28
  270. package/dist/components/selected-outline-uv.d.ts +4 -4
  271. package/dist/components/selected-outline-uv.js +6 -111
  272. package/dist/components/sequence-props-api.js +0 -10
  273. package/dist/components/use-selected-outline-control-target.js +12 -21
  274. package/dist/components/wrap-jsx-node-api.d.ts +2 -0
  275. package/dist/components/wrap-jsx-node-api.js +13 -0
  276. package/dist/error-overlay/remotion-overlay/CompositionIdListItem.js +1 -1
  277. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +46 -3
  278. package/dist/error-overlay/remotion-overlay/StackFrame.js +32 -3
  279. package/dist/esm/{CaptionQueueProcessor-npa6szn1.mjs → CaptionQueueProcessor-qj37c6r2.mjs} +63 -17
  280. package/dist/esm/LazyModels-rjsrgap5.mjs +12 -0
  281. package/dist/esm/LazyModels-rnbjx98t.mjs +12 -0
  282. package/dist/esm/{TranscriptionModal-79m5wgcj.mjs → TranscriptionModal-y7zeqj2d.mjs} +21 -21
  283. package/dist/esm/{VideoMattingModal-31pew0xj.mjs → VideoMattingModal-jzrkhah1.mjs} +51 -69
  284. package/dist/esm/{VideoMattingQueueProcessor-t1hgm2rm.mjs → VideoMattingQueueProcessor-4tkj0f4k.mjs} +69 -26
  285. package/dist/esm/{index-v4tr1bft.mjs → index-09txs1bj.mjs} +5 -0
  286. package/dist/esm/{index-e855w59j.mjs → index-19d05w9e.mjs} +3 -5
  287. package/dist/esm/index-24wge6y5.mjs +102 -0
  288. package/dist/esm/index-3qb54r5j.mjs +157 -0
  289. package/dist/esm/{index-n5gmcvhz.mjs → index-5ycb9e9q.mjs} +2 -4
  290. package/dist/esm/{index-s7qa3xbw.mjs → index-cakcjjy2.mjs} +7 -7
  291. package/dist/esm/{index-r1gr3j3a.mjs → index-dfy1t576.mjs} +50 -1
  292. package/dist/esm/{index-614tdz2q.mjs → index-f9hxt5yh.mjs} +3 -3
  293. package/dist/esm/{index-9x6e1dq0.mjs → index-hqxc6tzp.mjs} +40 -6
  294. package/dist/esm/{index-ac5550e7.mjs → index-jc22b2wb.mjs} +3 -3
  295. package/dist/esm/{index-5t2dwxsk.mjs → index-m01zjph7.mjs} +261 -25
  296. package/dist/esm/{index-ppspzgn9.mjs → index-m2a95v3p.mjs} +4904 -4951
  297. package/dist/esm/{index-9xxg6218.mjs → index-qve7mdfp.mjs} +19 -1
  298. package/dist/esm/{index-vxwg66ar.mjs → index-r9bj4tta.mjs} +47 -60
  299. package/dist/esm/{index-r0ejh5sy.mjs → index-vnc2wdfd.mjs} +44 -27
  300. package/dist/esm/{index-21hxsfaa.mjs → index-vtr5qzam.mjs} +6 -25
  301. package/dist/esm/{index-4zen9prq.mjs → index-x7kg7jqv.mjs} +6809 -5640
  302. package/dist/esm/index.mjs +4 -5
  303. package/dist/esm/internals.mjs +13 -13
  304. package/dist/esm/previewEntry.mjs +18 -15
  305. package/dist/esm/renderEntry.mjs +5 -1
  306. package/dist/helpers/calculate-timeline.d.ts +5 -1
  307. package/dist/helpers/calculate-timeline.js +1 -1
  308. package/dist/helpers/checkerboard-background.d.ts +2 -2
  309. package/dist/helpers/checkerboard-background.js +1 -1
  310. package/dist/helpers/colors.d.ts +131 -112
  311. package/dist/helpers/colors.js +121 -100
  312. package/dist/helpers/create-folder-tree.js +2 -1
  313. package/dist/helpers/editor-guide-selection.d.ts +1 -1
  314. package/dist/helpers/editor-ruler.js +23 -12
  315. package/dist/helpers/get-connected-compositions.d.ts +6 -1
  316. package/dist/helpers/get-connected-compositions.js +1 -1
  317. package/dist/helpers/get-sequence-double-click-action.js +1 -1
  318. package/dist/helpers/get-sequence-visible-range.d.ts +1 -1
  319. package/dist/helpers/get-sequence-visible-range.js +2 -5
  320. package/dist/helpers/get-timeline-nestedness.d.ts +1 -1
  321. package/dist/helpers/get-timeline-nestedness.js +1 -1
  322. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
  323. package/dist/helpers/get-timeline-sequence-sort-key.js +1 -1
  324. package/dist/helpers/hoverable.js +4 -4
  325. package/dist/helpers/inject-css.js +5 -7
  326. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -1
  327. package/dist/helpers/prism-vsc-dark-plus.js +52 -51
  328. package/dist/helpers/resolve-studio-color.d.ts +1 -0
  329. package/dist/helpers/resolve-studio-color.js +11 -0
  330. package/dist/helpers/studio-css-variables.d.ts +1 -0
  331. package/dist/helpers/studio-css-variables.js +104 -0
  332. package/dist/helpers/studio-pixel-ratio.d.ts +1 -0
  333. package/dist/helpers/studio-pixel-ratio.js +7 -0
  334. package/dist/helpers/timeline-node-path-key.d.ts +1 -1
  335. package/dist/helpers/timeline-node-path-key.js +2 -2
  336. package/dist/helpers/use-runtime-values.js +2 -28
  337. package/dist/hot-middleware-client/client.js +5 -3
  338. package/dist/icons/align-center-horizontal.js +2 -1
  339. package/dist/icons/align-left.js +2 -1
  340. package/dist/icons/align-right.js +2 -1
  341. package/dist/icons/{separation.d.ts → background-removal.d.ts} +1 -1
  342. package/dist/icons/background-removal.js +9 -0
  343. package/dist/icons/snowflake.js +1 -3
  344. package/dist/icons/{scissors.d.ts → split.d.ts} +1 -1
  345. package/dist/icons/split.js +8 -0
  346. package/dist/icons/trash.js +2 -2
  347. package/dist/icons/wrap.d.ts +4 -0
  348. package/dist/icons/wrap.js +10 -0
  349. package/dist/previewEntry.js +2 -0
  350. package/dist/renderEntry.js +2 -0
  351. package/dist/state/modals.d.ts +15 -1
  352. package/dist/state/timeline-sequence-hover.d.ts +6 -16
  353. package/dist/state/timeline-sequence-hover.js +6 -67
  354. package/package.json +20 -19
  355. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +0 -15
  356. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +0 -31
  357. package/dist/esm/LazyModels-nh3c8h9p.mjs +0 -12
  358. package/dist/esm/LazyModels-rr5v8h5y.mjs +0 -12
  359. package/dist/esm/index-cw0pnpg5.mjs +0 -50
  360. package/dist/esm/index-k426ye99.mjs +0 -139
  361. package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
  362. package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
  363. package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
  364. package/dist/helpers/get-box-quads-ponyfill.js +0 -23
  365. package/dist/icons/scissors.js +0 -8
  366. package/dist/icons/separation.js +0 -7
  367. /package/dist/esm/{resolve-composition-component-location-qrp05g62.mjs → resolve-composition-component-location-2hgf6g0a.mjs} +0 -0
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPlaybackRateKeyframeChanges = void 0;
4
+ const studio_shared_1 = require("@remotion/studio-shared");
5
+ const get_keyframed_sequence_drag_targets_1 = require("./get-keyframed-sequence-drag-targets");
6
+ const getPlaybackRateKeyframeChanges = ({ nodePath, sequences, overrideIdsToNodePaths, propStatuses, previousPlaybackRate, playbackRate, }) => {
7
+ var _a;
8
+ var _b;
9
+ const sequenceKeyframes = [];
10
+ const effectKeyframes = [];
11
+ const previews = [];
12
+ if (previousPlaybackRate === playbackRate ||
13
+ !Number.isFinite(previousPlaybackRate) ||
14
+ previousPlaybackRate <= 0 ||
15
+ !Number.isFinite(playbackRate) ||
16
+ playbackRate <= 0) {
17
+ return { sequenceKeyframes, effectKeyframes, previews };
18
+ }
19
+ const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath);
20
+ const root = sequences.find((sequence) => {
21
+ var _a;
22
+ const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
23
+ const path = overrideId ? overrideIdsToNodePaths[overrideId] : undefined;
24
+ return path && (0, studio_shared_1.stringifySequenceSubscriptionKey)(path) === key;
25
+ });
26
+ if (!root) {
27
+ return { sequenceKeyframes, effectKeyframes, previews };
28
+ }
29
+ const sequencesById = new Map(sequences.map((sequence) => [sequence.id, sequence]));
30
+ const ratio = previousPlaybackRate / playbackRate;
31
+ const includedNodePaths = new Set();
32
+ for (const sequence of sequences) {
33
+ let ancestorId = sequence.id;
34
+ let belongsToRoot = false;
35
+ let descendantOffset = 0;
36
+ while (ancestorId !== null) {
37
+ if (ancestorId === root.id) {
38
+ belongsToRoot = true;
39
+ break;
40
+ }
41
+ const ancestor = sequencesById.get(ancestorId);
42
+ if (!ancestor) {
43
+ break;
44
+ }
45
+ descendantOffset += ancestor.from - ((_b = ancestor.trimBefore) !== null && _b !== void 0 ? _b : 0);
46
+ ancestorId = ancestor.parent;
47
+ }
48
+ if (!belongsToRoot) {
49
+ continue;
50
+ }
51
+ const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
52
+ const descendantNodePath = overrideId
53
+ ? overrideIdsToNodePaths[overrideId]
54
+ : undefined;
55
+ if (!descendantNodePath) {
56
+ continue;
57
+ }
58
+ const descendantKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)(descendantNodePath);
59
+ if (includedNodePaths.has(descendantKey)) {
60
+ continue;
61
+ }
62
+ includedNodePaths.add(descendantKey);
63
+ // Local-clock descendant keyframes already follow their parent's rate.
64
+ // The shared collector includes only outer-clock descendants.
65
+ const targets = (0, get_keyframed_sequence_drag_targets_1.getKeyframedSequenceDragTargets)({
66
+ nodePath: descendantNodePath,
67
+ sequence,
68
+ sequences,
69
+ propStatuses,
70
+ isDescendant: sequence.id !== root.id,
71
+ });
72
+ const addMoves = (target, effectIndex) => {
73
+ var _a;
74
+ const adjustment = (_a = target.status.keyframeDisplayOffsetAdjustment) !== null && _a !== void 0 ? _a : 0;
75
+ // The adjustment includes the timing offsets between this element and
76
+ // the useCurrentFrame() binding. Remove the descendant offsets to find
77
+ // the edited element's start in that binding's source clock.
78
+ const anchor = sequence.id === root.id
79
+ ? root.from - adjustment
80
+ : -adjustment - descendantOffset;
81
+ if (!Number.isFinite(anchor)) {
82
+ return;
83
+ }
84
+ const nextKeyframes = target.status.keyframes.map((keyframe) => {
85
+ const frame = anchor + (keyframe.frame - anchor) * ratio;
86
+ const nearestInteger = Math.round(frame);
87
+ return {
88
+ ...keyframe,
89
+ frame: Math.abs(frame - nearestInteger) <=
90
+ Number.EPSILON * Math.max(1, Math.abs(frame)) * 2
91
+ ? nearestInteger
92
+ : frame,
93
+ };
94
+ });
95
+ if (nextKeyframes.some((keyframe) => !Number.isFinite(keyframe.frame)) ||
96
+ new Set(nextKeyframes.map((keyframe) => keyframe.frame)).size !==
97
+ nextKeyframes.length) {
98
+ return;
99
+ }
100
+ const moves = target.status.keyframes.flatMap((keyframe, index) => {
101
+ var _a;
102
+ const toFrame = (_a = nextKeyframes[index]) === null || _a === void 0 ? void 0 : _a.frame;
103
+ if (toFrame === undefined || toFrame === keyframe.frame) {
104
+ return [];
105
+ }
106
+ return [
107
+ {
108
+ fileName: target.fileName,
109
+ nodePath: target.nodePath,
110
+ fieldKey: target.fieldKey,
111
+ fromFrame: keyframe.frame,
112
+ toFrame,
113
+ schema: target.schema,
114
+ },
115
+ ];
116
+ });
117
+ if (moves.length === 0) {
118
+ return;
119
+ }
120
+ previews.push({
121
+ nodePath: target.nodePath,
122
+ fieldKey: target.fieldKey,
123
+ effectIndex,
124
+ status: { ...target.status, keyframes: nextKeyframes },
125
+ });
126
+ if (effectIndex === null) {
127
+ sequenceKeyframes.push(...moves);
128
+ }
129
+ else {
130
+ effectKeyframes.push(...moves.map((move) => ({ ...move, effectIndex })));
131
+ }
132
+ };
133
+ for (const target of targets.sequenceKeyframes) {
134
+ addMoves(target, null);
135
+ }
136
+ for (const target of targets.effectKeyframes) {
137
+ addMoves(target, target.effectIndex);
138
+ }
139
+ }
140
+ return { sequenceKeyframes, effectKeyframes, previews };
141
+ };
142
+ exports.getPlaybackRateKeyframeChanges = getPlaybackRateKeyframeChanges;
@@ -28,12 +28,12 @@ const getSequenceSplitMenuItem = ({ nodePathInfo, sequence, propStatuses, splitF
28
28
  return {
29
29
  type: 'item',
30
30
  id: 'split-sequence',
31
- label: (jsx_runtime_1.jsx("span", { style: {
31
+ label: (jsx_runtime_1.jsx("span", { role: "group", style: {
32
32
  fontFamily: 'inherit',
33
33
  fontSize: 'inherit',
34
34
  lineHeight: 'inherit',
35
35
  color: 'inherit',
36
- }, title: disabledReason !== null && disabledReason !== void 0 ? disabledReason : 'Split at the playhead', children: "Split clip" })),
36
+ }, "aria-label": disabledReason !== null && disabledReason !== void 0 ? disabledReason : 'Split at the playhead', children: "Split clip" })),
37
37
  value: 'split-sequence',
38
38
  keyHint: null,
39
39
  leftItem: null,
@@ -1,9 +1,22 @@
1
1
  import type { CanUpdateSequencePropStatus } from 'remotion';
2
- export declare const getTimelineKeyframes: (propStatus: CanUpdateSequencePropStatus | null | undefined, keyframeDisplayOffset?: number) => {
2
+ export type KeyframeSourceFrame = number | {
3
+ readonly displayFrame: number;
4
+ readonly keyframeDisplayOffset: number;
5
+ readonly keyframePlaybackRate: number;
6
+ };
7
+ export declare const getKeyframeSourceFrame: ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }: {
8
+ displayFrame: number;
9
+ keyframeDisplayOffset: number;
10
+ keyframePlaybackRate: number;
11
+ propStatus: CanUpdateSequencePropStatus | null;
12
+ }) => number;
13
+ export declare const resolveKeyframeSourceFrame: (sourceFrame: KeyframeSourceFrame, propStatus: CanUpdateSequencePropStatus | null) => number;
14
+ export declare const getTimelineKeyframes: (propStatus: CanUpdateSequencePropStatus | null | undefined, keyframeDisplayOffset?: number, keyframePlaybackRate?: number) => {
3
15
  frame: number;
4
16
  value: unknown;
5
17
  }[];
6
- export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, }: {
18
+ export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }: {
7
19
  propStatus: CanUpdateSequencePropStatus | null | undefined;
8
20
  keyframeDisplayOffset: number;
21
+ keyframePlaybackRate: number;
9
22
  }) => number;
@@ -1,7 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = void 0;
4
- const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0) => {
3
+ exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = exports.resolveKeyframeSourceFrame = exports.getKeyframeSourceFrame = void 0;
4
+ const getKeyframeSourceFrame = ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }) => {
5
+ const sourceFrame = (displayFrame - keyframeDisplayOffset) * keyframePlaybackRate;
6
+ if ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'keyframed') {
7
+ return sourceFrame;
8
+ }
9
+ // Converting a displayed keyframe back to source frames may introduce rounding
10
+ // error. Resolve its original frame so edits keep the existing keyframe identity,
11
+ // including when source keyframes themselves have fractional frames.
12
+ const tolerance = Number.EPSILON *
13
+ Math.max(1, Math.abs(displayFrame), Math.abs(keyframeDisplayOffset)) *
14
+ keyframePlaybackRate *
15
+ 8;
16
+ let closestFrame = sourceFrame;
17
+ let closestDistance = Infinity;
18
+ for (const keyframe of propStatus.keyframes) {
19
+ const distance = Math.abs(keyframe.frame - sourceFrame);
20
+ if (distance <= tolerance && distance < closestDistance) {
21
+ closestFrame = keyframe.frame;
22
+ closestDistance = distance;
23
+ }
24
+ }
25
+ return closestFrame;
26
+ };
27
+ exports.getKeyframeSourceFrame = getKeyframeSourceFrame;
28
+ const resolveKeyframeSourceFrame = (sourceFrame, propStatus) => {
29
+ return (0, exports.getKeyframeSourceFrame)({
30
+ ...(typeof sourceFrame === 'number'
31
+ ? {
32
+ displayFrame: sourceFrame,
33
+ keyframeDisplayOffset: 0,
34
+ keyframePlaybackRate: 1,
35
+ }
36
+ : sourceFrame),
37
+ propStatus,
38
+ });
39
+ };
40
+ exports.resolveKeyframeSourceFrame = resolveKeyframeSourceFrame;
41
+ const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0, keyframePlaybackRate = 1) => {
5
42
  if (!propStatus) {
6
43
  return [];
7
44
  }
@@ -12,22 +49,23 @@ const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0) => {
12
49
  const resolvedKeyframeDisplayOffset = (0, exports.getKeyframeDisplayOffset)({
13
50
  propStatus,
14
51
  keyframeDisplayOffset,
52
+ keyframePlaybackRate,
15
53
  });
16
- if (resolvedKeyframeDisplayOffset === 0) {
54
+ if (resolvedKeyframeDisplayOffset === 0 && keyframePlaybackRate === 1) {
17
55
  return keyframes;
18
56
  }
19
57
  return keyframes.map((keyframe) => ({
20
58
  ...keyframe,
21
- frame: keyframe.frame + resolvedKeyframeDisplayOffset,
59
+ frame: keyframe.frame / keyframePlaybackRate + resolvedKeyframeDisplayOffset,
22
60
  }));
23
61
  };
24
62
  exports.getTimelineKeyframes = getTimelineKeyframes;
25
- const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, }) => {
63
+ const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }) => {
26
64
  return (keyframeDisplayOffset +
27
65
  ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' || (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static'
28
66
  ? propStatus.keyframeDisplayOffsetAdjustment === null
29
67
  ? 0
30
- : propStatus.keyframeDisplayOffsetAdjustment
68
+ : propStatus.keyframeDisplayOffsetAdjustment / keyframePlaybackRate
31
69
  : 0));
32
70
  };
33
71
  exports.getKeyframeDisplayOffset = getKeyframeDisplayOffset;
@@ -69,9 +69,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
69
69
  fieldKey: identity.fieldKey,
70
70
  }),
71
71
  propStatus: sequencePropStatus,
72
+ keyframePlaybackRate: track.keyframePlaybackRate,
72
73
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
73
74
  propStatus: sequencePropStatus,
74
75
  keyframeDisplayOffset: track.keyframeDisplayOffset,
76
+ keyframePlaybackRate: track.keyframePlaybackRate,
75
77
  }),
76
78
  };
77
79
  }
@@ -97,9 +99,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
97
99
  fieldKey: identity.fieldKey,
98
100
  }),
99
101
  propStatus: effectPropStatus,
102
+ keyframePlaybackRate: track.keyframePlaybackRate,
100
103
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
101
104
  propStatus: effectPropStatus,
102
105
  keyframeDisplayOffset: track.keyframeDisplayOffset,
106
+ keyframePlaybackRate: track.keyframePlaybackRate,
103
107
  }),
104
108
  };
105
109
  };
@@ -147,7 +151,12 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
147
151
  }
148
152
  const keyframes = [];
149
153
  for (const { selection } of resolvedFields) {
150
- const sourceFrame = selection.frame - firstResolved.keyframeDisplayOffset;
154
+ const sourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
155
+ displayFrame: selection.frame,
156
+ keyframeDisplayOffset: firstResolved.keyframeDisplayOffset,
157
+ keyframePlaybackRate: firstResolved.keyframePlaybackRate,
158
+ propStatus: keyframedPropStatus,
159
+ });
151
160
  const keyframe = keyframedPropStatus.keyframes.find((item) => item.frame === sourceFrame);
152
161
  if (keyframe === undefined ||
153
162
  JSON.stringify(keyframe.value) === undefined) {
@@ -195,7 +204,7 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
195
204
  },
196
205
  keyframes: keyframes.map((keyframe) => {
197
206
  return {
198
- frameOffset: keyframe.frame - firstFrame,
207
+ frameOffset: (keyframe.frame - firstFrame) / firstResolved.keyframePlaybackRate,
199
208
  value: keyframe.value,
200
209
  };
201
210
  }),
@@ -260,7 +269,12 @@ const getPasteKeyframeTarget = ({ selectedItems, payload, timelinePosition, sequ
260
269
  return { type: 'multiple' };
261
270
  }
262
271
  const keyframes = payload.keyframes.map((keyframe) => ({
263
- sourceFrame: timelinePosition - resolved.keyframeDisplayOffset + keyframe.frameOffset,
272
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
273
+ displayFrame: timelinePosition + keyframe.frameOffset,
274
+ keyframeDisplayOffset: resolved.keyframeDisplayOffset,
275
+ keyframePlaybackRate: resolved.keyframePlaybackRate,
276
+ propStatus: resolved.propStatus,
277
+ }),
264
278
  value: keyframe.value,
265
279
  }));
266
280
  const firstFrame = (_b = keyframes[0]) === null || _b === void 0 ? void 0 : _b.sourceFrame;
@@ -147,7 +147,10 @@ const splitSelectedTimelineItems = ({ selections, sequences, overrideIdsToNodePa
147
147
  if (eligibility.canSplit) {
148
148
  eligible.push({
149
149
  nodePathInfo: eligibility.nodePathInfo,
150
- splitFrame,
150
+ splitFrame: track
151
+ ? (splitFrame - track.keyframeDisplayOffset) *
152
+ track.keyframePlaybackRate
153
+ : splitFrame,
151
154
  });
152
155
  }
153
156
  else {
@@ -240,6 +240,7 @@ const formatTimelineFieldValueForDisplay = ({ fieldSchema, value, }) => {
240
240
  case 'uv-coordinate':
241
241
  return ((_e = formatUvCoordinateTimelineFieldValueForDisplay({ fieldSchema, value })) !== null && _e !== void 0 ? _e : formatUnknownTimelineValueForDisplay(value));
242
242
  case 'text-content':
243
+ case 'svg-path':
243
244
  return String(value);
244
245
  case 'asset':
245
246
  case 'array':
@@ -6,6 +6,7 @@ const timeline_row_layout_1 = require("./timeline-row-layout");
6
6
  exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
7
7
  const isTimelineFieldStacked = ({ field, transform3DMode, }) => {
8
8
  return (field.typeName === 'text-content' ||
9
+ field.typeName === 'svg-path' ||
9
10
  (transform3DMode &&
10
11
  (field.typeName === 'translate' ||
11
12
  field.typeName === 'rotation-css' ||
@@ -55,17 +55,9 @@ const useDeleteTimelineItems = () => {
55
55
  timelinePosition,
56
56
  });
57
57
  if (deletePromise !== null) {
58
- deletePromise
59
- .then((deleted) => {
60
- if (!deleted) {
61
- return;
62
- }
58
+ const updateSelectionAfterDeletion = () => {
63
59
  const nextSelection = (0, delete_selected_timeline_item_1.getTimelineSelectionAfterDeletingItems)({
64
60
  selections: selectedItems,
65
- sequences,
66
- overrideIdsToNodePaths: overrideIdToNodePathMappings,
67
- propStatuses,
68
- timelinePosition,
69
61
  });
70
62
  if (nextSelection.length === 0) {
71
63
  clearSelection();
@@ -73,8 +65,22 @@ const useDeleteTimelineItems = () => {
73
65
  else {
74
66
  selectItems(nextSelection);
75
67
  }
76
- })
77
- .catch(() => undefined);
68
+ };
69
+ if (selectedItems.some((item) => item.type === 'keyframe')) {
70
+ // Keyframes are removed optimistically. Update selection in the same
71
+ // event so easing segments cannot inherit the deleted segments' indices.
72
+ updateSelectionAfterDeletion();
73
+ deletePromise.catch(() => undefined);
74
+ }
75
+ else {
76
+ deletePromise
77
+ .then((deleted) => {
78
+ if (deleted) {
79
+ updateSelectionAfterDeletion();
80
+ }
81
+ })
82
+ .catch(() => undefined);
83
+ }
78
84
  return;
79
85
  }
80
86
  const easingSelections = (0, update_selected_easing_1.getEasingSelections)(selectedItems);
@@ -8,10 +8,11 @@ export type ExpandedTrackKeyframeRow = {
8
8
  readonly nodePathInfo: SequenceNodePathInfo;
9
9
  readonly rowKey: string;
10
10
  };
11
- export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, }: {
11
+ export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, }: {
12
12
  sequence: TSequence;
13
13
  nodePathInfo: SequenceNodePathInfo;
14
14
  keyframeDisplayOffset: number;
15
+ keyframePlaybackRate: number;
15
16
  }) => {
16
17
  readonly rows: ExpandedTrackKeyframeRow[];
17
18
  readonly expandedHeight: number;
@@ -62,7 +62,7 @@ const getNodeCanEditEasing = ({ node, nodePath, propStatuses, }) => {
62
62
  return ((effectPropStatus === null || effectPropStatus === void 0 ? void 0 : effectPropStatus.status) === 'keyframed' &&
63
63
  (0, studio_shared_1.canEditEasingForInterpolationFunction)(effectPropStatus.interpolationFunction));
64
64
  };
65
- const useExpandedTrackKeyframeRows = ({ sequence, nodePathInfo, keyframeDisplayOffset, }) => {
65
+ const useExpandedTrackKeyframeRows = ({ sequence, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, }) => {
66
66
  const { getIsExpanded } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksGetterContext);
67
67
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
68
68
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -123,6 +123,7 @@ const useExpandedTrackKeyframeRows = ({ sequence, nodePathInfo, keyframeDisplayO
123
123
  nodePath: nodePathInfo.sequenceSubscriptionKey,
124
124
  propStatuses,
125
125
  keyframeDisplayOffset,
126
+ keyframePlaybackRate,
126
127
  getDragOverrides,
127
128
  getEffectDragOverrides,
128
129
  timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
@@ -132,6 +133,7 @@ const useExpandedTrackKeyframeRows = ({ sequence, nodePathInfo, keyframeDisplayO
132
133
  getDragOverrides,
133
134
  getEffectDragOverrides,
134
135
  keyframeDisplayOffset,
136
+ keyframePlaybackRate,
135
137
  nodePathInfo.sequenceSubscriptionKey,
136
138
  propStatuses,
137
139
  ]);
@@ -12,10 +12,14 @@ const isSequenceVisibleAtTimelinePosition = ({ sequence, timelinePosition, }) =>
12
12
  };
13
13
  exports.isSequenceVisibleAtTimelinePosition = isSequenceVisibleAtTimelinePosition;
14
14
  const calculateSequenceFreezeFrame = ({ sequence, sequenceFrameOffset, timelinePosition, }) => {
15
- const rawFreezeFrame = Math.round(timelinePosition - sequence.from + sequenceFrameOffset);
16
- const minFrame = sequenceFrameOffset;
15
+ const rawFreezeFrame = (timelinePosition - sequence.from) * sequence.sequencePlaybackRate +
16
+ sequenceFrameOffset;
17
+ const minFrame = (Math.ceil(sequence.from) - sequence.from) * sequence.sequencePlaybackRate +
18
+ sequenceFrameOffset;
17
19
  const maxFrame = Number.isFinite(sequence.duration)
18
- ? Math.max(minFrame, sequence.duration + sequenceFrameOffset - 1)
20
+ ? Math.max(minFrame, (Math.ceil(sequence.from + sequence.duration) - 1 - sequence.from) *
21
+ sequence.sequencePlaybackRate +
22
+ sequenceFrameOffset)
19
23
  : Infinity;
20
24
  return Math.min(Math.max(minFrame, rawFreezeFrame), maxFrame);
21
25
  };
@@ -2,7 +2,7 @@ import { type TSequence } from 'remotion';
2
2
  import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const useTimelineSequenceHasExpandableContent: ({ sequence, nodePathInfo, selectedItems, }: {
4
4
  readonly sequence: TSequence;
5
- readonly nodePathInfo: SequenceNodePathInfo;
5
+ readonly nodePathInfo: SequenceNodePathInfo | null;
6
6
  readonly selectedItems: readonly import("@remotion/canvas").CanvasSelectionItem[];
7
7
  }) => boolean;
8
8
  export declare const useTimelineExpandedTree: ({ sequence, nodePathInfo, includeTextContent, includeSourceControls, }: {
@@ -14,6 +14,9 @@ const useTimelineSequenceHasExpandableContent = ({ sequence, nodePathInfo, selec
14
14
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
15
15
  const selectedRowKeys = (0, react_1.useMemo)(() => (0, timeline_expanded_filter_1.getSelectedTimelineExpandedRowKeys)(selectedItems), [selectedItems]);
16
16
  const selectHasExpandableContent = (0, react_1.useCallback)((runtimeValues) => {
17
+ if (nodePathInfo === null) {
18
+ return false;
19
+ }
17
20
  const tree = (0, timeline_layout_1.buildTimelineTree)({
18
21
  sequence,
19
22
  nodePathInfo,
@@ -102,7 +102,7 @@ const getTimelineSelectionsAfterEasingKeyframeDrag = ({ delta, selections, targe
102
102
  exports.getTimelineSelectionsAfterEasingKeyframeDrag = getTimelineSelectionsAfterEasingKeyframeDrag;
103
103
  const getCodeValueForTarget = ({ propStatuses, nodePath, }) => propStatuses[remotion_1.Internals.makeSequencePropsSubscriptionKey(nodePath)];
104
104
  const getTimelineKeyframeDragTarget = ({ propStatuses, displayFrame, nodePathInfo, overrideIdsToNodePaths, sequences, }) => {
105
- var _a, _b, _c;
105
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
106
106
  const field = (0, parse_keyframe_field_from_node_path_1.parseKeyframeFieldFromNodePath)(nodePathInfo.auxiliaryKeys);
107
107
  if (field === null) {
108
108
  return null;
@@ -132,11 +132,16 @@ const getTimelineKeyframeDragTarget = ({ propStatuses, displayFrame, nodePathInf
132
132
  if ((effectPropStatus === null || effectPropStatus === void 0 ? void 0 : effectPropStatus.status) !== 'keyframed') {
133
133
  return null;
134
134
  }
135
- const effectSourceFrame = displayFrame -
136
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
135
+ const effectSourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
136
+ displayFrame,
137
+ propStatus: effectPropStatus,
138
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
137
139
  propStatus: effectPropStatus,
138
140
  keyframeDisplayOffset: (_b = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _b !== void 0 ? _b : 0,
139
- });
141
+ keyframePlaybackRate: (_c = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _c !== void 0 ? _c : 1,
142
+ }),
143
+ keyframePlaybackRate: (_d = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _d !== void 0 ? _d : 1,
144
+ });
140
145
  if (!effectPropStatus.keyframes.some((keyframe) => keyframe.frame === effectSourceFrame)) {
141
146
  return null;
142
147
  }
@@ -151,17 +156,23 @@ const getTimelineKeyframeDragTarget = ({ propStatuses, displayFrame, nodePathInf
151
156
  propStatus: effectPropStatus,
152
157
  schema: effect.schema,
153
158
  sourceFrame: effectSourceFrame,
159
+ keyframePlaybackRate: (_e = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _e !== void 0 ? _e : 1,
154
160
  };
155
161
  }
156
162
  const sequencePropStatus = sequenceStatus.props[field.fieldKey];
157
163
  if ((sequencePropStatus === null || sequencePropStatus === void 0 ? void 0 : sequencePropStatus.status) !== 'keyframed') {
158
164
  return null;
159
165
  }
160
- const sourceFrame = displayFrame -
161
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
166
+ const sourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
167
+ displayFrame,
168
+ propStatus: sequencePropStatus,
169
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
162
170
  propStatus: sequencePropStatus,
163
- keyframeDisplayOffset: (_c = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _c !== void 0 ? _c : 0,
164
- });
171
+ keyframeDisplayOffset: (_f = track === null || track === void 0 ? void 0 : track.keyframeDisplayOffset) !== null && _f !== void 0 ? _f : 0,
172
+ keyframePlaybackRate: (_g = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _g !== void 0 ? _g : 1,
173
+ }),
174
+ keyframePlaybackRate: (_h = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _h !== void 0 ? _h : 1,
175
+ });
165
176
  if (!sequencePropStatus.keyframes.some((keyframe) => keyframe.frame === sourceFrame)) {
166
177
  return null;
167
178
  }
@@ -175,6 +186,7 @@ const getTimelineKeyframeDragTarget = ({ propStatuses, displayFrame, nodePathInf
175
186
  propStatus: sequencePropStatus,
176
187
  schema: sequence.controls.schema,
177
188
  sourceFrame,
189
+ keyframePlaybackRate: (_j = track === null || track === void 0 ? void 0 : track.keyframePlaybackRate) !== null && _j !== void 0 ? _j : 1,
178
190
  };
179
191
  };
180
192
  const getTargetGroupKey = (target) => {
@@ -196,10 +208,11 @@ const groupTargets = (targets) => {
196
208
  }
197
209
  return [...groups.values()];
198
210
  };
199
- const getMovesForGroup = ({ group, delta, }) => group.map((target) => ({
211
+ const getMoveForTarget = (target, delta) => ({
200
212
  fromFrame: target.sourceFrame,
201
- toFrame: target.sourceFrame + delta,
202
- }));
213
+ toFrame: (0, get_timeline_keyframes_1.resolveKeyframeSourceFrame)(target.sourceFrame + delta * target.keyframePlaybackRate, target.propStatus),
214
+ });
215
+ const getMovesForGroup = ({ group, delta, }) => group.map((target) => getMoveForTarget(target, delta));
203
216
  const canMoveTimelineKeyframeDragTargets = ({ targets, delta, }) => groupTargets(targets).every((group) => {
204
217
  const [first] = group;
205
218
  if (!first) {
@@ -422,8 +435,7 @@ const useTimelineKeyframeDrag = ({ frame, nodePathInfo, onSelect, selectable, se
422
435
  fileName: target.fileName,
423
436
  nodePath: target.nodePath,
424
437
  fieldKey: target.fieldKey,
425
- fromFrame: target.sourceFrame,
426
- toFrame: target.sourceFrame + lastDelta,
438
+ ...getMoveForTarget(target, lastDelta),
427
439
  schema: target.schema,
428
440
  })),
429
441
  effectKeyframes: targets
@@ -433,8 +445,7 @@ const useTimelineKeyframeDrag = ({ frame, nodePathInfo, onSelect, selectable, se
433
445
  nodePath: target.nodePath,
434
446
  effectIndex: target.effectIndex,
435
447
  fieldKey: target.fieldKey,
436
- fromFrame: target.sourceFrame,
437
- toFrame: target.sourceFrame + lastDelta,
448
+ ...getMoveForTarget(target, lastDelta),
438
449
  schema: target.schema,
439
450
  })),
440
451
  setPropStatuses,
@@ -629,8 +640,7 @@ const useTimelineEasingKeyframeDrag = ({ onSelect, selectable, selected, selecti
629
640
  fileName: target.fileName,
630
641
  nodePath: target.nodePath,
631
642
  fieldKey: target.fieldKey,
632
- fromFrame: target.sourceFrame,
633
- toFrame: target.sourceFrame + lastDelta,
643
+ ...getMoveForTarget(target, lastDelta),
634
644
  schema: target.schema,
635
645
  })),
636
646
  effectKeyframes: targets
@@ -640,8 +650,7 @@ const useTimelineEasingKeyframeDrag = ({ onSelect, selectable, selected, selecti
640
650
  nodePath: target.nodePath,
641
651
  effectIndex: target.effectIndex,
642
652
  fieldKey: target.fieldKey,
643
- fromFrame: target.sourceFrame,
644
- toFrame: target.sourceFrame + lastDelta,
653
+ ...getMoveForTarget(target, lastDelta),
645
654
  schema: target.schema,
646
655
  })),
647
656
  setPropStatuses,
@@ -4,7 +4,7 @@ import type { ComboboxValue } from './NewComposition/ComboBox';
4
4
  export declare const TimelineCombobox: React.FC<{
5
5
  readonly values: ComboboxValue[];
6
6
  readonly selectedId: string | number;
7
- readonly title: string;
7
+ readonly 'aria-label': string;
8
8
  readonly tooltipDelay: number | null;
9
9
  readonly labelWidth?: number;
10
10
  readonly renderLeftItem?: RenderInlineAction;
@@ -23,31 +23,30 @@ const label = {
23
23
  WebkitUserSelect: 'none',
24
24
  whiteSpace: 'nowrap',
25
25
  };
26
- const TimelineCombobox = ({ values, selectedId, title, tooltipDelay, labelWidth = 32, renderLeftItem, unhoveredIconColor = colors_1.LIGHT_TEXT, }) => {
26
+ const TimelineCombobox = ({ values, selectedId, 'aria-label': ariaLabel, tooltipDelay, labelWidth = 32, renderLeftItem, unhoveredIconColor = colors_1.LIGHT_TEXT, }) => {
27
27
  const selected = values.find((value) => value.id === selectedId);
28
28
  const segments = [
29
29
  {
30
- ariaLabel: title,
30
+ ariaLabel,
31
31
  buttonId: null,
32
32
  disabled: false,
33
33
  idleColor: unhoveredIconColor,
34
34
  leaveLeftSpace: true,
35
35
  onOpenChange: null,
36
36
  renderContent: (color) => (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem(color), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
37
- ] })) : null, selected ? (jsx_runtime_1.jsx("div", { title: tooltipDelay === null && typeof selected.label === 'string'
37
+ ] })) : null, selected ? (jsx_runtime_1.jsx("div", { role: "group", "aria-label": tooltipDelay === null && typeof selected.label === 'string'
38
38
  ? selected.label
39
39
  : undefined, style: { ...label, width: labelWidth }, children: selected.label })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { color: color })
40
40
  ] })),
41
41
  segmentId: 'selector',
42
42
  selectedId,
43
43
  style: { fontFamily: 'inherit', padding: '0 4px' },
44
- title: tooltipDelay === null ? title : null,
45
44
  tooltipLabel: null,
46
45
  type: 'menu',
47
46
  values,
48
47
  },
49
48
  ];
50
- const button = (jsx_runtime_1.jsx(SegmentedButton_1.SegmentedButton, { segments: segments, style: segmentedButtonStyle, title: null }));
51
- return tooltipDelay === null ? (button) : (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: title, shortcut: null, delay: tooltipDelay, dismissOnClick: true, children: button }));
49
+ const button = (jsx_runtime_1.jsx(SegmentedButton_1.SegmentedButton, { segments: segments, style: segmentedButtonStyle }));
50
+ return tooltipDelay === null ? (button) : (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: ariaLabel, shortcut: null, delay: tooltipDelay, dismissOnClick: true, children: button }));
52
51
  };
53
52
  exports.TimelineCombobox = TimelineCombobox;