@remotion/studio 4.0.504 → 4.0.506

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 (172) hide show
  1. package/dist/api/install-package.d.ts +2 -3
  2. package/dist/api/install-package.js +1 -3
  3. package/dist/api/visual-control.d.ts +3 -0
  4. package/dist/api/visual-control.js +3 -0
  5. package/dist/components/AssetSelectorItem.js +3 -3
  6. package/dist/components/AudioWaveform.d.ts +1 -1
  7. package/dist/components/AudioWaveform.js +36 -3
  8. package/dist/components/Canvas.js +2 -0
  9. package/dist/components/CompositionContextButton.d.ts +1 -1
  10. package/dist/components/CompositionContextButton.js +2 -2
  11. package/dist/components/CompositionSelector.js +3 -3
  12. package/dist/components/CompositionSelectorItem.js +5 -5
  13. package/dist/components/ConfigureDefaultEditorModal.d.ts +3 -1
  14. package/dist/components/ConfigureDefaultEditorModal.js +90 -32
  15. package/dist/components/ConfigureLicenseModal.d.ts +2 -1
  16. package/dist/components/ConfigureLicenseModal.js +40 -32
  17. package/dist/components/ConfirmationDialog.js +2 -2
  18. package/dist/components/ContextMenu.d.ts +5 -7
  19. package/dist/components/ContextMenu.js +54 -21
  20. package/dist/components/Editor.js +2 -0
  21. package/dist/components/EditorGuides/Guide.js +2 -2
  22. package/dist/components/EffectPickerModal.js +3 -3
  23. package/dist/components/GlobalKeybindings.js +3 -2
  24. package/dist/components/InlineAction.d.ts +1 -1
  25. package/dist/components/InlineAction.js +14 -13
  26. package/dist/components/InlineCaptionInspector.d.ts +2 -2
  27. package/dist/components/InlineDropdown.d.ts +4 -2
  28. package/dist/components/InlineDropdown.js +23 -6
  29. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  30. package/dist/components/InspectorOpenInEditor.js +33 -9
  31. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  32. package/dist/components/InspectorPanel/CompositionInspector.js +15 -1
  33. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +3 -3
  34. package/dist/components/InspectorPanel/EasingInspector.js +7 -4
  35. package/dist/components/InspectorPanel/KeyframeInspector.js +5 -1
  36. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  37. package/dist/components/InspectorPanel/common.d.ts +1 -0
  38. package/dist/components/InspectorPanel/common.js +25 -35
  39. package/dist/components/InspectorPanel/use-composition-actions.js +4 -1
  40. package/dist/components/InspectorSequenceSection.js +5 -5
  41. package/dist/components/InstallPackage.js +1 -1
  42. package/dist/components/Menu/MenuItem.js +16 -12
  43. package/dist/components/MenuBuildIndicator.js +12 -58
  44. package/dist/components/MenuCompositionName.js +3 -63
  45. package/dist/components/MenuToolbar.js +22 -2
  46. package/dist/components/ModalFooter.d.ts +1 -0
  47. package/dist/components/ModalFooter.js +6 -2
  48. package/dist/components/ModalHeader.js +1 -1
  49. package/dist/components/Modals.js +18 -7
  50. package/dist/components/ModalsProvider.js +5 -6
  51. package/dist/components/NewComposition/CodemodFooter.js +1 -1
  52. package/dist/components/NewComposition/DismissableModal.js +1 -1
  53. package/dist/components/NewComposition/InputDragger.d.ts +1 -0
  54. package/dist/components/NewComposition/InputDragger.js +5 -4
  55. package/dist/components/NewComposition/MenuContent.d.ts +1 -1
  56. package/dist/components/NewComposition/RenameStaticFile.js +1 -1
  57. package/dist/components/NewComposition/menu-typeahead.d.ts +1 -1
  58. package/dist/components/OverrideInputProps.js +1 -1
  59. package/dist/components/PlayPause.js +3 -2
  60. package/dist/components/PlaybackKeyboardShortcutsManager.js +7 -5
  61. package/dist/components/PlaybackRateSelector.js +3 -9
  62. package/dist/components/PreviewToolbar.js +7 -4
  63. package/dist/components/PreviewToolbarOverflowButton.js +4 -2
  64. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
  65. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  66. package/dist/components/RenderButton.d.ts +3 -2
  67. package/dist/components/RenderButton.js +95 -43
  68. package/dist/components/RenderModal/RenderStatusModal.js +1 -1
  69. package/dist/components/RenderModal/ServerRenderModal.js +1 -1
  70. package/dist/components/RenderModal/WebRenderModal.js +3 -2
  71. package/dist/components/RenderQueue/RenderQueueError.js +1 -1
  72. package/dist/components/RenderQueue/RenderQueueItemStatus.js +1 -1
  73. package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
  74. package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -1
  75. package/dist/components/SelectedOutlineElement.js +10 -11
  76. package/dist/components/SelectedOutlineOverlay.js +67 -20
  77. package/dist/components/SettingsModal.d.ts +7 -0
  78. package/dist/components/SettingsModal.js +50 -0
  79. package/dist/components/SettingsModalFooter.d.ts +4 -0
  80. package/dist/components/SettingsModalFooter.js +46 -0
  81. package/dist/components/SidebarRenderButton.js +1 -1
  82. package/dist/components/SizeSelector.js +3 -9
  83. package/dist/components/SvgImportDialog.js +2 -2
  84. package/dist/components/TimeValue.js +1 -1
  85. package/dist/components/Timeline/Timeline.js +5 -4
  86. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  87. package/dist/components/Timeline/TimelineDragHandler.js +6 -3
  88. package/dist/components/Timeline/TimelineEffectItem.js +6 -2
  89. package/dist/components/Timeline/TimelineEffectPropItem.js +11 -6
  90. package/dist/components/Timeline/TimelineExpandedKeyframeRow.d.ts +6 -6
  91. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +32 -1
  92. package/dist/components/Timeline/TimelineExpandedRow.d.ts +4 -2
  93. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  94. package/dist/components/Timeline/TimelineFontFamilyField.js +3 -1
  95. package/dist/components/Timeline/TimelineHeightContainer.d.ts +1 -0
  96. package/dist/components/Timeline/TimelineHeightContainer.js +2 -2
  97. package/dist/components/Timeline/TimelineInOutDragHandler.js +3 -3
  98. package/dist/components/Timeline/TimelineKeyframeControls.js +1 -0
  99. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +4 -2
  100. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +30 -28
  101. package/dist/components/Timeline/TimelineList.d.ts +1 -0
  102. package/dist/components/Timeline/TimelineList.js +2 -3
  103. package/dist/components/Timeline/TimelineScaleField.js +1 -1
  104. package/dist/components/Timeline/TimelineSelection.js +1 -0
  105. package/dist/components/Timeline/TimelineSequence.js +34 -28
  106. package/dist/components/Timeline/TimelineSequenceItem.d.ts +3 -3
  107. package/dist/components/Timeline/TimelineSequenceItem.js +61 -56
  108. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +10 -2
  109. package/dist/components/Timeline/TimelineSequencePropItem.js +64 -12
  110. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +2 -2
  111. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +39 -6
  112. package/dist/components/Timeline/TimelineTimeIndicators.js +36 -3
  113. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -1
  114. package/dist/components/Timeline/TimelineVideoInfo.js +36 -3
  115. package/dist/components/Timeline/TimelineZoomControls.d.ts +2 -2
  116. package/dist/components/Timeline/TimelineZoomControls.js +39 -12
  117. package/dist/components/Timeline/reset-selected-timeline-props.js +1 -1
  118. package/dist/components/Timeline/should-subscribe-to-sequence-props.d.ts +1 -1
  119. package/dist/components/Timeline/timeline-asset-link.d.ts +2 -2
  120. package/dist/components/Timeline/timeline-asset-link.js +2 -2
  121. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +4 -0
  122. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +1 -1
  123. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -18
  124. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  125. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +1 -0
  126. package/dist/components/Timeline/use-timeline-expanded-tree.js +5 -0
  127. package/dist/components/Timeline/use-timeline-height.d.ts +2 -1
  128. package/dist/components/Timeline/use-timeline-height.js +23 -2
  129. package/dist/components/TimelineCombobox.d.ts +11 -0
  130. package/dist/components/TimelineCombobox.js +181 -0
  131. package/dist/components/TimelineInOutToggle.js +5 -1
  132. package/dist/components/TopPanel.js +22 -7
  133. package/dist/components/UpdateCheck.js +1 -1
  134. package/dist/components/effect-drag-and-drop.js +1 -1
  135. package/dist/components/handle-drop.d.ts +2 -1
  136. package/dist/components/handle-drop.js +12 -2
  137. package/dist/components/import-assets.d.ts +18 -6
  138. package/dist/components/import-assets.js +76 -32
  139. package/dist/components/selected-outline-types.d.ts +1 -1
  140. package/dist/esm/{chunk-43m68z1k.js → chunk-b49ec3nz.js} +12436 -11482
  141. package/dist/esm/internals.mjs +12436 -11482
  142. package/dist/esm/previewEntry.mjs +9671 -8717
  143. package/dist/esm/renderEntry.mjs +1 -1
  144. package/dist/helpers/client-id.d.ts +3 -1
  145. package/dist/helpers/client-id.js +21 -4
  146. package/dist/helpers/hoverable.d.ts +11 -0
  147. package/dist/helpers/hoverable.js +70 -0
  148. package/dist/helpers/inject-css.js +3 -0
  149. package/dist/helpers/install-required-package.d.ts +3 -3
  150. package/dist/helpers/install-required-package.js +1 -6
  151. package/dist/helpers/studio-fit-padding.d.ts +1 -1
  152. package/dist/helpers/studio-fit-padding.js +1 -1
  153. package/dist/helpers/timeline-layout.d.ts +2 -1
  154. package/dist/helpers/timeline-layout.js +5 -2
  155. package/dist/helpers/use-is-fullscreen.d.ts +1 -0
  156. package/dist/helpers/use-is-fullscreen.js +25 -0
  157. package/dist/helpers/use-menu-structure.js +26 -43
  158. package/dist/helpers/use-runtime-values.d.ts +11 -0
  159. package/dist/helpers/use-runtime-values.js +76 -0
  160. package/dist/icons/apps.d.ts +2 -0
  161. package/dist/icons/apps.js +7 -0
  162. package/dist/icons/browse-elements.d.ts +4 -0
  163. package/dist/icons/browse-elements.js +10 -0
  164. package/dist/icons/canvas-zoom.d.ts +10 -0
  165. package/dist/icons/canvas-zoom.js +21 -0
  166. package/dist/icons/playback-rate.d.ts +5 -0
  167. package/dist/icons/playback-rate.js +31 -0
  168. package/dist/icons/search.d.ts +5 -0
  169. package/dist/icons/search.js +10 -0
  170. package/dist/state/modals.d.ts +5 -6
  171. package/dist/state/modals.js +5 -3
  172. package/package.json +12 -12
@@ -32,12 +32,10 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
35
  Object.defineProperty(exports, "__esModule", { value: true });
39
36
  exports.TopPanel = exports.useResponsiveSidebarStatus = void 0;
40
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const player_1 = require("@remotion/player");
41
39
  const react_1 = __importStar(require("react"));
42
40
  const remotion_1 = require("remotion");
43
41
  const mobile_layout_1 = require("../helpers/mobile-layout");
@@ -48,7 +46,6 @@ const CanvasIfSizeIsAvailable_1 = require("./CanvasIfSizeIsAvailable");
48
46
  const CurrentCompositionSideEffects_1 = require("./CurrentCompositionSideEffects");
49
47
  const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
50
48
  const ExplorerPanel_1 = require("./ExplorerPanel");
51
- const MobilePanel_1 = __importDefault(require("./MobilePanel"));
52
49
  const ObserveDefaultPropsContext_1 = require("./ObserveDefaultPropsContext");
53
50
  const OptionsPanel_1 = require("./OptionsPanel");
54
51
  const PreviewToolbar_1 = require("./PreviewToolbar");
@@ -72,8 +69,12 @@ const MAX_SIDEBAR_WIDTH = 350;
72
69
  const MIN_SIDEBAR_WIDTH = 250;
73
70
  const useResponsiveSidebarStatus = () => {
74
71
  const { sidebarCollapsedStateLeft } = (0, react_1.useContext)(sidebar_1.SidebarContext);
72
+ const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
75
73
  const responsiveLeftStatus = (0, use_breakpoint_1.useBreakpoint)(1200) ? 'collapsed' : 'expanded';
76
74
  const actualStateLeft = (0, react_1.useMemo)(() => {
75
+ if (isMobileLayout) {
76
+ return 'collapsed';
77
+ }
77
78
  if (sidebarCollapsedStateLeft === 'collapsed') {
78
79
  return 'collapsed';
79
80
  }
@@ -81,7 +82,7 @@ const useResponsiveSidebarStatus = () => {
81
82
  return 'expanded';
82
83
  }
83
84
  return responsiveLeftStatus;
84
- }, [sidebarCollapsedStateLeft, responsiveLeftStatus]);
85
+ }, [isMobileLayout, sidebarCollapsedStateLeft, responsiveLeftStatus]);
85
86
  return actualStateLeft;
86
87
  };
87
88
  exports.useResponsiveSidebarStatus = useResponsiveSidebarStatus;
@@ -96,6 +97,21 @@ const TopPanelInner = ({ readOnlyStudio, onMounted, drawRef, bufferStateDelayInM
96
97
  }
97
98
  return 'expanded';
98
99
  }, [sidebarCollapsedStateRight]);
100
+ const previousSidebarState = (0, react_1.useRef)({
101
+ left: actualStateLeft,
102
+ right: actualStateRight,
103
+ });
104
+ (0, react_1.useLayoutEffect)(() => {
105
+ if (previousSidebarState.current.left === actualStateLeft &&
106
+ previousSidebarState.current.right === actualStateRight) {
107
+ return;
108
+ }
109
+ previousSidebarState.current = {
110
+ left: actualStateLeft,
111
+ right: actualStateRight,
112
+ };
113
+ player_1.PlayerInternals.updateAllElementsSizes();
114
+ }, [actualStateLeft, actualStateRight]);
99
115
  (0, react_1.useEffect)(() => {
100
116
  onMounted();
101
117
  }, [onMounted]);
@@ -111,11 +127,10 @@ const TopPanelInner = ({ readOnlyStudio, onMounted, drawRef, bufferStateDelayInM
111
127
  const onCollapseRight = (0, react_1.useCallback)(() => {
112
128
  setSidebarCollapsedState({ left: null, right: 'collapsed' });
113
129
  }, [setSidebarCollapsedState]);
114
- const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
115
130
  return (jsx_runtime_1.jsx(ObserveDefaultPropsContext_1.ObserveDefaultProps, { compositionId: (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition'
116
131
  ? canvasContent.compositionId
117
132
  : null, readOnlyStudio: readOnlyStudio, children: jsx_runtime_1.jsxs("div", { style: container, children: [
118
- jsx_runtime_1.jsx("div", { style: row, children: jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { minFlex: 0.15, maxFlex: 0.4, defaultFlex: 0.2, maxFlexerSize: MAX_SIDEBAR_WIDTH, minFlexerSize: null, maxAntiFlexerSize: null, minAntiFlexerSize: null, id: "sidebar-to-preview", orientation: "vertical", children: [actualStateLeft === 'expanded' ? (isMobileLayout ? (jsx_runtime_1.jsx(MobilePanel_1.default, { onClose: onCollapseLeft, children: jsx_runtime_1.jsx(ExplorerPanel_1.ExplorerPanel, { readOnlyStudio: readOnlyStudio }) })) : (jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "flexer", children: jsx_runtime_1.jsx(ExplorerPanel_1.ExplorerPanel, { readOnlyStudio: readOnlyStudio }) }))) : null, actualStateLeft === 'expanded' && !isMobileLayout ? (jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { allowToCollapse: "left", onCollapse: onCollapseLeft })) : null, jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "anti-flexer", children: jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { minFlex: 0.5, maxFlex: 0.8, defaultFlex: 0.7, maxFlexerSize: null, minFlexerSize: null, maxAntiFlexerSize: MAX_SIDEBAR_WIDTH, minAntiFlexerSize: MIN_SIDEBAR_WIDTH, id: "canvas-to-right-sidebar", orientation: "vertical", children: [
133
+ jsx_runtime_1.jsx("div", { style: row, children: jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { minFlex: 0.15, maxFlex: 0.4, defaultFlex: 0.2, maxFlexerSize: MAX_SIDEBAR_WIDTH, minFlexerSize: null, maxAntiFlexerSize: null, minAntiFlexerSize: null, id: "sidebar-to-preview", orientation: "vertical", children: [actualStateLeft === 'expanded' ? (jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "flexer", children: jsx_runtime_1.jsx(ExplorerPanel_1.ExplorerPanel, { readOnlyStudio: readOnlyStudio }) })) : null, actualStateLeft === 'expanded' ? (jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { allowToCollapse: "left", onCollapse: onCollapseLeft })) : null, jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "anti-flexer", children: jsx_runtime_1.jsxs(SplitterContainer_1.SplitterContainer, { minFlex: 0.5, maxFlex: 0.8, defaultFlex: 0.7, maxFlexerSize: null, minFlexerSize: null, maxAntiFlexerSize: MAX_SIDEBAR_WIDTH, minAntiFlexerSize: MIN_SIDEBAR_WIDTH, id: "canvas-to-right-sidebar", orientation: "vertical", children: [
119
134
  jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "flexer", children: jsx_runtime_1.jsx("div", { ref: drawRef, style: canvasContainerStyle, children: jsx_runtime_1.jsx(CanvasIfSizeIsAvailable_1.CanvasIfSizeIsAvailable, {}) }) }), actualStateRight === 'expanded' ? (jsx_runtime_1.jsx(SplitterHandle_1.SplitterHandle, { allowToCollapse: "right", onCollapse: onCollapseRight })) : null, actualStateRight === 'expanded' ? (jsx_runtime_1.jsx(SplitterElement_1.SplitterElement, { sticky: null, type: "anti-flexer", children: jsx_runtime_1.jsx(OptionsPanel_1.OptionsPanel, { readOnlyStudio: readOnlyStudio }) })) : null] }) })
120
135
  ] }) }), jsx_runtime_1.jsx(PreviewToolbar_1.PreviewToolbar, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(CurrentCompositionSideEffects_1.TitleUpdater, {})
121
136
  ] }) }));
@@ -27,7 +27,7 @@ const updateIconContainer = {
27
27
  };
28
28
  const UpdateCheck = () => {
29
29
  const [info, setInfo] = (0, react_1.useState)(null);
30
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
30
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
31
31
  const { tabIndex } = (0, z_index_1.useZIndex)();
32
32
  const [knownBugs, setKnownBugs] = (0, react_1.useState)(null);
33
33
  const [hovered, setHovered] = (0, react_1.useState)(false);
@@ -33,7 +33,7 @@ exports.addEffectFromDragData = addEffectFromDragData;
33
33
  const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) => {
34
34
  try {
35
35
  const requiredPackage = (0, studio_shared_1.getRequiredPackageForEffectImportPath)(effect.importPath);
36
- await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [requiredPackage] : []);
36
+ await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [{ name: requiredPackage, version: null }] : []);
37
37
  const result = await (0, call_api_1.callApi)('/api/add-effect', {
38
38
  fileName,
39
39
  sequenceNodePath: nodePath,
@@ -1,7 +1,7 @@
1
1
  import type { Dimensions } from '../helpers/is-current-selected-still';
2
2
  import { type InsertElementDropPosition } from './import-assets';
3
3
  import type { SvgImportMode } from './SvgImportDialog';
4
- export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, }: {
4
+ export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, preferCompositionStart, }: {
5
5
  chooseSvgImportMode: () => Promise<SvgImportMode | null>;
6
6
  compositionFile: string;
7
7
  compositionId: string;
@@ -10,4 +10,5 @@ export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compos
10
10
  event: DragEvent;
11
11
  fps: number;
12
12
  from: number | null;
13
+ preferCompositionStart: boolean;
13
14
  }) => Promise<void>;
@@ -6,7 +6,7 @@ const drop_handler_data_1 = require("./drop-handler-data");
6
6
  const element_drag_and_drop_1 = require("./element-drag-and-drop");
7
7
  const element_install_request_1 = require("./element-install-request");
8
8
  const import_assets_1 = require("./import-assets");
9
- const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, }) => {
9
+ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, preferCompositionStart, }) => {
10
10
  var _a;
11
11
  var _b;
12
12
  if ((0, drop_handler_data_1.isFileDragEvent)(event)) {
@@ -28,6 +28,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
28
28
  files,
29
29
  fps,
30
30
  from,
31
+ preferCompositionStart,
31
32
  svgImportMode,
32
33
  });
33
34
  return;
@@ -45,6 +46,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
45
46
  dropPosition,
46
47
  fps,
47
48
  from,
49
+ preferCompositionStart,
48
50
  });
49
51
  return;
50
52
  }
@@ -58,6 +60,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
58
60
  compositionId,
59
61
  fps,
60
62
  from,
63
+ preferCompositionStart,
61
64
  url: sfxUrl,
62
65
  });
63
66
  return;
@@ -73,6 +76,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
73
76
  compositionId,
74
77
  dropPosition,
75
78
  from,
79
+ preferCompositionStart,
76
80
  });
77
81
  return;
78
82
  }
@@ -85,7 +89,11 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
85
89
  compositionFile,
86
90
  compositionId,
87
91
  element: element.element,
88
- from,
92
+ from: (0, import_assets_1.getFromForDrop)({
93
+ durationInFrames: element.element.durationInFrames,
94
+ from,
95
+ preferCompositionStart,
96
+ }),
89
97
  position: (0, import_assets_1.getElementPositionForDrop)({
90
98
  dimensions: element.element.dimensions,
91
99
  dropPosition,
@@ -102,6 +110,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
102
110
  compositionId,
103
111
  dropPosition,
104
112
  from,
113
+ preferCompositionStart,
105
114
  });
106
115
  return;
107
116
  }
@@ -116,6 +125,7 @@ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId,
116
125
  dropPosition,
117
126
  fps,
118
127
  from,
128
+ preferCompositionStart,
119
129
  url: remoteAssetUrl,
120
130
  });
121
131
  };
@@ -5,6 +5,11 @@ export type InsertElementDropPosition = {
5
5
  readonly centerX: number;
6
6
  readonly centerY: number;
7
7
  };
8
+ export declare const getFromForDrop: ({ durationInFrames, from, preferCompositionStart, }: {
9
+ durationInFrames: number | null | undefined;
10
+ from: number | null;
11
+ preferCompositionStart: boolean | null;
12
+ }) => number | null;
8
13
  export declare const getAssetElement: ({ fileType, src, }: {
9
14
  fileType: FileType;
10
15
  src: string;
@@ -75,7 +80,7 @@ export declare const getDurationInFrames: ({ durationInSeconds, fps, }: {
75
80
  export declare const pickFilesToImport: ({ multiple, }?: {
76
81
  readonly multiple?: boolean | undefined;
77
82
  }) => Promise<File[]>;
78
- export declare const importAssets: ({ compositionFile, compositionId, destinationDimensions, dropPosition, files, fps, from, svgImportMode, }: {
83
+ export declare const importAssets: ({ compositionFile, compositionId, destinationDimensions, dropPosition, files, fps, from, preferCompositionStart, svgImportMode, }: {
79
84
  compositionFile: string;
80
85
  compositionId: string;
81
86
  destinationDimensions: Dimensions | null;
@@ -83,6 +88,7 @@ export declare const importAssets: ({ compositionFile, compositionId, destinatio
83
88
  files: File[];
84
89
  fps: number;
85
90
  from: number | null;
91
+ preferCompositionStart: boolean | null;
86
92
  svgImportMode: "image" | "inline";
87
93
  }) => Promise<void>;
88
94
  export declare const importFigmaClipboard: ({ compositionFile, compositionId, destinationDimensions, dropPosition, html, }: {
@@ -99,23 +105,25 @@ export declare const insertSvgMarkup: ({ compositionFile, compositionId, destina
99
105
  dropPosition: InsertElementDropPosition | null;
100
106
  markup: string;
101
107
  }) => Promise<void>;
102
- export declare const importRemoteAsset: ({ compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, url, }: {
108
+ export declare const importRemoteAsset: ({ compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, preferCompositionStart, url, }: {
103
109
  compositionFile: string;
104
110
  compositionId: string;
105
111
  destinationDimensions: Dimensions | null;
106
112
  dropPosition: InsertElementDropPosition | null;
107
113
  fps: number;
108
114
  from: number | null;
115
+ preferCompositionStart: boolean | null;
109
116
  url: string;
110
117
  }) => Promise<void>;
111
- export declare const insertRemoteAudio: ({ compositionFile, compositionId, fps, from, url, }: {
118
+ export declare const insertRemoteAudio: ({ compositionFile, compositionId, fps, from, preferCompositionStart, url, }: {
112
119
  compositionFile: string;
113
120
  compositionId: string;
114
121
  fps: number;
115
122
  from: number | null;
123
+ preferCompositionStart: boolean | null;
116
124
  url: string;
117
125
  }) => Promise<void>;
118
- export declare const insertExistingAssets: ({ assetPaths, compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, }: {
126
+ export declare const insertExistingAssets: ({ assetPaths, compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, preferCompositionStart, }: {
119
127
  assetPaths: string[];
120
128
  compositionFile: string;
121
129
  compositionId: string;
@@ -123,8 +131,9 @@ export declare const insertExistingAssets: ({ assetPaths, compositionFile, compo
123
131
  dropPosition: InsertElementDropPosition | null;
124
132
  fps: number;
125
133
  from: number | null;
134
+ preferCompositionStart: boolean | null;
126
135
  }) => Promise<void>;
127
- export declare const insertComponent: ({ component, compositionFile, compositionId, dropPosition, from, }: {
136
+ export declare const insertComponent: ({ component, compositionFile, compositionId, dropPosition, from, preferCompositionStart, }: {
128
137
  component: {
129
138
  componentName: string;
130
139
  dimensions?: import("@remotion/studio-protocol").ComponentDimensions | undefined;
@@ -136,13 +145,15 @@ export declare const insertComponent: ({ component, compositionFile, composition
136
145
  compositionId: string;
137
146
  dropPosition: InsertElementDropPosition | null;
138
147
  from: number | null;
148
+ preferCompositionStart: boolean | null;
139
149
  }) => Promise<void>;
140
- export declare const insertComposition: ({ composition, compositionFile, compositionId, dropPosition, from, }: {
150
+ export declare const insertComposition: ({ composition, compositionFile, compositionId, dropPosition, from, preferCompositionStart, }: {
141
151
  composition: CompositionDragData;
142
152
  compositionFile: string;
143
153
  compositionId: string;
144
154
  dropPosition: InsertElementDropPosition | null;
145
155
  from: number | null;
156
+ preferCompositionStart: boolean | null;
146
157
  }) => Promise<void>;
147
158
  export declare const insertElement: ({ compositionFile, compositionId, element, expectedFileState, position, from, overwriteExisting, }: {
148
159
  compositionFile: string;
@@ -150,6 +161,7 @@ export declare const insertElement: ({ compositionFile, compositionId, element,
150
161
  element: {
151
162
  dependencies: import("@remotion/studio-protocol").ElementDependency[];
152
163
  durationInFrames?: number | undefined;
164
+ installationMode?: import("@remotion/studio-protocol").ElementInstallationMode | undefined;
153
165
  slug: string;
154
166
  displayName: string;
155
167
  sourceCode: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.insertElement = exports.insertComposition = exports.insertComponent = exports.insertExistingAssets = exports.insertRemoteAudio = exports.importRemoteAsset = exports.insertSvgMarkup = exports.importFigmaClipboard = exports.importAssets = exports.pickFilesToImport = exports.getDurationInFrames = exports.getComponentDimensions = exports.getAssetPositionForDrop = exports.getCompositionPositionForDrop = exports.getElementPositionForDrop = exports.hasSvgFile = exports.getAssetElementForDroppedFile = exports.getAssetElementFromPath = exports.getAssetElement = void 0;
3
+ exports.insertElement = exports.insertComposition = exports.insertComponent = exports.insertExistingAssets = exports.insertRemoteAudio = exports.importRemoteAsset = exports.insertSvgMarkup = exports.importFigmaClipboard = exports.importAssets = exports.pickFilesToImport = exports.getDurationInFrames = exports.getComponentDimensions = exports.getAssetPositionForDrop = exports.getCompositionPositionForDrop = exports.getElementPositionForDrop = exports.hasSvgFile = exports.getAssetElementForDroppedFile = exports.getAssetElementFromPath = exports.getAssetElement = exports.getFromForDrop = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const remotion_1 = require("remotion");
6
6
  const no_react_1 = require("remotion/no-react");
@@ -11,6 +11,19 @@ const install_required_package_1 = require("../helpers/install-required-package"
11
11
  const use_media_metadata_1 = require("../helpers/use-media-metadata");
12
12
  const call_api_1 = require("./call-api");
13
13
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
14
+ const getFromForDrop = ({ durationInFrames, from, preferCompositionStart, }) => {
15
+ if (preferCompositionStart !== true) {
16
+ return from;
17
+ }
18
+ if (durationInFrames !== null &&
19
+ durationInFrames !== undefined &&
20
+ from !== null &&
21
+ from >= durationInFrames) {
22
+ return from;
23
+ }
24
+ return null;
25
+ };
26
+ exports.getFromForDrop = getFromForDrop;
14
27
  const getAssetElement = ({ fileType, src, }) => {
15
28
  if (fileType.type === 'webp' && fileType.animated) {
16
29
  return {
@@ -496,7 +509,7 @@ const insertCompositionElement = async ({ compositionFile, compositionId, elemen
496
509
  const downloadRemoteAsset = (url) => {
497
510
  return (0, call_api_1.callApi)('/api/download-remote-asset', { url });
498
511
  };
499
- const importAssets = async ({ compositionFile, compositionId, destinationDimensions, dropPosition, files, fps, from, svgImportMode, }) => {
512
+ const importAssets = async ({ compositionFile, compositionId, destinationDimensions, dropPosition, files, fps, from, preferCompositionStart, svgImportMode, }) => {
500
513
  var _a;
501
514
  if (files.length === 0) {
502
515
  return;
@@ -534,7 +547,11 @@ const importAssets = async ({ compositionFile, compositionId, destinationDimensi
534
547
  const svgInserted = await insertCompositionElement({
535
548
  compositionFile,
536
549
  compositionId,
537
- from,
550
+ from: (0, exports.getFromForDrop)({
551
+ durationInFrames: null,
552
+ from,
553
+ preferCompositionStart,
554
+ }),
538
555
  element: {
539
556
  type: 'svg',
540
557
  markup: new TextDecoder().decode(contents),
@@ -570,19 +587,24 @@ const importAssets = async ({ compositionFile, compositionId, destinationDimensi
570
587
  addedStaticFiles.push(file.name);
571
588
  }
572
589
  const resolvedDimensions = (_a = element.dimensions) !== null && _a !== void 0 ? _a : metadata.dimensions;
590
+ const durationInFrames = assetTypeHasDuration(element.assetType)
591
+ ? (0, exports.getDurationInFrames)({
592
+ durationInSeconds: metadata.durationInSeconds,
593
+ fps,
594
+ })
595
+ : null;
573
596
  const inserted = await insertCompositionElement({
574
597
  compositionFile,
575
598
  compositionId,
576
- from,
599
+ from: (0, exports.getFromForDrop)({
600
+ durationInFrames,
601
+ from,
602
+ preferCompositionStart,
603
+ }),
577
604
  element: {
578
605
  ...element,
579
606
  dimensions: resolvedDimensions,
580
- durationInFrames: assetTypeHasDuration(element.assetType)
581
- ? (0, exports.getDurationInFrames)({
582
- durationInSeconds: metadata.durationInSeconds,
583
- fps,
584
- })
585
- : null,
607
+ durationInFrames,
586
608
  position: (0, exports.getAssetPositionForDrop)({
587
609
  assetDimensions: resolvedDimensions,
588
610
  destinationDimensions,
@@ -663,7 +685,7 @@ const insertSvgMarkup = async ({ compositionFile, compositionId, destinationDime
663
685
  }
664
686
  };
665
687
  exports.insertSvgMarkup = insertSvgMarkup;
666
- const importRemoteAsset = async ({ compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, url, }) => {
688
+ const importRemoteAsset = async ({ compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, preferCompositionStart, url, }) => {
667
689
  var _a;
668
690
  try {
669
691
  const { assetPath, created, element } = await downloadRemoteAsset(url);
@@ -676,19 +698,24 @@ const importRemoteAsset = async ({ compositionFile, compositionId, destinationDi
676
698
  }
677
699
  const metadata = await getStaticAssetMetadataOrNull(assetPath, element.assetType);
678
700
  const dimensions = (_a = element.dimensions) !== null && _a !== void 0 ? _a : metadata.dimensions;
701
+ const durationInFrames = assetTypeHasDuration(element.assetType)
702
+ ? (0, exports.getDurationInFrames)({
703
+ durationInSeconds: metadata.durationInSeconds,
704
+ fps,
705
+ })
706
+ : null;
679
707
  const inserted = await insertCompositionElement({
680
708
  compositionFile,
681
709
  compositionId,
682
- from,
710
+ from: (0, exports.getFromForDrop)({
711
+ durationInFrames,
712
+ from,
713
+ preferCompositionStart,
714
+ }),
683
715
  element: {
684
716
  ...element,
685
717
  dimensions,
686
- durationInFrames: assetTypeHasDuration(element.assetType)
687
- ? (0, exports.getDurationInFrames)({
688
- durationInSeconds: metadata.durationInSeconds,
689
- fps,
690
- })
691
- : null,
718
+ durationInFrames,
692
719
  position: (0, exports.getAssetPositionForDrop)({
693
720
  assetDimensions: dimensions,
694
721
  destinationDimensions,
@@ -706,7 +733,7 @@ const importRemoteAsset = async ({ compositionFile, compositionId, destinationDi
706
733
  }
707
734
  };
708
735
  exports.importRemoteAsset = importRemoteAsset;
709
- const insertRemoteAudio = async ({ compositionFile, compositionId, fps, from, url, }) => {
736
+ const insertRemoteAudio = async ({ compositionFile, compositionId, fps, from, preferCompositionStart, url, }) => {
710
737
  if (!(0, studio_shared_1.isUrl)(url)) {
711
738
  (0, NotificationCenter_1.showNotification)('Cannot add sound effect: Unsupported URL', 3000);
712
739
  return;
@@ -729,7 +756,11 @@ const insertRemoteAudio = async ({ compositionFile, compositionId, fps, from, ur
729
756
  compositionFile,
730
757
  compositionId,
731
758
  element,
732
- from,
759
+ from: (0, exports.getFromForDrop)({
760
+ durationInFrames: element.durationInFrames,
761
+ from,
762
+ preferCompositionStart,
763
+ }),
733
764
  });
734
765
  if (!inserted) {
735
766
  return;
@@ -741,7 +772,7 @@ const insertRemoteAudio = async ({ compositionFile, compositionId, fps, from, ur
741
772
  }
742
773
  };
743
774
  exports.insertRemoteAudio = insertRemoteAudio;
744
- const insertExistingAssets = async ({ assetPaths, compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, }) => {
775
+ const insertExistingAssets = async ({ assetPaths, compositionFile, compositionId, destinationDimensions, dropPosition, fps, from, preferCompositionStart, }) => {
745
776
  var _a;
746
777
  if (assetPaths.length === 0) {
747
778
  return;
@@ -757,19 +788,24 @@ const insertExistingAssets = async ({ assetPaths, compositionFile, compositionId
757
788
  }
758
789
  const metadata = await getStaticAssetMetadataOrNull(assetPath, element.assetType);
759
790
  const dimensions = (_a = element.dimensions) !== null && _a !== void 0 ? _a : metadata.dimensions;
791
+ const durationInFrames = assetTypeHasDuration(element.assetType)
792
+ ? (0, exports.getDurationInFrames)({
793
+ durationInSeconds: metadata.durationInSeconds,
794
+ fps,
795
+ })
796
+ : null;
760
797
  const inserted = await insertCompositionElement({
761
798
  compositionFile,
762
799
  compositionId,
763
- from,
800
+ from: (0, exports.getFromForDrop)({
801
+ durationInFrames,
802
+ from,
803
+ preferCompositionStart,
804
+ }),
764
805
  element: {
765
806
  ...element,
766
807
  dimensions,
767
- durationInFrames: assetTypeHasDuration(element.assetType)
768
- ? (0, exports.getDurationInFrames)({
769
- durationInSeconds: metadata.durationInSeconds,
770
- fps,
771
- })
772
- : null,
808
+ durationInFrames,
773
809
  position: (0, exports.getAssetPositionForDrop)({
774
810
  assetDimensions: dimensions,
775
811
  destinationDimensions,
@@ -790,12 +826,16 @@ const insertExistingAssets = async ({ assetPaths, compositionFile, compositionId
790
826
  }
791
827
  };
792
828
  exports.insertExistingAssets = insertExistingAssets;
793
- const insertComponent = async ({ component, compositionFile, compositionId, dropPosition, from, }) => {
829
+ const insertComponent = async ({ component, compositionFile, compositionId, dropPosition, from, preferCompositionStart, }) => {
794
830
  try {
795
831
  const inserted = await insertCompositionElement({
796
832
  compositionFile,
797
833
  compositionId,
798
- from,
834
+ from: (0, exports.getFromForDrop)({
835
+ durationInFrames: null,
836
+ from,
837
+ preferCompositionStart,
838
+ }),
799
839
  element: {
800
840
  type: 'component',
801
841
  componentName: component.componentName,
@@ -825,7 +865,7 @@ const serializeResolvedPropsForSourceCode = (props) => {
825
865
  staticBase: window.remotion_staticBase,
826
866
  }).serializedString;
827
867
  };
828
- const insertComposition = async ({ composition, compositionFile, compositionId, dropPosition, from, }) => {
868
+ const insertComposition = async ({ composition, compositionFile, compositionId, dropPosition, from, preferCompositionStart, }) => {
829
869
  if (composition.compositionId === compositionId) {
830
870
  (0, NotificationCenter_1.showNotification)('Cannot add a composition to itself', 3000);
831
871
  return;
@@ -847,7 +887,11 @@ const insertComposition = async ({ composition, compositionFile, compositionId,
847
887
  const inserted = await insertCompositionElement({
848
888
  compositionFile,
849
889
  compositionId,
850
- from,
890
+ from: (0, exports.getFromForDrop)({
891
+ durationInFrames: calculated.durationInFrames,
892
+ from,
893
+ preferCompositionStart,
894
+ }),
851
895
  element: {
852
896
  type: 'composition',
853
897
  compositionId: composition.compositionId,
@@ -3,7 +3,7 @@ import type { SequenceNodePathInfo } from '../helpers/get-timeline-sequence-sort
3
3
  import type { ComboboxValue } from './NewComposition/ComboBox';
4
4
  import type { SelectedOutlineUvHandle } from './selected-outline-uv';
5
5
  import type { TimelineSelection } from './Timeline/TimelineSelection';
6
- export type SelectedOutlineContextMenuOpenResult = false | void | readonly ComboboxValue[];
6
+ export type SelectedOutlineContextMenuOpenResult = false | readonly ComboboxValue[];
7
7
  export type SelectedOutlineContextMenuOpenHandler = () => SelectedOutlineContextMenuOpenResult | Promise<SelectedOutlineContextMenuOpenResult>;
8
8
  export type SelectedOutlineTarget = {
9
9
  readonly key: string;