@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
@@ -1,15 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useTimelineRowContainsSelection = exports.useTimelineGuideSelection = exports.useTimelineEasingSelection = exports.useTimelineKeyframeSelection = exports.useTimelineRowSelection = exports.useTimelineMarqueeSelectableItem = exports.useTimelineMarqueeSelection = exports.useCurrentTimelineSelectionStateAsRef = exports.TIMELINE_SCRUBBER_ATTR = exports.TIMELINE_MARQUEE_ITEM_ATTR = exports.useTimelineSelection = exports.TimelineSelectionProvider = exports.TimelineSelectAllKeybindings = exports.getTimelineSequenceSelectionKey = exports.getSelectableTimelineSequenceSelections = exports.getTimelineSelectionKey = exports.getTimelineSelectionFromNodePathInfo = exports.getTimelineMarqueeSelection = exports.timelineMarqueeRectsIntersect = exports.getClampedTimelineMarqueePoint = exports.getNormalizedTimelineMarqueeRect = exports.getTimelineSelectionAfterInteraction = exports.shouldSelectTimelineRowOnPointerDown = exports.isTimelineSelectionModifierEvent = exports.TIMELINE_TICKS_BACKGROUND = exports.TIMELINE_BACKGROUND = exports.getTimelineSelectedTrackHighlightStyle = exports.getTimelineColor = exports.getTimelineSelectedLabelStyle = exports.TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = exports.TIMELINE_SELECTED_LABEL_TEXT = exports.TIMELINE_SELECTED_LABEL_BACKGROUND = exports.TIMELINE_SELECTED_BACKGROUND = void 0;
3
+ exports.useTimelineRowContainsSelection = exports.useTimelineGuideSelection = exports.useTimelineEasingSelection = exports.useTimelineKeyframeSelection = exports.useTimelineRowSelection = exports.useTimelineFocusableItem = exports.useTimelineMarqueeSelectableItem = exports.useTimelineMarqueeSelection = exports.useCurrentTimelineSelectionStateAsRef = exports.TIMELINE_SCRUBBER_ATTR = exports.TIMELINE_MARQUEE_ITEM_ATTR = exports.useTimelineSelection = exports.TimelineSelectionProvider = exports.TimelineSelectableItemsProvider = exports.TimelineSelectAllKeybindings = exports.getTimelineSequenceSelectionKey = exports.getSelectableTimelineItems = exports.getSelectableTimelineSequenceSelections = exports.getTimelineSelectionKey = exports.getTimelineSelectionFromNodePathInfo = exports.TimelineSelectionOrderProvider = exports.getTimelineMarqueeSelection = exports.timelineMarqueeRectsIntersect = exports.getClampedTimelineMarqueePoint = exports.getNormalizedTimelineMarqueeRect = exports.getAvailableTimelineSelectionState = exports.getTimelineSelectionAfterInteraction = exports.EMPTY_TIMELINE_SELECTION_STATE = exports.shouldSelectTimelineRowOnPointerDown = exports.isTimelineSelectionModifierEvent = exports.TIMELINE_TICKS_BACKGROUND = exports.TIMELINE_BACKGROUND = exports.getTimelineSelectedTrackHighlightStyle = exports.getTimelineColor = exports.getTimelineSelectedLabelStyle = exports.TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = exports.TIMELINE_SELECTED_LABEL_TEXT = exports.TIMELINE_SELECTED_LABEL_BACKGROUND = exports.TIMELINE_SELECTED_BACKGROUND = 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");
7
+ const remotion_1 = require("remotion");
7
8
  const client_id_1 = require("../../helpers/client-id");
8
9
  const colors_1 = require("../../helpers/colors");
9
10
  const timeline_layout_1 = require("../../helpers/timeline-layout");
10
11
  const timeline_node_path_key_1 = require("../../helpers/timeline-node-path-key");
11
12
  const use_keybinding_1 = require("../../helpers/use-keybinding");
12
13
  const z_index_1 = require("../../state/z-index");
14
+ const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
15
+ const get_node_keyframes_1 = require("./get-node-keyframes");
16
+ const get_timeline_easing_segments_1 = require("./get-timeline-easing-segments");
17
+ const timeline_expanded_filter_1 = require("./timeline-expanded-filter");
18
+ const timeline_refs_1 = require("./timeline-refs");
13
19
  const TimelineClipboardKeybindings_1 = require("./TimelineClipboardKeybindings");
14
20
  const TimelineDeleteKeybindings_1 = require("./TimelineDeleteKeybindings");
15
21
  exports.TIMELINE_SELECTED_BACKGROUND = '#3B3F42';
@@ -56,6 +62,10 @@ const shouldSelectTimelineRowOnPointerDown = ({ selected, shiftKey, metaKey, ctr
56
62
  return (!selected || (0, exports.isTimelineSelectionModifierEvent)({ shiftKey, metaKey, ctrlKey }));
57
63
  };
58
64
  exports.shouldSelectTimelineRowOnPointerDown = shouldSelectTimelineRowOnPointerDown;
65
+ exports.EMPTY_TIMELINE_SELECTION_STATE = {
66
+ selectedItems: [],
67
+ anchor: null,
68
+ };
59
69
  const getTimelineSelectionType = (item) => item.type;
60
70
  const areTimelineSelectionTypesCompatible = (firstType, secondType) => {
61
71
  if (firstType === secondType) {
@@ -144,6 +154,32 @@ const getTimelineSelectionAfterInteraction = ({ currentState, clickedItem, inter
144
154
  };
145
155
  };
146
156
  exports.getTimelineSelectionAfterInteraction = getTimelineSelectionAfterInteraction;
157
+ const getAvailableTimelineSelectionState = ({ availableKeys, availableItemsByKey, state, }) => {
158
+ if (state.selectedItems.length === 0 && state.anchor === null) {
159
+ return state;
160
+ }
161
+ const getCurrentSelectionItem = (item) => {
162
+ var _a;
163
+ const key = (0, exports.getTimelineSelectionKey)(item);
164
+ if (!availableKeys.has(key)) {
165
+ return null;
166
+ }
167
+ return (_a = availableItemsByKey === null || availableItemsByKey === void 0 ? void 0 : availableItemsByKey.get(key)) !== null && _a !== void 0 ? _a : item;
168
+ };
169
+ const selectedItems = state.selectedItems
170
+ .map(getCurrentSelectionItem)
171
+ .filter((item) => item !== null);
172
+ const anchor = state.anchor ? getCurrentSelectionItem(state.anchor) : null;
173
+ if (selectedItems.length === state.selectedItems.length &&
174
+ anchor === state.anchor) {
175
+ return state;
176
+ }
177
+ return {
178
+ selectedItems,
179
+ anchor,
180
+ };
181
+ };
182
+ exports.getAvailableTimelineSelectionState = getAvailableTimelineSelectionState;
147
183
  const getNormalizedTimelineMarqueeRect = ({ startX, startY, currentX, currentY, }) => ({
148
184
  left: Math.min(startX, currentX),
149
185
  top: Math.min(startY, currentY),
@@ -211,8 +247,8 @@ const defaultTimelineSelectionContextValue = {
211
247
  isSelected: () => false,
212
248
  selectItem: () => undefined,
213
249
  selectItems: () => undefined,
214
- registerSelectableItem: () => () => undefined,
215
250
  registerMarqueeSelectableItem: () => () => undefined,
251
+ registerFocusableItem: () => () => undefined,
216
252
  getMarqueeSelection: () => ({
217
253
  lockedSelectionKind: null,
218
254
  selectedItems: [],
@@ -221,7 +257,16 @@ const defaultTimelineSelectionContextValue = {
221
257
  clearSelection: () => undefined,
222
258
  };
223
259
  const TimelineSelectionContext = (0, react_1.createContext)(defaultTimelineSelectionContextValue);
260
+ const EMPTY_SELECTABLE_TIMELINE_ITEMS = [];
261
+ const SelectableTimelineItemsContext = (0, react_1.createContext)({ current: EMPTY_SELECTABLE_TIMELINE_ITEMS });
262
+ const TimelineSelectionOrderProvider = ({ children, items }) => {
263
+ const itemsRef = (0, react_1.useRef)(items);
264
+ itemsRef.current = items;
265
+ return (jsx_runtime_1.jsx(SelectableTimelineItemsContext.Provider, { value: itemsRef, children: children }));
266
+ };
267
+ exports.TimelineSelectionOrderProvider = TimelineSelectionOrderProvider;
224
268
  const CurrentTimelineSelectionContext = (0, react_1.createContext)(null);
269
+ const TIMELINE_SELECTION_FOCUS_PADDING = 8;
225
270
  const parseEffectIndex = (effectIndex) => {
226
271
  const parsed = Number(effectIndex);
227
272
  if (!Number.isInteger(parsed) || parsed < 0) {
@@ -310,6 +355,108 @@ const getSelectableTimelineSequenceSelections = (tracks) => {
310
355
  });
311
356
  };
312
357
  exports.getSelectableTimelineSequenceSelections = getSelectableTimelineSequenceSelections;
358
+ const canEditEasingForInterpolationFunction = (interpolationFunction) => interpolationFunction === 'interpolate' ||
359
+ interpolationFunction === 'interpolateColors';
360
+ const getTimelineTreeNodeCanEditEasing = ({ node, nodePathInfo, propStatuses, }) => {
361
+ var _a;
362
+ if (node.kind !== 'field' || node.field === null) {
363
+ return false;
364
+ }
365
+ if (node.field.kind === 'sequence-field') {
366
+ const sequencePropStatus = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePathInfo.sequenceSubscriptionKey)) === null || _a === void 0 ? void 0 : _a[node.field.key];
367
+ return ((sequencePropStatus === null || sequencePropStatus === void 0 ? void 0 : sequencePropStatus.status) === 'keyframed' &&
368
+ canEditEasingForInterpolationFunction(sequencePropStatus.interpolationFunction));
369
+ }
370
+ const effectStatus = remotion_1.Internals.getEffectPropStatusesCtx({
371
+ propStatuses,
372
+ nodePath: nodePathInfo.sequenceSubscriptionKey,
373
+ effectIndex: node.field.effectIndex,
374
+ });
375
+ const effectPropStatus = effectStatus.type === 'can-update-effect'
376
+ ? effectStatus.props[node.field.key]
377
+ : null;
378
+ return ((effectPropStatus === null || effectPropStatus === void 0 ? void 0 : effectPropStatus.status) === 'keyframed' &&
379
+ canEditEasingForInterpolationFunction(effectPropStatus.interpolationFunction));
380
+ };
381
+ const getSelectableTimelineItems = ({ getDragOverrides, getEffectDragOverrides, getIsExpanded, propStatuses, selectedItems, timeline, timelinePosition, }) => {
382
+ const selectedRowKeys = (0, timeline_expanded_filter_1.getSelectedTimelineExpandedRowKeys)(selectedItems);
383
+ return timeline.flatMap((track) => {
384
+ const { nodePathInfo } = track;
385
+ if (nodePathInfo === null) {
386
+ return [];
387
+ }
388
+ const sequenceSelection = (0, exports.getTimelineSelectionFromNodePathInfo)(nodePathInfo);
389
+ if (sequenceSelection === null) {
390
+ return [];
391
+ }
392
+ if (!getIsExpanded(nodePathInfo)) {
393
+ return [sequenceSelection];
394
+ }
395
+ const tree = (0, timeline_layout_1.buildTimelineTree)({
396
+ sequence: track.sequence,
397
+ nodePathInfo,
398
+ getDragOverrides,
399
+ getEffectDragOverrides,
400
+ propStatuses,
401
+ });
402
+ const filteredTree = (0, timeline_expanded_filter_1.filterTimelineExpandedTree)({
403
+ nodes: tree,
404
+ shouldShowNode: (node) => (0, timeline_expanded_filter_1.isTimelineExpandedNodeSelected)({
405
+ nodePathInfo: node.nodePathInfo,
406
+ selectedRowKeys,
407
+ }) ||
408
+ (0, get_node_keyframes_1.getNodeHasKeyframes)({
409
+ node,
410
+ nodePath: nodePathInfo.sequenceSubscriptionKey,
411
+ propStatuses,
412
+ getDragOverrides,
413
+ getEffectDragOverrides,
414
+ }),
415
+ });
416
+ const visibleTreeRows = (0, timeline_layout_1.flattenVisibleTreeNodes)({
417
+ nodes: filteredTree,
418
+ getIsExpanded,
419
+ });
420
+ return [
421
+ sequenceSelection,
422
+ ...visibleTreeRows.flatMap(({ node }) => {
423
+ const rowSelection = (0, exports.getTimelineSelectionFromNodePathInfo)(node.nodePathInfo);
424
+ if (rowSelection === null) {
425
+ return [];
426
+ }
427
+ const keyframes = (0, get_node_keyframes_1.getNodeKeyframes)({
428
+ node,
429
+ nodePath: nodePathInfo.sequenceSubscriptionKey,
430
+ propStatuses,
431
+ keyframeDisplayOffset: track.keyframeDisplayOffset,
432
+ getDragOverrides,
433
+ getEffectDragOverrides,
434
+ timelinePosition,
435
+ });
436
+ const keyframeSelections = keyframes.map((keyframe) => ({
437
+ type: 'keyframe',
438
+ nodePathInfo: node.nodePathInfo,
439
+ frame: keyframe.frame,
440
+ }));
441
+ const easingSelections = getTimelineTreeNodeCanEditEasing({
442
+ node,
443
+ nodePathInfo,
444
+ propStatuses,
445
+ })
446
+ ? (0, get_timeline_easing_segments_1.getTimelineEasingSegments)(keyframes).map((segment) => ({
447
+ type: 'easing',
448
+ nodePathInfo: node.nodePathInfo,
449
+ fromFrame: segment.fromFrame,
450
+ toFrame: segment.toFrame,
451
+ segmentIndex: segment.segmentIndex,
452
+ }))
453
+ : [];
454
+ return [rowSelection, ...easingSelections, ...keyframeSelections];
455
+ }),
456
+ ];
457
+ });
458
+ };
459
+ exports.getSelectableTimelineItems = getSelectableTimelineItems;
313
460
  const getTimelineSequenceSelectionKey = (nodePathInfo) => (0, timeline_node_path_key_1.timelineNodePathInfoToKey)({ ...nodePathInfo, auxiliaryKeys: [] });
314
461
  exports.getTimelineSequenceSelectionKey = getTimelineSequenceSelectionKey;
315
462
  const TimelineSelectAllKeybindings = ({ timeline }) => {
@@ -345,74 +492,196 @@ const TimelineSelectAllKeybindings = ({ timeline }) => {
345
492
  return null;
346
493
  };
347
494
  exports.TimelineSelectAllKeybindings = TimelineSelectAllKeybindings;
495
+ const TimelineEscapeKeybindings = () => {
496
+ const keybindings = (0, use_keybinding_1.useKeybinding)();
497
+ const currentSelection = (0, exports.useCurrentTimelineSelectionStateAsRef)();
498
+ (0, react_1.useEffect)(() => {
499
+ const escape = keybindings.registerKeybinding({
500
+ event: 'keydown',
501
+ key: 'Escape',
502
+ callback: (event) => {
503
+ const { selectedItems, clearSelection } = currentSelection.current;
504
+ if (selectedItems.length === 0) {
505
+ return;
506
+ }
507
+ clearSelection();
508
+ event.preventDefault();
509
+ },
510
+ commandCtrlKey: false,
511
+ preventDefault: false,
512
+ triggerIfInputFieldFocused: false,
513
+ keepRegisteredWhenNotHighestContext: false,
514
+ });
515
+ return () => {
516
+ escape.unregister();
517
+ };
518
+ }, [currentSelection, keybindings]);
519
+ return null;
520
+ };
521
+ const TimelineSelectableItemsProvider = ({ children, timeline }) => {
522
+ const { getIsExpanded } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksGetterContext);
523
+ const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
524
+ const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
525
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
526
+ const { selectedItems } = (0, exports.useTimelineSelection)();
527
+ const selectableItems = (0, react_1.useMemo)(() => (0, exports.getSelectableTimelineItems)({
528
+ getDragOverrides,
529
+ getEffectDragOverrides,
530
+ getIsExpanded,
531
+ propStatuses,
532
+ selectedItems,
533
+ timeline,
534
+ timelinePosition,
535
+ }), [
536
+ getDragOverrides,
537
+ getEffectDragOverrides,
538
+ getIsExpanded,
539
+ propStatuses,
540
+ selectedItems,
541
+ timeline,
542
+ timelinePosition,
543
+ ]);
544
+ return (jsx_runtime_1.jsx(exports.TimelineSelectionOrderProvider, { items: selectableItems, children: children }));
545
+ };
546
+ exports.TimelineSelectableItemsProvider = TimelineSelectableItemsProvider;
348
547
  const TimelineSelectionProvider = ({ children }) => {
349
548
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
549
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
550
+ const timelineSelectionScope = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? canvasContent.compositionId : null;
551
+ const { expandParentTracks } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
350
552
  const canSelect = previewServerState.type === 'connected' &&
351
553
  !window.remotion_isReadOnlyStudio;
352
554
  const [selectedItems, setSelectedItems] = (0, react_1.useState)([]);
353
555
  const selectionAnchor = (0, react_1.useRef)(null);
354
- const selectableItemsOrder = (0, react_1.useRef)(new Map());
355
- const selectableItems = (0, react_1.useRef)(new Map());
556
+ const selectionScope = (0, react_1.useRef)(null);
356
557
  const marqueeSelectableItems = (0, react_1.useRef)(new Map());
357
- const registrationCounter = (0, react_1.useRef)(0);
358
558
  const marqueeRegistrationCounter = (0, react_1.useRef)(0);
559
+ const focusableItems = (0, react_1.useRef)(new Map());
560
+ const previousSingleSelectionKey = (0, react_1.useRef)(null);
359
561
  (0, react_1.useEffect)(() => {
360
562
  if (!canSelect) {
563
+ selectionScope.current = null;
564
+ selectionAnchor.current = null;
361
565
  setSelectedItems([]);
362
566
  }
363
567
  }, [canSelect]);
364
568
  const canSelectItem = (0, react_1.useCallback)((_item) => canSelect, [canSelect]);
365
- const selectedKeys = (0, react_1.useMemo)(() => new Set(selectedItems.map(exports.getTimelineSelectionKey)), [selectedItems]);
569
+ const getCurrentAvailableSelectionState = (0, react_1.useCallback)((currentSelectedItems) => {
570
+ if (selectionScope.current !== timelineSelectionScope) {
571
+ return exports.EMPTY_TIMELINE_SELECTION_STATE;
572
+ }
573
+ return {
574
+ selectedItems: currentSelectedItems,
575
+ anchor: selectionAnchor.current,
576
+ };
577
+ }, [timelineSelectionScope]);
578
+ const availableSelectionState = getCurrentAvailableSelectionState(selectedItems);
579
+ const availableSelectedItems = availableSelectionState.selectedItems;
580
+ (0, react_1.useEffect)(() => {
581
+ if (availableSelectedItems.length !== 1) {
582
+ previousSingleSelectionKey.current = null;
583
+ return;
584
+ }
585
+ const selectedKey = (0, exports.getTimelineSelectionKey)(availableSelectedItems[0]);
586
+ if (previousSingleSelectionKey.current === selectedKey) {
587
+ return;
588
+ }
589
+ previousSingleSelectionKey.current = selectedKey;
590
+ const animationFrame = requestAnimationFrame(() => {
591
+ var _a;
592
+ const registered = (_a = focusableItems.current.get(selectedKey)) !== null && _a !== void 0 ? _a : marqueeSelectableItems.current.get(selectedKey);
593
+ const scrollParent = timeline_refs_1.timelineVerticalScroll.current;
594
+ const rect = registered === null || registered === void 0 ? void 0 : registered.getRect();
595
+ if (!scrollParent || !rect) {
596
+ return;
597
+ }
598
+ const parentRect = scrollParent.getBoundingClientRect();
599
+ if (rect.top < parentRect.top) {
600
+ scrollParent.scrollTop -=
601
+ parentRect.top - rect.top + TIMELINE_SELECTION_FOCUS_PADDING;
602
+ return;
603
+ }
604
+ if (rect.bottom > parentRect.bottom) {
605
+ scrollParent.scrollTop +=
606
+ rect.bottom - parentRect.bottom + TIMELINE_SELECTION_FOCUS_PADDING;
607
+ }
608
+ });
609
+ return () => cancelAnimationFrame(animationFrame);
610
+ }, [availableSelectedItems]);
611
+ const expandParentsForSelectionItems = (0, react_1.useCallback)((items) => {
612
+ for (const item of items) {
613
+ if (item.type === 'guide') {
614
+ continue;
615
+ }
616
+ expandParentTracks(item.nodePathInfo);
617
+ }
618
+ }, [expandParentTracks]);
619
+ const expandParentsForSelectionItem = (0, react_1.useCallback)((item) => {
620
+ if (item.type === 'guide') {
621
+ return;
622
+ }
623
+ expandParentTracks(item.nodePathInfo);
624
+ }, [expandParentTracks]);
625
+ (0, react_1.useEffect)(() => {
626
+ setSelectedItems((currentSelectedItems) => {
627
+ const nextState = selectionScope.current === timelineSelectionScope
628
+ ? {
629
+ selectedItems: currentSelectedItems,
630
+ anchor: selectionAnchor.current,
631
+ }
632
+ : exports.EMPTY_TIMELINE_SELECTION_STATE;
633
+ selectionScope.current = timelineSelectionScope;
634
+ selectionAnchor.current = nextState.anchor;
635
+ if (nextState.selectedItems.length === currentSelectedItems.length &&
636
+ nextState.selectedItems.every((item, index) => item === currentSelectedItems[index])) {
637
+ return currentSelectedItems;
638
+ }
639
+ return nextState.selectedItems;
640
+ });
641
+ }, [timelineSelectionScope]);
642
+ const selectedKeys = (0, react_1.useMemo)(() => new Set(availableSelectedItems.map(exports.getTimelineSelectionKey)), [availableSelectedItems]);
366
643
  const isSelected = (0, react_1.useCallback)((item) => {
367
644
  return selectedKeys.has((0, exports.getTimelineSelectionKey)(item));
368
645
  }, [selectedKeys]);
369
646
  const selectItem = (0, react_1.useCallback)((item, interaction = {
370
647
  shiftKey: false,
371
648
  toggleKey: false,
372
- }) => {
649
+ }, allSelectableItems = []) => {
373
650
  if (!canSelectItem(item)) {
374
651
  return;
375
652
  }
653
+ expandParentsForSelectionItem(item);
376
654
  setSelectedItems((currentSelectedItems) => {
377
- const orderedSelectableItems = [
378
- ...selectableItems.current.values(),
379
- ].sort((a, b) => {
380
- var _a, _b;
381
- return (((_a = selectableItemsOrder.current.get((0, exports.getTimelineSelectionKey)(a))) !== null && _a !== void 0 ? _a : 0) -
382
- ((_b = selectableItemsOrder.current.get((0, exports.getTimelineSelectionKey)(b))) !== null && _b !== void 0 ? _b : 0));
383
- });
655
+ const currentSelectionState = getCurrentAvailableSelectionState(currentSelectedItems);
384
656
  const nextState = (0, exports.getTimelineSelectionAfterInteraction)({
385
657
  currentState: {
386
- selectedItems: currentSelectedItems,
387
- anchor: selectionAnchor.current,
658
+ selectedItems: currentSelectionState.selectedItems,
659
+ anchor: currentSelectionState.anchor,
388
660
  },
389
661
  clickedItem: item,
390
662
  interaction,
391
- allSelectableItems: orderedSelectableItems,
663
+ allSelectableItems,
392
664
  });
665
+ selectionScope.current = timelineSelectionScope;
393
666
  selectionAnchor.current = nextState.anchor;
394
667
  return nextState.selectedItems;
395
668
  });
396
- }, [canSelectItem]);
669
+ }, [
670
+ canSelectItem,
671
+ expandParentsForSelectionItem,
672
+ getCurrentAvailableSelectionState,
673
+ timelineSelectionScope,
674
+ ]);
397
675
  const selectItems = (0, react_1.useCallback)((items) => {
398
676
  if (!items.every(canSelectItem)) {
399
677
  return;
400
678
  }
679
+ selectionScope.current = timelineSelectionScope;
401
680
  selectionAnchor.current =
402
681
  items.length === 0 ? null : items[items.length - 1];
682
+ expandParentsForSelectionItems(items);
403
683
  setSelectedItems(items);
404
- }, [canSelectItem]);
405
- const registerSelectableItem = (0, react_1.useCallback)((item) => {
406
- const key = (0, exports.getTimelineSelectionKey)(item);
407
- const registrationOrder = registrationCounter.current;
408
- registrationCounter.current += 1;
409
- selectableItems.current.set(key, item);
410
- selectableItemsOrder.current.set(key, registrationOrder);
411
- return () => {
412
- selectableItems.current.delete(key);
413
- selectableItemsOrder.current.delete(key);
414
- };
415
- }, []);
684
+ }, [canSelectItem, expandParentsForSelectionItems, timelineSelectionScope]);
416
685
  const registerMarqueeSelectableItem = (0, react_1.useCallback)((item, getRect) => {
417
686
  const key = (0, exports.getTimelineSelectionKey)(item);
418
687
  const registrationOrder = marqueeRegistrationCounter.current;
@@ -426,6 +695,15 @@ const TimelineSelectionProvider = ({ children }) => {
426
695
  marqueeSelectableItems.current.delete(key);
427
696
  };
428
697
  }, []);
698
+ const registerFocusableItem = (0, react_1.useCallback)((item, getRect) => {
699
+ const key = (0, exports.getTimelineSelectionKey)(item);
700
+ focusableItems.current.set(key, {
701
+ getRect,
702
+ });
703
+ return () => {
704
+ focusableItems.current.delete(key);
705
+ };
706
+ }, []);
429
707
  const getMarqueeSelectionForRect = (0, react_1.useCallback)((marqueeRect, lockedSelectionKind) => {
430
708
  const candidates = [...marqueeSelectableItems.current.values()]
431
709
  .sort((a, b) => a.order - b.order)
@@ -456,39 +734,40 @@ const TimelineSelectionProvider = ({ children }) => {
456
734
  });
457
735
  }, [canSelectItem]);
458
736
  const clearSelection = (0, react_1.useCallback)(() => {
737
+ selectionScope.current = null;
459
738
  selectionAnchor.current = null;
460
739
  setSelectedItems([]);
461
740
  }, []);
462
741
  const containsSelection = (0, react_1.useCallback)((nodePathInfo) => {
463
- return selectedItems.some((selected) => selected.type !== 'guide' &&
742
+ return availableSelectedItems.some((selected) => selected.type !== 'guide' &&
464
743
  nodePathDescendsFrom(selected.nodePathInfo, nodePathInfo));
465
- }, [selectedItems]);
744
+ }, [availableSelectedItems]);
466
745
  const value = (0, react_1.useMemo)(() => ({
467
746
  canSelect,
468
- selectedItems,
747
+ selectedItems: availableSelectedItems,
469
748
  isSelected,
470
749
  selectItem,
471
750
  selectItems,
472
- registerSelectableItem,
473
751
  registerMarqueeSelectableItem,
752
+ registerFocusableItem,
474
753
  getMarqueeSelection: getMarqueeSelectionForRect,
475
754
  containsSelection,
476
755
  clearSelection,
477
756
  }), [
478
757
  canSelect,
479
- selectedItems,
758
+ availableSelectedItems,
480
759
  isSelected,
481
760
  selectItem,
482
761
  selectItems,
483
- registerSelectableItem,
484
762
  registerMarqueeSelectableItem,
763
+ registerFocusableItem,
485
764
  getMarqueeSelectionForRect,
486
765
  containsSelection,
487
766
  clearSelection,
488
767
  ]);
489
768
  const currentSelection = (0, react_1.useRef)(value);
490
769
  currentSelection.current = value;
491
- return (jsx_runtime_1.jsx(CurrentTimelineSelectionContext.Provider, { value: currentSelection, children: jsx_runtime_1.jsxs(TimelineSelectionContext.Provider, { value: value, children: [children, jsx_runtime_1.jsx(TimelineClipboardKeybindings_1.TimelineClipboardKeybindings, {}), jsx_runtime_1.jsx(TimelineDeleteKeybindings_1.TimelineDeleteKeybindings, {})
770
+ return (jsx_runtime_1.jsx(CurrentTimelineSelectionContext.Provider, { value: currentSelection, children: jsx_runtime_1.jsxs(TimelineSelectionContext.Provider, { value: value, children: [children, jsx_runtime_1.jsx(TimelineEscapeKeybindings, {}), jsx_runtime_1.jsx(TimelineClipboardKeybindings_1.TimelineClipboardKeybindings, {}), jsx_runtime_1.jsx(TimelineDeleteKeybindings_1.TimelineDeleteKeybindings, {})
492
771
  ] }) }));
493
772
  };
494
773
  exports.TimelineSelectionProvider = TimelineSelectionProvider;
@@ -617,22 +896,31 @@ const useTimelineMarqueeSelectableItem = (item, ref) => {
617
896
  }, [item, ref, registerMarqueeSelectableItem]);
618
897
  };
619
898
  exports.useTimelineMarqueeSelectableItem = useTimelineMarqueeSelectableItem;
620
- const useTimelineRowSelection = (nodePathInfo) => {
621
- const { canSelect, isSelected, selectItem, registerSelectableItem } = (0, exports.useTimelineSelection)();
622
- const selectionItem = (0, react_1.useMemo)(() => (0, exports.getTimelineSelectionFromNodePathInfo)(nodePathInfo), [nodePathInfo]);
899
+ const useTimelineFocusableItem = (item, ref) => {
900
+ const { registerFocusableItem } = (0, exports.useTimelineSelection)();
623
901
  (0, react_1.useEffect)(() => {
624
- if (selectionItem === null) {
902
+ if (item === null) {
625
903
  return;
626
904
  }
627
- return registerSelectableItem(selectionItem);
628
- }, [registerSelectableItem, selectionItem]);
905
+ return registerFocusableItem(item, () => {
906
+ var _a;
907
+ var _b;
908
+ return (_b = (_a = ref.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect()) !== null && _b !== void 0 ? _b : null;
909
+ });
910
+ }, [item, ref, registerFocusableItem]);
911
+ };
912
+ exports.useTimelineFocusableItem = useTimelineFocusableItem;
913
+ const useTimelineRowSelection = (nodePathInfo) => {
914
+ const { canSelect, isSelected, selectItem } = (0, exports.useTimelineSelection)();
915
+ const selectableTimelineItemsRef = (0, react_1.useContext)(SelectableTimelineItemsContext);
916
+ const selectionItem = (0, react_1.useMemo)(() => (0, exports.getTimelineSelectionFromNodePathInfo)(nodePathInfo), [nodePathInfo]);
629
917
  const selected = selectionItem === null ? false : isSelected(selectionItem);
630
918
  const onSelect = (0, react_1.useCallback)((interaction) => {
631
919
  if (selectionItem === null) {
632
920
  return;
633
921
  }
634
- selectItem(selectionItem, interaction);
635
- }, [selectItem, selectionItem]);
922
+ selectItem(selectionItem, interaction, selectableTimelineItemsRef.current);
923
+ }, [selectItem, selectableTimelineItemsRef, selectionItem]);
636
924
  return {
637
925
  onSelect,
638
926
  selectable: canSelect && selectionItem !== null,
@@ -642,19 +930,17 @@ const useTimelineRowSelection = (nodePathInfo) => {
642
930
  };
643
931
  exports.useTimelineRowSelection = useTimelineRowSelection;
644
932
  const useTimelineKeyframeSelection = (nodePathInfo, frame) => {
645
- const { canSelect, isSelected, selectItem, registerSelectableItem } = (0, exports.useTimelineSelection)();
933
+ const { canSelect, isSelected, selectItem } = (0, exports.useTimelineSelection)();
934
+ const selectableTimelineItemsRef = (0, react_1.useContext)(SelectableTimelineItemsContext);
646
935
  const selectionItem = (0, react_1.useMemo)(() => ({
647
936
  type: 'keyframe',
648
937
  nodePathInfo,
649
938
  frame,
650
939
  }), [nodePathInfo, frame]);
651
- (0, react_1.useEffect)(() => {
652
- return registerSelectableItem(selectionItem);
653
- }, [registerSelectableItem, selectionItem]);
654
940
  const selected = isSelected(selectionItem);
655
941
  const onSelect = (0, react_1.useCallback)((interaction) => {
656
- selectItem(selectionItem, interaction);
657
- }, [selectItem, selectionItem]);
942
+ selectItem(selectionItem, interaction, selectableTimelineItemsRef.current);
943
+ }, [selectItem, selectableTimelineItemsRef, selectionItem]);
658
944
  return {
659
945
  onSelect,
660
946
  selectable: canSelect,
@@ -664,7 +950,8 @@ const useTimelineKeyframeSelection = (nodePathInfo, frame) => {
664
950
  };
665
951
  exports.useTimelineKeyframeSelection = useTimelineKeyframeSelection;
666
952
  const useTimelineEasingSelection = ({ nodePathInfo, fromFrame, toFrame, segmentIndex, }) => {
667
- const { canSelect, isSelected, selectItem, registerSelectableItem } = (0, exports.useTimelineSelection)();
953
+ const { canSelect, isSelected, selectItem } = (0, exports.useTimelineSelection)();
954
+ const selectableTimelineItemsRef = (0, react_1.useContext)(SelectableTimelineItemsContext);
668
955
  const selectionItem = (0, react_1.useMemo)(() => ({
669
956
  type: 'easing',
670
957
  nodePathInfo,
@@ -672,13 +959,10 @@ const useTimelineEasingSelection = ({ nodePathInfo, fromFrame, toFrame, segmentI
672
959
  toFrame,
673
960
  segmentIndex,
674
961
  }), [nodePathInfo, fromFrame, segmentIndex, toFrame]);
675
- (0, react_1.useEffect)(() => {
676
- return registerSelectableItem(selectionItem);
677
- }, [registerSelectableItem, selectionItem]);
678
962
  const selected = isSelected(selectionItem);
679
963
  const onSelect = (0, react_1.useCallback)((interaction) => {
680
- selectItem(selectionItem, interaction);
681
- }, [selectItem, selectionItem]);
964
+ selectItem(selectionItem, interaction, selectableTimelineItemsRef.current);
965
+ }, [selectItem, selectableTimelineItemsRef, selectionItem]);
682
966
  return {
683
967
  onSelect,
684
968
  selectable: canSelect,
@@ -688,14 +972,11 @@ const useTimelineEasingSelection = ({ nodePathInfo, fromFrame, toFrame, segmentI
688
972
  };
689
973
  exports.useTimelineEasingSelection = useTimelineEasingSelection;
690
974
  const useTimelineGuideSelection = (guideId) => {
691
- const { canSelect, clearSelection, isSelected, selectItem, registerSelectableItem, } = (0, exports.useTimelineSelection)();
975
+ const { canSelect, clearSelection, isSelected, selectItem } = (0, exports.useTimelineSelection)();
692
976
  const selectionItem = (0, react_1.useMemo)(() => ({
693
977
  type: 'guide',
694
978
  guideId,
695
979
  }), [guideId]);
696
- (0, react_1.useEffect)(() => {
697
- return registerSelectableItem(selectionItem);
698
- }, [registerSelectableItem, selectionItem]);
699
980
  const selected = isSelected(selectionItem);
700
981
  const onSelect = (0, react_1.useCallback)(() => {
701
982
  selectItem(selectionItem);