@remotion/studio 4.0.515 → 4.0.516

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 (196) hide show
  1. package/dist/api/restart-studio.js +4 -0
  2. package/dist/components/AssetSelector.js +3 -9
  3. package/dist/components/AssetSelectorItem.d.ts +2 -1
  4. package/dist/components/AssetSelectorItem.js +24 -29
  5. package/dist/components/Canvas.js +7 -4
  6. package/dist/components/CaptionInspector.d.ts +2 -0
  7. package/dist/components/CaptionInspector.js +3 -5
  8. package/dist/components/CompositionSelector.js +6 -3
  9. package/dist/components/CompositionSelectorItem.js +9 -10
  10. package/dist/components/ConfigSelect.d.ts +17 -0
  11. package/dist/components/ConfigSelect.js +50 -0
  12. package/dist/components/CurrentAsset.d.ts +10 -2
  13. package/dist/components/CurrentAsset.js +139 -46
  14. package/dist/components/FixComputedValueModal.js +54 -51
  15. package/dist/components/GlobalKeybindings.js +5 -5
  16. package/dist/components/InlineAction.d.ts +1 -1
  17. package/dist/components/InlineAction.js +12 -2
  18. package/dist/components/InlineCaptionInspector.d.ts +2 -0
  19. package/dist/components/InlineCaptionInspector.js +2 -2
  20. package/dist/components/InlineCompositionName.js +1 -1
  21. package/dist/components/InlineEditableTitle.js +3 -2
  22. package/dist/components/InspectorInfoHeader.js +1 -1
  23. package/dist/components/InspectorOpenInEditor.js +48 -72
  24. package/dist/components/InspectorPanel/AlignmentControls.js +2 -3
  25. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +7 -0
  26. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +39 -0
  27. package/dist/components/InspectorPanel/CompositionInspector.js +14 -7
  28. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +10 -4
  29. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -1
  30. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -4
  31. package/dist/components/InspectorPanel/common.d.ts +0 -12
  32. package/dist/components/InspectorPanel/common.js +3 -52
  33. package/dist/components/InspectorPanel/use-composition-actions.js +0 -1
  34. package/dist/components/InspectorPanelLayout.d.ts +1 -1
  35. package/dist/components/InspectorPanelLayout.js +1 -1
  36. package/dist/components/InspectorSequenceSection.js +40 -54
  37. package/dist/components/InstallPackage.d.ts +2 -1
  38. package/dist/components/InstallPackage.js +60 -30
  39. package/dist/components/InstallablePackage.js +37 -11
  40. package/dist/components/KeyboardShortcutsSettings.d.ts +2 -0
  41. package/dist/components/KeyboardShortcutsSettings.js +177 -0
  42. package/dist/components/MenuBuildIndicator.js +1 -1
  43. package/dist/components/Modals.js +6 -5
  44. package/dist/components/NewComposition/CodemodFooter.d.ts +0 -1
  45. package/dist/components/NewComposition/CodemodFooter.js +2 -8
  46. package/dist/components/NewComposition/DeleteComposition.js +1 -1
  47. package/dist/components/NewComposition/DeleteFolder.js +1 -1
  48. package/dist/components/NewComposition/DuplicateComposition.js +1 -1
  49. package/dist/components/NewComposition/InputDragger.js +27 -4
  50. package/dist/components/NewComposition/NewComposition.js +1 -1
  51. package/dist/components/NewComposition/NewFolder.js +1 -3
  52. package/dist/components/NewComposition/RenameComposition.js +1 -1
  53. package/dist/components/NewComposition/RenameFolder.js +1 -1
  54. package/dist/components/NewComposition/use-rename-static-file.js +1 -1
  55. package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
  56. package/dist/components/Notifications/NotificationCenter.js +5 -0
  57. package/dist/components/OptionsPanel.js +9 -12
  58. package/dist/components/PreviewToolbar.js +5 -2
  59. package/dist/components/PreviewToolbarOverflowButton.js +30 -0
  60. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +2 -2
  61. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +14 -30
  62. package/dist/components/RenderButton.js +66 -183
  63. package/dist/components/RenderModal/DataEditor.js +15 -12
  64. package/dist/components/RenderModal/RenderStatusModal.js +0 -1
  65. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +3 -1
  66. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.d.ts +15 -0
  67. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.js +95 -0
  68. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +1 -6
  69. package/dist/components/RenderingSettings.js +7 -4
  70. package/dist/components/RulersAndGuidesToggle.d.ts +2 -0
  71. package/dist/components/RulersAndGuidesToggle.js +23 -0
  72. package/dist/components/SegmentedButton.d.ts +29 -0
  73. package/dist/components/SegmentedButton.js +226 -0
  74. package/dist/components/SelectedOutlineEditingHandles.d.ts +16 -0
  75. package/dist/components/SelectedOutlineEditingHandles.js +66 -0
  76. package/dist/components/SelectedOutlineElement.d.ts +2 -4
  77. package/dist/components/SelectedOutlineElement.js +15 -54
  78. package/dist/components/SelectedOutlineOverlay.js +32 -6
  79. package/dist/components/SelectedOutlinePolygon.d.ts +3 -4
  80. package/dist/components/SelectedOutlinePolygon.js +18 -16
  81. package/dist/components/SelectedOutlineRenderer.js +66 -14
  82. package/dist/components/SettingsModal.d.ts +1 -1
  83. package/dist/components/SettingsModal.js +30 -7
  84. package/dist/components/SettingsModalFooter.js +2 -1
  85. package/dist/components/SkillsSettings.d.ts +2 -0
  86. package/dist/components/SkillsSettings.js +129 -0
  87. package/dist/components/StaticFilePreview.js +7 -1
  88. package/dist/components/StudioSettings.js +7 -48
  89. package/dist/components/Tabs/index.js +1 -1
  90. package/dist/components/Timeline/Timeline.js +0 -1
  91. package/dist/components/Timeline/TimelineAssetField.d.ts +1 -1
  92. package/dist/components/Timeline/TimelineAssetField.js +15 -9
  93. package/dist/components/Timeline/TimelineBooleanField.js +1 -4
  94. package/dist/components/Timeline/TimelineClipboardKeybindings.js +7 -10
  95. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  96. package/dist/components/Timeline/TimelineEffectItem.js +23 -10
  97. package/dist/components/Timeline/TimelineEffectPropItem.js +15 -2
  98. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  99. package/dist/components/Timeline/TimelineFieldLabel.js +4 -2
  100. package/dist/components/Timeline/TimelineFieldRowContent.d.ts +1 -2
  101. package/dist/components/Timeline/TimelineFieldRowContent.js +8 -21
  102. package/dist/components/Timeline/TimelineImageInfo.d.ts +0 -1
  103. package/dist/components/Timeline/TimelineImageInfo.js +13 -32
  104. package/dist/components/Timeline/TimelineKeyframeControls.js +10 -4
  105. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  106. package/dist/components/Timeline/TimelineRotationField.js +0 -2
  107. package/dist/components/Timeline/TimelineRowChrome.d.ts +0 -1
  108. package/dist/components/Timeline/TimelineRowChrome.js +3 -4
  109. package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +0 -1
  110. package/dist/components/Timeline/TimelineRowLayoutContext.js +1 -4
  111. package/dist/components/Timeline/TimelineScaleField.js +2 -6
  112. package/dist/components/Timeline/TimelineSchemaField.js +9 -3
  113. package/dist/components/Timeline/TimelineSelection.js +1 -1
  114. package/dist/components/Timeline/TimelineSequence.d.ts +2 -0
  115. package/dist/components/Timeline/TimelineSequence.js +110 -19
  116. package/dist/components/Timeline/TimelineSequenceItem.js +5 -5
  117. package/dist/components/Timeline/TimelineSequencePropItem.js +15 -2
  118. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +4 -2
  119. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +85 -91
  120. package/dist/components/Timeline/TimelineTrack.js +1 -1
  121. package/dist/components/Timeline/TimelineTransformOriginField.js +0 -4
  122. package/dist/components/Timeline/TimelineTranslateField.js +0 -4
  123. package/dist/components/Timeline/TimelineVirtualization.js +3 -1
  124. package/dist/components/Timeline/duplicate-selected-timeline-item.js +3 -12
  125. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.d.ts +4 -0
  126. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.js +26 -0
  127. package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -19
  128. package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +6 -1
  129. package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +11 -4
  130. package/dist/components/Timeline/split-selected-timeline-item.js +0 -1
  131. package/dist/components/Timeline/timeline-field-row-layout.d.ts +1 -1
  132. package/dist/components/Timeline/timeline-field-row-layout.js +4 -7
  133. package/dist/components/Timeline/timeline-field-utils.js +0 -2
  134. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  135. package/dist/components/TimelineCombobox.js +25 -160
  136. package/dist/components/TimelineInOutToggle.js +4 -1
  137. package/dist/components/duplicate-jsx-node-api.d.ts +2 -0
  138. package/dist/components/duplicate-jsx-node-api.js +12 -0
  139. package/dist/components/effect-drag-and-drop.js +1 -4
  140. package/dist/components/handle-drop.d.ts +2 -1
  141. package/dist/components/handle-drop.js +3 -3
  142. package/dist/components/import-assets.js +9 -65
  143. package/dist/components/keyboard-shortcuts.d.ts +10 -0
  144. package/dist/components/keyboard-shortcuts.js +135 -0
  145. package/dist/components/selected-outline-control-layout.js +2 -6
  146. package/dist/components/selected-outline-measurement.d.ts +1 -1
  147. package/dist/components/selected-outline-measurement.js +16 -3
  148. package/dist/components/use-delete-asset.d.ts +1 -0
  149. package/dist/components/use-delete-asset.js +40 -0
  150. package/dist/components/use-selected-outline-control-target.d.ts +11 -0
  151. package/dist/components/use-selected-outline-control-target.js +79 -0
  152. package/dist/esm/{chunk-s6k99gh2.js → chunk-4bxz1d3g.js} +3 -2
  153. package/dist/esm/{chunk-v5a8vpv4.js → chunk-w4244j4n.js} +17766 -17618
  154. package/dist/esm/index.mjs +3 -0
  155. package/dist/esm/internals.mjs +17765 -17617
  156. package/dist/esm/previewEntry.mjs +17570 -17422
  157. package/dist/esm/renderEntry.mjs +2 -2
  158. package/dist/helpers/add-asset-cache-bust.d.ts +4 -0
  159. package/dist/helpers/add-asset-cache-bust.js +10 -0
  160. package/dist/helpers/calculate-timeline.js +2 -1
  161. package/dist/helpers/colors.d.ts +2 -0
  162. package/dist/helpers/colors.js +6 -2
  163. package/dist/helpers/drag-aware-double-click.d.ts +6 -0
  164. package/dist/helpers/drag-aware-double-click.js +20 -0
  165. package/dist/helpers/get-asset-metadata.js +25 -16
  166. package/dist/helpers/get-sequence-double-click-action.d.ts +2 -1
  167. package/dist/helpers/get-sequence-double-click-action.js +7 -1
  168. package/dist/helpers/get-timeline-sequence-layout.d.ts +4 -1
  169. package/dist/helpers/get-timeline-sequence-layout.js +15 -6
  170. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -1
  171. package/dist/helpers/hoverable.d.ts +1 -0
  172. package/dist/helpers/hoverable.js +2 -1
  173. package/dist/helpers/inject-css.js +3 -1
  174. package/dist/helpers/open-in-remotion-convert.d.ts +7 -0
  175. package/dist/helpers/open-in-remotion-convert.js +18 -0
  176. package/dist/helpers/use-media-metadata.d.ts +2 -1
  177. package/dist/helpers/use-media-metadata.js +12 -5
  178. package/dist/helpers/use-menu-structure.js +32 -32
  179. package/dist/icons/align-center-horizontal.js +1 -1
  180. package/dist/icons/align-left.js +1 -1
  181. package/dist/icons/align-right.js +1 -1
  182. package/dist/icons/keyboard.d.ts +4 -0
  183. package/dist/icons/keyboard.js +10 -0
  184. package/dist/icons/license.d.ts +4 -0
  185. package/dist/icons/license.js +8 -0
  186. package/dist/icons/package.d.ts +4 -0
  187. package/dist/icons/package.js +8 -0
  188. package/dist/icons/react.js +1 -1
  189. package/dist/icons/remotion-convert.d.ts +4 -0
  190. package/dist/icons/remotion-convert.js +10 -0
  191. package/dist/icons/skills.d.ts +4 -0
  192. package/dist/icons/skills.js +10 -0
  193. package/dist/state/modals.d.ts +2 -5
  194. package/package.json +12 -12
  195. package/dist/components/KeyboardShortcutsExplainer.d.ts +0 -2
  196. package/dist/components/KeyboardShortcutsExplainer.js +0 -194
@@ -4,7 +4,7 @@ import {
4
4
  WHITE,
5
5
  __require,
6
6
  __toESM
7
- } from "./chunk-s6k99gh2.js";
7
+ } from "./chunk-4bxz1d3g.js";
8
8
 
9
9
  // src/renderEntry.tsx
10
10
  import { useContext, useEffect, useRef, useState } from "react";
@@ -213,7 +213,7 @@ var renderContent = (Root) => {
213
213
  renderToDOM(/* @__PURE__ */ jsx("div", {
214
214
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
215
215
  }));
216
- import("./chunk-v5a8vpv4.js").then(({ StudioInternals }) => {
216
+ import("./chunk-w4244j4n.js").then(({ StudioInternals }) => {
217
217
  window.remotion_isStudio = true;
218
218
  window.remotion_isReadOnlyStudio = true;
219
219
  window.remotion_inputProps = "{}";
@@ -0,0 +1,4 @@
1
+ export declare const addAssetCacheBust: ({ fetchedAt, src, }: {
2
+ fetchedAt: number;
3
+ src: string;
4
+ }) => string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.addAssetCacheBust = void 0;
4
+ const addAssetCacheBust = ({ fetchedAt, src, }) => {
5
+ if (src.startsWith('blob:')) {
6
+ return src;
7
+ }
8
+ return `${src}${src.includes('?') ? '&' : '?'}date=${fetchedAt}`;
9
+ };
10
+ exports.addAssetCacheBust = addAssetCacheBust;
@@ -76,6 +76,7 @@ const calculateTimeline = ({ sequences, overrideIdsToNodePaths, compositions = [
76
76
  },
77
77
  depth: (0, get_timeline_nestedness_1.getTimelineNestedLevel)(sequence, sortedSequences, 0),
78
78
  cascadedStart,
79
+ localStart: sequence.from,
79
80
  cascadedDuration: sequence.duration,
80
81
  keyframeDisplayOffset: hasKeyframeRows
81
82
  ? cascadedStartWithTrim - effectiveFrom
@@ -103,7 +104,7 @@ const calculateTimeline = ({ sequences, overrideIdsToNodePaths, compositions = [
103
104
  return sortKeyA.localeCompare(sortKeyB);
104
105
  })
105
106
  .map((track) => {
106
- const { cascadedDuration, cascadedStart, ...cleanTrack } = track;
107
+ const { cascadedDuration, ...cleanTrack } = track;
107
108
  return cleanTrack;
108
109
  });
109
110
  const nodePathIndexCounters = new Map();
@@ -63,6 +63,8 @@ export declare const INFO_BLUE = "#60a5fa";
63
63
  export declare const SERVER_DISCONNECTED_BACKGROUND = "#e74c3c";
64
64
  export declare const STACK_FRAME_BORDER_BLUE = "rgb(66, 144, 245)";
65
65
  export declare const TIMELINE_BACKGROUND_COLOR = "#15181B";
66
+ export declare const TIMELINE_NEGATIVE_START_BACKGROUND_COLOR = "#2C2F32";
67
+ export declare const TIMELINE_NEGATIVE_START_BORDER_COLOR = "#414446";
66
68
  export declare const TIMELINE_SELECTED_BACKGROUND_COLOR = "#3B3F42";
67
69
  export declare const TIMELINE_SELECTED_LABEL_BACKGROUND_COLOR = "#B0B0B0";
68
70
  export declare const TIMELINE_BLUE = "#0b84ff";
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BLUE_DISABLED = exports.BLUE_HOVERED = exports.BLUE = exports.WARNING_COLOR = exports.FAIL_COLOR = exports.BLACK_OPAQUE = exports.BLACK_ALPHA_90 = exports.BLACK_ALPHA_85 = exports.BLACK_ALPHA_80 = exports.BLACK_ALPHA_60 = exports.BLACK_ALPHA_50 = exports.BLACK_ALPHA_40 = exports.BLACK_ALPHA_30 = exports.BLACK_ALPHA_28 = exports.BLACK_ALPHA_10 = exports.WHITE_ALPHA_80 = exports.WHITE_ALPHA_72 = exports.WHITE_ALPHA_70 = exports.WHITE_ALPHA_60 = exports.WHITE_ALPHA_50 = exports.WHITE_ALPHA_45 = exports.WHITE_ALPHA_40 = exports.WHITE_ALPHA_35 = exports.WHITE_ALPHA_30 = exports.WHITE_ALPHA_25 = exports.WHITE_ALPHA_20 = exports.WHITE_ALPHA_15 = exports.WHITE_ALPHA_12 = exports.WHITE_ALPHA_10 = exports.WHITE_ALPHA_08 = exports.WHITE_ALPHA_06 = exports.WHITE_ALPHA_05 = exports.RULER_COLOR = exports.LIGHT_TEXT = exports.SELECTED_BACKGROUND = exports.LIGHT_COLOR = exports.INPUT_BACKGROUND = exports.BACKGROUND__TRANSPARENT = exports.BACKGROUND_HEX = exports.BACKGROUND = exports.BLACK_FULL_HEX = exports.BLACK_HEX = exports.WHITE_FULL_HEX = exports.WHITE_HEX = exports.CURRENT_COLOR_LOWERCASE = exports.CURRENT_COLOR = exports.TRANSPARENT = exports.RED = exports.WHITE = exports.BLACK = void 0;
4
- exports.FOCUS_BOX_SHADOW = exports.HOT_MIDDLEWARE_WARNING_STYLE = exports.HOT_MIDDLEWARE_ERROR_STYLE = exports.NOTIFICATION_BORDER = exports.COLOR_PICKER_HANDLE_SHADOW = exports.COLOR_PICKER_POPUP_SHADOW = exports.SERVER_DISCONNECTED_SHADOW = exports.NOTIFICATION_SHADOW = exports.SHADOW_BLACK_ALPHA_50_TOWARDS_TOP = exports.SHADOW_BLACK_ALPHA_50_TOWARDS_BOTTOM = exports.SHADOW_BLACK = exports.BORDER_TIMELINE_MARQUEE_BLUE = exports.BORDER_TIMELINE_DROP_BLUE = exports.BORDER_STACK_FRAME_BLUE = exports.BORDER_INFO_BLUE = exports.BORDER_WHITE_ALPHA_20 = exports.BORDER_WHITE_ALPHA_12 = exports.BORDER_BLACK_ALPHA_60 = exports.BORDER_BLACK_ALPHA_50 = exports.BORDER_TRANSPARENT_2PX = exports.BORDER_CURRENT_COLOR = exports.BORDER_WHITE_2PX = exports.BORDER_WHITE = exports.BORDER_BLACK = exports.INFO_BLUE_BACKGROUND = exports.EASING_SELECTED_BACKGROUND = exports.TIMELINE_MARQUEE_BLUE_ALPHA_75 = exports.TIMELINE_MARQUEE_BLUE_ALPHA_16 = exports.TIMELINE_DROP_BLUE_ALPHA_75 = exports.TIMELINE_DROP_BLUE_ALPHA_16 = exports.TIMELINE_DROP_BLUE_ALPHA_12 = exports.TIMELINE_PLAYHEAD_COLOR = exports.TIMELINE_BLUE = exports.TIMELINE_SELECTED_LABEL_BACKGROUND_COLOR = exports.TIMELINE_SELECTED_BACKGROUND_COLOR = exports.TIMELINE_BACKGROUND_COLOR = exports.STACK_FRAME_BORDER_BLUE = exports.SERVER_DISCONNECTED_BACKGROUND = exports.INFO_BLUE = exports.ERROR_LINK_COLOR = exports.ERROR_CODE_FRAME_LINE_BACKGROUND = exports.ERROR_CODE_FRAME_BACKGROUND = exports.RENDER_STATUS_BACKGROUND = exports.NOTIFICATION_BACKGROUND = exports.KEYBOARD_SHORTCUT_KEY_COLOR = exports.LIGHT_GRAY = exports.TIMELINE_TRACK_SEPARATOR = exports.LINE_COLOR = exports.SELECTED_GUIDE = exports.UNSELECTED_GUIDE = void 0;
5
- exports.getBackgroundFromHoverState = exports.TIMELINE_IMAGE_GRADIENT = exports.TIMELINE_VIDEO_GRADIENT = exports.TIMELINE_AUDIO_GRADIENT = exports.LOOPED_INDICATOR_DROP_SHADOW = exports.SELECTED_OUTLINE_UV_DROP_SHADOW = exports.SELECTED_OUTLINE_DROP_SHADOW = exports.ERROR_MESSAGE_MASK_IMAGE = exports.COLOR_PICKER_HUE_GRADIENT = exports.COLOR_PICKER_ALPHA_TRANSPARENT = exports.COLOR_PICKER_SATURATION_BLACK_GRADIENT = exports.COLOR_PICKER_SATURATION_VALUE_GRADIENT = exports.COLOR_PICKER_CHECKER_BACKGROUND_COLOR = exports.COLOR_PICKER_CHECKER_BACKGROUND_IMAGE = exports.CHECKERBOARD_BACKGROUND_IMAGE = void 0;
4
+ exports.HOT_MIDDLEWARE_ERROR_STYLE = exports.NOTIFICATION_BORDER = exports.COLOR_PICKER_HANDLE_SHADOW = exports.COLOR_PICKER_POPUP_SHADOW = exports.SERVER_DISCONNECTED_SHADOW = exports.NOTIFICATION_SHADOW = exports.SHADOW_BLACK_ALPHA_50_TOWARDS_TOP = exports.SHADOW_BLACK_ALPHA_50_TOWARDS_BOTTOM = exports.SHADOW_BLACK = exports.BORDER_TIMELINE_MARQUEE_BLUE = exports.BORDER_TIMELINE_DROP_BLUE = exports.BORDER_STACK_FRAME_BLUE = exports.BORDER_INFO_BLUE = exports.BORDER_WHITE_ALPHA_20 = exports.BORDER_WHITE_ALPHA_12 = exports.BORDER_BLACK_ALPHA_60 = exports.BORDER_BLACK_ALPHA_50 = exports.BORDER_TRANSPARENT_2PX = exports.BORDER_CURRENT_COLOR = exports.BORDER_WHITE_2PX = exports.BORDER_WHITE = exports.BORDER_BLACK = exports.INFO_BLUE_BACKGROUND = exports.EASING_SELECTED_BACKGROUND = exports.TIMELINE_MARQUEE_BLUE_ALPHA_75 = exports.TIMELINE_MARQUEE_BLUE_ALPHA_16 = exports.TIMELINE_DROP_BLUE_ALPHA_75 = exports.TIMELINE_DROP_BLUE_ALPHA_16 = exports.TIMELINE_DROP_BLUE_ALPHA_12 = exports.TIMELINE_PLAYHEAD_COLOR = exports.TIMELINE_BLUE = exports.TIMELINE_SELECTED_LABEL_BACKGROUND_COLOR = exports.TIMELINE_SELECTED_BACKGROUND_COLOR = exports.TIMELINE_NEGATIVE_START_BORDER_COLOR = exports.TIMELINE_NEGATIVE_START_BACKGROUND_COLOR = exports.TIMELINE_BACKGROUND_COLOR = exports.STACK_FRAME_BORDER_BLUE = exports.SERVER_DISCONNECTED_BACKGROUND = exports.INFO_BLUE = exports.ERROR_LINK_COLOR = exports.ERROR_CODE_FRAME_LINE_BACKGROUND = exports.ERROR_CODE_FRAME_BACKGROUND = exports.RENDER_STATUS_BACKGROUND = exports.NOTIFICATION_BACKGROUND = exports.KEYBOARD_SHORTCUT_KEY_COLOR = exports.LIGHT_GRAY = exports.TIMELINE_TRACK_SEPARATOR = exports.LINE_COLOR = exports.SELECTED_GUIDE = exports.UNSELECTED_GUIDE = void 0;
5
+ exports.getBackgroundFromHoverState = exports.TIMELINE_IMAGE_GRADIENT = exports.TIMELINE_VIDEO_GRADIENT = exports.TIMELINE_AUDIO_GRADIENT = exports.LOOPED_INDICATOR_DROP_SHADOW = exports.SELECTED_OUTLINE_UV_DROP_SHADOW = exports.SELECTED_OUTLINE_DROP_SHADOW = exports.ERROR_MESSAGE_MASK_IMAGE = exports.COLOR_PICKER_HUE_GRADIENT = exports.COLOR_PICKER_ALPHA_TRANSPARENT = exports.COLOR_PICKER_SATURATION_BLACK_GRADIENT = exports.COLOR_PICKER_SATURATION_VALUE_GRADIENT = exports.COLOR_PICKER_CHECKER_BACKGROUND_COLOR = exports.COLOR_PICKER_CHECKER_BACKGROUND_IMAGE = exports.CHECKERBOARD_BACKGROUND_IMAGE = exports.FOCUS_BOX_SHADOW = exports.HOT_MIDDLEWARE_WARNING_STYLE = void 0;
6
6
  exports.BLACK = 'black';
7
7
  exports.WHITE = 'white';
8
8
  exports.RED = 'red';
@@ -69,6 +69,10 @@ exports.INFO_BLUE = '#60a5fa';
69
69
  exports.SERVER_DISCONNECTED_BACKGROUND = '#e74c3c';
70
70
  exports.STACK_FRAME_BORDER_BLUE = 'rgb(66, 144, 245)';
71
71
  exports.TIMELINE_BACKGROUND_COLOR = '#15181B';
72
+ // WHITE_ALPHA_10 composited over TIMELINE_BACKGROUND_COLOR.
73
+ exports.TIMELINE_NEGATIVE_START_BACKGROUND_COLOR = '#2C2F32';
74
+ // WHITE_ALPHA_10 composited over TIMELINE_NEGATIVE_START_BACKGROUND_COLOR.
75
+ exports.TIMELINE_NEGATIVE_START_BORDER_COLOR = '#414446';
72
76
  exports.TIMELINE_SELECTED_BACKGROUND_COLOR = '#3B3F42';
73
77
  exports.TIMELINE_SELECTED_LABEL_BACKGROUND_COLOR = '#B0B0B0';
74
78
  exports.TIMELINE_BLUE = '#0b84ff';
@@ -0,0 +1,6 @@
1
+ export type DragAwareDoubleClickTracker = {
2
+ readonly beginPointerGesture: () => void;
3
+ readonly endPointerGesture: (wasDragged: boolean) => void;
4
+ readonly consumePointerGestureWasDragged: () => boolean;
5
+ };
6
+ export declare const createDragAwareDoubleClickTracker: () => DragAwareDoubleClickTracker;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDragAwareDoubleClickTracker = void 0;
4
+ const createDragAwareDoubleClickTracker = () => {
5
+ let pointerGestureWasDragged = false;
6
+ return {
7
+ beginPointerGesture: () => {
8
+ pointerGestureWasDragged = false;
9
+ },
10
+ endPointerGesture: (wasDragged) => {
11
+ pointerGestureWasDragged = wasDragged;
12
+ },
13
+ consumePointerGestureWasDragged: () => {
14
+ const wasDragged = pointerGestureWasDragged;
15
+ pointerGestureWasDragged = false;
16
+ return wasDragged;
17
+ },
18
+ };
19
+ };
20
+ exports.createDragAwareDoubleClickTracker = createDragAwareDoubleClickTracker;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getAssetMetadata = exports.remotion_outputsBase = void 0;
4
4
  const media_utils_1 = require("@remotion/media-utils");
5
5
  const remotion_1 = require("remotion");
6
+ const add_asset_cache_bust_1 = require("./add-asset-cache-bust");
6
7
  const get_preview_file_type_1 = require("./get-preview-file-type");
7
8
  exports.remotion_outputsBase = window.remotion_staticBase.replace('static', 'outputs');
8
9
  const getSrcFromCanvasContent = (canvasContent) => {
@@ -12,6 +13,7 @@ const getSrcFromCanvasContent = (canvasContent) => {
12
13
  return exports.remotion_outputsBase + canvasContent.path;
13
14
  };
14
15
  const getAssetMetadata = async (canvasContent, addTime) => {
16
+ var _a;
15
17
  if (canvasContent.type === 'output-blob') {
16
18
  return {
17
19
  type: 'found',
@@ -25,27 +27,34 @@ const getAssetMetadata = async (canvasContent, addTime) => {
25
27
  }
26
28
  try {
27
29
  const src = getSrcFromCanvasContent(canvasContent);
28
- const file = await fetch(src, {
29
- method: 'HEAD',
30
- });
31
- if (file.status === 404) {
32
- return { type: 'not-found' };
33
- }
34
- if (file.status !== 200) {
35
- throw new Error(`Expected status code 200 or 404 for file, got ${file.status}`);
36
- }
37
- const size = file.headers.get('content-length');
38
- if (!size) {
39
- throw new Error('Unexpected error: content-length is null');
30
+ const listedStaticFile = canvasContent.type === 'asset'
31
+ ? window.remotion_staticFiles.find((file) => file.name === canvasContent.asset && file.src === src)
32
+ : null;
33
+ let size = (_a = listedStaticFile === null || listedStaticFile === void 0 ? void 0 : listedStaticFile.sizeInBytes) !== null && _a !== void 0 ? _a : null;
34
+ if (size === null) {
35
+ const file = await fetch(src, {
36
+ method: 'HEAD',
37
+ });
38
+ if (file.status === 404) {
39
+ return { type: 'not-found' };
40
+ }
41
+ if (file.status !== 200) {
42
+ throw new Error(`Expected status code 200 or 404 for file, got ${file.status}`);
43
+ }
44
+ const contentLength = file.headers.get('content-length');
45
+ if (!contentLength) {
46
+ throw new Error('Unexpected error: content-length is null');
47
+ }
48
+ size = Number(contentLength);
40
49
  }
41
50
  const fetchedAt = Date.now();
42
- const srcWithTime = addTime ? `${src}?date=${fetchedAt}` : src;
51
+ const srcWithTime = addTime ? (0, add_asset_cache_bust_1.addAssetCacheBust)({ fetchedAt, src }) : src;
43
52
  const fileType = (0, get_preview_file_type_1.getPreviewFileType)(src);
44
53
  if (fileType === 'video') {
45
54
  const resolution = await (0, media_utils_1.getVideoMetadata)(srcWithTime);
46
55
  return {
47
56
  type: 'found',
48
- size: Number(size),
57
+ size,
49
58
  dimensions: { width: resolution.width, height: resolution.height },
50
59
  fetchedAt,
51
60
  };
@@ -56,7 +65,7 @@ const getAssetMetadata = async (canvasContent, addTime) => {
56
65
  img.onload = () => {
57
66
  resolve({
58
67
  type: 'found',
59
- size: Number(size),
68
+ size,
60
69
  dimensions: { width: img.width, height: img.height },
61
70
  fetchedAt,
62
71
  });
@@ -71,7 +80,7 @@ const getAssetMetadata = async (canvasContent, addTime) => {
71
80
  return {
72
81
  type: 'found',
73
82
  dimensions: 'none',
74
- size: Number(size),
83
+ size,
75
84
  fetchedAt,
76
85
  };
77
86
  }
@@ -1,9 +1,10 @@
1
1
  import type { TSequence } from 'remotion';
2
2
  export type SequenceDoubleClickAction = 'open-connected-composition' | 'open-in-editor';
3
- export declare const getSequenceDoubleClickAction: ({ button, canOpenInEditor, numberOfConnectedCompositions, }: {
3
+ export declare const getSequenceDoubleClickAction: ({ button, canOpenInEditor, numberOfConnectedCompositions, sequenceWasDragged, }: {
4
4
  readonly button: number;
5
5
  readonly canOpenInEditor: boolean;
6
6
  readonly numberOfConnectedCompositions: number;
7
+ readonly sequenceWasDragged: boolean;
7
8
  }) => SequenceDoubleClickAction | null;
8
9
  export declare const getConnectedCompositionFrame: ({ timelinePosition, sequence, sequenceFrameOffset, }: {
9
10
  readonly timelinePosition: number;
@@ -1,7 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getConnectedCompositionFrame = exports.getSequenceDoubleClickAction = void 0;
4
- const getSequenceDoubleClickAction = ({ button, canOpenInEditor, numberOfConnectedCompositions, }) => {
4
+ const getSequenceDoubleClickAction = ({ button, canOpenInEditor, numberOfConnectedCompositions, sequenceWasDragged, }) => {
5
+ // The browser still fires `dblclick` when the second press of a
6
+ // double-click turned into a drag. That gesture is a drag, not a
7
+ // double-click.
8
+ if (sequenceWasDragged) {
9
+ return null;
10
+ }
5
11
  if (button !== 0) {
6
12
  return null;
7
13
  }
@@ -1,8 +1,9 @@
1
1
  import type { VideoConfig } from 'remotion';
2
2
  export declare const SEQUENCE_BORDER_WIDTH = 1;
3
- export declare const getTimelineSequenceLayout: ({ durationInFrames, startFrom, maxMediaDuration, startFromMedia, video, windowWidth, premountDisplay, postmountDisplay, }: {
3
+ export declare const getTimelineSequenceLayout: ({ durationInFrames, startFrom, cascadedStart, maxMediaDuration, startFromMedia, video, windowWidth, premountDisplay, postmountDisplay, }: {
4
4
  durationInFrames: number;
5
5
  startFrom: number;
6
+ cascadedStart: number;
6
7
  startFromMedia: number;
7
8
  maxMediaDuration: number | null;
8
9
  video: VideoConfig;
@@ -13,6 +14,8 @@ export declare const getTimelineSequenceLayout: ({ durationInFrames, startFrom,
13
14
  marginLeft: number;
14
15
  width: number;
15
16
  naturalWidth: number;
17
+ negativeStartWidth: number;
18
+ negativeStartClipped: boolean;
16
19
  premountWidth: number | null;
17
20
  postmountWidth: number | null;
18
21
  };
@@ -10,16 +10,23 @@ const getWidthOfTrack = ({ durationInFrames, timelineDuration, windowWidth, spat
10
10
  : (spatialDuration / timelineDuration) * fullWidth;
11
11
  return Math.max(0, base - exports.SEQUENCE_BORDER_WIDTH + nonNegativeMarginLeft);
12
12
  };
13
- const getTimelineSequenceLayout = ({ durationInFrames, startFrom, maxMediaDuration, startFromMedia, video, windowWidth, premountDisplay, postmountDisplay, }) => {
13
+ const getTimelineSequenceLayout = ({ durationInFrames, startFrom, cascadedStart, maxMediaDuration, startFromMedia, video, windowWidth, premountDisplay, postmountDisplay, }) => {
14
14
  var _a;
15
15
  const maxMediaSequenceDuration = (maxMediaDuration !== null && maxMediaDuration !== void 0 ? maxMediaDuration : Infinity) - startFromMedia;
16
16
  const timelineDuration = (_a = video.durationInFrames) !== null && _a !== void 0 ? _a : 1;
17
+ const fullWidth = windowWidth - timeline_layout_1.TIMELINE_PADDING * 2;
17
18
  const spatialDuration = Math.max(0, Math.min(maxMediaSequenceDuration, durationInFrames, timelineDuration - startFrom));
18
19
  // Unclipped spatial duration: without the timeline-end constraint
19
20
  const naturalSpatialDuration = Math.max(0, Math.min(maxMediaSequenceDuration, durationInFrames));
20
- const marginLeft = timelineDuration <= 0
21
- ? 0
22
- : (startFrom / timelineDuration) * (windowWidth - timeline_layout_1.TIMELINE_PADDING * 2);
21
+ const marginLeft = timelineDuration <= 0 ? 0 : (startFrom / timelineDuration) * fullWidth;
22
+ const naturalNegativeStartWidth = timelineDuration > 0 &&
23
+ startFrom === 0 &&
24
+ cascadedStart < 0 &&
25
+ durationInFrames > 0
26
+ ? Math.max(0, (-cascadedStart / timelineDuration) * fullWidth)
27
+ : 0;
28
+ const negativeStartWidth = Math.min(timeline_layout_1.TIMELINE_PADDING, naturalNegativeStartWidth);
29
+ const negativeStartClipped = naturalNegativeStartWidth > timeline_layout_1.TIMELINE_PADDING;
23
30
  const nonNegativeMarginLeft = Math.min(marginLeft, 0);
24
31
  const width = getWidthOfTrack({
25
32
  durationInFrames,
@@ -54,9 +61,11 @@ const getTimelineSequenceLayout = ({ durationInFrames, startFrom, maxMediaDurati
54
61
  })
55
62
  : null;
56
63
  return {
57
- marginLeft: Math.max(marginLeft, 0) - (premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0),
58
- width: width + (premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0) + (postmountWidth !== null && postmountWidth !== void 0 ? postmountWidth : 0),
64
+ marginLeft: Math.max(marginLeft, 0) - negativeStartWidth - (premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0),
65
+ width: width + negativeStartWidth + (premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0) + (postmountWidth !== null && postmountWidth !== void 0 ? postmountWidth : 0),
59
66
  naturalWidth: naturalWidth + (premountWidth !== null && premountWidth !== void 0 ? premountWidth : 0) + (postmountWidth !== null && postmountWidth !== void 0 ? postmountWidth : 0),
67
+ negativeStartWidth,
68
+ negativeStartClipped,
60
69
  premountWidth,
61
70
  postmountWidth,
62
71
  };
@@ -13,9 +13,10 @@ export type TimelineTrackData = {
13
13
  nodePathInfo: SequenceNodePathInfo | null;
14
14
  keyframeDisplayOffset: number;
15
15
  sequenceFrameOffset: number;
16
+ cascadedStart: number;
17
+ localStart: number;
16
18
  };
17
19
  export type TimelineTrackWithOriginalTimings = TimelineTrackData & {
18
- cascadedStart: number;
19
20
  cascadedDuration: number;
20
21
  };
21
22
  export declare const getTimelineSequenceSortKey: (track: TimelineTrackData, tracks: TimelineTrackData[], nonceRanks: Map<string, number>) => string;
@@ -2,6 +2,7 @@ import type React from 'react';
2
2
  export declare const HOVERABLE_CLASS_NAME = "__remotion-hoverable";
3
3
  export declare const HOVER_GROUP_CLASS_NAME = "__remotion-hover-group";
4
4
  export declare const HOVER_GROUP_REVEAL_CLASS_NAME = "__remotion-hover-group-reveal";
5
+ export declare const FOCUS_VISIBLE_ONLY_CLASS_NAME = "__remotion-focus-visible-only";
5
6
  export declare const hoverableStyle: ({ idleBackground, hoverBackground, idleColor, hoverColor, }: {
6
7
  idleBackground: string;
7
8
  hoverBackground: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeHoverableCSS = exports.hoverableStyle = exports.HOVER_GROUP_REVEAL_CLASS_NAME = exports.HOVER_GROUP_CLASS_NAME = exports.HOVERABLE_CLASS_NAME = void 0;
3
+ exports.makeHoverableCSS = exports.hoverableStyle = exports.FOCUS_VISIBLE_ONLY_CLASS_NAME = exports.HOVER_GROUP_REVEAL_CLASS_NAME = exports.HOVER_GROUP_CLASS_NAME = exports.HOVERABLE_CLASS_NAME = void 0;
4
4
  const colors_1 = require("./colors");
5
5
  // Purely visual hover styling must be driven by CSS `:hover` rather than
6
6
  // React state: When the Studio runs in an <iframe> (like in Browser Studio),
@@ -11,6 +11,7 @@ const colors_1 = require("./colors");
11
11
  exports.HOVERABLE_CLASS_NAME = '__remotion-hoverable';
12
12
  exports.HOVER_GROUP_CLASS_NAME = '__remotion-hover-group';
13
13
  exports.HOVER_GROUP_REVEAL_CLASS_NAME = '__remotion-hover-group-reveal';
14
+ exports.FOCUS_VISIBLE_ONLY_CLASS_NAME = '__remotion-focus-visible-only';
14
15
  const BG_VARIABLE = '--remotion-hoverable-bg';
15
16
  const HOVER_BG_VARIABLE = '--remotion-hoverable-hover-bg';
16
17
  const COLOR_VARIABLE = '--remotion-hoverable-color';
@@ -58,7 +58,7 @@ const makeDefaultGlobalCSS = () => {
58
58
 
59
59
  input:focus,
60
60
  textarea:focus,
61
- button:focus:not(.__remotion_input_dragger):not(.__remotion_color_swatch):not(.__remotion-inspector-section-title):not(.__remotion-timeline-expand-arrow-button),
61
+ button:focus:not(.__remotion_input_dragger):not(.__remotion_color_swatch):not(.__remotion-inspector-section-title):not(.${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}):not(.__remotion-timeline-expand-arrow-button),
62
62
  a:focus {
63
63
  outline: none;
64
64
  box-shadow: ${colors_1.FOCUS_BOX_SHADOW};
@@ -67,6 +67,7 @@ const makeDefaultGlobalCSS = () => {
67
67
  .__remotion-composition-selector-item:focus,
68
68
  .__remotion-inspector-quick-action:focus,
69
69
  .__remotion-inspector-section-title:focus,
70
+ .${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}:focus,
70
71
  .__remotion-timeline-expand-arrow-button:focus {
71
72
  outline: none;
72
73
  box-shadow: none;
@@ -75,6 +76,7 @@ const makeDefaultGlobalCSS = () => {
75
76
  .__remotion-composition-selector-item:focus-visible,
76
77
  .__remotion-inspector-quick-action:focus-visible,
77
78
  .__remotion-inspector-section-title:focus-visible,
79
+ .${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}:focus-visible,
78
80
  .__remotion-timeline-expand-arrow-button:focus-visible {
79
81
  box-shadow: ${colors_1.FOCUS_BOX_SHADOW};
80
82
  }
@@ -0,0 +1,7 @@
1
+ export declare const getRemotionConvertUrl: ({ relativePath, studioOrigin, }: {
2
+ relativePath: string;
3
+ studioOrigin: string;
4
+ }) => string;
5
+ export declare const openInRemotionConvert: ({ relativePath, }: {
6
+ relativePath: string;
7
+ }) => void;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openInRemotionConvert = exports.getRemotionConvertUrl = void 0;
4
+ const remotion_1 = require("remotion");
5
+ const getRemotionConvertUrl = ({ relativePath, studioOrigin, }) => {
6
+ const convertUrl = new URL('https://www.remotion.dev/convert');
7
+ const assetUrl = new URL((0, remotion_1.staticFile)(relativePath), studioOrigin);
8
+ convertUrl.searchParams.set('url', assetUrl.toString());
9
+ return convertUrl.toString();
10
+ };
11
+ exports.getRemotionConvertUrl = getRemotionConvertUrl;
12
+ const openInRemotionConvert = ({ relativePath, }) => {
13
+ window.open((0, exports.getRemotionConvertUrl)({
14
+ relativePath,
15
+ studioOrigin: window.location.origin,
16
+ }), '_blank', 'noopener,noreferrer');
17
+ };
18
+ exports.openInRemotionConvert = openInRemotionConvert;
@@ -1,4 +1,4 @@
1
- import type { InputAudioTrack, InputVideoTrack } from 'mediabunny';
1
+ import type { FrameRateMetrics, InputAudioTrack, InputVideoTrack } from 'mediabunny';
2
2
  export type MediaMetadata = {
3
3
  duration: number;
4
4
  format: string | null;
@@ -12,6 +12,7 @@ export type MediaMetadata = {
12
12
  hasVideoTrack: boolean | null;
13
13
  hasAudioTrack: boolean | null;
14
14
  };
15
+ export declare const getFrameRateFromMetrics: (metrics: Pick<FrameRateMetrics, "bestGuessFrameRate" | "probedPacketCount"> | null) => number | null;
15
16
  export declare const getCachedMediaMetadata: (src: string) => MediaMetadata | null;
16
17
  export declare const getMediaMetadata: (src: string) => Promise<MediaMetadata | null>;
17
18
  export declare const useMediaMetadata: (src: string | null) => MediaMetadata | null;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useMediaMetadata = exports.getMediaMetadata = exports.getCachedMediaMetadata = void 0;
3
+ exports.useMediaMetadata = exports.getMediaMetadata = exports.getCachedMediaMetadata = exports.getFrameRateFromMetrics = void 0;
4
4
  const media_utils_1 = require("@remotion/media-utils");
5
5
  const mediabunny_1 = require("mediabunny");
6
6
  const react_1 = require("react");
@@ -8,6 +8,13 @@ const remotion_1 = require("remotion");
8
8
  const get_duration_or_compute_1 = require("./get-duration-or-compute");
9
9
  const cache = new Map();
10
10
  const pendingRequests = new Map();
11
+ const getFrameRateFromMetrics = (metrics) => {
12
+ if (metrics === null || metrics.probedPacketCount < 2) {
13
+ return null;
14
+ }
15
+ return metrics.bestGuessFrameRate;
16
+ };
17
+ exports.getFrameRateFromMetrics = getFrameRateFromMetrics;
11
18
  const getCachedMediaMetadata = (src) => {
12
19
  var _a;
13
20
  return (_a = cache.get(src)) !== null && _a !== void 0 ? _a : null;
@@ -22,7 +29,7 @@ const safeCall = async (fn) => {
22
29
  }
23
30
  };
24
31
  const getMediabunnyMetadata = async (src) => {
25
- var _a, _b;
32
+ var _a;
26
33
  const lease = (() => {
27
34
  try {
28
35
  return remotion_1.Internals.globalMediaResourceManager.acquire({
@@ -62,11 +69,11 @@ const getMediabunnyMetadata = async (src) => {
62
69
  if (duration === null) {
63
70
  return null;
64
71
  }
65
- const [width, height, videoCodec, packetStats, isHdr, audioCodec, sampleRate,] = await Promise.all([
72
+ const [width, height, videoCodec, frameRateMetrics, isHdr, audioCodec, sampleRate,] = await Promise.all([
66
73
  videoTrack ? safeCall(() => videoTrack.getDisplayWidth()) : null,
67
74
  videoTrack ? safeCall(() => videoTrack.getDisplayHeight()) : null,
68
75
  videoTrack ? safeCall(() => videoTrack.getCodec()) : null,
69
- videoTrack ? safeCall(() => videoTrack.computePacketStats(50)) : null,
76
+ videoTrack ? safeCall(() => videoTrack.computeFrameRateMetrics()) : null,
70
77
  videoTrack ? safeCall(() => videoTrack.hasHighDynamicRange()) : null,
71
78
  audioTrack ? safeCall(() => audioTrack.getCodec()) : null,
72
79
  audioTrack ? safeCall(() => audioTrack.getSampleRate()) : null,
@@ -78,7 +85,7 @@ const getMediabunnyMetadata = async (src) => {
78
85
  height,
79
86
  videoCodec,
80
87
  audioCodec,
81
- fps: (_b = packetStats === null || packetStats === void 0 ? void 0 : packetStats.averagePacketRate) !== null && _b !== void 0 ? _b : null,
88
+ fps: (0, exports.getFrameRateFromMetrics)(frameRateMetrics),
82
89
  isHdr,
83
90
  sampleRate,
84
91
  hasVideoTrack: Boolean(videoTrack),
@@ -304,29 +304,28 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
304
304
  subMenu: null,
305
305
  quickSwitcherLabel: 'Help: Changelog',
306
306
  },
307
- browserStudioOperations === null
308
- ? {
309
- id: 'settings',
310
- value: 'settings',
311
- label: 'Settings...',
312
- onClick: () => {
313
- var _a;
314
- var _b;
315
- closeMenu();
316
- setSelectedModal({
317
- type: 'settings',
318
- initialTab: 'rendering',
319
- initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
320
- });
321
- },
322
- type: 'item',
323
- keyHint: null,
324
- leftItem: null,
325
- subMenu: null,
326
- quickSwitcherLabel: 'Settings...',
327
- disabled: readOnlyStudio || type !== 'connected',
328
- }
329
- : null,
307
+ {
308
+ id: 'settings',
309
+ value: 'settings',
310
+ label: 'Settings...',
311
+ onClick: () => {
312
+ var _a;
313
+ var _b;
314
+ closeMenu();
315
+ setSelectedModal({
316
+ type: 'settings',
317
+ initialTab: browserStudioOperations === null ? 'rendering' : 'shortcuts',
318
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
319
+ });
320
+ },
321
+ type: 'item',
322
+ keyHint: null,
323
+ leftItem: null,
324
+ subMenu: null,
325
+ quickSwitcherLabel: 'Settings...',
326
+ disabled: (browserStudioOperations === null && readOnlyStudio) ||
327
+ type !== 'connected',
328
+ },
330
329
  {
331
330
  id: 'acknowledgements',
332
331
  value: 'acknowledgements',
@@ -789,12 +788,13 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
789
788
  value: 'install-packages',
790
789
  label: 'Install package...',
791
790
  onClick: () => {
791
+ var _a;
792
+ var _b;
792
793
  closeMenu();
793
794
  setSelectedModal({
794
- type: 'install-packages',
795
- packageManager: remotion_packageManager === 'unknown'
796
- ? null
797
- : remotion_packageManager,
795
+ type: 'settings',
796
+ initialTab: 'packages',
797
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
798
798
  });
799
799
  },
800
800
  type: 'item',
@@ -818,13 +818,13 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
818
818
  ? 'Shortcuts (disabled)'
819
819
  : 'Shortcuts',
820
820
  onClick: () => {
821
+ var _a;
822
+ var _b;
821
823
  closeMenu();
822
824
  setSelectedModal({
823
- type: 'quick-switcher',
824
- mode: 'docs',
825
- invocationTimestamp: Date.now(),
826
- assetSelection: null,
827
- compositionSelection: null,
825
+ type: 'settings',
826
+ initialTab: 'shortcuts',
827
+ initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
828
828
  });
829
829
  },
830
830
  keyHint: '?',
@@ -6,7 +6,7 @@ const AlignCenterHorizontalIcon = (props) => {
6
6
  var _a;
7
7
  const color = (_a = props.color) !== null && _a !== void 0 ? _a : 'currentColor';
8
8
  return (jsx_runtime_1.jsxs("svg", { ...props, viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [
9
- jsx_runtime_1.jsx("path", { d: "M8 2V14", stroke: color, strokeOpacity: "0.5", strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "3", y1: "6", x2: "12", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "10", x2: "11", y2: "10", stroke: color, strokeWidth: "2" })
9
+ jsx_runtime_1.jsx("path", { d: "M8 2V14", stroke: color, strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "3", y1: "6", x2: "12", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "10", x2: "11", y2: "10", stroke: color, strokeWidth: "2" })
10
10
  ] }));
11
11
  };
12
12
  exports.AlignCenterHorizontalIcon = AlignCenterHorizontalIcon;
@@ -6,7 +6,7 @@ const AlignLeftIcon = (props) => {
6
6
  var _a;
7
7
  const color = (_a = props.color) !== null && _a !== void 0 ? _a : 'currentColor';
8
8
  return (jsx_runtime_1.jsxs("svg", { ...props, viewBox: "0 0 16 16", fill: "none", children: [
9
- jsx_runtime_1.jsx("path", { d: "M2 2L2 14", stroke: color, strokeOpacity: "0.5", strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "6", x2: "13", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "10", x2: "11", y2: "10", stroke: color, strokeWidth: "2" })
9
+ jsx_runtime_1.jsx("path", { d: "M2 2L2 14", stroke: color, strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "6", x2: "13", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "4", y1: "10", x2: "11", y2: "10", stroke: color, strokeWidth: "2" })
10
10
  ] }));
11
11
  };
12
12
  exports.AlignLeftIcon = AlignLeftIcon;
@@ -6,7 +6,7 @@ const AlignRightIcon = (props) => {
6
6
  var _a;
7
7
  const color = (_a = props.color) !== null && _a !== void 0 ? _a : 'currentColor';
8
8
  return (jsx_runtime_1.jsxs("svg", { ...props, viewBox: "0 0 16 16", fill: "none", children: [
9
- jsx_runtime_1.jsx("path", { d: "M14 2V14", stroke: color, strokeOpacity: "0.5", strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "3", y1: "6", x2: "12", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "5", y1: "10", x2: "12", y2: "10", stroke: color, strokeWidth: "2" })
9
+ jsx_runtime_1.jsx("path", { d: "M14 2V14", stroke: color, strokeLinecap: "square" }), jsx_runtime_1.jsx("line", { x1: "3", y1: "6", x2: "12", y2: "6", stroke: color, strokeWidth: "2" }), jsx_runtime_1.jsx("line", { x1: "5", y1: "10", x2: "12", y2: "10", stroke: color, strokeWidth: "2" })
10
10
  ] }));
11
11
  };
12
12
  exports.AlignRightIcon = AlignRightIcon;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const KeyboardIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ readonly color: string;
4
+ }>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KeyboardIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // Font Awesome Pro v7.3.1, Copyright 2026 Fonticons, Inc.
6
+ // https://fontawesome.com/license (Commercial License)
7
+ const KeyboardIcon = ({ color, ...props }) => {
8
+ return (jsx_runtime_1.jsx("svg", { ...props, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", children: jsx_runtime_1.jsx("path", { fill: color, d: "M96 192l64 0 0 128-64 0c-53 0-96 43-96 96s43 96 96 96 96-43 96-96l0-64 128 0 0 64c0 53 43 96 96 96s96-43 96-96-43-96-96-96l-64 0 0-128 64 0c53 0 96-43 96-96s-43-96-96-96-96 43-96 96l0 64-128 0 0-64c0-53-43-96-96-96S0 43 0 96 43 192 96 192zM256 320l-64 0 0-128 128 0 0 128-64 0zM96 160c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64l0 64-64 0zm64 256c0 35.3-28.7 64-64 64s-64-28.7-64-64 28.7-64 64-64l64 0 0 64zM352 160l0-64c0-35.3 28.7-64 64-64s64 28.7 64 64-28.7 64-64 64l-64 0zm64 192c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64l0-64 64 0z" }) }));
9
+ };
10
+ exports.KeyboardIcon = KeyboardIcon;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const LicenseIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ readonly color: string;
4
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LicenseIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const LicenseIcon = ({ color, ...props }) => {
6
+ return (jsx_runtime_1.jsx("svg", { ...props, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 -40 512 593", children: jsx_runtime_1.jsx("path", { fill: color, d: "M309.4-7.4L256-40 202.6-7.4 140-8.9 110 46 55.1 76 56.6 138.6 24 192 56.6 245.4 55.1 308 110 338 128 371 128 552.3c1-.4 43.6-18.7 128-54.9 84.4 36.2 127 54.4 128 54.9l0-181.3 18-33 54.9-30-1.5-62.6 32.6-53.4-32.6-53.4 1.5-62.6-54.9-30-30-54.9-62.6 1.5zM160 503.7l0-111.3 42.6-1 53.4 32.6 53.4-32.6 42.6 1 0 111.3-89.7-38.4-6.3-2.7-6.3 2.7-89.7 38.4zM353.3 23.5l20.7 37.8 4.5 8.2c.6 .3 15.9 8.7 46 25.2-.8 34.3-1.2 51.8-1.2 52.5 .3 .5 9.4 15.5 27.3 44.8-17.9 29.3-27 44.3-27.3 44.8 0 .6 .4 18.1 1.2 52.5l-37.8 20.7-8.2 4.5-4.5 8.2-20.7 37.8c-34.3-.8-51.8-1.2-52.5-1.2-.5 .3-15.5 9.4-44.8 27.3-29.3-17.9-44.3-27-44.8-27.3-.6 0-18.1 .4-52.5 1.2-16.5-30.1-24.9-45.5-25.2-46l-8.2-4.5-37.8-20.7c.8-34.3 1.2-51.8 1.2-52.5-.3-.5-9.4-15.5-27.3-44.8 17.9-29.3 27-44.3 27.3-44.8 0-.6-.4-18.1-1.2-52.5 30.1-16.5 45.5-24.9 46-25.2 .3-.6 8.7-15.9 25.2-46 34.3 .8 51.8 1.2 52.5 1.2 .5-.3 15.5-9.4 44.8-27.3 29.3 17.9 44.3 27 44.8 27.3 .6 0 18.1-.4 52.5-1.2zM336 192a80 80 0 1 1 -160 0 80 80 0 1 1 160 0zM256 80a112 112 0 1 0 0 224 112 112 0 1 0 0-224z" }) }));
7
+ };
8
+ exports.LicenseIcon = LicenseIcon;