@remotion/studio 4.0.499 → 4.0.500

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/components/AssetSelector.js +8 -6
  2. package/dist/components/AssetSelectorItem.d.ts +24 -0
  3. package/dist/components/AssetSelectorItem.js +113 -80
  4. package/dist/components/CompositionSelector.js +2 -32
  5. package/dist/components/ControlButton.js +1 -0
  6. package/dist/components/ExplorerPanel.js +2 -1
  7. package/dist/components/ExplorerPanelRef.d.ts +2 -0
  8. package/dist/components/GlobalKeybindings.js +7 -1
  9. package/dist/components/InlineAction.d.ts +2 -1
  10. package/dist/components/InlineAction.js +2 -2
  11. package/dist/components/InlineDropdown.d.ts +1 -1
  12. package/dist/components/InlineDropdown.js +3 -2
  13. package/dist/components/InspectorPanel/AlignmentControls.d.ts +2 -2
  14. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  15. package/dist/components/InspectorPanel/CompositionInspector.js +8 -7
  16. package/dist/components/InspectorPanel/CompositionMetadata.js +170 -57
  17. package/dist/components/InspectorPanel/ConnectedCompositionsSection.d.ts +2 -2
  18. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -3
  19. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +7 -7
  20. package/dist/components/InspectorPanel/common.d.ts +17 -4
  21. package/dist/components/InspectorPanel/common.js +60 -6
  22. package/dist/components/InspectorPanel/use-composition-actions.js +1 -0
  23. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +1 -1
  24. package/dist/components/InspectorSequenceSection.js +43 -19
  25. package/dist/components/KeyboardShortcutsExplainer.js +4 -2
  26. package/dist/components/Menu/MenuItem.js +2 -1
  27. package/dist/components/MenuCompositionName.js +30 -7
  28. package/dist/components/MenuToolbar.d.ts +0 -1
  29. package/dist/components/MenuToolbar.js +8 -7
  30. package/dist/components/MobilePanel.d.ts +2 -1
  31. package/dist/components/MobilePanel.js +29 -25
  32. package/dist/components/ModalContainer.d.ts +1 -0
  33. package/dist/components/ModalContainer.js +2 -2
  34. package/dist/components/Modals.js +1 -1
  35. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  36. package/dist/components/NewComposition/DismissableModal.js +2 -2
  37. package/dist/components/NewComposition/InputDragger.d.ts +7 -0
  38. package/dist/components/NewComposition/InputDragger.js +119 -8
  39. package/dist/components/OutlineToggle.d.ts +1 -3
  40. package/dist/components/OutlineToggle.js +2 -2
  41. package/dist/components/PreviewToolbar.js +10 -4
  42. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.d.ts +7 -0
  43. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +44 -0
  44. package/dist/components/QuickSwitcher/NoResults.d.ts +1 -1
  45. package/dist/components/QuickSwitcher/NoResults.js +1 -0
  46. package/dist/components/QuickSwitcher/QuickSwitcher.d.ts +5 -0
  47. package/dist/components/QuickSwitcher/QuickSwitcher.js +6 -2
  48. package/dist/components/QuickSwitcher/QuickSwitcherContent.d.ts +5 -0
  49. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +76 -12
  50. package/dist/components/QuickSwitcher/QuickSwitcherResult.d.ts +4 -0
  51. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +11 -8
  52. package/dist/components/QuickSwitcher/asset-search.d.ts +9 -0
  53. package/dist/components/QuickSwitcher/asset-search.js +42 -0
  54. package/dist/components/SelectedOutlineCropControls.d.ts +8 -0
  55. package/dist/components/SelectedOutlineCropControls.js +299 -0
  56. package/dist/components/SelectedOutlineElement.js +83 -43
  57. package/dist/components/SelectedOutlineOverlay.d.ts +2 -2
  58. package/dist/components/SelectedOutlineOverlay.js +130 -8
  59. package/dist/components/SequencePropsSubscriptionProvider.d.ts +2 -0
  60. package/dist/components/SequencePropsSubscriptionProvider.js +31 -3
  61. package/dist/components/SidebarCollapserControls.d.ts +3 -1
  62. package/dist/components/SidebarCollapserControls.js +34 -29
  63. package/dist/components/SnappingToggle.d.ts +1 -3
  64. package/dist/components/SnappingToggle.js +2 -2
  65. package/dist/components/Timeline/TimelineAssetField.d.ts +9 -1
  66. package/dist/components/Timeline/TimelineAssetField.js +52 -100
  67. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +7 -3
  68. package/dist/components/Timeline/TimelineClipboardKeybindings.js +65 -38
  69. package/dist/components/Timeline/TimelineColorField.js +20 -1
  70. package/dist/components/Timeline/TimelineEffectPropItem.js +8 -77
  71. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +1 -0
  72. package/dist/components/Timeline/TimelineHeightContainer.d.ts +2 -2
  73. package/dist/components/Timeline/TimelineKeyframeTracksContext.d.ts +3 -3
  74. package/dist/components/Timeline/TimelineList.d.ts +2 -2
  75. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +7 -1
  76. package/dist/components/Timeline/TimelineSelection.d.ts +5 -5
  77. package/dist/components/Timeline/TimelineSelection.js +8 -6
  78. package/dist/components/Timeline/TimelineSequence.js +1 -5
  79. package/dist/components/Timeline/TimelineSequenceItem.js +57 -10
  80. package/dist/components/Timeline/TimelineSequencePropItem.js +27 -75
  81. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +0 -1
  82. package/dist/components/Timeline/TimelineTrack.d.ts +2 -2
  83. package/dist/components/Timeline/TimelineTracks.d.ts +2 -2
  84. package/dist/components/Timeline/find-track-for-node-path-info.d.ts +1 -1
  85. package/dist/components/Timeline/get-sequence-context-menu-items.js +14 -12
  86. package/dist/components/Timeline/reset-selected-timeline-props.js +18 -10
  87. package/dist/components/Timeline/save-effect-prop.d.ts +10 -0
  88. package/dist/components/Timeline/save-effect-prop.js +52 -1
  89. package/dist/components/Timeline/should-show-track-in-timeline.d.ts +2 -2
  90. package/dist/components/Timeline/timeline-asset-link.js +17 -1
  91. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +4 -0
  92. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +9 -3
  93. package/dist/components/Timeline/use-timeline-height.d.ts +2 -2
  94. package/dist/components/TopPanel.js +2 -2
  95. package/dist/components/UndoRedoButtons.js +27 -5
  96. package/dist/components/composition-drop-preview.js +1 -0
  97. package/dist/components/menu-toolbar-height.d.ts +1 -0
  98. package/dist/components/menu-toolbar-height.js +4 -0
  99. package/dist/components/selected-outline-drag.d.ts +41 -4
  100. package/dist/components/selected-outline-drag.js +179 -2
  101. package/dist/components/selected-outline-geometry.d.ts +1 -0
  102. package/dist/components/selected-outline-measurement.d.ts +11 -0
  103. package/dist/components/selected-outline-measurement.js +64 -3
  104. package/dist/components/selected-outline-types.d.ts +44 -1
  105. package/dist/components/selected-outline-types.js +21 -1
  106. package/dist/error-overlay/remotion-overlay/Overlay.js +3 -3
  107. package/dist/error-overlay/remotion-overlay/ShortcutHint.js +2 -3
  108. package/dist/esm/{chunk-pk1zwsn1.js → chunk-dr1y1vm3.js} +8417 -7127
  109. package/dist/esm/internals.mjs +8417 -7127
  110. package/dist/esm/previewEntry.mjs +51241 -49953
  111. package/dist/esm/renderEntry.mjs +1 -1
  112. package/dist/helpers/calculate-timeline.d.ts +2 -2
  113. package/dist/helpers/calculate-timeline.js +8 -28
  114. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +3 -10
  115. package/dist/helpers/get-timeline-sequence-sort-key.js +5 -13
  116. package/dist/helpers/interactivity-enabled.d.ts +1 -0
  117. package/dist/helpers/interactivity-enabled.js +7 -2
  118. package/dist/helpers/is-mac.d.ts +1 -0
  119. package/dist/helpers/is-mac.js +4 -0
  120. package/dist/helpers/open-in-editor.d.ts +5 -1
  121. package/dist/helpers/open-in-editor.js +15 -1
  122. package/dist/helpers/sort-by-nonce-history.js +97 -19
  123. package/dist/helpers/use-keybinding.js +2 -3
  124. package/dist/helpers/use-menu-structure.js +10 -1
  125. package/dist/icons/caret.d.ts +1 -0
  126. package/dist/icons/caret.js +2 -2
  127. package/dist/icons/pen.d.ts +5 -0
  128. package/dist/icons/pen.js +8 -0
  129. package/dist/state/modals.d.ts +5 -0
  130. package/package.json +12 -12
  131. package/dist/helpers/get-timeline-sequence-hash.d.ts +0 -6
  132. package/dist/helpers/get-timeline-sequence-hash.js +0 -33
@@ -43,6 +43,7 @@ const TimelineKeyframeEasingLine_1 = require("./TimelineKeyframeEasingLine");
43
43
  const TimelineSelection_1 = require("./TimelineSelection");
44
44
  const TimelineWidthProvider_1 = require("./TimelineWidthProvider");
45
45
  const row = {
46
+ overflow: 'hidden',
46
47
  position: 'relative',
47
48
  };
48
49
  const rowSeparator = {
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineHeightContainer: React.NamedExoticComponent<{
4
- readonly shown: TrackWithHash[];
4
+ readonly shown: TimelineTrackData[];
5
5
  readonly hasBeenCut: boolean;
6
6
  readonly children: React.ReactNode;
7
7
  }>;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineKeyframeTracksProvider: React.FC<{
4
- readonly tracks: readonly TrackWithHash[];
4
+ readonly tracks: readonly TimelineTrackData[];
5
5
  readonly children: React.ReactNode;
6
6
  }>;
7
- export declare const useTimelineKeyframeTracks: () => readonly TrackWithHash[];
7
+ export declare const useTimelineKeyframeTracks: () => readonly TimelineTrackData[];
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineList: React.FC<{
4
- readonly timeline: TrackWithHash[];
4
+ readonly timeline: TimelineTrackData[];
5
5
  }>;
@@ -17,6 +17,12 @@ const TimelineUvCoordinateField_1 = require("./TimelineUvCoordinateField");
17
17
  const inlineWrapper = {
18
18
  fontSize: 12,
19
19
  };
20
+ const assetInlineWrapper = {
21
+ ...inlineWrapper,
22
+ display: 'flex',
23
+ flex: 1,
24
+ minWidth: 0,
25
+ };
20
26
  const isTimelinePrimitiveFieldInfo = (field) => {
21
27
  return field.typeName !== 'array' && field.fieldSchema.type !== 'array';
22
28
  };
@@ -60,7 +66,7 @@ const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragE
60
66
  return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineFontFamilyField_1.TimelineFontFamilyField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
61
67
  }
62
68
  if (field.typeName === 'asset') {
63
- return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineAssetField_1.TimelineAssetField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
69
+ return (jsx_runtime_1.jsx("span", { style: assetInlineWrapper, children: jsx_runtime_1.jsx(TimelineAssetField_1.TimelineAssetField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
64
70
  }
65
71
  throw new Error(`Unsupported field type: ${field.typeName}`);
66
72
  };
@@ -1,6 +1,6 @@
1
1
  import React, { type CSSProperties } from 'react';
2
2
  import { type GetDragOverrides, type GetEffectDragOverrides, type PropStatuses } from 'remotion';
3
- import type { SequenceNodePathInfo, TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
3
+ import type { SequenceNodePathInfo, TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
4
4
  import { type GetIsExpanded } from '../ExpandedTracksProvider';
5
5
  export declare const TIMELINE_SELECTED_BACKGROUND = "#3B3F42";
6
6
  export declare const TIMELINE_SELECTED_LABEL_BACKGROUND = "#B0B0B0";
@@ -145,23 +145,23 @@ type TimelineSelectionOptions = {
145
145
  };
146
146
  export declare const getTimelineSelectionFromNodePathInfo: (nodePathInfo: SequenceNodePathInfo | null) => TimelineSelection | null;
147
147
  export declare const getTimelineSelectionKey: (item: TimelineSelection) => string;
148
- export declare const getSelectableTimelineSequenceSelections: (tracks: readonly Pick<TrackWithHash, "nodePathInfo">[]) => TimelineSelection[];
148
+ export declare const getSelectableTimelineSequenceSelections: (tracks: readonly Pick<TimelineTrackData, "nodePathInfo">[]) => TimelineSelection[];
149
149
  export declare const getSelectableTimelineItems: ({ getDragOverrides, getEffectDragOverrides, getIsExpanded, propStatuses, selectedItems, timeline, timelinePosition, }: {
150
150
  readonly getDragOverrides: GetDragOverrides;
151
151
  readonly getEffectDragOverrides: GetEffectDragOverrides;
152
152
  readonly getIsExpanded: GetIsExpanded;
153
153
  readonly propStatuses: PropStatuses;
154
154
  readonly selectedItems: readonly TimelineSelection[];
155
- readonly timeline: readonly TrackWithHash[];
155
+ readonly timeline: readonly TimelineTrackData[];
156
156
  readonly timelinePosition: number;
157
157
  }) => TimelineSelection[];
158
158
  export declare const getTimelineSequenceSelectionKey: (nodePathInfo: SequenceNodePathInfo) => string;
159
159
  export declare const TimelineSelectAllKeybindings: React.FC<{
160
- readonly timeline: readonly TrackWithHash[];
160
+ readonly timeline: readonly TimelineTrackData[];
161
161
  }>;
162
162
  export declare const TimelineSelectableItemsProvider: React.FC<{
163
163
  readonly children: React.ReactNode;
164
- readonly timeline: readonly TrackWithHash[];
164
+ readonly timeline: readonly TimelineTrackData[];
165
165
  }>;
166
166
  export declare const TimelineSelectionProvider: React.FC<{
167
167
  readonly children: React.ReactNode;
@@ -595,9 +595,9 @@ const TimelineSelectionProvider = ({ children }) => {
595
595
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
596
596
  const timelineSelectionScope = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? canvasContent.compositionId : null;
597
597
  const { expandParentTracks } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
598
- const canSelect = (0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
599
- previewServerState.type === 'connected' &&
600
- !window.remotion_isReadOnlyStudio;
598
+ const canSelect = (0, interactivity_enabled_1.isStudioSelectionEnabled)() &&
599
+ (previewServerState.type === 'connected' ||
600
+ window.remotion_isReadOnlyStudio);
601
601
  const [selectedItems, setSelectedItems] = (0, react_1.useState)([]);
602
602
  const selectionAnchor = (0, react_1.useRef)(null);
603
603
  const selectionScope = (0, react_1.useRef)(null);
@@ -614,7 +614,8 @@ const TimelineSelectionProvider = ({ children }) => {
614
614
  setSelectedItems([]);
615
615
  }
616
616
  }, [canSelect]);
617
- const canSelectItem = (0, react_1.useCallback)((_item) => canSelect, [canSelect]);
617
+ const canSelectItem = (0, react_1.useCallback)((item) => canSelect &&
618
+ (!window.remotion_isReadOnlyStudio || item.type === 'sequence'), [canSelect]);
618
619
  const getCurrentAvailableSelectionState = (0, react_1.useCallback)((currentSelectedItems) => {
619
620
  if (selectionScope.current !== timelineSelectionScope) {
620
621
  return exports.EMPTY_TIMELINE_SELECTION_STATE;
@@ -867,8 +868,9 @@ const TimelineSelectionProvider = ({ children }) => {
867
868
  ]);
868
869
  const currentSelection = (0, react_1.useRef)(value);
869
870
  currentSelection.current = value;
870
- return (jsx_runtime_1.jsx(CurrentTimelineSelectionContext.Provider, { value: currentSelection, children: jsx_runtime_1.jsxs(TimelineSelectionContext.Provider, { value: value, children: [children, jsx_runtime_1.jsx(TimelineEscapeKeybindings, {}), jsx_runtime_1.jsx(TimelineClipboardKeybindings_1.TimelineClipboardKeybindings, {}), jsx_runtime_1.jsx(TimelineDeleteKeybindings_1.TimelineDeleteKeybindings, {})
871
- ] }) }));
871
+ return (jsx_runtime_1.jsx(CurrentTimelineSelectionContext.Provider, { value: currentSelection, children: jsx_runtime_1.jsxs(TimelineSelectionContext.Provider, { value: value, children: [children, jsx_runtime_1.jsx(TimelineEscapeKeybindings, {}), (0, interactivity_enabled_1.isStudioInteractivityEnabled)() ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
872
+ jsx_runtime_1.jsx(TimelineClipboardKeybindings_1.TimelineClipboardKeybindings, {}), jsx_runtime_1.jsx(TimelineDeleteKeybindings_1.TimelineDeleteKeybindings, {})
873
+ ] })) : null] }) }));
872
874
  };
873
875
  exports.TimelineSelectionProvider = TimelineSelectionProvider;
874
876
  const useTimelineSelection = () => {
@@ -341,9 +341,6 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
341
341
  validatedSource: (_f = validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source) !== null && _f !== void 0 ? _f : null,
342
342
  });
343
343
  const contextMenuValues = (0, react_1.useMemo)(() => {
344
- if (!previewConnected) {
345
- return [];
346
- }
347
344
  return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
348
345
  assetLinkInfo,
349
346
  canOpenInEditor,
@@ -376,7 +373,6 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
376
373
  onDuplicateSequenceFromSource,
377
374
  openInEditor,
378
375
  originalLocation,
379
- previewConnected,
380
376
  s,
381
377
  selectAsset,
382
378
  ]);
@@ -462,6 +458,6 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
462
458
  return null;
463
459
  }
464
460
  const sequence = (jsx_runtime_1.jsxs(TimelineSequenceCurrentFrame, { s: s, displayDurationInFrames: displayDurationInFrames, premountWidth: premountWidth, postmountWidth: postmountWidth, style: style, nodePathInfo: nodePathInfo, sequenceFrameOffset: sequenceFrameOffset, fromCanUpdate: fromCanUpdate, frozenFrame: frozenFrame, onMoveDragPointerDown: onMoveDragPointerDown, onDoubleClick: canHandleSequenceDoubleClick ? onSequenceDoubleClick : undefined, children: [s.type === 'audio' ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(AudioWaveform_1.AudioWaveform, { src: s.src, height: timeline_layout_1.TIMELINE_LAYER_HEIGHT_AUDIO, doesVolumeChange: s.doesVolumeChange, visualizationWidth: mediaVisualizationLayout.width, startFrom: s.startMediaFrom, durationInFrames: s.duration, volume: s.volume, playbackRate: s.playbackRate, loopDisplay: s.loopDisplay }) })) : null, s.type === 'video' ? (jsx_runtime_1.jsx(TimelineVideoInfo_1.TimelineVideoInfo, { src: s.src, visualizationWidth: width, naturalWidth: naturalWidth, startMediaFrom: s.startMediaFrom, mediaFrameAtSequenceZero: s.mediaFrameAtSequenceZero, sequenceFrameOffset: sequenceFrameOffset, durationInFrames: s.duration, playbackRate: s.playbackRate, volume: s.volume, doesVolumeChange: s.doesVolumeChange, premountWidth: premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0, postmountWidth: postmountWidth !== null && postmountWidth !== void 0 ? postmountWidth : 0, loopDisplay: s.loopDisplay, frozenMediaFrame: s.frozenMediaFrame, extendLastFrame: extendVideoLastFrame })) : null, s.type === 'image' ? (jsx_runtime_1.jsx("div", { style: mediaVisualizationStyle, children: jsx_runtime_1.jsx(TimelineImageInfo_1.TimelineImageInfo, { src: s.src, visualizationWidth: mediaVisualizationLayout.width }) })) : null, s.loopDisplay === undefined ? null : (jsx_runtime_1.jsx(LoopedTimelineIndicators_1.LoopedTimelineIndicator, { loops: s.loopDisplay.numberOfTimes })), showLeftEdgeDragHandle && nodePathInfo && validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceLeftEdgeDragHandle, { nodePathInfo: nodePathInfo, windowWidth: windowWidth, timelineDurationInFrames: (_h = video.durationInFrames) !== null && _h !== void 0 ? _h : 1 })) : null, showRightEdgeDragHandle && nodePathInfo && validatedLocation ? (jsx_runtime_1.jsx(TimelineSequenceRightEdgeDragHandle_1.TimelineSequenceRightEdgeDragHandle, { nodePathInfo: nodePathInfo, windowWidth: windowWidth, timelineDurationInFrames: (_j = video.durationInFrames) !== null && _j !== void 0 ? _j : 1 })) : null] }));
465
- return previewConnected ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: onContextMenuOpen, children: sequence })) : (sequence);
461
+ return previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: onContextMenuOpen, children: sequence })) : (sequence);
466
462
  };
467
463
  exports.TimelineSequence = react_1.default.memo(TimelineSequenceFn);
@@ -55,6 +55,7 @@ const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
55
55
  const InitialCompositionLoader_1 = require("../InitialCompositionLoader");
56
56
  const layout_1 = require("../layout");
57
57
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
58
+ const selected_outline_types_1 = require("../selected-outline-types");
58
59
  const use_select_asset_1 = require("../use-select-asset");
59
60
  const disable_sequence_interactivity_1 = require("./disable-sequence-interactivity");
60
61
  const duplicate_selected_timeline_item_1 = require("./duplicate-selected-timeline-item");
@@ -186,7 +187,7 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
186
187
  const selectAsset = (0, use_select_asset_1.useSelectAsset)();
187
188
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
188
189
  const { onSelect, selectable, selected, selectionItem } = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
189
- const { selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
190
+ const { selectItem, selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
190
191
  const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(nodePathInfo);
191
192
  const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
192
193
  const [isRenaming, setIsRenaming] = (0, react_1.useState)(false);
@@ -651,6 +652,29 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
651
652
  const canAddEffect = (nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.supportsEffects) === true &&
652
653
  previewInteractive &&
653
654
  Boolean(validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source);
655
+ const canCrop = (0, react_1.useMemo)(() => {
656
+ if (!previewInteractive ||
657
+ !sequence.controls ||
658
+ !nodePathInfo ||
659
+ !propStatusesForOverride ||
660
+ !(validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source)) {
661
+ return false;
662
+ }
663
+ const activeSchema = remotion_1.Internals.flattenActiveSchema(sequence.controls.schema, (key) => {
664
+ var _a;
665
+ return (_a = sequence.controls) === null || _a === void 0 ? void 0 : _a.currentRuntimeValueDotNotation[key];
666
+ });
667
+ return (0, selected_outline_types_1.canEditSelectedOutlineCrop)({
668
+ schema: activeSchema,
669
+ propStatuses: propStatusesForOverride,
670
+ });
671
+ }, [
672
+ nodePathInfo,
673
+ previewInteractive,
674
+ propStatusesForOverride,
675
+ sequence.controls,
676
+ validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source,
677
+ ]);
654
678
  const onAddEffect = (0, react_1.useCallback)(() => {
655
679
  if (!canAddEffect ||
656
680
  previewServerState.type !== 'connected' ||
@@ -671,10 +695,20 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
671
695
  setSelectedModal,
672
696
  validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source,
673
697
  ]);
674
- const contextMenuValues = (0, react_1.useMemo)(() => {
675
- if (!previewConnected) {
676
- return [];
698
+ const onCrop = (0, react_1.useCallback)(() => {
699
+ if (!canCrop || !nodePathInfo) {
700
+ return;
677
701
  }
702
+ selectItem({
703
+ type: 'sequence-prop',
704
+ nodePathInfo: {
705
+ ...nodePathInfo,
706
+ auxiliaryKeys: ['controls', selected_outline_types_1.cropFieldKeys.left],
707
+ },
708
+ key: selected_outline_types_1.cropFieldKeys.left,
709
+ }, undefined, undefined, { reveal: true });
710
+ }, [canCrop, nodePathInfo, selectItem]);
711
+ const contextMenuValues = (0, react_1.useMemo)(() => {
678
712
  return (0, get_sequence_context_menu_items_1.getSequenceContextMenuItems)({
679
713
  assetLinkInfo,
680
714
  canOpenInEditor,
@@ -706,12 +740,24 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
706
740
  subMenu: null,
707
741
  value: 'add-effect',
708
742
  },
709
- {
710
- type: 'divider',
711
- id: 'add-effect-divider',
712
- },
713
743
  ]
714
744
  : []),
745
+ {
746
+ type: 'item',
747
+ id: 'crop',
748
+ keyHint: null,
749
+ label: 'Crop',
750
+ leftItem: null,
751
+ disabled: !canCrop,
752
+ onClick: onCrop,
753
+ quickSwitcherLabel: null,
754
+ subMenu: null,
755
+ value: 'crop',
756
+ },
757
+ {
758
+ type: 'divider',
759
+ id: 'crop-divider',
760
+ },
715
761
  {
716
762
  type: 'item',
717
763
  id: 'rename-sequence',
@@ -733,6 +779,7 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
733
779
  }, [
734
780
  assetLinkInfo,
735
781
  canAddEffect,
782
+ canCrop,
736
783
  canOpenInEditor,
737
784
  canRenameThisSequence,
738
785
  deleteDisabled,
@@ -742,13 +789,13 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
742
789
  freezeFrameMenuItem,
743
790
  nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.supportsEffects,
744
791
  onAddEffect,
792
+ onCrop,
745
793
  onDeleteSequenceFromSource,
746
794
  onDisableSequenceInteractivity,
747
795
  onDuplicateSequenceFromSource,
748
796
  onRenameSequence,
749
797
  openInEditor,
750
798
  originalLocation,
751
- previewConnected,
752
799
  selectAsset,
753
800
  sequence,
754
801
  ]);
@@ -818,7 +865,7 @@ const TimelineSequenceItem = ({ children, connectedCompositions, nestedDepth, se
818
865
  jsx_runtime_1.jsx(TimelineMediaInfo_1.TimelineMediaInfo, { src: mediaSrc })
819
866
  ] })) : null] }) }));
820
867
  const draggableTrackRow = canHandleSequenceDrag ? (jsx_runtime_1.jsxs("div", { draggable: canReorderSequence, onDragStart: onSequenceDragStart, onDragEnd: onSequenceDragEnd, onDragOver: onSequenceDragOver, onDragLeave: onSequenceDragLeave, onDrop: onSequenceDrop, style: sequenceReorderWrapper, children: [sequenceReorderLineStyle ? (jsx_runtime_1.jsx("div", { style: sequenceReorderLineStyle })) : null, sequenceDropRejection ? (jsx_runtime_1.jsx("div", { style: sequenceReorderRejectionStyle, children: sequenceDropRejection })) : null, trackRow] })) : (trackRow);
821
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [previewConnected ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selectable ? onSelect : null, children: draggableTrackRow })) : (draggableTrackRow), previewConnected &&
868
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [previewConnected || window.remotion_isReadOnlyStudio ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selectable ? onSelect : null, children: draggableTrackRow })) : (draggableTrackRow), previewConnected &&
822
869
  (0, interactivity_enabled_1.isStudioInteractivityEnabled)() &&
823
870
  isExpanded &&
824
871
  hasExpandableContent &&
@@ -6,9 +6,10 @@ const studio_shared_1 = require("@remotion/studio-shared");
6
6
  const react_1 = require("react");
7
7
  const remotion_1 = require("remotion");
8
8
  const client_id_1 = require("../../helpers/client-id");
9
+ const open_in_editor_1 = require("../../helpers/open-in-editor");
9
10
  const ContextMenu_1 = require("../ContextMenu");
11
+ const InspectorPanelLayout_1 = require("../InspectorPanelLayout");
10
12
  const call_add_keyframe_1 = require("./call-add-keyframe");
11
- const get_animation_item_selection_for_frame_1 = require("./get-animation-item-selection-for-frame");
12
13
  const save_sequence_prop_1 = require("./save-sequence-prop");
13
14
  const TimelineExpandArrowButton_1 = require("./TimelineExpandArrowButton");
14
15
  const TimelineFieldRowContent_1 = require("./TimelineFieldRowContent");
@@ -18,8 +19,17 @@ const TimelineLayerEye_1 = require("./TimelineLayerEye");
18
19
  const TimelineRowChrome_1 = require("./TimelineRowChrome");
19
20
  const TimelineSchemaField_1 = require("./TimelineSchemaField");
20
21
  const TimelineSelection_1 = require("./TimelineSelection");
21
- const update_selected_easing_1 = require("./update-selected-easing");
22
22
  const fieldRowBase = {};
23
+ const inlineSourceFieldRow = {
24
+ alignItems: 'stretch',
25
+ display: 'flex',
26
+ minWidth: 0,
27
+ width: '100%',
28
+ };
29
+ const computedSourceFieldRow = {
30
+ boxSizing: 'border-box',
31
+ paddingInline: InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING,
32
+ };
23
33
  const isKeyframedStatus = (status) => {
24
34
  return status.status === 'keyframed';
25
35
  };
@@ -167,9 +177,6 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
167
177
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
168
178
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
169
179
  const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
170
- const { selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
171
- const setFrame = remotion_1.Internals.useTimelineSetFrame();
172
- const videoConfig = (0, remotion_1.useVideoConfig)();
173
180
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
174
181
  const sourceFrame = timelinePosition - keyframeDisplayOffset;
175
182
  const propStatusesForOverride = remotion_1.Internals.getPropStatusesCtx(visualModePropStatuses, nodePath);
@@ -267,84 +274,29 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
267
274
  },
268
275
  ];
269
276
  }, [canShowReset, onReset]);
270
- const seekToDisplayFrame = (0, react_1.useCallback)((frame) => {
271
- setFrame((current) => {
272
- const next = { ...current, [videoConfig.id]: frame };
273
- remotion_1.Internals.persistCurrentFrame(next);
274
- return next;
275
- });
276
- }, [setFrame, videoConfig.id]);
277
277
  const onPropertyDoubleClick = (0, react_1.useCallback)((event) => {
278
- if (propStatus === null || propStatus.status === 'computed') {
279
- return;
280
- }
281
- const keyframeSelection = {
282
- type: 'keyframe',
283
- nodePathInfo,
284
- frame: sourceFrame + keyframeDisplayOffset,
285
- };
286
- if (propStatus.status === 'static') {
287
- if (!keyframable || previewServerState.type !== 'connected') {
288
- return;
289
- }
290
- const value = remotion_1.Internals.getEffectiveVisualModeValue({
291
- propStatus,
292
- dragOverrideValue,
293
- frame: sourceFrame,
294
- defaultValue: field.fieldSchema.default,
295
- shouldResortToDefaultValueIfUndefined: true,
296
- });
297
- event.stopPropagation();
298
- (0, call_add_keyframe_1.callAddSequenceKeyframe)({
299
- fileName: validatedLocation.source,
300
- nodePath,
301
- fieldKey: field.key,
302
- sourceFrame,
303
- value,
304
- schema,
305
- setPropStatuses,
306
- clientId: previewServerState.clientId,
307
- }).catch(() => undefined);
308
- selectItems([keyframeSelection], { reveal: true });
309
- seekToDisplayFrame(keyframeSelection.frame);
310
- return;
311
- }
312
- const targetSelection = (0, get_animation_item_selection_for_frame_1.getAnimationItemSelectionForSourceFrame)({
313
- includeEasings: (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(propStatus.interpolationFunction),
314
- keyframeDisplayOffset,
315
- keyframes: propStatus.keyframes,
316
- nodePathInfo,
317
- sourceFrame,
318
- });
319
- if (targetSelection === null) {
278
+ var _a;
279
+ if (!window.remotion_editorName ||
280
+ previewServerState.type !== 'connected') {
320
281
  return;
321
282
  }
322
283
  event.stopPropagation();
323
- selectItems([targetSelection], { reveal: true });
324
- if (targetSelection.type === 'keyframe') {
325
- seekToDisplayFrame(targetSelection.frame);
326
- }
327
- }, [
328
- dragOverrideValue,
329
- field.fieldSchema.default,
330
- field.key,
331
- keyframeDisplayOffset,
332
- keyframable,
333
- nodePath,
334
- nodePathInfo,
335
- previewServerState,
336
- propStatus,
337
- schema,
338
- seekToDisplayFrame,
339
- selectItems,
340
- setPropStatuses,
341
- sourceFrame,
342
- validatedLocation.source,
343
- ]);
284
+ (0, open_in_editor_1.openOriginalPositionInEditorAtProperty)({
285
+ originalPosition: validatedLocation,
286
+ property: (_a = field.key.split('.').at(-1)) !== null && _a !== void 0 ? _a : field.key,
287
+ }).catch(() => undefined);
288
+ }, [field.key, previewServerState.type, validatedLocation]);
344
289
  if (propStatus === null) {
345
290
  return null;
346
291
  }
347
292
  const fieldValue = isKeyframedStatus(propStatus) ? (jsx_runtime_1.jsx(exports.TimelineSequenceKeyframedValue, { field: field, fileName: validatedLocation.source, nodePath: nodePath, schema: schema, propStatus: propStatus, sourceFrame: sourceFrame })) : propStatus.status === 'static' ? (jsx_runtime_1.jsx(Value, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, schema: schema, propStatus: propStatus })) : (jsx_runtime_1.jsx(TimelineSchemaField_1.TimelineNonEditableStatus, { propStatus: propStatus }));
293
+ if (field.typeName === 'asset' && field.key === 'src') {
294
+ return (jsx_runtime_1.jsx("div", { style: {
295
+ ...inlineSourceFieldRow,
296
+ ...(propStatus.status === 'computed' ? computedSourceFieldRow : null),
297
+ ...style,
298
+ }, children: fieldValue }));
299
+ }
348
300
  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 }) }));
349
301
  return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selection.selectable ? selection.onSelect : null, children: row }));
350
302
  };
@@ -107,7 +107,6 @@ const getMinimumSequenceDuration = ({ sequence, sequences, }) => {
107
107
  return 1;
108
108
  }
109
109
  const siblings = (0, sort_by_nonce_history_1.sortItemsByNonceHistory)(sequences.filter((candidate) => candidate.parent === sequence.parent &&
110
- candidate.rootId === sequence.rootId &&
111
110
  ((0, exports.isTransitionSeriesSequence)(candidate) ||
112
111
  isTransitionSeriesTransition(candidate))));
113
112
  const sequenceIndex = siblings.findIndex((candidate) => candidate.id === sequence.id);
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineTrack: React.NamedExoticComponent<{
4
- readonly track: TrackWithHash;
4
+ readonly track: TimelineTrackData;
5
5
  }>;
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineTracks: React.NamedExoticComponent<{
4
- readonly timeline: TrackWithHash[];
4
+ readonly timeline: TimelineTrackData[];
5
5
  readonly hasBeenCut: boolean;
6
6
  }>;
@@ -4,4 +4,4 @@ export declare const findTrackForNodePathInfo: ({ sequences, overrideIdsToNodePa
4
4
  sequences: TSequence[];
5
5
  overrideIdsToNodePaths: OverrideIdToNodePaths;
6
6
  nodePathInfo: SequenceNodePathInfo;
7
- }) => import("../../helpers/get-timeline-sequence-sort-key").TrackWithHash | undefined;
7
+ }) => import("../../helpers/get-timeline-sequence-sort-key").TimelineTrackData | undefined;
@@ -145,18 +145,20 @@ const getSequenceContextMenuItems = ({ assetLinkInfo, canOpenInEditor, deleteDis
145
145
  }
146
146
  : null,
147
147
  ...sourceActions,
148
- {
149
- type: 'item',
150
- id: 'disable-interactivity',
151
- keyHint: null,
152
- label: 'Disable interactivity',
153
- leftItem: null,
154
- disabled: disableInteractivityDisabled,
155
- onClick: onDisableSequenceInteractivity,
156
- quickSwitcherLabel: null,
157
- subMenu: null,
158
- value: 'disable-interactivity',
159
- },
148
+ includeSourceEditItems
149
+ ? {
150
+ type: 'item',
151
+ id: 'disable-interactivity',
152
+ keyHint: null,
153
+ label: 'Disable interactivity',
154
+ leftItem: null,
155
+ disabled: disableInteractivityDisabled,
156
+ onClick: onDisableSequenceInteractivity,
157
+ quickSwitcherLabel: null,
158
+ subMenu: null,
159
+ value: 'disable-interactivity',
160
+ }
161
+ : null,
160
162
  includeSourceEditItems
161
163
  ? {
162
164
  type: 'item',
@@ -175,18 +175,26 @@ const resetSelectedTimelineProps = ({ selections, sequences, overrideIdsToNodePa
175
175
  : 'Reapply sequence prop',
176
176
  }));
177
177
  }
178
- for (const target of effectPropTargets) {
179
- resetPromises.push((0, save_effect_prop_1.saveEffectProp)({
180
- type: 'value',
181
- fileName: target.fileName,
182
- nodePath: target.nodePath,
183
- effectIndex: target.effectIndex,
184
- fieldKey: target.fieldKey,
185
- value: target.value,
186
- defaultValue: target.defaultValue,
187
- schema: target.schema,
178
+ if (effectPropTargets.length > 0) {
179
+ resetPromises.push((0, save_effect_prop_1.saveMultipleEffectProps)({
180
+ changes: effectPropTargets.map((target) => ({
181
+ type: 'value',
182
+ fileName: target.fileName,
183
+ nodePath: target.nodePath,
184
+ effectIndex: target.effectIndex,
185
+ fieldKey: target.fieldKey,
186
+ value: target.value,
187
+ defaultValue: target.defaultValue,
188
+ schema: target.schema,
189
+ })),
188
190
  setPropStatuses,
189
191
  clientId,
192
+ undoLabel: effectPropTargets.length > 1
193
+ ? 'Reset selected effect props'
194
+ : 'Reset effect prop',
195
+ redoLabel: effectPropTargets.length > 1
196
+ ? 'Reapply selected effect props'
197
+ : 'Reapply effect prop',
190
198
  }));
191
199
  }
192
200
  return Promise.all(resetPromises).then(() => undefined);
@@ -20,5 +20,15 @@ type SaveEffectPropEffectParam = SaveEffectPropBase & {
20
20
  effectParam: EffectClipboardParam;
21
21
  };
22
22
  type SaveEffectPropInput = SaveEffectPropValue | SaveEffectPropEffectParam;
23
+ type WithoutSaveContext<T> = T extends unknown ? Omit<T, 'setPropStatuses' | 'clientId'> : never;
24
+ type SaveMultipleEffectPropChange = WithoutSaveContext<SaveEffectPropInput>;
25
+ type SaveMultipleEffectPropsOptions = {
26
+ changes: SaveMultipleEffectPropChange[];
27
+ setPropStatuses: SetPropStatuses;
28
+ clientId: string;
29
+ undoLabel: string;
30
+ redoLabel: string;
31
+ };
32
+ export declare const saveMultipleEffectProps: ({ changes, setPropStatuses, clientId, undoLabel, redoLabel, }: SaveMultipleEffectPropsOptions) => Promise<void>;
23
33
  export declare const saveEffectProp: (input: SaveEffectPropInput) => Promise<void>;
24
34
  export {};
@@ -1,10 +1,61 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.saveEffectProp = void 0;
3
+ exports.saveEffectProp = exports.saveMultipleEffectProps = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const call_api_1 = require("../call-api");
6
6
  const apply_effect_response_to_prop_statuses_1 = require("./apply-effect-response-to-prop-statuses");
7
7
  const save_prop_queue_1 = require("./save-prop-queue");
8
+ const saveMultipleEffectProps = ({ changes, setPropStatuses, clientId, undoLabel, redoLabel, }) => {
9
+ if (changes.length === 0) {
10
+ return Promise.resolve();
11
+ }
12
+ for (const change of changes) {
13
+ if (change.type === 'effect-param') {
14
+ continue;
15
+ }
16
+ setPropStatuses(change.nodePath, (prev) => (0, studio_shared_1.optimisticUpdateForEffectPropStatuses)({
17
+ previous: prev,
18
+ effectIndex: change.effectIndex,
19
+ fieldKey: change.fieldKey,
20
+ value: change.value,
21
+ schema: change.schema,
22
+ }));
23
+ }
24
+ return (0, call_api_1.callApi)('/api/save-multiple-effect-props', {
25
+ edits: changes.map((change) => change.type === 'effect-param'
26
+ ? {
27
+ type: 'effect-param',
28
+ fileName: change.fileName,
29
+ sequenceNodePath: change.nodePath,
30
+ effectIndex: change.effectIndex,
31
+ key: change.fieldKey,
32
+ effectParam: change.effectParam,
33
+ defaultValue: change.defaultValue,
34
+ schema: change.schema,
35
+ }
36
+ : {
37
+ type: 'value',
38
+ fileName: change.fileName,
39
+ sequenceNodePath: change.nodePath,
40
+ effectIndex: change.effectIndex,
41
+ key: change.fieldKey,
42
+ value: JSON.stringify(change.value),
43
+ defaultValue: change.defaultValue,
44
+ schema: change.schema,
45
+ }),
46
+ clientId,
47
+ undoLabel,
48
+ redoLabel,
49
+ }).then((response) => {
50
+ for (const result of response.results) {
51
+ setPropStatuses(result.sequenceNodePath, (prev) => (0, apply_effect_response_to_prop_statuses_1.applyEffectResponseToPropStatuses)({
52
+ previous: prev,
53
+ response: result.status,
54
+ }));
55
+ }
56
+ });
57
+ };
58
+ exports.saveMultipleEffectProps = saveMultipleEffectProps;
8
59
  const saveEffectProp = (input) => {
9
60
  const { fileName, nodePath, effectIndex, fieldKey, defaultValue, schema, setPropStatuses, clientId, } = input;
10
61
  return (0, save_prop_queue_1.enqueueSavePropChange)({
@@ -1,2 +1,2 @@
1
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
- export declare const shouldShowTrackInTimeline: (track: TrackWithHash, durationInFrames: number) => boolean;
1
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
2
+ export declare const shouldShowTrackInTimeline: (track: TimelineTrackData, durationInFrames: number) => boolean;