@remotion/studio 4.0.526 → 4.0.528
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/components/AgentPrompt.js +1 -2
- package/dist/components/AudioWaveform.d.ts +1 -0
- package/dist/components/AudioWaveform.js +10 -14
- package/dist/components/Canvas.js +88 -26
- package/dist/components/CanvasCaptureDropHandler.js +63 -0
- package/dist/components/CanvasOrLoading.js +10 -2
- package/dist/components/CodeFrame.js +1 -1
- package/dist/components/ColorPicker/checker.d.ts +1 -1
- package/dist/components/CompositionSelectorItem.js +1 -0
- package/dist/components/CurrentAsset.js +4 -2
- package/dist/components/EditorRuler/Ruler.js +6 -3
- package/dist/components/EffectPickerModal.js +69 -43
- package/dist/components/ElementInstallConfirmation.js +3 -3
- package/dist/components/ElementLibrariesSettings.d.ts +2 -0
- package/dist/components/ElementLibrariesSettings.js +200 -0
- package/dist/components/InitialCompositionLoader.js +4 -2
- package/dist/components/InlineDropdown.js +26 -2
- package/dist/components/InlineEditableTitle.js +1 -0
- package/dist/components/InspectorOpenInEditor.js +13 -0
- package/dist/components/InspectorPanel/AlignmentControls.js +28 -9
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +2 -1
- package/dist/components/InspectorPanel/CompositionInspector.js +3 -3
- package/dist/components/InspectorPanel/CompositionMetadata.js +4 -0
- package/dist/components/InspectorPanel/EasingInspector.js +6 -2
- package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -1
- package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +1 -1
- package/dist/components/InspectorPanel/KeyframeInspector.js +28 -24
- package/dist/components/InspectorPanel/MultiSequenceInspector.js +32 -1
- package/dist/components/InspectorPanel/MultiSequenceNumberField.js +1 -1
- package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -1
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +70 -2
- package/dist/components/InspectorPanel/SequenceWrapAction.d.ts +8 -0
- package/dist/components/InspectorPanel/SequenceWrapAction.js +151 -0
- package/dist/components/InspectorPanel/common.js +1 -0
- package/dist/components/InspectorPanel/easing-inspector-selection.d.ts +2 -1
- package/dist/components/InspectorPanel/easing-inspector-selection.js +4 -3
- package/dist/components/InspectorPanel/keyframe-inspector-frame.d.ts +2 -1
- package/dist/components/InspectorPanel/keyframe-inspector-frame.js +2 -2
- package/dist/components/InspectorPanel/styles.js +2 -0
- package/dist/components/InspectorPanel/use-composition-actions.js +1 -0
- package/dist/components/InspectorSequenceSection.d.ts +1 -0
- package/dist/components/InspectorSequenceSection.js +7 -5
- package/dist/components/InspectorSourceLocation.js +3 -0
- package/dist/components/KeyboardShortcutsSettings.js +1 -1
- package/dist/components/Menu/styles.d.ts +2 -2
- package/dist/components/MenuBuildIndicator.js +1 -0
- package/dist/components/Modals.js +7 -6
- package/dist/components/ModelManager.js +10 -9
- package/dist/components/NewComposition/CancelButton.js +11 -5
- package/dist/components/NewComposition/InputDragger.d.ts +3 -1
- package/dist/components/NewComposition/InputDragger.js +28 -9
- package/dist/components/NewComposition/NewComposition.js +7 -6
- package/dist/components/NewComposition/RemInput.d.ts +1 -1
- package/dist/components/NewComposition/menu-typeahead.js +1 -1
- package/dist/components/Preview.js +4 -0
- package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -0
- package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -0
- package/dist/components/RadioButton.js +1 -0
- package/dist/components/RenderModal/DataEditor.js +4 -1
- package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +1 -2
- package/dist/components/RenderModal/WebRenderModalPicture.js +1 -2
- package/dist/components/RenderQueue/CaptionQueueItem.js +19 -7
- package/dist/components/RenderQueue/CaptionQueueProcessor.js +65 -15
- package/dist/components/RenderQueue/QueueJobError.d.ts +8 -0
- package/dist/components/RenderQueue/QueueJobError.js +24 -0
- package/dist/components/RenderQueue/QueueJobErrorModal.d.ts +8 -0
- package/dist/components/RenderQueue/QueueJobErrorModal.js +63 -0
- package/dist/components/RenderQueue/RenderQueueItemCancelButton.d.ts +3 -1
- package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +11 -4
- package/dist/components/RenderQueue/RenderQueueRepeat.d.ts +3 -1
- package/dist/components/RenderQueue/RenderQueueRepeat.js +20 -3
- package/dist/components/RenderQueue/VideoMattingQueueItem.js +25 -27
- package/dist/components/RenderQueue/VideoMattingQueueProcessor.js +68 -28
- package/dist/components/RenderQueue/caption-job-types.d.ts +9 -1
- package/dist/components/RenderQueue/context.d.ts +4 -0
- package/dist/components/RenderQueue/context.js +58 -8
- package/dist/components/RenderQueue/index.js +3 -3
- package/dist/components/RenderQueue/load-model-for-job.d.ts +2 -1
- package/dist/components/RenderQueue/load-model-for-job.js +5 -1
- package/dist/components/RenderQueue/video-matting-job-types.d.ts +13 -6
- package/dist/components/RendersTab.js +2 -0
- package/dist/components/SelectedOutlineCropControls.js +2 -1
- package/dist/components/SelectedOutlineEditingHandles.js +9 -2
- package/dist/components/SelectedOutlineElement.js +9 -3
- package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -4
- package/dist/components/SelectedOutlineKeyboardControls.js +4 -22
- package/dist/components/SelectedOutlineOverlay.js +152 -106
- package/dist/components/SelectedOutlinePathPoints.d.ts +8 -0
- package/dist/components/SelectedOutlinePathPoints.js +433 -0
- package/dist/components/SelectedOutlinePolygon.js +21 -46
- package/dist/components/SelectedOutlineRenderer.d.ts +3 -5
- package/dist/components/SelectedOutlineRenderer.js +32 -136
- package/dist/components/SelectedOutlineSnapIndicators.d.ts +6 -0
- package/dist/components/SelectedOutlineSnapIndicators.js +16 -12
- package/dist/components/SelectedOutlineTransformOriginHandle.js +3 -2
- package/dist/components/SelectedOutlineUvControls.js +12 -7
- package/dist/components/SequencePropsSubscriptionProvider.d.ts +3 -0
- package/dist/components/SequencePropsSubscriptionProvider.js +8 -6
- package/dist/components/SettingsModal.js +30 -3
- package/dist/components/SettingsModalFooter.d.ts +1 -0
- package/dist/components/SettingsModalFooter.js +7 -3
- package/dist/components/ShowOutlinesProvider.js +1 -1
- package/dist/components/SkillsSettings.d.ts +0 -1
- package/dist/components/SkillsSettings.js +13 -14
- package/dist/components/Splitter/SplitterElement.js +1 -2
- package/dist/components/TimeValue.js +1 -1
- package/dist/components/Timeline/LoopedTimelineIndicators.d.ts +1 -0
- package/dist/components/Timeline/LoopedTimelineIndicators.js +7 -6
- package/dist/components/Timeline/TimelineArrayField.js +1 -1
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +0 -1
- package/dist/components/Timeline/TimelineColorField.js +1 -1
- package/dist/components/Timeline/TimelineDeleteKeybindings.js +6 -9
- package/dist/components/Timeline/TimelineDragHandler.js +1 -1
- package/dist/components/Timeline/TimelineEffectItem.js +1 -0
- package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineEffectPropItem.js +12 -5
- package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -0
- package/dist/components/Timeline/TimelineExpandedRow.d.ts +1 -0
- package/dist/components/Timeline/TimelineExpandedRow.js +6 -4
- package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -0
- package/dist/components/Timeline/TimelineExpandedSection.js +2 -2
- package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +1 -0
- package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +3 -1
- package/dist/components/Timeline/TimelineFieldLabel.js +1 -0
- package/dist/components/Timeline/TimelineFontFamilyField.js +12 -12
- package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -0
- package/dist/components/Timeline/TimelineKeyframeControls.js +40 -28
- package/dist/components/Timeline/TimelineLayerChildren.js +1 -1
- package/dist/components/Timeline/TimelineList.js +1 -1
- package/dist/components/Timeline/TimelineNumberField.js +2 -4
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
- package/dist/components/Timeline/TimelineSelection.d.ts +9 -9
- package/dist/components/Timeline/TimelineSelection.js +16 -9
- package/dist/components/Timeline/TimelineSequence.d.ts +3 -1
- package/dist/components/Timeline/TimelineSequence.js +65 -21
- package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
- package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineSequenceItem.js +46 -8
- package/dist/components/Timeline/TimelineSequencePropItem.d.ts +3 -0
- package/dist/components/Timeline/TimelineSequencePropItem.js +262 -25
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +11 -13
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +98 -77
- package/dist/components/Timeline/TimelineTextContentField.js +27 -4
- package/dist/components/Timeline/TimelineTimeIndicators.js +10 -5
- package/dist/components/Timeline/TimelineTrack.js +1 -1
- package/dist/components/Timeline/TimelineTrimTooltip.d.ts +11 -0
- package/dist/components/Timeline/TimelineTrimTooltip.js +41 -0
- package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
- package/dist/components/Timeline/TimelineVideoInfo.js +13 -10
- package/dist/components/Timeline/TimelineViewport.d.ts +1 -0
- package/dist/components/Timeline/TimelineViewport.js +10 -1
- package/dist/components/Timeline/delete-selected-keyframe.js +22 -8
- package/dist/components/Timeline/delete-selected-timeline-item.d.ts +1 -5
- package/dist/components/Timeline/delete-selected-timeline-item.js +9 -95
- package/dist/components/Timeline/get-animation-item-selection-for-frame.d.ts +2 -1
- package/dist/components/Timeline/get-animation-item-selection-for-frame.js +7 -5
- package/dist/components/Timeline/get-keyframed-sequence-drag-targets.d.ts +23 -0
- package/dist/components/Timeline/get-keyframed-sequence-drag-targets.js +57 -0
- package/dist/components/Timeline/get-node-keyframes.d.ts +2 -1
- package/dist/components/Timeline/get-node-keyframes.js +6 -4
- package/dist/components/Timeline/get-playback-rate-keyframe-changes.d.ts +21 -0
- package/dist/components/Timeline/get-playback-rate-keyframe-changes.js +142 -0
- package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +3 -1
- package/dist/components/Timeline/get-sequence-context-menu-items.js +13 -1
- package/dist/components/Timeline/get-timeline-keyframes.d.ts +15 -2
- package/dist/components/Timeline/get-timeline-keyframes.js +44 -6
- package/dist/components/Timeline/keyframe-clipboard.js +17 -3
- package/dist/components/Timeline/split-selected-timeline-item.d.ts +13 -10
- package/dist/components/Timeline/split-selected-timeline-item.js +61 -35
- package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
- package/dist/components/Timeline/timeline-field-row-layout.js +1 -0
- package/dist/components/Timeline/use-delete-timeline-items.js +17 -11
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +2 -1
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +3 -1
- package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -3
- package/dist/components/Timeline/use-timeline-keyframe-drag.js +28 -19
- package/dist/components/TimelineCombobox.js +1 -0
- package/dist/components/Transcription/Models.js +1 -1
- package/dist/components/Transcription/TranscriptionModal.js +18 -11
- package/dist/components/Transcription/TranscriptionModalWithOptionalWhisper.js +1 -1
- package/dist/components/Transcription/resample-media-to-16-khz.d.ts +2 -1
- package/dist/components/Transcription/resample-media-to-16-khz.js +20 -2
- package/dist/components/UpdatesSettings.js +2 -0
- package/dist/components/VideoMatting/Models.js +1 -1
- package/dist/components/VideoMatting/VideoMattingModal.js +30 -47
- package/dist/components/VideoMatting/VideoMattingModalWithOptionalPackage.js +1 -1
- package/dist/components/WebMcp.js +23 -40
- package/dist/components/composition-drop-preview.d.ts +9 -2
- package/dist/components/composition-drop-preview.js +8 -4
- package/dist/components/composition-menu-items.js +4 -4
- package/dist/components/delete-jsx-nodes-api.d.ts +2 -0
- package/dist/components/{delete-jsx-node-api.js → delete-jsx-nodes-api.js} +5 -5
- package/dist/components/effect-drag-and-drop.d.ts +13 -5
- package/dist/components/effect-drag-and-drop.js +19 -4
- package/dist/components/get-open-in-menu-items.d.ts +2 -1
- package/dist/components/get-open-in-menu-items.js +24 -8
- package/dist/components/keyboard-shortcuts.d.ts +4 -4
- package/dist/components/keyboard-shortcuts.js +3 -1
- package/dist/components/public-output-name.d.ts +1 -0
- package/dist/components/public-output-name.js +7 -3
- package/dist/components/selected-outline-drag.d.ts +1 -6
- package/dist/components/selected-outline-drag.js +22 -6
- package/dist/components/selected-outline-geometry.d.ts +2 -18
- package/dist/components/selected-outline-measurement.d.ts +23 -41
- package/dist/components/selected-outline-measurement.js +14 -252
- package/dist/components/selected-outline-order.d.ts +4 -11
- package/dist/components/selected-outline-order.js +2 -254
- package/dist/components/selected-outline-snap.d.ts +1 -1
- package/dist/components/selected-outline-snap.js +2 -1
- package/dist/components/selected-outline-types.d.ts +18 -28
- package/dist/components/selected-outline-uv.d.ts +4 -4
- package/dist/components/selected-outline-uv.js +6 -111
- package/dist/components/sequence-props-api.js +0 -10
- package/dist/components/use-selected-outline-control-target.js +12 -21
- package/dist/components/wrap-jsx-node-api.d.ts +2 -0
- package/dist/components/wrap-jsx-node-api.js +13 -0
- package/dist/error-overlay/remotion-overlay/OpenInEditor.js +45 -2
- package/dist/error-overlay/remotion-overlay/StackFrame.js +32 -3
- package/dist/esm/{CaptionQueueProcessor-k0yrm3dj.mjs → CaptionQueueProcessor-nr7hjcga.mjs} +96 -19
- package/dist/esm/LazyModels-ajkn7fs3.mjs +12 -0
- package/dist/esm/LazyModels-g1g7cf4e.mjs +12 -0
- package/dist/esm/{TranscriptionModal-ymnx1c7m.mjs → TranscriptionModal-e18bzbkb.mjs} +30 -22
- package/dist/esm/{VideoMattingModal-05vpczks.mjs → VideoMattingModal-5bz2s4rs.mjs} +47 -62
- package/dist/esm/{VideoMattingQueueProcessor-t1hgm2rm.mjs → VideoMattingQueueProcessor-4tkj0f4k.mjs} +69 -26
- package/dist/esm/{index-v4tr1bft.mjs → index-09txs1bj.mjs} +5 -0
- package/dist/esm/{index-4dsz9035.mjs → index-5ycb9e9q.mjs} +2 -4
- package/dist/esm/index-890dd9b3.mjs +768 -0
- package/dist/esm/{index-5bfxbpca.mjs → index-8nt6a0mw.mjs} +3 -3
- package/dist/esm/{index-5gd8k9yv.mjs → index-9q9w8v9p.mjs} +3 -3
- package/dist/esm/{index-x40wwfmt.mjs → index-c2wabcdt.mjs} +8 -6
- package/dist/esm/index-dfy1t576.mjs +129 -0
- package/dist/esm/index-dh3zk2hv.mjs +220 -0
- package/dist/esm/{index-0gewwxse.mjs → index-dpyss74p.mjs} +6179 -5011
- package/dist/esm/{index-9x6e1dq0.mjs → index-hqxc6tzp.mjs} +40 -6
- package/dist/esm/{index-cdy8v54v.mjs → index-qve7mdfp.mjs} +36 -539
- package/dist/esm/{index-eb5txqp6.mjs → index-s6qya2gg.mjs} +8 -88
- package/dist/esm/index-t7tbt980.mjs +103 -0
- package/dist/esm/{index-g7k2dvar.mjs → index-t7xnxdf8.mjs} +44 -26
- package/dist/esm/index-wqc43mw0.mjs +158 -0
- package/dist/esm/{index-bs39wngg.mjs → index-x6r9bn12.mjs} +5623 -6218
- package/dist/esm/{index-f97r9e2g.mjs → index-xac20sv4.mjs} +46 -57
- package/dist/esm/index.mjs +4 -4
- package/dist/esm/internals.mjs +13 -10
- package/dist/esm/previewEntry.mjs +18 -12
- package/dist/esm/renderEntry.mjs +5 -1
- package/dist/esm/{resolve-composition-component-location-bt2d6qxq.mjs → resolve-composition-component-location-2hgf6g0a.mjs} +1 -1
- package/dist/helpers/calculate-timeline.d.ts +5 -1
- package/dist/helpers/calculate-timeline.js +1 -1
- package/dist/helpers/checkerboard-background.d.ts +2 -2
- package/dist/helpers/colors.d.ts +132 -112
- package/dist/helpers/colors.js +117 -95
- package/dist/helpers/copy-text.js +1 -16
- package/dist/helpers/create-folder-tree.js +2 -1
- package/dist/helpers/editor-guide-selection.d.ts +1 -1
- package/dist/helpers/editor-ruler.js +23 -12
- package/dist/helpers/get-connected-compositions.d.ts +6 -1
- package/dist/helpers/get-connected-compositions.js +1 -1
- package/dist/helpers/get-sequence-double-click-action.js +1 -1
- package/dist/helpers/get-sequence-visible-range.d.ts +1 -1
- package/dist/helpers/get-sequence-visible-range.js +2 -5
- package/dist/helpers/get-timeline-nestedness.d.ts +1 -1
- package/dist/helpers/get-timeline-nestedness.js +1 -1
- package/dist/helpers/get-timeline-sequence-sort-key.d.ts +1 -1
- package/dist/helpers/get-timeline-sequence-sort-key.js +1 -1
- package/dist/helpers/hoverable.js +6 -5
- package/dist/helpers/inject-css.js +5 -7
- package/dist/helpers/open-in-editor.js +1 -1
- package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -1
- package/dist/helpers/prism-vsc-dark-plus.js +52 -51
- package/dist/helpers/resolve-studio-color.d.ts +1 -0
- package/dist/helpers/resolve-studio-color.js +11 -0
- package/dist/helpers/studio-css-variables.d.ts +1 -0
- package/dist/helpers/studio-css-variables.js +105 -0
- package/dist/helpers/studio-pixel-ratio.d.ts +1 -0
- package/dist/helpers/studio-pixel-ratio.js +7 -0
- package/dist/helpers/studio-runtime-config.d.ts +1 -1
- package/dist/helpers/timeline-node-path-key.d.ts +1 -1
- package/dist/helpers/timeline-node-path-key.js +2 -2
- package/dist/helpers/use-keybinding.d.ts +1 -1
- package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
- package/dist/helpers/use-menu-structure.js +15 -9
- package/dist/helpers/use-runtime-values.js +2 -28
- package/dist/hot-middleware-client/client.js +5 -3
- package/dist/icons/align-center-horizontal.js +2 -1
- package/dist/icons/align-left.js +2 -1
- package/dist/icons/align-right.js +2 -1
- package/dist/icons/{separation.d.ts → background-removal.d.ts} +1 -1
- package/dist/icons/background-removal.js +9 -0
- package/dist/icons/wrap.d.ts +4 -0
- package/dist/icons/wrap.js +10 -0
- package/dist/previewEntry.js +2 -0
- package/dist/renderEntry.js +2 -0
- package/dist/state/modals.d.ts +20 -1
- package/dist/state/timeline-sequence-hover.d.ts +6 -16
- package/dist/state/timeline-sequence-hover.js +6 -67
- package/dist/state/timeline-zoom.js +4 -0
- package/package.json +20 -19
- package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.d.ts +0 -15
- package/dist/components/Timeline/get-easing-selection-after-keyframe-delete.js +0 -31
- package/dist/components/delete-jsx-node-api.d.ts +0 -2
- package/dist/esm/LazyModels-mtggyjye.mjs +0 -11
- package/dist/esm/LazyModels-nk7py0zt.mjs +0 -11
- package/dist/esm/index-cw0pnpg5.mjs +0 -50
- package/dist/esm/index-k426ye99.mjs +0 -139
- package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
- package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
- package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
- package/dist/helpers/get-box-quads-ponyfill.js +0 -23
- package/dist/icons/separation.js +0 -7
|
@@ -4,11 +4,11 @@ exports.getNodeHasKeyframes = exports.getNodeKeyframes = void 0;
|
|
|
4
4
|
const remotion_1 = require("remotion");
|
|
5
5
|
const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
|
|
6
6
|
const hasOverride = (overrides, key) => Object.prototype.hasOwnProperty.call(overrides, key);
|
|
7
|
-
const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, timelinePosition, dragOverrideValue, hasDragOverride, }) => {
|
|
7
|
+
const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, timelinePosition, dragOverrideValue, hasDragOverride, }) => {
|
|
8
8
|
if ((dragOverrideValue === null || dragOverrideValue === void 0 ? void 0 : dragOverrideValue.type) === 'keyframed') {
|
|
9
|
-
return (0, get_timeline_keyframes_1.getTimelineKeyframes)(dragOverrideValue.status, keyframeDisplayOffset);
|
|
9
|
+
return (0, get_timeline_keyframes_1.getTimelineKeyframes)(dragOverrideValue.status, keyframeDisplayOffset, keyframePlaybackRate);
|
|
10
10
|
}
|
|
11
|
-
const keyframes = (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset);
|
|
11
|
+
const keyframes = (0, get_timeline_keyframes_1.getTimelineKeyframes)(propStatus, keyframeDisplayOffset, keyframePlaybackRate);
|
|
12
12
|
if (!hasDragOverride || (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'keyframed') {
|
|
13
13
|
return keyframes;
|
|
14
14
|
}
|
|
@@ -22,7 +22,7 @@ const withDragOverrideKeyframe = ({ propStatus, keyframeDisplayOffset, timelineP
|
|
|
22
22
|
}
|
|
23
23
|
return [...keyframes, dragKeyframe].sort((first, second) => first.frame - second.frame);
|
|
24
24
|
};
|
|
25
|
-
const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset, getDragOverrides, getEffectDragOverrides, timelinePosition, }) => {
|
|
25
|
+
const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset, keyframePlaybackRate, getDragOverrides, getEffectDragOverrides, timelinePosition, }) => {
|
|
26
26
|
var _a, _b;
|
|
27
27
|
if (node.kind !== 'field' || node.field === null) {
|
|
28
28
|
return [];
|
|
@@ -32,6 +32,7 @@ const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset,
|
|
|
32
32
|
return withDragOverrideKeyframe({
|
|
33
33
|
propStatus: (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[node.field.key],
|
|
34
34
|
keyframeDisplayOffset,
|
|
35
|
+
keyframePlaybackRate,
|
|
35
36
|
timelinePosition,
|
|
36
37
|
dragOverrideValue: dragOverrides[node.field.key],
|
|
37
38
|
hasDragOverride: hasOverride(dragOverrides, node.field.key),
|
|
@@ -48,6 +49,7 @@ const getNodeKeyframes = ({ node, nodePath, propStatuses, keyframeDisplayOffset,
|
|
|
48
49
|
? (_b = effectStatus.props) === null || _b === void 0 ? void 0 : _b[node.field.key]
|
|
49
50
|
: null,
|
|
50
51
|
keyframeDisplayOffset,
|
|
52
|
+
keyframePlaybackRate,
|
|
51
53
|
timelinePosition,
|
|
52
54
|
dragOverrideValue: effectDragOverrides[node.field.key],
|
|
53
55
|
hasDragOverride: hasOverride(effectDragOverrides, node.field.key),
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CanUpdateSequencePropStatusKeyframed, OverrideIdToNodePaths, PropStatuses, SequencePropsSubscriptionKey, TSequence } from 'remotion';
|
|
2
|
+
import type { MoveEffectKeyframeChange, MoveSequenceKeyframeChange } from './call-move-keyframe';
|
|
3
|
+
type KeyframePreview = {
|
|
4
|
+
readonly nodePath: SequencePropsSubscriptionKey;
|
|
5
|
+
readonly fieldKey: string;
|
|
6
|
+
readonly effectIndex: number | null;
|
|
7
|
+
readonly status: CanUpdateSequencePropStatusKeyframed;
|
|
8
|
+
};
|
|
9
|
+
export declare const getPlaybackRateKeyframeChanges: ({ nodePath, sequences, overrideIdsToNodePaths, propStatuses, previousPlaybackRate, playbackRate, }: {
|
|
10
|
+
readonly nodePath: SequencePropsSubscriptionKey;
|
|
11
|
+
readonly sequences: TSequence[];
|
|
12
|
+
readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
|
|
13
|
+
readonly propStatuses: PropStatuses;
|
|
14
|
+
readonly previousPlaybackRate: number;
|
|
15
|
+
readonly playbackRate: number;
|
|
16
|
+
}) => {
|
|
17
|
+
readonly sequenceKeyframes: MoveSequenceKeyframeChange[];
|
|
18
|
+
readonly effectKeyframes: MoveEffectKeyframeChange[];
|
|
19
|
+
readonly previews: KeyframePreview[];
|
|
20
|
+
};
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPlaybackRateKeyframeChanges = void 0;
|
|
4
|
+
const studio_shared_1 = require("@remotion/studio-shared");
|
|
5
|
+
const get_keyframed_sequence_drag_targets_1 = require("./get-keyframed-sequence-drag-targets");
|
|
6
|
+
const getPlaybackRateKeyframeChanges = ({ nodePath, sequences, overrideIdsToNodePaths, propStatuses, previousPlaybackRate, playbackRate, }) => {
|
|
7
|
+
var _a;
|
|
8
|
+
var _b;
|
|
9
|
+
const sequenceKeyframes = [];
|
|
10
|
+
const effectKeyframes = [];
|
|
11
|
+
const previews = [];
|
|
12
|
+
if (previousPlaybackRate === playbackRate ||
|
|
13
|
+
!Number.isFinite(previousPlaybackRate) ||
|
|
14
|
+
previousPlaybackRate <= 0 ||
|
|
15
|
+
!Number.isFinite(playbackRate) ||
|
|
16
|
+
playbackRate <= 0) {
|
|
17
|
+
return { sequenceKeyframes, effectKeyframes, previews };
|
|
18
|
+
}
|
|
19
|
+
const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(nodePath);
|
|
20
|
+
const root = sequences.find((sequence) => {
|
|
21
|
+
var _a;
|
|
22
|
+
const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
|
|
23
|
+
const path = overrideId ? overrideIdsToNodePaths[overrideId] : undefined;
|
|
24
|
+
return path && (0, studio_shared_1.stringifySequenceSubscriptionKey)(path) === key;
|
|
25
|
+
});
|
|
26
|
+
if (!root) {
|
|
27
|
+
return { sequenceKeyframes, effectKeyframes, previews };
|
|
28
|
+
}
|
|
29
|
+
const sequencesById = new Map(sequences.map((sequence) => [sequence.id, sequence]));
|
|
30
|
+
const ratio = previousPlaybackRate / playbackRate;
|
|
31
|
+
const includedNodePaths = new Set();
|
|
32
|
+
for (const sequence of sequences) {
|
|
33
|
+
let ancestorId = sequence.id;
|
|
34
|
+
let belongsToRoot = false;
|
|
35
|
+
let descendantOffset = 0;
|
|
36
|
+
while (ancestorId !== null) {
|
|
37
|
+
if (ancestorId === root.id) {
|
|
38
|
+
belongsToRoot = true;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
const ancestor = sequencesById.get(ancestorId);
|
|
42
|
+
if (!ancestor) {
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
descendantOffset += ancestor.from - ((_b = ancestor.trimBefore) !== null && _b !== void 0 ? _b : 0);
|
|
46
|
+
ancestorId = ancestor.parent;
|
|
47
|
+
}
|
|
48
|
+
if (!belongsToRoot) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const overrideId = (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.overrideId;
|
|
52
|
+
const descendantNodePath = overrideId
|
|
53
|
+
? overrideIdsToNodePaths[overrideId]
|
|
54
|
+
: undefined;
|
|
55
|
+
if (!descendantNodePath) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const descendantKey = (0, studio_shared_1.stringifySequenceSubscriptionKey)(descendantNodePath);
|
|
59
|
+
if (includedNodePaths.has(descendantKey)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
includedNodePaths.add(descendantKey);
|
|
63
|
+
// Local-clock descendant keyframes already follow their parent's rate.
|
|
64
|
+
// The shared collector includes only outer-clock descendants.
|
|
65
|
+
const targets = (0, get_keyframed_sequence_drag_targets_1.getKeyframedSequenceDragTargets)({
|
|
66
|
+
nodePath: descendantNodePath,
|
|
67
|
+
sequence,
|
|
68
|
+
sequences,
|
|
69
|
+
propStatuses,
|
|
70
|
+
isDescendant: sequence.id !== root.id,
|
|
71
|
+
});
|
|
72
|
+
const addMoves = (target, effectIndex) => {
|
|
73
|
+
var _a;
|
|
74
|
+
const adjustment = (_a = target.status.keyframeDisplayOffsetAdjustment) !== null && _a !== void 0 ? _a : 0;
|
|
75
|
+
// The adjustment includes the timing offsets between this element and
|
|
76
|
+
// the useCurrentFrame() binding. Remove the descendant offsets to find
|
|
77
|
+
// the edited element's start in that binding's source clock.
|
|
78
|
+
const anchor = sequence.id === root.id
|
|
79
|
+
? root.from - adjustment
|
|
80
|
+
: -adjustment - descendantOffset;
|
|
81
|
+
if (!Number.isFinite(anchor)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const nextKeyframes = target.status.keyframes.map((keyframe) => {
|
|
85
|
+
const frame = anchor + (keyframe.frame - anchor) * ratio;
|
|
86
|
+
const nearestInteger = Math.round(frame);
|
|
87
|
+
return {
|
|
88
|
+
...keyframe,
|
|
89
|
+
frame: Math.abs(frame - nearestInteger) <=
|
|
90
|
+
Number.EPSILON * Math.max(1, Math.abs(frame)) * 2
|
|
91
|
+
? nearestInteger
|
|
92
|
+
: frame,
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
if (nextKeyframes.some((keyframe) => !Number.isFinite(keyframe.frame)) ||
|
|
96
|
+
new Set(nextKeyframes.map((keyframe) => keyframe.frame)).size !==
|
|
97
|
+
nextKeyframes.length) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const moves = target.status.keyframes.flatMap((keyframe, index) => {
|
|
101
|
+
var _a;
|
|
102
|
+
const toFrame = (_a = nextKeyframes[index]) === null || _a === void 0 ? void 0 : _a.frame;
|
|
103
|
+
if (toFrame === undefined || toFrame === keyframe.frame) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
return [
|
|
107
|
+
{
|
|
108
|
+
fileName: target.fileName,
|
|
109
|
+
nodePath: target.nodePath,
|
|
110
|
+
fieldKey: target.fieldKey,
|
|
111
|
+
fromFrame: keyframe.frame,
|
|
112
|
+
toFrame,
|
|
113
|
+
schema: target.schema,
|
|
114
|
+
},
|
|
115
|
+
];
|
|
116
|
+
});
|
|
117
|
+
if (moves.length === 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
previews.push({
|
|
121
|
+
nodePath: target.nodePath,
|
|
122
|
+
fieldKey: target.fieldKey,
|
|
123
|
+
effectIndex,
|
|
124
|
+
status: { ...target.status, keyframes: nextKeyframes },
|
|
125
|
+
});
|
|
126
|
+
if (effectIndex === null) {
|
|
127
|
+
sequenceKeyframes.push(...moves);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
effectKeyframes.push(...moves.map((move) => ({ ...move, effectIndex })));
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
for (const target of targets.sequenceKeyframes) {
|
|
134
|
+
addMoves(target, null);
|
|
135
|
+
}
|
|
136
|
+
for (const target of targets.effectKeyframes) {
|
|
137
|
+
addMoves(target, target.effectIndex);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return { sequenceKeyframes, effectKeyframes, previews };
|
|
141
|
+
};
|
|
142
|
+
exports.getPlaybackRateKeyframeChanges = getPlaybackRateKeyframeChanges;
|
|
@@ -3,11 +3,13 @@ import type { ResolvedStackLocation, TSequence } from 'remotion';
|
|
|
3
3
|
import type { ComboboxValue } from '../NewComposition/ComboBox';
|
|
4
4
|
import type { TimelineAssetLinkInfo } from './timeline-asset-link';
|
|
5
5
|
export declare const findCopyableFrameElement: (element: Element | null) => Element | null;
|
|
6
|
-
export declare const getMultiSequenceContextMenuItems: ({ deleteDisabled, duplicateDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, }: {
|
|
6
|
+
export declare const getMultiSequenceContextMenuItems: ({ deleteDisabled, duplicateDisabled, splitDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, onSplitSelectedSequences, }: {
|
|
7
7
|
readonly deleteDisabled: boolean;
|
|
8
8
|
readonly duplicateDisabled: boolean;
|
|
9
|
+
readonly splitDisabled: boolean;
|
|
9
10
|
readonly onDeleteSelectedSequences: () => void;
|
|
10
11
|
readonly onDuplicateSelectedSequences: () => void;
|
|
12
|
+
readonly onSplitSelectedSequences: () => void;
|
|
11
13
|
}) => ComboboxValue[];
|
|
12
14
|
export declare const getSequenceContextMenuItems: ({ assetLinkInfo, canOpenInEditor, copyImageElement, deleteDisabled, disableInteractivityDisabled, duplicateDisabled, isProgrammaticallyDuplicated, includeSourceEditItems, codingAgentInfo, editorInfo, onConfigureApps, onDeleteSequenceFromSource, onDisableSequenceInteractivity, onDuplicateSequenceFromSource, openInCodingAgent, openInEditor, originalLocation, selectAsset, sequence, sourceActions, }: {
|
|
13
15
|
readonly assetLinkInfo: TimelineAssetLinkInfo | null;
|
|
@@ -96,7 +96,7 @@ const copyImageToClipboard = async (element) => {
|
|
|
96
96
|
}),
|
|
97
97
|
]);
|
|
98
98
|
};
|
|
99
|
-
const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, }) => {
|
|
99
|
+
const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, splitDisabled, onDeleteSelectedSequences, onDuplicateSelectedSequences, onSplitSelectedSequences, }) => {
|
|
100
100
|
return [
|
|
101
101
|
{
|
|
102
102
|
type: 'item',
|
|
@@ -110,6 +110,18 @@ const getMultiSequenceContextMenuItems = ({ deleteDisabled, duplicateDisabled, o
|
|
|
110
110
|
subMenu: null,
|
|
111
111
|
value: 'duplicate-selected-sequences',
|
|
112
112
|
},
|
|
113
|
+
{
|
|
114
|
+
type: 'item',
|
|
115
|
+
id: 'split-selected-sequences',
|
|
116
|
+
keyHint: null,
|
|
117
|
+
label: 'Split selected at playhead',
|
|
118
|
+
leftItem: null,
|
|
119
|
+
disabled: splitDisabled,
|
|
120
|
+
onClick: onSplitSelectedSequences,
|
|
121
|
+
quickSwitcherLabel: null,
|
|
122
|
+
subMenu: null,
|
|
123
|
+
value: 'split-selected-sequences',
|
|
124
|
+
},
|
|
113
125
|
{
|
|
114
126
|
type: 'divider',
|
|
115
127
|
id: 'duplicate-delete-selected-sequences-divider',
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import type { CanUpdateSequencePropStatus } from 'remotion';
|
|
2
|
-
export
|
|
2
|
+
export type KeyframeSourceFrame = number | {
|
|
3
|
+
readonly displayFrame: number;
|
|
4
|
+
readonly keyframeDisplayOffset: number;
|
|
5
|
+
readonly keyframePlaybackRate: number;
|
|
6
|
+
};
|
|
7
|
+
export declare const getKeyframeSourceFrame: ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }: {
|
|
8
|
+
displayFrame: number;
|
|
9
|
+
keyframeDisplayOffset: number;
|
|
10
|
+
keyframePlaybackRate: number;
|
|
11
|
+
propStatus: CanUpdateSequencePropStatus | null;
|
|
12
|
+
}) => number;
|
|
13
|
+
export declare const resolveKeyframeSourceFrame: (sourceFrame: KeyframeSourceFrame, propStatus: CanUpdateSequencePropStatus | null) => number;
|
|
14
|
+
export declare const getTimelineKeyframes: (propStatus: CanUpdateSequencePropStatus | null | undefined, keyframeDisplayOffset?: number, keyframePlaybackRate?: number) => {
|
|
3
15
|
frame: number;
|
|
4
16
|
value: unknown;
|
|
5
17
|
}[];
|
|
6
|
-
export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, }: {
|
|
18
|
+
export declare const getKeyframeDisplayOffset: ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }: {
|
|
7
19
|
propStatus: CanUpdateSequencePropStatus | null | undefined;
|
|
8
20
|
keyframeDisplayOffset: number;
|
|
21
|
+
keyframePlaybackRate: number;
|
|
9
22
|
}) => number;
|
|
@@ -1,7 +1,44 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = void 0;
|
|
4
|
-
const
|
|
3
|
+
exports.getKeyframeDisplayOffset = exports.getTimelineKeyframes = exports.resolveKeyframeSourceFrame = exports.getKeyframeSourceFrame = void 0;
|
|
4
|
+
const getKeyframeSourceFrame = ({ displayFrame, keyframeDisplayOffset, keyframePlaybackRate, propStatus, }) => {
|
|
5
|
+
const sourceFrame = (displayFrame - keyframeDisplayOffset) * keyframePlaybackRate;
|
|
6
|
+
if ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'keyframed') {
|
|
7
|
+
return sourceFrame;
|
|
8
|
+
}
|
|
9
|
+
// Converting a displayed keyframe back to source frames may introduce rounding
|
|
10
|
+
// error. Resolve its original frame so edits keep the existing keyframe identity,
|
|
11
|
+
// including when source keyframes themselves have fractional frames.
|
|
12
|
+
const tolerance = Number.EPSILON *
|
|
13
|
+
Math.max(1, Math.abs(displayFrame), Math.abs(keyframeDisplayOffset)) *
|
|
14
|
+
keyframePlaybackRate *
|
|
15
|
+
8;
|
|
16
|
+
let closestFrame = sourceFrame;
|
|
17
|
+
let closestDistance = Infinity;
|
|
18
|
+
for (const keyframe of propStatus.keyframes) {
|
|
19
|
+
const distance = Math.abs(keyframe.frame - sourceFrame);
|
|
20
|
+
if (distance <= tolerance && distance < closestDistance) {
|
|
21
|
+
closestFrame = keyframe.frame;
|
|
22
|
+
closestDistance = distance;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return closestFrame;
|
|
26
|
+
};
|
|
27
|
+
exports.getKeyframeSourceFrame = getKeyframeSourceFrame;
|
|
28
|
+
const resolveKeyframeSourceFrame = (sourceFrame, propStatus) => {
|
|
29
|
+
return (0, exports.getKeyframeSourceFrame)({
|
|
30
|
+
...(typeof sourceFrame === 'number'
|
|
31
|
+
? {
|
|
32
|
+
displayFrame: sourceFrame,
|
|
33
|
+
keyframeDisplayOffset: 0,
|
|
34
|
+
keyframePlaybackRate: 1,
|
|
35
|
+
}
|
|
36
|
+
: sourceFrame),
|
|
37
|
+
propStatus,
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
exports.resolveKeyframeSourceFrame = resolveKeyframeSourceFrame;
|
|
41
|
+
const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0, keyframePlaybackRate = 1) => {
|
|
5
42
|
if (!propStatus) {
|
|
6
43
|
return [];
|
|
7
44
|
}
|
|
@@ -12,22 +49,23 @@ const getTimelineKeyframes = (propStatus, keyframeDisplayOffset = 0) => {
|
|
|
12
49
|
const resolvedKeyframeDisplayOffset = (0, exports.getKeyframeDisplayOffset)({
|
|
13
50
|
propStatus,
|
|
14
51
|
keyframeDisplayOffset,
|
|
52
|
+
keyframePlaybackRate,
|
|
15
53
|
});
|
|
16
|
-
if (resolvedKeyframeDisplayOffset === 0) {
|
|
54
|
+
if (resolvedKeyframeDisplayOffset === 0 && keyframePlaybackRate === 1) {
|
|
17
55
|
return keyframes;
|
|
18
56
|
}
|
|
19
57
|
return keyframes.map((keyframe) => ({
|
|
20
58
|
...keyframe,
|
|
21
|
-
frame: keyframe.frame + resolvedKeyframeDisplayOffset,
|
|
59
|
+
frame: keyframe.frame / keyframePlaybackRate + resolvedKeyframeDisplayOffset,
|
|
22
60
|
}));
|
|
23
61
|
};
|
|
24
62
|
exports.getTimelineKeyframes = getTimelineKeyframes;
|
|
25
|
-
const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, }) => {
|
|
63
|
+
const getKeyframeDisplayOffset = ({ propStatus, keyframeDisplayOffset, keyframePlaybackRate, }) => {
|
|
26
64
|
return (keyframeDisplayOffset +
|
|
27
65
|
((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' || (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static'
|
|
28
66
|
? propStatus.keyframeDisplayOffsetAdjustment === null
|
|
29
67
|
? 0
|
|
30
|
-
: propStatus.keyframeDisplayOffsetAdjustment
|
|
68
|
+
: propStatus.keyframeDisplayOffsetAdjustment / keyframePlaybackRate
|
|
31
69
|
: 0));
|
|
32
70
|
};
|
|
33
71
|
exports.getKeyframeDisplayOffset = getKeyframeDisplayOffset;
|
|
@@ -69,9 +69,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
|
|
|
69
69
|
fieldKey: identity.fieldKey,
|
|
70
70
|
}),
|
|
71
71
|
propStatus: sequencePropStatus,
|
|
72
|
+
keyframePlaybackRate: track.keyframePlaybackRate,
|
|
72
73
|
keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
|
|
73
74
|
propStatus: sequencePropStatus,
|
|
74
75
|
keyframeDisplayOffset: track.keyframeDisplayOffset,
|
|
76
|
+
keyframePlaybackRate: track.keyframePlaybackRate,
|
|
75
77
|
}),
|
|
76
78
|
};
|
|
77
79
|
}
|
|
@@ -97,9 +99,11 @@ const resolveKeyframeField = ({ selection, sequences, overrideIdsToNodePaths, pr
|
|
|
97
99
|
fieldKey: identity.fieldKey,
|
|
98
100
|
}),
|
|
99
101
|
propStatus: effectPropStatus,
|
|
102
|
+
keyframePlaybackRate: track.keyframePlaybackRate,
|
|
100
103
|
keyframeDisplayOffset: (0, get_timeline_keyframes_1.getKeyframeDisplayOffset)({
|
|
101
104
|
propStatus: effectPropStatus,
|
|
102
105
|
keyframeDisplayOffset: track.keyframeDisplayOffset,
|
|
106
|
+
keyframePlaybackRate: track.keyframePlaybackRate,
|
|
103
107
|
}),
|
|
104
108
|
};
|
|
105
109
|
};
|
|
@@ -147,7 +151,12 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
|
|
|
147
151
|
}
|
|
148
152
|
const keyframes = [];
|
|
149
153
|
for (const { selection } of resolvedFields) {
|
|
150
|
-
const sourceFrame =
|
|
154
|
+
const sourceFrame = (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
|
|
155
|
+
displayFrame: selection.frame,
|
|
156
|
+
keyframeDisplayOffset: firstResolved.keyframeDisplayOffset,
|
|
157
|
+
keyframePlaybackRate: firstResolved.keyframePlaybackRate,
|
|
158
|
+
propStatus: keyframedPropStatus,
|
|
159
|
+
});
|
|
151
160
|
const keyframe = keyframedPropStatus.keyframes.find((item) => item.frame === sourceFrame);
|
|
152
161
|
if (keyframe === undefined ||
|
|
153
162
|
JSON.stringify(keyframe.value) === undefined) {
|
|
@@ -195,7 +204,7 @@ const getKeyframeClipboardDataFromSelections = ({ selections, sequences, overrid
|
|
|
195
204
|
},
|
|
196
205
|
keyframes: keyframes.map((keyframe) => {
|
|
197
206
|
return {
|
|
198
|
-
frameOffset: keyframe.frame - firstFrame,
|
|
207
|
+
frameOffset: (keyframe.frame - firstFrame) / firstResolved.keyframePlaybackRate,
|
|
199
208
|
value: keyframe.value,
|
|
200
209
|
};
|
|
201
210
|
}),
|
|
@@ -260,7 +269,12 @@ const getPasteKeyframeTarget = ({ selectedItems, payload, timelinePosition, sequ
|
|
|
260
269
|
return { type: 'multiple' };
|
|
261
270
|
}
|
|
262
271
|
const keyframes = payload.keyframes.map((keyframe) => ({
|
|
263
|
-
sourceFrame:
|
|
272
|
+
sourceFrame: (0, get_timeline_keyframes_1.getKeyframeSourceFrame)({
|
|
273
|
+
displayFrame: timelinePosition + keyframe.frameOffset,
|
|
274
|
+
keyframeDisplayOffset: resolved.keyframeDisplayOffset,
|
|
275
|
+
keyframePlaybackRate: resolved.keyframePlaybackRate,
|
|
276
|
+
propStatus: resolved.propStatus,
|
|
277
|
+
}),
|
|
264
278
|
value: keyframe.value,
|
|
265
279
|
}));
|
|
266
280
|
const firstFrame = (_b = keyframes[0]) === null || _b === void 0 ? void 0 : _b.sourceFrame;
|
|
@@ -17,20 +17,23 @@ export declare const splitTimelineSequenceFromSource: ({ nodePathInfo, splitFram
|
|
|
17
17
|
nodePathInfo: SequenceNodePathInfo;
|
|
18
18
|
splitFrame: number;
|
|
19
19
|
}) => Promise<boolean>;
|
|
20
|
-
export declare const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}) => boolean
|
|
26
|
-
export declare const splitSelectedTimelineItems: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame,
|
|
20
|
+
export declare const splitTimelineSequencesFromSource: ({ sequences, }: {
|
|
21
|
+
sequences: {
|
|
22
|
+
nodePathInfo: SequenceNodePathInfo;
|
|
23
|
+
splitFrame: number;
|
|
24
|
+
}[];
|
|
25
|
+
}) => Promise<boolean>;
|
|
26
|
+
export declare const splitSelectedTimelineItems: ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequences, notify, }: {
|
|
27
27
|
selections: readonly import("@remotion/canvas").CanvasSelectionItem[];
|
|
28
28
|
sequences: TSequence[];
|
|
29
29
|
overrideIdsToNodePaths: OverrideIdToNodePaths;
|
|
30
30
|
propStatuses: PropStatuses | undefined;
|
|
31
31
|
splitFrame: number;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
splitSequences?: ((options: {
|
|
33
|
+
sequences: {
|
|
34
|
+
nodePathInfo: SequenceNodePathInfo;
|
|
35
|
+
splitFrame: number;
|
|
36
|
+
}[];
|
|
35
37
|
}) => Promise<boolean>) | undefined;
|
|
38
|
+
notify?: ((message: string, durationInMs: number) => void) | undefined;
|
|
36
39
|
}) => Promise<boolean> | null;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.splitSelectedTimelineItems = exports.
|
|
3
|
+
exports.splitSelectedTimelineItems = exports.splitTimelineSequencesFromSource = exports.splitTimelineSequenceFromSource = exports.getTimelineSequenceSplitEligibility = void 0;
|
|
4
4
|
const studio_shared_1 = require("@remotion/studio-shared");
|
|
5
5
|
const remotion_1 = require("remotion");
|
|
6
6
|
const NotificationCenter_1 = require("../Notifications/NotificationCenter");
|
|
@@ -88,12 +88,22 @@ const getTimelineSequenceSplitEligibility = ({ selection, sequence, splitFrame,
|
|
|
88
88
|
};
|
|
89
89
|
exports.getTimelineSequenceSplitEligibility = getTimelineSequenceSplitEligibility;
|
|
90
90
|
const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
|
|
91
|
-
|
|
91
|
+
return (0, exports.splitTimelineSequencesFromSource)({
|
|
92
|
+
sequences: [{ nodePathInfo, splitFrame }],
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
exports.splitTimelineSequenceFromSource = splitTimelineSequenceFromSource;
|
|
96
|
+
const splitTimelineSequencesFromSource = ({ sequences, }) => {
|
|
92
97
|
return (0, split_jsx_sequence_api_1.splitJsxSequence)({
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
sequences: sequences.map(({ nodePathInfo, splitFrame }) => {
|
|
99
|
+
const nodePath = nodePathInfo.sequenceSubscriptionKey;
|
|
100
|
+
return {
|
|
101
|
+
fileName: nodePath.absolutePath,
|
|
102
|
+
nodePath: nodePath.nodePath,
|
|
103
|
+
sequenceKeys: nodePath.sequenceKeys,
|
|
104
|
+
splitFrame,
|
|
105
|
+
};
|
|
106
|
+
}),
|
|
97
107
|
})
|
|
98
108
|
.then((result) => {
|
|
99
109
|
if (result.success) {
|
|
@@ -107,41 +117,57 @@ const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
|
|
|
107
117
|
return false;
|
|
108
118
|
});
|
|
109
119
|
};
|
|
110
|
-
exports.
|
|
111
|
-
const
|
|
112
|
-
exports.shouldHandleTimelineDuplicateShortcut = shouldHandleTimelineDuplicateShortcut;
|
|
113
|
-
const shouldHandleTimelineSplitShortcut = ({ shiftKey, }) => shiftKey;
|
|
114
|
-
exports.shouldHandleTimelineSplitShortcut = shouldHandleTimelineSplitShortcut;
|
|
115
|
-
const splitSelectedTimelineItems = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequence = exports.splitTimelineSequenceFromSource, }) => {
|
|
120
|
+
exports.splitTimelineSequencesFromSource = splitTimelineSequencesFromSource;
|
|
121
|
+
const splitSelectedTimelineItems = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, splitFrame, splitSequences = exports.splitTimelineSequencesFromSource, notify = NotificationCenter_1.showNotification, }) => {
|
|
116
122
|
var _a;
|
|
117
|
-
if (selections.length
|
|
123
|
+
if (selections.length === 0 ||
|
|
124
|
+
selections.some((selection) => selection.type !== 'sequence')) {
|
|
118
125
|
return null;
|
|
119
126
|
}
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
127
|
+
const eligible = [];
|
|
128
|
+
const skippedReasons = [];
|
|
129
|
+
for (const selection of selections) {
|
|
130
|
+
if (selection.type !== 'sequence') {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const track = (0, find_track_for_node_path_info_1.findTrackForNodePathInfo)({
|
|
134
|
+
sequences,
|
|
135
|
+
overrideIdsToNodePaths,
|
|
136
|
+
nodePathInfo: selection.nodePathInfo,
|
|
137
|
+
});
|
|
138
|
+
const sequencePropStatuses = propStatuses
|
|
139
|
+
? remotion_1.Internals.getPropStatusesCtx(propStatuses, selection.nodePathInfo.sequenceSubscriptionKey)
|
|
140
|
+
: undefined;
|
|
141
|
+
const eligibility = (0, exports.getTimelineSequenceSplitEligibility)({
|
|
142
|
+
selection,
|
|
143
|
+
sequence: (_a = track === null || track === void 0 ? void 0 : track.sequence) !== null && _a !== void 0 ? _a : null,
|
|
144
|
+
splitFrame,
|
|
145
|
+
propStatuses: sequencePropStatuses,
|
|
146
|
+
});
|
|
147
|
+
if (eligibility.canSplit) {
|
|
148
|
+
eligible.push({
|
|
149
|
+
nodePathInfo: eligibility.nodePathInfo,
|
|
150
|
+
splitFrame: track
|
|
151
|
+
? (splitFrame - track.keyframeDisplayOffset) *
|
|
152
|
+
track.keyframePlaybackRate
|
|
153
|
+
: splitFrame,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
skippedReasons.push(eligibility.reason);
|
|
158
|
+
}
|
|
123
159
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
129
|
-
const sequencePropStatuses = propStatuses
|
|
130
|
-
? remotion_1.Internals.getPropStatusesCtx(propStatuses, selection.nodePathInfo.sequenceSubscriptionKey)
|
|
131
|
-
: undefined;
|
|
132
|
-
const eligibility = (0, exports.getTimelineSequenceSplitEligibility)({
|
|
133
|
-
selection,
|
|
134
|
-
sequence: (_a = track === null || track === void 0 ? void 0 : track.sequence) !== null && _a !== void 0 ? _a : null,
|
|
135
|
-
splitFrame,
|
|
136
|
-
propStatuses: sequencePropStatuses,
|
|
137
|
-
});
|
|
138
|
-
if (!eligibility.canSplit) {
|
|
139
|
-
(0, NotificationCenter_1.showNotification)(eligibility.reason, 4000);
|
|
160
|
+
if (eligible.length === 0) {
|
|
161
|
+
notify(selections.length === 1
|
|
162
|
+
? skippedReasons[0]
|
|
163
|
+
: `None of the ${selections.length} selected clips can be split at the playhead`, 4000);
|
|
140
164
|
return Promise.resolve(false);
|
|
141
165
|
}
|
|
142
|
-
return
|
|
143
|
-
|
|
144
|
-
|
|
166
|
+
return splitSequences({ sequences: eligible }).then((success) => {
|
|
167
|
+
if (success && skippedReasons.length > 0) {
|
|
168
|
+
notify(`Split ${eligible.length} ${eligible.length === 1 ? 'clip' : 'clips'}. Skipped ${skippedReasons.length} ${skippedReasons.length === 1 ? 'clip' : 'clips'} that could not be split.`, 4000);
|
|
169
|
+
}
|
|
170
|
+
return success;
|
|
145
171
|
});
|
|
146
172
|
};
|
|
147
173
|
exports.splitSelectedTimelineItems = splitSelectedTimelineItems;
|
|
@@ -240,6 +240,7 @@ const formatTimelineFieldValueForDisplay = ({ fieldSchema, value, }) => {
|
|
|
240
240
|
case 'uv-coordinate':
|
|
241
241
|
return ((_e = formatUvCoordinateTimelineFieldValueForDisplay({ fieldSchema, value })) !== null && _e !== void 0 ? _e : formatUnknownTimelineValueForDisplay(value));
|
|
242
242
|
case 'text-content':
|
|
243
|
+
case 'svg-path':
|
|
243
244
|
return String(value);
|
|
244
245
|
case 'asset':
|
|
245
246
|
case 'array':
|
|
@@ -6,6 +6,7 @@ const timeline_row_layout_1 = require("./timeline-row-layout");
|
|
|
6
6
|
exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
|
|
7
7
|
const isTimelineFieldStacked = ({ field, transform3DMode, }) => {
|
|
8
8
|
return (field.typeName === 'text-content' ||
|
|
9
|
+
field.typeName === 'svg-path' ||
|
|
9
10
|
(transform3DMode &&
|
|
10
11
|
(field.typeName === 'translate' ||
|
|
11
12
|
field.typeName === 'rotation-css' ||
|
|
@@ -55,17 +55,9 @@ const useDeleteTimelineItems = () => {
|
|
|
55
55
|
timelinePosition,
|
|
56
56
|
});
|
|
57
57
|
if (deletePromise !== null) {
|
|
58
|
-
|
|
59
|
-
.then((deleted) => {
|
|
60
|
-
if (!deleted) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
58
|
+
const updateSelectionAfterDeletion = () => {
|
|
63
59
|
const nextSelection = (0, delete_selected_timeline_item_1.getTimelineSelectionAfterDeletingItems)({
|
|
64
60
|
selections: selectedItems,
|
|
65
|
-
sequences,
|
|
66
|
-
overrideIdsToNodePaths: overrideIdToNodePathMappings,
|
|
67
|
-
propStatuses,
|
|
68
|
-
timelinePosition,
|
|
69
61
|
});
|
|
70
62
|
if (nextSelection.length === 0) {
|
|
71
63
|
clearSelection();
|
|
@@ -73,8 +65,22 @@ const useDeleteTimelineItems = () => {
|
|
|
73
65
|
else {
|
|
74
66
|
selectItems(nextSelection);
|
|
75
67
|
}
|
|
76
|
-
}
|
|
77
|
-
|
|
68
|
+
};
|
|
69
|
+
if (selectedItems.some((item) => item.type === 'keyframe')) {
|
|
70
|
+
// Keyframes are removed optimistically. Update selection in the same
|
|
71
|
+
// event so easing segments cannot inherit the deleted segments' indices.
|
|
72
|
+
updateSelectionAfterDeletion();
|
|
73
|
+
deletePromise.catch(() => undefined);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
deletePromise
|
|
77
|
+
.then((deleted) => {
|
|
78
|
+
if (deleted) {
|
|
79
|
+
updateSelectionAfterDeletion();
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
.catch(() => undefined);
|
|
83
|
+
}
|
|
78
84
|
return;
|
|
79
85
|
}
|
|
80
86
|
const easingSelections = (0, update_selected_easing_1.getEasingSelections)(selectedItems);
|
|
@@ -8,10 +8,11 @@ export type ExpandedTrackKeyframeRow = {
|
|
|
8
8
|
readonly nodePathInfo: SequenceNodePathInfo;
|
|
9
9
|
readonly rowKey: string;
|
|
10
10
|
};
|
|
11
|
-
export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, }: {
|
|
11
|
+
export declare const useExpandedTrackKeyframeRows: ({ sequence, nodePathInfo, keyframeDisplayOffset, keyframePlaybackRate, }: {
|
|
12
12
|
sequence: TSequence;
|
|
13
13
|
nodePathInfo: SequenceNodePathInfo;
|
|
14
14
|
keyframeDisplayOffset: number;
|
|
15
|
+
keyframePlaybackRate: number;
|
|
15
16
|
}) => {
|
|
16
17
|
readonly rows: ExpandedTrackKeyframeRow[];
|
|
17
18
|
readonly expandedHeight: number;
|