@remotion/studio 4.0.471 → 4.0.473

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 (192) hide show
  1. package/dist/api/rename-static-file.d.ts +6 -0
  2. package/dist/api/rename-static-file.js +18 -0
  3. package/dist/components/AssetSelector.js +55 -5
  4. package/dist/components/AssetSelectorItem.js +153 -27
  5. package/dist/components/Canvas.js +147 -0
  6. package/dist/components/CompositionSelectorItem.d.ts +1 -0
  7. package/dist/components/CompositionSelectorItem.js +12 -4
  8. package/dist/components/ConfirmationDialog-types.d.ts +8 -0
  9. package/dist/components/ConfirmationDialog-types.js +2 -0
  10. package/dist/components/ConfirmationDialog.d.ts +7 -0
  11. package/dist/components/ConfirmationDialog.js +103 -0
  12. package/dist/components/ContextMenu.d.ts +9 -1
  13. package/dist/components/ContextMenu.js +99 -47
  14. package/dist/components/CurrentAsset.d.ts +1 -0
  15. package/dist/components/CurrentAsset.js +13 -2
  16. package/dist/components/Editor.js +14 -6
  17. package/dist/components/EditorContent.js +15 -2
  18. package/dist/components/EditorContexts.js +2 -1
  19. package/dist/components/EditorRuler/Ruler.js +2 -0
  20. package/dist/components/ExplorerPanel.d.ts +0 -4
  21. package/dist/components/ExplorerPanel.js +8 -4
  22. package/dist/components/ExplorerPanelRef.d.ts +4 -0
  23. package/dist/components/ExplorerPanelRef.js +5 -0
  24. package/dist/components/FilePreview.d.ts +1 -1
  25. package/dist/components/InitialCompositionLoader.d.ts +0 -1
  26. package/dist/components/InitialCompositionLoader.js +5 -27
  27. package/dist/components/Menu/MenuItem.js +7 -1
  28. package/dist/components/Menu/SubMenu.js +5 -1
  29. package/dist/components/Menu/portals.js +17 -8
  30. package/dist/components/MenuToolbar.js +5 -1
  31. package/dist/components/ModalContainer.js +6 -1
  32. package/dist/components/Modals.js +8 -2
  33. package/dist/components/NewComposition/CodemodFooter.js +2 -2
  34. package/dist/components/NewComposition/ComboBox.js +8 -2
  35. package/dist/components/NewComposition/DeleteFolder.d.ts +6 -0
  36. package/dist/components/NewComposition/DeleteFolder.js +39 -0
  37. package/dist/components/NewComposition/DeleteStaticFile.d.ts +4 -0
  38. package/dist/components/NewComposition/DeleteStaticFile.js +44 -0
  39. package/dist/components/NewComposition/RenameFolder.d.ts +6 -0
  40. package/dist/components/NewComposition/RenameFolder.js +60 -0
  41. package/dist/components/NewComposition/RenameStaticFile.d.ts +4 -0
  42. package/dist/components/NewComposition/RenameStaticFile.js +118 -0
  43. package/dist/components/OptionsPanel.js +5 -1
  44. package/dist/components/OutlineToggle.d.ts +2 -0
  45. package/dist/components/OutlineToggle.js +20 -0
  46. package/dist/components/Preview.d.ts +0 -2
  47. package/dist/components/Preview.js +23 -33
  48. package/dist/components/PreviewToolbar.js +19 -6
  49. package/dist/components/RenderButton.js +8 -2
  50. package/dist/components/RenderPreview.js +2 -2
  51. package/dist/components/SelectedOutlineOverlay.d.ts +105 -4
  52. package/dist/components/SelectedOutlineOverlay.js +578 -59
  53. package/dist/components/ShowOutlinesProvider.d.ts +4 -0
  54. package/dist/components/ShowOutlinesProvider.js +24 -0
  55. package/dist/components/SizeSelector.js +3 -3
  56. package/dist/components/Splitter/SplitterContainer.js +9 -0
  57. package/dist/components/Splitter/SplitterHandle.js +65 -70
  58. package/dist/components/StaticFilePreview.js +2 -2
  59. package/dist/components/Timeline/KeyframeSettingsModal.d.ts +15 -0
  60. package/dist/components/Timeline/KeyframeSettingsModal.js +150 -0
  61. package/dist/components/Timeline/Timeline.js +50 -15
  62. package/dist/components/Timeline/TimelineArrayField.d.ts +9 -0
  63. package/dist/components/Timeline/TimelineArrayField.js +210 -0
  64. package/dist/components/Timeline/TimelineBooleanField.d.ts +2 -2
  65. package/dist/components/Timeline/TimelineBooleanField.js +2 -2
  66. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +43 -0
  67. package/dist/components/Timeline/TimelineClipboardKeybindings.js +479 -0
  68. package/dist/components/Timeline/TimelineColorField.d.ts +2 -2
  69. package/dist/components/Timeline/TimelineColorField.js +2 -8
  70. package/dist/components/Timeline/TimelineDeleteKeybindings.js +12 -2
  71. package/dist/components/Timeline/TimelineEffectItem.js +3 -2
  72. package/dist/components/Timeline/TimelineEffectPropItem.js +146 -26
  73. package/dist/components/Timeline/TimelineEnumField.d.ts +2 -2
  74. package/dist/components/Timeline/TimelineEnumField.js +3 -3
  75. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +4 -3
  76. package/dist/components/Timeline/TimelineKeyframeControls.js +41 -37
  77. package/dist/components/Timeline/TimelineKeyframeDiamond.js +24 -21
  78. package/dist/components/Timeline/TimelineKeyframeDiamondIcon.d.ts +6 -0
  79. package/dist/components/Timeline/TimelineKeyframeDiamondIcon.js +14 -0
  80. package/dist/components/Timeline/TimelineKeyframeDragState.d.ts +17 -0
  81. package/dist/components/Timeline/TimelineKeyframeDragState.js +39 -0
  82. package/dist/components/Timeline/TimelineKeyframedValue.d.ts +7 -2
  83. package/dist/components/Timeline/TimelineKeyframedValue.js +22 -8
  84. package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -0
  85. package/dist/components/Timeline/TimelineLayerEye.js +8 -3
  86. package/dist/components/Timeline/TimelineList.js +2 -2
  87. package/dist/components/Timeline/TimelineMediaInfo.d.ts +0 -13
  88. package/dist/components/Timeline/TimelineMediaInfo.js +8 -73
  89. package/dist/components/Timeline/TimelineNumberField.d.ts +2 -2
  90. package/dist/components/Timeline/TimelineNumberField.js +7 -11
  91. package/dist/components/Timeline/TimelinePrimitiveFieldValue.d.ts +17 -0
  92. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +53 -0
  93. package/dist/components/Timeline/TimelineRotationField.d.ts +2 -2
  94. package/dist/components/Timeline/TimelineRotationField.js +41 -24
  95. package/dist/components/Timeline/TimelineRowChrome.js +8 -7
  96. package/dist/components/Timeline/TimelineScaleField.d.ts +20 -0
  97. package/dist/components/Timeline/TimelineScaleField.js +314 -0
  98. package/dist/components/Timeline/TimelineSchemaField.d.ts +3 -2
  99. package/dist/components/Timeline/TimelineSchemaField.js +8 -42
  100. package/dist/components/Timeline/TimelineSelection.js +3 -2
  101. package/dist/components/Timeline/TimelineSequence.d.ts +1 -0
  102. package/dist/components/Timeline/TimelineSequence.js +51 -10
  103. package/dist/components/Timeline/TimelineSequenceFrame.js +1 -0
  104. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  105. package/dist/components/Timeline/TimelineSequenceItem.js +282 -28
  106. package/dist/components/Timeline/TimelineSequencePropItem.js +161 -35
  107. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +58 -0
  108. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +525 -0
  109. package/dist/components/Timeline/TimelineTrack.js +1 -1
  110. package/dist/components/Timeline/TimelineTranslateField.d.ts +2 -2
  111. package/dist/components/Timeline/TimelineTranslateField.js +21 -25
  112. package/dist/components/Timeline/TimelineUvCoordinateField.d.ts +2 -2
  113. package/dist/components/Timeline/TimelineUvCoordinateField.js +20 -26
  114. package/dist/components/Timeline/apply-effect-response-to-code-values.d.ts +5 -0
  115. package/dist/components/Timeline/apply-effect-response-to-code-values.js +19 -0
  116. package/dist/components/Timeline/call-add-keyframe.js +4 -0
  117. package/dist/components/Timeline/call-move-keyframe.d.ts +19 -0
  118. package/dist/components/Timeline/call-move-keyframe.js +71 -0
  119. package/dist/components/Timeline/call-update-keyframe-settings.d.ts +22 -0
  120. package/dist/components/Timeline/call-update-keyframe-settings.js +52 -0
  121. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +7 -4
  122. package/dist/components/Timeline/delete-selected-timeline-item.js +33 -21
  123. package/dist/components/Timeline/duplicate-selected-timeline-item.d.ts +4 -2
  124. package/dist/components/Timeline/duplicate-selected-timeline-item.js +39 -34
  125. package/dist/components/Timeline/get-bounded-keyframe-drag-delta.d.ts +8 -0
  126. package/dist/components/Timeline/get-bounded-keyframe-drag-delta.js +12 -0
  127. package/dist/components/Timeline/get-keyframe-navigation.d.ts +2 -2
  128. package/dist/components/Timeline/get-keyframe-navigation.js +14 -6
  129. package/dist/components/Timeline/get-node-keyframes.d.ts +5 -2
  130. package/dist/components/Timeline/get-node-keyframes.js +38 -5
  131. package/dist/components/Timeline/get-timeline-keyframes.js +4 -4
  132. package/dist/components/Timeline/reset-selected-timeline-props.js +22 -8
  133. package/dist/components/Timeline/save-effect-prop.d.ts +14 -3
  134. package/dist/components/Timeline/save-effect-prop.js +36 -18
  135. package/dist/components/Timeline/save-prop-queue.d.ts +2 -1
  136. package/dist/components/Timeline/save-prop-queue.js +5 -2
  137. package/dist/components/Timeline/save-sequence-prop.d.ts +2 -7
  138. package/dist/components/Timeline/save-sequence-prop.js +33 -30
  139. package/dist/components/Timeline/should-clear-selection-on-pointer-down.d.ts +3 -0
  140. package/dist/components/Timeline/should-clear-selection-on-pointer-down.js +7 -0
  141. package/dist/components/Timeline/timeline-asset-link.d.ts +13 -0
  142. package/dist/components/Timeline/timeline-asset-link.js +37 -0
  143. package/dist/components/Timeline/timeline-field-utils.d.ts +1 -0
  144. package/dist/components/Timeline/timeline-field-utils.js +5 -1
  145. package/dist/components/Timeline/timeline-translate-utils.js +9 -2
  146. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +7 -0
  147. package/dist/components/Timeline/use-timeline-keyframe-drag.d.ts +10 -0
  148. package/dist/components/Timeline/use-timeline-keyframe-drag.js +378 -0
  149. package/dist/components/TopPanel.d.ts +1 -1
  150. package/dist/components/folder-menu-items.d.ts +12 -0
  151. package/dist/components/folder-menu-items.js +147 -0
  152. package/dist/components/import-assets.d.ts +22 -0
  153. package/dist/components/import-assets.js +294 -0
  154. package/dist/components/load-canvas-content-from-url.d.ts +1 -0
  155. package/dist/components/load-canvas-content-from-url.js +9 -3
  156. package/dist/components/use-select-asset.d.ts +1 -0
  157. package/dist/components/use-select-asset.js +30 -0
  158. package/dist/error-overlay/error-origin.d.ts +3 -0
  159. package/dist/error-overlay/error-origin.js +42 -0
  160. package/dist/error-overlay/react-overlay/listen-to-runtime-errors.js +6 -2
  161. package/dist/error-overlay/remotion-overlay/ErrorLoader.js +38 -0
  162. package/dist/error-overlay/remotion-overlay/ShortcutHint.js +1 -1
  163. package/dist/error-overlay/remotion-overlay/log-studio-error.d.ts +3 -0
  164. package/dist/error-overlay/remotion-overlay/log-studio-error.js +27 -0
  165. package/dist/esm/{chunk-z0z9d4r0.js → chunk-q0jkt0zq.js} +23062 -17350
  166. package/dist/esm/internals.mjs +23062 -17350
  167. package/dist/esm/previewEntry.mjs +22351 -16615
  168. package/dist/esm/renderEntry.mjs +1 -1
  169. package/dist/helpers/calculate-timeline.js +7 -3
  170. package/dist/helpers/create-folder-tree.js +1 -0
  171. package/dist/helpers/get-asset-metadata.js +2 -2
  172. package/dist/helpers/get-folder-id.d.ts +4 -0
  173. package/dist/helpers/get-folder-id.js +7 -0
  174. package/dist/helpers/get-preview-file-type.d.ts +2 -0
  175. package/dist/helpers/get-preview-file-type.js +33 -0
  176. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -0
  177. package/dist/helpers/install-required-package.d.ts +1 -0
  178. package/dist/helpers/install-required-package.js +39 -0
  179. package/dist/helpers/remote-asset-drag.d.ts +4 -0
  180. package/dist/helpers/remote-asset-drag.js +73 -0
  181. package/dist/helpers/timeline-layout.js +5 -1
  182. package/dist/helpers/use-asset-drag-events.d.ts +5 -2
  183. package/dist/helpers/use-asset-drag-events.js +13 -2
  184. package/dist/helpers/validate-folder-rename.d.ts +6 -0
  185. package/dist/helpers/validate-folder-rename.js +19 -0
  186. package/dist/hot-middleware-client/client.js +6 -0
  187. package/dist/state/editor-outlines.d.ts +8 -0
  188. package/dist/state/editor-outlines.js +18 -0
  189. package/dist/state/modals.d.ts +29 -2
  190. package/dist/state/scale-lock.d.ts +18 -0
  191. package/dist/state/scale-lock.js +59 -0
  192. package/package.json +10 -10
@@ -61,6 +61,8 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
61
61
  setHovered(false);
62
62
  }, []);
63
63
  const onPointerDown = (0, react_1.useCallback)((e) => {
64
+ // Prevent deselection of currently selected items
65
+ e.stopPropagation();
64
66
  if (e.button !== 0) {
65
67
  return;
66
68
  }
@@ -73,6 +75,10 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
73
75
  once: true,
74
76
  });
75
77
  }, [id, onItemQuit, onItemSelected]);
78
+ const onMenuPointerDown = (0, react_1.useCallback)((e) => {
79
+ // Prevent deselection of currently selected items
80
+ e.stopPropagation();
81
+ }, []);
76
82
  const onClick = (0, react_1.useCallback)((e) => {
77
83
  e.stopPropagation();
78
84
  const isKeyboardInitiated = e.detail === 0;
@@ -92,7 +98,7 @@ const MenuItem = ({ label: itemName, selected, id, onItemSelected, onItemHovered
92
98
  }, [size]);
93
99
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
94
100
  jsx_runtime_1.jsx("button", { ref: ref, role: "button", tabIndex: tabIndex, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, onPointerDown: onPointerDown, onClick: onClick, style: containerStyle, type: "button", className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, children: itemName }), portalStyle
95
- ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { className: "css-reset", style: outerStyle, children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onItemQuit, onOutsideClick: onItemQuit, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: onPreviousMenu, onPreviousMenu: onNextMenu, values: menu.items, onHide: onItemQuit, leaveLeftSpace: menu.leaveLeftPadding, preselectIndex: false, topItemCanBeUnselected: true, fixedHeight: null }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
101
+ ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { className: "css-reset", style: outerStyle, children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onItemQuit, onOutsideClick: onItemQuit, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: onPreviousMenu, onPreviousMenu: onNextMenu, values: menu.items, onHide: onItemQuit, leaveLeftSpace: menu.leaveLeftPadding, preselectIndex: false, topItemCanBeUnselected: true, fixedHeight: null }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
96
102
  : null] }));
97
103
  };
98
104
  exports.MenuItem = MenuItem;
@@ -18,7 +18,11 @@ const SubMenuComponent = ({ portalStyle, subMenuActivated, subMenu, onQuitFullMe
18
18
  onQuitFullMenu();
19
19
  }
20
20
  }, [mobileLayout, onQuitFullMenu, onQuitSubMenu]);
21
- return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onQuitFullMenu, onOutsideClick: onOutsideClick, children: jsx_runtime_1.jsx("div", { style: portalStyle, className: "css-reset", children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: onQuitSubMenu, values: subMenu.items, onHide: onQuitFullMenu, leaveLeftSpace: subMenu.leaveLeftSpace, preselectIndex: subMenuActivated === 'without-mouse' &&
21
+ const onPointerDown = (0, react_1.useCallback)((e) => {
22
+ // Prevent deselection of currently selected items
23
+ e.stopPropagation();
24
+ }, []);
25
+ return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onQuitFullMenu, onOutsideClick: onOutsideClick, children: jsx_runtime_1.jsx("div", { style: portalStyle, className: "css-reset", onPointerDown: onPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: onQuitSubMenu, values: subMenu.items, onHide: onQuitFullMenu, leaveLeftSpace: subMenu.leaveLeftSpace, preselectIndex: subMenuActivated === 'without-mouse' &&
22
26
  typeof subMenu.preselectIndex === 'number'
23
27
  ? subMenu.preselectIndex
24
28
  : false, topItemCanBeUnselected: false, fixedHeight: null }) }) }));
@@ -1,15 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPortal = exports.portals = void 0;
4
- exports.portals = [
5
- document.getElementById('menuportal-0'),
6
- document.getElementById('menuportal-1'),
7
- document.getElementById('menuportal-2'),
8
- document.getElementById('menuportal-3'),
9
- document.getElementById('menuportal-4'),
10
- document.getElementById('menuportal-5'),
4
+ const portalIds = [
5
+ 'menuportal-0',
6
+ 'menuportal-1',
7
+ 'menuportal-2',
8
+ 'menuportal-3',
9
+ 'menuportal-4',
10
+ 'menuportal-5',
11
11
  ];
12
+ exports.portals =
13
+ // This module is imported by Bun tests that run without a DOM.
14
+ typeof document === 'undefined'
15
+ ? []
16
+ : portalIds.map((id) => document.getElementById(id));
12
17
  const getPortal = (i) => {
13
- return exports.portals[i];
18
+ const portal = exports.portals[i];
19
+ if (!portal) {
20
+ throw new Error(`Expected menu portal ${i} to exist`);
21
+ }
22
+ return portal;
14
23
  };
15
24
  exports.getPortal = getPortal;
@@ -90,7 +90,11 @@ const MenuToolbar = ({ readOnlyStudio }) => {
90
90
  const onItemQuit = (0, react_1.useCallback)(() => {
91
91
  setSelected(null);
92
92
  }, [setSelected]);
93
- return (jsx_runtime_1.jsxs(layout_1.Row, { align: "center", className: "css-reset", style: row, children: [
93
+ const onPointerDown = (0, react_1.useCallback)((e) => {
94
+ // Prevent deselection of currently selected items
95
+ e.stopPropagation();
96
+ }, []);
97
+ return (jsx_runtime_1.jsxs(layout_1.Row, { align: "center", className: "css-reset", style: row, onPointerDown: onPointerDown, children: [
94
98
  jsx_runtime_1.jsxs("div", { style: fixedWidthLeft, children: [structure.map((s) => {
95
99
  return (jsx_runtime_1.jsx(MenuItem_1.MenuItem, { selected: selected === s.id, onItemSelected: itemClicked, onItemHovered: itemHovered, id: s.id, label: s.label, onItemQuit: onItemQuit, menu: s, onPreviousMenu: onPreviousMenu, onNextMenu: onNextMenu, leaveLeftPadding: s.leaveLeftPadding }, s.id));
96
100
  }), readOnlyStudio ? null : jsx_runtime_1.jsx(UpdateCheck_1.UpdateCheck, {})] }), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsx(MenuBuildIndicator_1.MenuBuildIndicator, {}), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsxs("div", { style: fixedWidthRight, children: [readOnlyStudio ? null : jsx_runtime_1.jsx(UndoRedoButtons_1.UndoRedoButtons, {}), jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControls, {})
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ModalContainer = exports.getMaxModalHeight = exports.getMaxModalWidth = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
5
6
  const colors_1 = require("../helpers/colors");
6
7
  const z_index_1 = require("../state/z-index");
7
8
  const padding = 20;
@@ -29,6 +30,10 @@ const panel = {
29
30
  margin: 'auto',
30
31
  };
31
32
  const ModalContainer = ({ children, onEscape, onOutsideClick, noZIndex }) => {
32
- return (jsx_runtime_1.jsx("div", { className: "css-reset", style: backgroundOverlay, role: "dialog", "aria-modal": "true", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { disabled: noZIndex, onOutsideClick: onOutsideClick, onEscape: onEscape, children: jsx_runtime_1.jsx("div", { style: panel, children: children }) }) }));
33
+ const onPointerDown = (0, react_1.useCallback)((e) => {
34
+ // Prevent deselection of currently selected items
35
+ e.stopPropagation();
36
+ }, []);
37
+ return (jsx_runtime_1.jsx("div", { className: "css-reset", style: backgroundOverlay, role: "dialog", "aria-modal": "true", onPointerDown: onPointerDown, children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { disabled: noZIndex, onOutsideClick: onOutsideClick, onEscape: onEscape, children: jsx_runtime_1.jsx("div", { style: panel, children: children }) }) }));
33
38
  };
34
39
  exports.ModalContainer = ModalContainer;
@@ -9,23 +9,29 @@ const react_1 = require("react");
9
9
  const client_id_1 = require("../helpers/client-id");
10
10
  const modals_1 = require("../state/modals");
11
11
  const AskAiModal_1 = require("./AskAiModal");
12
+ const ConfirmationDialog_1 = require("./ConfirmationDialog");
12
13
  const InstallPackage_1 = require("./InstallPackage");
13
14
  const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
15
+ const DeleteFolder_1 = require("./NewComposition/DeleteFolder");
16
+ const DeleteStaticFile_1 = require("./NewComposition/DeleteStaticFile");
14
17
  const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
15
18
  const RenameComposition_1 = require("./NewComposition/RenameComposition");
19
+ const RenameFolder_1 = require("./NewComposition/RenameFolder");
20
+ const RenameStaticFile_1 = require("./NewComposition/RenameStaticFile");
16
21
  const OverrideInputProps_1 = require("./OverrideInputProps");
17
22
  const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher"));
18
23
  const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
19
24
  const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
20
25
  const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
26
+ const KeyframeSettingsModal_1 = require("./Timeline/KeyframeSettingsModal");
21
27
  const UpdateModal_1 = require("./UpdateModal/UpdateModal");
22
28
  const Modals = ({ readOnlyStudio }) => {
23
29
  var _a;
24
30
  const { selectedModal: modalContextType } = (0, react_1.useContext)(modals_1.ModalsContext);
25
31
  const canRender = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState.type ===
26
32
  'connected';
27
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
33
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'delete-static-file' && (jsx_runtime_1.jsx(DeleteStaticFile_1.DeleteStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'keyframe-settings' && (jsx_runtime_1.jsx(KeyframeSettingsModal_1.KeyframeSettingsModal, { state: modalContextType })), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
28
34
  modalContextType.type === 'server-render' &&
29
- (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), process.env.ASK_AI_ENABLED && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
35
+ (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), process.env.ASK_AI_ENABLED && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
30
36
  };
31
37
  exports.Modals = Modals;
@@ -70,7 +70,7 @@ const CodemodFooter = ({ codemod, stack, valid, loadingNotification, successNoti
70
70
  if (!stack) {
71
71
  setCanApplyCodemod({
72
72
  type: 'fail',
73
- error: 'Could not determine where this composition is defined',
73
+ error: 'Could not determine where this item is defined',
74
74
  });
75
75
  return;
76
76
  }
@@ -80,7 +80,7 @@ const CodemodFooter = ({ codemod, stack, valid, loadingNotification, successNoti
80
80
  if (!symbolicatedStack) {
81
81
  setCanApplyCodemod({
82
82
  type: 'fail',
83
- error: 'Could not resolve the source location of this composition',
83
+ error: 'Could not resolve the source location of this item',
84
84
  });
85
85
  return;
86
86
  }
@@ -55,6 +55,10 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
55
55
  const onHide = (0, react_1.useCallback)(() => {
56
56
  setOpened(false);
57
57
  }, []);
58
+ const onOverlayPointerDown = (0, react_1.useCallback)((e) => {
59
+ // Prevent deselection of currently selected items
60
+ e.stopPropagation();
61
+ }, []);
58
62
  (0, react_1.useEffect)(() => {
59
63
  const { current } = ref;
60
64
  if (!current) {
@@ -62,7 +66,9 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
62
66
  }
63
67
  const onMouseEnter = () => setIsHovered(true);
64
68
  const onMouseLeave = () => setIsHovered(false);
65
- const onPointerDown = () => {
69
+ const onPointerDown = (e) => {
70
+ // Prevent deselection of currently selected items
71
+ e.stopPropagation();
66
72
  return setOpened((o) => {
67
73
  if (!o) {
68
74
  refresh === null || refresh === void 0 ? void 0 : refresh();
@@ -176,7 +182,7 @@ const Combobox = ({ values, selectedId, style: customStyle, title, small = false
176
182
  " ",
177
183
  jsx_runtime_1.jsx(caret_1.CaretDown, { small: small })
178
184
  ] }), portalStyle
179
- ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, 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((v) => selected && v.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
185
+ ? 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((v) => selected && v.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
180
186
  : null] }));
181
187
  };
182
188
  exports.Combobox = Combobox;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare const DeleteFolder: React.FC<{
3
+ readonly folderName: string;
4
+ readonly parentName: string | null;
5
+ readonly stack: string | null;
6
+ }>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeleteFolder = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const get_folder_id_1 = require("../../helpers/get-folder-id");
7
+ const styles_1 = require("../Menu/styles");
8
+ const ModalFooter_1 = require("../ModalFooter");
9
+ const ModalHeader_1 = require("../ModalHeader");
10
+ const CodemodFooter_1 = require("./CodemodFooter");
11
+ const DismissableModal_1 = require("./DismissableModal");
12
+ const content = {
13
+ padding: 16,
14
+ fontSize: 14,
15
+ flex: 1,
16
+ minWidth: 500,
17
+ };
18
+ const DeleteFolder = ({ folderName, parentName, stack }) => {
19
+ const codemod = (0, react_1.useMemo)(() => {
20
+ return {
21
+ type: 'delete-folder',
22
+ folderName,
23
+ parentName,
24
+ };
25
+ }, [folderName, parentName]);
26
+ const onSubmit = (0, react_1.useCallback)((e) => {
27
+ e.preventDefault();
28
+ }, []);
29
+ const folderId = (0, get_folder_id_1.getFolderId)({ folderName, parentName });
30
+ return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
31
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: 'Delete folder' }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
32
+ jsx_runtime_1.jsxs("div", { style: content, children: ["Do you want to delete the", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: "Folder" }),
33
+ " with ID ", '"', folderId, '"', "?",
34
+ jsx_runtime_1.jsx("br", {}),
35
+ "The compositions and nested folders inside it will stay in your code."] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { errorNotification: `Could not delete folder`, loadingNotification: 'Deleting folder', successNotification: `Deleted folder ${folderId}`, genericSubmitLabel: `Delete`, submitLabel: ({ relativeRootPath }) => `Delete from ${relativeRootPath}`, codemod: codemod, stack: stack, valid: true, onSuccess: null }) })
36
+ ] })
37
+ ] }));
38
+ };
39
+ exports.DeleteFolder = DeleteFolder;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const DeleteStaticFileModal: React.FC<{
3
+ readonly relativePath: string;
4
+ }>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeleteStaticFileModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const delete_static_file_1 = require("../../api/delete-static-file");
7
+ const modals_1 = require("../../state/modals");
8
+ const Button_1 = require("../Button");
9
+ const layout_1 = require("../layout");
10
+ const styles_1 = require("../Menu/styles");
11
+ const ModalFooter_1 = require("../ModalFooter");
12
+ const ModalHeader_1 = require("../ModalHeader");
13
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
14
+ const DismissableModal_1 = require("./DismissableModal");
15
+ const content = {
16
+ padding: 16,
17
+ fontSize: 14,
18
+ flex: 1,
19
+ minWidth: 500,
20
+ };
21
+ const DeleteStaticFileModal = ({ relativePath }) => {
22
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
23
+ const [submitting, setSubmitting] = (0, react_1.useState)(false);
24
+ const onDelete = (0, react_1.useCallback)(() => {
25
+ setSubmitting(true);
26
+ const notification = (0, NotificationCenter_1.showNotification)(`Deleting ${relativePath}...`, null);
27
+ (0, delete_static_file_1.deleteStaticFile)(relativePath)
28
+ .then(() => {
29
+ setSelectedModal(null);
30
+ notification.replaceContent(`Deleted ${relativePath}`, 2000);
31
+ })
32
+ .catch((err) => {
33
+ setSubmitting(false);
34
+ notification.replaceContent(`Could not delete ${relativePath}: ${err.message}`, 3000);
35
+ });
36
+ }, [relativePath, setSelectedModal]);
37
+ return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
38
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: 'Delete asset' }), jsx_runtime_1.jsxs("div", { style: content, children: ["Do you want to delete the asset", ' ', jsx_runtime_1.jsx("code", { style: styles_1.inlineCodeSnippet, children: relativePath }),
39
+ " from your public folder?"] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsxs(layout_1.Row, { align: "center", justify: "flex-end", children: [
40
+ jsx_runtime_1.jsx(Button_1.Button, { onClick: () => setSelectedModal(null), children: "Cancel" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx(Button_1.Button, { onClick: onDelete, disabled: submitting, children: "Delete" })
41
+ ] }) })
42
+ ] }));
43
+ };
44
+ exports.DeleteStaticFileModal = DeleteStaticFileModal;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare const RenameFolder: React.FC<{
3
+ readonly folderName: string;
4
+ readonly parentName: string | null;
5
+ readonly stack: string | null;
6
+ }>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenameFolder = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const get_folder_id_1 = require("../../helpers/get-folder-id");
8
+ const validate_folder_rename_1 = require("../../helpers/validate-folder-rename");
9
+ const layout_1 = require("../layout");
10
+ const ModalFooter_1 = require("../ModalFooter");
11
+ const ModalHeader_1 = require("../ModalHeader");
12
+ const layout_2 = require("../RenderModal/layout");
13
+ const CodemodFooter_1 = require("./CodemodFooter");
14
+ const DismissableModal_1 = require("./DismissableModal");
15
+ const RemInput_1 = require("./RemInput");
16
+ const ValidationMessage_1 = require("./ValidationMessage");
17
+ const content = {
18
+ padding: 12,
19
+ paddingRight: 12,
20
+ flex: 1,
21
+ fontSize: 13,
22
+ minWidth: 500,
23
+ };
24
+ const RenameFolder = ({ folderName, parentName, stack }) => {
25
+ const { folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
26
+ const [newName, setName] = (0, react_1.useState)(folderName);
27
+ const onNameChange = (0, react_1.useCallback)((e) => {
28
+ setName(e.target.value);
29
+ }, []);
30
+ const folderNameErrMessage = (0, validate_folder_rename_1.validateFolderRename)({
31
+ folders,
32
+ newName,
33
+ originalName: folderName,
34
+ parentName,
35
+ });
36
+ const valid = folderNameErrMessage === null && folderName !== newName;
37
+ const codemod = (0, react_1.useMemo)(() => {
38
+ return {
39
+ type: 'rename-folder',
40
+ folderName,
41
+ parentName,
42
+ newName,
43
+ };
44
+ }, [folderName, newName, parentName]);
45
+ const onSubmit = (0, react_1.useCallback)((e) => {
46
+ e.preventDefault();
47
+ }, []);
48
+ const folderId = (0, get_folder_id_1.getFolderId)({ folderName, parentName });
49
+ return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
50
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: `Rename ${folderId}` }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
51
+ jsx_runtime_1.jsx("div", { style: content, children: jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
52
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Name" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { children: [
53
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { value: newName, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Folder name", status: "ok", rightAlign: true }), folderNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
54
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: folderNameErrMessage, type: "error" })
55
+ ] })) : null] }) })
56
+ ] }) }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: 'Renaming folder...', errorNotification: 'Could not rename folder', successNotification: `Renamed folder to ${newName}`, genericSubmitLabel: 'Rename', submitLabel: ({ relativeRootPath }) => `Modify ${relativeRootPath}`, codemod: codemod, stack: stack, valid: valid, onSuccess: null }) })
57
+ ] })
58
+ ] }));
59
+ };
60
+ exports.RenameFolder = RenameFolder;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const RenameStaticFileModal: React.FC<{
3
+ readonly relativePath: string;
4
+ }>;
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RenameStaticFileModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const rename_static_file_1 = require("../../api/rename-static-file");
8
+ const url_state_1 = require("../../helpers/url-state");
9
+ const modals_1 = require("../../state/modals");
10
+ const Button_1 = require("../Button");
11
+ const layout_1 = require("../layout");
12
+ const ModalFooter_1 = require("../ModalFooter");
13
+ const ModalHeader_1 = require("../ModalHeader");
14
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
15
+ const layout_2 = require("../RenderModal/layout");
16
+ const use_static_files_1 = require("../use-static-files");
17
+ const DismissableModal_1 = require("./DismissableModal");
18
+ const RemInput_1 = require("./RemInput");
19
+ const ValidationMessage_1 = require("./ValidationMessage");
20
+ const content = {
21
+ padding: 12,
22
+ paddingRight: 12,
23
+ flex: 1,
24
+ fontSize: 13,
25
+ minWidth: 500,
26
+ };
27
+ const getParent = (relativePath) => {
28
+ const slashIndex = relativePath.lastIndexOf('/');
29
+ return slashIndex === -1 ? '' : relativePath.slice(0, slashIndex);
30
+ };
31
+ const getBaseName = (relativePath) => {
32
+ const slashIndex = relativePath.lastIndexOf('/');
33
+ return slashIndex === -1 ? relativePath : relativePath.slice(slashIndex + 1);
34
+ };
35
+ const RenameStaticFileModal = ({ relativePath }) => {
36
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
37
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
38
+ const { setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionSetters);
39
+ const staticFiles = (0, use_static_files_1.useStaticFiles)();
40
+ const [newName, setNewName] = (0, react_1.useState)(() => getBaseName(relativePath));
41
+ const [submitting, setSubmitting] = (0, react_1.useState)(false);
42
+ const parent = (0, react_1.useMemo)(() => getParent(relativePath), [relativePath]);
43
+ const newRelativePath = (0, react_1.useMemo)(() => {
44
+ return [parent, newName].filter(Boolean).join('/');
45
+ }, [newName, parent]);
46
+ const changed = newRelativePath !== relativePath;
47
+ const validationMessage = (0, react_1.useMemo)(() => {
48
+ const trimmedName = newName.trim();
49
+ if (trimmedName.length === 0) {
50
+ return 'Name cannot be empty';
51
+ }
52
+ if (trimmedName !== newName) {
53
+ return 'Name cannot start or end with whitespace';
54
+ }
55
+ if (newName.includes('/') || newName.includes('\\')) {
56
+ return 'Name cannot include slashes';
57
+ }
58
+ const existingFile = staticFiles.find((file) => {
59
+ return file.name === newRelativePath && file.name !== relativePath;
60
+ });
61
+ if (existingFile) {
62
+ return 'An asset with this name already exists';
63
+ }
64
+ return null;
65
+ }, [newName, newRelativePath, relativePath, staticFiles]);
66
+ const valid = changed && validationMessage === null;
67
+ const onNameChange = (0, react_1.useCallback)((e) => {
68
+ setNewName(e.target.value);
69
+ }, []);
70
+ const onRename = (0, react_1.useCallback)(() => {
71
+ if (!valid) {
72
+ return;
73
+ }
74
+ setSubmitting(true);
75
+ const notification = (0, NotificationCenter_1.showNotification)(`Renaming ${relativePath}...`, null);
76
+ (0, rename_static_file_1.renameStaticFile)({
77
+ oldRelativePath: relativePath,
78
+ newRelativePath,
79
+ })
80
+ .then(() => {
81
+ setSelectedModal(null);
82
+ if ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset' &&
83
+ canvasContent.asset === relativePath) {
84
+ setCanvasContent({ type: 'asset', asset: newRelativePath });
85
+ (0, url_state_1.pushUrl)(`/assets/${newRelativePath}`);
86
+ }
87
+ notification.replaceContent(`Renamed to ${newRelativePath}`, 2000);
88
+ })
89
+ .catch((err) => {
90
+ setSubmitting(false);
91
+ notification.replaceContent(`Could not rename ${relativePath}: ${err.message}`, 3000);
92
+ });
93
+ }, [
94
+ canvasContent,
95
+ newRelativePath,
96
+ relativePath,
97
+ setCanvasContent,
98
+ setSelectedModal,
99
+ valid,
100
+ ]);
101
+ const onSubmit = (0, react_1.useCallback)((e) => {
102
+ e.preventDefault();
103
+ onRename();
104
+ }, [onRename]);
105
+ return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { children: [
106
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: `Rename ${relativePath}` }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
107
+ jsx_runtime_1.jsx("div", { style: content, children: jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
108
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Name" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { children: [
109
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { value: newName, onChange: onNameChange, type: "text", autoFocus: true, autoComplete: "off", "data-1p-ignore": true, placeholder: "Asset name", status: validationMessage ? 'error' : 'ok', rightAlign: true }), validationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
110
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: validationMessage, type: "error" })
111
+ ] })) : null] }) })
112
+ ] }) }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsxs(layout_1.Row, { align: "center", justify: "flex-end", children: [
113
+ jsx_runtime_1.jsx(Button_1.Button, { onClick: () => setSelectedModal(null), children: "Cancel" }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx(Button_1.Button, { onClick: onRename, disabled: !valid || submitting, children: "Rename" })
114
+ ] }) })
115
+ ] })
116
+ ] }));
117
+ };
118
+ exports.RenameStaticFileModal = RenameStaticFileModal;
@@ -181,7 +181,11 @@ const OptionsPanel = ({ readOnlyStudio }) => {
181
181
  saveToFile(updater);
182
182
  }
183
183
  }, [compositionId, compositionDefaultProps, saveToFile, updateProps]);
184
- return (jsx_runtime_1.jsxs("div", { style: container, className: "css-reset", children: [
184
+ const onPointerDown = (0, react_1.useCallback)((e) => {
185
+ // Prevent deselection of currently selected items
186
+ e.stopPropagation();
187
+ }, []);
188
+ return (jsx_runtime_1.jsxs("div", { style: container, className: "css-reset", onPointerDown: onPointerDown, children: [
185
189
  jsx_runtime_1.jsx("div", { style: tabsContainer, children: jsx_runtime_1.jsxs(Tabs_1.Tabs, { children: [visualControlsTabActivated ? (jsx_runtime_1.jsx(Tabs_1.Tab, { selected: panel === 'visual-controls', onClick: onVisualControlsSelected, children: "Controls" })) : null, jsx_runtime_1.jsxs(Tabs_1.Tab, { selected: panel === 'input-props', onClick: onPropsSelected, style: { justifyContent: 'space-between' }, children: ["Props", hasLocalModifications ? (jsx_runtime_1.jsx(SchemaResetButton_1.SchemaResetButton, { onClick: resetToOriginal })) : null] }), renderingAvailable ? (jsx_runtime_1.jsx(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' })) : null] }) }), panel === 'input-props' ? (composition ? (jsx_runtime_1.jsx(DefaultPropsEditor_1.DefaultPropsEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, propsEditType: "default-props" }, composition.id)) : null) : panel === 'visual-controls' && visualControlsTabActivated ? (jsx_runtime_1.jsx(VisualControlsContent_1.VisualControlsContent, {})) : !renderingAvailable ? null : (jsx_runtime_1.jsx(RenderQueue_1.RenderQueue, {}))] }));
186
190
  };
187
191
  exports.OptionsPanel = OptionsPanel;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const OutlineToggle: React.FC;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OutlineToggle = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../helpers/colors");
7
+ const editor_outlines_1 = require("../state/editor-outlines");
8
+ const ControlButton_1 = require("./ControlButton");
9
+ const OutlineToggle = () => {
10
+ const { editorShowOutlines, setEditorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
11
+ const onClick = (0, react_1.useCallback)(() => {
12
+ setEditorShowOutlines((current) => !current);
13
+ }, [setEditorShowOutlines]);
14
+ const color = editorShowOutlines ? colors_1.BLUE : 'white';
15
+ const accessibilityLabel = editorShowOutlines
16
+ ? 'Hide outlines'
17
+ : 'Show outlines';
18
+ return (jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: accessibilityLabel, "aria-label": accessibilityLabel, onClick: onClick, children: jsx_runtime_1.jsx("svg", { style: { width: 16, height: 16 }, viewBox: "0 0 512 512", fill: color, "aria-hidden": "true", focusable: "false", children: jsx_runtime_1.jsx("path", { d: "M32 119.4C12.9 108.4 0 87.7 0 64 0 28.7 28.7 0 64 0 87.7 0 108.4 12.9 119.4 32l273.1 0c11.1-19.1 31.7-32 55.4-32 35.3 0 64 28.7 64 64 0 23.7-12.9 44.4-32 55.4l0 273.1c19.1 11.1 32 31.7 32 55.4 0 35.3-28.7 64-64 64-23.7 0-44.4-12.9-55.4-32l-273.1 0c-11.1 19.1-31.7 32-55.4 32-35.3 0-64-28.7-64-64 0-23.7 12.9-44.4 32-55.4l0-273.1zm64 0l0 273.1c9.7 5.6 17.8 13.7 23.4 23.4l273.1 0c5.6-9.7 13.7-17.8 23.4-23.4l0-273.1c-9.7-5.6-17.8-13.7-23.4-23.4L119.4 96c-5.6 9.7-13.7 17.8-23.4 23.4z" }) }) }));
19
+ };
20
+ exports.OutlineToggle = OutlineToggle;
@@ -3,8 +3,6 @@ import React from 'react';
3
3
  import type { CanvasContent } from 'remotion';
4
4
  import type { AssetMetadata } from '../helpers/get-asset-metadata';
5
5
  import type { Dimensions } from '../helpers/is-current-selected-still';
6
- export type AssetFileType = 'audio' | 'video' | 'image' | 'json' | 'txt' | 'other';
7
- export declare const getPreviewFileType: (fileName: string | null) => AssetFileType;
8
6
  export declare const VideoPreview: React.FC<{
9
7
  readonly canvasSize: Size;
10
8
  readonly contentDimensions: Dimensions | 'none' | null;