@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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VideoPreview = exports.getPreviewFileType = void 0;
3
+ exports.VideoPreview = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const player_1 = require("@remotion/player");
6
6
  const react_1 = require("react");
@@ -8,12 +8,15 @@ const remotion_1 = require("remotion");
8
8
  const ErrorLoader_1 = require("../error-overlay/remotion-overlay/ErrorLoader");
9
9
  const checkerboard_background_1 = require("../helpers/checkerboard-background");
10
10
  const colors_1 = require("../helpers/colors");
11
+ const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
11
12
  const checkerboard_1 = require("../state/checkerboard");
12
13
  const is_menu_item_1 = require("./Menu/is-menu-item");
13
14
  const RenderPreview_1 = require("./RenderPreview");
14
15
  const SelectedOutlineOverlay_1 = require("./SelectedOutlineOverlay");
15
16
  const Spinner_1 = require("./Spinner");
16
17
  const StaticFilePreview_1 = require("./StaticFilePreview");
18
+ const should_clear_selection_on_pointer_down_1 = require("./Timeline/should-clear-selection-on-pointer-down");
19
+ const TimelineSelection_1 = require("./Timeline/TimelineSelection");
17
20
  const centeredContainer = {
18
21
  display: 'flex',
19
22
  flex: 1,
@@ -33,36 +36,6 @@ const assetMetadataErrorContainer = {
33
36
  height: '100%',
34
37
  overflowY: 'auto',
35
38
  };
36
- const getPreviewFileType = (fileName) => {
37
- var _a;
38
- if (!fileName) {
39
- return 'other';
40
- }
41
- const audioExtensions = ['mp3', 'wav', 'ogg', 'aac'];
42
- const videoExtensions = ['mp4', 'avi', 'mkv', 'mov', 'webm'];
43
- const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
44
- const fileExtension = (_a = fileName.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
45
- if (fileExtension === undefined) {
46
- throw new Error('File extension is undefined');
47
- }
48
- if (audioExtensions.includes(fileExtension)) {
49
- return 'audio';
50
- }
51
- if (videoExtensions.includes(fileExtension)) {
52
- return 'video';
53
- }
54
- if (imageExtensions.includes(fileExtension)) {
55
- return 'image';
56
- }
57
- if (fileExtension === 'json') {
58
- return 'json';
59
- }
60
- if (fileExtension === 'txt') {
61
- return 'txt';
62
- }
63
- return 'other';
64
- };
65
- exports.getPreviewFileType = getPreviewFileType;
66
39
  const checkerboardSize = 49;
67
40
  const containerStyle = (options) => {
68
41
  return {
@@ -126,7 +99,7 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
126
99
  overflow: canvasContent.type === 'composition' ? 'visible' : 'hidden',
127
100
  justifyContent: canvasContent.type === 'asset' ? 'center' : 'flex-start',
128
101
  alignItems: canvasContent.type === 'asset' &&
129
- (0, exports.getPreviewFileType)(canvasContent.asset) === 'audio'
102
+ (0, get_preview_file_type_1.getPreviewFileType)(canvasContent.asset) === 'audio'
130
103
  ? 'center'
131
104
  : 'normal',
132
105
  };
@@ -154,6 +127,8 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
154
127
  };
155
128
  const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions }) => {
156
129
  const { checkerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
130
+ const { clearSelection } = (0, TimelineSelection_1.useTimelineSelection)();
131
+ const portalContainer = (0, react_1.useRef)(null);
157
132
  const style = (0, react_1.useMemo)(() => {
158
133
  return containerStyle({
159
134
  checkerboard,
@@ -178,6 +153,21 @@ const PortalContainer = ({ scale, xCorrection, yCorrection, contentDimensions })
178
153
  current === null || current === void 0 ? void 0 : current.removeChild(remotion_1.Internals.portalNode());
179
154
  };
180
155
  }, []);
181
- const portalContainer = (0, react_1.useRef)(null);
156
+ const onPointerDown = (0, react_1.useCallback)((event) => {
157
+ if (!(0, should_clear_selection_on_pointer_down_1.shouldClearSelectionOnPointerDown)(event)) {
158
+ return;
159
+ }
160
+ clearSelection();
161
+ }, [clearSelection]);
162
+ (0, react_1.useEffect)(() => {
163
+ const { current } = portalContainer;
164
+ if (!current) {
165
+ return;
166
+ }
167
+ current.addEventListener('pointerdown', onPointerDown);
168
+ return () => {
169
+ current.removeEventListener('pointerdown', onPointerDown);
170
+ };
171
+ }, [onPointerDown]);
182
172
  return jsx_runtime_1.jsx("div", { ref: portalContainer, style: style });
183
173
  };
@@ -16,12 +16,14 @@ const FullscreenToggle_1 = require("./FullscreenToggle");
16
16
  const layout_1 = require("./layout");
17
17
  const LoopToggle_1 = require("./LoopToggle");
18
18
  const MuteToggle_1 = require("./MuteToggle");
19
+ const OutlineToggle_1 = require("./OutlineToggle");
19
20
  const PlaybackKeyboardShortcutsManager_1 = require("./PlaybackKeyboardShortcutsManager");
20
21
  const PlaybackRatePersistor_1 = require("./PlaybackRatePersistor");
21
22
  const PlaybackRateSelector_1 = require("./PlaybackRateSelector");
22
23
  const PlayPause_1 = require("./PlayPause");
23
24
  const RenderButton_1 = require("./RenderButton");
24
25
  const SizeSelector_1 = require("./SizeSelector");
26
+ const TimelineSelection_1 = require("./Timeline/TimelineSelection");
25
27
  const TimelineZoomControls_1 = require("./Timeline/TimelineZoomControls");
26
28
  const TimelineInOutToggle_1 = require("./TimelineInOutToggle");
27
29
  const TOOLBAR_HEIGHT = 50;
@@ -70,6 +72,16 @@ const sideContainer = {
70
72
  const padding = {
71
73
  width: timeline_layout_1.TIMELINE_PADDING,
72
74
  };
75
+ const toolbarControl = {
76
+ display: 'contents',
77
+ };
78
+ const PreviewToolbarControl = ({ children }) => {
79
+ const onPointerDown = (0, react_1.useCallback)((e) => {
80
+ // Prevent deselection of currently selected items
81
+ e.stopPropagation();
82
+ }, []);
83
+ return (jsx_runtime_1.jsx("div", { style: toolbarControl, onPointerDown: onPointerDown, children: children }));
84
+ };
73
85
  const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
74
86
  const { playbackRate, setPlaybackRate } = remotion_1.Internals.usePlaybackRate();
75
87
  const { mediaMuted } = (0, react_1.useContext)(remotion_1.Internals.MediaVolumeContext);
@@ -136,12 +148,13 @@ const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
136
148
  return (jsx_runtime_1.jsxs("div", { ref: previewToolbarRef, style: isMobileLayout ? mobileContainer : container, className: "css-reset", children: [
137
149
  jsx_runtime_1.jsx("div", { ref: leftScrollIndicatorRef, style: scrollIndicatorLeft }), isMobileLayout ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
138
150
  jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
139
- jsx_runtime_1.jsx("div", { style: padding }), jsx_runtime_1.jsx(TimelineZoomControls_1.TimelineZoomControls, {})
140
- ] }), jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate })) : null] })), isVideoComposition ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
141
- jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate, muted: mediaMuted }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }), jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
142
- ] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? jsx_runtime_1.jsx(CheckboardToggle_1.CheckboardToggle, {}) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), canvasContent && isFullscreenSupported ? jsx_runtime_1.jsx(FullscreenToggle_1.FullScreenToggle, {}) : null, jsx_runtime_1.jsx(layout_1.Flex, {}), isMobileLayout && (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
143
- jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate })) : null] })), jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
144
- jsx_runtime_1.jsx(layout_1.Flex, {}), !isMobileLayout && jsx_runtime_1.jsx(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(RenderButton_1.RenderButton, { readOnlyStudio: readOnlyStudio }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
151
+ jsx_runtime_1.jsx("div", { style: padding }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineZoomControls_1.TimelineZoomControls, {}) })
152
+ ] }), jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) }), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })) : null] })), isVideoComposition ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
153
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate, muted: mediaMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }) }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
154
+ ] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
155
+ jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(CheckboardToggle_1.CheckboardToggle, {}) }), TimelineSelection_1.ENABLE_OUTLINES ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(OutlineToggle_1.OutlineToggle, {}) })) : null] })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), canvasContent && isFullscreenSupported ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(FullscreenToggle_1.FullScreenToggle, {}) })) : null, jsx_runtime_1.jsx(layout_1.Flex, {}), isMobileLayout && (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
156
+ jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) }), isStill || isVideoComposition ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })) : null] })), jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
157
+ jsx_runtime_1.jsx(layout_1.Flex, {}), !isMobileLayout && jsx_runtime_1.jsx(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(RenderButton_1.RenderButton, { readOnlyStudio: readOnlyStudio }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
145
158
  ] }), jsx_runtime_1.jsx(PlaybackKeyboardShortcutsManager_1.PlaybackKeyboardShortcutsManager, { setPlaybackRate: setPlaybackRate }), jsx_runtime_1.jsx(PlaybackRatePersistor_1.PlaybackRatePersistor, {}), jsx_runtime_1.jsx("div", { ref: rightScrollIndicatorRef, style: scrollIndicatorRight })
146
159
  ] }));
147
160
  };
@@ -102,7 +102,9 @@ const RenderButton = ({ readOnlyStudio, }) => {
102
102
  shouldApplyCssTransforms: true,
103
103
  });
104
104
  const refresh = size === null || size === void 0 ? void 0 : size.refresh;
105
- const onPointerDown = (0, react_1.useCallback)(() => {
105
+ const onPointerDown = (0, react_1.useCallback)((e) => {
106
+ // Prevent deselection of currently selected items
107
+ e.stopPropagation();
106
108
  setDropdownOpened((o) => {
107
109
  if (!o) {
108
110
  refresh === null || refresh === void 0 ? void 0 : refresh();
@@ -110,6 +112,10 @@ const RenderButton = ({ readOnlyStudio, }) => {
110
112
  return !o;
111
113
  });
112
114
  }, [refresh]);
115
+ const onMenuPointerDown = (0, react_1.useCallback)((e) => {
116
+ // Prevent deselection of currently selected items
117
+ e.stopPropagation();
118
+ }, []);
113
119
  const onClickDropdown = (0, react_1.useCallback)((e) => {
114
120
  e.stopPropagation();
115
121
  const isKeyboardInitiated = e.detail === 0;
@@ -420,7 +426,7 @@ const RenderButton = ({ readOnlyStudio, }) => {
420
426
  ] }) }), shouldShowDropdown ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
421
427
  jsx_runtime_1.jsx("div", { style: dividerStyle }), jsx_runtime_1.jsx("button", { ref: dropdownRef, type: "button", style: dropdownTriggerStyle, disabled: !readOnlyStudio && connectionStatus !== 'connected', className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: onPointerDown, onClick: onClickDropdown, children: jsx_runtime_1.jsx(caret_1.CaretDown, {}) })
422
428
  ] })) : null] }), portalStyle
423
- ? 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: onHideDropdown, onEscape: onHideDropdown, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: () => { }, onPreviousMenu: () => { }, values: dropdownValues, onHide: onHideDropdown, leaveLeftSpace: false, preselectIndex: dropdownValues.findIndex((v) => v.id === renderType), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
429
+ ? 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: onHideDropdown, onEscape: onHideDropdown, children: jsx_runtime_1.jsx("div", { style: portalStyle, onPointerDown: onMenuPointerDown, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: () => { }, onPreviousMenu: () => { }, values: dropdownValues, onHide: onHideDropdown, leaveLeftSpace: false, preselectIndex: dropdownValues.findIndex((v) => v.id === renderType), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
424
430
  : null] }));
425
431
  };
426
432
  exports.RenderButton = RenderButton;
@@ -6,8 +6,8 @@ const react_1 = require("react");
6
6
  const client_id_1 = require("../helpers/client-id");
7
7
  const colors_1 = require("../helpers/colors");
8
8
  const get_asset_metadata_1 = require("../helpers/get-asset-metadata");
9
+ const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
9
10
  const FilePreview_1 = require("./FilePreview");
10
- const Preview_1 = require("./Preview");
11
11
  const msgStyle = {
12
12
  fontSize: 13,
13
13
  color: 'white',
@@ -20,7 +20,7 @@ const errMsgStyle = {
20
20
  color: colors_1.LIGHT_TEXT,
21
21
  };
22
22
  const RenderPreview = ({ path, assetMetadata, getBlob }) => {
23
- const fileType = (0, Preview_1.getPreviewFileType)(path);
23
+ const fileType = (0, get_preview_file_type_1.getPreviewFileType)(path);
24
24
  const connectionStatus = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx)
25
25
  .previewServerState.type;
26
26
  const [blobUrl, setBlobUrl] = (0, react_1.useState)(null);
@@ -1,45 +1,146 @@
1
1
  import React from 'react';
2
- import type { CanUpdateSequencePropStatusTrue, SequencePropsSubscriptionKey, SequenceSchema } from 'remotion';
3
- import { type TimelineSelection } from './Timeline/TimelineSelection';
2
+ import type { CanUpdateSequencePropStatusKeyframed, CanUpdateSequencePropStatusStatic, GetDragOverrides, OverrideIdToNodePaths, SequenceFieldSchema, SequencePropsSubscriptionKey, SequenceSchema, TSequence } from 'remotion';
3
+ import type { SequenceNodePathInfo } from '../helpers/get-timeline-sequence-sort-key';
4
+ import { type SaveSequencePropChange } from './Timeline/save-sequence-prop';
5
+ import { type TimelineSelection, type TimelineSelectionInteraction } from './Timeline/TimelineSelection';
4
6
  type OutlinePoint = {
5
7
  readonly x: number;
6
8
  readonly y: number;
7
9
  };
8
10
  type UvCoordinate = readonly [number, number];
11
+ type UvCoordinateFieldSchema = Extract<SequenceFieldSchema, {
12
+ type: 'uv-coordinate';
13
+ }>;
14
+ type SelectedOutlineUvHandle = {
15
+ readonly clientId: string;
16
+ readonly codeValue: CanUpdateSequencePropStatusStatic;
17
+ readonly effectIndex: number;
18
+ readonly fieldDefault: UvCoordinate | undefined;
19
+ readonly fieldKey: string;
20
+ readonly fieldSchema: UvCoordinateFieldSchema;
21
+ readonly nodePath: SequencePropsSubscriptionKey;
22
+ readonly schema: SequenceSchema;
23
+ readonly value: UvCoordinate;
24
+ };
25
+ type UvConnectionHandle = Pick<SelectedOutlineUvHandle, 'effectIndex' | 'fieldKey' | 'fieldSchema' | 'value'>;
26
+ type UvHandleConnectionLine = {
27
+ readonly key: string;
28
+ readonly from: OutlinePoint;
29
+ readonly to: OutlinePoint;
30
+ };
9
31
  type SelectedOutlineDragTarget = {
10
- readonly codeValue: CanUpdateSequencePropStatusTrue;
32
+ readonly codeValue: CanUpdateSequencePropStatusStatic | CanUpdateSequencePropStatusKeyframed;
11
33
  readonly clientId: string;
12
34
  readonly fieldDefault: string | undefined;
35
+ readonly keyframeDisplayOffset: number;
36
+ readonly nodePath: SequencePropsSubscriptionKey;
37
+ readonly schema: SequenceSchema;
38
+ };
39
+ type ScaleFieldSchema = Extract<SequenceFieldSchema, {
40
+ type: 'scale';
41
+ }>;
42
+ type SelectedOutlineScaleDragTarget = {
43
+ readonly codeValue: CanUpdateSequencePropStatusStatic;
44
+ readonly clientId: string;
45
+ readonly fieldDefault: number | string | undefined;
46
+ readonly fieldSchema: ScaleFieldSchema;
47
+ readonly linked: boolean;
13
48
  readonly nodePath: SequencePropsSubscriptionKey;
14
49
  readonly schema: SequenceSchema;
15
50
  };
16
51
  export type SelectedOutlineDragState = {
17
52
  readonly defaultValue: string | null;
18
53
  readonly key: string;
54
+ readonly sourceFrame: number;
19
55
  readonly startX: number;
20
56
  readonly startY: number;
21
57
  readonly target: SelectedOutlineDragTarget;
22
58
  };
59
+ export type SelectedOutlineScaleDragState = {
60
+ readonly defaultValue: string | null;
61
+ readonly key: string;
62
+ readonly startX: number;
63
+ readonly startY: number;
64
+ readonly startZ: number;
65
+ readonly target: SelectedOutlineScaleDragTarget;
66
+ };
67
+ type SequenceWithSelectedOutline = {
68
+ readonly depth: number;
69
+ readonly keyframeDisplayOffset: number;
70
+ readonly key: string;
71
+ readonly nodePathInfo: SequenceNodePathInfo;
72
+ readonly sequence: TSequence;
73
+ };
23
74
  export declare const getUvHandlePosition: (points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint], uv: UvCoordinate) => OutlinePoint;
75
+ export declare const getUvHandleConnectionLines: ({ handles, points, }: {
76
+ readonly handles: readonly UvConnectionHandle[];
77
+ readonly points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint];
78
+ }) => UvHandleConnectionLine[];
24
79
  export declare const getUvCoordinateForPoint: (points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint], point: OutlinePoint) => UvCoordinate;
80
+ export declare const getOutlineSelectionInteraction: ({ shiftKey, metaKey, ctrlKey, }: {
81
+ readonly shiftKey: boolean;
82
+ readonly metaKey: boolean;
83
+ readonly ctrlKey: boolean;
84
+ }) => TimelineSelectionInteraction;
25
85
  type SelectedEffectFields = {
26
86
  allFields: boolean;
27
87
  fieldKeys: Set<string>;
28
88
  };
29
89
  export declare const getSelectedEffectFieldsBySequenceKey: (selectedItems: readonly TimelineSelection[]) => Map<string, Map<number, SelectedEffectFields>>;
90
+ export declare const getSequencesWithSelectableOutlines: ({ sequences, overrideIdsToNodePaths, }: {
91
+ readonly sequences: readonly TSequence[];
92
+ readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
93
+ }) => SequenceWithSelectedOutline[];
30
94
  export declare const getSelectedOutlineDragValues: ({ dragStates, deltaX, deltaY, }: {
31
95
  readonly dragStates: readonly SelectedOutlineDragState[];
32
96
  readonly deltaX: number;
33
97
  readonly deltaY: number;
34
98
  }) => Map<string, string>;
99
+ export type SelectedOutlineStaticDragChange = SaveSequencePropChange & {
100
+ readonly type: 'static';
101
+ };
102
+ export type SelectedOutlineKeyframedDragChange = {
103
+ readonly type: 'keyframed';
104
+ readonly fileName: string;
105
+ readonly nodePath: SequencePropsSubscriptionKey;
106
+ readonly fieldKey: string;
107
+ readonly sourceFrame: number;
108
+ readonly value: unknown;
109
+ readonly schema: SequenceSchema;
110
+ readonly clientId: string;
111
+ };
112
+ export type SelectedOutlineDragChange = SelectedOutlineStaticDragChange | SelectedOutlineKeyframedDragChange;
35
113
  export declare const getSelectedOutlineDragChanges: ({ dragStates, lastValues, }: {
36
114
  readonly dragStates: readonly SelectedOutlineDragState[];
37
115
  readonly lastValues: ReadonlyMap<string, string>;
116
+ }) => SelectedOutlineDragChange[];
117
+ export type SelectedOutlineScaleEdge = 'top' | 'right' | 'bottom' | 'left';
118
+ type SelectedOutlineScaleEdgeInfo = {
119
+ readonly axis: 'x' | 'y';
120
+ readonly cursor: React.CSSProperties['cursor'];
121
+ readonly end: OutlinePoint;
122
+ readonly extent: number;
123
+ readonly normal: OutlinePoint;
124
+ readonly start: OutlinePoint;
125
+ };
126
+ export declare const getSelectedOutlineScaleEdgeInfo: (points: readonly [OutlinePoint, OutlinePoint, OutlinePoint, OutlinePoint], edge: SelectedOutlineScaleEdge) => SelectedOutlineScaleEdgeInfo | null;
127
+ export declare const getSelectedOutlineScaleDragStates: ({ dragTargets, getDragOverrides, }: {
128
+ readonly dragTargets: readonly SelectedOutlineScaleDragTarget[];
129
+ readonly getDragOverrides: GetDragOverrides;
130
+ }) => SelectedOutlineScaleDragState[];
131
+ export declare const getSelectedOutlineScaleDragValues: ({ axis, dragStates, scaleFactor, }: {
132
+ readonly axis: "x" | "y";
133
+ readonly dragStates: readonly SelectedOutlineScaleDragState[];
134
+ readonly scaleFactor: number;
135
+ }) => Map<string, string | number>;
136
+ export declare const getSelectedOutlineScaleDragChanges: ({ dragStates, lastValues, }: {
137
+ readonly dragStates: readonly SelectedOutlineScaleDragState[];
138
+ readonly lastValues: ReadonlyMap<string, string | number>;
38
139
  }) => {
39
140
  fileName: string;
40
141
  nodePath: SequencePropsSubscriptionKey;
41
142
  fieldKey: string;
42
- value: string;
143
+ value: string | number;
43
144
  defaultValue: string | null;
44
145
  schema: SequenceSchema;
45
146
  }[];