@remotion/studio 4.0.479 → 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 (57) hide show
  1. package/dist/components/AudioWaveform.js +19 -11
  2. package/dist/components/Button.d.ts +1 -0
  3. package/dist/components/Button.js +2 -2
  4. package/dist/components/CurrentCompositionSideEffects.d.ts +0 -3
  5. package/dist/components/CurrentCompositionSideEffects.js +1 -37
  6. package/dist/components/Editor.js +2 -5
  7. package/dist/components/EditorContent.js +2 -1
  8. package/dist/components/ExpandedTracksProvider.d.ts +1 -0
  9. package/dist/components/ExpandedTracksProvider.js +81 -7
  10. package/dist/components/GlobalKeybindings.d.ts +3 -1
  11. package/dist/components/GlobalKeybindings.js +104 -10
  12. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +4 -3
  13. package/dist/components/InspectorPanel/inspector-selection.d.ts +3 -3
  14. package/dist/components/InspectorPanel/inspector-selection.js +7 -6
  15. package/dist/components/InspectorPanel/styles.d.ts +1 -0
  16. package/dist/components/InspectorPanel/styles.js +19 -1
  17. package/dist/components/InspectorPanel.js +3 -3
  18. package/dist/components/InspectorSequenceSection.d.ts +3 -0
  19. package/dist/components/InspectorSequenceSection.js +12 -2
  20. package/dist/components/KeyboardShortcutsExplainer.js +10 -2
  21. package/dist/components/ResetZoomButton.d.ts +2 -1
  22. package/dist/components/ResetZoomButton.js +5 -1
  23. package/dist/components/SelectedOutlineElement.js +39 -0
  24. package/dist/components/SelectedOutlineOverlay.js +3 -1
  25. package/dist/components/Timeline/Timeline.js +9 -9
  26. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  27. package/dist/components/Timeline/TimelineEffectPropItem.js +1 -1
  28. package/dist/components/Timeline/TimelineExpandArrowButton.js +42 -2
  29. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  30. package/dist/components/Timeline/TimelineExpandedSection.js +8 -9
  31. package/dist/components/Timeline/TimelineRowChrome.d.ts +2 -0
  32. package/dist/components/Timeline/TimelineRowChrome.js +5 -3
  33. package/dist/components/Timeline/TimelineSelection.d.ts +22 -2
  34. package/dist/components/Timeline/TimelineSelection.js +276 -90
  35. package/dist/components/Timeline/TimelineSequenceItem.js +61 -2
  36. package/dist/components/Timeline/TimelineSequencePropItem.js +1 -1
  37. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +6 -4
  38. package/dist/components/Timeline/find-track-for-node-path-info.js +2 -2
  39. package/dist/components/Timeline/get-node-keyframes.d.ts +7 -0
  40. package/dist/components/Timeline/get-node-keyframes.js +26 -1
  41. package/dist/components/Timeline/reset-selected-timeline-props.js +15 -2
  42. package/dist/components/Timeline/timeline-expanded-filter.d.ts +12 -0
  43. package/dist/components/Timeline/timeline-expanded-filter.js +38 -0
  44. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +50 -18
  45. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +1 -0
  46. package/dist/components/Timeline/use-timeline-expanded-tree.js +27 -0
  47. package/dist/components/Timeline/use-timeline-height.js +51 -7
  48. package/dist/components/Timeline/use-timeline-keyframe-drag.js +12 -6
  49. package/dist/components/TopPanel.js +1 -1
  50. package/dist/components/selected-outline-measurement.js +48 -14
  51. package/dist/error-overlay/remotion-overlay/ErrorLoader.js +8 -1
  52. package/dist/esm/{chunk-fge2mq5p.js → chunk-4rq5gt8c.js} +16552 -15859
  53. package/dist/esm/internals.mjs +16552 -15859
  54. package/dist/esm/previewEntry.mjs +4055 -3360
  55. package/dist/esm/renderEntry.mjs +1 -1
  56. package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
  57. package/package.json +11 -11
@@ -11,13 +11,13 @@ const styles_1 = require("./InspectorPanel/styles");
11
11
  const TimelineSelection_1 = require("./Timeline/TimelineSelection");
12
12
  const InspectorPanel = ({ composition, currentDefaultProps, setDefaultProps }) => {
13
13
  const { selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
14
- const sameSequencePropInspectorSelection = (0, react_1.useMemo)(() => (0, inspector_selection_1.getSameSequencePropInspectorSelection)(selectedItems), [selectedItems]);
14
+ const sameSequenceInspectorSelection = (0, react_1.useMemo)(() => (0, inspector_selection_1.getSameSequenceInspectorSelection)(selectedItems), [selectedItems]);
15
15
  if (selectedItems.length === 0) {
16
16
  return (jsx_runtime_1.jsx(DefaultInspector_1.DefaultInspector, { composition: composition, currentDefaultProps: currentDefaultProps, setDefaultProps: setDefaultProps }));
17
17
  }
18
18
  if (selectedItems.length > 1) {
19
- if (sameSequencePropInspectorSelection) {
20
- return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsx(SelectedInspector_1.SelectedInspector, { selection: sameSequencePropInspectorSelection }) }));
19
+ if (sameSequenceInspectorSelection) {
20
+ return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsx(SelectedInspector_1.SelectedInspector, { selection: sameSequenceInspectorSelection }) }));
21
21
  }
22
22
  return (jsx_runtime_1.jsx("div", { style: styles_1.container, children: jsx_runtime_1.jsxs(common_1.InspectorMessage, { children: [selectedItems.length, " items selected"] }) }));
23
23
  }
@@ -2,9 +2,12 @@ import React from 'react';
2
2
  import type { TSequence } from 'remotion';
3
3
  import type { CodePosition } from '../error-overlay/react-overlay/utils/get-source-map';
4
4
  import type { SequenceNodePathInfo } from '../helpers/get-timeline-sequence-sort-key';
5
+ import { type FlatTreeRow } from '../helpers/timeline-layout';
6
+ import { type TimelineSelection } from './Timeline/TimelineSelection';
5
7
  type SequenceWithControls = TSequence & {
6
8
  readonly controls: NonNullable<TSequence['controls']>;
7
9
  };
10
+ export declare const getInspectorSelectableItems: (rows: readonly FlatTreeRow[]) => TimelineSelection[];
8
11
  export declare const hasSequenceControls: (sequence: TSequence) => sequence is SequenceWithControls;
9
12
  export declare const InspectorSequenceSection: React.FC<{
10
13
  readonly sequence: SequenceWithControls;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InspectorSequenceSection = exports.hasSequenceControls = void 0;
3
+ exports.InspectorSequenceSection = exports.hasSequenceControls = exports.getInspectorSelectableItems = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const client_id_1 = require("../helpers/client-id");
@@ -11,6 +11,7 @@ const modals_1 = require("../state/modals");
11
11
  const InlineAction_1 = require("./InlineAction");
12
12
  const styles_1 = require("./InspectorPanel/styles");
13
13
  const TimelineExpandedRow_1 = require("./Timeline/TimelineExpandedRow");
14
+ const TimelineSelection_1 = require("./Timeline/TimelineSelection");
14
15
  const use_timeline_expanded_tree_1 = require("./Timeline/use-timeline-expanded-tree");
15
16
  const container = {
16
17
  color: 'white',
@@ -54,6 +55,13 @@ const isEffectsRoot = (node) => {
54
55
  const getInspectorExpansionKey = (nodePathInfo) => {
55
56
  return JSON.stringify(nodePathInfo);
56
57
  };
58
+ const getInspectorSelectableItems = (rows) => {
59
+ return rows.flatMap(({ node }) => {
60
+ const selection = (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(node.nodePathInfo);
61
+ return selection ? [selection] : [];
62
+ });
63
+ };
64
+ exports.getInspectorSelectableItems = getInspectorSelectableItems;
57
65
  const hasSequenceControls = (sequence) => {
58
66
  return sequence.controls !== null;
59
67
  };
@@ -106,6 +114,8 @@ const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, k
106
114
  }),
107
115
  };
108
116
  }, [getIsExpanded, tree]);
117
+ const controlSelectableItems = (0, react_1.useMemo)(() => (0, exports.getInspectorSelectableItems)(controlRows), [controlRows]);
118
+ const effectSelectableItems = (0, react_1.useMemo)(() => (0, exports.getInspectorSelectableItems)(effectRows), [effectRows]);
109
119
  const { schema } = sequence.controls;
110
120
  const showEffectsSection = nodePathInfo.supportsEffects || effectRows.length > 0;
111
121
  const showControlsEffectsDivider = controlRows.length > 0 && showEffectsSection;
@@ -142,6 +152,6 @@ const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, k
142
152
  ] }));
143
153
  }
144
154
  return (jsx_runtime_1.jsxs("div", { style: container, children: [
145
- jsx_runtime_1.jsx("div", { style: divider }), controlRows.length > 0 ? renderSectionHeader('Controls') : null, controlRows.map(renderRow), showEffectsSection ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [showControlsEffectsDivider ? (jsx_runtime_1.jsx("div", { style: controlsEffectsDivider })) : null, renderEffectsHeader(), effectRows.length === 0 ? (jsx_runtime_1.jsx("div", { style: emptyState, children: "None" })) : (effectRows.map(renderRow))] })) : null] }));
155
+ jsx_runtime_1.jsx("div", { style: divider }), controlRows.length > 0 ? renderSectionHeader('Controls') : null, jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: controlRows.map(renderRow) }), showEffectsSection ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [showControlsEffectsDivider ? (jsx_runtime_1.jsx("div", { style: controlsEffectsDivider })) : null, renderEffectsHeader(), effectRows.length === 0 ? (jsx_runtime_1.jsx("div", { style: emptyState, children: "None" })) : (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: effectSelectableItems, children: effectRows.map(renderRow) }))] })) : null] }));
146
156
  };
147
157
  exports.InspectorSequenceSection = InspectorSequenceSection;
@@ -109,9 +109,9 @@ const KeyboardShortcutsExplainer = () => {
109
109
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
110
110
  jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "PageDown" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Next composition" })
111
111
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
112
- jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "R" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Render composition" })
112
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "R" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Render, unless a sequence or prop is selected" })
113
113
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
114
- jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "T" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Toggle checkerboard background" })
114
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "T" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Checkerboard, unless a sequence or prop is selected" })
115
115
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
116
116
  jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "?" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Show keyboard shortcuts" })
117
117
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
@@ -146,6 +146,14 @@ const KeyboardShortcutsExplainer = () => {
146
146
  jsx_runtime_1.jsxs("div", { style: left, children: [
147
147
  jsx_runtime_1.jsx("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.3 }), jsx_runtime_1.jsx("kbd", { style: key, children: "A" })
148
148
  ] }), jsx_runtime_1.jsx("div", { style: right, children: "Select sequence rows" })
149
+ ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
150
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "P" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Select translate prop" })
151
+ ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
152
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "T" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Select opacity prop" })
153
+ ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
154
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "R" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Select rotate prop" })
155
+ ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
156
+ jsx_runtime_1.jsx("div", { style: left, children: jsx_runtime_1.jsx("kbd", { style: key, children: "S" }) }), jsx_runtime_1.jsx("div", { style: right, children: "Select scale prop" })
149
157
  ] }), jsx_runtime_1.jsxs(layout_1.Row, { align: "center", children: [
150
158
  jsx_runtime_1.jsxs("div", { style: left, children: [
151
159
  jsx_runtime_1.jsx("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.3 }), jsx_runtime_1.jsx("kbd", { style: key, children: "D" })
@@ -1,3 +1,4 @@
1
+ import React from 'react';
1
2
  export declare const ResetZoomButton: React.FC<{
2
- onClick: () => void;
3
+ readonly onClick: () => void;
3
4
  }>;
@@ -2,8 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ResetZoomButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
5
6
  const Button_1 = require("./Button");
6
7
  const ResetZoomButton = ({ onClick }) => {
7
- return jsx_runtime_1.jsx(Button_1.Button, { onClick: onClick, children: "Reset zoom" });
8
+ const onPointerDown = (0, react_1.useCallback)((event) => {
9
+ event.stopPropagation();
10
+ }, []);
11
+ return (jsx_runtime_1.jsx(Button_1.Button, { onClick: onClick, onPointerDown: onPointerDown, children: "Reset zoom" }));
8
12
  };
9
13
  exports.ResetZoomButton = ResetZoomButton;
@@ -42,6 +42,7 @@ const client_id_1 = require("../helpers/client-id");
42
42
  const colors_1 = require("../helpers/colors");
43
43
  const format_file_location_1 = require("../helpers/format-file-location");
44
44
  const open_in_editor_1 = require("../helpers/open-in-editor");
45
+ const modals_1 = require("../state/modals");
45
46
  const call_api_1 = require("./call-api");
46
47
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
47
48
  const ContextMenu_1 = require("./ContextMenu");
@@ -914,6 +915,7 @@ const SelectedOutlineElement = ({ allDragTargets, allRotationDragTargets, allSca
914
915
  const updateResolvedStackTrace = (0, react_1.useContext)(remotion_1.Internals.SequenceStackTracesUpdateContext);
915
916
  const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
916
917
  const selectAsset = (0, use_select_asset_1.useSelectAsset)();
918
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
917
919
  const onContextMenuOpen = react_1.default.useCallback(async () => {
918
920
  if (target === undefined || previewServerState.type !== 'connected') {
919
921
  return false;
@@ -948,6 +950,9 @@ const SelectedOutlineElement = ({ allDragTargets, allRotationDragTargets, allSca
948
950
  const canOpenInEditor = Boolean(window.remotion_editorName && originalLocation);
949
951
  const disableInteractivityDisabled = !target.sequence.showInTimeline;
950
952
  const sourceEditDisabled = !target.sequence.controls || !nodePath.absolutePath;
953
+ const canAddEffect = target.nodePathInfo.supportsEffects &&
954
+ !sourceEditDisabled &&
955
+ previewServerState.type === 'connected';
951
956
  return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
952
957
  assetLinkInfo,
953
958
  canOpenInEditor,
@@ -1021,12 +1026,46 @@ const SelectedOutlineElement = ({ allDragTargets, allRotationDragTargets, allSca
1021
1026
  originalLocation,
1022
1027
  selectAsset,
1023
1028
  sequence: target.sequence,
1029
+ sourceActions: [
1030
+ ...(target.nodePathInfo.supportsEffects
1031
+ ? [
1032
+ {
1033
+ type: 'item',
1034
+ id: 'add-effect',
1035
+ keyHint: null,
1036
+ label: 'Add effect...',
1037
+ leftItem: null,
1038
+ disabled: !canAddEffect,
1039
+ onClick: () => {
1040
+ if (!canAddEffect ||
1041
+ previewServerState.type !== 'connected') {
1042
+ return;
1043
+ }
1044
+ setSelectedModal({
1045
+ type: 'add-effect',
1046
+ clientId: previewServerState.clientId,
1047
+ fileName: nodePath.absolutePath,
1048
+ nodePath,
1049
+ });
1050
+ },
1051
+ quickSwitcherLabel: null,
1052
+ subMenu: null,
1053
+ value: 'add-effect',
1054
+ },
1055
+ {
1056
+ type: 'divider',
1057
+ id: 'add-effect-divider',
1058
+ },
1059
+ ]
1060
+ : []),
1061
+ ],
1024
1062
  });
1025
1063
  }, [
1026
1064
  confirm,
1027
1065
  onSelect,
1028
1066
  previewServerState,
1029
1067
  selectAsset,
1068
+ setSelectedModal,
1030
1069
  setPropStatuses,
1031
1070
  target,
1032
1071
  updateResolvedStackTrace,
@@ -364,7 +364,9 @@ const SelectedOutlineOverlay = ({ scale }) => {
364
364
  return new Map(outlineTargets.map((target) => [target.key, target]));
365
365
  }, [outlineTargets]);
366
366
  const allDragTargets = (0, react_1.useMemo)(() => {
367
- return outlineTargets.flatMap((target) => target.selected && target.drag !== null ? [target.drag] : []);
367
+ return outlineTargets.flatMap((target) => (target.selected || target.containsSelection) && target.drag !== null
368
+ ? [target.drag]
369
+ : []);
368
370
  }, [outlineTargets]);
369
371
  const allScaleDragTargets = (0, react_1.useMemo)(() => {
370
372
  return outlineTargets.flatMap((target) => target.selected && target.scaleDrag !== null ? [target.scaleDrag] : []);
@@ -231,15 +231,15 @@ const TimelineInner = () => {
231
231
  return null;
232
232
  }
233
233
  return (jsx_runtime_1.jsx(SubscribeToNodePaths_1.SubscribeToNodePaths, { overrideId: sequence.controls.overrideId, componentIdentity: sequence.controls.componentIdentity, schema: sequence.controls.schema, getStack: sequence.getStack, effects: sequence.effects }, sequence.id));
234
- }), jsx_runtime_1.jsx(SequencePropsObserver_1.SequencePropsObserver, {}), jsx_runtime_1.jsxs(TimelineKeyframeTracksContext_1.TimelineKeyframeTracksProvider, { tracks: filtered, children: [
235
- jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectAllKeybindings, { timeline: shown }), jsx_runtime_1.jsx(TimelineHeightContainer_1.TimelineHeightContainer, { shown: shown, hasBeenCut: hasBeenCut, children: isStill ? (jsx_runtime_1.jsx(TimelineList_1.TimelineList, { timeline: shown })) : (jsx_runtime_1.jsxs(TimelineWidthProvider_1.TimelineWidthProvider, { children: [
236
- jsx_runtime_1.jsx(TimelinePinchZoom_1.TimelinePinchZoom, {}), jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { orientation: "vertical", defaultFlex: 0.2, id: "names-to-timeline", maxFlex: 0.5, minFlex: 0.15, children: [
237
- jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "flexer", sticky: jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimePlaceholders, {}), children: jsx_runtime_1.jsx(TimelineList_1.TimelineList, { timeline: shown }) }), jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { onCollapse: noop, allowToCollapse: "none" }), jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "anti-flexer", sticky: null, children: jsx_runtime_1.jsxs(TimelineScrollable_1.TimelineScrollable, { children: [
238
- jsx_runtime_1.jsx(TimelineTracks_1.TimelineTracks, { timeline: shown, hasBeenCut: hasBeenCut }), jsx_runtime_1.jsx(TimelinePlayCursorSyncer_1.TimelinePlayCursorSyncer, {}), jsx_runtime_1.jsx(TimelineInOutPointer_1.TimelineInOutPointer, {}), jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimeIndicators, {}), jsx_runtime_1.jsx(TimelineDragHandler_1.TimelineDragHandler, {}), jsx_runtime_1.jsx(TimelineInOutDragHandler_1.TimelineInOutDragHandler, {}), jsx_runtime_1.jsx(TimelineSlider_1.TimelineSlider, {})
239
- ] }) })
240
- ] })
241
- ] })) })
242
- ] })
234
+ }), jsx_runtime_1.jsx(SequencePropsObserver_1.SequencePropsObserver, {}), jsx_runtime_1.jsx(TimelineKeyframeTracksContext_1.TimelineKeyframeTracksProvider, { tracks: filtered, children: jsx_runtime_1.jsxs(TimelineSelection_1.TimelineSelectableItemsProvider, { timeline: shown, children: [
235
+ jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectAllKeybindings, { timeline: shown }), jsx_runtime_1.jsx(TimelineHeightContainer_1.TimelineHeightContainer, { shown: shown, hasBeenCut: hasBeenCut, children: isStill ? (jsx_runtime_1.jsx(TimelineList_1.TimelineList, { timeline: shown })) : (jsx_runtime_1.jsxs(TimelineWidthProvider_1.TimelineWidthProvider, { children: [
236
+ jsx_runtime_1.jsx(TimelinePinchZoom_1.TimelinePinchZoom, {}), jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { orientation: "vertical", defaultFlex: 0.2, id: "names-to-timeline", maxFlex: 0.5, minFlex: 0.15, children: [
237
+ jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "flexer", sticky: jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimePlaceholders, {}), children: jsx_runtime_1.jsx(TimelineList_1.TimelineList, { timeline: shown }) }), jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { onCollapse: noop, allowToCollapse: "none" }), jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { type: "anti-flexer", sticky: null, children: jsx_runtime_1.jsxs(TimelineScrollable_1.TimelineScrollable, { children: [
238
+ jsx_runtime_1.jsx(TimelineTracks_1.TimelineTracks, { timeline: shown, hasBeenCut: hasBeenCut }), jsx_runtime_1.jsx(TimelinePlayCursorSyncer_1.TimelinePlayCursorSyncer, {}), jsx_runtime_1.jsx(TimelineInOutPointer_1.TimelineInOutPointer, {}), jsx_runtime_1.jsx(TimelineTimeIndicators_1.TimelineTimeIndicators, {}), jsx_runtime_1.jsx(TimelineDragHandler_1.TimelineDragHandler, {}), jsx_runtime_1.jsx(TimelineInOutDragHandler_1.TimelineInOutDragHandler, {}), jsx_runtime_1.jsx(TimelineSlider_1.TimelineSlider, {})
239
+ ] }) })
240
+ ] })
241
+ ] })) })
242
+ ] }) })
243
243
  ] }));
244
244
  };
245
245
  exports.Timeline = react_1.default.memo(TimelineInner);
@@ -316,7 +316,7 @@ const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, do
316
316
  ...(dropIndicator === 'before' ? { top: -1 } : { bottom: -1 }),
317
317
  };
318
318
  }, [dropIndicator]);
319
- const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: canToggle ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: "effect", hidden: isDisabled, onInvoked: onToggle })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: () => toggleTrack(nodePathInfo), label: `${label} section`, disabled: false }), style: rowStyle, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx("span", { title: label, style: labelStyle, children: label }) }));
319
+ const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: canToggle ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: "effect", hidden: isDisabled, onInvoked: onToggle })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: () => toggleTrack(nodePathInfo), label: `${label} section`, disabled: false }), style: rowStyle, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx("span", { title: label, style: labelStyle, children: label }) }));
320
320
  const draggableRow = canReorder ? (jsx_runtime_1.jsxs("div", { draggable: true, onDragStart: onDragStart, onDragEnd: onDragEnd, onDragOver: onDragOver, onDragLeave: onDragLeave, onDrop: onDrop, style: reorderWrapper, children: [reorderLineStyle ? jsx_runtime_1.jsx("div", { style: reorderLineStyle }) : null, row] })) : (row);
321
321
  return previewConnected ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selection.selectable ? selection.onSelect : null, children: draggableRow })) : (draggableRow);
322
322
  };
@@ -359,7 +359,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
359
359
  previewServerState,
360
360
  propStatus,
361
361
  ]);
362
- const row = (jsx_runtime_1.jsxs(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, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: [
362
+ const row = (jsx_runtime_1.jsxs(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, selectionItem: selection.selectionItem, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: [
363
363
  jsx_runtime_1.jsx(TimelineFieldLabel_1.TimelineFieldLabel, { rowDepth: rowDepth, selected: selection.selected, label: (_c = field.description) !== null && _c !== void 0 ? _c : field.key }), jsx_runtime_1.jsx("div", { style: timeline_field_row_layout_1.timelineFieldValueColumnStyle, children: jsx_runtime_1.jsx(exports.TimelineEffectPropValue, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, sourceFrame: sourceFrame }) })
364
364
  ] }));
365
365
  return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selection.selectable ? selection.onSelect : null, children: row }));
@@ -1,8 +1,41 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.TimelineExpandArrowSpacer = exports.TimelineExpandArrowButton = void 0;
4
37
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("react");
38
+ const react_1 = __importStar(require("react"));
6
39
  const arrowButton = {
7
40
  background: 'none',
8
41
  border: 'none',
@@ -27,6 +60,13 @@ const arrowSpacer = {
27
60
  };
28
61
  const svgStyle = { display: 'block' };
29
62
  const TimelineExpandArrowButton = ({ isExpanded, onClick, label, disabled = false }) => {
63
+ const handleClick = react_1.default.useCallback((e) => {
64
+ e.stopPropagation();
65
+ onClick();
66
+ }, [onClick]);
67
+ const stopPropagation = react_1.default.useCallback((e) => {
68
+ e.stopPropagation();
69
+ }, []);
30
70
  const style = (0, react_1.useMemo)(() => {
31
71
  return {
32
72
  ...arrowButton,
@@ -35,7 +75,7 @@ const TimelineExpandArrowButton = ({ isExpanded, onClick, label, disabled = fals
35
75
  opacity: disabled ? 0.5 : 1,
36
76
  };
37
77
  }, [isExpanded, disabled]);
38
- return (jsx_runtime_1.jsx("button", { type: "button", style: style, onClick: onClick, disabled: disabled, "aria-expanded": isExpanded, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${label}`, children: jsx_runtime_1.jsx("svg", { width: "12", height: "12", viewBox: "0 0 8 8", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M2 1L6 4L2 7Z", fill: "#ccc" }) }) }));
78
+ return (jsx_runtime_1.jsx("button", { type: "button", style: style, onClick: handleClick, onDoubleClick: stopPropagation, onPointerDown: stopPropagation, disabled: disabled, "aria-expanded": isExpanded, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${label}`, children: jsx_runtime_1.jsx("svg", { width: "12", height: "12", viewBox: "0 0 8 8", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M2 1L6 4L2 7Z", fill: "#ccc" }) }) }));
39
79
  };
40
80
  exports.TimelineExpandArrowButton = TimelineExpandArrowButton;
41
81
  const TimelineExpandArrowSpacer = () => {
@@ -44,7 +44,7 @@ const TimelineExpandedRow = ({ node, depth, nestedDepth, rowDepthBase, getIsExpa
44
44
  const isExpanded = getIsExpanded(node.nodePathInfo);
45
45
  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: {
46
46
  height: timeline_layout_1.TREE_GROUP_ROW_HEIGHT,
47
- }, 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 }) }));
47
+ }, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx("span", { style: labelStyle, children: node.label }) }));
48
48
  }
49
49
  if (node.field) {
50
50
  if (node.field.kind === 'effect-field') {
@@ -57,6 +57,6 @@ const TimelineExpandedRow = ({ node, depth, nestedDepth, rowDepthBase, getIsExpa
57
57
  }
58
58
  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.TimelineExpandArrowSpacer, {}), style: {
59
59
  height: (0, timeline_layout_1.getTreeRowHeight)(node),
60
- }, 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 }) }));
60
+ }, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx("span", { style: labelStyle, children: node.label }) }));
61
61
  };
62
62
  exports.TimelineExpandedRow = TimelineExpandedRow;
@@ -53,17 +53,16 @@ const separator = {
53
53
  borderBottom: `1px solid ${colors_1.TIMELINE_TRACK_SEPARATOR}`,
54
54
  };
55
55
  const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, nestedDepth, keyframeDisplayOffset, }) => {
56
- const { getIsExpanded, propStatuses, toggleTrack, tree } = (0, use_timeline_expanded_tree_1.useTimelineExpandedTree)({
56
+ const { filteredTree, getIsExpanded, toggleTrack } = (0, use_timeline_expanded_tree_1.useTimelineExpandedTree)({
57
57
  sequence,
58
58
  nodePathInfo,
59
59
  });
60
- const flat = (0, react_1.useMemo)(() => (0, timeline_layout_1.flattenVisibleTreeNodes)({ nodes: tree, getIsExpanded }), [tree, getIsExpanded]);
61
- const expandedHeight = (0, react_1.useMemo)(() => (0, timeline_layout_1.getExpandedTrackHeight)({
62
- sequence,
63
- nodePathInfo,
64
- getIsExpanded,
65
- propStatuses,
66
- }), [sequence, nodePathInfo, getIsExpanded, propStatuses]);
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]);
67
66
  const style = (0, react_1.useMemo)(() => {
68
67
  return {
69
68
  ...expandedSectionBase,
@@ -72,7 +71,7 @@ const TimelineExpandedSection = ({ sequence, validatedLocation, nodePathInfo, ne
72
71
  }, [expandedHeight]);
73
72
  const { schema } = sequence.controls;
74
73
  if (flat.length === 0) {
75
- return jsx_runtime_1.jsx("div", { style: style, children: "No schema" });
74
+ return null;
76
75
  }
77
76
  return (jsx_runtime_1.jsx("div", { style: style, children: flat.map(({ node, depth }, i) => {
78
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,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;
@@ -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";
@@ -114,10 +116,10 @@ type TimelineSelectionContextValue = {
114
116
  readonly canSelect: boolean;
115
117
  readonly selectedItems: readonly TimelineSelection[];
116
118
  readonly isSelected: (item: TimelineSelection) => boolean;
117
- readonly selectItem: (item: TimelineSelection, interaction?: TimelineSelectionInteraction) => void;
119
+ readonly selectItem: (item: TimelineSelection, interaction?: TimelineSelectionInteraction, allSelectableItems?: readonly TimelineSelection[]) => void;
118
120
  readonly selectItems: (items: readonly TimelineSelection[]) => void;
119
- readonly registerSelectableItem: (item: TimelineSelection) => () => void;
120
121
  readonly registerMarqueeSelectableItem: (item: TimelineSelection, getRect: () => DOMRect | null) => () => void;
122
+ readonly registerFocusableItem: (item: TimelineSelection, getRect: () => DOMRect | null) => () => void;
121
123
  readonly getMarqueeSelection: (marqueeRect: TimelineMarqueeRect, lockedSelectionKind: TimelineMarqueeSelectionKind | null) => {
122
124
  readonly lockedSelectionKind: TimelineMarqueeSelectionKind | null;
123
125
  readonly selectedItems: readonly TimelineSelection[];
@@ -125,13 +127,30 @@ type TimelineSelectionContextValue = {
125
127
  readonly containsSelection: (nodePathInfo: SequenceNodePathInfo) => boolean;
126
128
  readonly clearSelection: () => void;
127
129
  };
130
+ export declare const TimelineSelectionOrderProvider: React.FC<{
131
+ readonly children: React.ReactNode;
132
+ readonly items: readonly TimelineSelection[];
133
+ }>;
128
134
  export declare const getTimelineSelectionFromNodePathInfo: (nodePathInfo: SequenceNodePathInfo | null) => TimelineSelection | null;
129
135
  export declare const getTimelineSelectionKey: (item: TimelineSelection) => string;
130
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[];
131
146
  export declare const getTimelineSequenceSelectionKey: (nodePathInfo: SequenceNodePathInfo) => string;
132
147
  export declare const TimelineSelectAllKeybindings: React.FC<{
133
148
  readonly timeline: readonly TrackWithHash[];
134
149
  }>;
150
+ export declare const TimelineSelectableItemsProvider: React.FC<{
151
+ readonly children: React.ReactNode;
152
+ readonly timeline: readonly TrackWithHash[];
153
+ }>;
135
154
  export declare const TimelineSelectionProvider: React.FC<{
136
155
  readonly children: React.ReactNode;
137
156
  }>;
@@ -144,6 +163,7 @@ export declare const useTimelineMarqueeSelection: () => {
144
163
  onPointerDownCapture: (event: React.PointerEvent<HTMLDivElement>) => void;
145
164
  };
146
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;
147
167
  export declare const useTimelineRowSelection: (nodePathInfo: SequenceNodePathInfo | null) => {
148
168
  onSelect: (interaction?: TimelineSelectionInteraction | undefined) => void;
149
169
  selectable: boolean;