@remotion/studio 4.0.517 → 4.0.519

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 (146) hide show
  1. package/dist/components/AppLaunchButton.d.ts +16 -0
  2. package/dist/components/AppLaunchButton.js +90 -0
  3. package/dist/components/AssetSelector.js +64 -22
  4. package/dist/components/AssetSelectorItem.d.ts +14 -1
  5. package/dist/components/AssetSelectorItem.js +219 -70
  6. package/dist/components/Button.js +20 -7
  7. package/dist/components/Canvas.js +109 -78
  8. package/dist/components/CanvasOrLoading.js +7 -7
  9. package/dist/components/CaptionTextEditor.js +32 -8
  10. package/dist/components/CodingAgentButton.d.ts +7 -0
  11. package/dist/components/CodingAgentButton.js +59 -0
  12. package/dist/components/CompositionContextButton.d.ts +1 -0
  13. package/dist/components/CompositionContextButton.js +7 -3
  14. package/dist/components/CompositionSelector.js +16 -11
  15. package/dist/components/CompositionSelectorItem.js +16 -23
  16. package/dist/components/ConfigureLicenseModal.js +4 -48
  17. package/dist/components/CurrentAsset.js +1 -1
  18. package/dist/components/EditorContent.js +6 -3
  19. package/dist/components/ElementInstallConfirmation.d.ts +25 -7
  20. package/dist/components/ElementInstallConfirmation.js +347 -30
  21. package/dist/components/ElementLibraryModal.js +3 -1
  22. package/dist/components/FixComputedValueModal.js +5 -131
  23. package/dist/components/InitialCompositionLoader.js +3 -2
  24. package/dist/components/InlineCaptionInspector.js +13 -2
  25. package/dist/components/InspectorOpenInEditor.js +48 -33
  26. package/dist/components/InspectorPanel/CompositionInspector.js +35 -3
  27. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +22 -14
  28. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +3 -1
  29. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +1 -1
  30. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +10 -5
  31. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  32. package/dist/components/InspectorPanel/common.js +1 -0
  33. package/dist/components/InspectorPanel/styles.js +1 -0
  34. package/dist/components/InspectorSequenceSection.js +8 -3
  35. package/dist/components/InspectorSourceLocation.js +5 -1
  36. package/dist/components/KnownBugs.d.ts +1 -1
  37. package/dist/components/KnownBugs.js +1 -1
  38. package/dist/components/LicenseExplanation.d.ts +2 -0
  39. package/dist/components/LicenseExplanation.js +63 -0
  40. package/dist/components/MenuToolbar.js +7 -1
  41. package/dist/components/Modals.js +50 -2
  42. package/dist/components/NewComposition/InputDragger.js +29 -2
  43. package/dist/components/NewComposition/NewCompDuration.js +1 -1
  44. package/dist/components/NewComposition/NewComposition.d.ts +23 -0
  45. package/dist/components/NewComposition/NewComposition.js +217 -80
  46. package/dist/components/{UpdateModal/OpenIssueButton.js → OpenIssueButton.js} +1 -1
  47. package/dist/components/PlaybackRateSelector.js +2 -5
  48. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.d.ts +2 -0
  49. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +28 -7
  50. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +21 -13
  51. package/dist/components/RenderQueue/actions.d.ts +1 -0
  52. package/dist/components/RenderQueue/actions.js +5 -1
  53. package/dist/components/SelectedOutlineCanvasRotation.js +27 -1
  54. package/dist/components/SelectedOutlineElement.js +2 -1
  55. package/dist/components/SelectedOutlineOverlay.js +9 -10
  56. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  57. package/dist/components/SelectedOutlinePolygon.js +12 -4
  58. package/dist/components/SelectedOutlineRenderer.d.ts +1 -1
  59. package/dist/components/SelectedOutlineRenderer.js +33 -35
  60. package/dist/components/SettingsContext.js +2 -1
  61. package/dist/components/SettingsModal.d.ts +1 -1
  62. package/dist/components/SettingsModal.js +19 -3
  63. package/dist/components/SidebarRenderButton.d.ts +1 -0
  64. package/dist/components/SidebarRenderButton.js +15 -5
  65. package/dist/components/Timeline/SequencePropsObserver.js +29 -14
  66. package/dist/components/Timeline/TimelineKeyframeControls.js +3 -1
  67. package/dist/components/Timeline/TimelineRowChrome.js +4 -2
  68. package/dist/components/Timeline/TimelineSequence.js +40 -8
  69. package/dist/components/Timeline/TimelineSequenceItem.js +34 -1
  70. package/dist/components/Timeline/TimelineStack/get-stack.d.ts +1 -0
  71. package/dist/components/Timeline/TimelineStack/get-stack.js +35 -3
  72. package/dist/components/Timeline/duplicate-selected-timeline-item.js +23 -25
  73. package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -0
  74. package/dist/components/Timeline/get-sequence-context-menu-items.js +34 -1
  75. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -0
  76. package/dist/components/Timeline/sequence-props-subscription-store.js +22 -1
  77. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -0
  78. package/dist/components/TimelineCombobox.js +1 -0
  79. package/dist/components/UpdateCheck.d.ts +0 -8
  80. package/dist/components/UpdateCheck.js +7 -54
  81. package/dist/components/UpdateStatusContext.d.ts +18 -0
  82. package/dist/components/UpdateStatusContext.js +74 -0
  83. package/dist/components/UpdatesSettings.d.ts +2 -0
  84. package/dist/components/UpdatesSettings.js +251 -0
  85. package/dist/components/WebMcp.d.ts +2 -0
  86. package/dist/components/WebMcp.js +945 -0
  87. package/dist/components/composition-menu-items.js +26 -0
  88. package/dist/components/get-open-in-menu-items.d.ts +4 -0
  89. package/dist/components/get-open-in-menu-items.js +28 -24
  90. package/dist/components/root-composition-menu-items.d.ts +4 -1
  91. package/dist/components/root-composition-menu-items.js +38 -1
  92. package/dist/components/selected-outline-measurement.d.ts +11 -0
  93. package/dist/components/selected-outline-measurement.js +13 -5
  94. package/dist/components/use-configure-default-apps.d.ts +1 -0
  95. package/dist/components/use-configure-default-apps.js +24 -0
  96. package/dist/error-overlay/remotion-overlay/CodeFrame.js +5 -6
  97. package/dist/error-overlay/remotion-overlay/CopyStackTrace.js +1 -1
  98. package/dist/error-overlay/remotion-overlay/ErrorDisplay.js +47 -18
  99. package/dist/error-overlay/remotion-overlay/ErrorLoader.js +1 -1
  100. package/dist/error-overlay/remotion-overlay/ErrorTitle.js +5 -4
  101. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +48 -76
  102. package/dist/error-overlay/remotion-overlay/SearchGitHubIssues.js +1 -1
  103. package/dist/error-overlay/remotion-overlay/ShortcutHint.js +2 -2
  104. package/dist/error-overlay/remotion-overlay/StackFrame.js +13 -8
  105. package/dist/error-overlay/remotion-overlay/Symbolicating.js +1 -1
  106. package/dist/esm/{chunk-gzqm3g2m.js → chunk-1fkq5bfq.js} +24093 -21093
  107. package/dist/esm/chunk-6jf1natv.js +25 -0
  108. package/dist/esm/{chunk-4bxz1d3g.js → chunk-je0h1bgt.js} +1 -28
  109. package/dist/esm/chunk-m0jqdbkr.js +14571 -0
  110. package/dist/esm/index.mjs +0 -2
  111. package/dist/esm/internals.mjs +43231 -25675
  112. package/dist/esm/previewEntry.mjs +46334 -28776
  113. package/dist/esm/renderEntry.mjs +6 -3
  114. package/dist/helpers/can-show-updates.d.ts +5 -0
  115. package/dist/helpers/can-show-updates.js +7 -0
  116. package/dist/helpers/colors.d.ts +0 -3
  117. package/dist/helpers/colors.js +2 -5
  118. package/dist/helpers/create-folder-tree.d.ts +5 -0
  119. package/dist/helpers/create-folder-tree.js +40 -2
  120. package/dist/helpers/format-file-location.d.ts +8 -0
  121. package/dist/helpers/format-file-location.js +14 -3
  122. package/dist/helpers/get-asset-metadata.js +1 -1
  123. package/dist/helpers/get-git-menu-item.d.ts +5 -0
  124. package/dist/helpers/get-git-menu-item.js +15 -1
  125. package/dist/helpers/get-timeline-max-zoom.d.ts +8 -0
  126. package/dist/helpers/get-timeline-max-zoom.js +17 -6
  127. package/dist/helpers/hoverable.d.ts +1 -0
  128. package/dist/helpers/hoverable.js +14 -6
  129. package/dist/helpers/open-in-editor.js +51 -1
  130. package/dist/helpers/preview-server-events.js +3 -0
  131. package/dist/helpers/timeline-layout.d.ts +0 -1
  132. package/dist/helpers/timeline-layout.js +1 -5
  133. package/dist/helpers/url-state.d.ts +1 -0
  134. package/dist/helpers/url-state.js +12 -5
  135. package/dist/icons/enter.d.ts +4 -0
  136. package/dist/icons/enter.js +10 -0
  137. package/dist/renderEntry.js +2 -0
  138. package/dist/state/folders.d.ts +3 -0
  139. package/dist/state/folders.js +40 -1
  140. package/dist/state/modals.d.ts +1 -6
  141. package/dist/state/playbackrate.d.ts +1 -0
  142. package/dist/state/playbackrate.js +4 -1
  143. package/package.json +17 -14
  144. package/dist/components/UpdateModal/UpdateModal.d.ts +0 -6
  145. package/dist/components/UpdateModal/UpdateModal.js +0 -104
  146. /package/dist/components/{UpdateModal/OpenIssueButton.d.ts → OpenIssueButton.d.ts} +0 -0
@@ -5,6 +5,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const ShortcutHint_1 = require("../error-overlay/remotion-overlay/ShortcutHint");
7
7
  const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
8
+ const can_show_updates_1 = require("../helpers/can-show-updates");
8
9
  const client_id_1 = require("../helpers/client-id");
9
10
  const colors_1 = require("../helpers/colors");
10
11
  const mobile_layout_1 = require("../helpers/mobile-layout");
@@ -48,6 +49,11 @@ const MenuToolbar = ({ readOnlyStudio }) => {
48
49
  const canUndoAndRedo = !readOnlyStudio ||
49
50
  (previewServerState.type === 'connected' &&
50
51
  browserStudioOperations !== null);
52
+ const showUpdates = (0, can_show_updates_1.canShowUpdates)({
53
+ connectionStatus: previewServerState.type,
54
+ isBrowserStudio: browserStudioOperations !== null,
55
+ readOnlyStudio,
56
+ });
51
57
  const mobileLayout = (0, mobile_layout_1.useMobileLayout)();
52
58
  const fixedWidthRight = (0, react_1.useMemo)(() => {
53
59
  return {
@@ -132,7 +138,7 @@ const MenuToolbar = ({ readOnlyStudio }) => {
132
138
  return (jsx_runtime_1.jsxs(layout_1.Row, { align: "center", className: "css-reset", style: row, onPointerDown: onPointerDown, children: [
133
139
  jsx_runtime_1.jsxs("div", { style: fixedWidthLeft, children: [mobileLayout ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: openQuickSwitcher, renderAction: renderSearchIcon, title: searchTooltip })) : (jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "left" })), jsx_runtime_1.jsx("div", { style: menuItems, children: structure.map((s) => {
134
140
  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));
135
- }) }), readOnlyStudio || browserStudioOperations ? null : jsx_runtime_1.jsx(UpdateCheck_1.UpdateCheck, {})] }), mobileLayout ? null : jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsx(MenuBuildIndicator_1.MenuBuildIndicator, { mobileLayout: mobileLayout }), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsxs("div", { style: fixedWidthRight, children: [canUndoAndRedo ? jsx_runtime_1.jsx(UndoRedoButtons_1.UndoRedoButtons, {}) : null, jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "right" })
141
+ }) }), showUpdates ? jsx_runtime_1.jsx(UpdateCheck_1.UpdateCheck, {}) : null] }), mobileLayout ? null : jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsx(MenuBuildIndicator_1.MenuBuildIndicator, { mobileLayout: mobileLayout }), jsx_runtime_1.jsx("div", { style: flex }), jsx_runtime_1.jsxs("div", { style: fixedWidthRight, children: [canUndoAndRedo ? jsx_runtime_1.jsx(UndoRedoButtons_1.UndoRedoButtons, {}) : null, jsx_runtime_1.jsx(SidebarCollapserControls_1.SidebarCollapserControl, { side: "right" })
136
142
  ] })
137
143
  ] }));
138
144
  };
@@ -11,8 +11,10 @@ const client_id_1 = require("../helpers/client-id");
11
11
  const studio_runtime_config_1 = require("../helpers/studio-runtime-config");
12
12
  const modals_1 = require("../state/modals");
13
13
  const AskAiModal_1 = require("./AskAiModal");
14
+ const call_api_1 = require("./call-api");
14
15
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
15
16
  const EffectPickerModal_1 = require("./EffectPickerModal");
17
+ const ElementInstallConfirmation_1 = require("./ElementInstallConfirmation");
16
18
  const ElementLibraryModal_1 = require("./ElementLibraryModal");
17
19
  const FixComputedValueModal_1 = require("./FixComputedValueModal");
18
20
  const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
@@ -23,6 +25,7 @@ const NewFolder_1 = require("./NewComposition/NewFolder");
23
25
  const RenameComposition_1 = require("./NewComposition/RenameComposition");
24
26
  const RenameFolder_1 = require("./NewComposition/RenameFolder");
25
27
  const RenameStaticFile_1 = require("./NewComposition/RenameStaticFile");
28
+ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
26
29
  const OverrideInputProps_1 = require("./OverrideInputProps");
27
30
  const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher"));
28
31
  const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
@@ -30,7 +33,6 @@ const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
30
33
  const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
31
34
  const SettingsModal_1 = require("./SettingsModal");
32
35
  const SvgImportDialog_1 = require("./SvgImportDialog");
33
- const UpdateModal_1 = require("./UpdateModal/UpdateModal");
34
36
  const Modals = ({ readOnlyStudio }) => {
35
37
  var _a;
36
38
  const modalContextType = (0, react_1.useContext)(modals_1.SelectedModalContext);
@@ -38,6 +40,7 @@ const Modals = ({ readOnlyStudio }) => {
38
40
  const { previewServerState, subscribeToEvent } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
39
41
  const canRender = previewServerState.type === 'connected';
40
42
  const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
43
+ const confirm = (0, ConfirmationDialog_1.useConfirmationDialog)();
41
44
  (0, react_1.useEffect)(() => {
42
45
  if (isBrowserStudio) {
43
46
  return;
@@ -53,12 +56,57 @@ const Modals = ({ readOnlyStudio }) => {
53
56
  });
54
57
  });
55
58
  }, [isBrowserStudio, setSelectedModal, subscribeToEvent]);
59
+ (0, react_1.useEffect)(() => {
60
+ if (isBrowserStudio) {
61
+ return;
62
+ }
63
+ return subscribeToEvent('element-library-add-request', (event) => {
64
+ if (event.type !== 'element-library-add-request') {
65
+ return;
66
+ }
67
+ (async () => {
68
+ const confirmed = await confirm({
69
+ title: 'Add Element catalog',
70
+ message: (jsx_runtime_1.jsx(ElementInstallConfirmation_1.ElementLibraryAddConfirmation, { displayName: event.displayName, origin: event.origin, url: event.url })),
71
+ confirmLabel: 'Add catalog',
72
+ cancelLabel: 'Cancel',
73
+ });
74
+ if (!confirmed) {
75
+ return;
76
+ }
77
+ if (previewServerState.type !== 'connected') {
78
+ (0, NotificationCenter_1.showNotification)('Could not add catalog: Studio disconnected', 4000);
79
+ return;
80
+ }
81
+ try {
82
+ const result = await (0, call_api_1.callApi)('/api/update-config', {
83
+ clientId: previewServerState.clientId,
84
+ updates: [
85
+ {
86
+ setter: 'addElementLibrary',
87
+ type: 'set',
88
+ value: event.displayName === null
89
+ ? { url: event.url }
90
+ : { url: event.url, displayName: event.displayName },
91
+ },
92
+ ],
93
+ });
94
+ if (!result.success) {
95
+ (0, NotificationCenter_1.showNotification)(`Could not add catalog: ${result.reason}`, 4000);
96
+ }
97
+ }
98
+ catch (error) {
99
+ (0, NotificationCenter_1.showNotification)(`Could not add catalog: ${error.message}`, 4000);
100
+ }
101
+ })();
102
+ });
103
+ }, [confirm, isBrowserStudio, previewServerState, subscribeToEvent]);
56
104
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack, canvasCapture: modalContextType.canvasCapture })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), 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 === '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 &&
57
105
  modalContextType.type === 'settings' &&
58
106
  (!isBrowserStudio ||
59
107
  modalContextType.initialTab === 'packages' ||
60
108
  modalContextType.initialTab === 'shortcuts') ? (jsx_runtime_1.jsx(SettingsModal_1.SettingsModal, { initialTab: modalContextType.initialTab, initialPublicLicenseKey: modalContextType.initialPublicLicenseKey }, `${modalContextType.initialTab}-${modalContextType.initialPublicLicenseKey}`)) : null, modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
61
109
  modalContextType.type === 'server-render' &&
62
- (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 === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
110
+ (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 === 'fix-computed-value' && (jsx_runtime_1.jsx(FixComputedValueModal_1.FixComputedValueModal, { state: modalContextType })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode, assetSelection: modalContextType.assetSelection, compositionSelection: modalContextType.compositionSelection })), modalContextType && modalContextType.type === 'element-library' && (jsx_runtime_1.jsx(ElementLibraryModal_1.ElementLibraryModal, { name: modalContextType.name, url: modalContextType.url })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
63
111
  };
64
112
  exports.Modals = Modals;
@@ -62,6 +62,26 @@ const compactInputDraggerContainerStyle = {
62
62
  ...exports.inputDraggerContainerStyle,
63
63
  ...compactInputDraggerStyle,
64
64
  };
65
+ let activateInputDraggerOnNextFocus = false;
66
+ const clearInputDraggerActivationRequest = () => {
67
+ // Let the receiving dragger's React onFocus handler consume the request first.
68
+ setTimeout(() => {
69
+ activateInputDraggerOnNextFocus = false;
70
+ }, 0);
71
+ document.removeEventListener('focusin', clearInputDraggerActivationRequest, true);
72
+ };
73
+ const requestInputDraggerActivationOnNextFocus = () => {
74
+ activateInputDraggerOnNextFocus = true;
75
+ document.addEventListener('focusin', clearInputDraggerActivationRequest, true);
76
+ };
77
+ const consumeInputDraggerActivationRequest = () => {
78
+ if (!activateInputDraggerOnNextFocus) {
79
+ return false;
80
+ }
81
+ activateInputDraggerOnNextFocus = false;
82
+ document.removeEventListener('focusin', clearInputDraggerActivationRequest, true);
83
+ return true;
84
+ };
65
85
  const isInt = (num) => {
66
86
  return num % 1 === 0;
67
87
  };
@@ -328,10 +348,13 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
328
348
  ...formatterStyle,
329
349
  }), [dragging, formatterStyle, small]);
330
350
  const onFocus = (0, react_1.useCallback)(() => {
331
- if (!small || pointerDownRef.current) {
351
+ if (pointerDownRef.current) {
332
352
  return;
333
353
  }
334
- setInputFallback(true);
354
+ const wasActivatedByInputDragger = consumeInputDraggerActivationRequest();
355
+ if (small || wasActivatedByInputDragger) {
356
+ setInputFallback(true);
357
+ }
335
358
  }, [small]);
336
359
  const onClick = (0, react_1.useCallback)((e) => {
337
360
  if (!(0, input_dragger_click_lock_1.getClickLock)()) {
@@ -392,6 +415,10 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
392
415
  }, [_max, _min, onEscape, onValueChangeEnd, validationStep]);
393
416
  const onInputKeyDown = (0, react_1.useCallback)((e) => {
394
417
  var _a;
418
+ if (e.key === 'Tab') {
419
+ requestInputDraggerActivationOnNextFocus();
420
+ return;
421
+ }
395
422
  if (e.key === 'Enter') {
396
423
  (_a = fallbackRef.current) === null || _a === void 0 ? void 0 : _a.blur();
397
424
  return;
@@ -19,7 +19,7 @@ const NewCompDuration = ({ durationInFrames, setDurationInFrames }) => {
19
19
  const compDurationErrMessage = (0, validate_new_comp_data_1.validateCompositionDuration)(durationInFrames);
20
20
  return (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
21
21
  jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Duration in frames" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
22
- jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: durationInFrames, onTextChange: onDurationInFramesChanged, placeholder: "Duration (frames)", name: "durationInFrames", min: 1, step: 1, required: true, status: "ok",
22
+ jsx_runtime_1.jsx(InputDragger_1.InputDragger, { "aria-label": "Duration in frames", type: "number", value: durationInFrames, onTextChange: onDurationInFramesChanged, placeholder: "Duration (frames)", name: "durationInFrames", min: 1, step: 1, required: true, status: "ok",
23
23
  // Hitting Promise.all() limit in Chrome
24
24
  max: 300000, onValueChange: onDurationChangedDirectly, rightAlign: false }), compDurationErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
25
25
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: compDurationErrMessage, type: "error" })
@@ -1,5 +1,28 @@
1
+ import type { Dispatch, RefObject, SetStateAction } from 'react';
1
2
  import React from 'react';
2
3
  import type { CanvasCaptureImport } from '../../state/modals';
4
+ export type NewCompositionFormValues = {
5
+ readonly durationInFrames: number;
6
+ readonly folder: {
7
+ readonly folderName: string | null;
8
+ readonly parentName: string | null;
9
+ readonly stack: string | null;
10
+ };
11
+ readonly fps: number;
12
+ readonly id: string;
13
+ readonly size: {
14
+ readonly height: number;
15
+ readonly width: number;
16
+ };
17
+ };
18
+ export declare const NewCompositionFields: React.FC<{
19
+ readonly heightValidationMessage: string | null;
20
+ readonly inputRef: RefObject<HTMLInputElement | null>;
21
+ readonly nameValidationMessage: string | null;
22
+ readonly setValues: Dispatch<SetStateAction<NewCompositionFormValues>>;
23
+ readonly values: NewCompositionFormValues;
24
+ readonly widthValidationMessage: string | null;
25
+ }>;
3
26
  export declare const NewComposition: React.FC<{
4
27
  readonly folderName: string | null;
5
28
  readonly parentName: string | null;
@@ -1,18 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NewComposition = void 0;
3
+ exports.NewComposition = exports.NewCompositionFields = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const get_static_files_1 = require("../../api/get-static-files");
8
8
  const write_static_file_1 = require("../../api/write-static-file");
9
+ const colors_1 = require("../../helpers/colors");
10
+ const get_folder_id_1 = require("../../helpers/get-folder-id");
9
11
  const install_required_package_1 = require("../../helpers/install-required-package");
12
+ const sort_by_nonce_history_1 = require("../../helpers/sort-by-nonce-history");
10
13
  const use_create_composition_1 = require("../../helpers/use-create-composition");
14
+ const Checkmark_1 = require("../../icons/Checkmark");
15
+ const folder_1 = require("../../icons/folder");
16
+ const folders_1 = require("../../state/folders");
11
17
  const layout_1 = require("../layout");
12
18
  const ModalFooter_1 = require("../ModalFooter");
13
19
  const ModalHeader_1 = require("../ModalHeader");
14
20
  const layout_2 = require("../RenderModal/layout");
15
21
  const CodemodFooter_1 = require("./CodemodFooter");
22
+ const ComboBox_1 = require("./ComboBox");
16
23
  const DismissableModal_1 = require("./DismissableModal");
17
24
  const get_new_composition_defaults_1 = require("./get-new-composition-defaults");
18
25
  const InputAndValidationContainer_1 = require("./InputAndValidationContainer");
@@ -27,9 +34,198 @@ const content = {
27
34
  fontSize: 13,
28
35
  minWidth: 500,
29
36
  };
30
- const folderPathStyle = {
31
- fontSize: 14,
37
+ const folderSelectStyle = {
38
+ boxSizing: 'border-box',
39
+ width: 250,
32
40
  };
41
+ const folderIconStyle = {
42
+ flexShrink: 0,
43
+ height: 16,
44
+ width: 16,
45
+ };
46
+ const folderLabelStyle = {
47
+ alignItems: 'center',
48
+ color: 'inherit',
49
+ display: 'flex',
50
+ fontFamily: 'inherit',
51
+ fontSize: 'inherit',
52
+ lineHeight: 'normal',
53
+ minWidth: 0,
54
+ };
55
+ const folderLabelTextStyle = {
56
+ color: 'inherit',
57
+ fontFamily: 'inherit',
58
+ fontSize: 'inherit',
59
+ lineHeight: 'normal',
60
+ overflow: 'hidden',
61
+ textOverflow: 'ellipsis',
62
+ whiteSpace: 'nowrap',
63
+ };
64
+ const FolderDropdownLabel = ({ folderPath, indentation }) => {
65
+ return (jsx_runtime_1.jsxs("div", { style: folderLabelStyle, children: [
66
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: indentation * 1.5 }), folderPath === null ? (jsx_runtime_1.jsx("div", { style: folderIconStyle })) : (jsx_runtime_1.jsx(folder_1.CollapsedFolderIcon, { color: colors_1.LIGHT_TEXT, style: folderIconStyle })), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), jsx_runtime_1.jsx("span", { style: folderLabelTextStyle, children: folderPath !== null && folderPath !== void 0 ? folderPath : 'None' })
67
+ ] }));
68
+ };
69
+ const rootFolderId = 'new-composition-root-folder';
70
+ const folderSelectIdPrefix = 'new-composition-folder-';
71
+ const NewCompositionFields = ({ heightValidationMessage, inputRef, nameValidationMessage, setValues, values, widthValidationMessage, }) => {
72
+ const { folders } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
73
+ const { compositionSortOrder } = (0, react_1.useContext)(folders_1.FolderContext);
74
+ const selectedFolderId = values.folder.folderName
75
+ ? `${folderSelectIdPrefix}${(0, get_folder_id_1.getFolderId)({
76
+ folderName: values.folder.folderName,
77
+ parentName: values.folder.parentName,
78
+ })}`
79
+ : rootFolderId;
80
+ const folderValues = (0, react_1.useMemo)(() => {
81
+ const foldersInTreeOrder = [];
82
+ const sortedFolders = compositionSortOrder === 'alphabetical'
83
+ ? folders
84
+ .slice()
85
+ .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }))
86
+ : (0, sort_by_nonce_history_1.sortItemsByNonceHistory)(folders);
87
+ const appendFolders = (parent) => {
88
+ sortedFolders
89
+ .filter((folder) => folder.parent === parent)
90
+ .forEach((folder) => {
91
+ foldersInTreeOrder.push(folder);
92
+ appendFolders((0, get_folder_id_1.getFolderId)({ folderName: folder.name, parentName: folder.parent }));
93
+ });
94
+ };
95
+ appendFolders(null);
96
+ return [
97
+ {
98
+ id: rootFolderId,
99
+ keyHint: null,
100
+ label: jsx_runtime_1.jsx(FolderDropdownLabel, { folderPath: null, indentation: 0 }),
101
+ leftItem: values.folder.folderName === null ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
102
+ onClick: () => {
103
+ setValues((current) => ({
104
+ ...current,
105
+ folder: {
106
+ folderName: null,
107
+ parentName: null,
108
+ stack: null,
109
+ },
110
+ }));
111
+ },
112
+ quickSwitcherLabel: 'None',
113
+ subMenu: null,
114
+ type: 'item',
115
+ value: rootFolderId,
116
+ },
117
+ ...(folders.length === 0
118
+ ? []
119
+ : [
120
+ {
121
+ id: 'new-composition-root-folder-divider',
122
+ type: 'divider',
123
+ },
124
+ ]),
125
+ ...foldersInTreeOrder.map((folder) => {
126
+ var _a;
127
+ var _b;
128
+ const folderPath = (0, get_folder_id_1.getFolderId)({
129
+ folderName: folder.name,
130
+ parentName: folder.parent,
131
+ });
132
+ const indentation = (_b = (_a = folder.parent) === null || _a === void 0 ? void 0 : _a.split('/').length) !== null && _b !== void 0 ? _b : 0;
133
+ const id = `${folderSelectIdPrefix}${folderPath}`;
134
+ return {
135
+ id,
136
+ keyHint: null,
137
+ label: (jsx_runtime_1.jsx(FolderDropdownLabel, { folderPath: folderPath, indentation: indentation })),
138
+ leftItem: selectedFolderId === id ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
139
+ onClick: () => {
140
+ setValues((current) => ({
141
+ ...current,
142
+ folder: {
143
+ folderName: folder.name,
144
+ parentName: folder.parent,
145
+ stack: folder.stack,
146
+ },
147
+ }));
148
+ },
149
+ quickSwitcherLabel: folderPath,
150
+ subMenu: null,
151
+ type: 'item',
152
+ value: id,
153
+ disabled: folder.stack === null,
154
+ };
155
+ }),
156
+ ];
157
+ }, [
158
+ compositionSortOrder,
159
+ folders,
160
+ selectedFolderId,
161
+ setValues,
162
+ values.folder.folderName,
163
+ ]);
164
+ const onWidthChanged = (0, react_1.useCallback)((newValue) => {
165
+ setValues((current) => ({
166
+ ...current,
167
+ size: { height: current.size.height, width: Number(newValue) },
168
+ }));
169
+ }, [setValues]);
170
+ const onWidthDirectlyChanged = (0, react_1.useCallback)((newWidth) => {
171
+ setValues((current) => ({
172
+ ...current,
173
+ size: { height: current.size.height, width: newWidth },
174
+ }));
175
+ }, [setValues]);
176
+ const onHeightChanged = (0, react_1.useCallback)((newValue) => {
177
+ setValues((current) => ({
178
+ ...current,
179
+ size: { height: Number(newValue), width: current.size.width },
180
+ }));
181
+ }, [setValues]);
182
+ const onHeightDirectlyChanged = (0, react_1.useCallback)((newHeight) => {
183
+ setValues((current) => ({
184
+ ...current,
185
+ size: { height: newHeight, width: current.size.width },
186
+ }));
187
+ }, [setValues]);
188
+ const onNameChange = (0, react_1.useCallback)((event) => {
189
+ setValues((current) => ({ ...current, id: event.target.value }));
190
+ }, [setValues]);
191
+ const onTextFpsChange = (0, react_1.useCallback)((newFps) => {
192
+ setValues((current) => ({ ...current, fps: Number(newFps) }));
193
+ }, [setValues]);
194
+ const onFpsChange = (0, react_1.useCallback)((newFps) => {
195
+ setValues((current) => ({ ...current, fps: newFps }));
196
+ }, [setValues]);
197
+ const setDurationInFrames = (0, react_1.useCallback)((update) => {
198
+ setValues((current) => ({
199
+ ...current,
200
+ durationInFrames: typeof update === 'function'
201
+ ? update(current.durationInFrames)
202
+ : update,
203
+ }));
204
+ }, [setValues]);
205
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
206
+ jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
207
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Folder" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { values: folderValues, selectedId: selectedFolderId, style: folderSelectStyle, title: "Folder" }) })
208
+ ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
209
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "ID" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
210
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, value: values.id, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Composition ID", status: "ok", rightAlign: true }), nameValidationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
211
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: nameValidationMessage, type: "error" })
212
+ ] })) : null] }) })
213
+ ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
214
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Width" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
215
+ jsx_runtime_1.jsx(InputDragger_1.InputDragger, { "aria-label": "Width", type: "number", value: values.size.width, placeholder: "Width", onTextChange: onWidthChanged, name: "width", step: 2, min: 2, required: true, status: "ok", formatter: (width) => `${width}px`, max: 100000000, onValueChange: onWidthDirectlyChanged, rightAlign: false }), widthValidationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
216
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: widthValidationMessage, type: "error" })
217
+ ] })) : null] }) })
218
+ ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
219
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Height" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
220
+ jsx_runtime_1.jsx(InputDragger_1.InputDragger, { "aria-label": "Height", type: "number", value: values.size.height, onTextChange: onHeightChanged, placeholder: "Height", name: "height", step: 2, required: true, formatter: (height) => `${height}px`, min: 2, status: "ok", max: 100000000, onValueChange: onHeightDirectlyChanged, rightAlign: false }), heightValidationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
221
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: heightValidationMessage, type: "error" })
222
+ ] })) : null] }) })
223
+ ] }), jsx_runtime_1.jsx(NewCompDuration_1.NewCompDuration, { durationInFrames: values.durationInFrames, setDurationInFrames: setDurationInFrames }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
224
+ jsx_runtime_1.jsx("div", { style: layout_2.label, children: "FPS" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { "aria-label": "FPS", type: "number", value: values.fps, onTextChange: onTextFpsChange, placeholder: "Frame rate (fps)", name: "fps", min: 1, required: true, status: "ok", max: 240, step: 0.01, onValueChange: onFpsChange, rightAlign: false }) })
225
+ ] })
226
+ ] }));
227
+ };
228
+ exports.NewCompositionFields = NewCompositionFields;
33
229
  const NewCompositionLoaded = ({ canvasCapture, folderName, parentName, stack }) => {
34
230
  var _a;
35
231
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
@@ -39,7 +235,16 @@ const NewCompositionLoaded = ({ canvasCapture, folderName, parentName, stack })
39
235
  ? resolvedComposition.result
40
236
  : null;
41
237
  const initialDimensions = (0, get_new_composition_defaults_1.getNewCompositionDefaults)(initialComposition, (_a = canvasCapture === null || canvasCapture === void 0 ? void 0 : canvasCapture.durationInSeconds) !== null && _a !== void 0 ? _a : null);
42
- const [newId, setName] = (0, react_1.useState)(() => (0, use_create_composition_1.getUniqueCompositionName)(compositions));
238
+ const [values, setValues] = (0, react_1.useState)(() => ({
239
+ durationInFrames: initialDimensions.durationInFrames,
240
+ folder: { folderName, parentName, stack },
241
+ fps: initialDimensions.fps,
242
+ id: (0, use_create_composition_1.getUniqueCompositionName)(compositions),
243
+ size: {
244
+ height: initialDimensions.height,
245
+ width: initialDimensions.width,
246
+ },
247
+ }));
43
248
  const inputRef = (0, react_1.useRef)(null);
44
249
  (0, react_1.useEffect)(() => {
45
250
  const input = inputRef.current;
@@ -47,61 +252,14 @@ const NewCompositionLoaded = ({ canvasCapture, folderName, parentName, stack })
47
252
  return;
48
253
  input.select();
49
254
  }, []);
50
- const [selectedFrameRate, setFrameRate] = (0, react_1.useState)(initialDimensions.fps);
51
- const [size, setSize] = (0, react_1.useState)(() => ({
52
- width: initialDimensions.width,
53
- height: initialDimensions.height,
54
- }));
55
- const [durationInFrames, setDurationInFrames] = (0, react_1.useState)(initialDimensions.durationInFrames);
56
- const onWidthChanged = (0, react_1.useCallback)((newValue) => {
57
- setSize((s) => {
58
- return {
59
- height: s.height,
60
- width: Number(newValue),
61
- };
62
- });
63
- }, []);
64
- const onWidthDirectlyChanged = (0, react_1.useCallback)((newWidth) => {
65
- setSize((s) => {
66
- return {
67
- height: s.height,
68
- width: newWidth,
69
- };
70
- });
71
- }, []);
72
- const onHeightDirectlyChanged = (0, react_1.useCallback)((newHeight) => {
73
- setSize((s) => {
74
- return {
75
- width: s.width,
76
- height: newHeight,
77
- };
78
- });
79
- }, []);
80
- const onHeightChanged = (0, react_1.useCallback)((newValue) => {
81
- setSize((s) => {
82
- return {
83
- width: s.width,
84
- height: Number(newValue),
85
- };
86
- });
87
- }, []);
88
- const onNameChange = (0, react_1.useCallback)((e) => {
89
- setName(e.target.value);
90
- }, []);
91
- const onTextFpsChange = (0, react_1.useCallback)((newFps) => {
92
- setFrameRate(Number(newFps));
93
- }, []);
94
- const onFpsChange = (0, react_1.useCallback)((newFps) => {
95
- setFrameRate(newFps);
96
- }, []);
97
- const { codemod, createComposition, heightValidationMessage: compHeightErrMessage, nameValidationMessage: compNameErrMessage, valid, widthValidationMessage: compWidthErrMessage, } = (0, use_create_composition_1.useCreateComposition)({
255
+ const { codemod, createComposition, heightValidationMessage, nameValidationMessage, valid, widthValidationMessage, } = (0, use_create_composition_1.useCreateComposition)({
98
256
  compositions,
99
- durationInFrames,
100
- folderName,
101
- newId,
102
- parentName,
103
- selectedFrameRate,
104
- size,
257
+ durationInFrames: values.durationInFrames,
258
+ folderName: values.folder.folderName,
259
+ newId: values.id,
260
+ parentName: values.folder.parentName,
261
+ selectedFrameRate: values.fps,
262
+ size: values.size,
105
263
  canvasCapture: canvasCapture === null
106
264
  ? null
107
265
  : {
@@ -134,30 +292,9 @@ const NewCompositionLoaded = ({ canvasCapture, folderName, parentName, stack })
134
292
  const onSubmit = (0, react_1.useCallback)((e) => {
135
293
  e.preventDefault();
136
294
  }, []);
137
- const folderPath = [parentName, folderName].filter(Boolean).join('/');
138
295
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
139
296
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: canvasCapture === null ? 'New composition' : 'Import Canvas Capture' }), jsx_runtime_1.jsxs("form", { onSubmit: onSubmit, children: [
140
- jsx_runtime_1.jsxs("div", { style: content, children: [folderPath ? (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
141
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Folder" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx("span", { style: folderPathStyle, children: folderPath }) })
142
- ] })) : null, jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
143
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "ID" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
144
- jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, value: newId, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Composition ID", status: "ok", rightAlign: true }), compNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
145
- jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: compNameErrMessage, type: "error" })
146
- ] })) : null] }) })
147
- ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
148
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Width" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
149
- jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: size.width, placeholder: "Width", onTextChange: onWidthChanged, name: "width", step: 2, min: 2, required: true, status: "ok", formatter: (w) => `${w}px`, max: 100000000, onValueChange: onWidthDirectlyChanged, rightAlign: false }), compWidthErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
150
- jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: compWidthErrMessage, type: "error" })
151
- ] })) : null] }) })
152
- ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
153
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Height" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
154
- jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: size.height, onTextChange: onHeightChanged, placeholder: "Height", name: "height", step: 2, required: true, formatter: (h) => `${h}px`, min: 2, status: "ok", max: 100000000, onValueChange: onHeightDirectlyChanged, rightAlign: false }), compHeightErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
155
- jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: compHeightErrMessage, type: "error" })
156
- ] })) : null] }) })
157
- ] }), jsx_runtime_1.jsx(NewCompDuration_1.NewCompDuration, { durationInFrames: durationInFrames, setDurationInFrames: setDurationInFrames }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
158
- jsx_runtime_1.jsx("div", { style: layout_2.label, children: "FPS" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { type: "number", value: selectedFrameRate, onTextChange: onTextFpsChange, placeholder: "Frame rate (fps)", name: "fps", min: 1, required: true, status: "ok", max: 240, step: 0.01, onValueChange: onFpsChange, rightAlign: false }) })
159
- ] })
160
- ] }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: null, errorNotification: "Could not create composition", genericSubmitLabel: "Add to root file", submitLabel: ({ relativeRootPath }) => `Add to ${relativeRootPath}`, codemod: codemod, stack: stack, valid: valid, onSuccess: null, applyCodemod: ({ signal, symbolicatedStack }) => createCanvasCaptureComposition({
297
+ jsx_runtime_1.jsx("div", { style: content, children: jsx_runtime_1.jsx(exports.NewCompositionFields, { heightValidationMessage: heightValidationMessage, inputRef: inputRef, nameValidationMessage: nameValidationMessage, setValues: setValues, values: values, widthValidationMessage: widthValidationMessage }) }), jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { children: jsx_runtime_1.jsx(CodemodFooter_1.CodemodFooter, { loadingNotification: null, errorNotification: "Could not create composition", genericSubmitLabel: "Add to root file", submitLabel: ({ relativeRootPath }) => `Add to ${relativeRootPath}`, codemod: codemod, stack: values.folder.stack, valid: valid, onSuccess: null, applyCodemod: ({ signal, symbolicatedStack }) => createCanvasCaptureComposition({
161
298
  signal,
162
299
  symbolicatedStack,
163
300
  }), applyCodemodForPreview: null, fallbackToRootFile: true }) })
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OpenIssueButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const colors_1 = require("../../helpers/colors");
6
+ const colors_1 = require("../helpers/colors");
7
7
  const svgStyle = {
8
8
  width: '11px',
9
9
  height: '11px',
@@ -10,9 +10,6 @@ const Checkmark_1 = require("../icons/Checkmark");
10
10
  const playback_rate_1 = require("../icons/playback-rate");
11
11
  const playbackrate_1 = require("../state/playbackrate");
12
12
  const TimelineCombobox_1 = require("./TimelineCombobox");
13
- const commonPlaybackRates = [
14
- -4, -2, -1, -0.5, -0.25, 0.25, 0.5, 1, 1.5, 2, 4,
15
- ];
16
13
  const getPlaybackRateLabel = (playbackRate) => {
17
14
  return `${playbackRate}x`;
18
15
  };
@@ -23,7 +20,7 @@ const usePlaybackRateMenuItems = ({ playbackRate, setPlaybackRate, }) => {
23
20
  type: 'divider',
24
21
  id: 'divider',
25
22
  };
26
- const values = commonPlaybackRates.map((newPlaybackRate) => {
23
+ const values = playbackrate_1.commonPlaybackRates.map((newPlaybackRate) => {
27
24
  return {
28
25
  id: String(newPlaybackRate),
29
26
  label: getPlaybackRateLabel(newPlaybackRate),
@@ -41,7 +38,7 @@ const usePlaybackRateMenuItems = ({ playbackRate, setPlaybackRate, }) => {
41
38
  quickSwitcherLabel: null,
42
39
  };
43
40
  });
44
- const middle = Math.floor(commonPlaybackRates.length / 2);
41
+ const middle = Math.floor(playbackrate_1.commonPlaybackRates.length / 2);
45
42
  return [...values.slice(0, middle), divider, ...values.slice(middle)];
46
43
  }, [playbackRate, setPlaybackRate]);
47
44
  return {
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
+ import type { ComboboxValue } from '../NewComposition/ComboBox';
2
3
  import type { QuickSwitcherMode } from './NoResults';
3
4
  export declare const ExplorerQuickSwitcherTrigger: React.FC<{
4
5
  readonly mode: QuickSwitcherMode;
5
6
  readonly showShortcut: boolean;
6
7
  readonly tabIndex: number;
8
+ readonly getActions: () => ComboboxValue[];
7
9
  }>;