@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.
- package/dist/Studio.d.ts +5 -0
- package/dist/Studio.js +2 -2
- package/dist/components/Canvas.js +41 -8
- package/dist/components/ColorPicker/AlphaSlider.js +2 -2
- package/dist/components/ColorPicker/HueSlider.js +2 -2
- package/dist/components/ColorPicker/SaturationValueArea.js +2 -2
- package/dist/components/CompositionSelectorItem.js +1 -1
- package/dist/components/EditorGuides/Guide.js +2 -2
- package/dist/components/EditorRuler/index.js +2 -2
- package/dist/components/ExplorerPanel.js +19 -1
- package/dist/components/InspectorOpenInEditor.js +19 -5
- package/dist/components/InspectorPanel/CompositionMetadata.js +23 -1
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +3 -3
- package/dist/components/Menu/MenuItem.js +2 -2
- package/dist/components/ModalContainer.js +1 -1
- package/dist/components/Modals.js +2 -9
- package/dist/components/NewComposition/InputDragger.js +2 -2
- package/dist/components/NewComposition/NewComposition.d.ts +2 -0
- package/dist/components/NewComposition/NewComposition.js +38 -6
- package/dist/components/NewComposition/get-new-composition-defaults.d.ts +1 -1
- package/dist/components/NewComposition/get-new-composition-defaults.js +9 -1
- package/dist/components/QuickSwitcher/asset-search.js +1 -0
- package/dist/components/SelectedOutlineCanvasRotation.js +6 -4
- package/dist/components/SelectedOutlineCropControls.js +3 -3
- package/dist/components/SelectedOutlineElement.js +6 -2
- package/dist/components/SelectedOutlinePolygon.js +4 -3
- package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +5 -0
- package/dist/components/SelectedOutlineRotationCornerHandle.js +4 -4
- package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +1 -0
- package/dist/components/SelectedOutlineScaleEdgeLine.js +4 -4
- package/dist/components/SelectedOutlineTransformOriginHandle.js +2 -2
- package/dist/components/SelectedOutlineUvControls.js +8 -8
- package/dist/components/Splitter/SplitterHandle.js +2 -2
- package/dist/components/Tabs/index.d.ts +2 -0
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Timeline/EasingEditorModal.d.ts +8 -0
- package/dist/components/Timeline/EasingEditorModal.js +10 -11
- package/dist/components/Timeline/SubscribeToNodePaths.js +1 -1
- package/dist/components/Timeline/Timeline.js +55 -1
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +99 -35
- package/dist/components/Timeline/TimelineColorField.js +1 -6
- package/dist/components/Timeline/TimelineDragHandler.js +2 -2
- package/dist/components/Timeline/TimelineEffectItem.js +1 -1
- package/dist/components/Timeline/TimelineEffectPropItem.js +8 -1
- package/dist/components/Timeline/TimelineEnumField.js +1 -4
- package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
- package/dist/components/Timeline/TimelineFieldRowContent.d.ts +2 -1
- package/dist/components/Timeline/TimelineFieldRowContent.js +18 -3
- package/dist/components/Timeline/TimelineFontFamilyField.js +1 -2
- package/dist/components/Timeline/TimelineInOutDragHandler.js +2 -2
- package/dist/components/Timeline/TimelineKeyframeEasingLine.js +3 -2
- package/dist/components/Timeline/TimelineLayerEye.js +2 -2
- package/dist/components/Timeline/TimelineNumberField.js +4 -2
- package/dist/components/Timeline/TimelineRotationField.js +3 -3
- package/dist/components/Timeline/TimelineRowChrome.d.ts +5 -0
- package/dist/components/Timeline/TimelineRowChrome.js +14 -9
- package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +1 -0
- package/dist/components/Timeline/TimelineRowLayoutContext.js +4 -1
- package/dist/components/Timeline/TimelineScaleField.js +4 -0
- package/dist/components/Timeline/TimelineSelection.js +2 -2
- package/dist/components/Timeline/TimelineSequenceItem.js +2 -25
- package/dist/components/Timeline/TimelineSequencePropItem.js +8 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +2 -0
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +69 -20
- package/dist/components/Timeline/TimelineTextContentField.js +1 -1
- package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -0
- package/dist/components/Timeline/keyframe-clipboard.d.ts +5 -1
- package/dist/components/Timeline/keyframe-clipboard.js +3 -2
- package/dist/components/Timeline/save-sequence-prop.js +16 -7
- package/dist/components/Timeline/sequence-prop-clipboard.d.ts +31 -0
- package/dist/components/Timeline/sequence-prop-clipboard.js +142 -0
- package/dist/components/Timeline/split-selected-timeline-item.d.ts +0 -1
- package/dist/components/Timeline/split-selected-timeline-item.js +5 -13
- package/dist/components/Timeline/timeline-field-row-layout.js +2 -2
- package/dist/components/Timeline/timeline-field-utils.d.ts +1 -0
- package/dist/components/Timeline/timeline-field-utils.js +6 -1
- package/dist/components/Timeline/update-selected-easing.js +8 -0
- package/dist/components/Timeline/use-open-sequence-in-apps.js +3 -1
- package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +1 -1
- package/dist/components/Timeline/use-resolved-stack-react-to-change.js +24 -3
- package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
- package/dist/components/UndoRedoButtons.js +5 -3
- package/dist/components/folder-menu-items.js +1 -0
- package/dist/components/get-open-in-menu-items.d.ts +4 -1
- package/dist/components/get-open-in-menu-items.js +99 -50
- package/dist/components/import-assets.js +7 -0
- package/dist/components/root-composition-menu-items.js +1 -0
- package/dist/components/selected-outline-control-layout.d.ts +14 -0
- package/dist/components/selected-outline-control-layout.js +94 -0
- package/dist/components/use-default-editor-info.js +28 -3
- package/dist/esm/{chunk-zpn4m49r.js → chunk-axbagh08.js} +6098 -5285
- package/dist/esm/{chunk-fgedsvhb.js → chunk-r46yxrjr.js} +1 -2
- package/dist/esm/internals.mjs +6097 -5284
- package/dist/esm/previewEntry.mjs +5989 -5176
- package/dist/esm/renderEntry.mjs +4 -2
- package/dist/helpers/get-canvas-capture-import.d.ts +7 -0
- package/dist/helpers/get-canvas-capture-import.js +43 -0
- package/dist/helpers/get-git-menu-item.d.ts +1 -1
- package/dist/helpers/get-git-menu-item.js +33 -3
- package/dist/helpers/inserted-element-selection.d.ts +12 -0
- package/dist/helpers/inserted-element-selection.js +29 -0
- package/dist/helpers/open-in-editor.d.ts +1 -0
- package/dist/helpers/open-in-editor.js +5 -1
- package/dist/helpers/pointer-session.d.ts +6 -2
- package/dist/helpers/pointer-session.js +29 -12
- package/dist/helpers/use-create-composition.d.ts +15 -2
- package/dist/helpers/use-create-composition.js +11 -17
- package/dist/helpers/use-menu-structure.js +1 -0
- package/dist/icons/git-client.d.ts +6 -0
- package/dist/icons/git-client.js +8 -0
- package/dist/icons/github.d.ts +4 -0
- package/dist/icons/github.js +11 -0
- package/dist/renderEntry.js +2 -2
- package/dist/state/modals.d.ts +9 -1
- package/dist/state/z-index.d.ts +0 -1
- package/dist/state/z-index.js +27 -33
- 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,
|
|
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
|
-
? [
|
|
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:
|
|
356
|
-
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:
|
|
364
|
-
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
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
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
|
|
562
|
-
|
|
563
|
-
|
|
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.
|
|
781
|
+
return (0, pointer_session_1.startCapturedPointerSession)({
|
|
733
782
|
event: activeDragState,
|
|
734
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
1005
|
+
return (0, pointer_session_1.startCapturedPointerSession)({
|
|
957
1006
|
event: activeDragState,
|
|
958
|
-
|
|
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.
|
|
1188
|
+
return (0, pointer_session_1.startCapturedPointerSession)({
|
|
1140
1189
|
event: activeDragState,
|
|
1141
|
-
|
|
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) =>
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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;
|