@remotion/studio 4.0.499 → 4.0.501

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 (204) hide show
  1. package/dist/Studio.js +1 -1
  2. package/dist/api/delete-static-file.js +8 -3
  3. package/dist/api/rename-static-file.js +8 -0
  4. package/dist/api/watch-public-folder.js +2 -1
  5. package/dist/api/watch-static-file.js +2 -1
  6. package/dist/api/write-static-file.js +8 -3
  7. package/dist/components/AssetSelector.js +11 -7
  8. package/dist/components/AssetSelectorItem.d.ts +25 -0
  9. package/dist/components/AssetSelectorItem.js +116 -80
  10. package/dist/components/Canvas.js +6 -1
  11. package/dist/components/CaptionInspector.d.ts +10 -0
  12. package/dist/components/CaptionInspector.js +24 -0
  13. package/dist/components/CaptionTextEditor.d.ts +9 -0
  14. package/dist/components/CaptionTextEditor.js +132 -0
  15. package/dist/components/CompositionSelector.js +2 -32
  16. package/dist/components/ControlButton.js +1 -0
  17. package/dist/components/CurrentAsset.js +3 -2
  18. package/dist/components/EditorContexts.d.ts +0 -1
  19. package/dist/components/EditorContexts.js +2 -2
  20. package/dist/components/ExplorerPanel.js +2 -1
  21. package/dist/components/ExplorerPanelRef.d.ts +2 -0
  22. package/dist/components/FpsCounter.js +3 -3
  23. package/dist/components/FullscreenToggle.js +2 -1
  24. package/dist/components/GlobalKeybindings.js +9 -1
  25. package/dist/components/InitialCompositionLoader.d.ts +1 -1
  26. package/dist/components/InlineAction.d.ts +2 -1
  27. package/dist/components/InlineAction.js +3 -2
  28. package/dist/components/InlineCaptionInspector.d.ts +11 -0
  29. package/dist/components/InlineCaptionInspector.js +108 -0
  30. package/dist/components/InlineDropdown.d.ts +1 -1
  31. package/dist/components/InlineDropdown.js +3 -2
  32. package/dist/components/InspectorPanel/AlignmentControls.d.ts +2 -2
  33. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  34. package/dist/components/InspectorPanel/CompositionInspector.js +12 -9
  35. package/dist/components/InspectorPanel/CompositionMetadata.js +170 -57
  36. package/dist/components/InspectorPanel/ConnectedCompositionsSection.d.ts +2 -2
  37. package/dist/components/InspectorPanel/SelectedInspector.d.ts +1 -0
  38. package/dist/components/InspectorPanel/SelectedInspector.js +2 -2
  39. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -3
  40. package/dist/components/InspectorPanel/SequenceSelectionInspector.d.ts +1 -0
  41. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +10 -10
  42. package/dist/components/InspectorPanel/common.d.ts +17 -4
  43. package/dist/components/InspectorPanel/common.js +60 -6
  44. package/dist/components/InspectorPanel/inspector-section-collapse.d.ts +22 -0
  45. package/dist/components/InspectorPanel/inspector-section-collapse.js +165 -0
  46. package/dist/components/InspectorPanel/styles.js +7 -1
  47. package/dist/components/InspectorPanel/use-composition-actions.d.ts +3 -0
  48. package/dist/components/InspectorPanel/use-composition-actions.js +91 -5
  49. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +1 -1
  50. package/dist/components/InspectorPanel.js +2 -2
  51. package/dist/components/InspectorSequenceSection.d.ts +2 -1
  52. package/dist/components/InspectorSequenceSection.js +279 -25
  53. package/dist/components/KeyboardShortcutsExplainer.js +4 -2
  54. package/dist/components/Menu/MenuItem.js +2 -1
  55. package/dist/components/MenuCompositionName.js +30 -7
  56. package/dist/components/MenuToolbar.d.ts +0 -1
  57. package/dist/components/MenuToolbar.js +15 -7
  58. package/dist/components/MobilePanel.d.ts +2 -1
  59. package/dist/components/MobilePanel.js +29 -25
  60. package/dist/components/ModalContainer.d.ts +1 -0
  61. package/dist/components/ModalContainer.js +2 -2
  62. package/dist/components/Modals.js +1 -1
  63. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  64. package/dist/components/NewComposition/DismissableModal.js +2 -2
  65. package/dist/components/NewComposition/InputDragger.d.ts +7 -0
  66. package/dist/components/NewComposition/InputDragger.js +119 -8
  67. package/dist/components/OutlineToggle.d.ts +1 -3
  68. package/dist/components/OutlineToggle.js +2 -2
  69. package/dist/components/PreviewToolbar.js +10 -4
  70. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.d.ts +7 -0
  71. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +45 -0
  72. package/dist/components/QuickSwitcher/NoResults.d.ts +1 -1
  73. package/dist/components/QuickSwitcher/NoResults.js +1 -0
  74. package/dist/components/QuickSwitcher/QuickSwitcher.d.ts +10 -0
  75. package/dist/components/QuickSwitcher/QuickSwitcher.js +6 -2
  76. package/dist/components/QuickSwitcher/QuickSwitcherContent.d.ts +10 -0
  77. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +95 -13
  78. package/dist/components/QuickSwitcher/QuickSwitcherResult.d.ts +4 -0
  79. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +11 -8
  80. package/dist/components/QuickSwitcher/asset-search.d.ts +9 -0
  81. package/dist/components/QuickSwitcher/asset-search.js +42 -0
  82. package/dist/components/RenderQueue/ClientRenderQueueProcessor.d.ts +0 -1
  83. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +3 -14
  84. package/dist/components/RenderQueue/RenderQueueDownloadItem.js +2 -2
  85. package/dist/components/SelectedOutlineCropControls.d.ts +8 -0
  86. package/dist/components/SelectedOutlineCropControls.js +299 -0
  87. package/dist/components/SelectedOutlineElement.js +84 -47
  88. package/dist/components/SelectedOutlineOverlay.d.ts +2 -2
  89. package/dist/components/SelectedOutlineOverlay.js +147 -16
  90. package/dist/components/SequencePropsSubscriptionProvider.d.ts +2 -0
  91. package/dist/components/SequencePropsSubscriptionProvider.js +31 -3
  92. package/dist/components/ShowOutlinesProvider.js +4 -1
  93. package/dist/components/SidebarCollapserControls.d.ts +3 -1
  94. package/dist/components/SidebarCollapserControls.js +34 -29
  95. package/dist/components/SnappingToggle.d.ts +1 -3
  96. package/dist/components/SnappingToggle.js +2 -2
  97. package/dist/components/Timeline/Timeline.js +19 -5
  98. package/dist/components/Timeline/TimelineAssetField.d.ts +9 -1
  99. package/dist/components/Timeline/TimelineAssetField.js +53 -100
  100. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +7 -3
  101. package/dist/components/Timeline/TimelineClipboardKeybindings.js +65 -38
  102. package/dist/components/Timeline/TimelineColorField.js +20 -1
  103. package/dist/components/Timeline/TimelineEffectPropItem.js +8 -77
  104. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +8 -1
  105. package/dist/components/Timeline/TimelineHeightContainer.d.ts +2 -2
  106. package/dist/components/Timeline/TimelineKeyframeTracksContext.d.ts +3 -3
  107. package/dist/components/Timeline/TimelineList.d.ts +2 -2
  108. package/dist/components/Timeline/TimelinePrimitiveFieldValue.d.ts +7 -2
  109. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +10 -2
  110. package/dist/components/Timeline/TimelineRowChrome.d.ts +3 -0
  111. package/dist/components/Timeline/TimelineRowChrome.js +4 -3
  112. package/dist/components/Timeline/TimelineSelection.d.ts +9 -7
  113. package/dist/components/Timeline/TimelineSelection.js +17 -12
  114. package/dist/components/Timeline/TimelineSequence.js +2 -9
  115. package/dist/components/Timeline/TimelineSequenceItem.js +61 -15
  116. package/dist/components/Timeline/TimelineSequencePropItem.js +36 -85
  117. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +0 -1
  118. package/dist/components/Timeline/TimelineTrack.d.ts +2 -2
  119. package/dist/components/Timeline/TimelineTrack.js +4 -2
  120. package/dist/components/Timeline/TimelineTracks.d.ts +2 -2
  121. package/dist/components/Timeline/border-radius-representation.d.ts +16 -0
  122. package/dist/components/Timeline/border-radius-representation.js +60 -0
  123. package/dist/components/Timeline/delete-selected-timeline-item.js +1 -6
  124. package/dist/components/Timeline/find-track-for-node-path-info.d.ts +1 -1
  125. package/dist/components/Timeline/get-sequence-context-menu-items.js +14 -12
  126. package/dist/components/Timeline/get-sequence-prop-reset-changes.d.ts +10 -0
  127. package/dist/components/Timeline/get-sequence-prop-reset-changes.js +33 -0
  128. package/dist/components/Timeline/reset-selected-timeline-props.js +20 -18
  129. package/dist/components/Timeline/save-effect-prop.d.ts +10 -0
  130. package/dist/components/Timeline/save-effect-prop.js +52 -1
  131. package/dist/components/Timeline/save-sequence-prop.d.ts +12 -1
  132. package/dist/components/Timeline/save-sequence-prop.js +25 -1
  133. package/dist/components/Timeline/should-show-track-in-timeline.d.ts +2 -2
  134. package/dist/components/Timeline/timeline-asset-link.js +17 -1
  135. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  136. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +4 -0
  137. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +9 -3
  138. package/dist/components/Timeline/use-timeline-asset-drop.js +4 -0
  139. package/dist/components/Timeline/use-timeline-height.d.ts +2 -2
  140. package/dist/components/TopPanel.js +2 -2
  141. package/dist/components/UndoRedoButtons.js +42 -11
  142. package/dist/components/composition-drop-preview.js +1 -0
  143. package/dist/components/handle-drop.d.ts +3 -2
  144. package/dist/components/handle-drop.js +2 -1
  145. package/dist/components/import-assets.d.ts +4 -2
  146. package/dist/components/import-assets.js +20 -7
  147. package/dist/components/menu-toolbar-height.d.ts +1 -0
  148. package/dist/components/menu-toolbar-height.js +4 -0
  149. package/dist/components/selected-outline-drag.d.ts +41 -4
  150. package/dist/components/selected-outline-drag.js +179 -2
  151. package/dist/components/selected-outline-geometry.d.ts +1 -0
  152. package/dist/components/selected-outline-measurement.d.ts +11 -0
  153. package/dist/components/selected-outline-measurement.js +64 -3
  154. package/dist/components/selected-outline-types.d.ts +44 -1
  155. package/dist/components/selected-outline-types.js +21 -1
  156. package/dist/components/use-element-overwrite-confirmation.d.ts +2 -0
  157. package/dist/components/use-element-overwrite-confirmation.js +73 -0
  158. package/dist/components/use-static-files.js +7 -2
  159. package/dist/error-overlay/react-overlay/effects/resolve-file-source.js +13 -2
  160. package/dist/error-overlay/remotion-overlay/Overlay.js +3 -3
  161. package/dist/error-overlay/remotion-overlay/ShortcutHint.js +2 -3
  162. package/dist/esm/{chunk-pk1zwsn1.js → chunk-n1kj09yv.js} +10618 -8002
  163. package/dist/esm/index.mjs +24 -8
  164. package/dist/esm/internals.mjs +10618 -8002
  165. package/dist/esm/previewEntry.mjs +40002 -37388
  166. package/dist/esm/renderEntry.mjs +1 -1
  167. package/dist/helpers/browser-studio-operations.d.ts +3 -0
  168. package/dist/helpers/browser-studio-operations.js +14 -0
  169. package/dist/helpers/calculate-timeline.d.ts +2 -2
  170. package/dist/helpers/calculate-timeline.js +8 -28
  171. package/dist/helpers/client-id.d.ts +0 -1
  172. package/dist/helpers/client-id.js +15 -10
  173. package/dist/helpers/download-blob.d.ts +1 -0
  174. package/dist/helpers/download-blob.js +15 -0
  175. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +3 -10
  176. package/dist/helpers/get-timeline-sequence-sort-key.js +5 -13
  177. package/dist/helpers/inject-css.js +5 -3
  178. package/dist/helpers/interactivity-enabled.d.ts +1 -0
  179. package/dist/helpers/interactivity-enabled.js +7 -2
  180. package/dist/helpers/is-mac.d.ts +1 -0
  181. package/dist/helpers/is-mac.js +4 -0
  182. package/dist/helpers/open-in-editor.d.ts +5 -1
  183. package/dist/helpers/open-in-editor.js +39 -4
  184. package/dist/helpers/preview-server-events.js +46 -9
  185. package/dist/helpers/sort-by-nonce-history.js +97 -19
  186. package/dist/helpers/use-create-composition.js +8 -6
  187. package/dist/helpers/use-keybinding.js +2 -3
  188. package/dist/helpers/use-menu-structure.js +39 -1
  189. package/dist/hot-middleware-client/client.js +3 -3
  190. package/dist/icons/border-radius.d.ts +4 -0
  191. package/dist/icons/border-radius.js +8 -0
  192. package/dist/icons/caret.d.ts +1 -0
  193. package/dist/icons/caret.js +2 -2
  194. package/dist/icons/fullscreen.d.ts +4 -0
  195. package/dist/icons/fullscreen.js +6 -0
  196. package/dist/icons/pen.d.ts +5 -0
  197. package/dist/icons/pen.js +8 -0
  198. package/dist/previewEntry.js +1 -1
  199. package/dist/state/modals.d.ts +9 -0
  200. package/dist/state/timeline-sequence-hover.d.ts +17 -0
  201. package/dist/state/timeline-sequence-hover.js +33 -0
  202. package/package.json +13 -12
  203. package/dist/helpers/get-timeline-sequence-hash.d.ts +0 -6
  204. package/dist/helpers/get-timeline-sequence-hash.js +0 -33
@@ -5,7 +5,9 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const colors_1 = require("../../helpers/colors");
8
+ const get_preview_file_type_1 = require("../../helpers/get-preview-file-type");
8
9
  const is_composition_still_1 = require("../../helpers/is-composition-still");
10
+ const url_state_1 = require("../../helpers/url-state");
9
11
  const use_keybinding_1 = require("../../helpers/use-keybinding");
10
12
  const use_menu_structure_1 = require("../../helpers/use-menu-structure");
11
13
  const modals_1 = require("../../state/modals");
@@ -14,14 +16,18 @@ const KeyboardShortcutsExplainer_1 = require("../KeyboardShortcutsExplainer");
14
16
  const layout_1 = require("../layout");
15
17
  const is_menu_item_1 = require("../Menu/is-menu-item");
16
18
  const RemInput_1 = require("../NewComposition/RemInput");
19
+ const use_select_asset_1 = require("../use-select-asset");
20
+ const use_static_files_1 = require("../use-static-files");
17
21
  const algolia_search_1 = require("./algolia-search");
18
22
  const AlgoliaCredit_1 = require("./AlgoliaCredit");
23
+ const asset_search_1 = require("./asset-search");
19
24
  const fuzzy_search_1 = require("./fuzzy-search");
20
25
  const NoResults_1 = require("./NoResults");
21
26
  const QuickSwitcherResult_1 = require("./QuickSwitcherResult");
22
27
  const shared_1 = require("./shared");
23
28
  const input = {
24
29
  width: '100%',
30
+ borderRadius: 4,
25
31
  };
26
32
  const modeSelector = {
27
33
  paddingLeft: 16,
@@ -57,8 +63,12 @@ const content = {
57
63
  flexDirection: 'row',
58
64
  alignItems: 'center',
59
65
  };
66
+ const contentWithoutModeSelector = {
67
+ ...content,
68
+ paddingTop: 16,
69
+ };
60
70
  const stripQuery = (query) => {
61
- if (query.startsWith('>') || query.startsWith('?')) {
71
+ if (query.startsWith('$') || query.startsWith('>') || query.startsWith('?')) {
62
72
  return query.substring(1).trim();
63
73
  }
64
74
  return query.trim();
@@ -68,9 +78,14 @@ const mapQueryToMode = (query) => {
68
78
  ? 'commands'
69
79
  : query.startsWith('?')
70
80
  ? 'docs'
71
- : 'compositions';
81
+ : query.startsWith('$')
82
+ ? 'assets'
83
+ : 'compositions';
72
84
  };
73
85
  const mapModeToQuery = (mode) => {
86
+ if (mode === 'assets') {
87
+ return '$ ';
88
+ }
74
89
  if (mode === 'commands') {
75
90
  return '> ';
76
91
  }
@@ -82,28 +97,42 @@ const mapModeToQuery = (mode) => {
82
97
  }
83
98
  throw new Error('no mode' + mode);
84
99
  };
85
- const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio }) => {
100
+ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio, assetSelection, compositionSelection, }) => {
86
101
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
102
+ const staticFiles = (0, use_static_files_1.useStaticFiles)();
87
103
  const [state, setState] = (0, react_1.useState)(() => {
88
104
  return {
89
- query: mapModeToQuery(initialMode),
105
+ query: assetSelection === null
106
+ ? compositionSelection === null
107
+ ? mapModeToQuery(initialMode)
108
+ : ''
109
+ : assetSelection.initialQuery,
90
110
  selectedIndex: 0,
91
111
  };
92
112
  });
93
113
  (0, react_1.useEffect)(() => {
94
114
  setState({
95
- query: mapModeToQuery(initialMode),
115
+ query: assetSelection === null
116
+ ? compositionSelection === null
117
+ ? mapModeToQuery(initialMode)
118
+ : ''
119
+ : assetSelection.initialQuery,
96
120
  selectedIndex: 0,
97
121
  });
98
- }, [initialMode, invocationTimestamp]);
122
+ }, [assetSelection, compositionSelection, initialMode, invocationTimestamp]);
99
123
  const inputRef = (0, react_1.useRef)(null);
100
124
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
125
+ const selectAsset = (0, use_select_asset_1.useSelectAsset)();
101
126
  const closeMenu = (0, react_1.useCallback)(() => undefined, []);
102
127
  const actions = (0, use_menu_structure_1.useMenuStructure)(closeMenu, readOnlyStudio);
103
128
  const [docResults, setDocResults] = (0, react_1.useState)({ type: 'initial' });
104
129
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
105
130
  const keybindings = (0, use_keybinding_1.useKeybinding)();
106
- const mode = mapQueryToMode(state.query);
131
+ const mode = assetSelection !== null
132
+ ? 'assets'
133
+ : compositionSelection !== null
134
+ ? 'compositions'
135
+ : mapQueryToMode(state.query);
107
136
  const actualQuery = (0, react_1.useMemo)(() => {
108
137
  return stripQuery(state.query);
109
138
  }, [state.query]);
@@ -113,6 +142,12 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
113
142
  }
114
143
  return (0, use_menu_structure_1.makeSearchResults)(actions, setSelectedModal);
115
144
  }, [actions, mode, setSelectedModal]);
145
+ const assetSearch = (0, react_1.useMemo)(() => {
146
+ return (0, asset_search_1.filterAssetsByType)({
147
+ assets: staticFiles,
148
+ query: actualQuery,
149
+ });
150
+ }, [actualQuery, staticFiles]);
116
151
  const resultsArray = (0, react_1.useMemo)(() => {
117
152
  if (mode === 'commands') {
118
153
  return (0, fuzzy_search_1.fuzzySearch)(actualQuery, menuActions);
@@ -120,13 +155,40 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
120
155
  if (mode === 'docs' && docResults.type === 'results') {
121
156
  return docResults.results;
122
157
  }
123
- return (0, fuzzy_search_1.fuzzySearch)(actualQuery, compositions.map((c) => {
158
+ if (mode === 'assets') {
159
+ return (0, fuzzy_search_1.fuzzySearch)(assetSearch.query, assetSearch.assets.map((asset) => {
160
+ return {
161
+ id: 'asset-' + asset.name,
162
+ title: asset.name,
163
+ type: 'asset',
164
+ fileType: (0, get_preview_file_type_1.getPreviewFileType)(asset.name),
165
+ onSelected: () => {
166
+ if (assetSelection !== null) {
167
+ assetSelection.onSelected(asset);
168
+ }
169
+ else {
170
+ selectAsset(asset.name);
171
+ (0, url_state_1.pushUrl)(`/assets/${asset.name}`);
172
+ }
173
+ setSelectedModal(null);
174
+ },
175
+ };
176
+ }));
177
+ }
178
+ return (0, fuzzy_search_1.fuzzySearch)(actualQuery, compositions
179
+ .filter((c) => c.id !== (compositionSelection === null || compositionSelection === void 0 ? void 0 : compositionSelection.excludeCompositionId))
180
+ .map((c) => {
124
181
  return {
125
182
  id: 'composition-' + c.id,
126
183
  title: c.id,
127
184
  type: 'composition',
128
185
  onSelected: () => {
129
186
  var _a;
187
+ if (compositionSelection !== null) {
188
+ compositionSelection.onSelected(c);
189
+ setSelectedModal(null);
190
+ return;
191
+ }
130
192
  selectComposition(c, true);
131
193
  setSelectedModal(null);
132
194
  const selector = `.__remotion-composition[data-compname="${c.id}"]`;
@@ -146,6 +208,10 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
146
208
  compositions,
147
209
  menuActions,
148
210
  docResults,
211
+ assetSearch,
212
+ assetSelection,
213
+ compositionSelection,
214
+ selectAsset,
149
215
  selectComposition,
150
216
  setSelectedModal,
151
217
  ]);
@@ -244,6 +310,14 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
244
310
  }));
245
311
  (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
246
312
  }, []);
313
+ const onAssetsSelected = (0, react_1.useCallback)(() => {
314
+ var _a;
315
+ setState((s) => ({
316
+ query: `$ ${stripQuery(s.query)}`,
317
+ selectedIndex: 0,
318
+ }));
319
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
320
+ }, []);
247
321
  const onDocSearchSelected = (0, react_1.useCallback)(() => {
248
322
  var _a;
249
323
  setState((s) => ({
@@ -255,6 +329,13 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
255
329
  }, []);
256
330
  const showKeyboardShortcuts = mode === 'docs' && actualQuery.trim() === '';
257
331
  const showSearchLoadingState = mode === 'docs' && docResults.type === 'loading';
332
+ const placeholder = mode === 'assets'
333
+ ? 'Search assets...'
334
+ : mode === 'commands'
335
+ ? 'Search actions...'
336
+ : mode === 'docs'
337
+ ? 'Search documentation...'
338
+ : 'Search compositions...';
258
339
  const container = (0, react_1.useMemo)(() => {
259
340
  return {
260
341
  width: showKeyboardShortcuts ? 800 : 500,
@@ -272,11 +353,12 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
272
353
  height: 300,
273
354
  };
274
355
  }, [showKeyboardShortcuts]);
275
- return (jsx_runtime_1.jsxs("div", { style: container, children: [
276
- jsx_runtime_1.jsxs("div", { style: modeSelector, children: [
277
- jsx_runtime_1.jsx("button", { onClick: onCompositionsSelected, style: mode === 'compositions' ? modeActive : modeInactive, type: "button", children: "Compositions" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("button", { onClick: onActionsSelected, style: mode === 'commands' ? modeActive : modeInactive, type: "button", children: "Actions" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("button", { onClick: onDocSearchSelected, style: mode === 'docs' ? modeActive : modeInactive, type: "button", children: "Documentation" })
278
- ] }), jsx_runtime_1.jsxs("div", { style: content, children: [
279
- jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, type: "text", style: input, autoFocus: true, status: "ok", value: state.query, onChange: onTextChange, placeholder: "Search compositions...", rightAlign: false }), showKeyboardShortcuts ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
356
+ return (jsx_runtime_1.jsxs("div", { style: container, children: [assetSelection === null && compositionSelection === null && (jsx_runtime_1.jsxs("div", { style: modeSelector, children: [
357
+ jsx_runtime_1.jsx("button", { onClick: onCompositionsSelected, style: mode === 'compositions' ? modeActive : modeInactive, type: "button", children: "Compositions" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("button", { onClick: onAssetsSelected, style: mode === 'assets' ? modeActive : modeInactive, type: "button", children: "Assets" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("button", { onClick: onActionsSelected, style: mode === 'commands' ? modeActive : modeInactive, type: "button", children: "Actions" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("button", { onClick: onDocSearchSelected, style: mode === 'docs' ? modeActive : modeInactive, type: "button", children: "Documentation" })
358
+ ] })), jsx_runtime_1.jsxs("div", { style: assetSelection === null && compositionSelection === null
359
+ ? content
360
+ : contentWithoutModeSelector, children: [
361
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, type: "text", style: input, autoFocus: true, status: "ok", value: state.query, onChange: onTextChange, placeholder: placeholder, rightAlign: false }), showKeyboardShortcuts ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
280
362
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }),
281
363
  " ",
282
364
  jsx_runtime_1.jsx(AlgoliaCredit_1.AlgoliaCredit, {})
@@ -1,5 +1,9 @@
1
1
  import React from 'react';
2
+ import type { AssetFileType } from '../../helpers/get-preview-file-type';
2
3
  type QuickSwitcherResultDetail = {
4
+ type: 'asset';
5
+ fileType: AssetFileType;
6
+ } | {
3
7
  type: 'composition';
4
8
  compositionType: 'composition' | 'still';
5
9
  } | {
@@ -7,6 +7,7 @@ const colors_1 = require("../../helpers/colors");
7
7
  const use_keybinding_1 = require("../../helpers/use-keybinding");
8
8
  const still_1 = require("../../icons/still");
9
9
  const video_1 = require("../../icons/video");
10
+ const AssetFileIcon_1 = require("../AssetFileIcon");
10
11
  const layout_1 = require("../layout");
11
12
  const shared_1 = require("./shared");
12
13
  const container = {
@@ -15,7 +16,11 @@ const container = {
15
16
  display: 'flex',
16
17
  flexDirection: 'row',
17
18
  alignItems: 'center',
18
- cursor: 'pointer',
19
+ cursor: 'default',
20
+ marginBottom: 1,
21
+ marginLeft: 4,
22
+ marginRight: 4,
23
+ borderRadius: 4,
19
24
  };
20
25
  const label = {
21
26
  whiteSpace: 'nowrap',
@@ -26,8 +31,9 @@ const searchLabel = {
26
31
  lineHeight: 1.25,
27
32
  };
28
33
  const iconStyle = {
29
- width: 14,
30
- height: 14,
34
+ width: 18,
35
+ height: 18,
36
+ flexShrink: 0,
31
37
  };
32
38
  const labelContainer = {
33
39
  overflow: 'hidden',
@@ -75,10 +81,7 @@ const QuickSwitcherResult = ({ result, selected }) => {
75
81
  const style = (0, react_1.useMemo)(() => {
76
82
  return {
77
83
  ...container,
78
- backgroundColor: (0, colors_1.getBackgroundFromHoverState)({
79
- hovered,
80
- selected,
81
- }),
84
+ backgroundColor: hovered || selected ? colors_1.WHITE_ALPHA_06 : colors_1.TRANSPARENT,
82
85
  };
83
86
  }, [hovered, selected]);
84
87
  const labelStyle = (0, react_1.useMemo)(() => {
@@ -92,7 +95,7 @@ const QuickSwitcherResult = ({ result, selected }) => {
92
95
  fontSize: shared_1.QUICK_SWITCHER_RESULT_LABEL_FONT_SIZE,
93
96
  };
94
97
  }, [hovered, result.type, selected]);
95
- return (jsx_runtime_1.jsxs("div", { ref: ref, style: style, onClick: result.onSelected, children: [result.type === 'composition' ? (result.compositionType === 'still' ? (jsx_runtime_1.jsx(still_1.StillIcon, { color: selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle })) : (jsx_runtime_1.jsx(video_1.FilmIcon, { color: selected ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle }))) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: labelContainer, children: result.type === 'search-result' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
98
+ return (jsx_runtime_1.jsxs("div", { ref: ref, style: style, onClick: result.onSelected, children: [result.type === 'composition' ? (result.compositionType === 'still' ? (jsx_runtime_1.jsx(still_1.StillIcon, { color: selected || hovered ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle })) : (jsx_runtime_1.jsx(video_1.FilmIcon, { color: selected || hovered ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle }))) : result.type === 'asset' ? (jsx_runtime_1.jsx(AssetFileIcon_1.AssetFileIcon, { fileType: result.fileType, color: selected || hovered ? colors_1.WHITE : colors_1.LIGHT_TEXT, style: iconStyle })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("div", { style: labelContainer, children: result.type === 'search-result' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
96
99
  jsx_runtime_1.jsx("div", {
97
100
  // eslint-disable-next-line react/no-danger
98
101
  dangerouslySetInnerHTML: {
@@ -0,0 +1,9 @@
1
+ import type { StaticFile } from '../../api/get-static-files';
2
+ export declare const filterAssetsByType: ({ assets, query, }: {
3
+ readonly assets: StaticFile[];
4
+ readonly query: string;
5
+ }) => {
6
+ readonly assets: StaticFile[];
7
+ readonly query: string;
8
+ };
9
+ export declare const getAssetSearchQueryForComponent: (componentIdentity: string | null) => string;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAssetSearchQueryForComponent = exports.filterAssetsByType = void 0;
4
+ const get_preview_file_type_1 = require("../../helpers/get-preview-file-type");
5
+ const typeFilterRegex = /(^|\s)type:([^\s]+)/gi;
6
+ const filterAssetsByType = ({ assets, query, }) => {
7
+ const typeFilters = [];
8
+ const queryWithoutTypeFilters = query
9
+ .replace(typeFilterRegex, (_match, whitespace, type) => {
10
+ typeFilters.push(type.toLowerCase());
11
+ return whitespace;
12
+ })
13
+ .replace(/\s+/g, ' ')
14
+ .trim();
15
+ if (typeFilters.length === 0) {
16
+ return {
17
+ assets,
18
+ query: queryWithoutTypeFilters,
19
+ };
20
+ }
21
+ return {
22
+ assets: assets.filter((asset) => {
23
+ return typeFilters.includes((0, get_preview_file_type_1.getPreviewFileType)(asset.name));
24
+ }),
25
+ query: queryWithoutTypeFilters,
26
+ };
27
+ };
28
+ exports.filterAssetsByType = filterAssetsByType;
29
+ const componentAssetTypes = {
30
+ 'dev.remotion.media.Audio': 'audio',
31
+ 'dev.remotion.media.Video': 'video',
32
+ 'dev.remotion.remotion.AnimatedImage': 'image',
33
+ 'dev.remotion.remotion.Img': 'image',
34
+ };
35
+ const getAssetSearchQueryForComponent = (componentIdentity) => {
36
+ if (componentIdentity === null) {
37
+ return '';
38
+ }
39
+ const assetType = componentAssetTypes[componentIdentity];
40
+ return assetType ? `type:${assetType} ` : '';
41
+ };
42
+ exports.getAssetSearchQueryForComponent = getAssetSearchQueryForComponent;
@@ -1,2 +1 @@
1
- export declare const downloadBlob: (blob: Blob, filename: string) => void;
2
1
  export declare const ClientRenderQueueProcessor: React.FC;
@@ -1,22 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClientRenderQueueProcessor = exports.downloadBlob = void 0;
3
+ exports.ClientRenderQueueProcessor = void 0;
4
4
  const web_renderer_1 = require("@remotion/web-renderer");
5
5
  const react_1 = require("react");
6
6
  const save_render_output_1 = require("../../api/save-render-output");
7
+ const download_blob_1 = require("../../helpers/download-blob");
7
8
  const context_1 = require("./context");
8
- const downloadBlob = (blob, filename) => {
9
- const url = URL.createObjectURL(blob);
10
- const a = document.createElement('a');
11
- a.href = url;
12
- const cleanFilename = filename.includes('/')
13
- ? filename.substring(filename.lastIndexOf('/') + 1)
14
- : filename;
15
- a.download = cleanFilename;
16
- a.click();
17
- URL.revokeObjectURL(url);
18
- };
19
- exports.downloadBlob = downloadBlob;
20
9
  const ClientRenderQueueProcessor = () => {
21
10
  const { getAbortController, getCompositionForJob, updateClientJobProgress, markClientJobSaving, markClientJobDone, markClientJobFailed, markClientJobCancelled, setProcessJobCallback, } = (0, react_1.useContext)(context_1.RenderQueueContext);
22
11
  const processStillJob = (0, react_1.useCallback)(async (job, signal) => {
@@ -126,7 +115,7 @@ const ClientRenderQueueProcessor = () => {
126
115
  markClientJobSaving(job.id);
127
116
  const getBlob = () => Promise.resolve(blob);
128
117
  const downloadAndFinish = () => {
129
- (0, exports.downloadBlob)(blob, job.outName);
118
+ (0, download_blob_1.downloadBlob)(blob, job.outName);
130
119
  markClientJobDone(job.id, metadata, getBlob);
131
120
  };
132
121
  if (window.remotion_isReadOnlyStudio) {
@@ -4,9 +4,9 @@ exports.RenderQueueDownloadItem = 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 download_blob_1 = require("../../helpers/download-blob");
7
8
  const InlineAction_1 = require("../InlineAction");
8
9
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
9
- const ClientRenderQueueProcessor_1 = require("./ClientRenderQueueProcessor");
10
10
  const RenderQueueDownloadItem = ({ job }) => {
11
11
  const onClick = (0, react_1.useCallback)((e) => {
12
12
  e.stopPropagation();
@@ -16,7 +16,7 @@ const RenderQueueDownloadItem = ({ job }) => {
16
16
  job
17
17
  .getBlob()
18
18
  .then((blob) => {
19
- (0, ClientRenderQueueProcessor_1.downloadBlob)(blob, job.outName);
19
+ (0, download_blob_1.downloadBlob)(blob, job.outName);
20
20
  })
21
21
  .catch((err) => {
22
22
  (0, NotificationCenter_1.showNotification)(`Could not download file: ${err.message}`, 2000);
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { SelectedOutline } from './selected-outline-geometry';
3
+ import { type SelectedOutlineTarget } from './selected-outline-types';
4
+ export declare const SelectedOutlineCropControls: React.FC<{
5
+ readonly outline: SelectedOutline;
6
+ readonly onDraggingChange: (dragging: boolean) => void;
7
+ readonly target: SelectedOutlineTarget | undefined;
8
+ }>;