@remotion/studio 4.0.503 → 4.0.505

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 (181) hide show
  1. package/dist/api/install-package.d.ts +2 -1
  2. package/dist/api/install-package.js +6 -2
  3. package/dist/components/AssetSelectorItem.js +4 -16
  4. package/dist/components/AudioWaveform.d.ts +1 -1
  5. package/dist/components/AudioWaveform.js +36 -3
  6. package/dist/components/Canvas.js +12 -5
  7. package/dist/components/CheckboardToggle.js +3 -1
  8. package/dist/components/CompositionContextButton.d.ts +1 -1
  9. package/dist/components/CompositionContextButton.js +2 -2
  10. package/dist/components/CompositionSelector.js +2 -2
  11. package/dist/components/CompositionSelectorItem.js +6 -7
  12. package/dist/components/ContextMenu.d.ts +5 -7
  13. package/dist/components/ContextMenu.js +54 -21
  14. package/dist/components/ControlButton.d.ts +4 -2
  15. package/dist/components/ControlButton.js +6 -20
  16. package/dist/components/EditorContent.js +1 -1
  17. package/dist/components/EditorGuides/Guide.js +2 -2
  18. package/dist/components/EffectPickerModal.js +70 -9
  19. package/dist/components/FullscreenToggle.js +1 -2
  20. package/dist/components/InitialCompositionLoader.js +1 -14
  21. package/dist/components/InlineAction.d.ts +3 -4
  22. package/dist/components/InlineAction.js +16 -13
  23. package/dist/components/InlineDropdown.d.ts +3 -2
  24. package/dist/components/InlineDropdown.js +16 -5
  25. package/dist/components/InspectorPanel/CompositionMetadata.js +7 -6
  26. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +2 -2
  27. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -3
  28. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
  29. package/dist/components/InspectorPanel/common.js +24 -34
  30. package/dist/components/InspectorPanel/styles.js +4 -0
  31. package/dist/components/InspectorSequenceSection.js +1 -1
  32. package/dist/components/LoopToggle.js +1 -1
  33. package/dist/components/Menu/MenuItem.js +16 -12
  34. package/dist/components/MenuBuildIndicator.d.ts +3 -1
  35. package/dist/components/MenuBuildIndicator.js +14 -59
  36. package/dist/components/MenuCompositionName.js +3 -63
  37. package/dist/components/MenuToolbar.js +23 -3
  38. package/dist/components/MobilePanel.d.ts +1 -2
  39. package/dist/components/MobilePanel.js +6 -10
  40. package/dist/components/MuteToggle.js +2 -1
  41. package/dist/components/NewComposition/ComboBox.d.ts +1 -0
  42. package/dist/components/NewComposition/ComboBox.js +2 -2
  43. package/dist/components/NewComposition/InputDragger.d.ts +5 -0
  44. package/dist/components/NewComposition/InputDragger.js +11 -6
  45. package/dist/components/NewComposition/MenuContent.d.ts +1 -1
  46. package/dist/components/NewComposition/menu-typeahead.d.ts +1 -1
  47. package/dist/components/Notifications/NotificationCenter.js +12 -2
  48. package/dist/components/OutlineToggle.js +10 -2
  49. package/dist/components/PlayPause.js +2 -6
  50. package/dist/components/PlaybackRateSelector.js +4 -9
  51. package/dist/components/PreviewToolbar.js +12 -8
  52. package/dist/components/PreviewToolbarOverflowButton.d.ts +0 -1
  53. package/dist/components/PreviewToolbarOverflowButton.js +2 -75
  54. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -2
  55. package/dist/components/RenderButton.d.ts +1 -1
  56. package/dist/components/RenderButton.js +55 -37
  57. package/dist/components/RenderModal/FrameRangeSetting.js +6 -1
  58. package/dist/components/RenderModal/MultiRangeSlider.js +8 -8
  59. package/dist/components/RenderModal/RenderModalEnvironmentVariables.js +1 -9
  60. package/dist/components/RenderModal/RenderModalOutputName.js +11 -2
  61. package/dist/components/RenderModal/ServerRenderModal.js +2 -17
  62. package/dist/components/RenderModal/WebRenderModal.js +3 -17
  63. package/dist/components/RenderModal/layout.js +7 -5
  64. package/dist/components/RenderModal/render-modals.js +18 -15
  65. package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -14
  66. package/dist/components/SelectedOutlineElement.js +13 -22
  67. package/dist/components/SelectedOutlineOverlay.js +5 -1
  68. package/dist/components/SidebarRenderButton.js +1 -15
  69. package/dist/components/SizeSelector.js +4 -9
  70. package/dist/components/SnappingToggle.js +1 -2
  71. package/dist/components/Spinner.d.ts +1 -0
  72. package/dist/components/Spinner.js +2 -2
  73. package/dist/components/Splitter/SplitterContainer.d.ts +1 -0
  74. package/dist/components/Splitter/SplitterContainer.js +4 -1
  75. package/dist/components/Splitter/SplitterContext.d.ts +4 -3
  76. package/dist/components/Splitter/SplitterContext.js +3 -2
  77. package/dist/components/Splitter/SplitterElement.js +6 -1
  78. package/dist/components/Splitter/SplitterHandle.js +1 -0
  79. package/dist/components/Tabs/vertical.d.ts +1 -0
  80. package/dist/components/Tabs/vertical.js +8 -10
  81. package/dist/components/TimeValue.js +26 -8
  82. package/dist/components/Timeline/Timeline.js +5 -5
  83. package/dist/components/Timeline/TimelineClipboardKeybindings.js +3 -6
  84. package/dist/components/Timeline/TimelineDeleteKeybindings.js +5 -7
  85. package/dist/components/Timeline/TimelineDragHandler.js +3 -0
  86. package/dist/components/Timeline/TimelineEffectItem.js +6 -2
  87. package/dist/components/Timeline/TimelineEffectPropItem.js +6 -3
  88. package/dist/components/Timeline/TimelineExpandedKeyframeRow.d.ts +6 -6
  89. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +34 -2
  90. package/dist/components/Timeline/TimelineHeightContainer.d.ts +1 -0
  91. package/dist/components/Timeline/TimelineHeightContainer.js +2 -2
  92. package/dist/components/Timeline/TimelineInOutDragHandler.js +3 -3
  93. package/dist/components/Timeline/TimelineKeyframeEasingLine.d.ts +5 -3
  94. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +32 -30
  95. package/dist/components/Timeline/TimelineList.d.ts +1 -0
  96. package/dist/components/Timeline/TimelineList.js +2 -3
  97. package/dist/components/Timeline/TimelineScaleField.js +1 -1
  98. package/dist/components/Timeline/TimelineSelection.js +2 -3
  99. package/dist/components/Timeline/TimelineSequence.js +34 -28
  100. package/dist/components/Timeline/TimelineSequenceItem.d.ts +3 -3
  101. package/dist/components/Timeline/TimelineSequenceItem.js +34 -23
  102. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +10 -2
  103. package/dist/components/Timeline/TimelineSequencePropItem.js +64 -12
  104. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +2 -2
  105. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +38 -5
  106. package/dist/components/Timeline/TimelineTimeIndicators.js +36 -3
  107. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -1
  108. package/dist/components/Timeline/TimelineVideoInfo.js +36 -3
  109. package/dist/components/Timeline/TimelineZoomControls.d.ts +3 -1
  110. package/dist/components/Timeline/TimelineZoomControls.js +59 -20
  111. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +2 -3
  112. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +1 -1
  113. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +7 -18
  114. package/dist/components/Timeline/use-timeline-asset-drop.js +3 -3
  115. package/dist/components/Timeline/use-timeline-height.d.ts +2 -1
  116. package/dist/components/Timeline/use-timeline-height.js +3 -2
  117. package/dist/components/TimelineCombobox.d.ts +11 -0
  118. package/dist/components/TimelineCombobox.js +181 -0
  119. package/dist/components/TimelineInOutToggle.js +3 -3
  120. package/dist/components/TopPanel.js +8 -8
  121. package/dist/components/UndoRedoButtons.js +6 -5
  122. package/dist/components/UpdateCheck.js +18 -5
  123. package/dist/components/UpdateModal/UpdateModal.js +35 -12
  124. package/dist/components/composition-menu-items.d.ts +2 -4
  125. package/dist/components/composition-menu-items.js +31 -54
  126. package/dist/components/import-assets.d.ts +2 -1
  127. package/dist/components/import-assets.js +1 -1
  128. package/dist/components/selected-outline-types.d.ts +1 -1
  129. package/dist/esm/{chunk-bj1r1hh5.js → chunk-7pgk8h5m.js} +9174 -8486
  130. package/dist/esm/internals.mjs +9174 -8486
  131. package/dist/esm/previewEntry.mjs +8991 -8303
  132. package/dist/esm/renderEntry.mjs +1 -1
  133. package/dist/helpers/hoverable.d.ts +11 -0
  134. package/dist/helpers/hoverable.js +70 -0
  135. package/dist/helpers/inject-css.js +43 -23
  136. package/dist/helpers/install-required-package.d.ts +3 -2
  137. package/dist/helpers/install-required-package.js +20 -15
  138. package/dist/helpers/use-is-fullscreen.d.ts +1 -0
  139. package/dist/helpers/use-is-fullscreen.js +25 -0
  140. package/dist/helpers/use-menu-structure.js +88 -59
  141. package/dist/icons/audio.d.ts +1 -1
  142. package/dist/icons/audio.js +1 -1
  143. package/dist/icons/canvas-zoom.d.ts +10 -0
  144. package/dist/icons/canvas-zoom.js +21 -0
  145. package/dist/icons/caret.js +1 -1
  146. package/dist/icons/certificate.d.ts +1 -1
  147. package/dist/icons/certificate.js +1 -1
  148. package/dist/icons/data.d.ts +1 -1
  149. package/dist/icons/data.js +2 -2
  150. package/dist/icons/effects.d.ts +5 -0
  151. package/dist/icons/effects.js +8 -0
  152. package/dist/icons/ellipsis.js +1 -1
  153. package/dist/icons/external-link.d.ts +5 -0
  154. package/dist/icons/external-link.js +10 -0
  155. package/dist/icons/fullscreen.js +1 -1
  156. package/dist/icons/gear.d.ts +1 -1
  157. package/dist/icons/gear.js +1 -1
  158. package/dist/icons/gif.d.ts +1 -1
  159. package/dist/icons/gif.js +1 -1
  160. package/dist/icons/input-props.d.ts +2 -0
  161. package/dist/icons/input-props.js +9 -0
  162. package/dist/icons/jump-to-start.js +2 -2
  163. package/dist/icons/magnet.d.ts +3 -1
  164. package/dist/icons/magnet.js +2 -2
  165. package/dist/icons/media-volume.d.ts +6 -2
  166. package/dist/icons/media-volume.js +8 -6
  167. package/dist/icons/minus.d.ts +3 -1
  168. package/dist/icons/minus.js +2 -2
  169. package/dist/icons/pause.js +1 -1
  170. package/dist/icons/play.js +1 -1
  171. package/dist/icons/playback-rate.d.ts +5 -0
  172. package/dist/icons/playback-rate.js +31 -0
  173. package/dist/icons/plus.js +1 -1
  174. package/dist/icons/redo.js +2 -2
  175. package/dist/icons/search.d.ts +5 -0
  176. package/dist/icons/search.js +10 -0
  177. package/dist/icons/step-back.js +2 -2
  178. package/dist/icons/step-forward.js +2 -2
  179. package/dist/icons/timelineInOutPointer.js +2 -2
  180. package/dist/icons/undo.js +2 -2
  181. package/package.json +12 -12
@@ -4,11 +4,12 @@ exports.PlaybackRateSelector = exports.usePlaybackRateMenuItems = 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
+ const colors_1 = require("../helpers/colors");
7
8
  const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
8
9
  const Checkmark_1 = require("../icons/Checkmark");
10
+ const playback_rate_1 = require("../icons/playback-rate");
9
11
  const playbackrate_1 = require("../state/playbackrate");
10
- const ControlButton_1 = require("./ControlButton");
11
- const ComboBox_1 = require("./NewComposition/ComboBox");
12
+ const TimelineCombobox_1 = require("./TimelineCombobox");
12
13
  const commonPlaybackRates = [
13
14
  -4, -2, -1, -0.5, -0.25, 0.25, 0.5, 1, 1.5, 2, 4,
14
15
  ];
@@ -16,7 +17,6 @@ const getPlaybackRateLabel = (playbackRate) => {
16
17
  return `${playbackRate}x`;
17
18
  };
18
19
  const accessibilityLabel = 'Change the playback rate';
19
- const comboStyle = { width: 64 };
20
20
  const usePlaybackRateMenuItems = ({ playbackRate, setPlaybackRate, }) => {
21
21
  const items = (0, react_1.useMemo)(() => {
22
22
  const divider = {
@@ -57,14 +57,9 @@ const PlaybackRateSelector = ({ playbackRate, setPlaybackRate, }) => {
57
57
  playbackRate,
58
58
  setPlaybackRate,
59
59
  });
60
- const style = (0, react_1.useMemo)(() => {
61
- return {
62
- padding: ControlButton_1.CONTROL_BUTTON_PADDING - 2,
63
- };
64
- }, []);
65
60
  if (isStill || canvasContent === null || canvasContent.type === 'asset') {
66
61
  return null;
67
62
  }
68
- return (jsx_runtime_1.jsx("div", { style: style, "aria-label": accessibilityLabel, children: jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "compact", title: accessibilityLabel, style: comboStyle, selectedId: selectedId, values: items }) }));
63
+ return (jsx_runtime_1.jsx(TimelineCombobox_1.TimelineCombobox, { title: accessibilityLabel, labelWidth: 30, selectedId: selectedId, values: items, renderLeftItem: (color) => (jsx_runtime_1.jsx(playback_rate_1.PlaybackRateIcon, { color: color, playbackRate: playbackRate })), unhoveredIconColor: colors_1.WHITE_ALPHA_80 }));
69
64
  };
70
65
  exports.PlaybackRateSelector = PlaybackRateSelector;
@@ -25,7 +25,6 @@ const PreviewToolbarOverflowButton_1 = require("./PreviewToolbarOverflowButton")
25
25
  const RenderButton_1 = require("./RenderButton");
26
26
  const SizeSelector_1 = require("./SizeSelector");
27
27
  const SnappingToggle_1 = require("./SnappingToggle");
28
- const TimelineZoomControls_1 = require("./Timeline/TimelineZoomControls");
29
28
  const TimelineInOutToggle_1 = require("./TimelineInOutToggle");
30
29
  const TOOLBAR_HEIGHT = 40;
31
30
  const container = {
@@ -58,7 +57,8 @@ const padding = {
58
57
  width: timeline_layout_1.TIMELINE_PADDING,
59
58
  };
60
59
  const toolbarControl = {
61
- display: 'contents',
60
+ display: 'flex',
61
+ flexShrink: 0,
62
62
  };
63
63
  const PreviewToolbarControl = ({ children }) => {
64
64
  const onPointerDown = (0, react_1.useCallback)((e) => {
@@ -80,12 +80,16 @@ const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
80
80
  const playPause = (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate, muted: playerMuted, hideNavigationControls: isMobileLayout }) }));
81
81
  return (jsx_runtime_1.jsxs("div", { style: container, className: "css-reset", children: [
82
82
  jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
83
- jsx_runtime_1.jsx("div", { style: padding }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineZoomControls_1.TimelineZoomControls, {}) })
84
- ] }), jsx_runtime_1.jsx(layout_1.Flex, {}), isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) })), !isMobileLayout && (isStill || isVideoComposition) ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })) : null, isVideoComposition && isMobileLayout ? (jsx_runtime_1.jsx("div", { style: centeredPlayButton, children: playPause })) : null, isVideoComposition && !isMobileLayout ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
85
- jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), playPause, jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }) }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: playerMuted, setMuted: setPlayerMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
86
- ] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(CheckboardToggle_1.CheckboardToggle, {}) })), isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(OutlineToggle_1.OutlineToggle, {}) })), readOnlyStudio || isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SnappingToggle_1.SnappingToggle, {}) }))] })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), canvasContent && isFullscreenSupported ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(FullscreenToggle_1.FullScreenToggle, { hidden: isMobileLayout }) })) : null, jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
87
- jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(RenderButton_1.RenderButton, { readOnlyStudio: readOnlyStudio, size: "compact", hidden: isMobileLayout }) }), isMobileLayout ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [isVideoComposition ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: playerMuted, setMuted: setPlayerMuted }) })) : null, jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PreviewToolbarOverflowButton_1.PreviewToolbarOverflowButton, { readOnlyStudio: readOnlyStudio, showFullscreen: Boolean(canvasContent && isFullscreenSupported), showPlaybackRate: isVideoComposition, showLoop: isVideoComposition, showCompositionControls: (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition', playbackRate: playbackRate, setPlaybackRate: setPlaybackRate, loop: loop, setLoop: setLoop }) })
88
- ] })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
83
+ jsx_runtime_1.jsx("div", { style: padding }), isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SizeSelector_1.SizeSelector, {}) })), !isMobileLayout && (isStill || isVideoComposition) ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
84
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate }) })
85
+ ] })) : null, isMobileLayout ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
86
+ jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(PreviewToolbarOverflowButton_1.PreviewToolbarOverflowButton, { showFullscreen: Boolean(canvasContent && isFullscreenSupported), showPlaybackRate: isVideoComposition, showLoop: isVideoComposition, showCompositionControls: (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition', playbackRate: playbackRate, setPlaybackRate: setPlaybackRate, loop: loop, setLoop: setLoop }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
87
+ ] })) : null, isVideoComposition && isMobileLayout ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: playerMuted, setMuted: setPlayerMuted }) })) : null] }), jsx_runtime_1.jsx(layout_1.Flex, {}), isVideoComposition && isMobileLayout ? (jsx_runtime_1.jsx("div", { style: centeredPlayButton, children: playPause })) : null, isVideoComposition && !isMobileLayout ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
88
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), playPause, jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.75 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(MuteToggle_1.MuteToggle, { muted: playerMuted, setMuted: setPlayerMuted }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(TimelineInOutToggle_1.TimelineInOutPointToggle, {}) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 })
89
+ ] })) : null, (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(CheckboardToggle_1.CheckboardToggle, {}) })), isMobileLayout ? null : jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.25 }), isMobileLayout ? null : (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(OutlineToggle_1.OutlineToggle, {}) })), readOnlyStudio || isMobileLayout ? null : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
90
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.25 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(SnappingToggle_1.SnappingToggle, {}) })
91
+ ] }))] })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 1 }), canvasContent && isFullscreenSupported ? (jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(FullscreenToggle_1.FullScreenToggle, { hidden: isMobileLayout }) })) : null, jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsxs("div", { style: sideContainer, children: [
92
+ jsx_runtime_1.jsx(layout_1.Flex, {}), jsx_runtime_1.jsx(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 2 }), jsx_runtime_1.jsx(PreviewToolbarControl, { children: jsx_runtime_1.jsx(RenderButton_1.RenderButton, { readOnlyStudio: readOnlyStudio, size: "compact", narrow: isMobileLayout }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 1.5 })
89
93
  ] }), jsx_runtime_1.jsx(PlaybackKeyboardShortcutsManager_1.PlaybackKeyboardShortcutsManager, { setPlaybackRate: setPlaybackRate }), jsx_runtime_1.jsx(PlaybackRatePersistor_1.PlaybackRatePersistor, {})
90
94
  ] }));
91
95
  };
@@ -1,6 +1,5 @@
1
1
  import React from 'react';
2
2
  export declare const PreviewToolbarOverflowButton: React.FC<{
3
- readonly readOnlyStudio: boolean;
4
3
  readonly showFullscreen: boolean;
5
4
  readonly showPlaybackRate: boolean;
6
5
  readonly showLoop: boolean;
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PreviewToolbarOverflowButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const remotion_1 = require("remotion");
7
6
  const colors_1 = require("../helpers/colors");
8
7
  const use_keybinding_1 = require("../helpers/use-keybinding");
9
8
  const Checkmark_1 = require("../icons/Checkmark");
@@ -18,8 +17,7 @@ const clickButton = (id) => {
18
17
  var _a;
19
18
  (_a = document.getElementById(id)) === null || _a === void 0 ? void 0 : _a.click();
20
19
  };
21
- const PreviewToolbarOverflowButton = ({ readOnlyStudio, showFullscreen, showPlaybackRate, showLoop, showCompositionControls, playbackRate, setPlaybackRate, loop, setLoop, }) => {
22
- const video = remotion_1.Internals.useVideo();
20
+ const PreviewToolbarOverflowButton = ({ showFullscreen, showPlaybackRate, showLoop, showCompositionControls, playbackRate, setPlaybackRate, loop, setLoop, }) => {
23
21
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
24
22
  const { editorShowOutlines, setEditorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
25
23
  const { items: previewSizeItems, selectedId: selectedPreviewSize, zoomable, } = (0, SizeSelector_1.usePreviewSizeMenuItems)();
@@ -34,58 +32,6 @@ const PreviewToolbarOverflowButton = ({ readOnlyStudio, showFullscreen, showPlay
34
32
  };
35
33
  }, []);
36
34
  const renderAction = (0, react_1.useCallback)((color) => jsx_runtime_1.jsx(ellipsis_1.EllipsisIcon, { fill: color, svgProps: iconStyle }), [iconStyle]);
37
- const renderItems = (0, react_1.useMemo)(() => {
38
- if (readOnlyStudio) {
39
- return [
40
- {
41
- type: 'item',
42
- id: 'client-render',
43
- label: 'Render on web',
44
- value: 'client-render',
45
- onClick: () => clickButton('render-modal-button-client'),
46
- keyHint: null,
47
- leftItem: null,
48
- subMenu: null,
49
- quickSwitcherLabel: null,
50
- },
51
- {
52
- type: 'item',
53
- id: 'render-command',
54
- label: 'Render via CLI',
55
- value: 'render-command',
56
- onClick: () => clickButton('render-modal-button-command'),
57
- keyHint: null,
58
- leftItem: null,
59
- subMenu: null,
60
- quickSwitcherLabel: null,
61
- },
62
- ];
63
- }
64
- return [
65
- {
66
- type: 'item',
67
- id: 'server-render',
68
- label: 'Server-side render',
69
- value: 'server-render',
70
- onClick: () => clickButton('render-modal-button-server'),
71
- keyHint: null,
72
- leftItem: null,
73
- subMenu: null,
74
- quickSwitcherLabel: null,
75
- },
76
- {
77
- type: 'item',
78
- id: 'client-render',
79
- label: 'Client-side render',
80
- value: 'client-render',
81
- onClick: () => clickButton('render-modal-button-client'),
82
- keyHint: null,
83
- leftItem: null,
84
- subMenu: null,
85
- quickSwitcherLabel: null,
86
- },
87
- ];
88
- }, [readOnlyStudio]);
89
35
  const values = (0, react_1.useMemo)(() => {
90
36
  const items = [];
91
37
  if (zoomable) {
@@ -172,28 +118,10 @@ const PreviewToolbarOverflowButton = ({ readOnlyStudio, showFullscreen, showPlay
172
118
  quickSwitcherLabel: null,
173
119
  });
174
120
  }
175
- if (video) {
176
- items.push({
177
- type: 'item',
178
- id: 'render',
179
- label: 'Render',
180
- value: 'render',
181
- onClick: () => undefined,
182
- keyHint: null,
183
- leftItem: null,
184
- subMenu: {
185
- items: renderItems,
186
- leaveLeftSpace: false,
187
- preselectIndex: 0,
188
- },
189
- quickSwitcherLabel: null,
190
- });
191
- }
192
121
  return items;
193
122
  }, [
194
123
  previewSizeItems,
195
124
  playbackRateItems,
196
- renderItems,
197
125
  selectedPlaybackRate,
198
126
  selectedPreviewSize,
199
127
  showFullscreen,
@@ -206,12 +134,11 @@ const PreviewToolbarOverflowButton = ({ readOnlyStudio, showFullscreen, showPlay
206
134
  setCheckerboard,
207
135
  setEditorShowOutlines,
208
136
  setLoop,
209
- video,
210
137
  zoomable,
211
138
  ]);
212
139
  if (values.length === 0) {
213
140
  return null;
214
141
  }
215
- return (jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { variant: null, renderAction: renderAction, values: values, title: "More actions", unhoveredColor: colors_1.WHITE }));
142
+ return (jsx_runtime_1.jsx(InlineDropdown_1.InlineDropdown, { variant: null, renderAction: renderAction, values: values, title: "More actions", unhoveredColor: colors_1.WHITE_ALPHA_80 }));
216
143
  };
217
144
  exports.PreviewToolbarOverflowButton = PreviewToolbarOverflowButton;
@@ -52,7 +52,6 @@ const modeInactive = {
52
52
  const modeActive = {
53
53
  ...modeItem,
54
54
  color: colors_1.WHITE,
55
- fontWeight: 'bold',
56
55
  };
57
56
  const content = {
58
57
  paddingLeft: 16,
@@ -353,7 +352,7 @@ const QuickSwitcherContent = ({ initialMode, invocationTimestamp, readOnlyStudio
353
352
  : 'Search compositions...';
354
353
  const container = (0, react_1.useMemo)(() => {
355
354
  return {
356
- width: showKeyboardShortcuts ? 800 : 500,
355
+ width: showKeyboardShortcuts ? 800 : 400,
357
356
  };
358
357
  }, [showKeyboardShortcuts]);
359
358
  const results = (0, react_1.useMemo)(() => {
@@ -3,5 +3,5 @@ export type RenderType = 'server-render' | 'client-render' | 'render-command';
3
3
  export declare const RenderButton: React.FC<{
4
4
  readonly readOnlyStudio: boolean;
5
5
  readonly size?: 'default' | 'compact';
6
- readonly hidden: boolean;
6
+ readonly narrow?: boolean;
7
7
  }>;
@@ -25,10 +25,9 @@ const MenuContent_1 = require("./NewComposition/MenuContent");
25
25
  const splitButtonContainer = {
26
26
  display: 'inline-flex',
27
27
  flexDirection: 'row',
28
- alignItems: 'stretch',
29
- borderRadius: 4,
30
- border: `1px solid ${colors_1.BLACK_ALPHA_60}`,
31
- backgroundColor: colors_1.INPUT_BACKGROUND,
28
+ alignItems: 'center',
29
+ borderRadius: 3,
30
+ gap: 1,
32
31
  overflow: 'hidden',
33
32
  };
34
33
  const mainButtonStyle = {
@@ -38,18 +37,14 @@ const mainButtonStyle = {
38
37
  paddingBottom: 7,
39
38
  background: colors_1.TRANSPARENT,
40
39
  border: 'none',
40
+ borderRadius: '3px 0 0 3px',
41
41
  color: colors_1.WHITE,
42
- cursor: 'pointer',
42
+ cursor: 'default',
43
43
  display: 'flex',
44
44
  alignItems: 'center',
45
45
  fontSize: 14,
46
46
  fontFamily: 'inherit',
47
47
  };
48
- const dividerStyle = {
49
- width: 1,
50
- backgroundColor: colors_1.BLACK_ALPHA_60,
51
- alignSelf: 'stretch',
52
- };
53
48
  const dropdownTriggerStyle = {
54
49
  paddingLeft: 6,
55
50
  paddingRight: 6,
@@ -57,10 +52,12 @@ const dropdownTriggerStyle = {
57
52
  paddingBottom: 7,
58
53
  background: colors_1.TRANSPARENT,
59
54
  border: 'none',
55
+ borderRadius: '0 3px 3px 0',
60
56
  color: colors_1.WHITE,
61
- cursor: 'pointer',
57
+ cursor: 'default',
62
58
  display: 'flex',
63
59
  alignItems: 'center',
60
+ justifyContent: 'center',
64
61
  };
65
62
  const mainButtonContent = {
66
63
  paddingLeft: 4,
@@ -75,32 +72,29 @@ const label = {
75
72
  minWidth: 0,
76
73
  overflow: 'hidden',
77
74
  textOverflow: 'ellipsis',
75
+ userSelect: 'none',
76
+ WebkitUserSelect: 'none',
78
77
  whiteSpace: 'nowrap',
79
78
  };
80
- const compactSplitButtonSegmentHeight = layout_1.COMPACT_CONTROL_ROW_HEIGHT;
79
+ const compactSplitButtonSegmentHeight = 24;
81
80
  const compactMainButtonStyle = {
82
81
  ...mainButtonStyle,
83
82
  boxSizing: 'border-box',
84
83
  height: compactSplitButtonSegmentHeight,
85
- paddingLeft: 6,
86
- paddingRight: 6,
87
- paddingTop: 6,
88
- paddingBottom: 6,
84
+ padding: '0 4px',
89
85
  fontSize: 12,
90
86
  };
91
87
  const compactDropdownTriggerStyle = {
92
88
  ...dropdownTriggerStyle,
93
89
  boxSizing: 'border-box',
94
90
  height: compactSplitButtonSegmentHeight,
95
- paddingLeft: 5,
96
- paddingRight: 5,
97
- paddingTop: 6,
98
- paddingBottom: 6,
91
+ padding: 0,
92
+ width: 20,
99
93
  };
100
94
  const compactMainButtonContent = {
101
95
  ...mainButtonContent,
102
- paddingLeft: 2,
103
- paddingRight: 4,
96
+ paddingLeft: 0,
97
+ paddingRight: 0,
104
98
  };
105
99
  const compactLabel = {
106
100
  ...label,
@@ -123,11 +117,12 @@ const getInitialRenderType = (readOnlyStudio) => {
123
117
  }
124
118
  return 'server-render';
125
119
  };
126
- const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', hidden }) => {
120
+ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', narrow = false }) => {
127
121
  const { inFrame, outFrame } = (0, in_out_1.useTimelineInOutFramePosition)();
128
122
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
129
123
  const [preferredRenderType, setPreferredRenderType] = (0, react_1.useState)(() => getInitialRenderType(readOnlyStudio));
130
124
  const [dropdownOpened, setDropdownOpened] = (0, react_1.useState)(false);
125
+ const [hovered, setHovered] = (0, react_1.useState)(false);
131
126
  const dropdownRef = (0, react_1.useRef)(null);
132
127
  const containerRef = (0, react_1.useRef)(null);
133
128
  const { currentZIndex } = (0, z_index_1.useZIndex)();
@@ -191,8 +186,8 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', hidden })
191
186
  const iconStyle = (0, react_1.useMemo)(() => {
192
187
  return {
193
188
  style: {
194
- height: controlSize === 'compact' ? 14 : 16,
195
- color: colors_1.CURRENT_COLOR,
189
+ height: controlSize === 'compact' ? 18 : 16,
190
+ width: controlSize === 'compact' ? 18 : 16,
196
191
  flexShrink: 0,
197
192
  },
198
193
  };
@@ -422,10 +417,9 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', hidden })
422
417
  const containerStyle = (0, react_1.useMemo)(() => {
423
418
  return {
424
419
  ...splitButtonContainer,
425
- borderColor: colors_1.BLACK_ALPHA_60,
426
- borderRadius: controlSize === 'compact' ? 0 : 4,
420
+ borderRadius: controlSize === 'compact' ? 3 : 4,
427
421
  opacity: 1,
428
- cursor: 'pointer',
422
+ cursor: 'default',
429
423
  };
430
424
  }, [controlSize]);
431
425
  const renderLabel = renderType === 'server-render'
@@ -433,21 +427,45 @@ const RenderButton = ({ readOnlyStudio, size: controlSize = 'default', hidden })
433
427
  : renderType === 'render-command'
434
428
  ? 'Render via CLI'
435
429
  : 'Render on web';
430
+ const showRenderLabel = !narrow || renderType !== 'server-render';
431
+ const mainHovered = hovered && !dropdownOpened;
432
+ const mainForegroundColor = mainHovered ? colors_1.WHITE : colors_1.WHITE_ALPHA_80;
433
+ const dropdownForegroundColor = hovered || dropdownOpened ? colors_1.WHITE : colors_1.WHITE_ALPHA_80;
434
+ const mainSegmentBackground = (0, colors_1.getBackgroundFromHoverState)({
435
+ hovered: mainHovered,
436
+ selected: false,
437
+ });
438
+ const dropdownSegmentBackground = (0, colors_1.getBackgroundFromHoverState)({
439
+ hovered,
440
+ selected: dropdownOpened,
441
+ });
436
442
  if (!video) {
437
443
  return null;
438
444
  }
439
445
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
440
- jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-server", disabled: !canServerRender, onClick: () => openServerRenderModal(false), type: "button" }), ' ', jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-client", onClick: openClientRenderModal, type: "button" }), jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-command", onClick: () => openServerRenderModal(true), type: "button" }), hidden ? (jsx_runtime_1.jsx("button", { style: { display: 'none' }, onClick: onClick, id: "render-modal-button", type: "button" })) : (jsx_runtime_1.jsxs("div", { ref: containerRef, style: containerStyle, title: tooltip, children: [
441
- jsx_runtime_1.jsx("button", { type: "button", style: controlSize === 'compact'
442
- ? compactMainButtonStyle
443
- : mainButtonStyle, onClick: onClick, id: "render-modal-button", children: jsx_runtime_1.jsxs(layout_1.Row, { align: "center", style: controlSize === 'compact'
446
+ jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-server", disabled: !canServerRender, onClick: () => openServerRenderModal(false), type: "button" }), ' ', jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-client", onClick: openClientRenderModal, type: "button" }), jsx_runtime_1.jsx("button", { style: { display: 'none' }, id: "render-modal-button-command", onClick: () => openServerRenderModal(true), type: "button" }), jsx_runtime_1.jsxs("div", { ref: containerRef, style: containerStyle, title: tooltip, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), children: [
447
+ jsx_runtime_1.jsx("button", { type: "button", "aria-label": renderLabel, style: {
448
+ ...(controlSize === 'compact'
449
+ ? compactMainButtonStyle
450
+ : mainButtonStyle),
451
+ backgroundColor: mainSegmentBackground,
452
+ color: mainForegroundColor,
453
+ }, onClick: onClick, id: "render-modal-button", children: jsx_runtime_1.jsxs(layout_1.Row, { align: "center", style: controlSize === 'compact'
444
454
  ? compactMainButtonContent
445
455
  : mainButtonContent, children: [
446
- jsx_runtime_1.jsx(render_1.ThinRenderIcon, { fill: colors_1.CURRENT_COLOR_LOWERCASE, svgProps: iconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: controlSize === 'compact' ? 0.75 : 1 }), jsx_runtime_1.jsx("span", { style: controlSize === 'compact' ? compactLabel : label, children: renderLabel })
447
- ] }) }), jsx_runtime_1.jsx("div", { style: dividerStyle }), jsx_runtime_1.jsx("button", { ref: dropdownRef, type: "button", style: controlSize === 'compact'
448
- ? compactDropdownTriggerStyle
449
- : dropdownTriggerStyle, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: onPointerDown, onClick: onClickDropdown, children: jsx_runtime_1.jsx(caret_1.CaretDown, {}) })
450
- ] })), portalStyle
456
+ jsx_runtime_1.jsx(render_1.ThinRenderIcon, { fill: mainForegroundColor, svgProps: iconStyle }), showRenderLabel ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
457
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: controlSize === 'compact' ? 0.75 : 1 }), jsx_runtime_1.jsx("span", { style: {
458
+ ...(controlSize === 'compact' ? compactLabel : label),
459
+ color: mainForegroundColor,
460
+ }, children: renderLabel })
461
+ ] })) : null] }) }), jsx_runtime_1.jsx("button", { ref: dropdownRef, type: "button", style: {
462
+ ...(controlSize === 'compact'
463
+ ? compactDropdownTriggerStyle
464
+ : dropdownTriggerStyle),
465
+ backgroundColor: dropdownSegmentBackground,
466
+ color: dropdownForegroundColor,
467
+ }, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: onPointerDown, onClick: onClickDropdown, children: jsx_runtime_1.jsx(caret_1.CaretDown, { color: dropdownForegroundColor }) })
468
+ ] }), portalStyle
451
469
  ? 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))
452
470
  : null] }));
453
471
  };
@@ -7,6 +7,11 @@ const InputDragger_1 = require("../NewComposition/InputDragger");
7
7
  const layout_1 = require("./layout");
8
8
  const MultiRangeSlider_1 = require("./MultiRangeSlider");
9
9
  const INPUT_WIDTH = 40;
10
+ const startFrameInputContainer = {
11
+ display: 'flex',
12
+ justifyContent: 'flex-end',
13
+ width: INPUT_WIDTH,
14
+ };
10
15
  const FrameRangeSetting = ({ startFrame, endFrame, setEndFrame, durationInFrames, setStartFrame }) => {
11
16
  const minStartFrame = 0;
12
17
  const maxEndFrame = durationInFrames - 1;
@@ -24,7 +29,7 @@ const FrameRangeSetting = ({ startFrame, endFrame, setEndFrame, durationInFrames
24
29
  }, [onEndFrameChangedDirectly]);
25
30
  return (jsx_runtime_1.jsxs("div", { style: layout_1.optionRow, children: [
26
31
  jsx_runtime_1.jsx("div", { style: layout_1.label, children: "Frame range" }), jsx_runtime_1.jsxs("div", { style: layout_1.rightRow, children: [
27
- jsx_runtime_1.jsx("div", { style: { width: INPUT_WIDTH }, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { min: minStartFrame, max: endFrame - 1, name: "Start frame", value: startFrame, step: 1, onTextChange: onStartFrameChanged, onValueChange: onStartFrameChangedDirectly, status: "ok", rightAlign: true, style: { width: INPUT_WIDTH } }) }), jsx_runtime_1.jsx(MultiRangeSlider_1.MultiRangeSlider, { min: minStartFrame, max: maxEndFrame, start: startFrame, end: endFrame, step: 1, onLeftThumbDrag: onStartFrameChangedDirectly, onRightThumbDrag: onEndFrameChangedDirectly }), ' ', jsx_runtime_1.jsx("div", { style: { width: INPUT_WIDTH }, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { min: startFrame + 1, max: maxEndFrame, name: "End frame", value: endFrame, step: 1, onTextChange: onEndFrameChanged, onValueChange: onEndFrameChangedDirectly, status: "ok", rightAlign: true, style: { width: INPUT_WIDTH } }) })
32
+ jsx_runtime_1.jsx("div", { style: startFrameInputContainer, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { min: minStartFrame, max: endFrame - 1, name: "Start frame", value: startFrame, step: 1, onTextChange: onStartFrameChanged, onValueChange: onStartFrameChangedDirectly, status: "ok", rightAlign: true, style: { width: INPUT_WIDTH } }) }), jsx_runtime_1.jsx(MultiRangeSlider_1.MultiRangeSlider, { min: minStartFrame, max: maxEndFrame, start: startFrame, end: endFrame, step: 1, onLeftThumbDrag: onStartFrameChangedDirectly, onRightThumbDrag: onEndFrameChangedDirectly }), ' ', jsx_runtime_1.jsx("div", { style: { width: INPUT_WIDTH }, children: jsx_runtime_1.jsx(InputDragger_1.InputDragger, { min: startFrame + 1, max: maxEndFrame, name: "End frame", value: endFrame, step: 1, onTextChange: onEndFrameChanged, onValueChange: onEndFrameChangedDirectly, status: "ok", rightAlign: true, style: { width: INPUT_WIDTH } }) })
28
33
  ] })
29
34
  ] }));
30
35
  };
@@ -5,23 +5,23 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const colors_1 = require("../../helpers/colors");
7
7
  const container = {
8
- borderColor: colors_1.BLACK,
9
- borderStyle: 'solid',
10
- borderWidth: '2px',
11
- height: 39,
12
- width: 220,
8
+ height: 6,
9
+ flex: 1,
10
+ minWidth: 80,
11
+ maxWidth: 220,
13
12
  position: 'relative',
14
- backgroundColor: colors_1.INPUT_BACKGROUND,
13
+ backgroundColor: colors_1.WHITE_ALPHA_10,
15
14
  marginLeft: 8,
16
15
  marginRight: 8,
17
- borderRadius: 2,
16
+ borderRadius: 3,
18
17
  };
19
18
  // blue slider
20
19
  const sliderRange = {
21
20
  position: 'absolute',
22
21
  top: 0,
23
22
  backgroundColor: colors_1.BLUE,
24
- height: 35,
23
+ height: 6,
24
+ borderRadius: 3,
25
25
  };
26
26
  const MultiRangeSlider = ({ min, max, start, end, step, onLeftThumbDrag, onRightThumbDrag, }) => {
27
27
  const getPercent = (0, react_1.useCallback)((value) => Math.round(((value - min) / (max - min)) * 100), [min, max]);
@@ -3,16 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RenderModalEnvironmentVariables = 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");
7
6
  const Button_1 = require("../Button");
8
7
  const layout_1 = require("../layout");
9
8
  const EnvInput_1 = require("./EnvInput");
10
- const title = {
11
- fontSize: 14,
12
- fontWeight: 'bold',
13
- color: colors_1.LIGHT_TEXT,
14
- marginLeft: 16,
15
- };
16
9
  const container = {
17
10
  marginTop: 20,
18
11
  };
@@ -41,8 +34,7 @@ const RenderModalEnvironmentVariables = ({ envVariables, setEnvVariables }) => {
41
34
  setEnvVariables((oldEnv) => [...oldEnv, ['', '']]);
42
35
  }, [setEnvVariables]);
43
36
  const usedKeys = [];
44
- return (jsx_runtime_1.jsxs("div", { style: container, children: [
45
- jsx_runtime_1.jsx("strong", { style: title, children: "Environment variables" }), envVariables.map((env, i) => {
37
+ return (jsx_runtime_1.jsxs("div", { style: container, children: [envVariables.map((env, i) => {
46
38
  let isDuplicate = false;
47
39
  if (usedKeys.includes(env[0].toUpperCase())) {
48
40
  isDuplicate = true;
@@ -28,6 +28,15 @@ const openIconStyle = {
28
28
  height: 12,
29
29
  flexShrink: 0,
30
30
  };
31
+ const outputNameRow = {
32
+ ...layout_2.optionRow,
33
+ columnGap: 16,
34
+ };
35
+ const outputNameInputContainer = {
36
+ flex: 1,
37
+ minWidth: 0,
38
+ maxWidth: 280,
39
+ };
31
40
  const RenderModalOutputName = ({ existence, inputStyle, outName, onValueChange, validationMessage, label: labelText, }) => {
32
41
  const openExistingOutput = (0, react_1.useCallback)(() => {
33
42
  (0, actions_1.openInFileExplorer)({ directory: outName }).catch((err) => {
@@ -38,8 +47,8 @@ const RenderModalOutputName = ({ existence, inputStyle, outName, onValueChange,
38
47
  return jsx_runtime_1.jsx(folder_1.ExpandedFolderIconSolid, { style: openIconStyle, color: color });
39
48
  }, []);
40
49
  const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
41
- return (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
42
- jsx_runtime_1.jsx(layout_1.Column, { children: jsx_runtime_1.jsx("div", { style: layout_2.label, children: labelText }) }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { children: [
50
+ return (jsx_runtime_1.jsxs("div", { style: outputNameRow, children: [
51
+ jsx_runtime_1.jsx(layout_1.Column, { children: jsx_runtime_1.jsx("div", { style: layout_2.label, children: labelText }) }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { style: outputNameInputContainer, children: [
43
52
  jsx_runtime_1.jsx(RemInput_1.RemotionInput, { status: validationMessage ? 'error' : existence ? 'warning' : 'ok', style: inputStyle, type: "text", value: outName, onChange: onValueChange, rightAlign: true }), validationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
44
53
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: validationMessage, type: 'error' })
45
54
  ] })) : existence ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
@@ -19,6 +19,7 @@ const file_1 = require("../../icons/file");
19
19
  const frame_1 = require("../../icons/frame");
20
20
  const gear_1 = require("../../icons/gear");
21
21
  const gif_1 = require("../../icons/gif");
22
+ const input_props_1 = require("../../icons/input-props");
22
23
  const video_1 = require("../../icons/video");
23
24
  const modals_1 = require("../../state/modals");
24
25
  const sidebar_1 = require("../../state/sidebar");
@@ -989,23 +990,7 @@ const RenderModal = ({ readOnlyStudio, initialFrame, initialVideoImageFormat, in
989
990
  : 'Rendering...', jsx_runtime_1.jsx(ShortcutHint_1.ShortcutHint, { keyToPress: "\u21B5", cmdOrCtrl: true })
990
991
  ] })
991
992
  ] }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
992
- jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [shownTabs.includes('general') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'general', onClick: () => setTab('general'), children: [
993
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(file_1.FileIcon, { style: render_modals_1.icon }) }),
994
- "General"] })) : null, shownTabs.includes('data') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'data', onClick: () => setTab('data'), children: [
995
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(data_1.DataIcon, { style: render_modals_1.icon }) }),
996
- "Input Props"] })) : null, shownTabs.includes('picture') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'picture', onClick: () => setTab('picture'), children: [
997
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(frame_1.PicIcon, { style: render_modals_1.icon }) }),
998
- "Picture"] })) : null, shownTabs.includes('audio') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'audio', onClick: () => setTab('audio'), children: [
999
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(audio_1.AudioIcon, { style: render_modals_1.icon }) }),
1000
- "Audio"] })) : null, shownTabs.includes('gif') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'gif', onClick: () => setTab('gif'), children: [
1001
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(gif_1.GifIcon, { style: render_modals_1.icon }) }),
1002
- "GIF"] })) : null, shownTabs.includes('encoding') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'encoding', onClick: () => setTab('encoding'), children: [
1003
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(video_1.FilmIcon, { style: render_modals_1.icon, color: colors_1.CURRENT_COLOR_LOWERCASE }) }),
1004
- "Encoding"] })) : null, shownTabs.includes('environment') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'environment', onClick: () => setTab('environment'), children: [
1005
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(data_1.DataIcon, { style: render_modals_1.icon }) }),
1006
- "Environment"] })) : null, shownTabs.includes('advanced') ? (jsx_runtime_1.jsxs(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'advanced', onClick: () => setTab('advanced'), children: [
1007
- jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(gear_1.GearIcon, { style: render_modals_1.icon }) }),
1008
- "Other"] })) : null] }), 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(RenderModalBasic_1.RenderModalBasic, { codec: codec, resolvedComposition: resolvedComposition, frame: frame, imageFormatOptions: imageFormatOptions, outName: outName, proResProfile: proResProfile, renderMode: renderMode, setVideoCodec: setCodec, setFrame: setFrame, setOutName: setOutName, setProResProfile: setProResProfile, endFrame: endFrame, setEndFrame: setEndFrame, setStartFrame: setStartFrame, setVerboseLogging: setLogLevel, logLevel: logLevel, showOutputName: !readOnlyStudio, startFrame: startFrame, validationMessage: outnameValidation.valid ? null : outnameValidation.error.message })) : tab === 'picture' ? (jsx_runtime_1.jsx(RenderModalPicture_1.RenderModalPicture, { renderMode: renderMode, scale: scale, setScale: setScale, imageFormatOptions: imageFormatOptions, jpegQuality: jpegQuality, setJpegQuality: setJpegQuality, videoImageFormat: videoImageFormat, stillImageFormat: stillImageFormat, compositionWidth: resolvedComposition.width, compositionHeight: resolvedComposition.height })) : tab === 'audio' ? (jsx_runtime_1.jsx(RenderModalAudio_1.RenderModalAudio, { muted: muted, renderMode: renderMode, setMuted: setMuted, codec: codec, audioCodec: audioCodec, setAudioCodec: setAudioCodec, enforceAudioTrack: enforceAudioTrack, setEnforceAudioTrackState: setEnforceAudioTrackState, customTargetAudioBitrate: customTargetAudioBitrate, setCustomTargetAudioBitrateValue: setCustomTargetAudioBitrateValue, setShouldHaveCustomTargetAudioBitrate: setShouldHaveCustomTargetAudioBitrate, shouldHaveCustomTargetAudioBitrate: shouldHaveCustomTargetAudioBitrate, forSeamlessAacConcatenation: forSeamlessAacConcatenation, setForSeamlessAacConcatenation: setForSeamlessAacConcatenation, separateAudioTo: separateAudioTo, setSeparateAudioTo: setSeparateAudioTo, outName: outName, sampleRate: sampleRate, setSampleRate: setSampleRate })) : tab === 'gif' ? (jsx_runtime_1.jsx(RenderModalGif_1.RenderModalGif, { everyNthFrame: everyNthFrame, limitNumberOfGifLoops: limitNumberOfGifLoops, numberOfGifLoopsSetting: numberOfGifLoopsSetting, setEveryNthFrameSetting: setEveryNthFrameSetting, setLimitNumberOfGifLoops: setLimitNumberOfGifLoops, setNumberOfGifLoopsSetting: setNumberOfGifLoopsSetting })) : tab === 'encoding' ? (jsx_runtime_1.jsx(RenderModalEncoding_1.RenderModalEncoding, { renderMode: renderMode, codec: codec, qualityControlType: qualityControlType, setQualityControl: setQualityControl, shouldDisplayQualityControlPicker: supportsBothQualityControls, crf: crf, setCrf: setCrf, maxCrf: maxCrf, minCrf: minCrf, customTargetVideoBitrate: customTargetVideoBitrate, setCustomTargetVideoBitrateValue: setCustomTargetVideoBitrateValue, encodingBufferSize: encodingBufferSize, setEncodingBufferSize: setEncodingBufferSize, encodingMaxRate: encodingMaxRate, setEncodingMaxRate: setEncodingMaxRate, pixelFormat: pixelFormat, pixelFormatOptions: pixelFormatOptions, colorSpace: colorSpace, setColorSpace: setColorSpace, x264Preset: x264Preset, setx264Preset: setx264Preset, gopSize: gopSize, setGopSize: setGopSize, hardwareAcceleration: hardwareAcceleration, setHardwareAcceleration: setHardwareAcceleration, disallowParallelEncoding: disallowParallelEncoding, setDisallowParallelEncoding: setDisallowParallelEncoding })) : tab === 'environment' ? (jsx_runtime_1.jsx(RenderModalEnvironmentVariables_1.RenderModalEnvironmentVariables, { envVariables: envVariables, setEnvVariables: setEnvVariables })) : tab === 'data' ? (jsx_runtime_1.jsx(DataEditor_1.DataEditor, { defaultProps: inputProps, setDefaultProps: setInputProps, unresolvedComposition: unresolvedComposition, propsEditType: "input-props", canSaveDefaultProps: {
993
+ jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [shownTabs.includes('general') ? (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" })) : null, shownTabs.includes('data') ? (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" })) : null, shownTabs.includes('picture') ? (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, shownTabs.includes('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, shownTabs.includes('gif') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'gif', onClick: () => setTab('gif'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(gif_1.GifIcon, { color: color, style: render_modals_1.icon }) })), children: "GIF" })) : null, shownTabs.includes('encoding') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'encoding', onClick: () => setTab('encoding'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: render_modals_1.icon }) })), children: "Encoding" })) : null, shownTabs.includes('environment') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'environment', onClick: () => setTab('environment'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(data_1.DataIcon, { color: color, style: render_modals_1.icon }) })), children: "Environment" })) : null, shownTabs.includes('advanced') ? (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" })) : null] }), 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(RenderModalBasic_1.RenderModalBasic, { codec: codec, resolvedComposition: resolvedComposition, frame: frame, imageFormatOptions: imageFormatOptions, outName: outName, proResProfile: proResProfile, renderMode: renderMode, setVideoCodec: setCodec, setFrame: setFrame, setOutName: setOutName, setProResProfile: setProResProfile, endFrame: endFrame, setEndFrame: setEndFrame, setStartFrame: setStartFrame, setVerboseLogging: setLogLevel, logLevel: logLevel, showOutputName: !readOnlyStudio, startFrame: startFrame, validationMessage: outnameValidation.valid ? null : outnameValidation.error.message })) : tab === 'picture' ? (jsx_runtime_1.jsx(RenderModalPicture_1.RenderModalPicture, { renderMode: renderMode, scale: scale, setScale: setScale, imageFormatOptions: imageFormatOptions, jpegQuality: jpegQuality, setJpegQuality: setJpegQuality, videoImageFormat: videoImageFormat, stillImageFormat: stillImageFormat, compositionWidth: resolvedComposition.width, compositionHeight: resolvedComposition.height })) : tab === 'audio' ? (jsx_runtime_1.jsx(RenderModalAudio_1.RenderModalAudio, { muted: muted, renderMode: renderMode, setMuted: setMuted, codec: codec, audioCodec: audioCodec, setAudioCodec: setAudioCodec, enforceAudioTrack: enforceAudioTrack, setEnforceAudioTrackState: setEnforceAudioTrackState, customTargetAudioBitrate: customTargetAudioBitrate, setCustomTargetAudioBitrateValue: setCustomTargetAudioBitrateValue, setShouldHaveCustomTargetAudioBitrate: setShouldHaveCustomTargetAudioBitrate, shouldHaveCustomTargetAudioBitrate: shouldHaveCustomTargetAudioBitrate, forSeamlessAacConcatenation: forSeamlessAacConcatenation, setForSeamlessAacConcatenation: setForSeamlessAacConcatenation, separateAudioTo: separateAudioTo, setSeparateAudioTo: setSeparateAudioTo, outName: outName, sampleRate: sampleRate, setSampleRate: setSampleRate })) : tab === 'gif' ? (jsx_runtime_1.jsx(RenderModalGif_1.RenderModalGif, { everyNthFrame: everyNthFrame, limitNumberOfGifLoops: limitNumberOfGifLoops, numberOfGifLoopsSetting: numberOfGifLoopsSetting, setEveryNthFrameSetting: setEveryNthFrameSetting, setLimitNumberOfGifLoops: setLimitNumberOfGifLoops, setNumberOfGifLoopsSetting: setNumberOfGifLoopsSetting })) : tab === 'encoding' ? (jsx_runtime_1.jsx(RenderModalEncoding_1.RenderModalEncoding, { renderMode: renderMode, codec: codec, qualityControlType: qualityControlType, setQualityControl: setQualityControl, shouldDisplayQualityControlPicker: supportsBothQualityControls, crf: crf, setCrf: setCrf, maxCrf: maxCrf, minCrf: minCrf, customTargetVideoBitrate: customTargetVideoBitrate, setCustomTargetVideoBitrateValue: setCustomTargetVideoBitrateValue, encodingBufferSize: encodingBufferSize, setEncodingBufferSize: setEncodingBufferSize, encodingMaxRate: encodingMaxRate, setEncodingMaxRate: setEncodingMaxRate, pixelFormat: pixelFormat, pixelFormatOptions: pixelFormatOptions, colorSpace: colorSpace, setColorSpace: setColorSpace, x264Preset: x264Preset, setx264Preset: setx264Preset, gopSize: gopSize, setGopSize: setGopSize, hardwareAcceleration: hardwareAcceleration, setHardwareAcceleration: setHardwareAcceleration, disallowParallelEncoding: disallowParallelEncoding, setDisallowParallelEncoding: setDisallowParallelEncoding })) : tab === 'environment' ? (jsx_runtime_1.jsx(RenderModalEnvironmentVariables_1.RenderModalEnvironmentVariables, { envVariables: envVariables, setEnvVariables: setEnvVariables })) : tab === 'data' ? (jsx_runtime_1.jsx(DataEditor_1.DataEditor, { defaultProps: inputProps, setDefaultProps: setInputProps, unresolvedComposition: unresolvedComposition, propsEditType: "input-props", canSaveDefaultProps: {
1009
994
  canUpdate: false,
1010
995
  reason: 'render dialogue',
1011
996
  determined: false,