@remotion/studio 4.0.502 → 4.0.504

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 (217) hide show
  1. package/dist/api/install-package.d.ts +2 -1
  2. package/dist/api/install-package.js +6 -2
  3. package/dist/components/AssetSelectorItem.js +4 -16
  4. package/dist/components/Canvas.js +41 -54
  5. package/dist/components/CheckboardToggle.js +3 -1
  6. package/dist/components/ColorPicker/AlphaSlider.js +14 -10
  7. package/dist/components/ColorPicker/HueSlider.js +14 -10
  8. package/dist/components/ColorPicker/SaturationValueArea.js +14 -12
  9. package/dist/components/CompositionContextButton.js +1 -1
  10. package/dist/components/CompositionSelectorItem.js +2 -3
  11. package/dist/components/ConfigureDefaultEditorModal.d.ts +2 -0
  12. package/dist/components/ConfigureDefaultEditorModal.js +151 -0
  13. package/dist/components/ConfirmationDialog.js +6 -3
  14. package/dist/components/ContextMenu.js +0 -2
  15. package/dist/components/ControlButton.d.ts +4 -2
  16. package/dist/components/ControlButton.js +6 -20
  17. package/dist/components/Editor.js +1 -4
  18. package/dist/components/EditorContent.js +1 -1
  19. package/dist/components/EditorGuides/Guide.js +48 -74
  20. package/dist/components/EditorRuler/Ruler.d.ts +1 -0
  21. package/dist/components/EditorRuler/Ruler.js +3 -1
  22. package/dist/components/EditorRuler/index.js +26 -23
  23. package/dist/components/EffectPickerModal.js +68 -7
  24. package/dist/components/ElementInstallConfirmation.d.ts +12 -0
  25. package/dist/components/ElementInstallConfirmation.js +205 -0
  26. package/dist/components/ForceSpecificCursor.js +14 -0
  27. package/dist/components/FullscreenToggle.js +1 -2
  28. package/dist/components/InitialCompositionLoader.js +1 -14
  29. package/dist/components/InlineAction.d.ts +4 -4
  30. package/dist/components/InlineAction.js +6 -4
  31. package/dist/components/InspectorLocationCopy.d.ts +1 -0
  32. package/dist/components/InspectorLocationCopy.js +7 -3
  33. package/dist/components/InspectorOpenInEditor.d.ts +5 -0
  34. package/dist/components/InspectorOpenInEditor.js +135 -0
  35. package/dist/components/InspectorPanel/AlignmentControls.js +1 -1
  36. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +3 -3
  37. package/dist/components/InspectorPanel/CompositionMetadata.js +8 -7
  38. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +2 -2
  39. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -3
  40. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -2
  41. package/dist/components/InspectorPanel/styles.js +4 -0
  42. package/dist/components/InspectorSequenceSection.js +2 -2
  43. package/dist/components/LoopToggle.js +1 -1
  44. package/dist/components/Menu/MenuItem.js +13 -6
  45. package/dist/components/Menu/MenuSubItem.js +3 -1
  46. package/dist/components/MenuBuildIndicator.d.ts +3 -1
  47. package/dist/components/MenuBuildIndicator.js +6 -4
  48. package/dist/components/MenuCompositionName.js +1 -1
  49. package/dist/components/MenuToolbar.js +1 -1
  50. package/dist/components/MobilePanel.d.ts +1 -2
  51. package/dist/components/MobilePanel.js +6 -6
  52. package/dist/components/ModalContainer.js +1 -1
  53. package/dist/components/ModalFooter.d.ts +1 -0
  54. package/dist/components/ModalFooter.js +2 -2
  55. package/dist/components/Modals.js +11 -2
  56. package/dist/components/MuteToggle.js +2 -1
  57. package/dist/components/NewComposition/ComboBox.d.ts +1 -0
  58. package/dist/components/NewComposition/ComboBox.js +2 -2
  59. package/dist/components/NewComposition/InputDragger.d.ts +4 -0
  60. package/dist/components/NewComposition/InputDragger.js +26 -32
  61. package/dist/components/Notifications/NotificationCenter.js +12 -2
  62. package/dist/components/OutlineToggle.js +10 -2
  63. package/dist/components/PlayPause.js +1 -5
  64. package/dist/components/PlaybackRateSelector.js +2 -1
  65. package/dist/components/PreviewToolbar.js +8 -7
  66. package/dist/components/PreviewToolbarOverflowButton.d.ts +0 -1
  67. package/dist/components/PreviewToolbarOverflowButton.js +2 -75
  68. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -2
  69. package/dist/components/RenderButton.d.ts +0 -1
  70. package/dist/components/RenderButton.js +10 -9
  71. package/dist/components/RenderModal/FrameRangeSetting.js +6 -1
  72. package/dist/components/RenderModal/InlineEyeIcon.js +1 -1
  73. package/dist/components/RenderModal/InlineRemoveButton.js +1 -1
  74. package/dist/components/RenderModal/MultiRangeSlider.js +8 -8
  75. package/dist/components/RenderModal/RenderModalEnvironmentVariables.js +1 -9
  76. package/dist/components/RenderModal/RenderModalOutputName.js +12 -3
  77. package/dist/components/RenderModal/SchemaEditor/SchemaResetButton.js +1 -1
  78. package/dist/components/RenderModal/ServerRenderModal.js +2 -17
  79. package/dist/components/RenderModal/WebRenderModal.js +3 -17
  80. package/dist/components/RenderModal/layout.js +7 -5
  81. package/dist/components/RenderModal/render-modals.js +18 -15
  82. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +1 -1
  83. package/dist/components/RenderQueue/RenderQueueDownloadItem.js +1 -1
  84. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +1 -1
  85. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +1 -1
  86. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +1 -1
  87. package/dist/components/RenderQueue/RenderQueueRepeat.js +2 -15
  88. package/dist/components/SelectedOutlineCropControls.js +7 -6
  89. package/dist/components/SelectedOutlineElement.js +32 -38
  90. package/dist/components/SelectedOutlineUvControls.js +25 -24
  91. package/dist/components/ShowGuidesProvider.js +2 -0
  92. package/dist/components/SidebarCollapserControls.js +2 -2
  93. package/dist/components/SidebarRenderButton.js +2 -16
  94. package/dist/components/SizeSelector.js +2 -1
  95. package/dist/components/SnappingToggle.js +1 -2
  96. package/dist/components/Spinner.d.ts +1 -0
  97. package/dist/components/Spinner.js +2 -2
  98. package/dist/components/Splitter/SplitterContainer.d.ts +1 -0
  99. package/dist/components/Splitter/SplitterContainer.js +4 -1
  100. package/dist/components/Splitter/SplitterContext.d.ts +4 -3
  101. package/dist/components/Splitter/SplitterContext.js +3 -2
  102. package/dist/components/Splitter/SplitterElement.js +6 -1
  103. package/dist/components/Splitter/SplitterHandle.js +18 -68
  104. package/dist/components/Tabs/vertical.d.ts +1 -0
  105. package/dist/components/Tabs/vertical.js +8 -10
  106. package/dist/components/TimeValue.js +26 -8
  107. package/dist/components/Timeline/EasingEditorModal.js +27 -19
  108. package/dist/components/Timeline/Timeline.js +1 -1
  109. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  110. package/dist/components/Timeline/TimelineClipboardKeybindings.js +3 -6
  111. package/dist/components/Timeline/TimelineDeleteKeybindings.js +5 -7
  112. package/dist/components/Timeline/TimelineDragHandler.js +38 -7
  113. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +2 -1
  114. package/dist/components/Timeline/TimelineInOutDragHandler.js +26 -11
  115. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +1 -1
  116. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +2 -2
  117. package/dist/components/Timeline/TimelineLayerEye.js +36 -4
  118. package/dist/components/Timeline/TimelineSelection.js +16 -24
  119. package/dist/components/Timeline/TimelineSequence.js +7 -3
  120. package/dist/components/Timeline/TimelineSequenceItem.js +24 -18
  121. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +1 -1
  122. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +76 -43
  123. package/dist/components/Timeline/TimelineStack/get-stack.js +7 -2
  124. package/dist/components/Timeline/TimelineZoomControls.d.ts +3 -1
  125. package/dist/components/Timeline/TimelineZoomControls.js +24 -12
  126. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +4 -2
  127. package/dist/components/Timeline/get-sequence-context-menu-items.js +38 -2
  128. package/dist/components/Timeline/should-subscribe-to-source-file.d.ts +1 -0
  129. package/dist/components/Timeline/should-subscribe-to-source-file.js +11 -0
  130. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +2 -3
  131. package/dist/components/Timeline/use-open-sequence-in-editor.d.ts +3 -1
  132. package/dist/components/Timeline/use-open-sequence-in-editor.js +5 -2
  133. package/dist/components/Timeline/use-sequence-props-subscription.js +2 -0
  134. package/dist/components/Timeline/use-timeline-asset-drop.js +3 -7
  135. package/dist/components/Timeline/use-timeline-keyframe-drag.js +31 -16
  136. package/dist/components/TimelineInOutToggle.js +3 -3
  137. package/dist/components/TopPanel.js +3 -2
  138. package/dist/components/UndoRedoButtons.js +6 -5
  139. package/dist/components/UpdateCheck.d.ts +2 -0
  140. package/dist/components/UpdateCheck.js +29 -11
  141. package/dist/components/UpdateModal/UpdateModal.js +58 -19
  142. package/dist/components/VisualControls/ClickableFileName.js +5 -2
  143. package/dist/components/composition-menu-items.d.ts +2 -4
  144. package/dist/components/composition-menu-items.js +32 -55
  145. package/dist/components/element-install-request.d.ts +3 -0
  146. package/dist/components/element-install-request.js +17 -0
  147. package/dist/components/folder-menu-items.js +1 -1
  148. package/dist/components/handle-drop.d.ts +2 -3
  149. package/dist/components/handle-drop.js +11 -4
  150. package/dist/components/import-assets.d.ts +7 -6
  151. package/dist/components/import-assets.js +5 -16
  152. package/dist/components/use-default-editor-info.d.ts +4 -0
  153. package/dist/components/use-default-editor-info.js +47 -0
  154. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +1 -1
  155. package/dist/error-overlay/remotion-overlay/StackFrame.js +1 -1
  156. package/dist/esm/{chunk-fjv75ty4.js → chunk-43m68z1k.js} +8689 -7374
  157. package/dist/esm/internals.mjs +8689 -7374
  158. package/dist/esm/previewEntry.mjs +8668 -7353
  159. package/dist/esm/renderEntry.mjs +1 -1
  160. package/dist/helpers/inject-css.js +58 -67
  161. package/dist/helpers/install-required-package.d.ts +3 -2
  162. package/dist/helpers/install-required-package.js +20 -15
  163. package/dist/helpers/open-in-editor.d.ts +3 -3
  164. package/dist/helpers/open-in-editor.js +10 -6
  165. package/dist/helpers/pointer-session.d.ts +9 -0
  166. package/dist/helpers/pointer-session.js +94 -0
  167. package/dist/helpers/use-menu-structure.js +109 -51
  168. package/dist/icons/audio.d.ts +1 -1
  169. package/dist/icons/audio.js +1 -1
  170. package/dist/icons/caret.js +1 -1
  171. package/dist/icons/certificate.d.ts +1 -1
  172. package/dist/icons/certificate.js +1 -1
  173. package/dist/icons/custom-editor.d.ts +4 -0
  174. package/dist/icons/custom-editor.js +11 -0
  175. package/dist/icons/data.d.ts +1 -1
  176. package/dist/icons/data.js +2 -2
  177. package/dist/icons/editor.d.ts +6 -0
  178. package/dist/icons/editor.js +52 -0
  179. package/dist/icons/effects.d.ts +5 -0
  180. package/dist/icons/effects.js +8 -0
  181. package/dist/icons/ellipsis.js +1 -1
  182. package/dist/icons/external-link.d.ts +5 -0
  183. package/dist/icons/external-link.js +10 -0
  184. package/dist/icons/fullscreen.js +1 -1
  185. package/dist/icons/gear.d.ts +1 -1
  186. package/dist/icons/gear.js +1 -1
  187. package/dist/icons/gif.d.ts +1 -1
  188. package/dist/icons/gif.js +1 -1
  189. package/dist/icons/input-props.d.ts +2 -0
  190. package/dist/icons/input-props.js +9 -0
  191. package/dist/icons/jump-to-start.js +2 -2
  192. package/dist/icons/magnet.d.ts +3 -1
  193. package/dist/icons/magnet.js +2 -2
  194. package/dist/icons/media-volume.d.ts +6 -2
  195. package/dist/icons/media-volume.js +8 -6
  196. package/dist/icons/minus.d.ts +3 -1
  197. package/dist/icons/minus.js +2 -2
  198. package/dist/icons/pause.js +1 -1
  199. package/dist/icons/play.js +1 -1
  200. package/dist/icons/plus.js +1 -1
  201. package/dist/icons/redo.js +2 -2
  202. package/dist/icons/step-back.js +2 -2
  203. package/dist/icons/step-forward.js +2 -2
  204. package/dist/icons/timelineInOutPointer.js +2 -2
  205. package/dist/icons/undo.js +2 -2
  206. package/dist/state/editor-guides.d.ts +1 -0
  207. package/dist/state/editor-guides.js +1 -0
  208. package/dist/state/modals.d.ts +2 -0
  209. package/dist/state/z-index.d.ts +1 -0
  210. package/dist/state/z-index.js +34 -18
  211. package/package.json +12 -13
  212. package/dist/components/StudioCanvasCapture.d.ts +0 -5
  213. package/dist/components/StudioCanvasCapture.js +0 -40
  214. package/dist/components/canvas-capture-enabled.d.ts +0 -1
  215. package/dist/components/canvas-capture-enabled.js +0 -4
  216. package/dist/components/use-element-overwrite-confirmation.d.ts +0 -2
  217. package/dist/components/use-element-overwrite-confirmation.js +0 -73
@@ -212,7 +212,7 @@ var renderContent = (Root) => {
212
212
  renderToDOM(/* @__PURE__ */ jsx("div", {
213
213
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
214
214
  }));
215
- import("./chunk-fjv75ty4.js").then(({ StudioInternals }) => {
215
+ import("./chunk-43m68z1k.js").then(({ StudioInternals }) => {
216
216
  window.remotion_isStudio = true;
217
217
  window.remotion_isReadOnlyStudio = true;
218
218
  window.remotion_inputProps = "{}";
@@ -5,10 +5,8 @@ const remotion_1 = require("remotion");
5
5
  const scroll_to_default_props_path_1 = require("../components/RenderModal/SchemaEditor/scroll-to-default-props-path");
6
6
  const colors_1 = require("./colors");
7
7
  const makeDefaultGlobalCSS = () => {
8
- const unhoveredDragAreaFactor = 2;
9
- const fromMiddle = 50 / unhoveredDragAreaFactor;
10
- const hoveredDragAreaFactor = 6;
11
- const fromMiddleHovered = 50 / hoveredDragAreaFactor;
8
+ const dragAreaFactor = 2;
9
+ const fromMiddle = 50 / dragAreaFactor;
12
10
  return `
13
11
  html {
14
12
  --remotion-cli-internals-blue: ${colors_1.BLUE};
@@ -28,51 +26,27 @@ const makeDefaultGlobalCSS = () => {
28
26
  }
29
27
 
30
28
  .remotion-splitter-horizontal {
31
- transform: scaleY(${unhoveredDragAreaFactor});
32
- background: linear-gradient(
33
- to bottom,
34
- ${colors_1.TRANSPARENT} ${50 - fromMiddle}%,
35
- ${colors_1.BLACK} ${50 - fromMiddle}%,
36
- ${colors_1.BLACK} ${50 + fromMiddle}%,
37
- ${colors_1.TRANSPARENT} ${50 + fromMiddle}%
38
- );
39
- }
40
-
41
- .remotion-splitter-horizontal.remotion-splitter-active, .remotion-splitter-horizontal.remotion-splitter-hover {
42
- background: linear-gradient(
43
- to bottom,
44
- ${colors_1.TRANSPARENT} ${50 - fromMiddleHovered}%,
45
- var(--remotion-cli-internals-blue) ${50 - fromMiddleHovered}%,
46
- var(--remotion-cli-internals-blue) ${50 + fromMiddleHovered}%,
47
- ${colors_1.TRANSPARENT} ${50 + fromMiddleHovered}%
48
- );
49
29
  cursor: row-resize;
50
- transform: scaleY(${hoveredDragAreaFactor});
51
- z-index: 1000;
30
+ transform: scaleY(${dragAreaFactor});
31
+ background: linear-gradient(
32
+ to bottom,
33
+ ${colors_1.TRANSPARENT} ${50 - fromMiddle}%,
34
+ ${colors_1.BLACK} ${50 - fromMiddle}%,
35
+ ${colors_1.BLACK} ${50 + fromMiddle}%,
36
+ ${colors_1.TRANSPARENT} ${50 + fromMiddle}%
37
+ );
52
38
  }
53
39
 
54
40
  .remotion-splitter-vertical {
55
- transform: scaleX(${unhoveredDragAreaFactor});
56
- background: linear-gradient(
57
- to right,
58
- ${colors_1.TRANSPARENT} ${50 - fromMiddle}%,
59
- ${colors_1.BLACK} ${50 - fromMiddle}%,
60
- ${colors_1.BLACK} ${50 + fromMiddle}%,
61
- ${colors_1.TRANSPARENT} ${50 + fromMiddle}%
62
- );
63
- }
64
-
65
- .remotion-splitter-vertical.remotion-splitter-active, .remotion-splitter-vertical.remotion-splitter-hover {
66
- background: linear-gradient(
67
- to right,
68
- ${colors_1.TRANSPARENT} ${50 - fromMiddleHovered}%,
69
- var(--remotion-cli-internals-blue) ${50 - fromMiddleHovered}%,
70
- var(--remotion-cli-internals-blue) ${50 + fromMiddleHovered}%,
71
- ${colors_1.TRANSPARENT} ${50 + fromMiddleHovered}%
72
- );
73
- transform: scaleX(${hoveredDragAreaFactor});
74
41
  cursor: col-resize;
75
- z-index: 1000;
42
+ transform: scaleX(${dragAreaFactor});
43
+ background: linear-gradient(
44
+ to right,
45
+ ${colors_1.TRANSPARENT} ${50 - fromMiddle}%,
46
+ ${colors_1.BLACK} ${50 - fromMiddle}%,
47
+ ${colors_1.BLACK} ${50 + fromMiddle}%,
48
+ ${colors_1.TRANSPARENT} ${50 + fromMiddle}%
49
+ );
76
50
  }
77
51
 
78
52
  input::-webkit-outer-spin-button,
@@ -111,50 +85,67 @@ const makeDefaultGlobalCSS = () => {
111
85
  box-shadow: ${colors_1.FOCUS_BOX_SHADOW};
112
86
  }
113
87
 
114
- .__remotion_thumb,
115
- .__remotion_thumb::-webkit-slider-thumb {
88
+ .__remotion_thumb,
89
+ .__remotion_thumb::-webkit-slider-thumb {
116
90
  -webkit-appearance: none;
117
91
  -webkit-tap-highlight-color: ${colors_1.TRANSPARENT};
118
92
  }
119
93
 
120
- .__remotion_thumb {
121
- pointer-events: none;
122
- position: absolute;
123
- height: 0;
124
- outline: none;
125
- top: 15.5px;
126
- width: 221px;
127
- margin-left: -2px;
128
- z-index: 2;
129
- }
94
+ .__remotion_thumb {
95
+ appearance: none;
96
+ background: transparent;
97
+ border: 0;
98
+ height: 100%;
99
+ left: 0;
100
+ margin: 0;
101
+ outline: none;
102
+ padding: 0;
103
+ pointer-events: none;
104
+ position: absolute;
105
+ top: 0;
106
+ width: 100%;
107
+ z-index: 2;
108
+ }
109
+
110
+ .__remotion_thumb::-moz-range-track {
111
+ background: transparent;
112
+ border: 0;
113
+ height: 6px;
114
+ }
115
+
116
+ .__remotion_thumb::-webkit-slider-runnable-track {
117
+ background: transparent;
118
+ border: 0;
119
+ height: 6px;
120
+ }
130
121
 
131
122
  /* For Firefox browsers */
132
123
  .__remotion_thumb::-moz-range-thumb {
133
- border: ${colors_1.BORDER_BLACK};
134
- border-radius: 2px;
124
+ appearance: none;
125
+ border: 0;
126
+ border-radius: 50%;
135
127
  cursor: pointer;
136
- height: 37px;
137
- width: 10px;
128
+ height: 14px;
129
+ width: 14px;
138
130
  pointer-events: all;
139
- border-color: ${colors_1.BLACK};
140
131
  background-color: ${colors_1.WHITE};
141
132
  position: relative;
142
133
  }
143
134
 
144
135
  /* For Chrome browsers */
145
136
  .__remotion_thumb::-webkit-slider-thumb {
146
- border: ${colors_1.BORDER_BLACK};
147
- border-radius: 2px;
137
+ border: 0;
138
+ border-radius: 50%;
148
139
  cursor: pointer;
149
- height: 39px;
150
- width: 10px;
140
+ height: 14px;
141
+ margin-top: -4px;
142
+ width: 14px;
151
143
  pointer-events: all;
152
- border-color: ${colors_1.BLACK};
153
144
  background-color: ${colors_1.WHITE};
154
145
  position: relative;
155
146
  }
156
147
 
157
- .__remotion_input_dragger:hover span {
148
+ .__remotion_input_dragger:hover > span:first-child {
158
149
  color: var(--remotion-cli-internals-blue-hovered) !important;
159
150
  }
160
151
 
@@ -1,2 +1,3 @@
1
- export declare const getMissingPackages: (packageNames: string[]) => string[];
2
- export declare const installRequiredPackages: (packageNames: string[]) => Promise<void>;
1
+ import type { ElementDependency } from '@remotion/studio-protocol';
2
+ export declare const getMissingPackages: (dependencies: (string | ElementDependency)[]) => ElementDependency[];
3
+ export declare const installRequiredPackages: (dependencies: (string | ElementDependency)[]) => Promise<void>;
@@ -4,30 +4,35 @@ exports.installRequiredPackages = exports.getMissingPackages = void 0;
4
4
  const install_package_1 = require("../api/install-package");
5
5
  const NotificationCenter_1 = require("../components/Notifications/NotificationCenter");
6
6
  let installQueue = Promise.resolve();
7
- const getMissingPackages = (packageNames) => {
7
+ const uniqueDependencies = (dependencies) => Array.from(new Map(dependencies.map((dependency) => {
8
+ const normalized = typeof dependency === 'string'
9
+ ? { name: dependency, version: null }
10
+ : dependency;
11
+ return [normalized.name, normalized];
12
+ })).values());
13
+ const getMissingPackages = (dependencies) => {
8
14
  var _a;
9
- const uniquePackageNames = Array.from(new Set(packageNames));
10
15
  const installedPackages = (_a = window.remotion_installedPackages) !== null && _a !== void 0 ? _a : [];
11
- return uniquePackageNames.filter((packageName) => !installedPackages.includes(packageName));
16
+ return uniqueDependencies(dependencies).filter((dependency) => dependency.version !== null ||
17
+ !installedPackages.includes(dependency.name));
12
18
  };
13
19
  exports.getMissingPackages = getMissingPackages;
14
- const addInstalledPackages = (packageNames) => {
20
+ const addInstalledPackages = (dependencies) => {
15
21
  var _a;
16
22
  const installedPackages = (_a = window.remotion_installedPackages) !== null && _a !== void 0 ? _a : [];
17
- window.remotion_installedPackages = Array.from(new Set([...installedPackages, ...packageNames]));
23
+ window.remotion_installedPackages = Array.from(new Set([
24
+ ...installedPackages,
25
+ ...uniqueDependencies(dependencies).map((dependency) => dependency.name),
26
+ ]));
18
27
  };
19
- const formatPackageList = (packageNames) => {
20
- if (packageNames.length === 1) {
21
- return packageNames[0];
22
- }
23
- return `${packageNames.length} packages`;
24
- };
25
- const installRequiredPackages = async (packageNames) => {
28
+ const formatPackageList = (dependencies) => dependencies.length === 1
29
+ ? dependencies[0].name
30
+ : `${dependencies.length} packages`;
31
+ const installRequiredPackages = async (dependencies) => {
26
32
  const runInstall = async () => {
27
- const missingPackages = (0, exports.getMissingPackages)(packageNames);
28
- if (missingPackages.length === 0) {
33
+ const missingPackages = (0, exports.getMissingPackages)(dependencies);
34
+ if (missingPackages.length === 0)
29
35
  return;
30
- }
31
36
  (0, NotificationCenter_1.showNotification)(`Installing ${formatPackageList(missingPackages)}...`, 3000);
32
37
  await (0, install_package_1.installPackages)(missingPackages);
33
38
  addInstalledPackages(missingPackages);
@@ -1,7 +1,7 @@
1
- import type { CompositionComponentInfoResponse, SymbolicatedStackFrame } from '@remotion/studio-shared';
1
+ import type { CompositionComponentInfoResponse, EditorPickerId, SymbolicatedStackFrame } from '@remotion/studio-shared';
2
2
  import type { CodePosition, OriginalPosition } from '../error-overlay/react-overlay/utils/get-source-map';
3
- export declare const openInEditor: (stack: SymbolicatedStackFrame) => Promise<import("@remotion/studio-shared").OpenInEditorResponse>;
4
- export declare const openOriginalPositionInEditor: (originalPosition: OriginalPosition) => Promise<void>;
3
+ export declare const openInEditor: (stack: SymbolicatedStackFrame, editorId: EditorPickerId | null) => Promise<import("@remotion/studio-shared").OpenInEditorResponse>;
4
+ export declare const openOriginalPositionInEditor: (originalPosition: OriginalPosition, editorId: EditorPickerId | null) => Promise<void>;
5
5
  export declare const openOriginalPositionInEditorAtProperty: ({ originalPosition, property, }: {
6
6
  originalPosition: CodePosition;
7
7
  property: string;
@@ -4,9 +4,10 @@ exports.openCompositionComponentInEditor = exports.preloadCompositionComponentIn
4
4
  const react_1 = require("react");
5
5
  const call_api_1 = require("../components/call-api");
6
6
  const browser_studio_operations_1 = require("./browser-studio-operations");
7
- const openInEditor = (stack) => {
7
+ const openInEditor = (stack, editorId) => {
8
8
  const { originalFileName, originalLineNumber, originalColumnNumber, originalFunctionName, originalScriptCode, } = stack;
9
9
  return (0, call_api_1.callApi)('/api/open-in-editor', {
10
+ editorId,
10
11
  stack: {
11
12
  originalFileName,
12
13
  originalLineNumber,
@@ -17,14 +18,17 @@ const openInEditor = (stack) => {
17
18
  });
18
19
  };
19
20
  exports.openInEditor = openInEditor;
20
- const openOriginalPositionInEditor = async (originalPosition) => {
21
- await (0, exports.openInEditor)({
21
+ const openOriginalPositionInEditor = async (originalPosition, editorId) => {
22
+ const response = await (0, exports.openInEditor)({
22
23
  originalColumnNumber: originalPosition.column,
23
24
  originalFileName: originalPosition.source,
24
25
  originalFunctionName: null,
25
26
  originalLineNumber: originalPosition.line,
26
27
  originalScriptCode: null,
27
- });
28
+ }, editorId);
29
+ if (!response.success) {
30
+ throw new Error('Could not open the file in the editor.');
31
+ }
28
32
  };
29
33
  exports.openOriginalPositionInEditor = openOriginalPositionInEditor;
30
34
  const openOriginalPositionInEditorAtProperty = async ({ originalPosition, property, }) => {
@@ -42,7 +46,7 @@ const openOriginalPositionInEditorAtProperty = async ({ originalPosition, proper
42
46
  source: originalPosition.source,
43
47
  line: position.lineNumber,
44
48
  column: position.columnNumber,
45
- });
49
+ }, null);
46
50
  };
47
51
  exports.openOriginalPositionInEditorAtProperty = openOriginalPositionInEditorAtProperty;
48
52
  const componentResolutionCache = new Map();
@@ -142,6 +146,6 @@ const openCompositionComponentInEditor = async ({ compositionFile, compositionId
142
146
  compositionFile,
143
147
  compositionId,
144
148
  });
145
- await (0, exports.openOriginalPositionInEditor)(info.location);
149
+ await (0, exports.openOriginalPositionInEditor)(info.location, null);
146
150
  };
147
151
  exports.openCompositionComponentInEditor = openCompositionComponentInEditor;
@@ -0,0 +1,9 @@
1
+ export type PointerSessionEndReason = 'pointerup' | 'pointercancel' | 'lostpointercapture' | 'blur' | 'visibilitychange' | 'buttons-released' | 'manual';
2
+ type PointerSessionEvent = Pick<PointerEvent, 'button' | 'pointerId'>;
3
+ export declare const startPointerSession: ({ event, target, onMove, onEnd, }: {
4
+ event: PointerSessionEvent;
5
+ target: Element;
6
+ onMove?: ((event: PointerEvent) => void) | undefined;
7
+ onEnd: (reason: PointerSessionEndReason, event: PointerEvent | null) => void;
8
+ }) => () => void;
9
+ export {};
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.startPointerSession = void 0;
4
+ const getButtonMask = (button) => {
5
+ if (button === 0) {
6
+ return 1;
7
+ }
8
+ if (button === 1) {
9
+ return 4;
10
+ }
11
+ if (button === 2) {
12
+ return 2;
13
+ }
14
+ return 1 << button;
15
+ };
16
+ const startPointerSession = ({ event, target, onMove, onEnd, }) => {
17
+ var _a;
18
+ const { pointerId } = event;
19
+ const buttonMask = getButtonMask(event.button);
20
+ let ended = false;
21
+ const cleanup = () => {
22
+ var _a;
23
+ window.removeEventListener('pointermove', handleMove);
24
+ window.removeEventListener('pointerup', handleUp);
25
+ window.removeEventListener('pointercancel', handleCancel);
26
+ window.removeEventListener('blur', handleBlur);
27
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
28
+ target.removeEventListener('lostpointercapture', handleLostPointerCapture);
29
+ if ((_a = target.hasPointerCapture) === null || _a === void 0 ? void 0 : _a.call(target, pointerId)) {
30
+ try {
31
+ target.releasePointerCapture(pointerId);
32
+ }
33
+ catch (_b) {
34
+ // The browser may already have released capture.
35
+ }
36
+ }
37
+ };
38
+ const end = (reason, pointerEvent) => {
39
+ if (ended) {
40
+ return;
41
+ }
42
+ ended = true;
43
+ cleanup();
44
+ onEnd(reason, pointerEvent);
45
+ };
46
+ function handleMove(moveEvent) {
47
+ if (moveEvent.pointerId !== pointerId) {
48
+ return;
49
+ }
50
+ if ((moveEvent.buttons & buttonMask) === 0) {
51
+ end('buttons-released', moveEvent);
52
+ return;
53
+ }
54
+ onMove === null || onMove === void 0 ? void 0 : onMove(moveEvent);
55
+ }
56
+ function handleUp(upEvent) {
57
+ if (upEvent.pointerId === pointerId) {
58
+ end('pointerup', upEvent);
59
+ }
60
+ }
61
+ function handleCancel(cancelEvent) {
62
+ if (cancelEvent.pointerId === pointerId) {
63
+ end('pointercancel', cancelEvent);
64
+ }
65
+ }
66
+ function handleLostPointerCapture(lostEvent) {
67
+ const pointerEvent = lostEvent;
68
+ if (pointerEvent.pointerId === pointerId) {
69
+ end('lostpointercapture', pointerEvent);
70
+ }
71
+ }
72
+ function handleBlur() {
73
+ end('blur', null);
74
+ }
75
+ function handleVisibilityChange() {
76
+ if (document.visibilityState === 'hidden') {
77
+ end('visibilitychange', null);
78
+ }
79
+ }
80
+ try {
81
+ (_a = target.setPointerCapture) === null || _a === void 0 ? void 0 : _a.call(target, pointerId);
82
+ }
83
+ catch (_b) {
84
+ // Capture is best-effort for detached or browser-owned targets.
85
+ }
86
+ window.addEventListener('pointermove', handleMove);
87
+ window.addEventListener('pointerup', handleUp);
88
+ window.addEventListener('pointercancel', handleCancel);
89
+ window.addEventListener('blur', handleBlur);
90
+ document.addEventListener('visibilitychange', handleVisibilityChange);
91
+ target.addEventListener('lostpointercapture', handleLostPointerCapture);
92
+ return () => end('manual', null);
93
+ };
94
+ exports.startPointerSession = startPointerSession;
@@ -55,12 +55,34 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
55
55
  const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
56
56
  const downloadProject = browserStudioOperations === null || browserStudioOperations === void 0 ? void 0 : browserStudioOperations.downloadProject;
57
57
  const items = [
58
+ readOnlyStudio
59
+ ? null
60
+ : {
61
+ id: 'new-composition',
62
+ value: 'new-composition',
63
+ label: 'New composition...',
64
+ onClick: () => {
65
+ closeMenu();
66
+ setSelectedModal({
67
+ type: 'new-comp',
68
+ folderName: null,
69
+ parentName: null,
70
+ stack: null,
71
+ });
72
+ },
73
+ type: 'item',
74
+ keyHint: null,
75
+ leftItem: null,
76
+ subMenu: null,
77
+ quickSwitcherLabel: 'New composition...',
78
+ disabled: previewServerState !== 'connected',
79
+ },
58
80
  readOnlyStudio
59
81
  ? null
60
82
  : {
61
83
  id: 'new-folder',
62
84
  value: 'new-folder',
63
- label: 'New Folder...',
85
+ label: 'New folder...',
64
86
  onClick: () => {
65
87
  closeMenu();
66
88
  setSelectedModal({
@@ -80,7 +102,7 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
80
102
  ? null
81
103
  : {
82
104
  type: 'divider',
83
- id: 'new-folder-divider',
105
+ id: 'new-project-item-divider',
84
106
  },
85
107
  window.remotion_isReadOnlyStudio
86
108
  ? {
@@ -100,42 +122,6 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
100
122
  quickSwitcherLabel: 'Override input props',
101
123
  }
102
124
  : null,
103
- readOnlyStudio
104
- ? null
105
- : {
106
- id: 'render',
107
- value: 'render',
108
- label: 'Render...',
109
- onClick: () => {
110
- closeMenu();
111
- if (previewServerState !== 'connected') {
112
- (0, NotificationCenter_1.showNotification)('Restart the studio to render', 2000);
113
- return;
114
- }
115
- const renderButton = document.getElementById('render-modal-button-server');
116
- renderButton.click();
117
- },
118
- type: 'item',
119
- keyHint: 'R',
120
- leftItem: null,
121
- subMenu: null,
122
- quickSwitcherLabel: 'Render...',
123
- },
124
- {
125
- id: 'render-on-web',
126
- value: 'render-on-web',
127
- label: 'Render on web...',
128
- onClick: () => {
129
- closeMenu();
130
- const renderButton = document.getElementById('render-modal-button-client');
131
- renderButton.click();
132
- },
133
- type: 'item',
134
- keyHint: null,
135
- leftItem: null,
136
- subMenu: null,
137
- quickSwitcherLabel: 'Render on web...',
138
- },
139
125
  downloadProject
140
126
  ? {
141
127
  id: 'download-project',
@@ -159,7 +145,7 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
159
145
  quickSwitcherLabel: 'Download project',
160
146
  }
161
147
  : null,
162
- !readOnlyStudio
148
+ !readOnlyStudio && downloadProject
163
149
  ? {
164
150
  type: 'divider',
165
151
  id: 'open-project-divider',
@@ -177,7 +163,7 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
177
163
  originalColumnNumber: 1,
178
164
  originalFunctionName: null,
179
165
  originalScriptCode: null,
180
- })
166
+ }, null)
181
167
  .then(({ success }) => {
182
168
  if (!success) {
183
169
  (0, NotificationCenter_1.showNotification)(`Could not open ${window.remotion_editorName}`, 2000);
@@ -229,6 +215,50 @@ const getFileMenu = ({ readOnlyStudio, closeMenu, previewServerState, setSelecte
229
215
  quickSwitcherLabel: null,
230
216
  };
231
217
  };
218
+ const getRenderMenuItems = ({ closeMenu, previewServerState, readOnlyStudio, }) => {
219
+ return [
220
+ readOnlyStudio
221
+ ? null
222
+ : {
223
+ id: 'render',
224
+ value: 'render',
225
+ label: 'Render...',
226
+ onClick: () => {
227
+ closeMenu();
228
+ if (previewServerState !== 'connected') {
229
+ (0, NotificationCenter_1.showNotification)('Restart the studio to render', 2000);
230
+ return;
231
+ }
232
+ const renderButton = document.getElementById('render-modal-button-server');
233
+ renderButton.click();
234
+ },
235
+ type: 'item',
236
+ keyHint: 'R',
237
+ leftItem: null,
238
+ subMenu: null,
239
+ quickSwitcherLabel: 'Render...',
240
+ },
241
+ {
242
+ id: 'render-on-web',
243
+ value: 'render-on-web',
244
+ label: 'Render on web...',
245
+ onClick: () => {
246
+ closeMenu();
247
+ const renderButton = document.getElementById('render-modal-button-client');
248
+ renderButton.click();
249
+ },
250
+ type: 'item',
251
+ keyHint: null,
252
+ leftItem: null,
253
+ subMenu: null,
254
+ quickSwitcherLabel: 'Render on web...',
255
+ },
256
+ {
257
+ type: 'divider',
258
+ id: 'render-divider',
259
+ },
260
+ ].filter(no_react_1.NoReactInternals.truthy);
261
+ };
232
262
  const useMenuStructure = (closeMenu, readOnlyStudio) => {
233
263
  var _a;
234
264
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
@@ -240,6 +270,9 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
240
270
  const { size, setSize } = (0, react_1.useContext)(remotion_1.Internals.PreviewSizeContext);
241
271
  const { canvasContent, compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
242
272
  const { type } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState;
273
+ const canConfigureDefaultEditor = !readOnlyStudio &&
274
+ type === 'connected' &&
275
+ (0, browser_studio_operations_1.getBrowserStudioOperations)() === null;
243
276
  const { setSidebarCollapsedState, sidebarCollapsedStateLeft, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
244
277
  const sizes = (0, react_1.useMemo)(() => (0, SizeSelector_1.getUniqueSizes)(size), [size]);
245
278
  const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
@@ -300,6 +333,24 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
300
333
  subMenu: null,
301
334
  quickSwitcherLabel: 'Help: Changelog',
302
335
  },
336
+ canConfigureDefaultEditor
337
+ ? {
338
+ id: 'default-editor',
339
+ value: 'default-editor',
340
+ label: 'Configure default editor...',
341
+ onClick: () => {
342
+ closeMenu();
343
+ setSelectedModal({
344
+ type: 'configure-default-editor',
345
+ });
346
+ },
347
+ type: 'item',
348
+ keyHint: null,
349
+ leftItem: null,
350
+ subMenu: null,
351
+ quickSwitcherLabel: 'Configure default editor...',
352
+ }
353
+ : null,
303
354
  {
304
355
  id: 'license',
305
356
  value: 'license',
@@ -352,7 +403,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
352
403
  subMenu: null,
353
404
  quickSwitcherLabel: 'Restart Studio Server',
354
405
  },
355
- ],
406
+ ].filter(no_react_1.NoReactInternals.truthy),
356
407
  quickSwitcherLabel: null,
357
408
  },
358
409
  getFileMenu({
@@ -709,16 +760,22 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
709
760
  id: 'composition',
710
761
  label: 'Composition',
711
762
  leaveLeftPadding: false,
712
- items: (0, composition_menu_items_1.getCompositionMenuItems)({
713
- closeMenu,
714
- composition: currentComposition,
715
- connectionStatus: type,
716
- includeCompositionManagementItems: true,
717
- includeNewCompositionItem: true,
718
- resolvedLocation: resolvedCompositionLocation,
719
- setSelectedModal,
720
- readOnlyStudio,
721
- }),
763
+ items: [
764
+ ...getRenderMenuItems({
765
+ closeMenu,
766
+ previewServerState: type,
767
+ readOnlyStudio,
768
+ }),
769
+ ...(0, composition_menu_items_1.getCompositionMenuItems)({
770
+ closeMenu,
771
+ composition: currentComposition,
772
+ connectionStatus: type,
773
+ includeCompositionManagementItems: true,
774
+ resolvedLocation: resolvedCompositionLocation,
775
+ setSelectedModal,
776
+ readOnlyStudio,
777
+ }),
778
+ ],
722
779
  quickSwitcherLabel: null,
723
780
  },
724
781
  {
@@ -957,6 +1014,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
957
1014
  }
958
1015
  return struct;
959
1016
  }, [
1017
+ canConfigureDefaultEditor,
960
1018
  readOnlyStudio,
961
1019
  closeMenu,
962
1020
  type,
@@ -1,5 +1,5 @@
1
1
  import type { SVGProps } from 'react';
2
- export declare const AudioIcon: (props: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const AudioIcon: ({ color, ...props }: SVGProps<SVGSVGElement>) => import("react/jsx-runtime").JSX.Element;
3
3
  export declare const AudioFileIcon: ({ color, ...props }: SVGProps<SVGSVGElement> & {
4
4
  readonly color?: string | undefined;
5
5
  }) => import("react/jsx-runtime").JSX.Element;
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AudioFileIcon = exports.AudioIcon = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const colors_1 = require("../helpers/colors");
6
- const AudioIcon = (props) => (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props, children: jsx_runtime_1.jsx("path", { fill: colors_1.CURRENT_COLOR_LOWERCASE, d: "M243 32.32C105.5 39.15 0 157.8 0 295.5v120.4C0 451.3 28.63 480 64 480h32c17.62 0 32-14.38 32-32V288c0-17.62-14.38-32-32-32H64c-10.79 0-20.8 2.9-29.72 7.7 14.2-106.8 100.5-193.9 210.4-199.4 120.5-5.965 221.7 83.92 234 199.9-9.08-5.1-19.48-8.2-30.68-8.2h-32c-17.62 0-32 14.38-32 32v160c0 17.62 14.38 32 32 32h32c35.38 0 64-28.75 64-64.13V287.9c0-145.4-122-262.88-269-255.58zM64 288h32v160H64c-17.62 0-32-14.5-32-32.13v-95.75C32 302.5 46.38 288 64 288zm416 127.9c0 17.6-14.4 32.1-32 32.1h-32V288h32c17.62 0 32 14.5 32 32.13v95.77z" }) }));
6
+ const AudioIcon = ({ color, ...props }) => (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props, children: jsx_runtime_1.jsx("path", { fill: color !== null && color !== void 0 ? color : colors_1.CURRENT_COLOR_LOWERCASE, d: "M243 32.32C105.5 39.15 0 157.8 0 295.5v120.4C0 451.3 28.63 480 64 480h32c17.62 0 32-14.38 32-32V288c0-17.62-14.38-32-32-32H64c-10.79 0-20.8 2.9-29.72 7.7 14.2-106.8 100.5-193.9 210.4-199.4 120.5-5.965 221.7 83.92 234 199.9-9.08-5.1-19.48-8.2-30.68-8.2h-32c-17.62 0-32 14.38-32 32v160c0 17.62 14.38 32 32 32h32c35.38 0 64-28.75 64-64.13V287.9c0-145.4-122-262.88-269-255.58zM64 288h32v160H64c-17.62 0-32-14.5-32-32.13v-95.75C32 302.5 46.38 288 64 288zm416 127.9c0 17.6-14.4 32.1-32 32.1h-32V288h32c17.62 0 32 14.5 32 32.13v95.77z" }) }));
7
7
  exports.AudioIcon = AudioIcon;
8
8
  const AudioFileIcon = ({ color, ...props }) => (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", ...props, children: jsx_runtime_1.jsx("path", { fill: color !== null && color !== void 0 ? color : colors_1.CURRENT_COLOR_LOWERCASE, d: "M480 16l0-19.9-19.5 4.3-288 64-12.5 2.8 0 273.2c-17-12.7-39.4-20.4-64-20.4-53 0-96 35.8-96 80s43 80 96 80 96-35.8 96-80l0-187.2 256-56.9 0 120.4c-17-12.7-39.4-20.4-64-20.4-53 0-96 35.8-96 80s43 80 96 80 96-35.8 96-80l0-320zM448 336c0 26.5-28.7 48-64 48s-64-21.5-64-48 28.7-48 64-48 64 21.5 64 48zM160 400c0 26.5-28.7 48-64 48s-64-21.5-64-48 28.7-48 64-48 64 21.5 64 48zM448 123.2l-256 56.9 0-87.2 256-56.9 0 87.2z" }) }));
9
9
  exports.AudioFileIcon = AudioFileIcon;