@remotion/studio 4.0.495 → 4.0.497

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 (124) hide show
  1. package/dist/components/AssetSelectorItem.js +7 -7
  2. package/dist/components/AudioWaveform.js +1 -11
  3. package/dist/components/Canvas.js +22 -203
  4. package/dist/components/CompositionSelectorItem.js +5 -31
  5. package/dist/components/CurrentAsset.js +4 -3
  6. package/dist/components/InlineCompositionName.js +1 -1
  7. package/dist/components/InlineEditableTitle.d.ts +1 -0
  8. package/dist/components/InlineEditableTitle.js +56 -11
  9. package/dist/components/InspectorInfoHeader.d.ts +2 -0
  10. package/dist/components/InspectorInfoHeader.js +16 -4
  11. package/dist/components/InspectorLocationCopy.js +2 -2
  12. package/dist/components/InspectorPanel/AlignmentControls.js +2 -0
  13. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +11 -6
  14. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +27 -2
  15. package/dist/components/InspectorPanel/EasingInspector.js +1 -1
  16. package/dist/components/InspectorPanel/KeyframeInspector.js +7 -8
  17. package/dist/components/InspectorPanel/KeyframeSettings.js +1 -1
  18. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +28 -3
  19. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +67 -10
  20. package/dist/components/InspectorPanel/common.d.ts +4 -2
  21. package/dist/components/InspectorPanel/common.js +18 -18
  22. package/dist/components/InspectorPanel/styles.d.ts +0 -3
  23. package/dist/components/InspectorPanel/styles.js +5 -40
  24. package/dist/components/InspectorPanel/use-composition-actions.js +6 -2
  25. package/dist/components/InspectorSequenceSection.js +12 -2
  26. package/dist/components/InspectorSourceLocation.d.ts +1 -0
  27. package/dist/components/InspectorSourceLocation.js +5 -1
  28. package/dist/components/NewComposition/CodemodFooter.d.ts +1 -1
  29. package/dist/components/NewComposition/CodemodFooter.js +23 -4
  30. package/dist/components/NewComposition/ComboBox.d.ts +2 -1
  31. package/dist/components/NewComposition/ComboBox.js +32 -7
  32. package/dist/components/NewComposition/InputDragger.d.ts +6 -0
  33. package/dist/components/NewComposition/InputDragger.js +12 -3
  34. package/dist/components/NewComposition/NewComposition.js +1 -1
  35. package/dist/components/NewComposition/use-rename-static-file.js +1 -1
  36. package/dist/components/PlaybackRateSelector.js +3 -3
  37. package/dist/components/PreviewToolbar.js +3 -3
  38. package/dist/components/RenderButton.d.ts +1 -0
  39. package/dist/components/RenderButton.js +51 -7
  40. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  41. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  42. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  43. package/dist/components/SelectedOutlineElement.js +56 -88
  44. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  45. package/dist/components/SelectedOutlineOverlay.js +9 -10
  46. package/dist/components/SizeSelector.js +3 -3
  47. package/dist/components/Timeline/Timeline.js +10 -3
  48. package/dist/components/Timeline/TimelineAssetDropIndicator.d.ts +2 -0
  49. package/dist/components/Timeline/TimelineAssetDropIndicator.js +37 -0
  50. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  51. package/dist/components/Timeline/TimelineClipboardKeybindings.js +1 -7
  52. package/dist/components/Timeline/TimelineEnumField.js +1 -1
  53. package/dist/components/Timeline/TimelineFieldLabel.js +3 -3
  54. package/dist/components/Timeline/TimelineKeyframeControls.js +26 -6
  55. package/dist/components/Timeline/TimelineRowChrome.js +10 -2
  56. package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +3 -0
  57. package/dist/components/Timeline/TimelineRowLayoutContext.js +6 -0
  58. package/dist/components/Timeline/TimelineScrollable.js +3 -2
  59. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  60. package/dist/components/Timeline/TimelineSelection.js +40 -5
  61. package/dist/components/Timeline/TimelineSequence.js +20 -8
  62. package/dist/components/Timeline/TimelineSequenceFrame.js +2 -4
  63. package/dist/components/Timeline/TimelineSequenceItem.js +2 -0
  64. package/dist/components/Timeline/TimelineSequencePropItem.js +4 -0
  65. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +15 -3
  66. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +96 -18
  67. package/dist/components/Timeline/TimelineTimeIndicators.d.ts +16 -0
  68. package/dist/components/Timeline/TimelineTimeIndicators.js +154 -35
  69. package/dist/components/Timeline/TimelineTranslateField.js +2 -1
  70. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  71. package/dist/components/Timeline/TimelineVideoInfo.js +4 -1
  72. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +2 -0
  73. package/dist/components/Timeline/delete-selected-timeline-item.js +5 -4
  74. package/dist/components/Timeline/disable-sequence-interactivity.js +2 -0
  75. package/dist/components/Timeline/get-timeline-media-visualization-layout.d.ts +8 -0
  76. package/dist/components/Timeline/get-timeline-media-visualization-layout.js +10 -0
  77. package/dist/components/Timeline/get-timeline-video-info-widths.js +11 -3
  78. package/dist/components/Timeline/keyframe-clipboard.js +21 -5
  79. package/dist/components/Timeline/reset-selected-timeline-props.js +2 -0
  80. package/dist/components/Timeline/save-sequence-prop.d.ts +5 -3
  81. package/dist/components/Timeline/save-sequence-prop.js +43 -18
  82. package/dist/components/Timeline/should-clear-selection-on-pointer-down.d.ts +2 -0
  83. package/dist/components/Timeline/should-clear-selection-on-pointer-down.js +1 -1
  84. package/dist/components/Timeline/timeline-asset-drop-context.d.ts +1 -0
  85. package/dist/components/Timeline/timeline-asset-drop-context.js +5 -0
  86. package/dist/components/Timeline/timeline-scroll-logic.d.ts +7 -0
  87. package/dist/components/Timeline/timeline-scroll-logic.js +10 -1
  88. package/dist/components/Timeline/use-rename-sequence.js +2 -0
  89. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +2 -0
  90. package/dist/components/Timeline/use-timeline-asset-drop.d.ts +1 -0
  91. package/dist/components/Timeline/use-timeline-asset-drop.js +168 -0
  92. package/dist/components/composition-menu-items.d.ts +15 -1
  93. package/dist/components/composition-menu-items.js +137 -107
  94. package/dist/components/drop-handler-data.d.ts +13 -0
  95. package/dist/components/drop-handler-data.js +117 -0
  96. package/dist/components/handle-drop.d.ts +13 -0
  97. package/dist/components/handle-drop.js +115 -0
  98. package/dist/components/import-assets.d.ts +26 -8
  99. package/dist/components/import-assets.js +161 -49
  100. package/dist/components/layout.d.ts +1 -0
  101. package/dist/components/layout.js +2 -1
  102. package/dist/components/open-in-new-window.d.ts +2 -0
  103. package/dist/components/open-in-new-window.js +28 -0
  104. package/dist/components/selected-outline-drag.d.ts +11 -1
  105. package/dist/components/selected-outline-drag.js +74 -1
  106. package/dist/esm/{chunk-784jbkzs.js → chunk-5wj95bdd.js} +4760 -3701
  107. package/dist/esm/internals.mjs +4760 -3701
  108. package/dist/esm/previewEntry.mjs +4962 -3903
  109. package/dist/esm/renderEntry.mjs +1 -1
  110. package/dist/helpers/inject-css.js +4 -2
  111. package/dist/helpers/is-video-with-last-frame-hold.d.ts +2 -0
  112. package/dist/helpers/is-video-with-last-frame-hold.js +9 -0
  113. package/dist/helpers/url-state.d.ts +1 -0
  114. package/dist/helpers/url-state.js +5 -1
  115. package/dist/helpers/use-max-media-duration.js +5 -3
  116. package/dist/helpers/use-menu-structure.js +2 -0
  117. package/dist/icons/duplicate.d.ts +5 -0
  118. package/dist/icons/duplicate.js +10 -0
  119. package/dist/icons/scissors.js +1 -1
  120. package/dist/icons/snowflake.d.ts +5 -0
  121. package/dist/icons/snowflake.js +10 -0
  122. package/dist/icons/trash.d.ts +5 -0
  123. package/dist/icons/trash.js +8 -0
  124. package/package.json +11 -11
@@ -61,6 +61,7 @@ const InlineAction_1 = require("./InlineAction");
61
61
  const layout_1 = require("./layout");
62
62
  const styles_1 = require("./Menu/styles");
63
63
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
64
+ const open_in_new_window_1 = require("./open-in-new-window");
64
65
  const actions_1 = require("./RenderQueue/actions");
65
66
  const iconStyle = {
66
67
  width: 18,
@@ -238,13 +239,7 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
238
239
  return {
239
240
  ...itemStyle,
240
241
  color: hovered || selected ? colors_1.WHITE : colors_1.LIGHT_TEXT,
241
- backgroundColor: hovered
242
- ? selected
243
- ? colors_1.SELECTED_BACKGROUND
244
- : colors_1.WHITE_ALPHA_06
245
- : selected
246
- ? colors_1.SELECTED_BACKGROUND
247
- : colors_1.TRANSPARENT,
242
+ backgroundColor: hovered || selected ? colors_1.WHITE_ALPHA_06 : colors_1.TRANSPARENT,
248
243
  paddingLeft: 12 + level * 8,
249
244
  };
250
245
  }, [hovered, level, selected]);
@@ -317,6 +312,11 @@ const AssetSelectorItem = ({ item, tabIndex, level, parentFolder, readOnlyStudio
317
312
  }, [confirm, relativePath]);
318
313
  const contextMenu = (0, react_1.useMemo)(() => {
319
314
  return [
315
+ (0, open_in_new_window_1.getOpenInNewWindowMenuItem)(`/assets/${relativePath}`),
316
+ {
317
+ type: 'divider',
318
+ id: 'open-in-new-window-divider',
319
+ },
320
320
  {
321
321
  id: 'copy-asset-file-name',
322
322
  keyHint: null,
@@ -31,16 +31,6 @@ const getContainerStyle = (height) => {
31
31
  height,
32
32
  };
33
33
  };
34
- const errorMessage = {
35
- fontSize: 13,
36
- paddingTop: 6,
37
- paddingBottom: 6,
38
- paddingLeft: 12,
39
- paddingRight: 12,
40
- alignSelf: 'flex-start',
41
- maxWidth: 450,
42
- opacity: 0.75,
43
- };
44
34
  const getWaveformErrorMessage = () => {
45
35
  return new Error('No waveform available. The audio could not be decoded or may not support CORS.');
46
36
  };
@@ -302,7 +292,7 @@ const AudioWaveform = ({ src, height, startFrom, durationInFrames, visualization
302
292
  context.stroke();
303
293
  }, [height, parsedVolume, shouldRenderVolumeOverlay, visualizationWidth]);
304
294
  if (error) {
305
- return (jsx_runtime_1.jsx("div", { style: getContainerStyle(height), children: jsx_runtime_1.jsx("div", { style: errorMessage, children: "No waveform available. The audio could not be decoded or may not support CORS." }) }));
295
+ return null;
306
296
  }
307
297
  if (!canUseWorkerPath && !peaks) {
308
298
  return null;
@@ -5,7 +5,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Canvas = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const studio_shared_1 = require("@remotion/studio-shared");
9
8
  const react_1 = require("react");
10
9
  const remotion_1 = require("remotion");
11
10
  const get_static_files_1 = require("../api/get-static-files");
@@ -18,7 +17,6 @@ const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
18
17
  const get_effective_translation_1 = require("../helpers/get-effective-translation");
19
18
  const install_required_package_1 = require("../helpers/install-required-package");
20
19
  const open_in_editor_1 = require("../helpers/open-in-editor");
21
- const remote_asset_drag_1 = require("../helpers/remote-asset-drag");
22
20
  const smooth_zoom_1 = require("../helpers/smooth-zoom");
23
21
  const studio_fit_padding_1 = require("../helpers/studio-fit-padding");
24
22
  const use_keybinding_1 = require("../helpers/use-keybinding");
@@ -27,11 +25,12 @@ const editor_guides_1 = require("../state/editor-guides");
27
25
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
28
26
  const call_api_1 = require("./call-api");
29
27
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
28
+ const drop_handler_data_1 = require("./drop-handler-data");
30
29
  const EditorGuides_1 = __importDefault(require("./EditorGuides"));
31
30
  const EditorRuler_1 = require("./EditorRuler");
32
31
  const use_is_ruler_visible_1 = require("./EditorRuler/use-is-ruler-visible");
33
32
  const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
34
- const element_drag_and_drop_1 = require("./element-drag-and-drop");
33
+ const handle_drop_1 = require("./handle-drop");
35
34
  const import_assets_1 = require("./import-assets");
36
35
  const layout_1 = require("./layout");
37
36
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
@@ -101,97 +100,6 @@ const calculateCanvasScale = ({ addFitPadding, canvasSize, compositionHeight, co
101
100
  ? (0, studio_fit_padding_1.calculateStudioScale)(options)
102
101
  : remotion_1.Internals.calculateScale(options);
103
102
  };
104
- const isFileDragEvent = (event) => {
105
- var _a;
106
- var _b;
107
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes('Files');
108
- };
109
- const isAssetDragEvent = (event) => {
110
- var _a;
111
- var _b;
112
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.ASSET_DRAG_MIME_TYPE);
113
- };
114
- const isComponentDragEvent = (event) => {
115
- var _a;
116
- var _b;
117
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.COMPONENT_DRAG_MIME_TYPE);
118
- };
119
- const isCompositionDragEvent = (event) => {
120
- var _a;
121
- var _b;
122
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.COMPOSITION_DRAG_MIME_TYPE);
123
- };
124
- const isElementDragEvent = (event) => {
125
- var _a;
126
- var _b;
127
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.ELEMENT_DRAG_MIME_TYPE);
128
- };
129
- const isSfxDragEvent = (event) => {
130
- var _a;
131
- var _b;
132
- return Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.types) !== null && _b !== void 0 ? _b : []).includes(studio_shared_1.SFX_DRAG_MIME_TYPE);
133
- };
134
- const isRemoteAssetDragEvent = (event) => {
135
- return (!isFileDragEvent(event) &&
136
- !isAssetDragEvent(event) &&
137
- !isCompositionDragEvent(event) &&
138
- !isComponentDragEvent(event) &&
139
- !isElementDragEvent(event) &&
140
- !isSfxDragEvent(event) &&
141
- (0, remote_asset_drag_1.hasRemoteAssetDragData)(event.dataTransfer));
142
- };
143
- const getAssetDragPath = (event) => {
144
- var _a, _b;
145
- var _c;
146
- const value = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(studio_shared_1.ASSET_DRAG_MIME_TYPE);
147
- if (!value) {
148
- return null;
149
- }
150
- return (_c = (_b = (0, studio_shared_1.parseAssetDragData)(value)) === null || _b === void 0 ? void 0 : _b.assetPath) !== null && _c !== void 0 ? _c : null;
151
- };
152
- const getCompositionDragData = (event) => {
153
- var _a;
154
- const value = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(studio_shared_1.COMPOSITION_DRAG_MIME_TYPE);
155
- if (!value) {
156
- return null;
157
- }
158
- return (0, studio_shared_1.parseCompositionDragData)(value);
159
- };
160
- const getComponentDragData = (event) => {
161
- var _a;
162
- for (const type of [
163
- studio_shared_1.COMPONENT_DRAG_MIME_TYPE,
164
- 'application/json',
165
- 'text/plain',
166
- ]) {
167
- const value = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.getData(type);
168
- if (!value) {
169
- continue;
170
- }
171
- const parsed = (0, studio_shared_1.parseComponentDragData)(value);
172
- if (parsed) {
173
- return parsed;
174
- }
175
- }
176
- return null;
177
- };
178
- const getSfxDragUrl = (event) => {
179
- const { dataTransfer } = event;
180
- if (!dataTransfer) {
181
- return null;
182
- }
183
- for (const type of [studio_shared_1.SFX_DRAG_MIME_TYPE, 'application/json', 'text/plain']) {
184
- const value = dataTransfer.getData(type);
185
- if (!value) {
186
- continue;
187
- }
188
- const parsed = (0, studio_shared_1.parseSfxDragData)(value);
189
- if (parsed) {
190
- return parsed.sfx.url;
191
- }
192
- }
193
- return null;
194
- };
195
103
  const getDropPosition = ({ addFitPadding, clientX, clientY, contentDimensions, previewSize, size, }) => {
196
104
  if (contentDimensions === null || contentDimensions === 'none') {
197
105
  return null;
@@ -766,6 +674,7 @@ const Canvas = ({ canvasContent, size }) => {
766
674
  compositionFile: activeElementInstallRequest.compositionFile,
767
675
  compositionId: activeElementInstallRequest.compositionId,
768
676
  dropPosition: null,
677
+ from: null,
769
678
  });
770
679
  }
771
680
  };
@@ -787,14 +696,7 @@ const Canvas = ({ canvasContent, size }) => {
787
696
  };
788
697
  }, [activeElementInstallRequest, confirm]);
789
698
  const onDragOver = (0, react_1.useCallback)((event) => {
790
- if ((!isFileDragEvent(event) &&
791
- !isAssetDragEvent(event) &&
792
- !isCompositionDragEvent(event) &&
793
- !isComponentDragEvent(event) &&
794
- !isElementDragEvent(event) &&
795
- !isSfxDragEvent(event) &&
796
- !isRemoteAssetDragEvent(event)) ||
797
- !isDragEventInsideCanvas(event)) {
699
+ if (!(0, drop_handler_data_1.isSupportedDropEvent)(event) || !isDragEventInsideCanvas(event)) {
798
700
  return;
799
701
  }
800
702
  if (!canDropAssets && !cannotAddSequence) {
@@ -806,16 +708,7 @@ const Canvas = ({ canvasContent, size }) => {
806
708
  }
807
709
  }, [canDropAssets, cannotAddSequence]);
808
710
  const onDrop = (0, react_1.useCallback)(async (event) => {
809
- var _a;
810
- var _b;
811
- if ((!isFileDragEvent(event) &&
812
- !isAssetDragEvent(event) &&
813
- !isCompositionDragEvent(event) &&
814
- !isComponentDragEvent(event) &&
815
- !isElementDragEvent(event) &&
816
- !isSfxDragEvent(event) &&
817
- !isRemoteAssetDragEvent(event)) ||
818
- !isDragEventInsideCanvas(event)) {
711
+ if (!(0, drop_handler_data_1.isSupportedDropEvent)(event) || !isDragEventInsideCanvas(event)) {
819
712
  return;
820
713
  }
821
714
  if (cannotAddSequence) {
@@ -826,7 +719,8 @@ const Canvas = ({ canvasContent, size }) => {
826
719
  }
827
720
  if (!canDropAssets ||
828
721
  compositionFile === null ||
829
- currentCompositionId === null) {
722
+ currentCompositionId === null ||
723
+ config === null) {
830
724
  return;
831
725
  }
832
726
  if (event.dataTransfer &&
@@ -846,96 +740,16 @@ const Canvas = ({ canvasContent, size }) => {
846
740
  previewSize,
847
741
  size,
848
742
  });
849
- if (isFileDragEvent(event)) {
850
- const files = Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
851
- if (files.length === 0) {
852
- return;
853
- }
854
- const svgImportMode = (0, import_assets_1.hasSvgFile)(files)
855
- ? await chooseSvgImportMode()
856
- : 'image';
857
- if (svgImportMode === null) {
858
- return;
859
- }
860
- await (0, import_assets_1.importAssets)({
861
- files,
862
- compositionFile,
863
- compositionId: currentCompositionId,
864
- destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
865
- dropPosition,
866
- svgImportMode,
867
- });
868
- }
869
- else if (isAssetDragEvent(event)) {
870
- const assetPath = getAssetDragPath(event);
871
- if (assetPath === null) {
872
- return;
873
- }
874
- await (0, import_assets_1.insertExistingAssets)({
875
- assetPaths: [assetPath],
876
- compositionFile,
877
- compositionId: currentCompositionId,
878
- destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
879
- dropPosition,
880
- });
881
- }
882
- else if (isSfxDragEvent(event)) {
883
- const url = getSfxDragUrl(event);
884
- if (url === null) {
885
- return;
886
- }
887
- await (0, import_assets_1.insertRemoteAudio)({
888
- url,
889
- compositionFile,
890
- compositionId: currentCompositionId,
891
- });
892
- }
893
- else if (isCompositionDragEvent(event)) {
894
- const compositionDragData = getCompositionDragData(event);
895
- if (compositionDragData === null) {
896
- return;
897
- }
898
- await (0, import_assets_1.insertComposition)({
899
- composition: compositionDragData,
900
- compositionFile,
901
- compositionId: currentCompositionId,
902
- destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
903
- dropPosition,
904
- });
905
- }
906
- else {
907
- const elementDragData = (0, element_drag_and_drop_1.getElementDragData)(event.dataTransfer);
908
- if (elementDragData !== null) {
909
- await (0, import_assets_1.insertElement)({
910
- element: elementDragData.element,
911
- compositionFile,
912
- compositionId: currentCompositionId,
913
- dropPosition,
914
- });
915
- return;
916
- }
917
- const componentDragData = getComponentDragData(event);
918
- if (componentDragData !== null) {
919
- await (0, import_assets_1.insertComponent)({
920
- component: componentDragData.component,
921
- compositionFile,
922
- compositionId: currentCompositionId,
923
- dropPosition,
924
- });
925
- return;
926
- }
927
- const url = (0, remote_asset_drag_1.getRemoteAssetUrlFromDataTransfer)(event.dataTransfer);
928
- if (url === null) {
929
- return;
930
- }
931
- await (0, import_assets_1.importRemoteAsset)({
932
- url,
933
- compositionFile,
934
- compositionId: currentCompositionId,
935
- destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
936
- dropPosition,
937
- });
938
- }
743
+ await (0, handle_drop_1.handleDrop)({
744
+ chooseSvgImportMode,
745
+ compositionFile,
746
+ compositionId: currentCompositionId,
747
+ destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
748
+ dropPosition,
749
+ event,
750
+ fps: config.fps,
751
+ from: null,
752
+ });
939
753
  }
940
754
  finally {
941
755
  setIsAddingAsset(false);
@@ -946,6 +760,7 @@ const Canvas = ({ canvasContent, size }) => {
946
760
  cannotAddSequence,
947
761
  chooseSvgImportMode,
948
762
  compositionFile,
763
+ config,
949
764
  contentDimensions,
950
765
  currentCompositionId,
951
766
  previewSize,
@@ -956,6 +771,7 @@ const Canvas = ({ canvasContent, size }) => {
956
771
  if (!canDropAssets ||
957
772
  compositionFile === null ||
958
773
  currentCompositionId === null ||
774
+ config === null ||
959
775
  event.clipboardData === null ||
960
776
  activeElement instanceof HTMLInputElement ||
961
777
  activeElement instanceof HTMLTextAreaElement ||
@@ -1023,10 +839,12 @@ const Canvas = ({ canvasContent, size }) => {
1023
839
  try {
1024
840
  await (0, import_assets_1.importAssets)({
1025
841
  files,
842
+ fps: config.fps,
1026
843
  compositionFile,
1027
844
  compositionId: currentCompositionId,
1028
845
  destinationDimensions: contentDimensions === 'none' ? null : contentDimensions,
1029
846
  dropPosition,
847
+ from: null,
1030
848
  svgImportMode,
1031
849
  });
1032
850
  }
@@ -1037,6 +855,7 @@ const Canvas = ({ canvasContent, size }) => {
1037
855
  canDropAssets,
1038
856
  chooseSvgImportMode,
1039
857
  compositionFile,
858
+ config,
1040
859
  contentDimensions,
1041
860
  currentCompositionId,
1042
861
  ]);
@@ -9,7 +9,6 @@ const colors_1 = require("../helpers/colors");
9
9
  const get_folder_id_1 = require("../helpers/get-folder-id");
10
10
  const noop_1 = require("../helpers/noop");
11
11
  const sidebar_scroll_into_view_1 = require("../helpers/sidebar-scroll-into-view");
12
- const url_state_1 = require("../helpers/url-state");
13
12
  const folder_1 = require("../icons/folder");
14
13
  const modals_1 = require("../state/modals");
15
14
  const composition_menu_items_1 = require("./composition-menu-items");
@@ -90,7 +89,9 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
90
89
  ...itemStyle,
91
90
  backgroundColor: dragHovered
92
91
  ? colors_1.WHITE_ALPHA_12
93
- : (0, colors_1.getBackgroundFromHoverState)({ hovered, selected }),
92
+ : hovered || selected
93
+ ? colors_1.WHITE_ALPHA_06
94
+ : colors_1.TRANSPARENT,
94
95
  paddingLeft: 12 + level * 8,
95
96
  };
96
97
  }, [dragHovered, hovered, level, selected]);
@@ -121,42 +122,15 @@ const CompositionSelectorItem = ({ item, level, currentComposition, tabIndex, se
121
122
  const resolvedLocation = (0, use_resolved_stack_1.useResolvedStack)(item.type === 'composition' ? item.composition.stack : item.folder.stack);
122
123
  const contextMenu = (0, react_1.useMemo)(() => {
123
124
  if (item.type === 'composition') {
124
- const compositionMenuItems = (0, composition_menu_items_1.getCompositionMenuItems)({
125
+ return (0, composition_menu_items_1.getCompositionContextMenuItems)({
125
126
  closeMenu: noop_1.noop,
126
127
  composition: item.composition,
127
128
  connectionStatus,
129
+ includeCompositionManagementItems: true,
128
130
  resolvedLocation,
129
131
  setSelectedModal,
130
132
  readOnlyStudio: window.remotion_isReadOnlyStudio,
131
133
  });
132
- return [
133
- {
134
- id: 'open-in-new-window',
135
- keyHint: null,
136
- label: 'Open in new window',
137
- leftItem: null,
138
- onClick: () => {
139
- var _a, _b;
140
- const screen = window.screen;
141
- const width = Math.min(1200, Math.floor(screen.availWidth * 0.8));
142
- const height = Math.min(800, Math.floor(screen.availHeight * 0.8));
143
- const displayLeft = (_a = screen.availLeft) !== null && _a !== void 0 ? _a : 0;
144
- const displayTop = (_b = screen.availTop) !== null && _b !== void 0 ? _b : 0;
145
- const left = Math.round(Math.min(Math.max(window.screenX + (window.outerWidth - width) / 2, displayLeft), displayLeft + screen.availWidth - width));
146
- const top = Math.round(Math.min(Math.max(window.screenY + (window.outerHeight - height) / 2, displayTop), displayTop + screen.availHeight - height));
147
- window.open((0, url_state_1.getUrlForRoute)(`/${item.composition.id}`), '_blank', `popup,width=${width},height=${height},left=${left},top=${top}`);
148
- },
149
- quickSwitcherLabel: null,
150
- subMenu: null,
151
- type: 'item',
152
- value: 'open-in-new-window',
153
- },
154
- {
155
- type: 'divider',
156
- id: 'open-in-new-window-divider',
157
- },
158
- ...compositionMenuItems,
159
- ];
160
134
  }
161
135
  return (0, folder_menu_items_1.getFolderMenuItems)({
162
136
  closeMenu: noop_1.noop,
@@ -13,6 +13,7 @@ const use_image_metadata_1 = require("../helpers/use-image-metadata");
13
13
  const use_media_metadata_1 = require("../helpers/use-media-metadata");
14
14
  const InlineEditableTitle_1 = require("./InlineEditableTitle");
15
15
  const InspectorInfoHeader_1 = require("./InspectorInfoHeader");
16
+ const InspectorPanelLayout_1 = require("./InspectorPanelLayout");
16
17
  const use_rename_static_file_1 = require("./NewComposition/use-rename-static-file");
17
18
  const use_static_files_1 = require("./use-static-files");
18
19
  exports.CURRENT_ASSET_HEIGHT = InspectorInfoHeader_1.INSPECTOR_INFO_HEADER_MIN_HEIGHT;
@@ -115,9 +116,9 @@ const AssetInfo = ({ assetName, contentSized = false, onAssetClick, readOnlyStud
115
116
  const mediaDetailLines = mediaMetadata
116
117
  ? (0, exports.getCurrentAssetMediaDetailLines)(mediaMetadata)
117
118
  : [];
118
- return (jsx_runtime_1.jsxs(InspectorInfoHeader_1.InspectorInfoHeader, { contentSized: contentSized, children: [
119
- jsx_runtime_1.jsx(InlineEditableTitle_1.InlineEditableTitle, { value: fileName, canRename: canRename, getInitialSelection: use_rename_static_file_1.getStaticFileRenameSelection, onClick: onAssetClick, onCommit: onRename, title: assetName }), subtitleParts.length > 0 ? (jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { children: subtitleParts.join(' · ') })) : null, mediaMetadata ? (jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { children: (0, format_media_duration_1.formatMediaDuration)(mediaMetadata.duration) })) : null, mediaDetailLines.map((line) => {
120
- return jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { children: line }, line);
119
+ return (jsx_runtime_1.jsxs(InspectorInfoHeader_1.InspectorInfoHeader, { contentSized: contentSized, padding: contentSized ? `0 ${InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING}px 6px` : '4px 0', children: [
120
+ jsx_runtime_1.jsx(InlineEditableTitle_1.InlineEditableTitle, { value: fileName, canRename: canRename, getInitialSelection: use_rename_static_file_1.getStaticFileRenameSelection, onClick: onAssetClick, onCommit: onRename, size: contentSized ? 'default' : 'inspector', title: assetName }), subtitleParts.length > 0 ? (jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { size: contentSized ? 'default' : 'inspector', children: subtitleParts.join(' · ') })) : null, mediaMetadata ? (jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { size: contentSized ? 'default' : 'inspector', children: (0, format_media_duration_1.formatMediaDuration)(mediaMetadata.duration) })) : null, mediaDetailLines.map((line) => {
121
+ return (jsx_runtime_1.jsx(InspectorInfoHeader_1.InspectorInfoSubtitle, { size: contentSized ? 'default' : 'inspector', children: line }, line));
121
122
  })] }));
122
123
  };
123
124
  exports.AssetInfo = AssetInfo;
@@ -53,6 +53,6 @@ const InlineCompositionName = ({ compositionId, stack, compositions }) => {
53
53
  stack,
54
54
  symbolicatedStack,
55
55
  ]);
56
- return (jsx_runtime_1.jsx(InlineEditableTitle_1.InlineEditableTitle, { value: compositionId, canRename: canRename, onCommit: commit }));
56
+ return (jsx_runtime_1.jsx(InlineEditableTitle_1.InlineEditableTitle, { value: compositionId, canRename: canRename, onCommit: commit, size: "inspector" }));
57
57
  };
58
58
  exports.InlineCompositionName = InlineCompositionName;
@@ -5,5 +5,6 @@ export declare const InlineEditableTitle: React.FC<{
5
5
  readonly getInitialSelection?: (value: string) => [number, number];
6
6
  readonly onClick?: () => void;
7
7
  readonly onCommit: (newValue: string) => void;
8
+ readonly size?: 'default' | 'inspector';
8
9
  readonly title?: string;
9
10
  }>;
@@ -4,6 +4,7 @@ exports.InlineEditableTitle = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const colors_1 = require("../helpers/colors");
7
+ const layout_1 = require("./layout");
7
8
  const titleWrapper = {
8
9
  boxSizing: 'border-box',
9
10
  color: colors_1.WHITE,
@@ -53,7 +54,39 @@ const titleInput = {
53
54
  WebkitAppearance: 'none',
54
55
  width: '100%',
55
56
  };
56
- const InlineEditableTitle = ({ value, canRename, getInitialSelection, onClick, onCommit, title }) => {
57
+ const inspectorTitleWrapper = {
58
+ ...titleWrapper,
59
+ fontFamily: 'sans-serif',
60
+ fontSize: 13,
61
+ height: layout_1.COMPACT_INLINE_ROW_HEIGHT,
62
+ margin: '0 4px',
63
+ width: 'calc(100% - 8px)',
64
+ };
65
+ const inspectorTitleInner = {
66
+ ...titleInner,
67
+ alignItems: 'center',
68
+ fontFamily: 'sans-serif',
69
+ fontSize: 13,
70
+ height: layout_1.COMPACT_INLINE_ROW_HEIGHT,
71
+ paddingBottom: 0,
72
+ paddingLeft: 8,
73
+ paddingRight: 8,
74
+ paddingTop: 0,
75
+ width: '100%',
76
+ };
77
+ const inspectorTitleGridItem = {
78
+ ...titleGridItem,
79
+ color: 'inherit',
80
+ fontFamily: 'sans-serif',
81
+ fontSize: 13,
82
+ lineHeight: '18px',
83
+ };
84
+ const inspectorTitleInput = {
85
+ ...titleInput,
86
+ fontFamily: 'sans-serif',
87
+ fontSize: 13,
88
+ };
89
+ const InlineEditableTitle = ({ value, canRename, getInitialSelection, onClick, onCommit, size = 'default', title, }) => {
57
90
  const [isEditing, setIsEditing] = (0, react_1.useState)(false);
58
91
  const [isHovered, setIsHovered] = (0, react_1.useState)(false);
59
92
  const [draftValue, setDraftValue] = (0, react_1.useState)(value);
@@ -118,22 +151,34 @@ const InlineEditableTitle = ({ value, canRename, getInitialSelection, onClick, o
118
151
  const isInteractive = canRename || onClick !== undefined;
119
152
  const backgroundColor = isEditing
120
153
  ? colors_1.INPUT_BACKGROUND
121
- : isHovered && isInteractive
122
- ? colors_1.WHITE_ALPHA_06
123
- : colors_1.TRANSPARENT;
154
+ : (0, colors_1.getBackgroundFromHoverState)({
155
+ hovered: isHovered && isInteractive,
156
+ selected: false,
157
+ });
158
+ const isInspectorSize = size === 'inspector';
124
159
  const innerStyle = (0, react_1.useMemo)(() => {
125
160
  return {
126
- ...titleInner,
161
+ ...(isInspectorSize ? inspectorTitleInner : titleInner),
127
162
  backgroundColor,
128
- cursor: isEditing ? 'text' : isInteractive ? 'pointer' : 'default',
163
+ cursor: isEditing
164
+ ? 'text'
165
+ : isInspectorSize
166
+ ? 'text'
167
+ : isInteractive
168
+ ? 'pointer'
169
+ : 'default',
129
170
  userSelect: isEditing ? 'text' : 'none',
130
- width: isEditing ? '100%' : undefined,
171
+ width: isEditing || isInspectorSize ? '100%' : undefined,
131
172
  };
132
- }, [backgroundColor, isEditing, isInteractive]);
133
- return (jsx_runtime_1.jsx("div", { style: titleWrapper, title: title !== null && title !== void 0 ? title : value, children: jsx_runtime_1.jsxs("span", { style: innerStyle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onClick: isEditing || !isInteractive ? undefined : handleClick, children: [
173
+ }, [backgroundColor, isEditing, isInspectorSize, isInteractive]);
174
+ const gridItemStyle = isInspectorSize
175
+ ? inspectorTitleGridItem
176
+ : titleGridItem;
177
+ const inputStyle = isInspectorSize ? inspectorTitleInput : titleInput;
178
+ return (jsx_runtime_1.jsx("div", { style: isInspectorSize ? inspectorTitleWrapper : titleWrapper, title: title !== null && title !== void 0 ? title : value, children: jsx_runtime_1.jsxs("span", { style: innerStyle, onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false), onClick: isEditing || !isInteractive ? undefined : handleClick, children: [
134
179
  jsx_runtime_1.jsx("span", { "aria-hidden": isEditing, style: {
135
- ...titleGridItem,
180
+ ...gridItemStyle,
136
181
  visibility: isEditing ? 'hidden' : 'visible',
137
- }, children: value }), isEditing ? (jsx_runtime_1.jsx("input", { ref: focusInput, style: { ...titleGridItem, ...titleInput }, value: draftValue, onChange: onChange, onBlur: onBlur, onKeyDown: onKeyDown })) : null] }) }));
182
+ }, children: value }), isEditing ? (jsx_runtime_1.jsx("input", { ref: focusInput, style: { ...gridItemStyle, ...inputStyle }, value: draftValue, onChange: onChange, onBlur: onBlur, onKeyDown: onKeyDown })) : null] }) }));
138
183
  };
139
184
  exports.InlineEditableTitle = InlineEditableTitle;
@@ -4,10 +4,12 @@ export declare const InspectorInfoHeader: React.FC<{
4
4
  readonly children?: React.ReactNode;
5
5
  readonly contentSized?: boolean;
6
6
  readonly minHeight?: number;
7
+ readonly padding?: React.CSSProperties['padding'];
7
8
  }>;
8
9
  export declare const InspectorInfoTitle: React.FC<{
9
10
  readonly children: React.ReactNode;
10
11
  }>;
11
12
  export declare const InspectorInfoSubtitle: React.FC<{
12
13
  readonly children: React.ReactNode;
14
+ readonly size?: 'default' | 'inspector';
13
15
  }>;
@@ -44,12 +44,24 @@ const subtitle = {
44
44
  textOverflow: 'ellipsis',
45
45
  whiteSpace: 'nowrap',
46
46
  };
47
- const InspectorInfoHeader = ({ children, contentSized = false, minHeight }) => {
48
- const style = contentSized
47
+ const inspectorSubtitle = {
48
+ ...subtitle,
49
+ boxSizing: 'border-box',
50
+ fontFamily: 'sans-serif',
51
+ fontSize: 13,
52
+ height: 28,
53
+ lineHeight: '18px',
54
+ margin: '0 4px',
55
+ padding: '5px 8px',
56
+ width: 'calc(100% - 8px)',
57
+ };
58
+ const InspectorInfoHeader = ({ children, contentSized = false, minHeight, padding }) => {
59
+ const sizeStyle = contentSized
49
60
  ? containerBase
50
61
  : minHeight === undefined
51
62
  ? container
52
63
  : { ...containerBase, minHeight };
64
+ const style = padding === undefined ? sizeStyle : { ...sizeStyle, padding };
53
65
  return (jsx_runtime_1.jsx("div", { style: style, children: children === undefined || children === null ? null : (jsx_runtime_1.jsx("div", { style: row, children: jsx_runtime_1.jsx("div", { style: content, children: children }) })) }));
54
66
  };
55
67
  exports.InspectorInfoHeader = InspectorInfoHeader;
@@ -57,7 +69,7 @@ const InspectorInfoTitle = ({ children }) => {
57
69
  return jsx_runtime_1.jsx("div", { style: title, children: children });
58
70
  };
59
71
  exports.InspectorInfoTitle = InspectorInfoTitle;
60
- const InspectorInfoSubtitle = ({ children }) => {
61
- return jsx_runtime_1.jsx("div", { style: subtitle, children: children });
72
+ const InspectorInfoSubtitle = ({ children, size = 'default' }) => {
73
+ return (jsx_runtime_1.jsx("div", { style: size === 'inspector' ? inspectorSubtitle : subtitle, children: children }));
62
74
  };
63
75
  exports.InspectorInfoSubtitle = InspectorInfoSubtitle;
@@ -24,8 +24,8 @@ const content = {
24
24
  const action = {
25
25
  flexShrink: 0,
26
26
  height: 24,
27
- marginLeft: 4,
28
- marginRight: -4,
27
+ marginLeft: 0,
28
+ marginRight: 4,
29
29
  };
30
30
  const icon = {
31
31
  flexShrink: 0,
@@ -136,6 +136,8 @@ const AlignmentControls = ({ track }) => {
136
136
  const label = undoLabels[direction];
137
137
  if (!propStatus || propStatus.status === 'static') {
138
138
  (0, save_sequence_prop_1.saveSequenceProps)({
139
+ addedKeyframes: null,
140
+ movedKeyframes: null,
139
141
  changes: [
140
142
  {
141
143
  fileName: nodePath.absolutePath,