@remotion/studio 4.0.514 → 4.0.516

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 (222) hide show
  1. package/dist/api/install-package.js +14 -1
  2. package/dist/api/restart-studio.js +4 -0
  3. package/dist/components/AssetSelector.js +3 -9
  4. package/dist/components/AssetSelectorItem.d.ts +3 -1
  5. package/dist/components/AssetSelectorItem.js +41 -42
  6. package/dist/components/AudioWaveform.js +17 -139
  7. package/dist/components/Canvas.js +7 -4
  8. package/dist/components/CaptionInspector.d.ts +2 -0
  9. package/dist/components/CaptionInspector.js +3 -5
  10. package/dist/components/CompositionSelector.js +6 -3
  11. package/dist/components/CompositionSelectorItem.js +9 -10
  12. package/dist/components/ConfigSelect.d.ts +17 -0
  13. package/dist/components/ConfigSelect.js +50 -0
  14. package/dist/components/CurrentAsset.d.ts +10 -2
  15. package/dist/components/CurrentAsset.js +139 -46
  16. package/dist/components/FixComputedValueModal.js +54 -51
  17. package/dist/components/GlobalKeybindings.js +5 -5
  18. package/dist/components/InlineAction.d.ts +1 -1
  19. package/dist/components/InlineAction.js +12 -2
  20. package/dist/components/InlineCaptionInspector.d.ts +2 -0
  21. package/dist/components/InlineCaptionInspector.js +2 -2
  22. package/dist/components/InlineCompositionName.js +1 -1
  23. package/dist/components/InlineEditableTitle.js +3 -2
  24. package/dist/components/InspectorInfoHeader.js +1 -1
  25. package/dist/components/InspectorOpenInEditor.js +48 -72
  26. package/dist/components/InspectorPanel/AlignmentControls.js +2 -3
  27. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +7 -0
  28. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +39 -0
  29. package/dist/components/InspectorPanel/CompositionInspector.js +41 -12
  30. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +10 -4
  31. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -1
  32. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -4
  33. package/dist/components/InspectorPanel/common.d.ts +0 -12
  34. package/dist/components/InspectorPanel/common.js +3 -52
  35. package/dist/components/InspectorPanel/use-composition-actions.js +0 -1
  36. package/dist/components/InspectorPanelLayout.d.ts +1 -1
  37. package/dist/components/InspectorPanelLayout.js +1 -1
  38. package/dist/components/InspectorSequenceSection.js +40 -54
  39. package/dist/components/InstallPackage.d.ts +3 -2
  40. package/dist/components/InstallPackage.js +90 -28
  41. package/dist/components/InstallablePackage.js +37 -11
  42. package/dist/components/KeyboardShortcutsSettings.d.ts +2 -0
  43. package/dist/components/KeyboardShortcutsSettings.js +177 -0
  44. package/dist/components/Menu/MenuDivider.js +1 -1
  45. package/dist/components/MenuBuildIndicator.js +1 -1
  46. package/dist/components/Modals.js +12 -4
  47. package/dist/components/NewComposition/CodemodFooter.d.ts +0 -1
  48. package/dist/components/NewComposition/CodemodFooter.js +2 -8
  49. package/dist/components/NewComposition/DeleteComposition.js +1 -1
  50. package/dist/components/NewComposition/DeleteFolder.js +1 -1
  51. package/dist/components/NewComposition/DuplicateComposition.js +1 -1
  52. package/dist/components/NewComposition/InputDragger.js +27 -4
  53. package/dist/components/NewComposition/NewComposition.js +1 -1
  54. package/dist/components/NewComposition/NewFolder.js +1 -3
  55. package/dist/components/NewComposition/RenameComposition.js +1 -1
  56. package/dist/components/NewComposition/RenameFolder.js +1 -1
  57. package/dist/components/NewComposition/use-rename-static-file.js +1 -1
  58. package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
  59. package/dist/components/Notifications/NotificationCenter.js +5 -0
  60. package/dist/components/OptionsPanel.js +9 -12
  61. package/dist/components/PreviewToolbar.js +5 -2
  62. package/dist/components/PreviewToolbarOverflowButton.js +30 -0
  63. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +2 -2
  64. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +14 -30
  65. package/dist/components/RenderButton.js +66 -183
  66. package/dist/components/RenderModal/DataEditor.js +15 -12
  67. package/dist/components/RenderModal/GuiRenderStatus.js +3 -1
  68. package/dist/components/RenderModal/RenderModalOutputName.js +3 -3
  69. package/dist/components/RenderModal/RenderStatusModal.js +0 -1
  70. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +3 -1
  71. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.d.ts +15 -0
  72. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.js +95 -0
  73. package/dist/components/RenderModal/WebRenderModal.js +4 -2
  74. package/dist/components/RenderQueue/RenderQueueItem.js +3 -1
  75. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +3 -1
  76. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +2 -7
  77. package/dist/components/RenderingSettings.js +7 -4
  78. package/dist/components/RulersAndGuidesToggle.d.ts +2 -0
  79. package/dist/components/RulersAndGuidesToggle.js +23 -0
  80. package/dist/components/SegmentedButton.d.ts +29 -0
  81. package/dist/components/SegmentedButton.js +226 -0
  82. package/dist/components/SelectedOutlineCanvasRotation.d.ts +1 -0
  83. package/dist/components/SelectedOutlineCanvasRotation.js +11 -4
  84. package/dist/components/SelectedOutlineEditingHandles.d.ts +16 -0
  85. package/dist/components/SelectedOutlineEditingHandles.js +66 -0
  86. package/dist/components/SelectedOutlineElement.d.ts +2 -4
  87. package/dist/components/SelectedOutlineElement.js +15 -54
  88. package/dist/components/SelectedOutlineOverlay.js +32 -6
  89. package/dist/components/SelectedOutlinePolygon.d.ts +4 -4
  90. package/dist/components/SelectedOutlinePolygon.js +20 -17
  91. package/dist/components/SelectedOutlineRenderer.js +66 -14
  92. package/dist/components/SettingsModal.d.ts +1 -1
  93. package/dist/components/SettingsModal.js +30 -7
  94. package/dist/components/SettingsModalFooter.js +2 -1
  95. package/dist/components/SkillsSettings.d.ts +2 -0
  96. package/dist/components/SkillsSettings.js +129 -0
  97. package/dist/components/StaticFilePreview.js +7 -1
  98. package/dist/components/StudioSettings.js +7 -48
  99. package/dist/components/Tabs/index.js +1 -1
  100. package/dist/components/Timeline/Timeline.js +0 -1
  101. package/dist/components/Timeline/TimelineAssetField.d.ts +1 -1
  102. package/dist/components/Timeline/TimelineAssetField.js +15 -9
  103. package/dist/components/Timeline/TimelineBooleanField.js +1 -4
  104. package/dist/components/Timeline/TimelineClipboardKeybindings.js +13 -12
  105. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  106. package/dist/components/Timeline/TimelineEffectItem.js +45 -15
  107. package/dist/components/Timeline/TimelineEffectPropItem.js +21 -4
  108. package/dist/components/Timeline/TimelineExpandArrowButton.js +10 -7
  109. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +4 -1
  110. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  111. package/dist/components/Timeline/TimelineExpandedSection.js +8 -5
  112. package/dist/components/Timeline/TimelineFieldLabel.js +4 -2
  113. package/dist/components/Timeline/TimelineFieldRowContent.d.ts +1 -2
  114. package/dist/components/Timeline/TimelineFieldRowContent.js +8 -21
  115. package/dist/components/Timeline/TimelineImageInfo.d.ts +0 -1
  116. package/dist/components/Timeline/TimelineImageInfo.js +13 -32
  117. package/dist/components/Timeline/TimelineKeyframeControls.js +10 -4
  118. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  119. package/dist/components/Timeline/TimelineRotationField.js +0 -2
  120. package/dist/components/Timeline/TimelineRowChrome.d.ts +1 -1
  121. package/dist/components/Timeline/TimelineRowChrome.js +41 -6
  122. package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +0 -1
  123. package/dist/components/Timeline/TimelineRowLayoutContext.js +1 -4
  124. package/dist/components/Timeline/TimelineScaleField.js +2 -6
  125. package/dist/components/Timeline/TimelineSchemaField.js +9 -3
  126. package/dist/components/Timeline/TimelineSelection.d.ts +8 -3
  127. package/dist/components/Timeline/TimelineSelection.js +7 -5
  128. package/dist/components/Timeline/TimelineSequence.d.ts +2 -0
  129. package/dist/components/Timeline/TimelineSequence.js +110 -19
  130. package/dist/components/Timeline/TimelineSequenceItem.js +11 -8
  131. package/dist/components/Timeline/TimelineSequenceName.js +1 -1
  132. package/dist/components/Timeline/TimelineSequencePropItem.js +15 -2
  133. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +4 -2
  134. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +85 -91
  135. package/dist/components/Timeline/TimelineTrack.js +5 -2
  136. package/dist/components/Timeline/TimelineTransformOriginField.js +0 -4
  137. package/dist/components/Timeline/TimelineTranslateField.js +0 -4
  138. package/dist/components/Timeline/TimelineVideoInfo.js +4 -2
  139. package/dist/components/Timeline/TimelineVirtualization.js +3 -1
  140. package/dist/components/Timeline/delete-selected-timeline-item.js +6 -2
  141. package/dist/components/Timeline/duplicate-selected-timeline-item.js +7 -14
  142. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.d.ts +4 -0
  143. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.js +26 -0
  144. package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -19
  145. package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +6 -1
  146. package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +11 -4
  147. package/dist/components/Timeline/save-effect-prop.js +3 -3
  148. package/dist/components/Timeline/split-selected-timeline-item.js +0 -1
  149. package/dist/components/Timeline/timeline-field-row-layout.d.ts +1 -1
  150. package/dist/components/Timeline/timeline-field-row-layout.js +4 -7
  151. package/dist/components/Timeline/timeline-field-utils.js +0 -2
  152. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  153. package/dist/components/TimelineCombobox.js +25 -160
  154. package/dist/components/TimelineInOutToggle.js +4 -1
  155. package/dist/components/duplicate-jsx-node-api.d.ts +2 -0
  156. package/dist/components/duplicate-jsx-node-api.js +12 -0
  157. package/dist/components/effect-drag-and-drop.js +7 -7
  158. package/dist/components/effect-operations-api.d.ts +8 -0
  159. package/dist/components/effect-operations-api.js +52 -0
  160. package/dist/components/handle-drop.d.ts +2 -1
  161. package/dist/components/handle-drop.js +3 -3
  162. package/dist/components/import-assets.js +9 -65
  163. package/dist/components/keyboard-shortcuts.d.ts +10 -0
  164. package/dist/components/keyboard-shortcuts.js +135 -0
  165. package/dist/components/selected-outline-control-layout.js +2 -6
  166. package/dist/components/selected-outline-measurement.d.ts +1 -1
  167. package/dist/components/selected-outline-measurement.js +16 -3
  168. package/dist/components/use-delete-asset.d.ts +1 -0
  169. package/dist/components/use-delete-asset.js +40 -0
  170. package/dist/components/use-selected-outline-control-target.d.ts +11 -0
  171. package/dist/components/use-selected-outline-control-target.js +79 -0
  172. package/dist/error-overlay/remotion-overlay/log-studio-error.js +4 -0
  173. package/dist/esm/{chunk-r46yxrjr.js → chunk-4bxz1d3g.js} +4 -3
  174. package/dist/esm/{chunk-xn2q7eem.js → chunk-w4244j4n.js} +14747 -14549
  175. package/dist/esm/index.mjs +3 -0
  176. package/dist/esm/internals.mjs +14747 -14549
  177. package/dist/esm/previewEntry.mjs +14557 -14359
  178. package/dist/esm/renderEntry.mjs +2 -2
  179. package/dist/helpers/add-asset-cache-bust.d.ts +4 -0
  180. package/dist/helpers/add-asset-cache-bust.js +10 -0
  181. package/dist/helpers/browser-studio-operations.d.ts +3 -0
  182. package/dist/helpers/browser-studio-operations.js +18 -1
  183. package/dist/helpers/calculate-timeline.js +2 -1
  184. package/dist/helpers/colors.d.ts +3 -1
  185. package/dist/helpers/colors.js +7 -3
  186. package/dist/helpers/drag-aware-double-click.d.ts +6 -0
  187. package/dist/helpers/drag-aware-double-click.js +20 -0
  188. package/dist/helpers/get-asset-metadata.js +25 -16
  189. package/dist/helpers/get-sequence-double-click-action.d.ts +2 -1
  190. package/dist/helpers/get-sequence-double-click-action.js +7 -1
  191. package/dist/helpers/get-timeline-sequence-layout.d.ts +4 -1
  192. package/dist/helpers/get-timeline-sequence-layout.js +15 -6
  193. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -1
  194. package/dist/helpers/hoverable.d.ts +1 -0
  195. package/dist/helpers/hoverable.js +2 -1
  196. package/dist/helpers/inject-css.js +7 -3
  197. package/dist/helpers/open-in-remotion-convert.d.ts +7 -0
  198. package/dist/helpers/open-in-remotion-convert.js +18 -0
  199. package/dist/helpers/use-max-media-duration.js +5 -3
  200. package/dist/helpers/use-media-metadata.d.ts +2 -1
  201. package/dist/helpers/use-media-metadata.js +49 -25
  202. package/dist/helpers/use-menu-structure.js +54 -67
  203. package/dist/icons/align-center-horizontal.js +1 -1
  204. package/dist/icons/align-left.js +1 -1
  205. package/dist/icons/align-right.js +1 -1
  206. package/dist/icons/cloud-download.d.ts +4 -0
  207. package/dist/icons/cloud-download.js +8 -0
  208. package/dist/icons/keyboard.d.ts +4 -0
  209. package/dist/icons/keyboard.js +10 -0
  210. package/dist/icons/license.d.ts +4 -0
  211. package/dist/icons/license.js +8 -0
  212. package/dist/icons/package.d.ts +4 -0
  213. package/dist/icons/package.js +8 -0
  214. package/dist/icons/react.js +1 -1
  215. package/dist/icons/remotion-convert.d.ts +4 -0
  216. package/dist/icons/remotion-convert.js +10 -0
  217. package/dist/icons/skills.d.ts +4 -0
  218. package/dist/icons/skills.js +10 -0
  219. package/dist/state/modals.d.ts +2 -5
  220. package/package.json +12 -12
  221. package/dist/components/KeyboardShortcutsExplainer.d.ts +0 -2
  222. package/dist/components/KeyboardShortcutsExplainer.js +0 -194
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.saveEffectProp = exports.saveMultipleEffectProps = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
- const call_api_1 = require("../call-api");
5
+ const effect_operations_api_1 = require("../effect-operations-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
8
  const saveMultipleEffectProps = ({ changes, setPropStatuses, clientId, undoLabel, redoLabel, }) => {
@@ -21,7 +21,7 @@ const saveMultipleEffectProps = ({ changes, setPropStatuses, clientId, undoLabel
21
21
  schema: change.schema,
22
22
  }));
23
23
  }
24
- return (0, call_api_1.callApi)('/api/save-multiple-effect-props', {
24
+ return (0, effect_operations_api_1.saveMultipleEffectProps)({
25
25
  edits: changes.map((change) => change.type === 'effect-param'
26
26
  ? {
27
27
  type: 'effect-param',
@@ -71,7 +71,7 @@ const saveEffectProp = (input) => {
71
71
  schema,
72
72
  }),
73
73
  applyServerResponse: (prev, response) => (0, apply_effect_response_to_prop_statuses_1.applyEffectResponseToPropStatuses)({ previous: prev, response }),
74
- apiCall: () => (0, call_api_1.callApi)('/api/save-effect-props', input.type === 'effect-param'
74
+ apiCall: () => (0, effect_operations_api_1.saveEffectProps)(input.type === 'effect-param'
75
75
  ? {
76
76
  type: 'effect-param',
77
77
  fileName,
@@ -97,7 +97,6 @@ const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
97
97
  })
98
98
  .then((result) => {
99
99
  if (result.success) {
100
- (0, NotificationCenter_1.showNotification)('Split sequence', 2000);
101
100
  return true;
102
101
  }
103
102
  (0, NotificationCenter_1.showNotification)(result.reason, 4000);
@@ -1,10 +1,10 @@
1
1
  import type React from 'react';
2
2
  import { type SchemaFieldInfo } from '../../helpers/timeline-layout';
3
+ export declare const TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
3
4
  export declare const isTimelineFieldStacked: ({ field, transform3DMode, }: {
4
5
  readonly field: SchemaFieldInfo;
5
6
  readonly transform3DMode: boolean;
6
7
  }) => boolean;
7
8
  export declare const getTimelineFieldLabelRowStyle: (depth: number, basePadding?: number | undefined) => React.CSSProperties;
8
9
  export declare const timelineFieldValueColumnStyle: React.CSSProperties;
9
- export declare const timelineCompactStackedFieldValueColumnStyle: React.CSSProperties;
10
10
  export declare const timelineStackedFieldContentStyle: React.CSSProperties;
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.timelineStackedFieldContentStyle = exports.timelineCompactStackedFieldValueColumnStyle = exports.timelineFieldValueColumnStyle = exports.getTimelineFieldLabelRowStyle = exports.isTimelineFieldStacked = void 0;
3
+ exports.timelineStackedFieldContentStyle = exports.timelineFieldValueColumnStyle = exports.getTimelineFieldLabelRowStyle = exports.isTimelineFieldStacked = exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = void 0;
4
4
  const timeline_layout_1 = require("../../helpers/timeline-layout");
5
5
  const timeline_row_layout_1 = require("./timeline-row-layout");
6
+ exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
6
7
  const isTimelineFieldStacked = ({ field, transform3DMode, }) => {
7
8
  return (field.typeName === 'text-content' ||
8
9
  (transform3DMode &&
@@ -31,16 +32,12 @@ exports.timelineFieldValueColumnStyle = {
31
32
  minWidth: 0,
32
33
  paddingRight: timeline_layout_1.EXPANDED_SECTION_PADDING_RIGHT,
33
34
  };
34
- exports.timelineCompactStackedFieldValueColumnStyle = {
35
- ...exports.timelineFieldValueColumnStyle,
36
- marginBottom: -3,
37
- position: 'relative',
38
- top: -3,
39
- };
40
35
  exports.timelineStackedFieldContentStyle = {
41
36
  alignSelf: 'stretch',
37
+ boxSizing: 'border-box',
42
38
  display: 'flex',
43
39
  flex: 1,
44
40
  flexDirection: 'column',
45
41
  minWidth: 0,
42
+ paddingBlock: 3,
46
43
  };
@@ -36,7 +36,5 @@ exports.draggerStyle = {
36
36
  width: 80,
37
37
  };
38
38
  exports.leftAlignedDraggerStyle = {
39
- paddingBottom: 2,
40
39
  paddingLeft: 0,
41
- paddingTop: 2,
42
40
  };
@@ -132,6 +132,7 @@ const useTimelineAssetDrop = () => {
132
132
  event,
133
133
  fps: videoConfig.fps,
134
134
  from: frame,
135
+ localFiles: null,
135
136
  preferCompositionStart: false,
136
137
  });
137
138
  }
@@ -1,181 +1,46 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.TimelineCombobox = void 0;
7
4
  const jsx_runtime_1 = require("react/jsx-runtime");
8
- const player_1 = require("@remotion/player");
9
- const react_1 = require("react");
10
- const react_dom_1 = __importDefault(require("react-dom"));
11
5
  const colors_1 = require("../helpers/colors");
12
- const mobile_layout_1 = require("../helpers/mobile-layout");
13
- const noop_1 = require("../helpers/noop");
14
6
  const caret_1 = require("../icons/caret");
15
- const z_index_1 = require("../state/z-index");
16
7
  const layout_1 = require("./layout");
17
- const is_menu_item_1 = require("./Menu/is-menu-item");
18
- const portals_1 = require("./Menu/portals");
19
- const styles_1 = require("./Menu/styles");
20
- const MenuContent_1 = require("./NewComposition/MenuContent");
21
- const container = {
22
- boxSizing: 'border-box',
23
- border: 'none',
24
- borderRadius: 3,
25
- height: 24,
26
- padding: '0 4px',
27
- fontFamily: 'inherit',
28
- maxWidth: '100%',
8
+ const SegmentedButton_1 = require("./SegmentedButton");
9
+ const segmentedButtonStyle = {
10
+ height: 28,
29
11
  };
30
12
  const label = {
31
13
  flex: 'none',
32
- overflow: 'hidden',
33
- textOverflow: 'ellipsis',
34
14
  fontFamily: 'inherit',
35
15
  fontSize: 12,
36
16
  lineHeight: '16px',
37
- color: colors_1.WHITE_ALPHA_80,
38
17
  minWidth: 0,
18
+ overflow: 'hidden',
39
19
  textAlign: 'left',
20
+ textOverflow: 'ellipsis',
40
21
  whiteSpace: 'nowrap',
41
22
  };
42
23
  const TimelineCombobox = ({ values, selectedId, title, labelWidth = 32, renderLeftItem, unhoveredIconColor = colors_1.LIGHT_TEXT, }) => {
43
- const [hovered, setIsHovered] = (0, react_1.useState)(false);
44
- const [opened, setOpened] = (0, react_1.useState)(false);
45
- const ref = (0, react_1.useRef)(null);
46
- const { tabIndex, currentZIndex } = (0, z_index_1.useZIndex)();
47
- const size = player_1.PlayerInternals.useElementSize(ref, {
48
- triggerOnWindowResize: true,
49
- shouldApplyCssTransforms: true,
50
- });
51
- const refresh = size === null || size === void 0 ? void 0 : size.refresh;
52
- const onHide = (0, react_1.useCallback)(() => {
53
- setOpened(false);
54
- }, []);
55
- const onOverlayPointerDown = (0, react_1.useCallback)((e) => {
56
- e.stopPropagation();
57
- }, []);
58
- (0, react_1.useEffect)(() => {
59
- const { current } = ref;
60
- if (!current) {
61
- return;
62
- }
63
- const onMouseEnter = () => setIsHovered(true);
64
- const onMouseLeave = () => setIsHovered(false);
65
- const onPointerDown = (e) => {
66
- e.stopPropagation();
67
- return setOpened((isOpened) => {
68
- if (!isOpened) {
69
- refresh === null || refresh === void 0 ? void 0 : refresh();
70
- }
71
- return !isOpened;
72
- });
73
- };
74
- const onClick = (e) => {
75
- e.stopPropagation();
76
- const isKeyboardInitiated = e.detail === 0;
77
- if (!isKeyboardInitiated) {
78
- return;
79
- }
80
- return setOpened((isOpened) => {
81
- if (!isOpened) {
82
- refresh === null || refresh === void 0 ? void 0 : refresh();
83
- window.addEventListener('pointerup', (evt) => {
84
- if (!(0, is_menu_item_1.isMenuItem)(evt.target)) {
85
- setOpened(false);
86
- }
87
- }, { once: true });
88
- }
89
- return !isOpened;
90
- });
91
- };
92
- current.addEventListener('mouseenter', onMouseEnter);
93
- current.addEventListener('mouseleave', onMouseLeave);
94
- current.addEventListener('pointerdown', onPointerDown);
95
- current.addEventListener('click', onClick);
96
- return () => {
97
- current.removeEventListener('mouseenter', onMouseEnter);
98
- current.removeEventListener('mouseleave', onMouseLeave);
99
- current.removeEventListener('pointerdown', onPointerDown);
100
- current.removeEventListener('click', onClick);
101
- };
102
- }, [refresh]);
103
- const spaceToBottom = (0, react_1.useMemo)(() => {
104
- const margin = 10;
105
- if (size && opened) {
106
- return size.windowSize.height - (size.top + size.height) - margin;
107
- }
108
- return 0;
109
- }, [opened, size]);
110
- const spaceToTop = (0, react_1.useMemo)(() => {
111
- const margin = 10;
112
- if (size && opened) {
113
- return size.top - margin;
114
- }
115
- return 0;
116
- }, [opened, size]);
117
- const derivedMaxHeight = (0, react_1.useMemo)(() => {
118
- return spaceToTop > spaceToBottom ? spaceToTop : spaceToBottom;
119
- }, [spaceToBottom, spaceToTop]);
120
- const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
121
- const portalStyle = (0, react_1.useMemo)(() => {
122
- if (!opened || !size) {
123
- return null;
124
- }
125
- const spaceToRight = size.windowSize.width - size.left;
126
- const spaceToLeft = size.left + size.width;
127
- const minSpaceRequired = isMobileLayout
128
- ? styles_1.MAX_MOBILE_MENU_WIDTH
129
- : styles_1.MAX_MENU_WIDTH;
130
- const verticalLayout = spaceToTop > spaceToBottom ? 'bottom' : 'top';
131
- const canOpenOnLeft = spaceToLeft >= minSpaceRequired;
132
- const canOpenOnRight = spaceToRight >= minSpaceRequired;
133
- const horizontalLayout = canOpenOnRight ? 'left' : 'right';
134
- return {
135
- ...(verticalLayout === 'top'
136
- ? {
137
- ...styles_1.menuContainerTowardsBottom,
138
- top: size.top + size.height,
139
- }
140
- : {
141
- ...styles_1.menuContainerTowardsTop,
142
- bottom: size.windowSize.height - size.top,
143
- }),
144
- ...(horizontalLayout === 'left'
145
- ? { left: size.left }
146
- : canOpenOnLeft
147
- ? { right: size.windowSize.width - size.left - size.width }
148
- : { left: 0 }),
149
- };
150
- }, [isMobileLayout, opened, size, spaceToBottom, spaceToTop]);
151
24
  const selected = values.find((value) => value.id === selectedId);
152
- const style = (0, react_1.useMemo)(() => {
153
- return {
154
- ...container,
155
- userSelect: 'none',
156
- WebkitUserSelect: 'none',
157
- display: 'inline-flex',
158
- flexDirection: 'row',
159
- alignItems: 'center',
160
- backgroundColor: (0, colors_1.getBackgroundFromHoverState)({
161
- hovered,
162
- selected: opened,
163
- }),
164
- };
165
- }, [hovered, opened]);
166
- const foregroundColor = hovered || opened ? colors_1.WHITE : colors_1.WHITE_ALPHA_80;
167
- const labelStyle = (0, react_1.useMemo)(() => {
168
- return {
169
- ...label,
170
- width: labelWidth,
171
- color: foregroundColor,
172
- };
173
- }, [foregroundColor, labelWidth]);
174
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
175
- jsx_runtime_1.jsxs("button", { ref: ref, title: title, "aria-label": title, tabIndex: tabIndex, type: "button", style: style, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, children: [renderLeftItem ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem(foregroundColor), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
176
- ] })) : null, selected ? (jsx_runtime_1.jsx("div", { title: typeof selected.label === 'string' ? selected.label : undefined, style: labelStyle, children: selected.label })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { color: hovered || opened ? colors_1.WHITE : unhoveredIconColor })
177
- ] }), portalStyle
178
- ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, onPointerDown: onOverlayPointerDown, children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: values, onHide: onHide, leaveLeftSpace: true, preselectIndex: values.findIndex((value) => selected && value.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
179
- : null] }));
25
+ const segments = [
26
+ {
27
+ ariaLabel: title,
28
+ buttonId: null,
29
+ disabled: false,
30
+ idleColor: unhoveredIconColor,
31
+ leaveLeftSpace: true,
32
+ onOpenChange: null,
33
+ renderContent: (color) => (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem(color), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
34
+ ] })) : null, selected ? (jsx_runtime_1.jsx("div", { title: typeof selected.label === 'string' ? selected.label : undefined, style: { ...label, width: labelWidth }, children: selected.label })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { color: color })
35
+ ] })),
36
+ segmentId: 'selector',
37
+ selectedId,
38
+ style: { fontFamily: 'inherit', padding: '0 4px' },
39
+ title,
40
+ type: 'menu',
41
+ values,
42
+ },
43
+ ];
44
+ return (jsx_runtime_1.jsx(SegmentedButton_1.SegmentedButton, { segments: segments, style: segmentedButtonStyle, title: null }));
180
45
  };
181
46
  exports.TimelineCombobox = TimelineCombobox;
@@ -22,6 +22,9 @@ const style = {
22
22
  width: 17,
23
23
  height: 17,
24
24
  };
25
+ const buttonStyle = {
26
+ width: 18,
27
+ };
25
28
  exports.inOutHandles = (0, react_1.createRef)();
26
29
  exports.defaultInOutValue = { inFrame: null, outFrame: null };
27
30
  const TimelineInOutPointToggle = () => {
@@ -243,7 +246,7 @@ const TimelineInOutPointToggle = () => {
243
246
  };
244
247
  }, [confId, onInMark, onInOutClear, onOutMark]);
245
248
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
246
- jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('In', 'I'), "aria-label": getTooltipText('In', 'I'), onClick: onInMark, onContextMenu: clearInMark, disabled: !videoConfig || isFirstFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineInPointer, { color: inFrame === null ? color : colors_1.BLUE, style: style })) }), jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('Out', 'O'), "aria-label": getTooltipText('Out', 'O'), onClick: onOutMark, onContextMenu: clearOutMark, disabled: !videoConfig || isLastFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineOutPointer, { color: outFrame === null ? color : colors_1.BLUE, style: style })) })
249
+ jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('In', 'I'), "aria-label": getTooltipText('In', 'I'), style: buttonStyle, onClick: onInMark, onContextMenu: clearInMark, disabled: !videoConfig || isFirstFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineInPointer, { color: inFrame === null ? color : colors_1.BLUE, style: style })) }), jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('Out', 'O'), "aria-label": getTooltipText('Out', 'O'), style: buttonStyle, onClick: onOutMark, onContextMenu: clearOutMark, disabled: !videoConfig || isLastFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineOutPointer, { color: outFrame === null ? color : colors_1.BLUE, style: style })) })
247
250
  ] }));
248
251
  };
249
252
  exports.TimelineInOutPointToggle = TimelineInOutPointToggle;
@@ -0,0 +1,2 @@
1
+ import type { DuplicateJsxNodeRequest, DuplicateJsxNodeResponse } from '@remotion/studio-shared';
2
+ export declare const duplicateJsxNode: (request: DuplicateJsxNodeRequest) => Promise<DuplicateJsxNodeResponse>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.duplicateJsxNode = void 0;
4
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
5
+ const call_api_1 = require("./call-api");
6
+ const duplicateJsxNode = (request) => {
7
+ const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
8
+ return browserStudioOperations
9
+ ? browserStudioOperations.duplicateJsxNode(request)
10
+ : (0, call_api_1.callApi)('/api/duplicate-jsx-node', request);
11
+ };
12
+ exports.duplicateJsxNode = duplicateJsxNode;
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.addEffectToSequence = exports.addEffectFromDragData = exports.getEffectDragData = exports.hasExplicitEffectDragType = exports.hasEffectDragType = void 0;
4
4
  const studio_protocol_1 = require("@remotion/studio-protocol");
5
5
  const studio_shared_1 = require("@remotion/studio-shared");
6
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
6
7
  const install_required_package_1 = require("../helpers/install-required-package");
7
- const call_api_1 = require("./call-api");
8
+ const effect_operations_api_1 = require("./effect-operations-api");
8
9
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
9
10
  const hasEffectDragType = (dataTransfer) => {
10
11
  var _a;
@@ -33,8 +34,10 @@ exports.addEffectFromDragData = addEffectFromDragData;
33
34
  const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) => {
34
35
  try {
35
36
  const requiredPackage = (0, studio_shared_1.getRequiredPackageForEffectImportPath)(effect.importPath);
36
- await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [{ name: requiredPackage, version: null }] : []);
37
- const result = await (0, call_api_1.callApi)('/api/add-effect', {
37
+ if ((0, browser_studio_operations_1.getBrowserStudioEffectOperations)() === null) {
38
+ await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [{ name: requiredPackage, version: null }] : []);
39
+ }
40
+ const result = await (0, effect_operations_api_1.addEffect)({
38
41
  fileName,
39
42
  sequenceNodePath: nodePath,
40
43
  effectName: effect.name,
@@ -42,10 +45,7 @@ const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) =>
42
45
  effectConfig: effect.config,
43
46
  clientId,
44
47
  });
45
- if (result.success) {
46
- (0, NotificationCenter_1.showNotification)(`Added ${effect.name}()`, 2000);
47
- }
48
- else {
48
+ if (!result.success) {
49
49
  (0, NotificationCenter_1.showNotification)(result.reason, 4000);
50
50
  }
51
51
  }
@@ -0,0 +1,8 @@
1
+ import type { AddEffectRequest, DeleteEffectRequest, DuplicateEffectRequest, PasteEffectsRequest, ReorderEffectRequest, SaveEffectPropsRequest, SaveMultipleEffectPropsRequest } from '@remotion/studio-shared';
2
+ export declare const addEffect: (request: AddEffectRequest) => Promise<import("@remotion/studio-shared").AddEffectResponse>;
3
+ export declare const deleteEffects: (request: DeleteEffectRequest) => Promise<import("@remotion/studio-shared").DeleteEffectResponse>;
4
+ export declare const duplicateEffects: (request: DuplicateEffectRequest) => Promise<import("@remotion/studio-shared").DuplicateEffectResponse>;
5
+ export declare const pasteEffects: (request: PasteEffectsRequest) => Promise<import("@remotion/studio-shared").PasteEffectsResponse>;
6
+ export declare const reorderEffect: (request: ReorderEffectRequest) => Promise<import("@remotion/studio-shared").ReorderEffectResponse>;
7
+ export declare const saveEffectProps: (request: SaveEffectPropsRequest) => Promise<import("remotion").CanUpdateEffectPropsResponse>;
8
+ export declare const saveMultipleEffectProps: (request: SaveMultipleEffectPropsRequest) => Promise<import("@remotion/studio-shared").SaveMultipleEffectPropsResponse>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saveMultipleEffectProps = exports.saveEffectProps = exports.reorderEffect = exports.pasteEffects = exports.duplicateEffects = exports.deleteEffects = exports.addEffect = void 0;
4
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
5
+ const call_api_1 = require("./call-api");
6
+ const getBrowserEffectOperations = () => {
7
+ var _a;
8
+ var _b;
9
+ return (_b = (_a = (0, browser_studio_operations_1.getBrowserStudioOperations)()) === null || _a === void 0 ? void 0 : _a.effects) !== null && _b !== void 0 ? _b : null;
10
+ };
11
+ const addEffect = (request) => {
12
+ var _a;
13
+ var _b;
14
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.addEffect(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/add-effect', request);
15
+ };
16
+ exports.addEffect = addEffect;
17
+ const deleteEffects = (request) => {
18
+ var _a;
19
+ var _b;
20
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.deleteEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/delete-effect', request);
21
+ };
22
+ exports.deleteEffects = deleteEffects;
23
+ const duplicateEffects = (request) => {
24
+ var _a;
25
+ var _b;
26
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.duplicateEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/duplicate-effect', request);
27
+ };
28
+ exports.duplicateEffects = duplicateEffects;
29
+ const pasteEffects = (request) => {
30
+ var _a;
31
+ var _b;
32
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.pasteEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/paste-effects', request);
33
+ };
34
+ exports.pasteEffects = pasteEffects;
35
+ const reorderEffect = (request) => {
36
+ var _a;
37
+ var _b;
38
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.reorderEffect(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/reorder-effect', request);
39
+ };
40
+ exports.reorderEffect = reorderEffect;
41
+ const saveEffectProps = (request) => {
42
+ var _a;
43
+ var _b;
44
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.saveEffectProps(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/save-effect-props', request);
45
+ };
46
+ exports.saveEffectProps = saveEffectProps;
47
+ const saveMultipleEffectProps = (request) => {
48
+ var _a;
49
+ var _b;
50
+ return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.saveMultipleEffectProps(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/save-multiple-effect-props', request);
51
+ };
52
+ exports.saveMultipleEffectProps = saveMultipleEffectProps;
@@ -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, preferCompositionStart, }: {
4
+ export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, localFiles, preferCompositionStart, }: {
5
5
  chooseSvgImportMode: () => Promise<SvgImportMode | null>;
6
6
  compositionFile: string;
7
7
  compositionId: string;
@@ -10,5 +10,6 @@ export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compos
10
10
  event: DragEvent;
11
11
  fps: number;
12
12
  from: number | null;
13
+ localFiles: File[] | null;
13
14
  preferCompositionStart: boolean;
14
15
  }) => Promise<void>;
@@ -6,11 +6,11 @@ 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, preferCompositionStart, }) => {
9
+ const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, localFiles, preferCompositionStart, }) => {
10
10
  var _a;
11
11
  var _b;
12
- if ((0, drop_handler_data_1.isFileDragEvent)(event)) {
13
- const files = Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
12
+ if (localFiles !== null || (0, drop_handler_data_1.isFileDragEvent)(event)) {
13
+ const files = localFiles !== null && localFiles !== void 0 ? localFiles : Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
14
14
  if (files.length === 0) {
15
15
  return;
16
16
  }