@remotion/studio 4.0.508 → 4.0.510

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 (117) hide show
  1. package/dist/Studio.d.ts +5 -0
  2. package/dist/Studio.js +2 -2
  3. package/dist/components/Canvas.js +41 -8
  4. package/dist/components/ColorPicker/AlphaSlider.js +2 -2
  5. package/dist/components/ColorPicker/HueSlider.js +2 -2
  6. package/dist/components/ColorPicker/SaturationValueArea.js +2 -2
  7. package/dist/components/CompositionSelectorItem.js +1 -1
  8. package/dist/components/EditorGuides/Guide.js +2 -2
  9. package/dist/components/EditorRuler/index.js +2 -2
  10. package/dist/components/ExplorerPanel.js +19 -1
  11. package/dist/components/InspectorOpenInEditor.js +19 -5
  12. package/dist/components/InspectorPanel/CompositionMetadata.js +23 -1
  13. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +3 -3
  14. package/dist/components/Menu/MenuItem.js +2 -2
  15. package/dist/components/ModalContainer.js +1 -1
  16. package/dist/components/Modals.js +2 -9
  17. package/dist/components/NewComposition/InputDragger.js +2 -2
  18. package/dist/components/NewComposition/NewComposition.d.ts +2 -0
  19. package/dist/components/NewComposition/NewComposition.js +38 -6
  20. package/dist/components/NewComposition/get-new-composition-defaults.d.ts +1 -1
  21. package/dist/components/NewComposition/get-new-composition-defaults.js +9 -1
  22. package/dist/components/QuickSwitcher/asset-search.js +1 -0
  23. package/dist/components/SelectedOutlineCanvasRotation.js +6 -4
  24. package/dist/components/SelectedOutlineCropControls.js +3 -3
  25. package/dist/components/SelectedOutlineElement.js +6 -2
  26. package/dist/components/SelectedOutlinePolygon.js +4 -3
  27. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +5 -0
  28. package/dist/components/SelectedOutlineRotationCornerHandle.js +4 -4
  29. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +1 -0
  30. package/dist/components/SelectedOutlineScaleEdgeLine.js +4 -4
  31. package/dist/components/SelectedOutlineTransformOriginHandle.js +2 -2
  32. package/dist/components/SelectedOutlineUvControls.js +8 -8
  33. package/dist/components/Splitter/SplitterHandle.js +2 -2
  34. package/dist/components/Tabs/index.d.ts +2 -0
  35. package/dist/components/Tabs/index.js +2 -2
  36. package/dist/components/Timeline/EasingEditorModal.d.ts +8 -0
  37. package/dist/components/Timeline/EasingEditorModal.js +10 -11
  38. package/dist/components/Timeline/SubscribeToNodePaths.js +1 -1
  39. package/dist/components/Timeline/Timeline.js +55 -1
  40. package/dist/components/Timeline/TimelineClipboardKeybindings.js +99 -35
  41. package/dist/components/Timeline/TimelineColorField.js +1 -6
  42. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  43. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  44. package/dist/components/Timeline/TimelineEffectPropItem.js +8 -1
  45. package/dist/components/Timeline/TimelineEnumField.js +1 -4
  46. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  47. package/dist/components/Timeline/TimelineFieldRowContent.d.ts +2 -1
  48. package/dist/components/Timeline/TimelineFieldRowContent.js +18 -3
  49. package/dist/components/Timeline/TimelineFontFamilyField.js +1 -2
  50. package/dist/components/Timeline/TimelineInOutDragHandler.js +2 -2
  51. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +3 -2
  52. package/dist/components/Timeline/TimelineLayerEye.js +2 -2
  53. package/dist/components/Timeline/TimelineNumberField.js +4 -2
  54. package/dist/components/Timeline/TimelineRotationField.js +3 -3
  55. package/dist/components/Timeline/TimelineRowChrome.d.ts +5 -0
  56. package/dist/components/Timeline/TimelineRowChrome.js +14 -9
  57. package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +1 -0
  58. package/dist/components/Timeline/TimelineRowLayoutContext.js +4 -1
  59. package/dist/components/Timeline/TimelineScaleField.js +4 -0
  60. package/dist/components/Timeline/TimelineSelection.js +2 -2
  61. package/dist/components/Timeline/TimelineSequenceItem.js +2 -25
  62. package/dist/components/Timeline/TimelineSequencePropItem.js +8 -2
  63. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +2 -0
  64. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +69 -20
  65. package/dist/components/Timeline/TimelineTextContentField.js +1 -1
  66. package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -0
  67. package/dist/components/Timeline/keyframe-clipboard.d.ts +5 -1
  68. package/dist/components/Timeline/keyframe-clipboard.js +3 -2
  69. package/dist/components/Timeline/save-sequence-prop.js +16 -7
  70. package/dist/components/Timeline/sequence-prop-clipboard.d.ts +31 -0
  71. package/dist/components/Timeline/sequence-prop-clipboard.js +142 -0
  72. package/dist/components/Timeline/split-selected-timeline-item.d.ts +0 -1
  73. package/dist/components/Timeline/split-selected-timeline-item.js +5 -13
  74. package/dist/components/Timeline/timeline-field-row-layout.js +2 -2
  75. package/dist/components/Timeline/timeline-field-utils.d.ts +1 -0
  76. package/dist/components/Timeline/timeline-field-utils.js +6 -1
  77. package/dist/components/Timeline/update-selected-easing.js +8 -0
  78. package/dist/components/Timeline/use-open-sequence-in-apps.js +3 -1
  79. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +1 -1
  80. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +24 -3
  81. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  82. package/dist/components/UndoRedoButtons.js +5 -3
  83. package/dist/components/folder-menu-items.js +1 -0
  84. package/dist/components/get-open-in-menu-items.d.ts +4 -1
  85. package/dist/components/get-open-in-menu-items.js +99 -50
  86. package/dist/components/import-assets.js +7 -0
  87. package/dist/components/root-composition-menu-items.js +1 -0
  88. package/dist/components/selected-outline-control-layout.d.ts +14 -0
  89. package/dist/components/selected-outline-control-layout.js +94 -0
  90. package/dist/components/use-default-editor-info.js +28 -3
  91. package/dist/esm/{chunk-zpn4m49r.js → chunk-axbagh08.js} +6098 -5285
  92. package/dist/esm/{chunk-fgedsvhb.js → chunk-r46yxrjr.js} +1 -2
  93. package/dist/esm/internals.mjs +6097 -5284
  94. package/dist/esm/previewEntry.mjs +5989 -5176
  95. package/dist/esm/renderEntry.mjs +4 -2
  96. package/dist/helpers/get-canvas-capture-import.d.ts +7 -0
  97. package/dist/helpers/get-canvas-capture-import.js +43 -0
  98. package/dist/helpers/get-git-menu-item.d.ts +1 -1
  99. package/dist/helpers/get-git-menu-item.js +33 -3
  100. package/dist/helpers/inserted-element-selection.d.ts +12 -0
  101. package/dist/helpers/inserted-element-selection.js +29 -0
  102. package/dist/helpers/open-in-editor.d.ts +1 -0
  103. package/dist/helpers/open-in-editor.js +5 -1
  104. package/dist/helpers/pointer-session.d.ts +6 -2
  105. package/dist/helpers/pointer-session.js +29 -12
  106. package/dist/helpers/use-create-composition.d.ts +15 -2
  107. package/dist/helpers/use-create-composition.js +11 -17
  108. package/dist/helpers/use-menu-structure.js +1 -0
  109. package/dist/icons/git-client.d.ts +6 -0
  110. package/dist/icons/git-client.js +8 -0
  111. package/dist/icons/github.d.ts +4 -0
  112. package/dist/icons/github.js +11 -0
  113. package/dist/renderEntry.js +2 -2
  114. package/dist/state/modals.d.ts +9 -1
  115. package/dist/state/z-index.d.ts +0 -1
  116. package/dist/state/z-index.js +27 -33
  117. package/package.json +12 -12
@@ -140,21 +140,6 @@ const sequenceReorderAfterLine = {
140
140
  ...sequenceReorderLineBase,
141
141
  top: -1,
142
142
  };
143
- const sequenceReorderRejectionStyle = {
144
- backgroundColor: colors_1.BLACK_ALPHA_85,
145
- border: colors_1.BORDER_WHITE_ALPHA_20,
146
- borderRadius: 4,
147
- color: colors_1.WHITE,
148
- fontSize: 11,
149
- lineHeight: 1.2,
150
- maxWidth: 260,
151
- padding: '3px 6px',
152
- pointerEvents: 'none',
153
- position: 'absolute',
154
- right: 6,
155
- top: 2,
156
- zIndex: 2,
157
- };
158
143
  const hasSequenceReorderDragType = (dataTransfer) => {
159
144
  return Array.from(dataTransfer.types).includes(SEQUENCE_REORDER_MIME_TYPE);
160
145
  };
@@ -208,7 +193,6 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
208
193
  const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
209
194
  const [isRenaming, setIsRenaming] = (0, react_1.useState)(false);
210
195
  const [sequenceDropIndicator, setSequenceDropIndicator] = (0, react_1.useState)(null);
211
- const [sequenceDropRejection, setSequenceDropRejection] = (0, react_1.useState)(null);
212
196
  const { canOpenInEditor, canConfigureApps, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(sequence);
213
197
  const validatedLocation = (0, react_1.useMemo)(() => {
214
198
  var _a;
@@ -401,7 +385,6 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
401
385
  const onSequenceDragEnd = (0, react_1.useCallback)(() => {
402
386
  currentSequenceDrag = null;
403
387
  setSequenceDropIndicator(null);
404
- setSequenceDropRejection(null);
405
388
  }, []);
406
389
  const onSequenceDragOver = (0, react_1.useCallback)((e) => {
407
390
  if (!hasSequenceReorderDragType(e.dataTransfer)) {
@@ -410,12 +393,10 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
410
393
  const dropTarget = getSequenceDropTarget(e);
411
394
  if (!dropTarget) {
412
395
  setSequenceDropIndicator(null);
413
- setSequenceDropRejection(null);
414
396
  return;
415
397
  }
416
398
  if (dropTarget.type === 'invalid') {
417
399
  setSequenceDropIndicator(null);
418
- setSequenceDropRejection(dropTarget.reason);
419
400
  e.dataTransfer.dropEffect = 'none';
420
401
  return;
421
402
  }
@@ -423,14 +404,12 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
423
404
  e.stopPropagation();
424
405
  e.dataTransfer.dropEffect = 'move';
425
406
  setSequenceDropIndicator(dropTarget.position);
426
- setSequenceDropRejection(null);
427
407
  }, [getSequenceDropTarget]);
428
408
  const onSequenceDragLeave = (0, react_1.useCallback)((e) => {
429
409
  if (e.currentTarget.contains(e.relatedTarget)) {
430
410
  return;
431
411
  }
432
412
  setSequenceDropIndicator(null);
433
- setSequenceDropRejection(null);
434
413
  }, []);
435
414
  const onSequenceDrop = (0, react_1.useCallback)(async (e) => {
436
415
  if (!canReorderSequence ||
@@ -442,13 +421,11 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
442
421
  const dropTarget = getSequenceDropTarget(e);
443
422
  if (!dropTarget || dropTarget.type === 'invalid') {
444
423
  setSequenceDropIndicator(null);
445
- setSequenceDropRejection((dropTarget === null || dropTarget === void 0 ? void 0 : dropTarget.type) === 'invalid' ? dropTarget.reason : null);
446
424
  return;
447
425
  }
448
426
  e.preventDefault();
449
427
  e.stopPropagation();
450
428
  setSequenceDropIndicator(null);
451
- setSequenceDropRejection(null);
452
429
  currentSequenceDrag = null;
453
430
  try {
454
431
  const result = await (0, call_api_1.callApi)('/api/reorder-sequence', {
@@ -928,7 +905,7 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
928
905
  clientId: previewServerState.clientId,
929
906
  });
930
907
  }, [canDropEffect, nodePath, previewServerState, validatedLocation]);
931
- const trackRow = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: nestedDepth, eye: canToggleVisibility ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: sequence.type === 'audio' ? 'speaker' : 'eye', hidden: isItemHidden, onInvoked: onToggleVisibility })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: hasExpandableContent && nodePathInfo !== null ? (jsx_runtime_1.jsx(TimelineSequenceExpandArrow, { disabled: !previewInteractive, isExpanded: isExpanded, nodePathInfo: nodePathInfo, sequence: sequence })) : (jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {})), style: rowStyle, selected: selected, selectable: selectable, selectionItem: selectionItem, onSelect: onSelect, showSelectedBackground: true, containsSelection: containsSelection, hovered: hovered, outerHeight: outerHeight, onDragLeave: canDropEffect ? onEffectDragLeave : undefined, onDragOver: canDropEffect ? onEffectDragOver : undefined, onDrop: canDropEffect ? onEffectDrop : undefined, onDoubleClick: canHandleSequenceDoubleClick ? onSequenceDoubleClick : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsxs("div", { style: labelContainerStyle, children: [connectedCompositions.length > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
908
+ const trackRow = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: nestedDepth, eye: canToggleVisibility ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: sequence.type === 'audio' ? 'speaker' : 'eye', hidden: isItemHidden, onInvoked: onToggleVisibility })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: hasExpandableContent && nodePathInfo !== null ? (jsx_runtime_1.jsx(TimelineSequenceExpandArrow, { disabled: !previewInteractive, isExpanded: isExpanded, nodePathInfo: nodePathInfo, sequence: sequence })) : (jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {})), style: rowStyle, selected: selected, selectable: selectable, selectionItem: selectionItem, onSelect: onSelect, showSelectedBackground: true, containsSelection: containsSelection, hovered: hovered, isFieldRow: false, outerHeight: outerHeight, onDragLeave: canDropEffect ? onEffectDragLeave : undefined, onDragOver: canDropEffect ? onEffectDragOver : undefined, onDrop: canDropEffect ? onEffectDrop : undefined, onDoubleClick: canHandleSequenceDoubleClick ? onSequenceDoubleClick : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsxs("div", { style: labelContainerStyle, children: [connectedCompositions.length > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
932
909
  jsx_runtime_1.jsx(CompositionOrStillIcon_1.CompositionOrStillIcon, { color: (0, TimelineSelection_1.getTimelineColor)(false, false), composition: connectedCompositions[0], style: connectedCompositionIconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
933
910
  ] })) : null, jsx_runtime_1.jsx(TimelineSequenceName_1.TimelineSequenceName, { displayName: timelineDisplayName, fallbackDisplayName: fallbackDisplayName, selected: selected, containsSelection: containsSelection, editing: isRenaming, onCancelEditing: onCancelRenaming, onSaveName: onSaveName }), numberOfHiddenDuplicates > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
934
911
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineDuplicateCount_1.TimelineDuplicateCount, { count: numberOfHiddenDuplicates })
@@ -937,7 +914,7 @@ const TimelineSequenceItemInner = ({ children, connectedCompositions, nestedDept
937
914
  " ",
938
915
  jsx_runtime_1.jsx(TimelineMediaInfo_1.TimelineMediaInfo, { src: mediaSrc })
939
916
  ] })) : null] }) }));
940
- const draggableTrackRow = canHandleSequenceDrag ? (jsx_runtime_1.jsxs("div", { draggable: canReorderSequence, onDragStart: onSequenceDragStart, onDragEnd: onSequenceDragEnd, onDragOver: onSequenceDragOver, onDragLeave: onSequenceDragLeave, onDrop: onSequenceDrop, style: sequenceReorderWrapper, children: [sequenceReorderLineStyle ? (jsx_runtime_1.jsx("div", { style: sequenceReorderLineStyle })) : null, sequenceDropRejection ? (jsx_runtime_1.jsx("div", { style: sequenceReorderRejectionStyle, children: sequenceDropRejection })) : null, trackRow] })) : (trackRow);
917
+ const draggableTrackRow = canHandleSequenceDrag ? (jsx_runtime_1.jsxs("div", { draggable: canReorderSequence, onDragStart: onSequenceDragStart, onDragEnd: onSequenceDragEnd, onDragOver: onSequenceDragOver, onDragLeave: onSequenceDragLeave, onDrop: onSequenceDrop, style: sequenceReorderWrapper, children: [sequenceReorderLineStyle ? (jsx_runtime_1.jsx("div", { style: sequenceReorderLineStyle })) : null, trackRow] })) : (trackRow);
941
918
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: draggableTrackRow })) : (draggableTrackRow), previewConnected &&
942
919
  (0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
943
920
  isExpanded &&
@@ -207,8 +207,14 @@ const TimelineSequenceKeyframedValueUnmemoized = (props) => {
207
207
  status: propStatus,
208
208
  frame: sourceFrame,
209
209
  value,
210
+ defaultEasing: (0, studio_shared_1.isSchemaFieldHoldOnly)({
211
+ schema,
212
+ key: field.key,
213
+ })
214
+ ? { type: 'step1' }
215
+ : undefined,
210
216
  }));
211
- }, [propStatus, field.key, nodePath, setDragOverrides]);
217
+ }, [propStatus, field.key, nodePath, schema, setDragOverrides]);
212
218
  const onKeyframedDragEnd = (0, react_1.useCallback)(() => {
213
219
  clearDragOverrides(nodePath);
214
220
  }, [clearDragOverrides, nodePath]);
@@ -351,7 +357,7 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
351
357
  ...style,
352
358
  }, children: fieldValue }));
353
359
  }
354
- const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), keyframeControls: keyframeControls, arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: style, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected, children: fieldValue }) }));
360
+ const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), keyframeControls: keyframeControls, arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: style, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: false, isFieldRow: true, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected, keyframeControls: keyframeControls, children: fieldValue }) }));
355
361
  return jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: row });
356
362
  };
357
363
  exports.TimelineSequencePropItem = TimelineSequencePropItem;
@@ -32,7 +32,9 @@ export type TimelineSequenceFromDragTarget = {
32
32
  readonly sequenceKeyframes: TimelineSequenceKeyframeDragTarget[];
33
33
  };
34
34
  type TimelineSequenceKeyframeDragTarget = {
35
+ readonly fileName: string;
35
36
  readonly fieldKey: string;
37
+ readonly nodePath: SequencePropsSubscriptionKey;
36
38
  readonly schema: InteractivitySchema;
37
39
  readonly status: CanUpdateSequencePropStatusKeyframed;
38
40
  };
@@ -70,7 +70,15 @@ const getKeyframedSequenceDragTargets = ({ nodePath, sequence, propStatuses, })
70
70
  const sequenceKeyframes = sequenceSchema === undefined
71
71
  ? []
72
72
  : Object.entries(status.props).flatMap(([fieldKey, propStatus]) => propStatus.status === 'keyframed'
73
- ? [{ fieldKey, schema: sequenceSchema, status: propStatus }]
73
+ ? [
74
+ {
75
+ fileName: nodePath.absolutePath,
76
+ fieldKey,
77
+ nodePath,
78
+ schema: sequenceSchema,
79
+ status: propStatus,
80
+ },
81
+ ]
74
82
  : []);
75
83
  const effectKeyframes = status.effects.flatMap((effectStatus) => {
76
84
  var _a;
@@ -85,7 +93,9 @@ const getKeyframedSequenceDragTargets = ({ nodePath, sequence, propStatuses, })
85
93
  ? [
86
94
  {
87
95
  effectIndex: effectStatus.effectIndex,
96
+ fileName: nodePath.absolutePath,
88
97
  fieldKey,
98
+ nodePath,
89
99
  schema: effectSchema,
90
100
  status: propStatus,
91
101
  },
@@ -352,16 +362,16 @@ const getTimelineSequenceFromDragKeyframeMoves = ({ targets, deltaFrames, }) =>
352
362
  }
353
363
  return {
354
364
  sequenceKeyframes: targets.flatMap((target) => target.sequenceKeyframes.flatMap((keyframeTarget) => keyframeTarget.status.keyframes.map((keyframe) => ({
355
- fileName: target.fileName,
356
- nodePath: target.nodePath,
365
+ fileName: keyframeTarget.fileName,
366
+ nodePath: keyframeTarget.nodePath,
357
367
  fieldKey: keyframeTarget.fieldKey,
358
368
  fromFrame: keyframe.frame,
359
369
  toFrame: keyframe.frame + deltaFrames,
360
370
  schema: keyframeTarget.schema,
361
371
  })))),
362
372
  effectKeyframes: targets.flatMap((target) => target.effectKeyframes.flatMap((keyframeTarget) => keyframeTarget.status.keyframes.map((keyframe) => ({
363
- fileName: target.fileName,
364
- nodePath: target.nodePath,
373
+ fileName: keyframeTarget.fileName,
374
+ nodePath: keyframeTarget.nodePath,
365
375
  effectIndex: keyframeTarget.effectIndex,
366
376
  fieldKey: keyframeTarget.fieldKey,
367
377
  fromFrame: keyframe.frame,
@@ -510,6 +520,7 @@ const getTimelineSequenceFromDragTargets = ({ draggedNodePathInfo, selectedItems
510
520
  : [draggedNodePathInfo];
511
521
  const tracks = (0, calculate_timeline_1.calculateTimeline)({ sequences, overrideIdsToNodePaths });
512
522
  const targets = new Map();
523
+ const includedKeyframeNodePaths = new Set();
513
524
  for (const nodePathInfo of targetNodePathInfos) {
514
525
  const track = findSequenceTrack({ tracks, nodePathInfo });
515
526
  const originalSequence = track
@@ -527,11 +538,42 @@ const getTimelineSequenceFromDragTargets = ({ draggedNodePathInfo, selectedItems
527
538
  }
528
539
  const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath);
529
540
  if (!targets.has(key)) {
530
- const { effectKeyframes, sequenceKeyframes } = getKeyframedSequenceDragTargets({
531
- nodePath,
532
- sequence: originalSequence,
533
- propStatuses,
541
+ const descendants = sequences.filter((candidate) => {
542
+ var _a;
543
+ var _b;
544
+ let parentId = candidate.id;
545
+ while (parentId !== null) {
546
+ if (parentId === originalSequence.id) {
547
+ return true;
548
+ }
549
+ parentId = (_b = (_a = sequences.find((sequence) => sequence.id === parentId)) === null || _a === void 0 ? void 0 : _a.parent) !== null && _b !== void 0 ? _b : null;
550
+ }
551
+ return false;
552
+ });
553
+ const descendantKeyframes = descendants.flatMap((sequence) => {
554
+ var _a;
555
+ const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
556
+ const descendantNodePath = overrideId
557
+ ? overrideIdsToNodePaths[overrideId]
558
+ : undefined;
559
+ if (descendantNodePath === undefined) {
560
+ return [];
561
+ }
562
+ const descendantNodePathKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)(descendantNodePath);
563
+ if (includedKeyframeNodePaths.has(descendantNodePathKey)) {
564
+ return [];
565
+ }
566
+ includedKeyframeNodePaths.add(descendantNodePathKey);
567
+ return [
568
+ getKeyframedSequenceDragTargets({
569
+ nodePath: descendantNodePath,
570
+ sequence,
571
+ propStatuses,
572
+ }),
573
+ ];
534
574
  });
575
+ const effectKeyframes = descendantKeyframes.flatMap((descendant) => descendant.effectKeyframes);
576
+ const sequenceKeyframes = descendantKeyframes.flatMap((descendant) => descendant.sequenceKeyframes);
535
577
  targets.set(key, {
536
578
  canSnapToTimelineStart: originalSequence.parent === null,
537
579
  effectKeyframes,
@@ -558,9 +600,16 @@ const clearDurationDragOverrides = ({ clearDragOverrides, targets, }) => {
558
600
  const clearFromDragOverrides = ({ clearDragOverrides, clearEffectDragOverrides, targets, }) => {
559
601
  for (const target of targets) {
560
602
  clearDragOverrides(target.nodePath);
561
- const effectIndexes = new Set(target.effectKeyframes.map((keyframe) => keyframe.effectIndex));
562
- for (const effectIndex of effectIndexes) {
563
- clearEffectDragOverrides(target.nodePath, effectIndex);
603
+ for (const keyframeTarget of target.sequenceKeyframes) {
604
+ clearDragOverrides(keyframeTarget.nodePath);
605
+ }
606
+ const effectIndexes = new Set(target.effectKeyframes.map((keyframe) => `${(0, studio_shared_1.stringifySequenceSubscriptionKey)(keyframe.nodePath)}:${keyframe.effectIndex}`));
607
+ for (const keyframeTarget of target.effectKeyframes) {
608
+ const key = `${(0, studio_shared_1.stringifySequenceSubscriptionKey)(keyframeTarget.nodePath)}:${keyframeTarget.effectIndex}`;
609
+ if (!effectIndexes.delete(key)) {
610
+ continue;
611
+ }
612
+ clearEffectDragOverrides(keyframeTarget.nodePath, keyframeTarget.effectIndex);
564
613
  }
565
614
  }
566
615
  };
@@ -729,9 +778,9 @@ const TimelineSequenceLeftEdgeDragHandleInner = ({ nodePathInfo, windowWidth, ti
729
778
  if (!activeDragState) {
730
779
  return;
731
780
  }
732
- return (0, pointer_session_1.startPointerSession)({
781
+ return (0, pointer_session_1.startCapturedPointerSession)({
733
782
  event: activeDragState,
734
- target: activeDragState.target,
783
+ captureTarget: activeDragState.target,
735
784
  onMove,
736
785
  onEnd: (reason, endEvent) => {
737
786
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -916,7 +965,7 @@ const useTimelineSequenceFromDrag = ({ nodePathInfo, windowWidth, timelineDurati
916
965
  });
917
966
  latestRef.current.setDragOverrides(target.nodePath, 'from', remotion_1.Internals.makeStaticDragOverride(nextFrom));
918
967
  for (const keyframeTarget of target.sequenceKeyframes) {
919
- latestRef.current.setDragOverrides(target.nodePath, keyframeTarget.fieldKey, {
968
+ latestRef.current.setDragOverrides(keyframeTarget.nodePath, keyframeTarget.fieldKey, {
920
969
  type: 'keyframed',
921
970
  status: shiftKeyframedStatus({
922
971
  status: keyframeTarget.status,
@@ -925,7 +974,7 @@ const useTimelineSequenceFromDrag = ({ nodePathInfo, windowWidth, timelineDurati
925
974
  });
926
975
  }
927
976
  for (const keyframeTarget of target.effectKeyframes) {
928
- latestRef.current.setEffectDragOverrides(target.nodePath, keyframeTarget.effectIndex, keyframeTarget.fieldKey, {
977
+ latestRef.current.setEffectDragOverrides(keyframeTarget.nodePath, keyframeTarget.effectIndex, keyframeTarget.fieldKey, {
929
978
  type: 'keyframed',
930
979
  status: shiftKeyframedStatus({
931
980
  status: keyframeTarget.status,
@@ -953,9 +1002,9 @@ const useTimelineSequenceFromDrag = ({ nodePathInfo, windowWidth, timelineDurati
953
1002
  if (!activeDragState) {
954
1003
  return;
955
1004
  }
956
- return (0, pointer_session_1.startPointerSession)({
1005
+ return (0, pointer_session_1.startCapturedPointerSession)({
957
1006
  event: activeDragState,
958
- target: activeDragState.target,
1007
+ captureTarget: activeDragState.target,
959
1008
  onMove,
960
1009
  onEnd: (reason, endEvent) => {
961
1010
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -1136,9 +1185,9 @@ const TimelineSequenceRightEdgeDragHandleInner = ({ nodePathInfo, windowWidth, t
1136
1185
  if (!activeDragState) {
1137
1186
  return;
1138
1187
  }
1139
- return (0, pointer_session_1.startPointerSession)({
1188
+ return (0, pointer_session_1.startCapturedPointerSession)({
1140
1189
  event: activeDragState,
1141
- target: activeDragState.target,
1190
+ captureTarget: activeDragState.target,
1142
1191
  onMove,
1143
1192
  onEnd: (reason, endEvent) => {
1144
1193
  if ((reason === 'pointerup' || reason === 'buttons-released') &&
@@ -102,6 +102,6 @@ const TimelineTextContentField = ({ effectiveValue, field, nodePath, onDragEnd,
102
102
  event.currentTarget.blur();
103
103
  }
104
104
  }, []);
105
- return (jsx_runtime_1.jsx(RemTextarea_1.RemTextarea, { ref: setInputRef, status: "ok", small: true, defaultValue: currentValue, onBlur: commitPending, onChange: onChange, onKeyDownCapture: onKeyDownCapture, style: textAreaStyle }, String((_a = propStatus.codeValue) !== null && _a !== void 0 ? _a : '')));
105
+ return (jsx_runtime_1.jsx(RemTextarea_1.RemTextarea, { ref: setInputRef, status: "ok", small: true, defaultValue: currentValue, onBlur: commitPending, onChange: onChange, onDoubleClick: (event) => event.stopPropagation(), onKeyDownCapture: onKeyDownCapture, style: textAreaStyle }, String((_a = propStatus.codeValue) !== null && _a !== void 0 ? _a : '')));
106
106
  };
107
107
  exports.TimelineTextContentField = TimelineTextContentField;
@@ -50,6 +50,7 @@ const getSequenceContextMenuItems = ({ assetLinkInfo, canOpenInEditor, deleteDis
50
50
  excludeEditorId: defaultEditorId,
51
51
  fileManagerDisabled: !(originalLocation === null || originalLocation === void 0 ? void 0 : originalLocation.source),
52
52
  folder: false,
53
+ location: originalLocation,
53
54
  onConfigureApps,
54
55
  onOpenInCodingAgent: openInCodingAgentWithContext,
55
56
  onOpenInEditor: openInEditor,
@@ -61,6 +62,7 @@ const getSequenceContextMenuItems = ({ assetLinkInfo, canOpenInEditor, deleteDis
61
62
  (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
62
63
  });
63
64
  },
65
+ onOpenInGitClient: () => undefined,
64
66
  onOpenInTerminal: null,
65
67
  })
66
68
  : [];
@@ -1,4 +1,4 @@
1
- import type { KeyframeClipboardData } from '@remotion/studio-shared';
1
+ import type { KeyframeClipboardData, KeyframeClipboardFieldType } from '@remotion/studio-shared';
2
2
  import { type InteractivitySchema, type OverrideIdToNodePaths, type PropStatuses, type SequencePropsSubscriptionKey, type TSequence } from 'remotion';
3
3
  import type { TimelineSelection } from './TimelineSelection';
4
4
  export declare const getKeyframeClipboardDataFromSelections: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, }: {
@@ -24,6 +24,10 @@ export type PasteKeyframeTarget = {
24
24
  } | {
25
25
  readonly type: 'none' | 'multiple' | 'uncopyable' | 'incompatible';
26
26
  };
27
+ export declare const isKeyframeValueCompatible: ({ value, fieldType, }: {
28
+ readonly value: unknown;
29
+ readonly fieldType: KeyframeClipboardFieldType | null;
30
+ }) => boolean;
27
31
  export declare const getPasteKeyframeTarget: ({ selectedItems, payload, timelinePosition, sequences, overrideIdsToNodePaths, propStatuses, }: {
28
32
  readonly selectedItems: readonly TimelineSelection[];
29
33
  readonly payload: KeyframeClipboardData;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getPasteKeyframeTarget = exports.getKeyframeClipboardDataFromSelections = void 0;
3
+ exports.getPasteKeyframeTarget = exports.isKeyframeValueCompatible = exports.getKeyframeClipboardDataFromSelections = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const remotion_1 = require("remotion");
6
6
  const find_track_for_node_path_info_1 = require("./find-track-for-node-path-info");
@@ -217,6 +217,7 @@ const isKeyframeValueCompatible = ({ value, fieldType, }) => {
217
217
  }
218
218
  return typeof value === 'string';
219
219
  };
220
+ exports.isKeyframeValueCompatible = isKeyframeValueCompatible;
220
221
  const getPasteKeyframeTarget = ({ selectedItems, payload, timelinePosition, sequences, overrideIdsToNodePaths, propStatuses, }) => {
221
222
  var _a, _b, _c;
222
223
  if (selectedItems.length === 0) {
@@ -270,7 +271,7 @@ const getPasteKeyframeTarget = ({ selectedItems, payload, timelinePosition, sequ
270
271
  ].sort((first, second) => first - second);
271
272
  const firstEasingSegmentIndex = finalFrames.indexOf(firstFrame);
272
273
  if (resolved.fieldType !== payload.fieldType ||
273
- payload.keyframes.some((keyframe) => !isKeyframeValueCompatible({
274
+ payload.keyframes.some((keyframe) => !(0, exports.isKeyframeValueCompatible)({
274
275
  value: keyframe.value,
275
276
  fieldType: payload.fieldType,
276
277
  }))) {
@@ -36,6 +36,7 @@ const saveInlineCaptionPatches = ({ fileName, nodePath, schema, patches, nextCap
36
36
  };
37
37
  exports.saveInlineCaptionPatches = saveInlineCaptionPatches;
38
38
  const saveSequenceProps = ({ changes, addedKeyframes, movedKeyframes, setPropStatuses, clientId, undoLabel, redoLabel, }) => {
39
+ var _a;
39
40
  const keyframesToAdd = addedKeyframes === null ? [] : addedKeyframes;
40
41
  const sequenceKeyframes = movedKeyframes === null ? [] : movedKeyframes.sequenceKeyframes;
41
42
  const effectKeyframes = movedKeyframes === null ? [] : movedKeyframes.effectKeyframes;
@@ -56,13 +57,18 @@ const saveSequenceProps = ({ changes, addedKeyframes, movedKeyframes, setPropSta
56
57
  return (0, save_prop_queue_1.enqueueSavePropChange)({
57
58
  nodePath: change.nodePath,
58
59
  setPropStatuses,
59
- applyOptimistic: (prev) => (0, studio_shared_1.optimisticUpdateForPropStatuses)({
60
- previous: prev,
61
- fieldKey: change.fieldKey,
62
- value: change.value,
63
- defaultValue: change.defaultValue,
64
- schema: change.schema,
65
- }),
60
+ applyOptimistic: (prev) => {
61
+ var _a;
62
+ return ((_a = change.sourceEdit) === null || _a === void 0 ? void 0 : _a.type) === 'clipboard-param'
63
+ ? prev
64
+ : (0, studio_shared_1.optimisticUpdateForPropStatuses)({
65
+ previous: prev,
66
+ fieldKey: change.fieldKey,
67
+ value: change.value,
68
+ defaultValue: change.defaultValue,
69
+ schema: change.schema,
70
+ });
71
+ },
66
72
  apiCall: () => {
67
73
  var _a;
68
74
  return (0, sequence_props_api_1.saveSequenceProps)({
@@ -102,6 +108,9 @@ const saveSequenceProps = ({ changes, addedKeyframes, movedKeyframes, setPropSta
102
108
  }));
103
109
  }
104
110
  for (const change of changes) {
111
+ if (((_a = change.sourceEdit) === null || _a === void 0 ? void 0 : _a.type) === 'clipboard-param') {
112
+ continue;
113
+ }
105
114
  setPropStatuses(change.nodePath, (prev) => (0, studio_shared_1.optimisticUpdateForPropStatuses)({
106
115
  previous: prev,
107
116
  fieldKey: change.fieldKey,
@@ -0,0 +1,31 @@
1
+ import { type EffectClipboardParam, type SequencePropClipboardData } from '@remotion/studio-shared';
2
+ import { type CanUpdateSequencePropStatus, type InteractivitySchema, type OverrideIdToNodePaths, type PropStatuses, type SequencePropsSubscriptionKey, type TSequence } from 'remotion';
3
+ import type { TimelineSelection } from './TimelineSelection';
4
+ export declare const propStatusToClipboardParam: (prop: CanUpdateSequencePropStatus) => EffectClipboardParam | null;
5
+ export declare const getSequencePropClipboardDataFromSelection: ({ selection, propStatuses, sequences, overrideIdsToNodePaths, }: {
6
+ readonly selection: TimelineSelection;
7
+ readonly propStatuses: PropStatuses;
8
+ readonly sequences: TSequence[];
9
+ readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
10
+ }) => SequencePropClipboardData | null;
11
+ type PasteSequencePropEditTarget = {
12
+ readonly fileName: string;
13
+ readonly nodePath: SequencePropsSubscriptionKey;
14
+ readonly fieldKey: string;
15
+ readonly defaultValue: string | null;
16
+ readonly schema: InteractivitySchema;
17
+ };
18
+ export type PasteSequencePropTarget = {
19
+ readonly type: 'valid';
20
+ readonly targets: PasteSequencePropEditTarget[];
21
+ } | {
22
+ readonly type: 'none' | 'prop-mismatch' | 'uncopyable' | 'incompatible';
23
+ };
24
+ export declare const getPasteSequencePropTarget: ({ selectedItems, payload, propStatuses, sequences, overrideIdsToNodePaths, }: {
25
+ readonly selectedItems: readonly TimelineSelection[];
26
+ readonly payload: SequencePropClipboardData;
27
+ readonly propStatuses: PropStatuses;
28
+ readonly sequences: TSequence[];
29
+ readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
30
+ }) => PasteSequencePropTarget;
31
+ export {};
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPasteSequencePropTarget = exports.getSequencePropClipboardDataFromSelection = exports.propStatusToClipboardParam = void 0;
4
+ const studio_shared_1 = require("@remotion/studio-shared");
5
+ const remotion_1 = require("remotion");
6
+ const find_track_for_node_path_info_1 = require("./find-track-for-node-path-info");
7
+ const keyframe_clipboard_1 = require("./keyframe-clipboard");
8
+ const propStatusToClipboardParam = (prop) => {
9
+ if (prop.status === 'computed') {
10
+ return null;
11
+ }
12
+ if (prop.status === 'static') {
13
+ if (prop.codeValue === undefined) {
14
+ return null;
15
+ }
16
+ return { type: 'static', value: prop.codeValue };
17
+ }
18
+ if (!(0, studio_shared_1.isKeyframeInterpolationFunction)(prop.interpolationFunction)) {
19
+ return null;
20
+ }
21
+ return {
22
+ type: 'keyframed',
23
+ interpolationFunction: prop.interpolationFunction,
24
+ keyframes: prop.keyframes,
25
+ easing: prop.easing,
26
+ clamping: prop.clamping,
27
+ ...(prop.output === undefined || prop.output === 'linear'
28
+ ? {}
29
+ : { output: prop.output }),
30
+ ...(prop.posterize === undefined ? {} : { posterize: prop.posterize }),
31
+ };
32
+ };
33
+ exports.propStatusToClipboardParam = propStatusToClipboardParam;
34
+ const getSequencePropClipboardDataFromSelection = ({ selection, propStatuses, sequences, overrideIdsToNodePaths, }) => {
35
+ var _a, _b;
36
+ var _c;
37
+ if (selection.type !== 'sequence-prop') {
38
+ return null;
39
+ }
40
+ const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
41
+ sequences,
42
+ overrideIdsToNodePaths,
43
+ nodePathInfo: selection.nodePathInfo,
44
+ });
45
+ if (!(track === null || track === void 0 ? void 0 : track.sequence.controls)) {
46
+ return null;
47
+ }
48
+ const field = remotion_1.Internals.getFlatSchemaWithAllKeys(track.sequence.controls.schema)[selection.key];
49
+ if (!field || !(0, studio_shared_1.isKeyframeClipboardFieldType)(field.type)) {
50
+ return null;
51
+ }
52
+ const propStatus = (_b = remotion_1.Internals.getPropStatusesCtx(propStatuses, (_c = (_a = track.nodePathInfo) === null || _a === void 0 ? void 0 : _a.sequenceSubscriptionKey) !== null && _c !== void 0 ? _c : selection.nodePathInfo.sequenceSubscriptionKey)) === null || _b === void 0 ? void 0 : _b[selection.key];
53
+ if (!propStatus) {
54
+ return null;
55
+ }
56
+ const param = (0, exports.propStatusToClipboardParam)(propStatus);
57
+ if (param === null) {
58
+ return null;
59
+ }
60
+ return {
61
+ type: 'sequence-prop',
62
+ version: 1,
63
+ remotionClipboard: 'sequence-prop',
64
+ key: selection.key,
65
+ fieldType: field.type,
66
+ param,
67
+ };
68
+ };
69
+ exports.getSequencePropClipboardDataFromSelection = getSequencePropClipboardDataFromSelection;
70
+ const getPasteTargetForSelection = ({ selection, payload, propStatuses, sequences, overrideIdsToNodePaths, }) => {
71
+ var _a;
72
+ if (selection.type !== 'sequence-prop' && selection.type !== 'sequence') {
73
+ return { type: 'none' };
74
+ }
75
+ const fieldKey = selection.type === 'sequence-prop' ? selection.key : payload.key;
76
+ if (fieldKey !== payload.key) {
77
+ return { type: 'prop-mismatch' };
78
+ }
79
+ const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
80
+ sequences,
81
+ overrideIdsToNodePaths,
82
+ nodePathInfo: selection.nodePathInfo,
83
+ });
84
+ if (!(track === null || track === void 0 ? void 0 : track.sequence.controls) || !track.nodePathInfo) {
85
+ return { type: 'uncopyable' };
86
+ }
87
+ const { schema } = track.sequence.controls;
88
+ const field = remotion_1.Internals.getFlatSchemaWithAllKeys(schema)[fieldKey];
89
+ if (!field || field.type !== payload.fieldType) {
90
+ return { type: 'incompatible' };
91
+ }
92
+ const nodePath = track.nodePathInfo.sequenceSubscriptionKey;
93
+ const propStatus = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[fieldKey];
94
+ if (!propStatus || propStatus.status === 'computed') {
95
+ return { type: 'uncopyable' };
96
+ }
97
+ const values = payload.param.type === 'static'
98
+ ? [payload.param.value]
99
+ : payload.param.keyframes.map((keyframe) => keyframe.value);
100
+ if (values.some((value) => !(0, keyframe_clipboard_1.isKeyframeValueCompatible)({ value, fieldType: payload.fieldType }))) {
101
+ return { type: 'incompatible' };
102
+ }
103
+ return {
104
+ type: 'valid',
105
+ target: {
106
+ fileName: nodePath.absolutePath,
107
+ nodePath,
108
+ fieldKey,
109
+ defaultValue: field.default === undefined ? null : JSON.stringify(field.default),
110
+ schema,
111
+ },
112
+ };
113
+ };
114
+ const getPasteSequencePropTarget = ({ selectedItems, payload, propStatuses, sequences, overrideIdsToNodePaths, }) => {
115
+ if (selectedItems.length === 0) {
116
+ return { type: 'none' };
117
+ }
118
+ const targets = [];
119
+ for (const selection of selectedItems) {
120
+ const result = getPasteTargetForSelection({
121
+ selection,
122
+ payload,
123
+ propStatuses,
124
+ sequences,
125
+ overrideIdsToNodePaths,
126
+ });
127
+ if (result.type !== 'valid') {
128
+ return result;
129
+ }
130
+ targets.push(result.target);
131
+ }
132
+ return {
133
+ type: 'valid',
134
+ targets: [
135
+ ...new Map(targets.map((target) => [
136
+ remotion_1.Internals.makeSequencePropsSubscriptionKey(target.nodePath),
137
+ target,
138
+ ])).values(),
139
+ ],
140
+ };
141
+ };
142
+ exports.getPasteSequencePropTarget = getPasteSequencePropTarget;
@@ -8,7 +8,6 @@ export type SplitTimelineSequenceEligibility = {
8
8
  canSplit: false;
9
9
  reason: string;
10
10
  };
11
- export declare const getTimelineSequenceSplitUnsupportedReason: (componentName: string | null | undefined) => string | null;
12
11
  export declare const getTimelineSequenceSplitEligibility: ({ selection, sequence, splitFrame, propStatuses, }: {
13
12
  selection: TimelineSelection;
14
13
  sequence: TSequence | null;