@remotion/studio 4.0.478 → 4.0.481

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 (201) hide show
  1. package/dist/components/AssetSelector.js +8 -14
  2. package/dist/components/AudioWaveform.js +19 -11
  3. package/dist/components/Button.d.ts +2 -0
  4. package/dist/components/Button.js +9 -6
  5. package/dist/components/CompactExplanation.d.ts +12 -0
  6. package/dist/components/CompactExplanation.js +52 -0
  7. package/dist/components/CompositionSelector.js +2 -4
  8. package/dist/components/CurrentAsset.d.ts +3 -1
  9. package/dist/components/CurrentAsset.js +42 -34
  10. package/dist/components/CurrentComposition.d.ts +1 -1
  11. package/dist/components/CurrentComposition.js +38 -31
  12. package/dist/components/CurrentCompositionSideEffects.d.ts +0 -3
  13. package/dist/components/CurrentCompositionSideEffects.js +1 -37
  14. package/dist/components/DefaultPropsEditor.d.ts +12 -2
  15. package/dist/components/DefaultPropsEditor.js +2 -2
  16. package/dist/components/Editor.js +2 -5
  17. package/dist/components/EditorContent.js +2 -1
  18. package/dist/components/EffectPickerModal.d.ts +5 -0
  19. package/dist/components/EffectPickerModal.js +179 -0
  20. package/dist/components/ExpandedTracksProvider.d.ts +1 -0
  21. package/dist/components/ExpandedTracksProvider.js +81 -7
  22. package/dist/components/GlobalKeybindings.d.ts +3 -1
  23. package/dist/components/GlobalKeybindings.js +104 -10
  24. package/dist/components/InspectorInfoHeader.d.ts +11 -0
  25. package/dist/components/InspectorInfoHeader.js +55 -0
  26. package/dist/components/InspectorPanel/DefaultInspector.d.ts +8 -0
  27. package/dist/components/InspectorPanel/DefaultInspector.js +93 -0
  28. package/dist/components/InspectorPanel/EasingInspector.d.ts +5 -0
  29. package/dist/components/InspectorPanel/EasingInspector.js +41 -0
  30. package/dist/components/InspectorPanel/GuideInspector.d.ts +7 -0
  31. package/dist/components/InspectorPanel/GuideInspector.js +55 -0
  32. package/dist/components/InspectorPanel/KeyframeInspector.d.ts +7 -0
  33. package/dist/components/InspectorPanel/KeyframeInspector.js +109 -0
  34. package/dist/components/InspectorPanel/SelectedInspector.d.ts +5 -0
  35. package/dist/components/InspectorPanel/SelectedInspector.js +26 -0
  36. package/dist/components/InspectorPanel/SequenceSelectionInspector.d.ts +5 -0
  37. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +117 -0
  38. package/dist/components/InspectorPanel/common.d.ts +15 -0
  39. package/dist/components/InspectorPanel/common.js +18 -0
  40. package/dist/components/InspectorPanel/inspector-selection.d.ts +10 -0
  41. package/dist/components/InspectorPanel/inspector-selection.js +35 -0
  42. package/dist/components/InspectorPanel/styles.d.ts +28 -0
  43. package/dist/components/InspectorPanel/styles.js +196 -0
  44. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +2 -0
  45. package/dist/components/InspectorPanel/use-track-for-selection.js +22 -0
  46. package/dist/components/InspectorPanel.d.ts +8 -0
  47. package/dist/components/InspectorPanel.js +26 -0
  48. package/dist/components/InspectorPanelLayout.d.ts +1 -0
  49. package/dist/components/InspectorPanelLayout.js +4 -0
  50. package/dist/components/InspectorSequenceSection.d.ts +19 -0
  51. package/dist/components/InspectorSequenceSection.js +157 -0
  52. package/dist/components/InspectorSourceLocation.d.ts +7 -0
  53. package/dist/components/InspectorSourceLocation.js +71 -0
  54. package/dist/components/KeyboardShortcutsExplainer.js +10 -2
  55. package/dist/components/Modals.js +3 -3
  56. package/dist/components/NewComposition/InputDragger.js +1 -1
  57. package/dist/components/NewComposition/RemInput.d.ts +1 -0
  58. package/dist/components/NewComposition/RemInput.js +8 -2
  59. package/dist/components/NewComposition/RemTextarea.d.ts +1 -0
  60. package/dist/components/NewComposition/RemTextarea.js +8 -2
  61. package/dist/components/NewComposition/ValidationMessage.d.ts +3 -0
  62. package/dist/components/NewComposition/ValidationMessage.js +16 -5
  63. package/dist/components/OptionsPanel.d.ts +1 -1
  64. package/dist/components/OptionsPanel.js +8 -17
  65. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +2 -7
  66. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +3 -10
  67. package/dist/components/QuickSwitcher/shared.d.ts +4 -0
  68. package/dist/components/QuickSwitcher/shared.js +24 -0
  69. package/dist/components/RenderModal/DataEditor.d.ts +29 -2
  70. package/dist/components/RenderModal/DataEditor.js +107 -56
  71. package/dist/components/RenderModal/RenderModalJSONPropsEditor.d.ts +1 -0
  72. package/dist/components/RenderModal/RenderModalJSONPropsEditor.js +25 -7
  73. package/dist/components/RenderModal/SchemaEditor/Fieldset.d.ts +2 -1
  74. package/dist/components/RenderModal/SchemaEditor/Fieldset.js +10 -5
  75. package/dist/components/RenderModal/SchemaEditor/SchemaEditor.d.ts +4 -0
  76. package/dist/components/RenderModal/SchemaEditor/SchemaEditor.js +27 -4
  77. package/dist/components/RenderModal/SchemaEditor/SchemaErrorMessages.d.ts +12 -4
  78. package/dist/components/RenderModal/SchemaEditor/SchemaErrorMessages.js +23 -9
  79. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +3 -3
  80. package/dist/components/RenderModal/SchemaEditor/SchemaSeparationLine.js +8 -1
  81. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  82. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  83. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  84. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  85. package/dist/components/RenderModal/SchemaEditor/ZodErrorMessages.d.ts +1 -0
  86. package/dist/components/RenderModal/SchemaEditor/ZodErrorMessages.js +23 -6
  87. package/dist/components/RenderModal/SchemaEditor/ZodFieldValidation.js +2 -2
  88. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +2 -1
  89. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  90. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +9 -11
  91. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +1 -1
  92. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  93. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  94. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  95. package/dist/components/RenderModal/WarningIndicatorButton.d.ts +1 -0
  96. package/dist/components/RenderModal/WarningIndicatorButton.js +17 -4
  97. package/dist/components/RenderModal/get-render-modal-warnings.d.ts +2 -1
  98. package/dist/components/RenderModal/get-render-modal-warnings.js +6 -3
  99. package/dist/components/RendersTab.js +1 -1
  100. package/dist/components/ResetZoomButton.d.ts +2 -1
  101. package/dist/components/ResetZoomButton.js +5 -1
  102. package/dist/components/SegmentedControl.d.ts +3 -0
  103. package/dist/components/SegmentedControl.js +11 -5
  104. package/dist/components/SelectedOutlineElement.js +96 -24
  105. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  106. package/dist/components/SelectedOutlineOverlay.js +44 -30
  107. package/dist/components/SelectedOutlineUvControls.d.ts +9 -0
  108. package/dist/components/SelectedOutlineUvControls.js +64 -10
  109. package/dist/components/Tabs/index.js +4 -4
  110. package/dist/components/Timeline/EasingEditorModal.d.ts +5 -4
  111. package/dist/components/Timeline/EasingEditorModal.js +597 -124
  112. package/dist/components/Timeline/KeyframeSettingsModal.d.ts +2 -2
  113. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -2
  114. package/dist/components/Timeline/Timeline.js +9 -9
  115. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +15 -3
  116. package/dist/components/Timeline/TimelineClipboardKeybindings.js +85 -1
  117. package/dist/components/Timeline/TimelineDeleteKeybindings.js +10 -3
  118. package/dist/components/Timeline/TimelineEffectItem.d.ts +2 -2
  119. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  120. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +8 -0
  121. package/dist/components/Timeline/TimelineEffectPropItem.js +25 -21
  122. package/dist/components/Timeline/TimelineExpandArrowButton.js +42 -2
  123. package/dist/components/Timeline/TimelineExpandedRow.d.ts +5 -2
  124. package/dist/components/Timeline/TimelineExpandedRow.js +6 -6
  125. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -1
  126. package/dist/components/Timeline/TimelineExpandedSection.js +10 -25
  127. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +8 -2
  128. package/dist/components/Timeline/TimelineKeyframeControls.js +24 -3
  129. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +2 -47
  130. package/dist/components/Timeline/TimelineKeyframedValue.d.ts +1 -1
  131. package/dist/components/Timeline/TimelineKeyframedValue.js +8 -10
  132. package/dist/components/Timeline/TimelineNumberField.js +5 -11
  133. package/dist/components/Timeline/TimelineRotationField.js +5 -6
  134. package/dist/components/Timeline/TimelineRowChrome.d.ts +2 -0
  135. package/dist/components/Timeline/TimelineRowChrome.js +5 -3
  136. package/dist/components/Timeline/TimelineScaleField.js +4 -8
  137. package/dist/components/Timeline/TimelineSelection.d.ts +28 -2
  138. package/dist/components/Timeline/TimelineSelection.js +342 -61
  139. package/dist/components/Timeline/TimelineSequence.js +19 -3
  140. package/dist/components/Timeline/TimelineSequenceItem.js +68 -64
  141. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +12 -2
  142. package/dist/components/Timeline/TimelineSequencePropItem.js +57 -53
  143. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +6 -4
  144. package/dist/components/Timeline/TimelineTransformOriginField.js +4 -5
  145. package/dist/components/Timeline/TimelineTranslateField.js +4 -5
  146. package/dist/components/Timeline/TimelineUvCoordinateField.js +4 -4
  147. package/dist/components/Timeline/call-add-keyframe.d.ts +4 -4
  148. package/dist/components/Timeline/call-delete-keyframe.d.ts +4 -4
  149. package/dist/components/Timeline/call-move-keyframe.d.ts +2 -2
  150. package/dist/components/Timeline/call-update-keyframe-settings.d.ts +3 -3
  151. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +2 -1
  152. package/dist/components/Timeline/delete-selected-timeline-item.js +27 -1
  153. package/dist/components/Timeline/find-track-for-node-path-info.js +2 -2
  154. package/dist/components/Timeline/get-node-keyframes.d.ts +7 -0
  155. package/dist/components/Timeline/get-node-keyframes.js +26 -1
  156. package/dist/components/Timeline/parse-keyframe-field-from-node-path.js +2 -2
  157. package/dist/components/Timeline/reset-selected-timeline-props.d.ts +3 -3
  158. package/dist/components/Timeline/reset-selected-timeline-props.js +34 -7
  159. package/dist/components/Timeline/save-effect-prop.d.ts +2 -2
  160. package/dist/components/Timeline/save-sequence-prop.d.ts +2 -2
  161. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +3 -3
  162. package/dist/components/Timeline/timeline-expanded-filter.d.ts +12 -0
  163. package/dist/components/Timeline/timeline-expanded-filter.js +38 -0
  164. package/dist/components/Timeline/timeline-field-display-utils.d.ts +5 -0
  165. package/dist/components/Timeline/timeline-field-display-utils.js +244 -0
  166. package/dist/components/Timeline/update-selected-easing.d.ts +47 -4
  167. package/dist/components/Timeline/update-selected-easing.js +40 -9
  168. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +50 -18
  169. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +13 -0
  170. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +73 -0
  171. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -3
  172. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +12 -0
  173. package/dist/components/Timeline/use-timeline-expanded-tree.js +60 -0
  174. package/dist/components/Timeline/use-timeline-height.js +51 -7
  175. package/dist/components/Timeline/use-timeline-keyframe-drag.js +12 -6
  176. package/dist/components/TopPanel.js +1 -1
  177. package/dist/components/VisualControls/VisualControlsContent.d.ts +1 -1
  178. package/dist/components/VisualControls/VisualControlsContent.js +4 -5
  179. package/dist/components/effect-drag-and-drop.d.ts +10 -0
  180. package/dist/components/effect-drag-and-drop.js +17 -8
  181. package/dist/components/effect-picker-search.d.ts +5 -0
  182. package/dist/components/effect-picker-search.js +77 -0
  183. package/dist/components/selected-outline-drag.d.ts +21 -2
  184. package/dist/components/selected-outline-drag.js +31 -6
  185. package/dist/components/selected-outline-measurement.js +48 -14
  186. package/dist/components/selected-outline-types.d.ts +7 -7
  187. package/dist/components/selected-outline-uv.d.ts +4 -3
  188. package/dist/components/selected-outline-uv.js +6 -2
  189. package/dist/error-overlay/remotion-overlay/ErrorLoader.js +8 -1
  190. package/dist/esm/{chunk-hrw9799x.js → chunk-4rq5gt8c.js} +30557 -26640
  191. package/dist/esm/internals.mjs +30557 -26640
  192. package/dist/esm/previewEntry.mjs +18584 -14665
  193. package/dist/esm/renderEntry.mjs +1 -1
  194. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  195. package/dist/helpers/render-codec-label.d.ts +2 -0
  196. package/dist/helpers/render-codec-label.js +49 -0
  197. package/dist/helpers/timeline-layout.d.ts +4 -4
  198. package/dist/helpers/use-media-metadata.d.ts +8 -2
  199. package/dist/helpers/use-media-metadata.js +17 -4
  200. package/dist/state/modals.d.ts +9 -4
  201. package/package.json +12 -12
@@ -36,11 +36,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.TimelineExpandedSection = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
- const remotion_1 = require("remotion");
40
39
  const colors_1 = require("../../helpers/colors");
41
40
  const timeline_layout_1 = require("../../helpers/timeline-layout");
42
- const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
43
41
  const TimelineExpandedRow_1 = require("./TimelineExpandedRow");
42
+ const use_timeline_expanded_tree_1 = require("./use-timeline-expanded-tree");
44
43
  const expandedSectionBase = {
45
44
  color: 'white',
46
45
  fontFamily: 'Arial, Helvetica, sans-serif',
@@ -54,30 +53,16 @@ const separator = {
54
53
  borderBottom: `1px solid ${colors_1.TIMELINE_TRACK_SEPARATOR}`,
55
54
  };
56
55
  const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, nestedDepth, keyframeDisplayOffset, }) => {
57
- const { getIsExpanded } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksGetterContext);
58
- const { toggleTrack } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
59
- const { propStatuses: visualModePropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
60
- const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
61
- const tree = (0, react_1.useMemo)(() => (0, timeline_layout_1.buildTimelineTree)({
56
+ const { filteredTree, getIsExpanded, toggleTrack } = (0, use_timeline_expanded_tree_1.useTimelineExpandedTree)({
62
57
  sequence,
63
58
  nodePathInfo,
64
- getDragOverrides,
65
- getEffectDragOverrides,
66
- propStatuses: visualModePropStatuses,
67
- }), [
68
- sequence,
69
- nodePathInfo,
70
- getDragOverrides,
71
- getEffectDragOverrides,
72
- visualModePropStatuses,
73
- ]);
74
- const flat = (0, react_1.useMemo)(() => (0, timeline_layout_1.flattenVisibleTreeNodes)({ nodes: tree, getIsExpanded }), [tree, getIsExpanded]);
75
- const expandedHeight = (0, react_1.useMemo)(() => (0, timeline_layout_1.getExpandedTrackHeight)({
76
- sequence,
77
- nodePathInfo,
78
- getIsExpanded,
79
- propStatuses: visualModePropStatuses,
80
- }), [sequence, nodePathInfo, getIsExpanded, visualModePropStatuses]);
59
+ });
60
+ const flat = (0, react_1.useMemo)(() => (0, timeline_layout_1.flattenVisibleTreeNodes)({ nodes: filteredTree, getIsExpanded }), [filteredTree, getIsExpanded]);
61
+ const expandedHeight = (0, react_1.useMemo)(() => {
62
+ const totalRowsHeight = flat.reduce((sum, { node }) => sum + (0, timeline_layout_1.getTreeRowHeight)(node), 0);
63
+ const separators = Math.max(0, flat.length - 1);
64
+ return totalRowsHeight + separators;
65
+ }, [flat]);
81
66
  const style = (0, react_1.useMemo)(() => {
82
67
  return {
83
68
  ...expandedSectionBase,
@@ -86,7 +71,7 @@ const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, ne
86
71
  }, [expandedHeight]);
87
72
  const { schema } = sequence.controls;
88
73
  if (flat.length === 0) {
89
- return jsx_runtime_1.jsx("div", { style: style, children: "No schema" });
74
+ return null;
90
75
  }
91
76
  return (jsx_runtime_1.jsx("div", { style: style, children: flat.map(({ node, depth }, i) => {
92
77
  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 })
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { CanUpdateSequencePropStatus, DragOverrideValue, SequencePropsSubscriptionKey, SequenceSchema } from 'remotion';
2
+ import type { CanUpdateSequencePropStatus, DragOverrideValue, SequencePropsSubscriptionKey, InteractivitySchema } from 'remotion';
3
3
  import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
4
4
  import { type TimelineSelection } from './TimelineSelection';
5
5
  export declare const getSelectedKeyframeControlNodePathInfos: ({ clickedNodePathInfo, selectedItems, }: {
@@ -11,6 +11,11 @@ export declare const shouldShowTimelineKeyframeControls: ({ propStatus, selected
11
11
  selected: boolean;
12
12
  keyframable: boolean;
13
13
  }) => boolean;
14
+ export type TimelineKeyframeControlsMode = 'timeline' | 'inspector';
15
+ export declare const shouldShowTimelineKeyframeNavigation: ({ propStatus, selected, }: {
16
+ readonly propStatus: CanUpdateSequencePropStatus;
17
+ readonly selected: boolean;
18
+ }) => boolean;
14
19
  export declare const TimelineKeyframeControls: React.FC<{
15
20
  readonly fieldKey: string;
16
21
  readonly propStatus: CanUpdateSequencePropStatus;
@@ -19,7 +24,8 @@ export declare const TimelineKeyframeControls: React.FC<{
19
24
  readonly keyframeDisplayOffset: number;
20
25
  readonly defaultValue: unknown;
21
26
  readonly dragOverrideValue: DragOverrideValue | undefined;
22
- readonly schema: SequenceSchema;
27
+ readonly schema: InteractivitySchema;
23
28
  readonly effectIndex: number | null;
24
29
  readonly nodePathInfo: SequenceNodePathInfo;
30
+ readonly mode?: TimelineKeyframeControlsMode;
25
31
  }>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimelineKeyframeControls = exports.shouldShowTimelineKeyframeControls = exports.getSelectedKeyframeControlNodePathInfos = void 0;
3
+ exports.TimelineKeyframeControls = exports.shouldShowTimelineKeyframeNavigation = exports.shouldShowTimelineKeyframeControls = exports.getSelectedKeyframeControlNodePathInfos = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const studio_shared_1 = require("@remotion/studio-shared");
6
6
  const react_1 = require("react");
@@ -255,6 +255,13 @@ const shouldShowTimelineKeyframeControls = ({ propStatus, selected, keyframable,
255
255
  return isKeyframedStatus(propStatus);
256
256
  };
257
257
  exports.shouldShowTimelineKeyframeControls = shouldShowTimelineKeyframeControls;
258
+ const shouldShowTimelineKeyframeNavigation = ({ propStatus, selected, }) => {
259
+ if (selected) {
260
+ return true;
261
+ }
262
+ return isKeyframedStatus(propStatus);
263
+ };
264
+ exports.shouldShowTimelineKeyframeNavigation = shouldShowTimelineKeyframeNavigation;
258
265
  const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, }) => {
259
266
  const videoConfig = (0, remotion_1.useVideoConfig)();
260
267
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
@@ -278,6 +285,18 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
278
285
  }, [jsxFrame, propStatus]);
279
286
  const previousDisplayFrame = (0, react_1.useMemo)(() => (0, get_keyframe_navigation_1.getPreviousKeyframeDisplayFrame)(keyframes, timelinePosition, videoConfig.durationInFrames), [keyframes, timelinePosition, videoConfig.durationInFrames]);
280
287
  const nextDisplayFrame = (0, react_1.useMemo)(() => (0, get_keyframe_navigation_1.getNextKeyframeDisplayFrame)(keyframes, timelinePosition, videoConfig.durationInFrames), [keyframes, timelinePosition, videoConfig.durationInFrames]);
288
+ const propertySelected = (0, react_1.useMemo)(() => {
289
+ const propertySelection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(nodePathInfo);
290
+ if (propertySelection === null) {
291
+ return false;
292
+ }
293
+ const propertySelectionKey = (0, TimelineSelection_1.getTimelineSelectionKey)(propertySelection);
294
+ return selectedItems.some((selection) => (0, TimelineSelection_1.getTimelineSelectionKey)(selection) === propertySelectionKey);
295
+ }, [nodePathInfo, selectedItems]);
296
+ const showNavigationButtons = (0, exports.shouldShowTimelineKeyframeNavigation)({
297
+ propStatus,
298
+ selected: propertySelected,
299
+ });
281
300
  const keyframable = (0, studio_shared_1.isSchemaFieldKeyframable)({
282
301
  schema,
283
302
  key: fieldKey,
@@ -404,12 +423,14 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
404
423
  ...navButtonStyle,
405
424
  cursor: previousDisabled ? 'default' : 'pointer',
406
425
  opacity: previousDisabled ? 0.35 : 1,
407
- }), [previousDisabled]);
426
+ visibility: showNavigationButtons ? 'visible' : 'hidden',
427
+ }), [previousDisabled, showNavigationButtons]);
408
428
  const nextStyle = (0, react_1.useMemo)(() => ({
409
429
  ...navButtonStyle,
410
430
  cursor: nextDisabled ? 'default' : 'pointer',
411
431
  opacity: nextDisabled ? 0.35 : 1,
412
- }), [nextDisabled]);
432
+ visibility: showNavigationButtons ? 'visible' : 'hidden',
433
+ }), [nextDisabled, showNavigationButtons]);
413
434
  const diamondStyle = (0, react_1.useMemo)(() => ({
414
435
  ...diamondButtonStyle,
415
436
  cursor: canToggleKeyframe && clientId ? 'pointer' : 'default',
@@ -42,7 +42,6 @@ const client_id_1 = require("../../helpers/client-id");
42
42
  const colors_1 = require("../../helpers/colors");
43
43
  const get_left_of_timeline_slider_1 = require("../../helpers/get-left-of-timeline-slider");
44
44
  const timeline_layout_1 = require("../../helpers/timeline-layout");
45
- const modals_1 = require("../../state/modals");
46
45
  const ContextMenu_1 = require("../ContextMenu");
47
46
  const TimelineSelection_1 = require("./TimelineSelection");
48
47
  const TimelineWidthProvider_1 = require("./TimelineWidthProvider");
@@ -85,7 +84,6 @@ const TimelineKeyframeEasingLineUnmemoized = ({ fromFrame, toFrame, rowHeight, n
85
84
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
86
85
  const { overrideIdToNodePathMappings } = (0, react_1.useContext)(remotion_1.Internals.OverrideIdsToNodePathsGettersContext);
87
86
  const currentSelection = (0, TimelineSelection_1.useCurrentTimelineSelectionStateAsRef)();
88
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
89
87
  const getTargetSelections = (0, react_1.useCallback)(() => {
90
88
  const selectedEasings = (0, update_selected_easing_1.getEasingSelections)(currentSelection.current.selectedItems);
91
89
  return selected ? selectedEasings : [selectionItem];
@@ -112,33 +110,6 @@ const TimelineKeyframeEasingLineUnmemoized = ({ fromFrame, toFrame, rowHeight, n
112
110
  sequencesRef,
113
111
  setPropStatuses,
114
112
  ]);
115
- const onOpenEasingEditor = (0, react_1.useCallback)(() => {
116
- if (previewServerState.type !== 'connected') {
117
- return;
118
- }
119
- const initialEasing = (0, update_selected_easing_1.getTimelineEasingValueForSelection)({
120
- selection: selectionItem,
121
- sequences: sequencesRef.current,
122
- overrideIdsToNodePaths: overrideIdToNodePathMappings,
123
- propStatuses: propStatusesRef.current,
124
- });
125
- if (initialEasing === null) {
126
- return;
127
- }
128
- setSelectedModal({
129
- type: 'easing-editor',
130
- initialEasing,
131
- selections: getTargetSelections(),
132
- });
133
- }, [
134
- getTargetSelections,
135
- overrideIdToNodePathMappings,
136
- previewServerState,
137
- propStatusesRef,
138
- selectionItem,
139
- sequencesRef,
140
- setSelectedModal,
141
- ]);
142
113
  const contextMenuValues = (0, react_1.useMemo)(() => {
143
114
  return [
144
115
  {
@@ -148,7 +119,7 @@ const TimelineKeyframeEasingLineUnmemoized = ({ fromFrame, toFrame, rowHeight, n
148
119
  label: 'Linear',
149
120
  leftItem: null,
150
121
  disabled: previewServerState.type !== 'connected',
151
- onClick: () => updateEasing('linear'),
122
+ onClick: () => updateEasing(studio_shared_1.LINEAR_KEYFRAME_EASING),
152
123
  quickSwitcherLabel: null,
153
124
  subMenu: null,
154
125
  value: 'linear',
@@ -165,24 +136,8 @@ const TimelineKeyframeEasingLineUnmemoized = ({ fromFrame, toFrame, rowHeight, n
165
136
  subMenu: null,
166
137
  value: preset.id,
167
138
  })),
168
- {
169
- type: 'divider',
170
- id: 'edit-easing-divider',
171
- },
172
- {
173
- type: 'item',
174
- id: 'edit-easing',
175
- keyHint: null,
176
- label: 'Edit...',
177
- leftItem: null,
178
- disabled: previewServerState.type !== 'connected',
179
- onClick: onOpenEasingEditor,
180
- quickSwitcherLabel: null,
181
- subMenu: null,
182
- value: 'edit-easing',
183
- },
184
139
  ];
185
- }, [onOpenEasingEditor, previewServerState.type, updateEasing]);
140
+ }, [previewServerState.type, updateEasing]);
186
141
  const onOpenContextMenu = (0, react_1.useCallback)((event) => {
187
142
  if (!selectable) {
188
143
  return false;
@@ -4,7 +4,7 @@ import type { SchemaFieldInfo, TimelineFieldOnDragValueChange } from '../../help
4
4
  export declare const TimelineKeyframedValue: React.FC<{
5
5
  readonly field: SchemaFieldInfo;
6
6
  readonly propStatus: CanUpdateSequencePropStatusKeyframed;
7
- readonly keyframeDisplayOffset: number;
7
+ readonly sourceFrame: number;
8
8
  readonly dragOverrideValue: DragOverrideValue | undefined;
9
9
  readonly onSave: (value: unknown, sourceFrame: number) => Promise<void>;
10
10
  readonly onDragValueChange: TimelineFieldOnDragValueChange;
@@ -8,19 +8,17 @@ const TimelineSchemaField_1 = require("./TimelineSchemaField");
8
8
  const valuesEqual = (left, right) => {
9
9
  return JSON.stringify(left) === JSON.stringify(right);
10
10
  };
11
- const TimelineKeyframedValue = ({ field, propStatus, keyframeDisplayOffset, dragOverrideValue, onSave, onDragValueChange, onDragEnd, scaleLockNodePath, }) => {
12
- const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
13
- const jsxFrame = timelinePosition - keyframeDisplayOffset;
11
+ const TimelineKeyframedValue = ({ field, propStatus, sourceFrame, dragOverrideValue, onSave, onDragValueChange, onDragEnd, scaleLockNodePath, }) => {
14
12
  const computedValue = (0, react_1.useMemo)(() => {
15
13
  const raw = remotion_1.Internals.interpolateKeyframedStatus({
16
- frame: jsxFrame,
14
+ frame: sourceFrame,
17
15
  status: propStatus,
18
16
  });
19
17
  if (typeof raw === 'number') {
20
18
  return Math.round(raw * 100) / 100;
21
19
  }
22
20
  return raw;
23
- }, [jsxFrame, propStatus]);
21
+ }, [propStatus, sourceFrame]);
24
22
  const fakeStatus = (0, react_1.useMemo)(() => ({
25
23
  status: 'static',
26
24
  codeValue: computedValue,
@@ -29,19 +27,19 @@ const TimelineKeyframedValue = ({ field, propStatus, keyframeDisplayOffset, drag
29
27
  return remotion_1.Internals.getEffectiveVisualModeValue({
30
28
  propStatus: fakeStatus,
31
29
  dragOverrideValue,
32
- frame: jsxFrame,
30
+ frame: sourceFrame,
33
31
  defaultValue: field.fieldSchema.default,
34
32
  shouldResortToDefaultValueIfUndefined: true,
35
33
  });
36
- }, [dragOverrideValue, fakeStatus, field.fieldSchema.default, jsxFrame]);
34
+ }, [dragOverrideValue, fakeStatus, field.fieldSchema.default, sourceFrame]);
37
35
  const onSaveIfChanged = (0, react_1.useCallback)((value) => {
38
- const existingKeyframe = propStatus.keyframes.find((keyframe) => keyframe.frame === jsxFrame);
36
+ const existingKeyframe = propStatus.keyframes.find((keyframe) => keyframe.frame === sourceFrame);
39
37
  if (valuesEqual(value, computedValue) ||
40
38
  (existingKeyframe && valuesEqual(value, existingKeyframe.value))) {
41
39
  return Promise.resolve();
42
40
  }
43
- return onSave(value, jsxFrame);
44
- }, [computedValue, jsxFrame, onSave, propStatus.keyframes]);
41
+ return onSave(value, sourceFrame);
42
+ }, [computedValue, onSave, propStatus.keyframes, sourceFrame]);
45
43
  if (computedValue === null) {
46
44
  return null;
47
45
  }
@@ -4,6 +4,7 @@ exports.TimelineNumberField = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const InputDragger_1 = require("../NewComposition/InputDragger");
7
+ const timeline_field_display_utils_1 = require("./timeline-field-display-utils");
7
8
  const timeline_field_utils_1 = require("./timeline-field-utils");
8
9
  const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange, onDragEnd, propStatus, }) => {
9
10
  var _a, _b;
@@ -35,19 +36,12 @@ const TimelineNumberField = ({ field, effectiveValue, onSave, onDragValueChange,
35
36
  }, [onSave, propStatus]);
36
37
  const configuredStep = field.fieldSchema.type === 'number' ? field.fieldSchema.step : undefined;
37
38
  const step = configuredStep !== null && configuredStep !== void 0 ? configuredStep : 1;
38
- const stepDecimals = (0, react_1.useMemo)(() => configuredStep === undefined ? null : (0, timeline_field_utils_1.getDecimalPlaces)(configuredStep), [configuredStep]);
39
39
  const formatter = (0, react_1.useCallback)((v) => {
40
- const num = Number(v);
41
- if (stepDecimals === null) {
42
- const digits = (0, timeline_field_utils_1.getDecimalPlaces)(num);
43
- return digits === 0 ? String(num) : num.toFixed(digits);
44
- }
45
- return (0, timeline_field_utils_1.formatTimelineNumber)({
46
- decimalPlaces: stepDecimals,
47
- fixed: true,
48
- value: num,
40
+ return (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
41
+ fieldSchema: field.fieldSchema,
42
+ value: v,
49
43
  });
50
- }, [stepDecimals]);
44
+ }, [field.fieldSchema]);
51
45
  return (jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragValue !== null && dragValue !== void 0 ? dragValue : effectiveValue, style: timeline_field_utils_1.draggerStyle, status: "ok", small: true, onValueChange: onValueChange, onValueChangeEnd: onValueChangeEnd, onTextChange: onTextChange, min: field.fieldSchema.type === 'number'
52
46
  ? ((_a = field.fieldSchema.min) !== null && _a !== void 0 ? _a : -Infinity)
53
47
  : -Infinity, max: field.fieldSchema.type === 'number'
@@ -4,6 +4,7 @@ exports.TimelineRotationField = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const InputDragger_1 = require("../NewComposition/InputDragger");
7
+ const timeline_field_display_utils_1 = require("./timeline-field-display-utils");
7
8
  const timeline_field_utils_1 = require("./timeline-field-utils");
8
9
  const timeline_rotation_utils_1 = require("./timeline-rotation-utils");
9
10
  const TimelineRotationField = ({ field, effectiveValue, propStatus, onSave, onDragValueChange, onDragEnd, }) => {
@@ -66,13 +67,11 @@ const TimelineRotationField = ({ field, effectiveValue, propStatus, onSave, onDr
66
67
  }
67
68
  }, [propStatus, onSave, serializeValue]);
68
69
  const formatter = (0, react_1.useCallback)((v) => {
69
- const formatted = (0, timeline_field_utils_1.formatTimelineNumber)({
70
- decimalPlaces,
71
- fixed: false,
72
- value: (0, timeline_field_utils_1.normalizeTimelineNumber)(Number(v)),
70
+ return (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
71
+ fieldSchema: field.fieldSchema,
72
+ value: v,
73
73
  });
74
- return `${formatted}\u00B0`;
75
- }, [decimalPlaces]);
74
+ }, [field.fieldSchema]);
76
75
  return (jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: dragValue !== null && dragValue !== void 0 ? dragValue : degrees, style: timeline_field_utils_1.draggerStyle, status: "ok", small: true, onValueChange: onValueChange, onValueChangeEnd: onValueChangeEnd, onTextChange: onTextChange, min: min, max: max, step: step, formatter: formatter, rightAlign: false }));
77
76
  };
78
77
  exports.TimelineRotationField = TimelineRotationField;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import type { TimelineSelectionInteraction } from './TimelineSelection';
3
+ import { type TimelineSelection } from './TimelineSelection';
3
4
  export declare const TimelineRowChrome: React.FC<{
4
5
  readonly depth: number;
5
6
  readonly eye: React.ReactNode;
@@ -9,6 +10,7 @@ export declare const TimelineRowChrome: React.FC<{
9
10
  readonly style: React.CSSProperties;
10
11
  readonly selected: boolean;
11
12
  readonly selectable: boolean;
13
+ readonly selectionItem: TimelineSelection | null;
12
14
  readonly onSelect: (interaction?: TimelineSelectionInteraction) => void;
13
15
  readonly showSelectedBackground: boolean;
14
16
  readonly containsSelection: boolean;
@@ -23,8 +23,10 @@ const keyframeControlsColumnBaseStyle = {
23
23
  flexShrink: 0,
24
24
  justifyContent: 'flex-start',
25
25
  };
26
- const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, style, selected, selectable, onSelect, showSelectedBackground, containsSelection, outerHeight, onDragLeave, onDragOver, onDrop, onDoubleClick, }) => {
26
+ const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, style, selected, selectable, selectionItem, onSelect, showSelectedBackground, containsSelection, outerHeight, onDragLeave, onDragOver, onDrop, onDoubleClick, }) => {
27
+ const ref = (0, react_1.useRef)(null);
27
28
  const indentWidth = (0, timeline_row_layout_1.getTimelineRowIndentWidth)(depth);
29
+ (0, TimelineSelection_1.useTimelineFocusableItem)(selectionItem, ref);
28
30
  const keyframeControlsColumnStyle = (0, react_1.useMemo)(() => ({
29
31
  ...keyframeControlsColumnBaseStyle,
30
32
  width: (0, timeline_row_layout_1.getTimelineRowLeftChromeWidth)(depth),
@@ -73,8 +75,8 @@ const TimelineRowChrome = ({ depth, eye, keyframeControls, arrow, children, styl
73
75
  const chrome = (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
74
76
  jsx_runtime_1.jsx("div", { style: leftChromeStyle, children: keyframeControls ? (jsx_runtime_1.jsx("div", { style: keyframeControlsColumnStyle, children: keyframeControls })) : (jsx_runtime_1.jsxs("div", { style: chromeColumnStyle, children: [eye, indentWidth > 0 ? jsx_runtime_1.jsx(Padder_1.Padder, { depth: depth }) : null, arrow] })) }), children] }));
75
77
  if (outerStyle) {
76
- return (jsx_runtime_1.jsx("div", { style: outerStyle, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClick, children: jsx_runtime_1.jsx("div", { style: innerRowStyle, children: chrome }) }));
78
+ return (jsx_runtime_1.jsx("div", { ref: ref, style: outerStyle, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClick, children: jsx_runtime_1.jsx("div", { style: innerRowStyle, children: chrome }) }));
77
79
  }
78
- return (jsx_runtime_1.jsx("div", { onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClick, style: innerRowStyle, children: chrome }));
80
+ return (jsx_runtime_1.jsx("div", { ref: ref, onDragLeave: onDragLeave, onDragOver: onDragOver, onDrop: onDrop, onPointerDown: selectable ? onPointerDown : undefined, onContextMenu: selectable ? onContextMenu : undefined, onDoubleClick: onDoubleClick, style: innerRowStyle, children: chrome }));
79
81
  };
80
82
  exports.TimelineRowChrome = TimelineRowChrome;
@@ -7,6 +7,7 @@ const no_react_1 = require("remotion/no-react");
7
7
  const colors_1 = require("../../helpers/colors");
8
8
  const scale_lock_1 = require("../../state/scale-lock");
9
9
  const InputDragger_1 = require("../NewComposition/InputDragger");
10
+ const timeline_field_display_utils_1 = require("./timeline-field-display-utils");
10
11
  const timeline_field_utils_1 = require("./timeline-field-utils");
11
12
  const TimelineLayerEye_1 = require("./TimelineLayerEye");
12
13
  const leftDraggerStyle = {
@@ -98,17 +99,12 @@ const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragV
98
99
  const max = field.fieldSchema.type === 'scale'
99
100
  ? ((_b = field.fieldSchema.max) !== null && _b !== void 0 ? _b : Infinity)
100
101
  : Infinity;
101
- const decimalPlaces = (0, react_1.useMemo)(() => (0, timeline_field_utils_1.getTimelineDisplayDecimalPlaces)({
102
- defaultDecimalPlaces: 3,
103
- step: configuredStep,
104
- }), [configuredStep]);
105
102
  const formatter = (0, react_1.useCallback)((v) => {
106
- return (0, timeline_field_utils_1.formatTimelineNumber)({
107
- decimalPlaces,
108
- fixed: true,
103
+ return (0, timeline_field_display_utils_1.formatTimelineFieldValueForDisplay)({
104
+ fieldSchema: field.fieldSchema,
109
105
  value: v,
110
106
  });
111
- }, [decimalPlaces]);
107
+ }, [field.fieldSchema]);
112
108
  const getDragStart = (0, react_1.useCallback)(() => {
113
109
  if (dragStartRef.current === null) {
114
110
  dragStartRef.current = [dragX !== null && dragX !== void 0 ? dragX : codeX, dragY !== null && dragY !== void 0 ? dragY : codeY];
@@ -1,5 +1,7 @@
1
1
  import React, { type CSSProperties } from 'react';
2
+ import { type GetDragOverrides, type GetEffectDragOverrides, type PropStatuses } from 'remotion';
2
3
  import type { SequenceNodePathInfo, TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
4
+ import { type GetIsExpanded } from '../ExpandedTracksProvider';
3
5
  export declare const TIMELINE_SELECTED_BACKGROUND = "#3B3F42";
4
6
  export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "#B0B0B0";
5
7
  export declare const TIMELINE_SELECTED_LABEL_TEXT = "black";
@@ -64,6 +66,7 @@ export type TimelineSelectionState = {
64
66
  readonly selectedItems: readonly TimelineSelection[];
65
67
  readonly anchor: TimelineSelection | null;
66
68
  };
69
+ export declare const EMPTY_TIMELINE_SELECTION_STATE: TimelineSelectionState;
67
70
  export type TimelineMarqueeRect = {
68
71
  readonly left: number;
69
72
  readonly top: number;
@@ -81,6 +84,11 @@ export declare const getTimelineSelectionAfterInteraction: ({ currentState, clic
81
84
  readonly interaction: TimelineSelectionInteraction;
82
85
  readonly allSelectableItems: readonly TimelineSelection[];
83
86
  }) => TimelineSelectionState;
87
+ export declare const getAvailableTimelineSelectionState: ({ availableKeys, availableItemsByKey, state, }: {
88
+ readonly availableKeys: ReadonlySet<string>;
89
+ readonly availableItemsByKey?: ReadonlyMap<string, TimelineSelection> | undefined;
90
+ readonly state: TimelineSelectionState;
91
+ }) => TimelineSelectionState;
84
92
  export declare const getNormalizedTimelineMarqueeRect: ({ startX, startY, currentX, currentY, }: {
85
93
  readonly startX: number;
86
94
  readonly startY: number;
@@ -108,10 +116,10 @@ type TimelineSelectionContextValue = {
108
116
  readonly canSelect: boolean;
109
117
  readonly selectedItems: readonly TimelineSelection[];
110
118
  readonly isSelected: (item: TimelineSelection) => boolean;
111
- readonly selectItem: (item: TimelineSelection, interaction?: TimelineSelectionInteraction) => void;
119
+ readonly selectItem: (item: TimelineSelection, interaction?: TimelineSelectionInteraction, allSelectableItems?: readonly TimelineSelection[]) => void;
112
120
  readonly selectItems: (items: readonly TimelineSelection[]) => void;
113
- readonly registerSelectableItem: (item: TimelineSelection) => () => void;
114
121
  readonly registerMarqueeSelectableItem: (item: TimelineSelection, getRect: () => DOMRect | null) => () => void;
122
+ readonly registerFocusableItem: (item: TimelineSelection, getRect: () => DOMRect | null) => () => void;
115
123
  readonly getMarqueeSelection: (marqueeRect: TimelineMarqueeRect, lockedSelectionKind: TimelineMarqueeSelectionKind | null) => {
116
124
  readonly lockedSelectionKind: TimelineMarqueeSelectionKind | null;
117
125
  readonly selectedItems: readonly TimelineSelection[];
@@ -119,13 +127,30 @@ type TimelineSelectionContextValue = {
119
127
  readonly containsSelection: (nodePathInfo: SequenceNodePathInfo) => boolean;
120
128
  readonly clearSelection: () => void;
121
129
  };
130
+ export declare const TimelineSelectionOrderProvider: React.FC<{
131
+ readonly children: React.ReactNode;
132
+ readonly items: readonly TimelineSelection[];
133
+ }>;
122
134
  export declare const getTimelineSelectionFromNodePathInfo: (nodePathInfo: SequenceNodePathInfo | null) => TimelineSelection | null;
123
135
  export declare const getTimelineSelectionKey: (item: TimelineSelection) => string;
124
136
  export declare const getSelectableTimelineSequenceSelections: (tracks: readonly Pick<TrackWithHash, "nodePathInfo">[]) => TimelineSelection[];
137
+ export declare const getSelectableTimelineItems: ({ getDragOverrides, getEffectDragOverrides, getIsExpanded, propStatuses, selectedItems, timeline, timelinePosition, }: {
138
+ readonly getDragOverrides: GetDragOverrides;
139
+ readonly getEffectDragOverrides: GetEffectDragOverrides;
140
+ readonly getIsExpanded: GetIsExpanded;
141
+ readonly propStatuses: PropStatuses;
142
+ readonly selectedItems: readonly TimelineSelection[];
143
+ readonly timeline: readonly TrackWithHash[];
144
+ readonly timelinePosition: number;
145
+ }) => TimelineSelection[];
125
146
  export declare const getTimelineSequenceSelectionKey: (nodePathInfo: SequenceNodePathInfo) => string;
126
147
  export declare const TimelineSelectAllKeybindings: React.FC<{
127
148
  readonly timeline: readonly TrackWithHash[];
128
149
  }>;
150
+ export declare const TimelineSelectableItemsProvider: React.FC<{
151
+ readonly children: React.ReactNode;
152
+ readonly timeline: readonly TrackWithHash[];
153
+ }>;
129
154
  export declare const TimelineSelectionProvider: React.FC<{
130
155
  readonly children: React.ReactNode;
131
156
  }>;
@@ -138,6 +163,7 @@ export declare const useTimelineMarqueeSelection: () => {
138
163
  onPointerDownCapture: (event: React.PointerEvent<HTMLDivElement>) => void;
139
164
  };
140
165
  export declare const useTimelineMarqueeSelectableItem: (item: TimelineSelection | null, ref: React.RefObject<Element | null>) => void;
166
+ export declare const useTimelineFocusableItem: (item: TimelineSelection | null, ref: React.RefObject<Element | null>) => void;
141
167
  export declare const useTimelineRowSelection: (nodePathInfo: SequenceNodePathInfo | null) => {
142
168
  onSelect: (interaction?: TimelineSelectionInteraction | undefined) => void;
143
169
  selectable: boolean;