@remotion/studio 4.0.483 → 4.0.485

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 (113) hide show
  1. package/dist/components/ColorPicker/ColorPicker.js +65 -3
  2. package/dist/components/ColorPicker/ColorPickerPopup.d.ts +1 -0
  3. package/dist/components/ColorPicker/ColorPickerPopup.js +3 -2
  4. package/dist/components/ContextMenu.js +75 -1
  5. package/dist/components/CurrentComposition.js +3 -2
  6. package/dist/components/InlineCompositionName.d.ts +7 -0
  7. package/dist/components/InlineCompositionName.js +58 -0
  8. package/dist/components/InlineEditableTitle.d.ts +7 -0
  9. package/dist/components/InlineEditableTitle.js +129 -0
  10. package/dist/components/InspectorPanel/EasingInspector.js +184 -10
  11. package/dist/components/InspectorPanel/KeyframeEasingNavigator.d.ts +14 -0
  12. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +146 -0
  13. package/dist/components/InspectorPanel/KeyframeInspector.d.ts +1 -1
  14. package/dist/components/InspectorPanel/KeyframeInspector.js +229 -5
  15. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +17 -0
  16. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +80 -0
  17. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +4 -58
  18. package/dist/components/InspectorPanel/common.d.ts +12 -0
  19. package/dist/components/InspectorPanel/common.js +78 -1
  20. package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +14 -0
  21. package/dist/components/InspectorPanel/easing-inspector-selection.js +18 -0
  22. package/dist/components/InspectorPanel/keyframe-easing-navigator-items.d.ts +24 -0
  23. package/dist/components/InspectorPanel/keyframe-easing-navigator-items.js +40 -0
  24. package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +8 -0
  25. package/dist/components/InspectorPanel/keyframe-inspector-frame.js +14 -0
  26. package/dist/components/InspectorPanel/styles.d.ts +1 -0
  27. package/dist/components/InspectorPanel/styles.js +9 -3
  28. package/dist/components/InspectorSequenceSection.js +37 -10
  29. package/dist/components/Modals.js +1 -1
  30. package/dist/components/NewComposition/CodemodFooter.d.ts +7 -1
  31. package/dist/components/NewComposition/CodemodFooter.js +17 -12
  32. package/dist/components/NewComposition/DeleteComposition.js +7 -1
  33. package/dist/components/NewComposition/DeleteFolder.js +7 -1
  34. package/dist/components/NewComposition/DuplicateComposition.js +17 -10
  35. package/dist/components/NewComposition/InputAndValidationContainer.d.ts +3 -0
  36. package/dist/components/NewComposition/InputAndValidationContainer.js +15 -0
  37. package/dist/components/NewComposition/NewCompDuration.js +7 -6
  38. package/dist/components/NewComposition/NewComposition.d.ts +5 -1
  39. package/dist/components/NewComposition/NewComposition.js +29 -86
  40. package/dist/components/NewComposition/RenameComposition.js +13 -14
  41. package/dist/components/NewComposition/RenameFolder.js +9 -2
  42. package/dist/components/NewComposition/RenameStaticFile.js +2 -1
  43. package/dist/components/NewComposition/ValidationMessage.js +9 -1
  44. package/dist/components/OptionsPanel.d.ts +0 -3
  45. package/dist/components/OptionsPanel.js +7 -3
  46. package/dist/components/Preview.js +1 -1
  47. package/dist/components/RenderModal/ServerRenderModal.js +4 -3
  48. package/dist/components/RenderModal/WebRenderModal.js +2 -1
  49. package/dist/components/SelectedOutlineElement.js +45 -3
  50. package/dist/components/SelectedOutlineOverlay.d.ts +3 -1
  51. package/dist/components/SelectedOutlineOverlay.js +48 -15
  52. package/dist/components/Timeline/EasingEditorModal.js +9 -4
  53. package/dist/components/Timeline/TimelineDeleteKeybindings.js +45 -2
  54. package/dist/components/Timeline/TimelineEffectPropItem.js +82 -1
  55. package/dist/components/Timeline/TimelineExpandedSection.js +1 -0
  56. package/dist/components/Timeline/TimelineInOutPointerHandle.js +2 -1
  57. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -1
  58. package/dist/components/Timeline/TimelineKeyframeControls.js +38 -7
  59. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +4 -0
  60. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +12 -6
  61. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
  62. package/dist/components/Timeline/TimelineSelection.js +1 -0
  63. package/dist/components/Timeline/TimelineSequenceItem.js +13 -62
  64. package/dist/components/Timeline/TimelineSequenceName.d.ts +1 -0
  65. package/dist/components/Timeline/TimelineSequenceName.js +7 -6
  66. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +1 -1
  67. package/dist/components/Timeline/TimelineSequencePropItem.js +86 -4
  68. package/dist/components/Timeline/TimelineSlider.js +17 -3
  69. package/dist/components/Timeline/TimelineTextContentField.d.ts +12 -0
  70. package/dist/components/Timeline/TimelineTextContentField.js +100 -0
  71. package/dist/components/Timeline/TimelineWidthProvider.js +18 -3
  72. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +8 -2
  73. package/dist/components/Timeline/delete-selected-timeline-item.js +80 -1
  74. package/dist/components/Timeline/focus-inspector-field.d.ts +16 -0
  75. package/dist/components/Timeline/focus-inspector-field.js +49 -0
  76. package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +18 -0
  77. package/dist/components/Timeline/get-animation-item-selection-for-frame.js +49 -0
  78. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +15 -0
  79. package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +26 -0
  80. package/dist/components/Timeline/save-sequence-prop.js +2 -0
  81. package/dist/components/Timeline/split-selected-timeline-item.d.ts +38 -0
  82. package/dist/components/Timeline/split-selected-timeline-item.js +156 -0
  83. package/dist/components/Timeline/timeline-field-display-utils.js +2 -0
  84. package/dist/components/Timeline/update-selected-easing.d.ts +1 -0
  85. package/dist/components/Timeline/update-selected-easing.js +4 -3
  86. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +1 -0
  87. package/dist/components/Timeline/use-rename-sequence.d.ts +30 -0
  88. package/dist/components/Timeline/use-rename-sequence.js +115 -0
  89. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +2 -1
  90. package/dist/components/Timeline/use-timeline-expanded-tree.js +3 -1
  91. package/dist/components/Timeline/use-timeline-height.js +1 -0
  92. package/dist/components/composition-menu-items.js +3 -0
  93. package/dist/components/folder-menu-items.js +20 -0
  94. package/dist/components/options-sidebar-tabs.d.ts +4 -0
  95. package/dist/components/options-sidebar-tabs.js +5 -0
  96. package/dist/components/selected-outline-types.d.ts +6 -1
  97. package/dist/esm/{chunk-fq0j774v.js → chunk-103pp4n7.js} +17652 -15098
  98. package/dist/esm/internals.mjs +17652 -15098
  99. package/dist/esm/previewEntry.mjs +18357 -15803
  100. package/dist/esm/renderEntry.mjs +1 -1
  101. package/dist/helpers/render-codec-label.d.ts +1 -1
  102. package/dist/helpers/timeline-layout.d.ts +4 -3
  103. package/dist/helpers/timeline-layout.js +3 -1
  104. package/dist/helpers/use-create-composition.d.ts +35 -0
  105. package/dist/helpers/use-create-composition.js +111 -0
  106. package/dist/helpers/use-menu-structure.js +0 -14
  107. package/dist/helpers/use-rename-composition.d.ts +16 -0
  108. package/dist/helpers/use-rename-composition.js +49 -0
  109. package/dist/state/modals.d.ts +3 -0
  110. package/dist/state/timeline-zoom.js +17 -14
  111. package/dist/state/z-index.d.ts +1 -0
  112. package/dist/state/z-index.js +11 -2
  113. package/package.json +12 -12
@@ -2,20 +2,69 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KeyframeInspector = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const studio_shared_1 = require("@remotion/studio-shared");
5
6
  const react_1 = require("react");
6
7
  const remotion_1 = require("remotion");
8
+ const client_id_1 = require("../../helpers/client-id");
7
9
  const timeline_layout_1 = require("../../helpers/timeline-layout");
8
10
  const is_menu_item_1 = require("../Menu/is-menu-item");
11
+ const InputDragger_1 = require("../NewComposition/InputDragger");
12
+ const call_delete_keyframe_1 = require("../Timeline/call-delete-keyframe");
13
+ const call_move_keyframe_1 = require("../Timeline/call-move-keyframe");
14
+ const get_easing_selection_after_keyframe_delete_1 = require("../Timeline/get-easing-selection-after-keyframe-delete");
9
15
  const parse_keyframe_field_from_node_path_1 = require("../Timeline/parse-keyframe-field-from-node-path");
10
16
  const TimelineEffectPropItem_1 = require("../Timeline/TimelineEffectPropItem");
17
+ const TimelineSelection_1 = require("../Timeline/TimelineSelection");
11
18
  const TimelineSequencePropItem_1 = require("../Timeline/TimelineSequencePropItem");
19
+ const update_selected_easing_1 = require("../Timeline/update-selected-easing");
12
20
  const common_1 = require("./common");
21
+ const keyframe_inspector_frame_1 = require("./keyframe-inspector-frame");
22
+ const KeyframeEasingNavigator_1 = require("./KeyframeEasingNavigator");
23
+ const SequenceInspectorHeader_1 = require("./SequenceInspectorHeader");
13
24
  const styles_1 = require("./styles");
14
25
  const use_track_for_selection_1 = require("./use-track-for-selection");
26
+ const makeMovedKeyframedDragOverride = ({ details, toFrame, }) => {
27
+ if (!(0, studio_shared_1.canMoveKeyframesWithoutCollisions)({
28
+ status: details.propStatus,
29
+ moves: [{ fromFrame: details.sourceFrame, toFrame }],
30
+ })) {
31
+ return null;
32
+ }
33
+ const movedStatus = (0, studio_shared_1.moveKeyframesInPropStatus)({
34
+ status: details.propStatus,
35
+ moves: [{ fromFrame: details.sourceFrame, toFrame }],
36
+ });
37
+ if (movedStatus.status !== 'keyframed') {
38
+ return null;
39
+ }
40
+ return {
41
+ type: 'keyframed',
42
+ status: movedStatus,
43
+ };
44
+ };
45
+ const removeKeyframeIcon = {
46
+ display: 'block',
47
+ flexShrink: 0,
48
+ height: 13,
49
+ width: 12,
50
+ };
51
+ const TrashIcon = ({ color }) => {
52
+ return (jsx_runtime_1.jsx("svg", { viewBox: "0 0 448 512", style: removeKeyframeIcon, children: jsx_runtime_1.jsx("path", { fill: color, d: "M136.7 5.9C141.1-7.2 153.3-16 167.1-16l113.9 0c13.8 0 26 8.8 30.4 21.9L320 32 416 32c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 96C14.3 96 0 81.7 0 64S14.3 32 32 32l96 0 8.7-26.1zM32 144l384 0 0 304c0 35.3-28.7 64-64 64L96 512c-35.3 0-64-28.7-64-64l0-304zm88 64c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24zm104 0c-13.3 0-24 10.7-24 24l0 192c0 13.3 10.7 24 24 24s24-10.7 24-24l0-192c0-13.3-10.7-24-24-24z" }) }));
53
+ };
15
54
  const KeyframeInspector = ({ selection }) => {
16
55
  const track = (0, use_track_for_selection_1.useTrackForSelection)(selection);
56
+ const videoConfig = (0, remotion_1.useVideoConfig)();
57
+ const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
17
58
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
59
+ const { clearDragOverrides, clearEffectDragOverrides, setDragOverrides, setEffectDragOverrides, setPropStatuses, } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
18
60
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
61
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
62
+ const { selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
63
+ const [draftFrame, setDraftFrame] = (0, react_1.useState)(selection.frame);
64
+ const parentSelection = (0, react_1.useMemo)(() => (0, TimelineSelection_1.getTimelineSelectionFromNodePathInfo)(selection.nodePathInfo), [selection.nodePathInfo]);
65
+ (0, react_1.useEffect)(() => {
66
+ setDraftFrame(selection.frame);
67
+ }, [selection.frame]);
19
68
  const details = (0, react_1.useMemo)(() => {
20
69
  var _a;
21
70
  var _b, _c, _d, _e, _f, _g;
@@ -36,6 +85,7 @@ const KeyframeInspector = ({ selection }) => {
36
85
  getDragOverrides,
37
86
  propStatuses,
38
87
  nodePath,
88
+ includeTextContent: false,
39
89
  });
40
90
  const sequenceField = (_b = sequenceFields === null || sequenceFields === void 0 ? void 0 : sequenceFields.find((candidate) => candidate.key === keyframeField.fieldKey)) !== null && _b !== void 0 ? _b : null;
41
91
  const sequencePropStatus = (_c = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[keyframeField.fieldKey]) !== null && _c !== void 0 ? _c : null;
@@ -47,6 +97,7 @@ const KeyframeInspector = ({ selection }) => {
47
97
  field: sequenceField,
48
98
  fieldLabel: (_d = sequenceField.description) !== null && _d !== void 0 ? _d : sequenceField.key,
49
99
  fileName: nodePath.absolutePath,
100
+ keyframeDisplayOffset,
50
101
  nodePath,
51
102
  propStatus: sequencePropStatus,
52
103
  schema: track.sequence.controls.schema,
@@ -78,9 +129,14 @@ const KeyframeInspector = ({ selection }) => {
78
129
  }
79
130
  return {
80
131
  type: 'effect',
132
+ effectIndex: keyframeField.effectIndex,
81
133
  field: effectField,
82
134
  fieldLabel: (_g = effectField.description) !== null && _g !== void 0 ? _g : effectField.key,
135
+ fileName: nodePath.absolutePath,
136
+ keyframeDisplayOffset,
83
137
  nodePath,
138
+ propStatus: effectPropStatus,
139
+ schema: effect.schema,
84
140
  sourceFrame,
85
141
  validatedLocation: {
86
142
  source: nodePath.absolutePath,
@@ -95,15 +151,183 @@ const KeyframeInspector = ({ selection }) => {
95
151
  selection,
96
152
  track,
97
153
  ]);
98
- if (details === null) {
154
+ const clearFrameDragOverride = (0, react_1.useCallback)((detailsToClear) => {
155
+ if (detailsToClear === null) {
156
+ return;
157
+ }
158
+ if (detailsToClear.type === 'sequence') {
159
+ clearDragOverrides(detailsToClear.nodePath);
160
+ return;
161
+ }
162
+ clearEffectDragOverrides(detailsToClear.nodePath, detailsToClear.effectIndex);
163
+ }, [clearDragOverrides, clearEffectDragOverrides]);
164
+ const onFrameChange = (0, react_1.useCallback)((value) => {
165
+ const displayFrame = (0, keyframe_inspector_frame_1.clampInspectorKeyframeDisplayFrame)({
166
+ durationInFrames: videoConfig.durationInFrames,
167
+ frame: value,
168
+ });
169
+ setDraftFrame(displayFrame);
170
+ if (details === null) {
171
+ return;
172
+ }
173
+ const toFrame = (0, keyframe_inspector_frame_1.getInspectorKeyframeSourceFrame)({
174
+ displayFrame,
175
+ keyframeDisplayOffset: details.keyframeDisplayOffset,
176
+ });
177
+ if (displayFrame === selection.frame || toFrame === details.sourceFrame) {
178
+ clearFrameDragOverride(details);
179
+ return;
180
+ }
181
+ const dragOverrideValue = makeMovedKeyframedDragOverride({
182
+ details,
183
+ toFrame,
184
+ });
185
+ if (dragOverrideValue === null) {
186
+ clearFrameDragOverride(details);
187
+ return;
188
+ }
189
+ if (details.type === 'sequence') {
190
+ setDragOverrides(details.nodePath, details.field.key, dragOverrideValue);
191
+ return;
192
+ }
193
+ setEffectDragOverrides(details.nodePath, details.effectIndex, details.field.key, dragOverrideValue);
194
+ }, [
195
+ clearFrameDragOverride,
196
+ details,
197
+ selection.frame,
198
+ setDragOverrides,
199
+ setEffectDragOverrides,
200
+ videoConfig.durationInFrames,
201
+ ]);
202
+ const onFrameChangeEnd = (0, react_1.useCallback)((value) => {
203
+ if (details === null || previewServerState.type !== 'connected') {
204
+ clearFrameDragOverride(details);
205
+ setDraftFrame(selection.frame);
206
+ return;
207
+ }
208
+ const displayFrame = (0, keyframe_inspector_frame_1.clampInspectorKeyframeDisplayFrame)({
209
+ durationInFrames: videoConfig.durationInFrames,
210
+ frame: value,
211
+ });
212
+ const toFrame = (0, keyframe_inspector_frame_1.getInspectorKeyframeSourceFrame)({
213
+ displayFrame,
214
+ keyframeDisplayOffset: details.keyframeDisplayOffset,
215
+ });
216
+ setDraftFrame(displayFrame);
217
+ clearFrameDragOverride(details);
218
+ if (displayFrame === selection.frame || toFrame === details.sourceFrame) {
219
+ return;
220
+ }
221
+ if (makeMovedKeyframedDragOverride({ details, toFrame }) === null) {
222
+ setDraftFrame(selection.frame);
223
+ return;
224
+ }
225
+ selectItems([
226
+ {
227
+ ...selection,
228
+ frame: displayFrame,
229
+ },
230
+ ], { reveal: true });
231
+ const move = {
232
+ fileName: details.fileName,
233
+ nodePath: details.nodePath,
234
+ fieldKey: details.field.key,
235
+ fromFrame: details.sourceFrame,
236
+ toFrame,
237
+ schema: details.schema,
238
+ };
239
+ (0, call_move_keyframe_1.callMoveKeyframes)({
240
+ sequenceKeyframes: details.type === 'sequence' ? [move] : [],
241
+ effectKeyframes: details.type === 'effect'
242
+ ? [
243
+ {
244
+ ...move,
245
+ effectIndex: details.effectIndex,
246
+ },
247
+ ]
248
+ : [],
249
+ setPropStatuses,
250
+ clientId: previewServerState.clientId,
251
+ }).catch(() => undefined);
252
+ }, [
253
+ clearFrameDragOverride,
254
+ details,
255
+ previewServerState,
256
+ selection,
257
+ selectItems,
258
+ setPropStatuses,
259
+ videoConfig.durationInFrames,
260
+ ]);
261
+ const onSelectParent = (0, react_1.useCallback)((event) => {
262
+ event.stopPropagation();
263
+ if (parentSelection === null) {
264
+ return;
265
+ }
266
+ selectItems([parentSelection], { reveal: true });
267
+ }, [parentSelection, selectItems]);
268
+ const removeDisabled = previewServerState.type !== 'connected';
269
+ const onRemoveKeyframe = (0, react_1.useCallback)((event) => {
270
+ event.stopPropagation();
271
+ if (details === null || previewServerState.type !== 'connected') {
272
+ return;
273
+ }
274
+ const easingSelection = (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(details.propStatus.interpolationFunction)
275
+ ? (0, get_easing_selection_after_keyframe_delete_1.getEasingSelectionAfterKeyframeDelete)({
276
+ deletedSourceFrames: [details.sourceFrame],
277
+ keyframeDisplayOffset: details.keyframeDisplayOffset,
278
+ nodePathInfo: selection.nodePathInfo,
279
+ propStatus: details.propStatus,
280
+ timelinePosition,
281
+ })
282
+ : null;
283
+ if (easingSelection !== null) {
284
+ selectItems([easingSelection], { reveal: true });
285
+ }
286
+ else if (parentSelection !== null) {
287
+ selectItems([parentSelection], { reveal: true });
288
+ }
289
+ if (details.type === 'sequence') {
290
+ (0, call_delete_keyframe_1.callDeleteSequenceKeyframe)({
291
+ fileName: details.fileName,
292
+ nodePath: details.nodePath,
293
+ fieldKey: details.field.key,
294
+ sourceFrame: details.sourceFrame,
295
+ schema: details.schema,
296
+ setPropStatuses,
297
+ clientId: previewServerState.clientId,
298
+ }).catch(() => undefined);
299
+ return;
300
+ }
301
+ (0, call_delete_keyframe_1.callDeleteEffectKeyframe)({
302
+ fileName: details.fileName,
303
+ nodePath: details.nodePath,
304
+ effectIndex: details.effectIndex,
305
+ fieldKey: details.field.key,
306
+ sourceFrame: details.sourceFrame,
307
+ schema: details.schema,
308
+ setPropStatuses,
309
+ clientId: previewServerState.clientId,
310
+ }).catch(() => undefined);
311
+ }, [
312
+ details,
313
+ parentSelection,
314
+ previewServerState,
315
+ selectItems,
316
+ selection.nodePathInfo,
317
+ setPropStatuses,
318
+ timelinePosition,
319
+ ]);
320
+ if (details === null || track === null) {
99
321
  return jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Keyframe unavailable" });
100
322
  }
101
323
  return (jsx_runtime_1.jsxs("div", { style: styles_1.selectedContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: [
102
- jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: "Keyframe" }), jsx_runtime_1.jsxs("div", { style: styles_1.detailsContainer, children: [
103
- jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Frame", children: selection.frame }), jsx_runtime_1.jsxs("div", { style: styles_1.keyframeEditorRow, children: [
324
+ jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorHeaderWithDivider, { track: track }), jsx_runtime_1.jsx(common_1.InspectorBackHeaderWithDivider, { disabled: parentSelection === null, onClick: onSelectParent, title: "Back to property", children: jsx_runtime_1.jsx("div", { style: styles_1.sectionHeaderTitle, children: details.fieldLabel }) }), jsx_runtime_1.jsx(KeyframeEasingNavigator_1.KeyframeEasingNavigator, { currentSelection: selection, includeEasings: (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(details.propStatus.interpolationFunction), keyframes: details.propStatus.keyframes.map((keyframe) => ({
325
+ ...keyframe,
326
+ frame: keyframe.frame + details.keyframeDisplayOffset,
327
+ })), nodePathInfo: selection.nodePathInfo }), jsx_runtime_1.jsxs("div", { style: styles_1.detailsContainer, children: [
328
+ jsx_runtime_1.jsx(common_1.InspectorDetailRow, { label: "Frame", children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: draftFrame, status: "ok", onValueChange: onFrameChange, onValueChangeEnd: onFrameChangeEnd, onTextChange: () => undefined, min: 0, max: Math.max(0, videoConfig.durationInFrames - 1), step: 1, formatter: (value) => String(Math.round(Number(value))), rightAlign: true, small: true }) }), jsx_runtime_1.jsxs("div", { style: styles_1.keyframeEditorRow, children: [
104
329
  jsx_runtime_1.jsx("div", { style: styles_1.keyframeEditorLabel, children: details.fieldLabel }), jsx_runtime_1.jsx("div", { style: styles_1.keyframeEditorValue, children: details.type === 'sequence' ? (jsx_runtime_1.jsx(TimelineSequencePropItem_1.TimelineSequenceKeyframedValue, { field: details.field, fileName: details.fileName, nodePath: details.nodePath, schema: details.schema, propStatus: details.propStatus, sourceFrame: details.sourceFrame })) : (jsx_runtime_1.jsx(TimelineEffectPropItem_1.TimelineEffectPropValue, { field: details.field, nodePath: details.nodePath, validatedLocation: details.validatedLocation, sourceFrame: details.sourceFrame })) })
105
- ] })
106
- ] })
330
+ ] }), jsx_runtime_1.jsx(common_1.InspectorInlineAction, { disabled: removeDisabled, onClick: onRemoveKeyframe, renderIcon: (color) => jsx_runtime_1.jsx(TrashIcon, { color: color }), children: "Remove keyframe" })] })
107
331
  ] }));
108
332
  };
109
333
  exports.KeyframeInspector = KeyframeInspector;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import type { CodePosition } from '../../error-overlay/react-overlay/utils/get-source-map';
3
+ import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
4
+ type SequenceInspectorSourceLocation = {
5
+ readonly canOpenInEditor: boolean;
6
+ readonly openFileLocation: () => void;
7
+ readonly validatedLocation: CodePosition | null;
8
+ };
9
+ export declare const useSequenceInspectorSourceLocation: (sequence: import("remotion").TSequence) => SequenceInspectorSourceLocation;
10
+ export declare const SequenceInspectorHeader: React.FC<{
11
+ readonly sourceLocation: SequenceInspectorSourceLocation;
12
+ readonly track: TrackWithHash;
13
+ }>;
14
+ export declare const SequenceInspectorHeaderWithDivider: React.FC<{
15
+ readonly track: TrackWithHash;
16
+ }>;
17
+ export {};
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequenceInspectorHeaderWithDivider = exports.SequenceInspectorHeader = exports.useSequenceInspectorSourceLocation = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const client_id_1 = require("../../helpers/client-id");
7
+ const InlineEditableTitle_1 = require("../InlineEditableTitle");
8
+ const InspectorSourceLocation_1 = require("../InspectorSourceLocation");
9
+ const use_open_sequence_in_editor_1 = require("../Timeline/use-open-sequence-in-editor");
10
+ const use_rename_sequence_1 = require("../Timeline/use-rename-sequence");
11
+ const styles_1 = require("./styles");
12
+ const useSequenceInspectorSourceLocation = (sequence) => {
13
+ const { canOpenInEditor, openInEditor, originalLocation } = (0, use_open_sequence_in_editor_1.useOpenSequenceInEditor)(sequence);
14
+ const validatedLocation = (0, react_1.useMemo)(() => {
15
+ var _a;
16
+ if (!originalLocation ||
17
+ !originalLocation.source ||
18
+ !originalLocation.line) {
19
+ return null;
20
+ }
21
+ return {
22
+ source: originalLocation.source,
23
+ line: originalLocation.line,
24
+ column: (_a = originalLocation.column) !== null && _a !== void 0 ? _a : 0,
25
+ };
26
+ }, [originalLocation]);
27
+ const openFileLocation = (0, react_1.useCallback)(() => {
28
+ if (!canOpenInEditor) {
29
+ return;
30
+ }
31
+ openInEditor();
32
+ }, [canOpenInEditor, openInEditor]);
33
+ return {
34
+ canOpenInEditor,
35
+ openFileLocation,
36
+ validatedLocation,
37
+ };
38
+ };
39
+ exports.useSequenceInspectorSourceLocation = useSequenceInspectorSourceLocation;
40
+ const SequenceInspectorHeader = ({ sourceLocation, track }) => {
41
+ var _a;
42
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
43
+ const { canRename, displayName, fallbackDisplayName, saveName } = (0, use_rename_sequence_1.useRenameSequence)({
44
+ clientId: previewServerState.type === 'connected'
45
+ ? previewServerState.clientId
46
+ : null,
47
+ nodePathInfo: track.nodePathInfo,
48
+ sequence: track.sequence,
49
+ validatedLocation: sourceLocation.validatedLocation,
50
+ });
51
+ const sequenceDisplayName = displayName || fallbackDisplayName;
52
+ const { documentationLink } = track.sequence;
53
+ const openDocumentationLink = (0, react_1.useCallback)(() => {
54
+ if (!documentationLink) {
55
+ return;
56
+ }
57
+ window.open(documentationLink, '_blank', 'noopener,noreferrer');
58
+ }, [documentationLink]);
59
+ const subtitleStyle = (0, react_1.useMemo)(() => {
60
+ return {
61
+ ...styles_1.sequenceHeaderSubtitle,
62
+ cursor: documentationLink ? 'pointer' : 'default',
63
+ };
64
+ }, [documentationLink]);
65
+ const componentName = (_a = track.sequence.controls) === null || _a === void 0 ? void 0 : _a.componentName;
66
+ const onRename = (0, react_1.useCallback)((newName) => {
67
+ saveName(newName).catch(() => undefined);
68
+ }, [saveName]);
69
+ return (jsx_runtime_1.jsxs("div", { style: styles_1.sequenceHeader, children: [
70
+ jsx_runtime_1.jsx("div", { style: styles_1.sequenceHeaderTitle, children: jsx_runtime_1.jsx(InlineEditableTitle_1.InlineEditableTitle, { value: sequenceDisplayName, canRename: canRename, onCommit: onRename }) }), documentationLink ? (jsx_runtime_1.jsx("button", { type: "button", style: subtitleStyle, title: "Open component docs", onClick: openDocumentationLink, children: componentName })) : (jsx_runtime_1.jsx("div", { style: subtitleStyle, children: componentName })), jsx_runtime_1.jsx(InspectorSourceLocation_1.InspectorSourceLocation, { location: sourceLocation.validatedLocation, canOpen: sourceLocation.canOpenInEditor, onOpen: sourceLocation.openFileLocation })
71
+ ] }));
72
+ };
73
+ exports.SequenceInspectorHeader = SequenceInspectorHeader;
74
+ const SequenceInspectorHeaderWithDivider = ({ track }) => {
75
+ const sourceLocation = (0, exports.useSequenceInspectorSourceLocation)(track.sequence);
76
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
77
+ jsx_runtime_1.jsx(exports.SequenceInspectorHeader, { sourceLocation: sourceLocation, track: track }), jsx_runtime_1.jsx("div", { style: styles_1.sequenceHeaderDivider })
78
+ ] }));
79
+ };
80
+ exports.SequenceInspectorHeaderWithDivider = SequenceInspectorHeaderWithDivider;
@@ -3,71 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SequenceSelectionInspector = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const remotion_1 = require("remotion");
7
6
  const client_id_1 = require("../../helpers/client-id");
8
7
  const InspectorSequenceSection_1 = require("../InspectorSequenceSection");
9
- const InspectorSourceLocation_1 = require("../InspectorSourceLocation");
10
8
  const is_menu_item_1 = require("../Menu/is-menu-item");
11
9
  const TimelineSelection_1 = require("../Timeline/TimelineSelection");
12
- const use_open_sequence_in_editor_1 = require("../Timeline/use-open-sequence-in-editor");
13
10
  const common_1 = require("./common");
11
+ const SequenceInspectorHeader_1 = require("./SequenceInspectorHeader");
14
12
  const styles_1 = require("./styles");
15
13
  const use_track_for_selection_1 = require("./use-track-for-selection");
16
- const useSequenceDisplayName = (track) => {
17
- var _a;
18
- var _b;
19
- const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
20
- const nodePath = (_b = (_a = track.nodePathInfo) === null || _a === void 0 ? void 0 : _a.sequenceSubscriptionKey) !== null && _b !== void 0 ? _b : null;
21
- return (0, react_1.useMemo)(() => {
22
- const propStatusesForOverride = nodePath
23
- ? remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)
24
- : undefined;
25
- const codeNameStatus = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.name;
26
- const displayName = codeNameStatus &&
27
- codeNameStatus.status === 'static' &&
28
- typeof codeNameStatus.codeValue === 'string'
29
- ? codeNameStatus.codeValue
30
- : track.sequence.displayName;
31
- return displayName || '<Sequence>';
32
- }, [nodePath, propStatuses, track.sequence.displayName]);
33
- };
34
14
  const SequenceExpandedInspector = ({ track }) => {
35
15
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
36
16
  const { selectedItems, selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
37
- const { canOpenInEditor, openInEditor, originalLocation } = (0, use_open_sequence_in_editor_1.useOpenSequenceInEditor)(track.sequence);
38
- const sequenceDisplayName = useSequenceDisplayName(track);
39
- const { documentationLink } = track.sequence;
40
- const validatedLocation = (0, react_1.useMemo)(() => {
41
- var _a;
42
- if (!originalLocation ||
43
- !originalLocation.source ||
44
- !originalLocation.line) {
45
- return null;
46
- }
47
- return {
48
- source: originalLocation.source,
49
- line: originalLocation.line,
50
- column: (_a = originalLocation.column) !== null && _a !== void 0 ? _a : 0,
51
- };
52
- }, [originalLocation]);
53
- const openFileLocation = (0, react_1.useCallback)(() => {
54
- if (!canOpenInEditor) {
55
- return;
56
- }
57
- openInEditor();
58
- }, [canOpenInEditor, openInEditor]);
59
- const openDocumentationLink = (0, react_1.useCallback)(() => {
60
- if (!documentationLink) {
61
- return;
62
- }
63
- window.open(documentationLink, '_blank', 'noopener,noreferrer');
64
- }, [documentationLink]);
65
- const subtitleStyle = (0, react_1.useMemo)(() => {
66
- return {
67
- ...styles_1.sequenceHeaderSubtitle,
68
- cursor: documentationLink ? 'pointer' : 'default',
69
- };
70
- }, [documentationLink]);
17
+ const sourceLocation = (0, SequenceInspectorHeader_1.useSequenceInspectorSourceLocation)(track.sequence);
18
+ const { validatedLocation } = sourceLocation;
71
19
  const sequenceSelection = (0, react_1.useMemo)(() => {
72
20
  if (!track.nodePathInfo) {
73
21
  return null;
@@ -103,9 +51,7 @@ const SequenceExpandedInspector = ({ track }) => {
103
51
  return jsx_runtime_1.jsx(common_1.InspectorMessage, { children: "Sequence inspector unavailable" });
104
52
  }
105
53
  return (jsx_runtime_1.jsxs("div", { style: styles_1.selectedContainer, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, onPointerDown: selectSequenceOnInspectorPointerDown, children: [
106
- jsx_runtime_1.jsxs("div", { style: styles_1.sequenceHeader, children: [
107
- jsx_runtime_1.jsx("div", { style: styles_1.sequenceHeaderTitle, children: sequenceDisplayName }), documentationLink ? (jsx_runtime_1.jsx("button", { type: "button", style: subtitleStyle, title: "Open component docs", onClick: openDocumentationLink, children: track.sequence.controls.componentName })) : (jsx_runtime_1.jsx("div", { style: subtitleStyle, children: track.sequence.controls.componentName })), jsx_runtime_1.jsx(InspectorSourceLocation_1.InspectorSourceLocation, { location: validatedLocation, canOpen: canOpenInEditor, onOpen: openFileLocation })
108
- ] }), jsx_runtime_1.jsx(InspectorSequenceSection_1.InspectorSequenceSection, { sequence: track.sequence, validatedLocation: validatedLocation, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, renderSectionHeader: (children) => (jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: children })) })] }));
54
+ jsx_runtime_1.jsx(SequenceInspectorHeader_1.SequenceInspectorHeader, { sourceLocation: sourceLocation, track: track }), jsx_runtime_1.jsx(InspectorSequenceSection_1.InspectorSequenceSection, { sequence: track.sequence, validatedLocation: validatedLocation, nodePathInfo: track.nodePathInfo, keyframeDisplayOffset: track.keyframeDisplayOffset, renderSectionHeader: (children) => (jsx_runtime_1.jsx(common_1.InspectorSectionHeader, { children: children })) })] }));
109
55
  };
110
56
  const SequenceSelectionInspector = ({ selection }) => {
111
57
  const track = (0, use_track_for_selection_1.useTrackForSelection)(selection);
@@ -3,6 +3,12 @@ import type { RenderModalWarning } from '../RenderModal/DataEditor';
3
3
  export declare const InspectorSectionHeader: React.FC<{
4
4
  readonly children: React.ReactNode;
5
5
  }>;
6
+ export declare const InspectorBackHeaderWithDivider: React.FC<{
7
+ readonly children: React.ReactNode;
8
+ readonly disabled: boolean;
9
+ readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
10
+ readonly title: string;
11
+ }>;
6
12
  export declare const InspectorMessage: React.FC<{
7
13
  readonly children: React.ReactNode;
8
14
  }>;
@@ -10,6 +16,12 @@ export declare const InspectorDetailRow: React.FC<{
10
16
  readonly label: string;
11
17
  readonly children: React.ReactNode;
12
18
  }>;
19
+ export declare const InspectorInlineAction: React.FC<{
20
+ readonly children: React.ReactNode;
21
+ readonly disabled: boolean;
22
+ readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
23
+ readonly renderIcon: (color: string) => React.ReactNode;
24
+ }>;
13
25
  export declare const InspectorDefaultPropsWarnings: React.FC<{
14
26
  readonly warnings: RenderModalWarning[];
15
27
  }>;
@@ -1,17 +1,94 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InspectorDefaultPropsWarnings = exports.InspectorDetailRow = exports.InspectorMessage = exports.InspectorSectionHeader = void 0;
6
+ exports.InspectorDefaultPropsWarnings = exports.InspectorInlineAction = exports.InspectorDetailRow = exports.InspectorMessage = exports.InspectorBackHeaderWithDivider = exports.InspectorSectionHeader = void 0;
4
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = __importDefault(require("react"));
9
+ const colors_1 = require("../../helpers/colors");
10
+ const InlineAction_1 = require("../InlineAction");
5
11
  const ValidationMessage_1 = require("../NewComposition/ValidationMessage");
6
12
  const styles_1 = require("./styles");
7
13
  const InspectorSectionHeader = ({ children }) => jsx_runtime_1.jsx("div", { style: styles_1.sectionHeader, children: children });
8
14
  exports.InspectorSectionHeader = InspectorSectionHeader;
15
+ const backIcon = {
16
+ alignItems: 'center',
17
+ display: 'flex',
18
+ height: 12,
19
+ justifyContent: 'center',
20
+ width: 12,
21
+ };
22
+ const BackChevron = ({ color }) => {
23
+ return (jsx_runtime_1.jsx("svg", { viewBox: "0 0 8 12", style: backIcon, children: jsx_runtime_1.jsx("path", { d: "M6 1L2 6L6 11", fill: "none", stroke: color, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.5" }) }));
24
+ };
25
+ const InspectorBackHeaderWithDivider = ({ children, disabled, onClick, title }) => {
26
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
27
+ jsx_runtime_1.jsx(exports.InspectorSectionHeader, { children: jsx_runtime_1.jsx("div", { style: styles_1.sectionHeaderRow, children: jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderStart, children: [jsx_runtime_1.jsx(InlineAction_1.InlineAction, { disabled: disabled, onClick: onClick, title: title, renderAction: (color) => jsx_runtime_1.jsx(BackChevron, { color: color }) }), children] }) }) }), jsx_runtime_1.jsx("div", { style: styles_1.inspectorSectionDivider })
28
+ ] }));
29
+ };
30
+ exports.InspectorBackHeaderWithDivider = InspectorBackHeaderWithDivider;
9
31
  const InspectorMessage = ({ children }) => jsx_runtime_1.jsx("div", { style: styles_1.centeredMessage, children: children });
10
32
  exports.InspectorMessage = InspectorMessage;
11
33
  const InspectorDetailRow = ({ label, children }) => (jsx_runtime_1.jsxs("div", { style: styles_1.detailRow, children: [
12
34
  jsx_runtime_1.jsx("div", { style: styles_1.detailLabel, children: label }), jsx_runtime_1.jsx("div", { style: styles_1.detailValue, children: children })
13
35
  ] }));
14
36
  exports.InspectorDetailRow = InspectorDetailRow;
37
+ const inlineLabelButton = {
38
+ alignItems: 'center',
39
+ appearance: 'none',
40
+ backgroundColor: 'transparent',
41
+ border: 'none',
42
+ color: colors_1.LIGHT_TEXT,
43
+ cursor: 'default',
44
+ display: 'flex',
45
+ fontFamily: 'sans-serif',
46
+ fontSize: 13,
47
+ gap: 8,
48
+ lineHeight: '18px',
49
+ margin: 0,
50
+ padding: '10px 0 0',
51
+ };
52
+ const inlineLabelButtonDisabled = {
53
+ ...inlineLabelButton,
54
+ opacity: 0.35,
55
+ };
56
+ const inlineLabelText = {
57
+ color: colors_1.LIGHT_TEXT,
58
+ fontFamily: 'sans-serif',
59
+ fontSize: 13,
60
+ lineHeight: '18px',
61
+ };
62
+ const inlineLabelIcon = {
63
+ alignItems: 'center',
64
+ display: 'flex',
65
+ flexShrink: 0,
66
+ height: 13,
67
+ justifyContent: 'center',
68
+ width: 13,
69
+ };
70
+ const InspectorInlineAction = ({ children, disabled, onClick, renderIcon }) => {
71
+ const [hovered, setHovered] = react_1.default.useState(false);
72
+ const color = hovered && !disabled ? 'white' : colors_1.LIGHT_TEXT;
73
+ const buttonStyle = react_1.default.useMemo(() => ({
74
+ ...(disabled ? inlineLabelButtonDisabled : inlineLabelButton),
75
+ color,
76
+ }), [color, disabled]);
77
+ const textStyle = react_1.default.useMemo(() => ({
78
+ ...inlineLabelText,
79
+ color,
80
+ }), [color]);
81
+ const onPointerEnter = react_1.default.useCallback(() => {
82
+ setHovered(true);
83
+ }, []);
84
+ const onPointerLeave = react_1.default.useCallback(() => {
85
+ setHovered(false);
86
+ }, []);
87
+ return (jsx_runtime_1.jsxs("button", { type: "button", disabled: disabled, style: buttonStyle, onClick: onClick, onPointerEnter: disabled ? undefined : onPointerEnter, onPointerLeave: onPointerLeave, children: [
88
+ jsx_runtime_1.jsx("span", { style: inlineLabelIcon, children: renderIcon(color) }), jsx_runtime_1.jsx("span", { style: textStyle, children: children })
89
+ ] }));
90
+ };
91
+ exports.InspectorInlineAction = InspectorInlineAction;
15
92
  const InspectorDefaultPropsWarnings = ({ warnings }) => {
16
93
  return (jsx_runtime_1.jsx("div", { style: styles_1.defaultPropsWarningMessages, children: warnings.map((warning) => (jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: warning.message, align: "flex-start", type: "warning", size: "compact", action: warning.resolveLink ? (jsx_runtime_1.jsx("a", { href: warning.resolveLink, target: "_blank", rel: "noopener noreferrer", style: styles_1.resolveLinkStyle, children: "Resolve" })) : null }, warning.id))) }));
17
94
  };
@@ -0,0 +1,14 @@
1
+ import type { CanUpdateSequencePropStatusKeyframed } from 'remotion';
2
+ import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
3
+ export declare const getEasingSelectionFromCurrentKeyframes: ({ keyframeDisplayOffset, nodePathInfo, propStatus, segmentIndex, }: {
4
+ readonly keyframeDisplayOffset: number;
5
+ readonly nodePathInfo: SequenceNodePathInfo;
6
+ readonly propStatus: CanUpdateSequencePropStatusKeyframed;
7
+ readonly segmentIndex: number;
8
+ }) => {
9
+ readonly type: "easing";
10
+ readonly nodePathInfo: SequenceNodePathInfo;
11
+ readonly fromFrame: number;
12
+ readonly toFrame: number;
13
+ readonly segmentIndex: number;
14
+ } | null;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getEasingSelectionFromCurrentKeyframes = void 0;
4
+ const getEasingSelectionFromCurrentKeyframes = ({ keyframeDisplayOffset, nodePathInfo, propStatus, segmentIndex, }) => {
5
+ const fromKeyframe = propStatus.keyframes[segmentIndex];
6
+ const toKeyframe = propStatus.keyframes[segmentIndex + 1];
7
+ if (!fromKeyframe || !toKeyframe) {
8
+ return null;
9
+ }
10
+ return {
11
+ type: 'easing',
12
+ nodePathInfo,
13
+ fromFrame: fromKeyframe.frame + keyframeDisplayOffset,
14
+ toFrame: toKeyframe.frame + keyframeDisplayOffset,
15
+ segmentIndex,
16
+ };
17
+ };
18
+ exports.getEasingSelectionFromCurrentKeyframes = getEasingSelectionFromCurrentKeyframes;
@@ -0,0 +1,24 @@
1
+ import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineSelection } from '../Timeline/TimelineSelection';
3
+ export type KeyframeNavigatorItem = {
4
+ readonly selection: Extract<TimelineSelection, {
5
+ type: 'keyframe';
6
+ }>;
7
+ readonly type: 'keyframe';
8
+ };
9
+ export type EasingNavigatorItem = {
10
+ readonly selection: Extract<TimelineSelection, {
11
+ type: 'easing';
12
+ }>;
13
+ readonly type: 'easing';
14
+ };
15
+ export type NavigatorItem = KeyframeNavigatorItem | EasingNavigatorItem;
16
+ export type NavigatorKeyframe = {
17
+ readonly frame: number;
18
+ };
19
+ export declare const getKeyframeEasingNavigatorItems: ({ includeEasings, keyframes, nodePathInfo, }: {
20
+ readonly includeEasings: boolean;
21
+ readonly keyframes: readonly NavigatorKeyframe[];
22
+ readonly nodePathInfo: SequenceNodePathInfo;
23
+ }) => NavigatorItem[];
24
+ export declare const getNavigatorItemPlayheadFrame: (item: NavigatorItem) => number;