@remotion/studio 4.0.505 → 4.0.506

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 (115) hide show
  1. package/dist/api/install-package.d.ts +2 -3
  2. package/dist/api/install-package.js +1 -3
  3. package/dist/api/visual-control.d.ts +3 -0
  4. package/dist/api/visual-control.js +3 -0
  5. package/dist/components/AssetSelectorItem.js +1 -1
  6. package/dist/components/Canvas.js +2 -0
  7. package/dist/components/CompositionSelector.js +1 -1
  8. package/dist/components/CompositionSelectorItem.js +1 -1
  9. package/dist/components/ConfigureDefaultEditorModal.d.ts +3 -1
  10. package/dist/components/ConfigureDefaultEditorModal.js +90 -32
  11. package/dist/components/ConfigureLicenseModal.d.ts +2 -1
  12. package/dist/components/ConfigureLicenseModal.js +40 -32
  13. package/dist/components/ConfirmationDialog.js +2 -2
  14. package/dist/components/Editor.js +2 -0
  15. package/dist/components/EffectPickerModal.js +1 -1
  16. package/dist/components/GlobalKeybindings.js +3 -2
  17. package/dist/components/InlineCaptionInspector.d.ts +2 -2
  18. package/dist/components/InlineDropdown.d.ts +2 -1
  19. package/dist/components/InlineDropdown.js +10 -4
  20. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  21. package/dist/components/InspectorOpenInEditor.js +33 -9
  22. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  23. package/dist/components/InspectorPanel/CompositionInspector.js +15 -1
  24. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +1 -1
  25. package/dist/components/InspectorPanel/EasingInspector.js +7 -4
  26. package/dist/components/InspectorPanel/KeyframeInspector.js +5 -1
  27. package/dist/components/InspectorPanel/common.d.ts +1 -0
  28. package/dist/components/InspectorPanel/common.js +2 -2
  29. package/dist/components/InspectorPanel/use-composition-actions.js +4 -1
  30. package/dist/components/InspectorSequenceSection.js +4 -4
  31. package/dist/components/InstallPackage.js +1 -1
  32. package/dist/components/MenuBuildIndicator.js +1 -0
  33. package/dist/components/MenuToolbar.js +1 -1
  34. package/dist/components/ModalFooter.d.ts +1 -0
  35. package/dist/components/ModalFooter.js +6 -2
  36. package/dist/components/ModalHeader.js +1 -1
  37. package/dist/components/Modals.js +18 -7
  38. package/dist/components/ModalsProvider.js +5 -6
  39. package/dist/components/NewComposition/CodemodFooter.js +1 -1
  40. package/dist/components/NewComposition/DismissableModal.js +1 -1
  41. package/dist/components/NewComposition/RenameStaticFile.js +1 -1
  42. package/dist/components/OverrideInputProps.js +1 -1
  43. package/dist/components/PlayPause.js +2 -1
  44. package/dist/components/PlaybackKeyboardShortcutsManager.js +7 -5
  45. package/dist/components/PreviewToolbarOverflowButton.js +4 -2
  46. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
  47. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  48. package/dist/components/RenderButton.d.ts +3 -3
  49. package/dist/components/RenderButton.js +42 -7
  50. package/dist/components/RenderModal/RenderStatusModal.js +1 -1
  51. package/dist/components/RenderModal/ServerRenderModal.js +1 -1
  52. package/dist/components/RenderModal/WebRenderModal.js +3 -2
  53. package/dist/components/RenderQueue/RenderQueueError.js +1 -1
  54. package/dist/components/RenderQueue/RenderQueueItemStatus.js +1 -1
  55. package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
  56. package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -1
  57. package/dist/components/SelectedOutlineElement.js +1 -1
  58. package/dist/components/SelectedOutlineOverlay.js +62 -19
  59. package/dist/components/SettingsModal.d.ts +7 -0
  60. package/dist/components/SettingsModal.js +50 -0
  61. package/dist/components/SettingsModalFooter.d.ts +4 -0
  62. package/dist/components/SettingsModalFooter.js +46 -0
  63. package/dist/components/SidebarRenderButton.js +1 -1
  64. package/dist/components/SvgImportDialog.js +2 -2
  65. package/dist/components/TimeValue.js +1 -1
  66. package/dist/components/Timeline/Timeline.js +1 -0
  67. package/dist/components/Timeline/TimelineAssetField.js +1 -1
  68. package/dist/components/Timeline/TimelineDragHandler.js +3 -3
  69. package/dist/components/Timeline/TimelineEffectPropItem.js +5 -3
  70. package/dist/components/Timeline/TimelineExpandedRow.d.ts +4 -2
  71. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  72. package/dist/components/Timeline/TimelineFontFamilyField.js +3 -1
  73. package/dist/components/Timeline/TimelineKeyframeControls.js +1 -0
  74. package/dist/components/Timeline/TimelineSelection.js +1 -0
  75. package/dist/components/Timeline/TimelineSequenceItem.js +28 -34
  76. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +1 -1
  77. package/dist/components/Timeline/reset-selected-timeline-props.js +1 -1
  78. package/dist/components/Timeline/should-subscribe-to-sequence-props.d.ts +1 -1
  79. package/dist/components/Timeline/timeline-asset-link.d.ts +2 -2
  80. package/dist/components/Timeline/timeline-asset-link.js +2 -2
  81. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +4 -0
  82. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  83. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +1 -0
  84. package/dist/components/Timeline/use-timeline-expanded-tree.js +5 -0
  85. package/dist/components/Timeline/use-timeline-height.js +20 -0
  86. package/dist/components/TimelineInOutToggle.js +5 -1
  87. package/dist/components/TopPanel.js +16 -0
  88. package/dist/components/UpdateCheck.js +1 -1
  89. package/dist/components/effect-drag-and-drop.js +1 -1
  90. package/dist/components/handle-drop.d.ts +2 -1
  91. package/dist/components/handle-drop.js +12 -2
  92. package/dist/components/import-assets.d.ts +18 -6
  93. package/dist/components/import-assets.js +76 -32
  94. package/dist/esm/{chunk-7pgk8h5m.js → chunk-b49ec3nz.js} +8334 -7701
  95. package/dist/esm/internals.mjs +8334 -7701
  96. package/dist/esm/previewEntry.mjs +8343 -7710
  97. package/dist/esm/renderEntry.mjs +1 -1
  98. package/dist/helpers/client-id.d.ts +3 -1
  99. package/dist/helpers/client-id.js +21 -4
  100. package/dist/helpers/install-required-package.d.ts +3 -3
  101. package/dist/helpers/install-required-package.js +1 -6
  102. package/dist/helpers/studio-fit-padding.d.ts +1 -1
  103. package/dist/helpers/studio-fit-padding.js +1 -1
  104. package/dist/helpers/timeline-layout.d.ts +2 -1
  105. package/dist/helpers/timeline-layout.js +5 -2
  106. package/dist/helpers/use-menu-structure.js +23 -33
  107. package/dist/helpers/use-runtime-values.d.ts +11 -0
  108. package/dist/helpers/use-runtime-values.js +76 -0
  109. package/dist/icons/apps.d.ts +2 -0
  110. package/dist/icons/apps.js +7 -0
  111. package/dist/icons/browse-elements.d.ts +4 -0
  112. package/dist/icons/browse-elements.js +10 -0
  113. package/dist/state/modals.d.ts +5 -6
  114. package/dist/state/modals.js +5 -3
  115. package/package.json +12 -12
@@ -18,6 +18,7 @@ const clickButton = (id) => {
18
18
  (_a = document.getElementById(id)) === null || _a === void 0 ? void 0 : _a.click();
19
19
  };
20
20
  const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLoop, showCompositionControls, playbackRate, setPlaybackRate, loop, setLoop, }) => {
21
+ const keyboardShortcutsDisabled = (0, use_keybinding_1.areKeyboardShortcutsDisabled)();
21
22
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
22
23
  const { editorShowOutlines, setEditorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
23
24
  const { items: previewSizeItems, selectedId: selectedPreviewSize, zoomable, } = (0, SizeSelector_1.usePreviewSizeMenuItems)();
@@ -88,7 +89,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
88
89
  label: 'Transparency as checkerboard',
89
90
  value: 'checkerboard',
90
91
  onClick: () => setCheckerboard((current) => !current),
91
- keyHint: (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? null : 'T',
92
+ keyHint: keyboardShortcutsDisabled ? null : 'T',
92
93
  leftItem: checkerboard ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
93
94
  subMenu: null,
94
95
  quickSwitcherLabel: null,
@@ -112,7 +113,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
112
113
  label: 'Fullscreen',
113
114
  value: 'fullscreen',
114
115
  onClick: () => clickButton('fullscreen-toggle'),
115
- keyHint: (0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? null : 'F',
116
+ keyHint: keyboardShortcutsDisabled ? null : 'F',
116
117
  leftItem: null,
117
118
  subMenu: null,
118
119
  quickSwitcherLabel: null,
@@ -135,6 +136,7 @@ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLo
135
136
  setEditorShowOutlines,
136
137
  setLoop,
137
138
  zoomable,
139
+ keyboardShortcutsDisabled,
138
140
  ]);
139
141
  if (values.length === 0) {
140
142
  return null;
@@ -30,7 +30,7 @@ const shortcutLabel = {
30
30
  opacity: 0.6,
31
31
  };
32
32
  const ExplorerQuickSwitcherTrigger = ({ mode, showShortcut, tabIndex }) => {
33
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
33
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
34
34
  const openQuickSwitcher = (0, react_1.useCallback)(() => {
35
35
  setSelectedModal({
36
36
  type: 'quick-switcher',
@@ -125,7 +125,7 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
125
125
  const closeMenu = (0, react_1.useCallback)(() => undefined, []);
126
126
  const actions = (0, use_menu_structure_1.useMenuStructure)(closeMenu, readOnlyStudio);
127
127
  const [docResults, setDocResults] = (0, react_1.useState)({ type: 'initial' });
128
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
128
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
129
129
  const keybindings = (0, use_keybinding_1.useKeybinding)();
130
130
  const mode = assetSelection !== null
131
131
  ? 'assets'
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  export type RenderType = 'server-render' | 'client-render' | 'render-command';
3
- export declare const RenderButton: React.FC<{
3
+ export declare const RenderButton: React.NamedExoticComponent<{
4
4
  readonly readOnlyStudio: boolean;
5
- readonly size?: 'default' | 'compact';
6
- readonly narrow?: boolean;
5
+ readonly size?: "compact" | "default" | undefined;
6
+ readonly narrow?: boolean | undefined;
7
7
  }>;
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -6,7 +39,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
39
  exports.RenderButton = void 0;
7
40
  const jsx_runtime_1 = require("react/jsx-runtime");
8
41
  const player_1 = require("@remotion/player");
9
- const react_1 = require("react");
42
+ const react_1 = __importStar(require("react"));
10
43
  const react_dom_1 = __importDefault(require("react-dom"));
11
44
  const remotion_1 = require("remotion");
12
45
  const client_id_1 = require("../helpers/client-id");
@@ -117,9 +150,9 @@ const getInitialRenderType = (readOnlyStudio) => {
117
150
  }
118
151
  return 'server-render';
119
152
  };
120
- const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow = false }) => {
153
+ const RenderButtonInner = ({ readOnlyStudio, size: controlSize = 'default', narrow = false }) => {
121
154
  const { inFrame, outFrame } = (0, in_out_1.useTimelineInOutFramePosition)();
122
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
155
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
123
156
  const [preferredRenderType, setPreferredRenderType] = (0, react_1.useState)(() => getInitialRenderType(readOnlyStudio));
124
157
  const [dropdownOpened, setDropdownOpened] = (0, react_1.useState)(false);
125
158
  const [hovered, setHovered] = (0, react_1.useState)(false);
@@ -193,8 +226,10 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
193
226
  };
194
227
  }, [controlSize]);
195
228
  const video = remotion_1.Internals.useVideo();
196
- const { getCurrentFrame } = player_1.PlayerInternals.usePlayer();
229
+ const { getCurrentFrame } = player_1.PlayerInternals.usePlayerMethods();
197
230
  const { props } = (0, react_1.useContext)(remotion_1.Internals.EditorPropsContext);
231
+ // Read the frame when the modal opens instead of subscribing this button to
232
+ // every timeline position update.
198
233
  const openServerRenderModal = (0, react_1.useCallback)((copyCommandOnly) => {
199
234
  var _a;
200
235
  var _b, _c;
@@ -258,7 +293,7 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
258
293
  initialMediaCacheSizeInBytes: defaults.mediaCacheSizeInBytes,
259
294
  renderDefaults: defaults,
260
295
  });
261
- }, [video, setSelectedModal, getCurrentFrame, props, inFrame, outFrame]);
296
+ }, [video, setSelectedModal, props, inFrame, outFrame, getCurrentFrame]);
262
297
  const openClientRenderModal = (0, react_1.useCallback)(() => {
263
298
  var _a;
264
299
  if (!video) {
@@ -292,7 +327,7 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
292
327
  initialMediaCacheSizeInBytes: defaults.mediaCacheSizeInBytes,
293
328
  initialPageResponsiveness: 'medium',
294
329
  });
295
- }, [video, setSelectedModal, getCurrentFrame, props, inFrame, outFrame]);
330
+ }, [video, setSelectedModal, props, inFrame, outFrame, getCurrentFrame]);
296
331
  const onClick = (0, react_1.useCallback)(() => {
297
332
  if (renderType === 'render-command') {
298
333
  openServerRenderModal(true);
@@ -469,4 +504,4 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow =
469
504
  ? 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))
470
505
  : null] }));
471
506
  };
472
- exports.RenderButton = RenderButton;
507
+ exports.RenderButton = react_1.default.memo(RenderButtonInner);
@@ -41,7 +41,7 @@ const buttonRow = {
41
41
  justifyContent: 'flex-end',
42
42
  };
43
43
  const RenderStatusModal = ({ jobId, }) => {
44
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
44
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
45
45
  const { jobs, removeClientJob, cancelClientJob } = (0, react_1.useContext)(context_1.RenderQueueContext);
46
46
  const job = jobs.find((j) => j.id === jobId);
47
47
  if (!job) {
@@ -67,7 +67,7 @@ const reducer = (state, action) => {
67
67
  return state;
68
68
  };
69
69
  const RenderModal = ({ readOnlyStudio, initialFrame, initialVideoImageFormat, initialStillImageFormat, initialJpegQuality, initialScale, initialLogLevel, initialConcurrency, maxConcurrency, minConcurrency, initialMuted, initialEnforceAudioTrack, initialProResProfile, initialx264Preset, initialGopSize, initialPixelFormat, initialVideoBitrate, initialAudioBitrate, initialEveryNthFrame, initialNumberOfGifLoops, initialDelayRenderTimeout, initialOffthreadVideoCacheSizeInBytes, initialEnvVariables, initialDisableWebSecurity, initialGl, initialHeadless, initialIgnoreCertificateErrors, initialEncodingBufferSize, initialEncodingMaxRate, initialOffthreadVideoThreads, initialMediaCacheSizeInBytes, initialDarkMode, initialUserAgent, defaultProps, inFrameMark, outFrameMark, initialColorSpace, initialMultiProcessOnLinux, defaultConfigurationAudioCodec, defaultConfigurationVideoCodec, initialBeep, initialRepro, initialForSeamlessAacConcatenation, renderTypeOfLastRender, initialHardwareAcceleration, initialSampleRate, defaultMetadata, initialChromeMode, renderDefaults, }) => {
70
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
70
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
71
71
  const context = (0, react_1.useContext)(ResolveCompositionBeforeModal_1.ResolvedCompositionContext);
72
72
  if (!context) {
73
73
  throw new Error('Should not be able to render without resolving comp first');
@@ -82,7 +82,7 @@ const validateOutnameForStill = ({ outName, stillImageFormat, }) => {
82
82
  const WebRenderModal = ({ initialFrame, defaultProps, inFrameMark, outFrameMark, initialLogLevel, initialStillImageFormat, initialDefaultOutName, initialScale, initialDelayRenderTimeout, initialMediaCacheSizeInBytes, initialContainer, initialVideoCodec, initialAudioCodec, initialAudioBitrate, initialVideoBitrate, initialHardwareAcceleration, initialKeyframeIntervalInSeconds, initialTransparent, initialMuted, initialPageResponsiveness, }) => {
83
83
  var _a;
84
84
  const context = (0, react_1.useContext)(ResolveCompositionBeforeModal_1.ResolvedCompositionContext);
85
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
85
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
86
86
  const { setSidebarCollapsedState } = (0, react_1.useContext)(sidebar_1.SidebarContext);
87
87
  const { addClientStillJob, addClientVideoJob } = (0, react_1.useContext)(context_1.RenderQueueContext);
88
88
  if (!context) {
@@ -415,7 +415,8 @@ const WebRenderModal = ({ initialFrame, defaultProps, inFrameMark, outFrameMark,
415
415
  ] })
416
416
  ] }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
417
417
  jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'general', onClick: () => setTab('general'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(file_1.FileIcon, { color: color, style: render_modals_1.icon }) })), children: "General" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'data', onClick: () => setTab('data'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(input_props_1.InputPropsIcon, { color: color, style: render_modals_1.icon }) })), children: "Input Props" }), renderMode !== 'audio' ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'picture', onClick: () => setTab('picture'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(frame_1.PicIcon, { color: color, style: render_modals_1.icon }) })), children: "Picture" })) : null, renderMode === 'video' || renderMode === 'audio' ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'audio', onClick: () => setTab('audio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(audio_1.AudioIcon, { color: color, style: render_modals_1.icon }) })), children: "Audio" })) : null, jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'advanced', onClick: () => setTab('advanced'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(gear_1.GearIcon, { color: color, style: render_modals_1.icon }) })), children: "Other" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: false, onClick: () => setSelectedModal({
418
- type: 'configure-license',
418
+ type: 'settings',
419
+ initialTab: 'license',
419
420
  initialPublicLicenseKey: publicLicenseKey,
420
421
  }), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(certificate_1.CertificateIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })] }), jsx_runtime_1.jsx("div", { style: render_modals_1.optionsPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: tab === 'general' ? (jsx_runtime_1.jsx(WebRenderModalBasic_1.WebRenderModalBasic, { renderMode: renderMode, resolvedComposition: resolvedComposition, imageFormat: imageFormat, setStillFormat: setStillFormat, frame: frame, onFrameChanged: onFrameChanged, onFrameSetDirectly: onFrameSetDirectly, container: container, setContainerFormat: setContainerFormat, setCodec: setCodecWithContainer, encodableVideoCodecs: encodableVideoCodecs, effectiveVideoCodec: effectiveVideoCodec, startFrame: finalStartFrame, setStartFrame: setStartFrame, endFrame: finalEndFrame, setEndFrame: setEndFrame, outName: outName, onOutNameChange: onOutNameChange, validationMessage: outnameValidation.valid ? null : outnameValidation.error.message, logLevel: logLevel, setLogLevel: setLogLevel })) : tab === 'data' ? (jsx_runtime_1.jsx(DataEditor_1.DataEditor, { defaultProps: inputProps, setDefaultProps: setInputProps, unresolvedComposition: unresolvedComposition, propsEditType: "input-props", canSaveDefaultProps: {
421
422
  canUpdate: false,
@@ -10,7 +10,7 @@ const outputLocation = {
10
10
  ...item_style_1.renderQueueItemSubtitleStyle,
11
11
  };
12
12
  const RenderQueueError = ({ job }) => {
13
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
13
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
14
14
  const { tabIndex } = (0, z_index_1.useZIndex)();
15
15
  const onClick = (0, react_1.useCallback)(() => {
16
16
  setSelectedModal({
@@ -52,7 +52,7 @@ const invisibleStyle = {
52
52
  display: 'flex',
53
53
  };
54
54
  const RenderQueueItemStatus = ({ job }) => {
55
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
55
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
56
56
  const [hovered, setHovered] = react_1.default.useState(false);
57
57
  const isClientJob = (0, context_1.isClientRenderJob)(job);
58
58
  const onPointerEnter = (0, react_1.useCallback)(() => {
@@ -15,7 +15,7 @@ const RenderQueueProgressMessage = ({ job }) => {
15
15
  if (job.status !== 'running') {
16
16
  throw new Error('should not have rendered this component');
17
17
  }
18
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
18
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
19
19
  const { tabIndex } = (0, z_index_1.useZIndex)();
20
20
  const isClientJob = (0, context_1.isClientRenderJob)(job);
21
21
  const onClick = (0, react_1.useCallback)(() => {
@@ -9,7 +9,7 @@ const modals_1 = require("../../state/modals");
9
9
  const InlineAction_1 = require("../InlineAction");
10
10
  const context_1 = require("./context");
11
11
  const RenderQueueRepeatItem = ({ job }) => {
12
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
12
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
13
13
  const isClientJob = (0, context_1.isClientRenderJob)(job);
14
14
  const onClick = (0, react_1.useCallback)((e) => {
15
15
  e.stopPropagation();
@@ -956,7 +956,7 @@ const SelectedOutlineElement = ({ allDragTargets, allDragOutlines, allRotationDr
956
956
  const selectAsset = (0, use_select_asset_1.useSelectAsset)();
957
957
  const selectComposition = (0, InitialCompositionLoader_1.useSelectComposition)();
958
958
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
959
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
959
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
960
960
  const resolveOriginalLocation = react_1.default.useCallback(async (resolveTarget) => {
961
961
  const stack = resolveTarget.sequence.getStack();
962
962
  if (!stack) {
@@ -43,6 +43,7 @@ const client_id_1 = require("../helpers/client-id");
43
43
  const interactivity_enabled_1 = require("../helpers/interactivity-enabled");
44
44
  const use_is_fullscreen_1 = require("../helpers/use-is-fullscreen");
45
45
  const use_keybinding_1 = require("../helpers/use-keybinding");
46
+ const use_runtime_values_1 = require("../helpers/use-runtime-values");
46
47
  const editor_guides_1 = require("../state/editor-guides");
47
48
  const editor_outlines_1 = require("../state/editor-outlines");
48
49
  const scale_lock_1 = require("../state/scale-lock");
@@ -99,7 +100,7 @@ Object.defineProperty(exports, "getSequencesWithSelectableOutlines", { enumerabl
99
100
  Object.defineProperty(exports, "getTransformedSvgViewportPoints", { enumerable: true, get: function () { return selected_outline_measurement_2.getTransformedSvgViewportPoints; } });
100
101
  const selected_outline_types_2 = require("./selected-outline-types");
101
102
  Object.defineProperty(exports, "selectedOutlineDragThresholdPx", { enumerable: true, get: function () { return selected_outline_types_2.selectedOutlineDragThresholdPx; } });
102
- const getEffectiveCropValue = ({ activeSchema, controls, dragOverrides, fieldKey, frame, propStatuses, }) => {
103
+ const getEffectiveCropValue = ({ activeSchema, dragOverrides, fieldKey, frame, propStatuses, runtimeValues, }) => {
103
104
  var _a;
104
105
  const fieldSchema = activeSchema === null || activeSchema === void 0 ? void 0 : activeSchema[fieldKey];
105
106
  if ((fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.type) !== 'number') {
@@ -114,7 +115,7 @@ const getEffectiveCropValue = ({ activeSchema, controls, dragOverrides, fieldKey
114
115
  frame,
115
116
  shouldResortToDefaultValueIfUndefined: true,
116
117
  })
117
- : ((_a = controls === null || controls === void 0 ? void 0 : controls.currentRuntimeValueDotNotation[fieldKey]) !== null && _a !== void 0 ? _a : fieldSchema.default);
118
+ : ((_a = runtimeValues[fieldKey]) !== null && _a !== void 0 ? _a : fieldSchema.default);
118
119
  return typeof value === 'number' && Number.isFinite(value) ? value : 0;
119
120
  };
120
121
  const getCropDragFields = ({ activeSchema, cropValues, propStatuses, }) => {
@@ -424,7 +425,7 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
424
425
  const { hoveredSequence, setHoveredSequence } = (0, react_1.useContext)(timeline_sequence_hover_1.TimelineSequenceHoverContext);
425
426
  const { editorShowGuides, guidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
426
427
  const isFullscreen = (0, use_is_fullscreen_1.useIsFullscreen)();
427
- const { frameBack, frameForward, getCurrentFrame, seek } = player_1.PlayerInternals.usePlayer();
428
+ const { frameBack, frameForward, getCurrentFrame, seek } = player_1.PlayerInternals.usePlayerMethods();
428
429
  const keybindings = (0, use_keybinding_1.useKeybinding)();
429
430
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
430
431
  const [outlines, setOutlines] = (0, react_1.useState)([]);
@@ -458,6 +459,44 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
458
459
  const selectOutlineItem = (0, react_1.useCallback)((item, interaction) => {
459
460
  selectItem(item, interaction, undefined, { reveal: true });
460
461
  }, [selectItem]);
462
+ const outlineRuntimeControls = (0, react_1.useMemo)(() => {
463
+ if (isFullscreen ||
464
+ !(0, interactivity_enabled_1.isStudioSelectionEnabled)() ||
465
+ !previewSelectionAvailable ||
466
+ !editorShowOutlines) {
467
+ return [];
468
+ }
469
+ const selectedSequenceKeys = (0, selected_outline_measurement_1.getSelectedSequenceKeys)(selectedItems);
470
+ const sequenceKeysContainingSelection = (0, selected_outline_measurement_1.getSequenceKeysContainingSelection)(selectedItems);
471
+ return (0, selected_outline_measurement_1.getSequencesWithSelectableOutlines)({
472
+ sequences,
473
+ overrideIdsToNodePaths: overrideIdToNodePathMappings,
474
+ compositions,
475
+ timelinePosition,
476
+ }).flatMap(({ key, sequence }) => {
477
+ if (!selectedSequenceKeys.has(key) &&
478
+ !sequenceKeysContainingSelection.has(key) &&
479
+ (hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.key) !== key) {
480
+ return [];
481
+ }
482
+ return sequence.controls ? [sequence.controls] : [];
483
+ });
484
+ }, [
485
+ compositions,
486
+ editorShowOutlines,
487
+ hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.key,
488
+ isFullscreen,
489
+ overrideIdToNodePathMappings,
490
+ previewSelectionAvailable,
491
+ selectedItems,
492
+ sequences,
493
+ timelinePosition,
494
+ ]);
495
+ const outlineRuntimeSnapshots = (0, use_runtime_values_1.useRuntimeValueSnapshots)(outlineRuntimeControls);
496
+ const outlineRuntimeValuesByStore = (0, react_1.useMemo)(() => new Map(outlineRuntimeControls.map((controls, index) => [
497
+ controls.runtimeValues,
498
+ outlineRuntimeSnapshots[index],
499
+ ])), [outlineRuntimeControls, outlineRuntimeSnapshots]);
461
500
  const outlineTargets = (0, react_1.useMemo)(() => {
462
501
  if (isFullscreen ||
463
502
  !(0, interactivity_enabled_1.isStudioSelectionEnabled)() ||
@@ -479,7 +518,7 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
479
518
  compositions,
480
519
  timelinePosition,
481
520
  }).map(({ key, keyframeDisplayOffset, nodePathInfo, sequence }) => {
482
- var _a, _b, _c, _d, _e, _f;
521
+ var _a, _b, _c, _d, _e, _f, _g;
483
522
  if (sequence.refForOutline === null) {
484
523
  throw new Error('Expected sequence to have a ref for outline');
485
524
  }
@@ -490,10 +529,13 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
490
529
  const nodePropStatuses = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath);
491
530
  const sourceFrame = timelinePosition - keyframeDisplayOffset;
492
531
  const dragOverrides = (_a = getDragOverrides(nodePath)) !== null && _a !== void 0 ? _a : {};
532
+ const runtimeValues = controls
533
+ ? ((_b = outlineRuntimeValuesByStore.get(controls.runtimeValues)) !== null && _b !== void 0 ? _b : controls.runtimeValues.getSnapshot())
534
+ : {};
493
535
  const activeSchema = controls
494
536
  ? (0, selected_outline_drag_1.getSelectedOutlineActiveSchema)({
495
537
  schema: controls.schema,
496
- currentRuntimeValueDotNotation: controls.currentRuntimeValueDotNotation,
538
+ currentRuntimeValueDotNotation: runtimeValues,
497
539
  dragOverrides,
498
540
  propStatus: nodePropStatuses,
499
541
  frame: sourceFrame,
@@ -502,35 +544,35 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
502
544
  const cropValues = {
503
545
  cropLeft: getEffectiveCropValue({
504
546
  activeSchema,
505
- controls,
506
547
  dragOverrides,
507
548
  fieldKey: selected_outline_types_1.cropFieldKeys.left,
508
549
  frame: sourceFrame,
509
550
  propStatuses: nodePropStatuses,
551
+ runtimeValues,
510
552
  }),
511
553
  cropRight: getEffectiveCropValue({
512
554
  activeSchema,
513
- controls,
514
555
  dragOverrides,
515
556
  fieldKey: selected_outline_types_1.cropFieldKeys.right,
516
557
  frame: sourceFrame,
517
558
  propStatuses: nodePropStatuses,
559
+ runtimeValues,
518
560
  }),
519
561
  cropTop: getEffectiveCropValue({
520
562
  activeSchema,
521
- controls,
522
563
  dragOverrides,
523
564
  fieldKey: selected_outline_types_1.cropFieldKeys.top,
524
565
  frame: sourceFrame,
525
566
  propStatuses: nodePropStatuses,
567
+ runtimeValues,
526
568
  }),
527
569
  cropBottom: getEffectiveCropValue({
528
570
  activeSchema,
529
- controls,
530
571
  dragOverrides,
531
572
  fieldKey: selected_outline_types_1.cropFieldKeys.bottom,
532
573
  frame: sourceFrame,
533
574
  propStatuses: nodePropStatuses,
575
+ runtimeValues,
534
576
  }),
535
577
  };
536
578
  const crop = remotion_1.Internals.resolveSequenceCrop(cropValues);
@@ -550,13 +592,13 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
550
592
  const transformOriginValueForRotation = (transformOriginFieldSchema === null || transformOriginFieldSchema === void 0 ? void 0 : transformOriginFieldSchema.type) === 'transform-origin' &&
551
593
  ((transformOriginPropStatus === null || transformOriginPropStatus === void 0 ? void 0 : transformOriginPropStatus.status) === 'static' ||
552
594
  (transformOriginPropStatus === null || transformOriginPropStatus === void 0 ? void 0 : transformOriginPropStatus.status) === 'keyframed')
553
- ? String((_b = remotion_1.Internals.getEffectiveVisualModeValue({
595
+ ? String((_c = remotion_1.Internals.getEffectiveVisualModeValue({
554
596
  propStatus: transformOriginPropStatus,
555
597
  dragOverrideValue: dragOverrides[selected_outline_types_1.transformOriginFieldKey],
556
598
  defaultValue: transformOriginFieldSchema.default,
557
599
  frame: sourceFrame,
558
600
  shouldResortToDefaultValueIfUndefined: true,
559
- })) !== null && _b !== void 0 ? _b : transformOriginFieldSchema.default)
601
+ })) !== null && _c !== void 0 ? _c : transformOriginFieldSchema.default)
560
602
  : '50% 50%';
561
603
  const canDragStatus = (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static' ||
562
604
  ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' &&
@@ -696,16 +738,16 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
696
738
  nodePath,
697
739
  originDefault: transformOriginFieldSchema.default,
698
740
  originPropStatus: transformOriginPropStatus,
699
- originValue: String((_c = remotion_1.Internals.getEffectiveVisualModeValue({
741
+ originValue: String((_d = remotion_1.Internals.getEffectiveVisualModeValue({
700
742
  propStatus: transformOriginPropStatus,
701
743
  dragOverrideValue: dragOverrides[selected_outline_types_1.transformOriginFieldKey],
702
744
  defaultValue: transformOriginFieldSchema.default,
703
745
  frame: transformOriginSourceFrame,
704
746
  shouldResortToDefaultValueIfUndefined: true,
705
- })) !== null && _c !== void 0 ? _c : transformOriginFieldSchema.default),
747
+ })) !== null && _d !== void 0 ? _d : transformOriginFieldSchema.default),
706
748
  rotateValue: String((rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'static' ||
707
749
  (rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'keyframed'
708
- ? ((_d = remotion_1.Internals.getEffectiveVisualModeValue({
750
+ ? ((_e = remotion_1.Internals.getEffectiveVisualModeValue({
709
751
  propStatus: rotationPropStatus,
710
752
  dragOverrideValue: dragOverrides[selected_outline_types_1.rotateFieldKey],
711
753
  defaultValue: (rotationFieldSchema === null || rotationFieldSchema === void 0 ? void 0 : rotationFieldSchema.type) === 'rotation-css'
@@ -713,11 +755,11 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
713
755
  : '0deg',
714
756
  frame: transformOriginSourceFrame,
715
757
  shouldResortToDefaultValueIfUndefined: true,
716
- })) !== null && _d !== void 0 ? _d : '0deg')
758
+ })) !== null && _e !== void 0 ? _e : '0deg')
717
759
  : '0deg'),
718
760
  scaleValue: (scalePropStatus === null || scalePropStatus === void 0 ? void 0 : scalePropStatus.status) === 'static' ||
719
761
  (scalePropStatus === null || scalePropStatus === void 0 ? void 0 : scalePropStatus.status) === 'keyframed'
720
- ? String((_e = remotion_1.Internals.getEffectiveVisualModeValue({
762
+ ? String((_f = remotion_1.Internals.getEffectiveVisualModeValue({
721
763
  propStatus: scalePropStatus,
722
764
  dragOverrideValue: dragOverrides[selected_outline_types_1.scaleFieldKey],
723
765
  defaultValue: (scaleFieldSchema === null || scaleFieldSchema === void 0 ? void 0 : scaleFieldSchema.type) === 'scale'
@@ -725,19 +767,19 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
725
767
  : 1,
726
768
  frame: transformOriginSourceFrame,
727
769
  shouldResortToDefaultValueIfUndefined: true,
728
- })) !== null && _e !== void 0 ? _e : 1)
770
+ })) !== null && _f !== void 0 ? _f : 1)
729
771
  : '1',
730
772
  schema: controls.schema,
731
773
  sourceFrame: transformOriginSourceFrame,
732
774
  translateDefault: fieldSchema.default,
733
775
  translatePropStatus: propStatus,
734
- translateValue: String((_f = remotion_1.Internals.getEffectiveVisualModeValue({
776
+ translateValue: String((_g = remotion_1.Internals.getEffectiveVisualModeValue({
735
777
  propStatus,
736
778
  dragOverrideValue: dragOverrides[selected_outline_types_1.translateFieldKey],
737
779
  defaultValue: fieldSchema.default,
738
780
  frame: transformOriginSourceFrame,
739
781
  shouldResortToDefaultValueIfUndefined: true,
740
- })) !== null && _f !== void 0 ? _f : fieldSchema.default),
782
+ })) !== null && _g !== void 0 ? _g : fieldSchema.default),
741
783
  }
742
784
  : null,
743
785
  uvHandles: containsSelection
@@ -768,6 +810,7 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
768
810
  sequences,
769
811
  compositions,
770
812
  timelinePosition,
813
+ outlineRuntimeValuesByStore,
771
814
  ]);
772
815
  (0, react_1.useEffect)(() => {
773
816
  if ((hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'canvas' &&
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type SettingsTab = 'apps' | 'license';
3
+ export declare const SettingsModal: React.FC<{
4
+ readonly initialTab: SettingsTab;
5
+ readonly initialPublicLicenseKey: string | null;
6
+ }>;
7
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsModal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const apps_1 = require("../icons/apps");
7
+ const certificate_1 = require("../icons/certificate");
8
+ const modals_1 = require("../state/modals");
9
+ const ConfigureDefaultEditorModal_1 = require("./ConfigureDefaultEditorModal");
10
+ const ConfigureLicenseModal_1 = require("./ConfigureLicenseModal");
11
+ const is_menu_item_1 = require("./Menu/is-menu-item");
12
+ const ModalHeader_1 = require("./ModalHeader");
13
+ const DismissableModal_1 = require("./NewComposition/DismissableModal");
14
+ const render_modals_1 = require("./RenderModal/render-modals");
15
+ const vertical_1 = require("./Tabs/vertical");
16
+ const hiddenPanel = {
17
+ display: 'none',
18
+ };
19
+ const appsIcon = {
20
+ ...render_modals_1.icon,
21
+ height: 20,
22
+ width: 20,
23
+ };
24
+ const appsIconContainer = {
25
+ ...render_modals_1.iconContainer,
26
+ height: 20,
27
+ width: 20,
28
+ };
29
+ const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
30
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
31
+ const [tab, setTab] = (0, react_1.useState)(initialTab);
32
+ const [openedTabs, setOpenedTabs] = (0, react_1.useState)([initialTab]);
33
+ const dismiss = (0, react_1.useCallback)(() => {
34
+ setSelectedModal(null);
35
+ }, [setSelectedModal]);
36
+ const selectTab = (0, react_1.useCallback)((newTab) => {
37
+ setTab(newTab);
38
+ setOpenedTabs((currentOpenedTabs) => {
39
+ if (currentOpenedTabs.includes(newTab)) {
40
+ return currentOpenedTabs;
41
+ }
42
+ return [...currentOpenedTabs, newTab];
43
+ });
44
+ }, []);
45
+ return (jsx_runtime_1.jsxs(DismissableModal_1.DismissableModal, { panelStyle: render_modals_1.outerModalStyle, children: [
46
+ jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Settings", onClose: dismiss }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
47
+ jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: appsIconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(certificate_1.CertificateIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })] }), openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? render_modals_1.optionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, { onSaved: dismiss }) })) : null, openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? render_modals_1.optionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, { initialPublicLicenseKey: initialPublicLicenseKey, onSaved: dismiss }) })) : null] })
48
+ ] }));
49
+ };
50
+ exports.SettingsModal = SettingsModal;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const SettingsModalFooter: React.FC<{
3
+ readonly children: React.ReactNode;
4
+ }>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsModalFooter = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../helpers/colors");
7
+ const InspectorOpenInEditor_1 = require("./InspectorOpenInEditor");
8
+ const ModalFooter_1 = require("./ModalFooter");
9
+ const footer = {
10
+ flex: 'none',
11
+ };
12
+ const footerRow = {
13
+ alignItems: 'center',
14
+ display: 'flex',
15
+ justifyContent: 'space-between',
16
+ };
17
+ const configFileHint = {
18
+ alignItems: 'center',
19
+ color: colors_1.LIGHT_TEXT,
20
+ display: 'flex',
21
+ fontFamily: 'sans-serif',
22
+ fontSize: 13,
23
+ lineHeight: '20px',
24
+ whiteSpace: 'nowrap',
25
+ };
26
+ const configFileName = {
27
+ color: colors_1.BLUE,
28
+ fontFamily: 'inherit',
29
+ fontSize: 13,
30
+ fontWeight: 'bold',
31
+ lineHeight: '20px',
32
+ };
33
+ const SettingsModalFooter = ({ children }) => {
34
+ const configFileLocation = (0, react_1.useMemo)(() => {
35
+ return {
36
+ source: 'remotion.config.ts',
37
+ line: 1,
38
+ column: 1,
39
+ };
40
+ }, []);
41
+ return (jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { style: footer, noBorder: true, children: jsx_runtime_1.jsxs("div", { style: footerRow, children: [
42
+ jsx_runtime_1.jsxs("div", { style: configFileHint, children: ["Changes save to",
43
+ jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }) })
44
+ ] }), children] }) }));
45
+ };
46
+ exports.SettingsModalFooter = SettingsModalFooter;
@@ -9,7 +9,7 @@ const render_1 = require("../icons/render");
9
9
  const modals_1 = require("../state/modals");
10
10
  const InlineAction_1 = require("./InlineAction");
11
11
  const SidebarRenderButton = ({ composition, visible }) => {
12
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
12
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
13
13
  const iconStyle = (0, react_1.useMemo)(() => {
14
14
  return {
15
15
  style: {
@@ -25,7 +25,7 @@ const inlineCode = {
25
25
  color: 'inherit',
26
26
  };
27
27
  const useSvgImportDialog = () => {
28
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
28
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
29
29
  return (0, react_1.useCallback)(() => {
30
30
  return new Promise((resolve) => {
31
31
  let settled = false;
@@ -48,7 +48,7 @@ const useSvgImportDialog = () => {
48
48
  };
49
49
  exports.useSvgImportDialog = useSvgImportDialog;
50
50
  const SvgImportDialog = ({ state }) => {
51
- const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
51
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
52
52
  const settledRef = (0, react_1.useRef)(false);
53
53
  const closeCurrentModal = (0, react_1.useCallback)(() => {
54
54
  setSelectedModal((modal) => (modal === null || modal === void 0 ? void 0 : modal.type) === 'svg-import-dialog' && modal.id === state.id