@remotion/studio 4.0.527 → 4.0.528

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/dist/components/AgentPrompt.js +1 -2
  2. package/dist/components/AudioWaveform.d.ts +1 -0
  3. package/dist/components/AudioWaveform.js +10 -14
  4. package/dist/components/CodeFrame.js +1 -1
  5. package/dist/components/ColorPicker/checker.d.ts +1 -1
  6. package/dist/components/CurrentAsset.js +3 -2
  7. package/dist/components/EditorRuler/Ruler.js +6 -3
  8. package/dist/components/EffectPickerModal.js +69 -43
  9. package/dist/components/ElementInstallConfirmation.js +3 -3
  10. package/dist/components/ElementLibrariesSettings.d.ts +2 -0
  11. package/dist/components/ElementLibrariesSettings.js +200 -0
  12. package/dist/components/InitialCompositionLoader.js +3 -1
  13. package/dist/components/InspectorOpenInEditor.js +13 -0
  14. package/dist/components/InspectorPanel/AlignmentControls.js +28 -9
  15. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +1 -1
  16. package/dist/components/InspectorPanel/EasingInspector.js +6 -2
  17. package/dist/components/InspectorPanel/ElementLibraryButton.js +1 -1
  18. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +1 -1
  19. package/dist/components/InspectorPanel/KeyframeInspector.js +28 -24
  20. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +1 -1
  21. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -1
  22. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +30 -2
  23. package/dist/components/InspectorPanel/SequenceWrapAction.d.ts +8 -0
  24. package/dist/components/InspectorPanel/SequenceWrapAction.js +151 -0
  25. package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +2 -1
  26. package/dist/components/InspectorPanel/easing-inspector-selection.js +4 -3
  27. package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +2 -1
  28. package/dist/components/InspectorPanel/keyframe-inspector-frame.js +2 -2
  29. package/dist/components/InspectorSequenceSection.d.ts +1 -0
  30. package/dist/components/InspectorSequenceSection.js +7 -5
  31. package/dist/components/KeyboardShortcutsSettings.js +1 -1
  32. package/dist/components/Menu/styles.d.ts +2 -2
  33. package/dist/components/Modals.js +7 -6
  34. package/dist/components/ModelManager.js +10 -9
  35. package/dist/components/NewComposition/CancelButton.js +10 -4
  36. package/dist/components/NewComposition/InputDragger.d.ts +3 -1
  37. package/dist/components/NewComposition/InputDragger.js +28 -9
  38. package/dist/components/NewComposition/NewComposition.js +7 -6
  39. package/dist/components/NewComposition/RemInput.d.ts +1 -1
  40. package/dist/components/NewComposition/menu-typeahead.js +1 -1
  41. package/dist/components/Preview.js +3 -2
  42. package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +1 -2
  43. package/dist/components/RenderModal/WebRenderModalPicture.js +1 -2
  44. package/dist/components/RenderQueue/CaptionQueueItem.js +14 -5
  45. package/dist/components/RenderQueue/CaptionQueueProcessor.js +30 -7
  46. package/dist/components/RenderQueue/QueueJobError.d.ts +8 -0
  47. package/dist/components/RenderQueue/QueueJobError.js +24 -0
  48. package/dist/components/RenderQueue/QueueJobErrorModal.d.ts +8 -0
  49. package/dist/components/RenderQueue/QueueJobErrorModal.js +63 -0
  50. package/dist/components/RenderQueue/RenderQueueItemCancelButton.d.ts +3 -1
  51. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +11 -4
  52. package/dist/components/RenderQueue/RenderQueueRepeat.d.ts +3 -1
  53. package/dist/components/RenderQueue/RenderQueueRepeat.js +20 -3
  54. package/dist/components/RenderQueue/VideoMattingQueueItem.js +24 -27
  55. package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +68 -28
  56. package/dist/components/RenderQueue/caption-job-types.d.ts +3 -1
  57. package/dist/components/RenderQueue/context.d.ts +4 -0
  58. package/dist/components/RenderQueue/context.js +58 -8
  59. package/dist/components/RenderQueue/index.js +2 -3
  60. package/dist/components/RenderQueue/load-model-for-job.d.ts +2 -1
  61. package/dist/components/RenderQueue/load-model-for-job.js +5 -1
  62. package/dist/components/RenderQueue/video-matting-job-types.d.ts +13 -6
  63. package/dist/components/SelectedOutlineCropControls.js +2 -1
  64. package/dist/components/SelectedOutlineEditingHandles.js +9 -2
  65. package/dist/components/SelectedOutlineElement.js +9 -3
  66. package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -4
  67. package/dist/components/SelectedOutlineKeyboardControls.js +4 -22
  68. package/dist/components/SelectedOutlineOverlay.js +152 -106
  69. package/dist/components/SelectedOutlinePathPoints.d.ts +8 -0
  70. package/dist/components/SelectedOutlinePathPoints.js +433 -0
  71. package/dist/components/SelectedOutlinePolygon.js +21 -46
  72. package/dist/components/SelectedOutlineRenderer.d.ts +3 -5
  73. package/dist/components/SelectedOutlineRenderer.js +32 -136
  74. package/dist/components/SelectedOutlineTransformOriginHandle.js +3 -2
  75. package/dist/components/SelectedOutlineUvControls.js +12 -7
  76. package/dist/components/SettingsModal.js +30 -3
  77. package/dist/components/SettingsModalFooter.d.ts +1 -0
  78. package/dist/components/SettingsModalFooter.js +7 -3
  79. package/dist/components/ShowOutlinesProvider.js +1 -1
  80. package/dist/components/SkillsSettings.d.ts +0 -1
  81. package/dist/components/SkillsSettings.js +13 -14
  82. package/dist/components/Splitter/SplitterElement.js +1 -2
  83. package/dist/components/TimeValue.js +1 -1
  84. package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +1 -0
  85. package/dist/components/Timeline/LoopedTimelineIndicators.js +7 -6
  86. package/dist/components/Timeline/TimelineArrayField.js +1 -1
  87. package/dist/components/Timeline/TimelineClipboardKeybindings.js +0 -1
  88. package/dist/components/Timeline/TimelineColorField.js +1 -1
  89. package/dist/components/Timeline/TimelineDragHandler.js +1 -1
  90. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  91. package/dist/components/Timeline/TimelineEffectPropItem.js +12 -5
  92. package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -0
  93. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  94. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -0
  95. package/dist/components/Timeline/TimelineExpandedSection.js +2 -2
  96. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +1 -0
  97. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +3 -1
  98. package/dist/components/Timeline/TimelineFontFamilyField.js +12 -12
  99. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -0
  100. package/dist/components/Timeline/TimelineKeyframeControls.js +39 -28
  101. package/dist/components/Timeline/TimelineLayerChildren.js +1 -1
  102. package/dist/components/Timeline/TimelineList.js +1 -1
  103. package/dist/components/Timeline/TimelineNumberField.js +2 -4
  104. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  105. package/dist/components/Timeline/TimelineSelection.d.ts +9 -9
  106. package/dist/components/Timeline/TimelineSelection.js +16 -9
  107. package/dist/components/Timeline/TimelineSequence.d.ts +3 -1
  108. package/dist/components/Timeline/TimelineSequence.js +39 -21
  109. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  110. package/dist/components/Timeline/TimelineSequenceItem.js +18 -8
  111. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +3 -0
  112. package/dist/components/Timeline/TimelineSequencePropItem.js +262 -25
  113. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +11 -13
  114. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +98 -77
  115. package/dist/components/Timeline/TimelineTextContentField.js +27 -4
  116. package/dist/components/Timeline/TimelineTimeIndicators.js +10 -5
  117. package/dist/components/Timeline/TimelineTrack.js +1 -1
  118. package/dist/components/Timeline/TimelineTrimTooltip.d.ts +11 -0
  119. package/dist/components/Timeline/TimelineTrimTooltip.js +41 -0
  120. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  121. package/dist/components/Timeline/TimelineVideoInfo.js +13 -10
  122. package/dist/components/Timeline/delete-selected-keyframe.js +22 -8
  123. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +1 -5
  124. package/dist/components/Timeline/delete-selected-timeline-item.js +7 -93
  125. package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +2 -1
  126. package/dist/components/Timeline/get-animation-item-selection-for-frame.js +7 -5
  127. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.d.ts +23 -0
  128. package/dist/components/Timeline/get-keyframed-sequence-drag-targets.js +57 -0
  129. package/dist/components/Timeline/get-node-keyframes.d.ts +2 -1
  130. package/dist/components/Timeline/get-node-keyframes.js +6 -4
  131. package/dist/components/Timeline/get-playback-rate-keyframe-changes.d.ts +21 -0
  132. package/dist/components/Timeline/get-playback-rate-keyframe-changes.js +142 -0
  133. package/dist/components/Timeline/get-timeline-keyframes.d.ts +15 -2
  134. package/dist/components/Timeline/get-timeline-keyframes.js +44 -6
  135. package/dist/components/Timeline/keyframe-clipboard.js +17 -3
  136. package/dist/components/Timeline/split-selected-timeline-item.js +4 -1
  137. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  138. package/dist/components/Timeline/timeline-field-row-layout.js +1 -0
  139. package/dist/components/Timeline/use-delete-timeline-items.js +17 -11
  140. package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +2 -1
  141. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +3 -1
  142. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -3
  143. package/dist/components/Timeline/use-timeline-keyframe-drag.js +28 -19
  144. package/dist/components/Transcription/Models.js +1 -1
  145. package/dist/components/Transcription/TranscriptionModal.js +3 -1
  146. package/dist/components/Transcription/resample-media-to-16-khz.d.ts +2 -1
  147. package/dist/components/Transcription/resample-media-to-16-khz.js +20 -2
  148. package/dist/components/UpdatesSettings.js +2 -0
  149. package/dist/components/VideoMatting/Models.js +1 -1
  150. package/dist/components/VideoMatting/VideoMattingModal.js +30 -47
  151. package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +1 -1
  152. package/dist/components/WebMcp.js +22 -40
  153. package/dist/components/composition-drop-preview.js +1 -0
  154. package/dist/components/effect-drag-and-drop.d.ts +13 -5
  155. package/dist/components/effect-drag-and-drop.js +19 -4
  156. package/dist/components/get-open-in-menu-items.d.ts +2 -1
  157. package/dist/components/get-open-in-menu-items.js +17 -1
  158. package/dist/components/selected-outline-drag.d.ts +1 -6
  159. package/dist/components/selected-outline-drag.js +22 -6
  160. package/dist/components/selected-outline-geometry.d.ts +2 -18
  161. package/dist/components/selected-outline-measurement.d.ts +23 -41
  162. package/dist/components/selected-outline-measurement.js +14 -252
  163. package/dist/components/selected-outline-order.d.ts +4 -11
  164. package/dist/components/selected-outline-order.js +2 -254
  165. package/dist/components/selected-outline-snap.d.ts +1 -1
  166. package/dist/components/selected-outline-snap.js +2 -1
  167. package/dist/components/selected-outline-types.d.ts +18 -28
  168. package/dist/components/selected-outline-uv.d.ts +4 -4
  169. package/dist/components/selected-outline-uv.js +6 -111
  170. package/dist/components/sequence-props-api.js +0 -10
  171. package/dist/components/use-selected-outline-control-target.js +12 -21
  172. package/dist/components/wrap-jsx-node-api.d.ts +2 -0
  173. package/dist/components/wrap-jsx-node-api.js +13 -0
  174. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +45 -2
  175. package/dist/error-overlay/remotion-overlay/StackFrame.js +32 -3
  176. package/dist/esm/{CaptionQueueProcessor-npa6szn1.mjs → CaptionQueueProcessor-nr7hjcga.mjs} +63 -17
  177. package/dist/esm/LazyModels-ajkn7fs3.mjs +12 -0
  178. package/dist/esm/LazyModels-g1g7cf4e.mjs +12 -0
  179. package/dist/esm/{TranscriptionModal-79m5wgcj.mjs → TranscriptionModal-e18bzbkb.mjs} +15 -15
  180. package/dist/esm/{VideoMattingModal-31pew0xj.mjs → VideoMattingModal-5bz2s4rs.mjs} +47 -65
  181. package/dist/esm/{VideoMattingQueueProcessor-t1hgm2rm.mjs → VideoMattingQueueProcessor-4tkj0f4k.mjs} +69 -26
  182. package/dist/esm/{index-v4tr1bft.mjs → index-09txs1bj.mjs} +5 -0
  183. package/dist/esm/{index-n5gmcvhz.mjs → index-5ycb9e9q.mjs} +2 -4
  184. package/dist/esm/{index-5t2dwxsk.mjs → index-890dd9b3.mjs} +259 -21
  185. package/dist/esm/{index-ac5550e7.mjs → index-8nt6a0mw.mjs} +3 -3
  186. package/dist/esm/{index-614tdz2q.mjs → index-9q9w8v9p.mjs} +3 -3
  187. package/dist/esm/{index-s7qa3xbw.mjs → index-c2wabcdt.mjs} +6 -6
  188. package/dist/esm/{index-r1gr3j3a.mjs → index-dfy1t576.mjs} +50 -1
  189. package/dist/esm/{index-21hxsfaa.mjs → index-dh3zk2hv.mjs} +6 -25
  190. package/dist/esm/{index-4zen9prq.mjs → index-dpyss74p.mjs} +6563 -5485
  191. package/dist/esm/{index-9x6e1dq0.mjs → index-hqxc6tzp.mjs} +40 -6
  192. package/dist/esm/{index-9xxg6218.mjs → index-qve7mdfp.mjs} +19 -1
  193. package/dist/esm/{index-e855w59j.mjs → index-s6qya2gg.mjs} +3 -5
  194. package/dist/esm/index-t7tbt980.mjs +103 -0
  195. package/dist/esm/{index-r0ejh5sy.mjs → index-t7xnxdf8.mjs} +44 -26
  196. package/dist/esm/index-wqc43mw0.mjs +158 -0
  197. package/dist/esm/{index-ppspzgn9.mjs → index-x6r9bn12.mjs} +4026 -4761
  198. package/dist/esm/{index-vxwg66ar.mjs → index-xac20sv4.mjs} +44 -57
  199. package/dist/esm/index.mjs +4 -5
  200. package/dist/esm/internals.mjs +13 -13
  201. package/dist/esm/previewEntry.mjs +18 -15
  202. package/dist/esm/renderEntry.mjs +5 -1
  203. package/dist/helpers/calculate-timeline.d.ts +5 -1
  204. package/dist/helpers/calculate-timeline.js +1 -1
  205. package/dist/helpers/checkerboard-background.d.ts +2 -2
  206. package/dist/helpers/colors.d.ts +132 -112
  207. package/dist/helpers/colors.js +117 -95
  208. package/dist/helpers/create-folder-tree.js +2 -1
  209. package/dist/helpers/editor-guide-selection.d.ts +1 -1
  210. package/dist/helpers/editor-ruler.js +23 -12
  211. package/dist/helpers/get-connected-compositions.d.ts +6 -1
  212. package/dist/helpers/get-connected-compositions.js +1 -1
  213. package/dist/helpers/get-sequence-double-click-action.js +1 -1
  214. package/dist/helpers/get-sequence-visible-range.d.ts +1 -1
  215. package/dist/helpers/get-sequence-visible-range.js +2 -5
  216. package/dist/helpers/get-timeline-nestedness.d.ts +1 -1
  217. package/dist/helpers/get-timeline-nestedness.js +1 -1
  218. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
  219. package/dist/helpers/get-timeline-sequence-sort-key.js +1 -1
  220. package/dist/helpers/hoverable.js +4 -4
  221. package/dist/helpers/inject-css.js +5 -7
  222. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -1
  223. package/dist/helpers/prism-vsc-dark-plus.js +52 -51
  224. package/dist/helpers/resolve-studio-color.d.ts +1 -0
  225. package/dist/helpers/resolve-studio-color.js +11 -0
  226. package/dist/helpers/studio-css-variables.d.ts +1 -0
  227. package/dist/helpers/studio-css-variables.js +105 -0
  228. package/dist/helpers/studio-pixel-ratio.d.ts +1 -0
  229. package/dist/helpers/studio-pixel-ratio.js +7 -0
  230. package/dist/helpers/timeline-node-path-key.d.ts +1 -1
  231. package/dist/helpers/timeline-node-path-key.js +2 -2
  232. package/dist/helpers/use-runtime-values.js +2 -28
  233. package/dist/hot-middleware-client/client.js +5 -3
  234. package/dist/icons/align-center-horizontal.js +2 -1
  235. package/dist/icons/align-left.js +2 -1
  236. package/dist/icons/align-right.js +2 -1
  237. package/dist/icons/{separation.d.ts → background-removal.d.ts} +1 -1
  238. package/dist/icons/background-removal.js +9 -0
  239. package/dist/icons/wrap.d.ts +4 -0
  240. package/dist/icons/wrap.js +10 -0
  241. package/dist/previewEntry.js +2 -0
  242. package/dist/renderEntry.js +2 -0
  243. package/dist/state/modals.d.ts +15 -1
  244. package/dist/state/timeline-sequence-hover.d.ts +6 -16
  245. package/dist/state/timeline-sequence-hover.js +6 -67
  246. package/package.json +20 -19
  247. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +0 -15
  248. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +0 -31
  249. package/dist/esm/LazyModels-nh3c8h9p.mjs +0 -12
  250. package/dist/esm/LazyModels-rr5v8h5y.mjs +0 -12
  251. package/dist/esm/index-cw0pnpg5.mjs +0 -50
  252. package/dist/esm/index-k426ye99.mjs +0 -139
  253. package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
  254. package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
  255. package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
  256. package/dist/helpers/get-box-quads-ponyfill.js +0 -23
  257. package/dist/icons/separation.js +0 -7
  258. /package/dist/esm/{resolve-composition-component-location-qrp05g62.mjs → resolve-composition-component-location-2hgf6g0a.mjs} +0 -0
@@ -7,18 +7,19 @@ const LoopedIndicator_1 = require("./LoopedIndicator");
7
7
  const row = {
8
8
  overflow: 'hidden',
9
9
  };
10
- const LoopedTimelineIndicator = ({ loops, fullWidth, visibleOffset, visibleWidth }) => {
11
- if (loops <= 1 || fullWidth <= 0 || visibleWidth <= 0) {
10
+ const LoopedTimelineIndicator = ({ loops, phase, fullWidth, visibleOffset, visibleWidth }) => {
11
+ if (loops + phase <= 1 || fullWidth <= 0 || visibleWidth <= 0) {
12
12
  return null;
13
13
  }
14
14
  const loopWidth = fullWidth / loops;
15
- const lastBoundaryIndex = Math.ceil(loops) - 1;
16
- const firstVisibleBoundaryIndex = Math.max(1, Math.floor(visibleOffset / loopWidth));
17
- const lastVisibleBoundaryIndex = Math.min(lastBoundaryIndex, Math.ceil((visibleOffset + visibleWidth) / loopWidth));
15
+ const phaseWidth = phase * loopWidth;
16
+ const lastBoundaryIndex = Math.ceil(loops + phase) - 1;
17
+ const firstVisibleBoundaryIndex = Math.max(1, Math.floor((visibleOffset + phaseWidth) / loopWidth));
18
+ const lastVisibleBoundaryIndex = Math.min(lastBoundaryIndex, Math.ceil((visibleOffset + visibleWidth + phaseWidth) / loopWidth));
18
19
  const visibleBoundaryCount = Math.max(0, lastVisibleBoundaryIndex - firstVisibleBoundaryIndex + 1);
19
20
  const boundaries = new Array(visibleBoundaryCount)
20
21
  .fill(true)
21
- .map((_, index) => (firstVisibleBoundaryIndex + index) * loopWidth);
22
+ .map((_, index) => (firstVisibleBoundaryIndex + index) * loopWidth - phaseWidth);
22
23
  return (jsx_runtime_1.jsx(remotion_1.Internals.AbsoluteFillElement, { style: row, children: boundaries.map((boundary) => {
23
24
  return (jsx_runtime_1.jsx("div", { style: {
24
25
  position: 'absolute',
@@ -67,7 +67,7 @@ const getFallbackItemValue = (field) => {
67
67
  return [0.5, 0.5];
68
68
  }
69
69
  if (field.item.type === 'color') {
70
- return colors_1.BLACK_FULL_HEX;
70
+ return '#000000';
71
71
  }
72
72
  if (field.item.type === 'enum') {
73
73
  const [firstVariant] = field.item.variants;
@@ -560,7 +560,6 @@ const TimelineClipboardKeybindings = () => {
560
560
  }
561
561
  const nextSelection = (0, delete_selected_timeline_item_1.getTimelineSelectionAfterDeletingItems)({
562
562
  selections: selectedItems,
563
- propStatuses,
564
563
  });
565
564
  if (nextSelection.length === 0) {
566
565
  clearSelection();
@@ -31,7 +31,7 @@ const TimelineColorField = ({ field, effectiveValue, propStatus, onSave, onDragV
31
31
  const currentValue = typeof effectiveValue === 'string'
32
32
  ? effectiveValue
33
33
  : field.fieldSchema.type === 'color'
34
- ? ((_a = field.fieldSchema.default) !== null && _a !== void 0 ? _a : colors_1.BLACK_HEX)
34
+ ? ((_a = field.fieldSchema.default) !== null && _a !== void 0 ? _a : '#000')
35
35
  : '';
36
36
  const onChange = (0, react_1.useCallback)((next) => {
37
37
  onDragValueChange(next);
@@ -122,7 +122,7 @@ const TimelineDragHandlerInner = () => {
122
122
  shouldApplyCssTransforms: true,
123
123
  });
124
124
  const { isHighestContext } = (0, z_index_1.useZIndex)();
125
- const setFrame = remotion_1.Internals.useTimelineSetFrame();
125
+ const setFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
126
126
  const width = (0, timeline_scroll_logic_1.getTimelineContentWidth)();
127
127
  const left = (_a = size === null || size === void 0 ? void 0 : size.left) !== null && _a !== void 0 ? _a : 0;
128
128
  const [dragging, setDragging] = (0, react_1.useState)({
@@ -18,6 +18,7 @@ export declare const TimelineEffectPropItem: React.FC<{
18
18
  readonly nodePath: SequencePropsSubscriptionKey;
19
19
  readonly nodePathInfo: SequenceNodePathInfo;
20
20
  readonly keyframeDisplayOffset: number;
21
+ readonly keyframePlaybackRate: number;
21
22
  readonly keyframeControlsMode: TimelineKeyframeControlsMode;
22
23
  readonly revealInInspector: boolean;
23
24
  readonly runtimeValueStore: RuntimeValueStore | null;
@@ -228,11 +228,16 @@ const TimelineEffectPropValue = ({ field, nodePath, validatedLocation, sourceFra
228
228
  return (jsx_runtime_1.jsx(TimelineSchemaField_1.TimelineFieldValue, { field: field, propStatus: propStatus, onSave: onSave, onDragValueChange: onDragValueChange, onDragEnd: onDragEnd, effectiveValue: effectiveValue, scaleLockNodePath: null }));
229
229
  };
230
230
  exports.TimelineEffectPropValue = TimelineEffectPropValue;
231
- const TimelineEffectPropValueAtCurrentFrame = ({ field, nodePath, validatedLocation, keyframeDisplayOffset, runtimeValueStore, }) => {
231
+ const TimelineEffectPropValueAtCurrentFrame = ({ field, nodePath, validatedLocation, keyframeDisplayOffset, keyframePlaybackRate, propStatus, runtimeValueStore, }) => {
232
232
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
233
- return (jsx_runtime_1.jsx(exports.TimelineEffectPropValue, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, sourceFrame: timelinePosition - keyframeDisplayOffset, runtimeValueStore: runtimeValueStore }));
233
+ return (jsx_runtime_1.jsx(exports.TimelineEffectPropValue, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
234
+ displayFrame: timelinePosition,
235
+ keyframeDisplayOffset,
236
+ keyframePlaybackRate,
237
+ propStatus,
238
+ }), runtimeValueStore: runtimeValueStore }));
234
239
  };
235
- const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath, nodePathInfo, keyframeDisplayOffset, keyframeControlsMode, revealInInspector, runtimeValueStore, }) => {
240
+ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, keyframeControlsMode, revealInInspector, runtimeValueStore, }) => {
236
241
  var _a;
237
242
  var _b;
238
243
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
@@ -241,6 +246,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
241
246
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
242
247
  const { getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
243
248
  const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo, revealInInspector);
249
+ const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(nodePathInfo);
244
250
  const style = (0, react_1.useMemo)(() => {
245
251
  return field.typeName === 'text-content'
246
252
  ? fieldRowBase
@@ -257,6 +263,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
257
263
  const resolvedKeyframeDisplayOffset = (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
258
264
  propStatus,
259
265
  keyframeDisplayOffset,
266
+ keyframePlaybackRate,
260
267
  });
261
268
  const dragOverrideValue = (0, react_1.useMemo)(() => {
262
269
  const overrides = getEffectDragOverrides(nodePath, field.effectIndex);
@@ -273,7 +280,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
273
280
  propStatus,
274
281
  selected: selection.selected,
275
282
  keyframable,
276
- })) ? (jsx_runtime_1.jsx(TimelineKeyframeControls_1.TimelineKeyframeControls, { fieldKey: field.key, propStatus: propStatus, nodePath: nodePath, fileName: validatedLocation.source, keyframeDisplayOffset: keyframeDisplayOffset, defaultValue: field.fieldSchema.default, dragOverrideValue: dragOverrideValue, schema: field.effectSchema, effectIndex: field.effectIndex, nodePathInfo: nodePathInfo, mode: keyframeControlsMode })) : null;
283
+ })) ? (jsx_runtime_1.jsx(TimelineKeyframeControls_1.TimelineKeyframeControls, { fieldKey: field.key, propStatus: propStatus, nodePath: nodePath, fileName: validatedLocation.source, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, defaultValue: field.fieldSchema.default, dragOverrideValue: dragOverrideValue, schema: field.effectSchema, effectIndex: field.effectIndex, nodePathInfo: nodePathInfo, mode: keyframeControlsMode })) : null;
277
284
  const canResetToDefault = (0, react_1.useMemo)(() => {
278
285
  if (!propStatus || propStatus.status === 'computed') {
279
286
  return false;
@@ -361,7 +368,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
361
368
  property: field.key,
362
369
  }).catch(() => undefined);
363
370
  }, [canOpenInEditor, defaultEditorId, field.key, validatedLocation]);
364
- const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), keyframeControls: keyframeControls, arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: style, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected, children: jsx_runtime_1.jsx(TimelineEffectPropValueAtCurrentFrame, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, keyframeDisplayOffset: resolvedKeyframeDisplayOffset, runtimeValueStore: runtimeValueStore }) }) }));
371
+ const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), keyframeControls: keyframeControls, arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: style, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: containsSelection, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected || containsSelection, children: jsx_runtime_1.jsx(TimelineEffectPropValueAtCurrentFrame, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, keyframeDisplayOffset: resolvedKeyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, propStatus: propStatus, runtimeValueStore: runtimeValueStore }) }) }));
365
372
  return jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: row });
366
373
  };
367
374
  exports.TimelineEffectPropItem = TimelineEffectPropItem;
@@ -16,6 +16,7 @@ type TimelineExpandedRowProps = {
16
16
  readonly nodePath: SequencePropsSubscriptionKey;
17
17
  readonly schema: InteractivitySchema;
18
18
  readonly keyframeDisplayOffset: number;
19
+ readonly keyframePlaybackRate: number;
19
20
  readonly keyframeControlsMode: TimelineKeyframeControlsMode;
20
21
  };
21
22
  export declare const TimelineExpandedRow: React.NamedExoticComponent<TimelineExpandedRowProps>;
@@ -22,10 +22,11 @@ const rowLabel = {
22
22
  userSelect: 'none',
23
23
  WebkitUserSelect: 'none',
24
24
  };
25
- const TimelineExpandedRowInner = ({ node, depth, nestedDepth, rowDepthBase, getIsExpanded, toggleTrack, validatedLocation, nodePath, schema, keyframeDisplayOffset, keyframeControlsMode, }) => {
25
+ const TimelineExpandedRowInner = ({ node, depth, nestedDepth, rowDepthBase, getIsExpanded, toggleTrack, validatedLocation, nodePath, schema, keyframeDisplayOffset, keyframePlaybackRate, keyframeControlsMode, }) => {
26
26
  const rowDepth = (rowDepthBase !== null && rowDepthBase !== void 0 ? rowDepthBase : (0, timeline_row_layout_1.getExpandedRowDepth)({ nestedDepth, treeDepth: 0 })) + depth;
27
27
  const isInspector = keyframeControlsMode === 'inspector';
28
28
  const selection = (0, TimelineSelection_1.useTimelineRowSelection)(node.nodePathInfo);
29
+ const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(node.nodePathInfo);
29
30
  const labelStyle = react_1.default.useMemo(() => ({
30
31
  ...rowLabel,
31
32
  ...(0, TimelineSelection_1.getTimelineSelectedLabelStyle)(selection.selected, true),
@@ -47,14 +48,14 @@ const TimelineExpandedRowInner = ({ node, depth, nestedDepth, rowDepthBase, getI
47
48
  const isExpanded = getIsExpanded(node.nodePathInfo);
48
49
  return (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: () => toggleTrack(node.nodePathInfo), label: `${node.label} section`, disabled: false }), style: {
49
50
  height: timeline_layout_1.TREE_GROUP_ROW_HEIGHT,
50
- }, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx("span", { style: labelStyle, children: node.label }) }));
51
+ }, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: containsSelection, outerHeight: null, children: jsx_runtime_1.jsx("span", { style: labelStyle, children: node.label }) }));
51
52
  }
52
53
  if (node.field) {
53
54
  if (node.field.kind === 'effect-field') {
54
- return (jsx_runtime_1.jsx(TimelineEffectPropItem_1.TimelineEffectPropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: isInspector ? rowDepth - 1 : rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: keyframeControlsMode, revealInInspector: !isInspector, runtimeValueStore: node.runtimeValueStore }));
55
+ return (jsx_runtime_1.jsx(TimelineEffectPropItem_1.TimelineEffectPropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: isInspector ? rowDepth - 1 : rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, keyframeControlsMode: keyframeControlsMode, revealInInspector: !isInspector, runtimeValueStore: node.runtimeValueStore }));
55
56
  }
56
57
  if (node.field.kind === 'sequence-field') {
57
- return (jsx_runtime_1.jsx(TimelineSequencePropItem_1.TimelineSequencePropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: keyframeControlsMode, runtimeValue: node.runtimeValue }));
58
+ return (jsx_runtime_1.jsx(TimelineSequencePropItem_1.TimelineSequencePropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, keyframeControlsMode: keyframeControlsMode, runtimeValue: node.runtimeValue }));
58
59
  }
59
60
  throw new Error('Unexpected field kind: ' + JSON.stringify(node.field));
60
61
  }
@@ -8,4 +8,5 @@ export declare const TimelineExpandedSection: React.FC<{
8
8
  readonly nodePathInfo: SequenceNodePathInfo;
9
9
  readonly nestedDepth: number;
10
10
  readonly keyframeDisplayOffset: number;
11
+ readonly keyframePlaybackRate: number;
11
12
  }>;
@@ -55,7 +55,7 @@ const separator = {
55
55
  height: 0,
56
56
  borderBottom: `1px solid ${colors_1.TIMELINE_TRACK_SEPARATOR}`,
57
57
  };
58
- const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, nestedDepth, keyframeDisplayOffset, }) => {
58
+ const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, nestedDepth, keyframeDisplayOffset, keyframePlaybackRate, }) => {
59
59
  const { filteredTree, getIsExpanded, toggleTrack } = (0, use_timeline_expanded_tree_1.useTimelineExpandedTree)({
60
60
  sequence,
61
61
  nodePathInfo,
@@ -79,7 +79,7 @@ const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, ne
79
79
  return null;
80
80
  }
81
81
  return (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowSelectedBackgroundContext.Provider, { value: TimelineSelection_1.TIMELINE_EXPANDED_SELECTED_BACKGROUND, children: jsx_runtime_1.jsx("div", { style: style, children: flat.map(({ node, depth }, i) => {
82
- return (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [i > 0 ? jsx_runtime_1.jsx("div", { style: separator }) : null, jsx_runtime_1.jsx(TimelineExpandedRow_1.TimelineExpandedRow, { node: node, depth: depth, nestedDepth: nestedDepth, getIsExpanded: getIsExpanded, toggleTrack: toggleTrack, validatedLocation: validatedLocation, nodePath: nodePathInfo.sequenceSubscriptionKey, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: "timeline" })
82
+ return (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [i > 0 ? jsx_runtime_1.jsx("div", { style: separator }) : null, jsx_runtime_1.jsx(TimelineExpandedRow_1.TimelineExpandedRow, { node: node, depth: depth, nestedDepth: nestedDepth, getIsExpanded: getIsExpanded, toggleTrack: toggleTrack, validatedLocation: validatedLocation, nodePath: nodePathInfo.sequenceSubscriptionKey, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, keyframeControlsMode: "timeline" })
83
83
  ] }, JSON.stringify(node.nodePathInfo)));
84
84
  }) }) }));
85
85
  };
@@ -5,6 +5,7 @@ type TimelineExpandedTrackKeyframesProps = {
5
5
  readonly sequence: TSequence;
6
6
  readonly nodePathInfo: SequenceNodePathInfo;
7
7
  readonly keyframeDisplayOffset: number;
8
+ readonly keyframePlaybackRate: number;
8
9
  };
9
10
  export declare const TimelineExpandedTrackKeyframes: React.NamedExoticComponent<TimelineExpandedTrackKeyframesProps>;
10
11
  export {};
@@ -9,17 +9,19 @@ const react_1 = __importDefault(require("react"));
9
9
  const are_sequence_node_path_infos_equal_1 = require("../../helpers/are-sequence-node-path-infos-equal");
10
10
  const TimelineExpandedKeyframeRow_1 = require("./TimelineExpandedKeyframeRow");
11
11
  const use_expanded_track_keyframe_rows_1 = require("./use-expanded-track-keyframe-rows");
12
- const TimelineExpandedTrackKeyframesInner = ({ nodePathInfo, sequence, keyframeDisplayOffset }) => {
12
+ const TimelineExpandedTrackKeyframesInner = ({ nodePathInfo, sequence, keyframeDisplayOffset, keyframePlaybackRate }) => {
13
13
  const { rows, expandedHeight } = (0, use_expanded_track_keyframe_rows_1.useExpandedTrackKeyframeRows)({
14
14
  sequence,
15
15
  nodePathInfo,
16
16
  keyframeDisplayOffset,
17
+ keyframePlaybackRate,
17
18
  });
18
19
  return (jsx_runtime_1.jsx("div", { style: { height: expandedHeight }, children: rows.map((row, index) => (jsx_runtime_1.jsx(TimelineExpandedKeyframeRow_1.TimelineExpandedKeyframeRow, { height: row.height, keyframes: row.keyframes, canEditEasing: row.canEditEasing, nodePathInfo: row.nodePathInfo, showSeparator: index > 0 }, row.rowKey))) }));
19
20
  };
20
21
  const areTimelineExpandedTrackKeyframesPropsEqual = (first, second) => {
21
22
  var _a, _b, _c, _d;
22
23
  return (first.keyframeDisplayOffset === second.keyframeDisplayOffset &&
24
+ first.keyframePlaybackRate === second.keyframePlaybackRate &&
23
25
  ((_a = first.sequence.controls) === null || _a === void 0 ? void 0 : _a.schema) === ((_b = second.sequence.controls) === null || _b === void 0 ? void 0 : _b.schema) &&
24
26
  ((_c = first.sequence.controls) === null || _c === void 0 ? void 0 : _c.runtimeValues) ===
25
27
  ((_d = second.sequence.controls) === null || _d === void 0 ? void 0 : _d.runtimeValues) &&
@@ -22,9 +22,9 @@ const ROW_HEIGHT = 30;
22
22
  const LIST_HEIGHT = 280;
23
23
  const OVERSCAN = 10;
24
24
  const POPOVER_WIDTH = 280;
25
- const CLEAR_HOVER = 'rgba(255, 255, 255, 0.06)';
26
- const INPUT_BORDER_COLOR_UNHOVERED = 'rgba(0, 0, 0, 0.6)';
27
- const INPUT_BORDER_COLOR_HOVERED = 'rgba(255, 255, 255, 0.05)';
25
+ const CLEAR_HOVER = colors_1.WHITE_ALPHA_06;
26
+ const INPUT_BORDER_COLOR_UNHOVERED = colors_1.BLACK_ALPHA_60;
27
+ const INPUT_BORDER_COLOR_HOVERED = colors_1.WHITE_ALPHA_05;
28
28
  const googleFonts = google_fonts_list_1.GOOGLE_FONTS_LIST.map((font) => ({
29
29
  id: `google-${font.importName}`,
30
30
  fontFamily: font.fontFamily,
@@ -67,7 +67,7 @@ const triggerStyle = {
67
67
  borderWidth: 1,
68
68
  borderStyle: 'solid',
69
69
  maxWidth: 140,
70
- color: 'white',
70
+ color: colors_1.WHITE,
71
71
  userSelect: 'none',
72
72
  WebkitUserSelect: 'none',
73
73
  };
@@ -83,17 +83,17 @@ const popover = {
83
83
  position: 'fixed',
84
84
  width: POPOVER_WIDTH,
85
85
  backgroundColor: colors_1.BACKGROUND,
86
- color: 'white',
86
+ color: colors_1.WHITE,
87
87
  userSelect: 'none',
88
88
  WebkitUserSelect: 'none',
89
- border: '1px solid rgba(255, 255, 255, 0.08)',
89
+ border: `1px solid ${colors_1.WHITE_ALPHA_08}`,
90
90
  };
91
91
  const searchInput = {
92
92
  boxSizing: 'border-box',
93
93
  width: '100%',
94
94
  backgroundColor: colors_1.INPUT_BACKGROUND,
95
- border: '1px solid rgba(255, 255, 255, 0.12)',
96
- color: 'white',
95
+ border: colors_1.BORDER_WHITE_ALPHA_12,
96
+ color: colors_1.WHITE,
97
97
  fontSize: 12,
98
98
  outline: 'none',
99
99
  padding: '6px 8px',
@@ -113,8 +113,8 @@ const optionButton = {
113
113
  height: ROW_HEIGHT,
114
114
  width: '100%',
115
115
  border: 'none',
116
- background: 'transparent',
117
- color: 'white',
116
+ background: colors_1.TRANSPARENT,
117
+ color: colors_1.WHITE,
118
118
  display: 'flex',
119
119
  alignItems: 'center',
120
120
  padding: '0 8px',
@@ -136,7 +136,7 @@ const optionSource = {
136
136
  };
137
137
  const errorText = {
138
138
  padding: '6px 8px',
139
- color: '#ff8a8a',
139
+ color: colors_1.FONT_FAMILY_ERROR_COLOR,
140
140
  fontSize: 10,
141
141
  };
142
142
  const portalStyle = ({ size, }) => {
@@ -520,7 +520,7 @@ const TimelineFontFamilyField = ({ field, propStatus, effectiveValue, onSave, on
520
520
  ? CLEAR_HOVER
521
521
  : isSelected
522
522
  ? colors_1.SELECTED_BACKGROUND
523
- : 'transparent',
523
+ : colors_1.TRANSPARENT,
524
524
  }, onPointerEnter: () => setHighlightedIndex(actualIndex), onPointerDown: (event) => {
525
525
  event.preventDefault();
526
526
  event.stopPropagation();
@@ -21,6 +21,7 @@ export declare const TimelineKeyframeControls: React.FC<{
21
21
  readonly nodePath: SequencePropsSubscriptionKey;
22
22
  readonly fileName: string;
23
23
  readonly keyframeDisplayOffset: number;
24
+ readonly keyframePlaybackRate: number;
24
25
  readonly defaultValue: unknown;
25
26
  readonly dragOverrideValue: DragOverrideValue | undefined;
26
27
  readonly schema: InteractivitySchema;
@@ -13,7 +13,6 @@ const timeline_node_path_key_1 = require("../../helpers/timeline-node-path-key")
13
13
  const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
14
14
  const call_add_keyframe_1 = require("./call-add-keyframe");
15
15
  const call_delete_keyframe_1 = require("./call-delete-keyframe");
16
- const get_easing_selection_after_keyframe_delete_1 = require("./get-easing-selection-after-keyframe-delete");
17
16
  const get_keyframe_navigation_1 = require("./get-keyframe-navigation");
18
17
  const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
19
18
  const normalize_font_weight_for_keyframe_1 = require("./normalize-font-weight-for-keyframe");
@@ -21,7 +20,6 @@ const timeline_scroll_logic_1 = require("./timeline-scroll-logic");
21
20
  const TimelineKeyframeDiamondIcon_1 = require("./TimelineKeyframeDiamondIcon");
22
21
  const TimelineKeyframeTracksContext_1 = require("./TimelineKeyframeTracksContext");
23
22
  const TimelineSelection_1 = require("./TimelineSelection");
24
- const update_selected_easing_1 = require("./update-selected-easing");
25
23
  const NAV_BUTTON_SIZE = 14;
26
24
  const INSPECTOR_NAV_BUTTON_WIDTH = NAV_BUTTON_SIZE / 2;
27
25
  const INSPECTOR_PREVIOUS_BUTTON_EXTRA_GAP = 1;
@@ -155,15 +153,22 @@ const resolveKeyframeControlTarget = ({ nodePathInfo, tracks, propStatuses, getD
155
153
  propStatus: sequenceSelectedPropStatus,
156
154
  nodePath,
157
155
  fileName: nodePath.absolutePath,
156
+ keyframePlaybackRate: track.keyframePlaybackRate,
158
157
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
159
158
  propStatus: sequenceSelectedPropStatus,
160
159
  keyframeDisplayOffset: track.keyframeDisplayOffset,
160
+ keyframePlaybackRate: track.keyframePlaybackRate,
161
161
  }),
162
- sourceFrame: timelinePosition -
163
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
162
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
163
+ displayFrame: timelinePosition,
164
+ propStatus: sequenceSelectedPropStatus,
165
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
164
166
  propStatus: sequenceSelectedPropStatus,
165
167
  keyframeDisplayOffset: track.keyframeDisplayOffset,
168
+ keyframePlaybackRate: track.keyframePlaybackRate,
166
169
  }),
170
+ keyframePlaybackRate: track.keyframePlaybackRate,
171
+ }),
167
172
  defaultValue: fieldNode.field.fieldSchema.default,
168
173
  dragOverrideValue: ((_c = getDragOverrides(nodePath)) !== null && _c !== void 0 ? _c : {})[fieldNode.field.key],
169
174
  schema: track.sequence.controls.schema,
@@ -187,15 +192,22 @@ const resolveKeyframeControlTarget = ({ nodePathInfo, tracks, propStatuses, getD
187
192
  propStatus: effectSelectedPropStatus,
188
193
  nodePath,
189
194
  fileName: nodePath.absolutePath,
195
+ keyframePlaybackRate: track.keyframePlaybackRate,
190
196
  keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
191
197
  propStatus: effectSelectedPropStatus,
192
198
  keyframeDisplayOffset: track.keyframeDisplayOffset,
199
+ keyframePlaybackRate: track.keyframePlaybackRate,
193
200
  }),
194
- sourceFrame: timelinePosition -
195
- (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
201
+ sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
202
+ displayFrame: timelinePosition,
203
+ propStatus: effectSelectedPropStatus,
204
+ keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
196
205
  propStatus: effectSelectedPropStatus,
197
206
  keyframeDisplayOffset: track.keyframeDisplayOffset,
207
+ keyframePlaybackRate: track.keyframePlaybackRate,
198
208
  }),
209
+ keyframePlaybackRate: track.keyframePlaybackRate,
210
+ }),
199
211
  defaultValue: fieldNode.field.fieldSchema.default,
200
212
  dragOverrideValue: getEffectDragOverrides(nodePath, fieldNode.field.effectIndex)[fieldNode.field.key],
201
213
  schema: fieldNode.field.effectSchema,
@@ -315,10 +327,10 @@ const shouldShowTimelineKeyframeNavigation = ({ propStatus, selected, }) => {
315
327
  return isKeyframedStatus(propStatus);
316
328
  };
317
329
  exports.shouldShowTimelineKeyframeNavigation = shouldShowTimelineKeyframeNavigation;
318
- const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, mode = 'timeline', }) => {
330
+ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, keyframePlaybackRate, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, mode = 'timeline', }) => {
319
331
  const videoConfig = (0, remotion_1.useVideoConfig)();
320
332
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
321
- const setFrame = remotion_1.Internals.useTimelineSetFrame();
333
+ const setFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
322
334
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
323
335
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
324
336
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -332,9 +344,15 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
332
344
  const resolvedKeyframeDisplayOffset = (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
333
345
  propStatus,
334
346
  keyframeDisplayOffset,
347
+ keyframePlaybackRate,
335
348
  });
336
- const jsxFrame = timelinePosition - resolvedKeyframeDisplayOffset;
337
- const keyframes = (0, react_1.useMemo)(() => (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset), [propStatus, keyframeDisplayOffset]);
349
+ const jsxFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
350
+ displayFrame: timelinePosition,
351
+ keyframeDisplayOffset: resolvedKeyframeDisplayOffset,
352
+ keyframePlaybackRate,
353
+ propStatus,
354
+ });
355
+ const keyframes = (0, react_1.useMemo)(() => (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset, keyframePlaybackRate), [propStatus, keyframeDisplayOffset, keyframePlaybackRate]);
338
356
  const hasKeyframeAtCurrentFrame = (0, react_1.useMemo)(() => {
339
357
  if (!isKeyframedStatus(propStatus)) {
340
358
  return false;
@@ -374,6 +392,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
374
392
  nodePath,
375
393
  fileName,
376
394
  keyframeDisplayOffset: resolvedKeyframeDisplayOffset,
395
+ keyframePlaybackRate,
377
396
  sourceFrame: jsxFrame,
378
397
  defaultValue,
379
398
  dragOverrideValue,
@@ -387,6 +406,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
387
406
  fileName,
388
407
  jsxFrame,
389
408
  resolvedKeyframeDisplayOffset,
409
+ keyframePlaybackRate,
390
410
  nodePath,
391
411
  nodePathInfo,
392
412
  propStatus,
@@ -453,19 +473,13 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
453
473
  const change = getDeleteChange(target);
454
474
  return change === null ? [] : [{ target, change }];
455
475
  });
456
- const singleDeleteTarget = deleteTargets[0];
457
- const easingSelection = deleteTargets.length === 1 &&
458
- singleDeleteTarget &&
459
- isKeyframedStatus(singleDeleteTarget.target.propStatus) &&
460
- (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(singleDeleteTarget.target.propStatus.interpolationFunction)
461
- ? (0, get_easing_selection_after_keyframe_delete_1.getEasingSelectionAfterKeyframeDelete)({
462
- deletedSourceFrames: [singleDeleteTarget.target.sourceFrame],
463
- keyframeDisplayOffset: singleDeleteTarget.target.keyframeDisplayOffset,
464
- nodePathInfo: singleDeleteTarget.target.nodePathInfo,
465
- propStatus: singleDeleteTarget.target.propStatus,
466
- timelinePosition,
467
- })
468
- : null;
476
+ if (deleteTargets.length === 0) {
477
+ return;
478
+ }
479
+ selectItems(deleteTargets.flatMap(({ target }) => {
480
+ const propertySelection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(target.nodePathInfo);
481
+ return propertySelection === null ? [] : [propertySelection];
482
+ }), { reveal: true });
469
483
  const deleteChanges = deleteTargets.map(({ change }) => change);
470
484
  await (0, call_delete_keyframe_1.callDeleteKeyframes)({
471
485
  sequenceKeyframes: deleteChanges.filter((change) => !hasEffectIndex(change)),
@@ -473,9 +487,6 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
473
487
  setPropStatuses,
474
488
  clientId,
475
489
  });
476
- if (mode === 'timeline' && easingSelection !== null) {
477
- selectItems([easingSelection], { reveal: true });
478
- }
479
490
  return;
480
491
  }
481
492
  const addChanges = keyframeToggleTargets.flatMap((target) => {
@@ -499,7 +510,8 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
499
510
  selectItems(addChanges.map(({ target }) => ({
500
511
  type: 'keyframe',
501
512
  nodePathInfo: target.nodePathInfo,
502
- frame: target.sourceFrame + target.keyframeDisplayOffset,
513
+ frame: target.sourceFrame / target.keyframePlaybackRate +
514
+ target.keyframeDisplayOffset,
503
515
  })), { reveal: true });
504
516
  }
505
517
  }, [
@@ -511,7 +523,6 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
511
523
  mode,
512
524
  selectItems,
513
525
  setPropStatuses,
514
- timelinePosition,
515
526
  ]);
516
527
  const previousDisabled = previousDisplayFrame === null;
517
528
  const nextDisabled = nextDisplayFrame === null;
@@ -129,6 +129,6 @@ const TimelineLayerChildrenToggle = ({ sequence }) => {
129
129
  border: 'none',
130
130
  padding: 0,
131
131
  cursor: 'default',
132
- }, children: jsx_runtime_1.jsx(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: isCollapsed, color: "currentColor" }) }));
132
+ }, children: jsx_runtime_1.jsx(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: isCollapsed, color: colors_1.CURRENT_COLOR }) }));
133
133
  };
134
134
  exports.TimelineLayerChildrenToggle = TimelineLayerChildrenToggle;
@@ -19,7 +19,7 @@ const TimelineListTrack = react_1.default.memo(({ row }) => {
19
19
  var _a;
20
20
  var _b, _c;
21
21
  const { afterDropLineOffset, siblingIndex, track } = row;
22
- return (jsx_runtime_1.jsx(TimelineSequenceItem_1.TimelineSequenceItem, { afterDropLineOffset: afterDropLineOffset, siblingIndex: siblingIndex, connectedCompositions: (_b = track.connectedCompositions) !== null && _b !== void 0 ? _b : noConnectedCompositions, nestedDepth: track.depth, sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, sequenceFrameOffset: track.sequenceFrameOffset, numberOfHiddenDuplicates: Math.max(0, ((_c = (_a = track.displayGroup) === null || _a === void 0 ? void 0 : _a.numberOfSequences) !== null && _c !== void 0 ? _c : 1) - 1), showProvisionalVisibilityToggle: track.nodePathInfo === null && track.displayGroup !== null }));
22
+ return (jsx_runtime_1.jsx(TimelineSequenceItem_1.TimelineSequenceItem, { afterDropLineOffset: afterDropLineOffset, siblingIndex: siblingIndex, connectedCompositions: (_b = track.connectedCompositions) !== null && _b !== void 0 ? _b : noConnectedCompositions, nestedDepth: track.depth, sequence: track.sequence, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, keyframePlaybackRate: track.keyframePlaybackRate, sequenceFrameOffset: track.sequenceFrameOffset, numberOfHiddenDuplicates: Math.max(0, ((_c = (_a = track.displayGroup) === null || _a === void 0 ? void 0 : _a.numberOfSequences) !== null && _c !== void 0 ? _c : 1) - 1), showProvisionalVisibilityToggle: track.nodePathInfo === null && track.displayGroup !== null }));
23
23
  });
24
24
  const TimelineList = () => {
25
25
  const { rows, tracksEnd, virtualItems } = (0, TimelineVirtualization_1.useTimelineVirtualization)();
@@ -39,9 +39,7 @@ const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange,
39
39
  const step = field.fieldSchema.type === 'font-weight' && currentValue % 100 === 0
40
40
  ? 100
41
41
  : (configuredStep !== null && configuredStep !== void 0 ? configuredStep : 1);
42
- const allowStepMismatch = field.fieldSchema.type === 'font-weight' ||
43
- field.group === 'crop' ||
44
- ('kind' in field && field.kind === 'effect-field');
42
+ const integerOnly = field.fieldSchema.type === 'number' && field.fieldSchema.integer === true;
45
43
  const formatter = (0, react_1.useCallback)((v) => {
46
44
  return (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
47
45
  fieldSchema: field.fieldSchema,
@@ -56,6 +54,6 @@ const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange,
56
54
  ? ((_b = field.fieldSchema.max) !== null && _b !== void 0 ? _b : Infinity)
57
55
  : field.fieldSchema.type === 'font-weight'
58
56
  ? 1000
59
- : Infinity, step: step, dragSensitivity: field.fieldSchema.type === 'font-weight' && step === 100 ? 0.1 : 1, formatter: formatter, rightAlign: false, allowStepMismatch: allowStepMismatch }));
57
+ : Infinity, step: step, dragSensitivity: field.fieldSchema.type === 'font-weight' && step === 100 ? 0.1 : 1, formatter: formatter, rightAlign: false, allowStepMismatch: true, integerOnly: integerOnly }));
60
58
  };
61
59
  exports.TimelineNumberField = TimelineNumberField;
@@ -62,7 +62,7 @@ const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragE
62
62
  if (field.typeName === 'enum') {
63
63
  return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineEnumField_1.TimelineEnumField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
64
64
  }
65
- if (field.typeName === 'text-content') {
65
+ if (field.typeName === 'text-content' || field.typeName === 'svg-path') {
66
66
  return (jsx_runtime_1.jsx(TimelineTextContentField_1.TimelineTextContentField, { effectiveValue: effectiveValue, field: field, nodePath: scaleLockNodePath, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }));
67
67
  }
68
68
  if (field.typeName === 'font-family') {
@@ -1,17 +1,17 @@
1
- import { type CanvasSelectionInteraction, type CanvasSelectionItem, type CanvasSelectionSnapshot } from '@remotion/canvas';
1
+ import type { CanvasSelectionInteraction, CanvasSelectionItem, CanvasSelectionSnapshot } from '@remotion/canvas';
2
2
  import { type SequenceNodePathMutation } from '@remotion/studio-shared';
3
3
  import React, { type CSSProperties } from 'react';
4
4
  import { type GetDragOverrides, type GetEffectDragOverrides, type PropStatuses } from 'remotion';
5
5
  import type { SequenceNodePathInfo, TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
6
6
  import { type GetIsExpanded } from '../ExpandedTracksProvider';
7
- export declare const TIMELINE_SELECTED_BACKGROUND = "#3B3F42";
8
- export declare const TIMELINE_EXPANDED_SELECTED_BACKGROUND = "rgb(31,36,40)";
9
- export declare const TIMELINE_HOVER_BACKGROUND = "rgba(255, 255, 255, 0.05)";
10
- export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "#B0B0B0";
11
- export declare const TIMELINE_SELECTED_LABEL_TEXT = "black";
7
+ export declare const TIMELINE_SELECTED_BACKGROUND = "var(--remotion-studio-timeline-selected-background-color)";
8
+ export declare const TIMELINE_EXPANDED_SELECTED_BACKGROUND = "var(--remotion-studio-background)";
9
+ export declare const TIMELINE_HOVER_BACKGROUND = "var(--remotion-studio-white-alpha-05)";
10
+ export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "var(--remotion-studio-timeline-selected-label-background-color)";
11
+ export declare const TIMELINE_SELECTED_LABEL_TEXT = "var(--remotion-studio-black)";
12
12
  export declare const TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = 2;
13
13
  export declare const getTimelineSelectedLabelStyle: (selected: boolean, subcategory: boolean) => CSSProperties;
14
- export declare const getTimelineColor: (selected: boolean, subcategory: boolean) => "black" | "rgba(255, 255, 255, 0.8)";
14
+ export declare const getTimelineColor: (selected: boolean, subcategory: boolean) => "var(--remotion-studio-black)" | "var(--remotion-studio-white-alpha-80)";
15
15
  export declare const getTimelineSelectedTrackHighlightStyle: (timelineWidth: number, backgroundColor?: string) => CSSProperties;
16
16
  export declare const getTimelineRowHighlightBackground: ({ showSelectedBackground, selected, containsSelection, hovered, selectedBackground, }: {
17
17
  readonly showSelectedBackground: boolean;
@@ -20,8 +20,8 @@ export declare const getTimelineRowHighlightBackground: ({ showSelectedBackgroun
20
20
  readonly hovered: boolean;
21
21
  readonly selectedBackground: string;
22
22
  }) => string | undefined;
23
- export declare const TIMELINE_BACKGROUND = "#15181B";
24
- export declare const TIMELINE_TICKS_BACKGROUND = "rgb(31,36,40)";
23
+ export declare const TIMELINE_BACKGROUND = "var(--remotion-studio-timeline-background-color)";
24
+ export declare const TIMELINE_TICKS_BACKGROUND = "var(--remotion-studio-background)";
25
25
  export type TimelineSelection = CanvasSelectionItem;
26
26
  export type TimelineEasingSelection = Extract<TimelineSelection, {
27
27
  type: 'easing';