@remotion/studio 4.0.514 → 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 (222) hide show
  1. package/dist/api/install-package.js +14 -1
  2. package/dist/api/restart-studio.js +4 -0
  3. package/dist/components/AssetSelector.js +3 -9
  4. package/dist/components/AssetSelectorItem.d.ts +3 -1
  5. package/dist/components/AssetSelectorItem.js +41 -42
  6. package/dist/components/AudioWaveform.js +17 -139
  7. package/dist/components/Canvas.js +7 -4
  8. package/dist/components/CaptionInspector.d.ts +2 -0
  9. package/dist/components/CaptionInspector.js +3 -5
  10. package/dist/components/CompositionSelector.js +6 -3
  11. package/dist/components/CompositionSelectorItem.js +9 -10
  12. package/dist/components/ConfigSelect.d.ts +17 -0
  13. package/dist/components/ConfigSelect.js +50 -0
  14. package/dist/components/CurrentAsset.d.ts +10 -2
  15. package/dist/components/CurrentAsset.js +139 -46
  16. package/dist/components/FixComputedValueModal.js +54 -51
  17. package/dist/components/GlobalKeybindings.js +5 -5
  18. package/dist/components/InlineAction.d.ts +1 -1
  19. package/dist/components/InlineAction.js +12 -2
  20. package/dist/components/InlineCaptionInspector.d.ts +2 -0
  21. package/dist/components/InlineCaptionInspector.js +2 -2
  22. package/dist/components/InlineCompositionName.js +1 -1
  23. package/dist/components/InlineEditableTitle.js +3 -2
  24. package/dist/components/InspectorInfoHeader.js +1 -1
  25. package/dist/components/InspectorOpenInEditor.js +48 -72
  26. package/dist/components/InspectorPanel/AlignmentControls.js +2 -3
  27. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +7 -0
  28. package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +39 -0
  29. package/dist/components/InspectorPanel/CompositionInspector.js +41 -12
  30. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +10 -4
  31. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -1
  32. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -4
  33. package/dist/components/InspectorPanel/common.d.ts +0 -12
  34. package/dist/components/InspectorPanel/common.js +3 -52
  35. package/dist/components/InspectorPanel/use-composition-actions.js +0 -1
  36. package/dist/components/InspectorPanelLayout.d.ts +1 -1
  37. package/dist/components/InspectorPanelLayout.js +1 -1
  38. package/dist/components/InspectorSequenceSection.js +40 -54
  39. package/dist/components/InstallPackage.d.ts +3 -2
  40. package/dist/components/InstallPackage.js +90 -28
  41. package/dist/components/InstallablePackage.js +37 -11
  42. package/dist/components/KeyboardShortcutsSettings.d.ts +2 -0
  43. package/dist/components/KeyboardShortcutsSettings.js +177 -0
  44. package/dist/components/Menu/MenuDivider.js +1 -1
  45. package/dist/components/MenuBuildIndicator.js +1 -1
  46. package/dist/components/Modals.js +12 -4
  47. package/dist/components/NewComposition/CodemodFooter.d.ts +0 -1
  48. package/dist/components/NewComposition/CodemodFooter.js +2 -8
  49. package/dist/components/NewComposition/DeleteComposition.js +1 -1
  50. package/dist/components/NewComposition/DeleteFolder.js +1 -1
  51. package/dist/components/NewComposition/DuplicateComposition.js +1 -1
  52. package/dist/components/NewComposition/InputDragger.js +27 -4
  53. package/dist/components/NewComposition/NewComposition.js +1 -1
  54. package/dist/components/NewComposition/NewFolder.js +1 -3
  55. package/dist/components/NewComposition/RenameComposition.js +1 -1
  56. package/dist/components/NewComposition/RenameFolder.js +1 -1
  57. package/dist/components/NewComposition/use-rename-static-file.js +1 -1
  58. package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
  59. package/dist/components/Notifications/NotificationCenter.js +5 -0
  60. package/dist/components/OptionsPanel.js +9 -12
  61. package/dist/components/PreviewToolbar.js +5 -2
  62. package/dist/components/PreviewToolbarOverflowButton.js +30 -0
  63. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +2 -2
  64. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +14 -30
  65. package/dist/components/RenderButton.js +66 -183
  66. package/dist/components/RenderModal/DataEditor.js +15 -12
  67. package/dist/components/RenderModal/GuiRenderStatus.js +3 -1
  68. package/dist/components/RenderModal/RenderModalOutputName.js +3 -3
  69. package/dist/components/RenderModal/RenderStatusModal.js +0 -1
  70. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +3 -1
  71. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.d.ts +15 -0
  72. package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.js +95 -0
  73. package/dist/components/RenderModal/WebRenderModal.js +4 -2
  74. package/dist/components/RenderQueue/RenderQueueItem.js +3 -1
  75. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +3 -1
  76. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +2 -7
  77. package/dist/components/RenderingSettings.js +7 -4
  78. package/dist/components/RulersAndGuidesToggle.d.ts +2 -0
  79. package/dist/components/RulersAndGuidesToggle.js +23 -0
  80. package/dist/components/SegmentedButton.d.ts +29 -0
  81. package/dist/components/SegmentedButton.js +226 -0
  82. package/dist/components/SelectedOutlineCanvasRotation.d.ts +1 -0
  83. package/dist/components/SelectedOutlineCanvasRotation.js +11 -4
  84. package/dist/components/SelectedOutlineEditingHandles.d.ts +16 -0
  85. package/dist/components/SelectedOutlineEditingHandles.js +66 -0
  86. package/dist/components/SelectedOutlineElement.d.ts +2 -4
  87. package/dist/components/SelectedOutlineElement.js +15 -54
  88. package/dist/components/SelectedOutlineOverlay.js +32 -6
  89. package/dist/components/SelectedOutlinePolygon.d.ts +4 -4
  90. package/dist/components/SelectedOutlinePolygon.js +20 -17
  91. package/dist/components/SelectedOutlineRenderer.js +66 -14
  92. package/dist/components/SettingsModal.d.ts +1 -1
  93. package/dist/components/SettingsModal.js +30 -7
  94. package/dist/components/SettingsModalFooter.js +2 -1
  95. package/dist/components/SkillsSettings.d.ts +2 -0
  96. package/dist/components/SkillsSettings.js +129 -0
  97. package/dist/components/StaticFilePreview.js +7 -1
  98. package/dist/components/StudioSettings.js +7 -48
  99. package/dist/components/Tabs/index.js +1 -1
  100. package/dist/components/Timeline/Timeline.js +0 -1
  101. package/dist/components/Timeline/TimelineAssetField.d.ts +1 -1
  102. package/dist/components/Timeline/TimelineAssetField.js +15 -9
  103. package/dist/components/Timeline/TimelineBooleanField.js +1 -4
  104. package/dist/components/Timeline/TimelineClipboardKeybindings.js +13 -12
  105. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  106. package/dist/components/Timeline/TimelineEffectItem.js +45 -15
  107. package/dist/components/Timeline/TimelineEffectPropItem.js +21 -4
  108. package/dist/components/Timeline/TimelineExpandArrowButton.js +10 -7
  109. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +4 -1
  110. package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
  111. package/dist/components/Timeline/TimelineExpandedSection.js +8 -5
  112. package/dist/components/Timeline/TimelineFieldLabel.js +4 -2
  113. package/dist/components/Timeline/TimelineFieldRowContent.d.ts +1 -2
  114. package/dist/components/Timeline/TimelineFieldRowContent.js +8 -21
  115. package/dist/components/Timeline/TimelineImageInfo.d.ts +0 -1
  116. package/dist/components/Timeline/TimelineImageInfo.js +13 -32
  117. package/dist/components/Timeline/TimelineKeyframeControls.js +10 -4
  118. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
  119. package/dist/components/Timeline/TimelineRotationField.js +0 -2
  120. package/dist/components/Timeline/TimelineRowChrome.d.ts +1 -1
  121. package/dist/components/Timeline/TimelineRowChrome.js +41 -6
  122. package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +0 -1
  123. package/dist/components/Timeline/TimelineRowLayoutContext.js +1 -4
  124. package/dist/components/Timeline/TimelineScaleField.js +2 -6
  125. package/dist/components/Timeline/TimelineSchemaField.js +9 -3
  126. package/dist/components/Timeline/TimelineSelection.d.ts +8 -3
  127. package/dist/components/Timeline/TimelineSelection.js +7 -5
  128. package/dist/components/Timeline/TimelineSequence.d.ts +2 -0
  129. package/dist/components/Timeline/TimelineSequence.js +110 -19
  130. package/dist/components/Timeline/TimelineSequenceItem.js +11 -8
  131. package/dist/components/Timeline/TimelineSequenceName.js +1 -1
  132. package/dist/components/Timeline/TimelineSequencePropItem.js +15 -2
  133. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +4 -2
  134. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +85 -91
  135. package/dist/components/Timeline/TimelineTrack.js +5 -2
  136. package/dist/components/Timeline/TimelineTransformOriginField.js +0 -4
  137. package/dist/components/Timeline/TimelineTranslateField.js +0 -4
  138. package/dist/components/Timeline/TimelineVideoInfo.js +4 -2
  139. package/dist/components/Timeline/TimelineVirtualization.js +3 -1
  140. package/dist/components/Timeline/delete-selected-timeline-item.js +6 -2
  141. package/dist/components/Timeline/duplicate-selected-timeline-item.js +7 -14
  142. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.d.ts +4 -0
  143. package/dist/components/Timeline/get-copy-context-for-agents-menu-item.js +26 -0
  144. package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -19
  145. package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +6 -1
  146. package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +11 -4
  147. package/dist/components/Timeline/save-effect-prop.js +3 -3
  148. package/dist/components/Timeline/split-selected-timeline-item.js +0 -1
  149. package/dist/components/Timeline/timeline-field-row-layout.d.ts +1 -1
  150. package/dist/components/Timeline/timeline-field-row-layout.js +4 -7
  151. package/dist/components/Timeline/timeline-field-utils.js +0 -2
  152. package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
  153. package/dist/components/TimelineCombobox.js +25 -160
  154. package/dist/components/TimelineInOutToggle.js +4 -1
  155. package/dist/components/duplicate-jsx-node-api.d.ts +2 -0
  156. package/dist/components/duplicate-jsx-node-api.js +12 -0
  157. package/dist/components/effect-drag-and-drop.js +7 -7
  158. package/dist/components/effect-operations-api.d.ts +8 -0
  159. package/dist/components/effect-operations-api.js +52 -0
  160. package/dist/components/handle-drop.d.ts +2 -1
  161. package/dist/components/handle-drop.js +3 -3
  162. package/dist/components/import-assets.js +9 -65
  163. package/dist/components/keyboard-shortcuts.d.ts +10 -0
  164. package/dist/components/keyboard-shortcuts.js +135 -0
  165. package/dist/components/selected-outline-control-layout.js +2 -6
  166. package/dist/components/selected-outline-measurement.d.ts +1 -1
  167. package/dist/components/selected-outline-measurement.js +16 -3
  168. package/dist/components/use-delete-asset.d.ts +1 -0
  169. package/dist/components/use-delete-asset.js +40 -0
  170. package/dist/components/use-selected-outline-control-target.d.ts +11 -0
  171. package/dist/components/use-selected-outline-control-target.js +79 -0
  172. package/dist/error-overlay/remotion-overlay/log-studio-error.js +4 -0
  173. package/dist/esm/{chunk-r46yxrjr.js → chunk-4bxz1d3g.js} +4 -3
  174. package/dist/esm/{chunk-xn2q7eem.js → chunk-w4244j4n.js} +14747 -14549
  175. package/dist/esm/index.mjs +3 -0
  176. package/dist/esm/internals.mjs +14747 -14549
  177. package/dist/esm/previewEntry.mjs +14557 -14359
  178. package/dist/esm/renderEntry.mjs +2 -2
  179. package/dist/helpers/add-asset-cache-bust.d.ts +4 -0
  180. package/dist/helpers/add-asset-cache-bust.js +10 -0
  181. package/dist/helpers/browser-studio-operations.d.ts +3 -0
  182. package/dist/helpers/browser-studio-operations.js +18 -1
  183. package/dist/helpers/calculate-timeline.js +2 -1
  184. package/dist/helpers/colors.d.ts +3 -1
  185. package/dist/helpers/colors.js +7 -3
  186. package/dist/helpers/drag-aware-double-click.d.ts +6 -0
  187. package/dist/helpers/drag-aware-double-click.js +20 -0
  188. package/dist/helpers/get-asset-metadata.js +25 -16
  189. package/dist/helpers/get-sequence-double-click-action.d.ts +2 -1
  190. package/dist/helpers/get-sequence-double-click-action.js +7 -1
  191. package/dist/helpers/get-timeline-sequence-layout.d.ts +4 -1
  192. package/dist/helpers/get-timeline-sequence-layout.js +15 -6
  193. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -1
  194. package/dist/helpers/hoverable.d.ts +1 -0
  195. package/dist/helpers/hoverable.js +2 -1
  196. package/dist/helpers/inject-css.js +7 -3
  197. package/dist/helpers/open-in-remotion-convert.d.ts +7 -0
  198. package/dist/helpers/open-in-remotion-convert.js +18 -0
  199. package/dist/helpers/use-max-media-duration.js +5 -3
  200. package/dist/helpers/use-media-metadata.d.ts +2 -1
  201. package/dist/helpers/use-media-metadata.js +49 -25
  202. package/dist/helpers/use-menu-structure.js +54 -67
  203. package/dist/icons/align-center-horizontal.js +1 -1
  204. package/dist/icons/align-left.js +1 -1
  205. package/dist/icons/align-right.js +1 -1
  206. package/dist/icons/cloud-download.d.ts +4 -0
  207. package/dist/icons/cloud-download.js +8 -0
  208. package/dist/icons/keyboard.d.ts +4 -0
  209. package/dist/icons/keyboard.js +10 -0
  210. package/dist/icons/license.d.ts +4 -0
  211. package/dist/icons/license.js +8 -0
  212. package/dist/icons/package.d.ts +4 -0
  213. package/dist/icons/package.js +8 -0
  214. package/dist/icons/react.js +1 -1
  215. package/dist/icons/remotion-convert.d.ts +4 -0
  216. package/dist/icons/remotion-convert.js +10 -0
  217. package/dist/icons/skills.d.ts +4 -0
  218. package/dist/icons/skills.js +10 -0
  219. package/dist/state/modals.d.ts +2 -5
  220. package/package.json +12 -12
  221. package/dist/components/KeyboardShortcutsExplainer.d.ts +0 -2
  222. package/dist/components/KeyboardShortcutsExplainer.js +0 -194
@@ -42,21 +42,15 @@ const get_connected_compositions_1 = require("../helpers/get-connected-compositi
42
42
  const get_sequence_double_click_action_1 = require("../helpers/get-sequence-double-click-action");
43
43
  const interactivity_enabled_1 = require("../helpers/interactivity-enabled");
44
44
  const open_in_editor_1 = require("../helpers/open-in-editor");
45
- const timeline_node_path_key_1 = require("../helpers/timeline-node-path-key");
46
45
  const modals_1 = require("../state/modals");
47
- const timeline_sequence_hover_1 = require("../state/timeline-sequence-hover");
48
46
  const transform_3d_mode_1 = require("../state/transform-3d-mode");
49
47
  const ConfirmationDialog_1 = require("./ConfirmationDialog");
50
48
  const delete_jsx_node_api_1 = require("./delete-jsx-node-api");
51
49
  const InitialCompositionLoader_1 = require("./InitialCompositionLoader");
52
50
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
53
- const selected_outline_control_layout_1 = require("./selected-outline-control-layout");
54
51
  const selected_outline_types_1 = require("./selected-outline-types");
55
52
  const SelectedOutlineCanvasRotation_1 = require("./SelectedOutlineCanvasRotation");
56
- const SelectedOutlineCropControls_1 = require("./SelectedOutlineCropControls");
57
53
  const SelectedOutlinePolygon_1 = require("./SelectedOutlinePolygon");
58
- const SelectedOutlineRotationCornerHandle_1 = require("./SelectedOutlineRotationCornerHandle");
59
- const SelectedOutlineScaleEdgeLine_1 = require("./SelectedOutlineScaleEdgeLine");
60
54
  const disable_sequence_interactivity_1 = require("./Timeline/disable-sequence-interactivity");
61
55
  const duplicate_selected_timeline_item_1 = require("./Timeline/duplicate-selected-timeline-item");
62
56
  const get_sequence_context_menu_items_1 = require("./Timeline/get-sequence-context-menu-items");
@@ -65,7 +59,8 @@ const TimelineSelection_1 = require("./Timeline/TimelineSelection");
65
59
  const get_stack_1 = require("./Timeline/TimelineStack/get-stack");
66
60
  const use_default_editor_info_1 = require("./use-default-editor-info");
67
61
  const use_select_asset_1 = require("./use-select-asset");
68
- const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getAllRotationDragTargets, getAllScaleDragTargets, getLatestTargetByKey, layoutTarget, outline, onDraggingChange, onContextMenuOpenChange, onSnapPointsChange, onSelect, scale, }) => {
62
+ const use_selected_outline_control_target_1 = require("./use-selected-outline-control-target");
63
+ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getLatestTargetByKey, layoutTarget, outline, onDraggingChange, onSnapPointsChange, onSelect, registerContextMenuOpen, scale, }) => {
69
64
  var _a;
70
65
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
71
66
  const { canConfigureApps, canOpenInEditor: editorAvailable, defaultEditorId, editorInfo, } = (0, use_default_editor_info_1.useEditorOpening)(previewServerState.type === 'connected');
@@ -78,43 +73,10 @@ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth,
78
73
  const { compositions } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
79
74
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
80
75
  const { setManuallyEnabled } = (0, react_1.useContext)(transform_3d_mode_1.Transform3DModeStateContext);
81
- const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
82
- const targetRef = (0, react_1.useRef)(layoutTarget);
83
- const controlLayout = (0, react_1.useMemo)(() => (0, selected_outline_control_layout_1.getSelectedOutlineControlLayout)(outline.points), [outline.points]);
84
- (0, react_1.useLayoutEffect)(() => {
85
- targetRef.current = layoutTarget;
86
- }, [layoutTarget]);
87
- const getTarget = react_1.default.useCallback(() => {
88
- const currentTarget = targetRef.current;
89
- if (currentTarget === undefined) {
90
- return undefined;
91
- }
92
- return getLatestTargetByKey(currentTarget.key);
93
- }, [getLatestTargetByKey]);
94
- const getLayoutTarget = react_1.default.useCallback(() => targetRef.current, []);
95
- const hoveredNodePathKey = (0, react_1.useMemo)(() => layoutTarget === undefined
96
- ? null
97
- : (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(layoutTarget.nodePathInfo.sequenceSubscriptionKey), [layoutTarget]);
98
- const hovered = (0, timeline_sequence_hover_1.useIsTimelineSequenceHovered)(hoveredNodePathKey);
99
- const controlTarget = layoutTarget !== undefined && (layoutTarget.containsSelection || hovered)
100
- ? getLatestTargetByKey(layoutTarget.key)
101
- : undefined;
102
- const onHoverChange = react_1.default.useCallback((key) => {
103
- setHoveredSequence((currentHover) => {
104
- if (key !== null) {
105
- const hoverTarget = targetRef.current;
106
- if (hoverTarget === undefined || hoverTarget.key !== key) {
107
- return currentHover;
108
- }
109
- return {
110
- key,
111
- nodePathKey: (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(hoverTarget.nodePathInfo.sequenceSubscriptionKey),
112
- source: 'canvas',
113
- };
114
- }
115
- return (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover;
116
- });
117
- }, [setHoveredSequence]);
76
+ const { controlTarget, getLayoutTarget, getTarget, hovered, onHoverChange } = (0, use_selected_outline_control_target_1.useSelectedOutlineControlTarget)({
77
+ getLatestTargetByKey,
78
+ layoutTarget,
79
+ });
118
80
  const resolveOriginalLocation = react_1.default.useCallback(async (resolveTarget) => {
119
81
  const stack = resolveTarget.sequence.getStack();
120
82
  if (!stack) {
@@ -130,7 +92,7 @@ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth,
130
92
  updateResolvedStackTrace(stack, originalLocation);
131
93
  return originalLocation;
132
94
  }, [updateResolvedStackTrace]);
133
- const onDoubleClickTarget = react_1.default.useCallback((doubleClickTarget, button) => {
95
+ const onDoubleClickTarget = react_1.default.useCallback((doubleClickTarget, button, sequenceWasDragged) => {
134
96
  const connectedCompositions = (0, get_connected_compositions_1.getConnectedCompositions)({
135
97
  compositions,
136
98
  singleChildComponent: doubleClickTarget.sequence.singleChildComponent,
@@ -139,6 +101,7 @@ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth,
139
101
  button,
140
102
  canOpenInEditor: editorAvailable,
141
103
  numberOfConnectedCompositions: connectedCompositions.length,
104
+ sequenceWasDragged,
142
105
  });
143
106
  if (action === null) {
144
107
  return false;
@@ -392,15 +355,13 @@ const SelectedOutlineElementUnmemoized = ({ compositionHeight, compositionWidth,
392
355
  setSelectedModal,
393
356
  setPropStatuses,
394
357
  ]);
358
+ (0, react_1.useLayoutEffect)(() => {
359
+ registerContextMenuOpen(outline.key, onContextMenuOpen);
360
+ return () => {
361
+ registerContextMenuOpen(outline.key, null);
362
+ };
363
+ }, [onContextMenuOpen, outline.key, registerContextMenuOpen]);
395
364
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
396
- jsx_runtime_1.jsx(SelectedOutlinePolygon_1.SelectedOutlinePolygon, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, directlySelected: (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selected) === true, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getLayoutTarget: getLayoutTarget, getTarget: getTarget, hasTarget: layoutTarget !== undefined, hovered: hovered, outline: outline, onContextMenuOpen: onContextMenuOpen, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, onDoubleClickTarget: onDoubleClickTarget, scale: scale, showSelectedOutline: (_a = layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.showSelectedOutline) !== null && _a !== void 0 ? _a : false }), (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation) && (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.rotationDrag) ? (jsx_runtime_1.jsx(SelectedOutlineCanvasRotation_1.SelectedOutlineCanvasRotation, { getLatestTargetByKey: getLatestTargetByKey, layoutTarget: layoutTarget, onDraggingChange: onDraggingChange, outline: outline })) : null, jsx_runtime_1.jsx(SelectedOutlineCropControls_1.SelectedOutlineCropControls, { outline: outline, onDraggingChange: onDraggingChange, target: controlTarget }), (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
397
- ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
398
- ? controlLayout.scaleEdges.map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine_1.SelectedOutlineScaleEdgeLine, { getAllScaleDragTargets: getAllScaleDragTargets, dragging: dragging, edge: edge, hitWidth: edge === 'top' || edge === 'bottom'
399
- ? controlLayout.scaleHitWidth.horizontal
400
- : controlLayout.scaleHitWidth.vertical, outline: outline, onContextMenuOpen: onContextMenuOpen, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, edge)))
401
- : null, (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
402
- ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
403
- ? controlLayout.rotationCorners.map(({ corner, point }) => (jsx_runtime_1.jsx(SelectedOutlineRotationCornerHandle_1.SelectedOutlineRotationCornerHandle, { getAllRotationDragTargets: getAllRotationDragTargets, corner: corner, dragging: dragging, handlePoint: point, outline: outline, onContextMenuOpen: onContextMenuOpen, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, radius: controlLayout.rotationHandleRadius, target: controlTarget }, corner)))
404
- : null] }));
365
+ jsx_runtime_1.jsx(SelectedOutlinePolygon_1.SelectedOutlinePolygon, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, containsSelection: (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) === true, directlySelected: (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selected) === true, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getLayoutTarget: getLayoutTarget, getTarget: getTarget, hasTarget: layoutTarget !== undefined, hovered: hovered, outline: outline, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, onDoubleClickTarget: onDoubleClickTarget, scale: scale, showSelectedOutline: (_a = layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.showSelectedOutline) !== null && _a !== void 0 ? _a : false }), (layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.selectedForRotation) && (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.rotationDrag) ? (jsx_runtime_1.jsx(SelectedOutlineCanvasRotation_1.SelectedOutlineCanvasRotation, { getLatestTargetByKey: getLatestTargetByKey, layoutTarget: layoutTarget, onDraggingChange: onDraggingChange, outline: outline, transform3DMode: controlTarget.rotationDrag.transform3DMode })) : null] }));
405
366
  };
406
367
  exports.SelectedOutlineElement = react_1.default.memo(SelectedOutlineElementUnmemoized);
@@ -485,14 +485,38 @@ const calculateOutlineTargets = ({ connectedClientId, editorShowOutlines, getDra
485
485
  ];
486
486
  });
487
487
  };
488
- const ActiveSelectedOutlineOverlayUnmemoized = ({ calculateOutlineTargetsForCurrentState, compositionHeight, compositionWidth, draggingOutline, getLatestOutlineTargetByKey, getSelectableOutlines, onDraggingChange, onContextMenuOpenChange, onSelect, scale, selectedSequenceKeys, sequenceKeysContainingSelection, sequences, translationX, translationY, }) => {
488
+ const ActiveSelectedOutlineOverlayUnmemoized = ({ calculateOutlineTargetsForCurrentState, compositionHeight, compositionWidth, draggingOutline, getLatestOutlineTargetByKey, getSelectableOutlines, hoveredTimelineNodePathKey, measureAllOutlines, onDraggingChange, onContextMenuOpenChange, onSelect, scale, selectedSequenceKeys, sequenceKeysContainingSelection, sequences, translationX, translationY, }) => {
489
489
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
490
490
  const updateOutlinesRef = (0, react_1.useRef)(() => undefined);
491
491
  const selectableOutlines = (0, react_1.useMemo)(() => {
492
492
  return getSelectableOutlines(timelinePosition);
493
493
  }, [getSelectableOutlines, timelinePosition]);
494
+ const selectableOutlinesForLayout = (0, react_1.useMemo)(() => {
495
+ if (measureAllOutlines) {
496
+ return selectableOutlines;
497
+ }
498
+ // A timeline item can represent multiple connected canvas instances.
499
+ // Keep every instance of an active source node without calculating targets
500
+ // for unrelated timeline items while the canvas itself is inactive.
501
+ const activeNodePathKeys = new Set();
502
+ for (const { key, nodePathInfo } of selectableOutlines) {
503
+ const nodePathKey = (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(nodePathInfo.sequenceSubscriptionKey);
504
+ if (selectedSequenceKeys.has(key) ||
505
+ sequenceKeysContainingSelection.has(key) ||
506
+ nodePathKey === hoveredTimelineNodePathKey) {
507
+ activeNodePathKeys.add(nodePathKey);
508
+ }
509
+ }
510
+ return selectableOutlines.filter(({ nodePathInfo }) => activeNodePathKeys.has((0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(nodePathInfo.sequenceSubscriptionKey)));
511
+ }, [
512
+ hoveredTimelineNodePathKey,
513
+ measureAllOutlines,
514
+ selectableOutlines,
515
+ selectedSequenceKeys,
516
+ sequenceKeysContainingSelection,
517
+ ]);
494
518
  const outlineRuntimeControls = (0, react_1.useMemo)(() => {
495
- return selectableOutlines.flatMap(({ key, sequence }) => {
519
+ return selectableOutlinesForLayout.flatMap(({ key, sequence }) => {
496
520
  if (!selectedSequenceKeys.has(key) &&
497
521
  !sequenceKeysContainingSelection.has(key)) {
498
522
  return [];
@@ -500,7 +524,7 @@ const ActiveSelectedOutlineOverlayUnmemoized = ({ calculateOutlineTargetsForCurr
500
524
  return sequence.controls ? [sequence.controls] : [];
501
525
  });
502
526
  }, [
503
- selectableOutlines,
527
+ selectableOutlinesForLayout,
504
528
  selectedSequenceKeys,
505
529
  sequenceKeysContainingSelection,
506
530
  ]);
@@ -512,13 +536,13 @@ const ActiveSelectedOutlineOverlayUnmemoized = ({ calculateOutlineTargetsForCurr
512
536
  const outlineTargets = (0, react_1.useMemo)(() => calculateOutlineTargetsForCurrentState({
513
537
  mode: 'layout',
514
538
  runtimeValuesByStore: outlineRuntimeValuesByStore,
515
- selectableOutlines,
539
+ selectableOutlines: selectableOutlinesForLayout,
516
540
  targetKey: null,
517
541
  targetTimelinePosition: timelinePosition,
518
542
  }), [
519
543
  calculateOutlineTargetsForCurrentState,
520
544
  outlineRuntimeValuesByStore,
521
- selectableOutlines,
545
+ selectableOutlinesForLayout,
522
546
  timelinePosition,
523
547
  ]);
524
548
  const outlineTargetsRef = (0, react_1.useRef)(outlineTargets);
@@ -658,6 +682,8 @@ const SelectedOutlineOverlayUnmemoized = ({ canvasHovered, compositionHeight, co
658
682
  canvasContextMenuOpen ||
659
683
  sequenceKeysContainingSelection.size > 0 ||
660
684
  (hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'timeline';
685
+ const measureAllOutlines = canvasHovered || draggingOutline || canvasContextMenuOpen;
686
+ const hoveredTimelineNodePathKey = (hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'timeline' ? hoveredSequence.nodePathKey : null;
661
687
  (0, react_1.useLayoutEffect)(() => {
662
688
  if (measurementActive) {
663
689
  return;
@@ -665,6 +691,6 @@ const SelectedOutlineOverlayUnmemoized = ({ canvasHovered, compositionHeight, co
665
691
  setHoveredSequence((currentHover) => (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover);
666
692
  }, [measurementActive, setHoveredSequence]);
667
693
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
668
- jsx_runtime_1.jsx(SelectedOutlineKeyboardControls_1.SelectedOutlineKeyboardControls, { getLatestOutlineTargetByKey: getLatestOutlineTargetByKey, getSelectableOutlines: getCurrentSelectableOutlines }), measurementActive ? (jsx_runtime_1.jsx(ActiveSelectedOutlineOverlay, { calculateOutlineTargetsForCurrentState: calculateOutlineTargetsForCurrentState, compositionHeight: compositionHeight, compositionWidth: compositionWidth, draggingOutline: draggingOutline, getLatestOutlineTargetByKey: getLatestOutlineTargetByKey, getSelectableOutlines: getSelectableOutlines, onDraggingChange: onDraggingChange, onContextMenuOpenChange: setCanvasContextMenuOpen, onSelect: selectOutlineItem, scale: scale, selectedSequenceKeys: selectedSequenceKeys, sequenceKeysContainingSelection: sequenceKeysContainingSelection, sequences: sequences, translationX: translationX, translationY: translationY })) : null] }));
694
+ jsx_runtime_1.jsx(SelectedOutlineKeyboardControls_1.SelectedOutlineKeyboardControls, { getLatestOutlineTargetByKey: getLatestOutlineTargetByKey, getSelectableOutlines: getCurrentSelectableOutlines }), measurementActive ? (jsx_runtime_1.jsx(ActiveSelectedOutlineOverlay, { calculateOutlineTargetsForCurrentState: calculateOutlineTargetsForCurrentState, compositionHeight: compositionHeight, compositionWidth: compositionWidth, draggingOutline: draggingOutline, getLatestOutlineTargetByKey: getLatestOutlineTargetByKey, getSelectableOutlines: getSelectableOutlines, hoveredTimelineNodePathKey: hoveredTimelineNodePathKey, measureAllOutlines: measureAllOutlines, onDraggingChange: onDraggingChange, onContextMenuOpenChange: setCanvasContextMenuOpen, onSelect: selectOutlineItem, scale: scale, selectedSequenceKeys: selectedSequenceKeys, sequenceKeysContainingSelection: sequenceKeysContainingSelection, sequences: sequences, translationX: translationX, translationY: translationY })) : null] }));
669
695
  };
670
696
  exports.SelectedOutlineOverlay = react_1.default.memo(SelectedOutlineOverlayUnmemoized);
@@ -1,11 +1,13 @@
1
1
  import React from 'react';
2
2
  import type { SelectedOutline } from './selected-outline-geometry';
3
3
  import { type SelectedOutlineSnapPoint } from './selected-outline-snap';
4
- import { type SelectedOutlineContextMenuOpenHandler, type SelectedOutlineDragTarget, type SelectedOutlineLayoutTarget, type SelectedOutlineTarget } from './selected-outline-types';
4
+ import { type SelectedOutlineDragTarget, type SelectedOutlineLayoutTarget, type SelectedOutlineTarget } from './selected-outline-types';
5
5
  import type { TimelineSelection, TimelineSelectionInteraction } from './Timeline/TimelineSelection';
6
+ export declare const SELECTED_OUTLINE_KEY_ATTR = "data-remotion-studio-selected-outline-key";
6
7
  export declare const SelectedOutlinePolygon: React.NamedExoticComponent<{
7
8
  readonly compositionHeight: number;
8
9
  readonly compositionWidth: number;
10
+ readonly containsSelection: boolean;
9
11
  readonly directlySelected: boolean;
10
12
  readonly dragging: boolean;
11
13
  readonly getAllDragOutlines: () => readonly SelectedOutline[];
@@ -14,14 +16,12 @@ export declare const SelectedOutlinePolygon: React.NamedExoticComponent<{
14
16
  readonly getTarget: () => SelectedOutlineTarget | undefined;
15
17
  readonly hasTarget: boolean;
16
18
  readonly hovered: boolean;
17
- readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
18
- readonly onContextMenuOpenChange: (open: boolean) => void;
19
19
  readonly outline: SelectedOutline;
20
20
  readonly onDraggingChange: (dragging: boolean) => void;
21
21
  readonly onHoverChange: (key: string | null) => void;
22
22
  readonly onSnapPointsChange: (snapPoints: readonly SelectedOutlineSnapPoint[]) => void;
23
23
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
24
- readonly onDoubleClickTarget: (target: SelectedOutlineTarget, button: number) => boolean;
24
+ readonly onDoubleClickTarget: (target: SelectedOutlineTarget, button: number, sequenceWasDragged: boolean) => boolean;
25
25
  readonly scale: number;
26
26
  readonly showSelectedOutline: boolean;
27
27
  }>;
@@ -33,17 +33,17 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SelectedOutlinePolygon = void 0;
36
+ exports.SelectedOutlinePolygon = exports.SELECTED_OUTLINE_KEY_ATTR = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const remotion_1 = require("remotion");
40
40
  const client_id_1 = require("../helpers/client-id");
41
41
  const colors_1 = require("../helpers/colors");
42
+ const drag_aware_double_click_1 = require("../helpers/drag-aware-double-click");
42
43
  const interactivity_enabled_1 = require("../helpers/interactivity-enabled");
43
44
  const pointer_session_1 = require("../helpers/pointer-session");
44
45
  const editor_guides_1 = require("../state/editor-guides");
45
46
  const editor_snapping_1 = require("../state/editor-snapping");
46
- const ContextMenu_1 = require("./ContextMenu");
47
47
  const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
48
48
  const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
49
49
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
@@ -56,8 +56,10 @@ const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
56
56
  const imperative_state_1 = require("./Timeline/imperative-state");
57
57
  const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
58
58
  const should_clear_selection_on_pointer_down_1 = require("./Timeline/should-clear-selection-on-pointer-down");
59
- const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth, directlySelected, dragging, getAllDragOutlines, getAllDragTargets, getLayoutTarget, getTarget, hasTarget, hovered, onContextMenuOpen, onContextMenuOpenChange, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, showSelectedOutline, }) => {
59
+ exports.SELECTED_OUTLINE_KEY_ATTR = 'data-remotion-studio-selected-outline-key';
60
+ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth, containsSelection, directlySelected, dragging, getAllDragOutlines, getAllDragTargets, getLayoutTarget, getTarget, hasTarget, hovered, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, showSelectedOutline, }) => {
60
61
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
62
+ const dragAwareDoubleClick = (0, react_1.useMemo)(() => (0, drag_aware_double_click_1.createDragAwareDoubleClickTracker)(), []);
61
63
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
62
64
  const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
63
65
  const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
@@ -114,7 +116,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
114
116
  const deferSelection = !selected &&
115
117
  !interaction.shiftKey &&
116
118
  !interaction.toggleKey &&
117
- pointerInsideSelectedOutline;
119
+ (containsSelection || pointerInsideSelectedOutline);
118
120
  if (!deferSelection && shouldUpdateSelection) {
119
121
  onSelect(target.selection, interaction);
120
122
  }
@@ -254,6 +256,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
254
256
  updateDragOverrides();
255
257
  };
256
258
  const onPointerUp = (reason) => {
259
+ dragAwareDoubleClick.endPointerGesture(dragStarted);
257
260
  window.removeEventListener('keydown', onKeyChange);
258
261
  window.removeEventListener('keyup', onKeyChange);
259
262
  if (dragStarted) {
@@ -317,6 +320,8 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
317
320
  clearDragOverrides,
318
321
  compositionHeight,
319
322
  compositionWidth,
323
+ containsSelection,
324
+ dragAwareDoubleClick,
320
325
  editorShowGuides,
321
326
  editorSnapping,
322
327
  getAllDragOutlines,
@@ -337,12 +342,12 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
337
342
  if (target === undefined) {
338
343
  return;
339
344
  }
340
- if (!onDoubleClickTarget(target, event.button)) {
345
+ if (!onDoubleClickTarget(target, event.button, dragAwareDoubleClick.consumePointerGestureWasDragged())) {
341
346
  return;
342
347
  }
343
348
  event.preventDefault();
344
349
  event.stopPropagation();
345
- }, [getTarget, onDoubleClickTarget]);
350
+ }, [dragAwareDoubleClick, getTarget, onDoubleClickTarget]);
346
351
  const onEffectDragOver = react_1.default.useCallback((event) => {
347
352
  if (!(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
348
353
  return;
@@ -390,16 +395,14 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
390
395
  clientId: effectDrop.clientId,
391
396
  });
392
397
  }, [getEffectDropTarget]);
393
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
394
- jsx_runtime_1.jsx("polygon", { ref: polygonRef, [should_clear_selection_on_pointer_down_1.PREVENT_CLEAR_SELECTION_ON_POINTER_DOWN_ATTR]: 'true', "data-remotion-directly-selected-outline": directlySelected ? 'true' : undefined, points: points, fill: effectDropHovered ? colors_1.TIMELINE_DROP_BLUE_ALPHA_12 : colors_1.TRANSPARENT, stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: hasTarget ? 'all' : undefined, onPointerEnter: () => {
395
- if (!dragging) {
396
- onHoverChange(outline.key);
397
- }
398
- }, onPointerLeave: () => {
399
- if (!dragging) {
400
- onHoverChange(null);
401
- }
402
- }, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onDragOver: onEffectDragOver, onDragLeave: onEffectDragLeave, onDrop: onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, getItems: onContextMenuOpen, onOpenChange: onContextMenuOpenChange })
403
- ] }));
398
+ return (jsx_runtime_1.jsx("polygon", { ref: polygonRef, [should_clear_selection_on_pointer_down_1.PREVENT_CLEAR_SELECTION_ON_POINTER_DOWN_ATTR]: 'true', [exports.SELECTED_OUTLINE_KEY_ATTR]: outline.key, "data-remotion-directly-selected-outline": directlySelected ? 'true' : undefined, points: points, fill: effectDropHovered ? colors_1.TIMELINE_DROP_BLUE_ALPHA_12 : colors_1.TRANSPARENT, stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: hasTarget ? 'all' : undefined, onPointerEnter: () => {
399
+ if (!dragging) {
400
+ onHoverChange(outline.key);
401
+ }
402
+ }, onPointerLeave: () => {
403
+ if (!dragging) {
404
+ onHoverChange(null);
405
+ }
406
+ }, onPointerDown: onPointerDown, onPointerDownCapture: dragAwareDoubleClick.beginPointerGesture, onDoubleClick: onDoubleClick, onDragOver: onEffectDragOver, onDragLeave: onEffectDragLeave, onDrop: onEffectDrop }));
404
407
  };
405
408
  exports.SelectedOutlinePolygon = react_1.default.memo(SelectedOutlinePolygonUnmemoized);
@@ -36,10 +36,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.SelectedOutlineRenderer = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
+ const timeline_node_path_key_1 = require("../helpers/timeline-node-path-key");
39
40
  const timeline_sequence_hover_1 = require("../state/timeline-sequence-hover");
41
+ const ContextMenu_1 = require("./ContextMenu");
40
42
  const selected_outline_measurement_1 = require("./selected-outline-measurement");
41
43
  const selected_outline_order_1 = require("./selected-outline-order");
44
+ const SelectedOutlineEditingHandles_1 = require("./SelectedOutlineEditingHandles");
42
45
  const SelectedOutlineElement_1 = require("./SelectedOutlineElement");
46
+ const SelectedOutlinePolygon_1 = require("./SelectedOutlinePolygon");
43
47
  const SelectedOutlineSnapIndicators_1 = require("./SelectedOutlineSnapIndicators");
44
48
  const SelectedOutlineTransformOriginHandle_1 = require("./SelectedOutlineTransformOriginHandle");
45
49
  const SelectedOutlineUvControls_1 = require("./SelectedOutlineUvControls");
@@ -53,30 +57,47 @@ const emptyRenderState = {
53
57
  outlines: [],
54
58
  targets: [],
55
59
  };
56
- const SelectedOutlineHoverCleanup = ({ targets }) => {
57
- const hoveredSequence = (0, timeline_sequence_hover_1.useTimelineSequenceHoverState)();
58
- const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
59
- (0, react_1.useEffect)(() => {
60
- if ((hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'canvas' &&
61
- !targets.some((target) => target.key === hoveredSequence.key)) {
62
- setHoveredSequence((currentHover) => (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover);
63
- }
64
- }, [hoveredSequence, setHoveredSequence, targets]);
65
- return null;
66
- };
67
60
  const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth, dragging, getLatestOutlineTargetByKey, getOutlineTargets, onDraggingChange, onContextMenuOpenChange, onSelect, scale, sequences, updateOutlinesRef, }) => {
61
+ var _a;
68
62
  const [renderState, setRenderState] = (0, react_1.useState)(emptyRenderState);
69
63
  const overlayRef = (0, react_1.useRef)(null);
70
64
  const resizeObserverRef = (0, react_1.useRef)(null);
71
65
  const resizeObserverAnimationFrameRef = (0, react_1.useRef)(null);
72
66
  const observedOutlineElementsRef = (0, react_1.useRef)(new Set());
67
+ const contextMenuOpenHandlersRef = (0, react_1.useRef)(new Map());
68
+ const registerContextMenuOpen = (0, react_1.useCallback)((key, handler) => {
69
+ if (handler === null) {
70
+ contextMenuOpenHandlersRef.current.delete(key);
71
+ }
72
+ else {
73
+ contextMenuOpenHandlersRef.current.set(key, handler);
74
+ }
75
+ }, []);
76
+ const getContextMenuOpenByKey = (0, react_1.useCallback)((key) => contextMenuOpenHandlersRef.current.get(key), []);
77
+ const getDelegatedContextMenuItems = (0, react_1.useCallback)((event) => {
78
+ var _a;
79
+ var _b;
80
+ if (!(event.target instanceof Element)) {
81
+ return false;
82
+ }
83
+ const polygon = event.target.closest(`polygon[${SelectedOutlinePolygon_1.SELECTED_OUTLINE_KEY_ATTR}]`);
84
+ if ((polygon === null || polygon === void 0 ? void 0 : polygon.ownerSVGElement) !== overlayRef.current) {
85
+ return false;
86
+ }
87
+ const key = polygon.getAttribute(SelectedOutlinePolygon_1.SELECTED_OUTLINE_KEY_ATTR);
88
+ return key === null ? false : ((_b = (_a = getContextMenuOpenByKey(key)) === null || _a === void 0 ? void 0 : _a()) !== null && _b !== void 0 ? _b : false);
89
+ }, [getContextMenuOpenByKey]);
90
+ const hoveredSequence = (0, timeline_sequence_hover_1.useTimelineSequenceHoverState)();
91
+ const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
92
+ const hoveredNodePathKey = (_a = hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.nodePathKey) !== null && _a !== void 0 ? _a : null;
93
+ const hoveredTimelineNodePathKey = (hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'timeline' ? hoveredNodePathKey : null;
73
94
  const updateOutlines = (0, react_1.useCallback)(() => {
74
95
  const targets = getOutlineTargets();
75
96
  if (overlayRef.current === null || targets.length === 0) {
76
97
  setRenderState((prevState) => prevState.targets.length === 0 ? prevState : emptyRenderState);
77
98
  return;
78
99
  }
79
- const nextOutlines = (0, selected_outline_measurement_1.measureOutlines)(overlayRef.current, targets);
100
+ const nextOutlines = (0, selected_outline_measurement_1.measureOutlines)(overlayRef.current, targets, hoveredTimelineNodePathKey);
80
101
  setRenderState((prevState) => {
81
102
  const outlines = (0, selected_outline_measurement_1.outlinesAreEqual)(prevState.outlines, nextOutlines)
82
103
  ? prevState.outlines
@@ -86,7 +107,7 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
86
107
  }
87
108
  return { outlines, targets };
88
109
  });
89
- }, [getOutlineTargets]);
110
+ }, [getOutlineTargets, hoveredTimelineNodePathKey]);
90
111
  (0, react_1.useLayoutEffect)(() => {
91
112
  updateOutlinesRef.current = updateOutlines;
92
113
  updateOutlines();
@@ -149,6 +170,12 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
149
170
  const targetsByKey = (0, react_1.useMemo)(() => {
150
171
  return new Map(renderState.targets.map((target) => [target.key, target]));
151
172
  }, [renderState.targets]);
173
+ (0, react_1.useEffect)(() => {
174
+ if ((hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'canvas' &&
175
+ !renderState.targets.some((target) => target.key === hoveredSequence.key)) {
176
+ setHoveredSequence((currentHover) => (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover);
177
+ }
178
+ }, [hoveredSequence, renderState.targets, setHoveredSequence]);
152
179
  // Reordering a captured SVG target can cancel the active pointer session.
153
180
  const outlineRenderingOrderRef = (0, react_1.useRef)([]);
154
181
  const outlinesForRendering = (0, react_1.useMemo)(() => {
@@ -176,6 +203,31 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
176
203
  const outlinesByKey = (0, react_1.useMemo)(() => {
177
204
  return new Map(renderState.outlines.map((outline) => [outline.key, outline]));
178
205
  }, [renderState.outlines]);
206
+ const { outlinesForEditingHandles, outlinesForTransformOrigin, outlinesForUvHandles, } = (0, react_1.useMemo)(() => {
207
+ const editingHandles = [];
208
+ const transformOrigin = [];
209
+ const uvHandles = [];
210
+ for (const outline of outlinesForRendering) {
211
+ const target = targetsByKey.get(outline.key);
212
+ if ((target === null || target === void 0 ? void 0 : target.containsSelection) === true ||
213
+ (target !== undefined &&
214
+ (0, timeline_node_path_key_1.timelineSequenceNodePathToKey)(target.nodePathInfo.sequenceSubscriptionKey) === hoveredNodePathKey)) {
215
+ editingHandles.push(outline);
216
+ }
217
+ if ((target === null || target === void 0 ? void 0 : target.selectedForUvHandles) === true) {
218
+ uvHandles.push(outline);
219
+ }
220
+ if ((target === null || target === void 0 ? void 0 : target.selectedForTransformOrigin) === true ||
221
+ (target === null || target === void 0 ? void 0 : target.selectedForRotation) === true) {
222
+ transformOrigin.push(outline);
223
+ }
224
+ }
225
+ return {
226
+ outlinesForEditingHandles: editingHandles,
227
+ outlinesForTransformOrigin: transformOrigin,
228
+ outlinesForUvHandles: uvHandles,
229
+ };
230
+ }, [hoveredNodePathKey, outlinesForRendering, targetsByKey]);
179
231
  const targetsRef = (0, react_1.useRef)(renderState.targets);
180
232
  const outlinesByKeyRef = (0, react_1.useRef)(outlinesByKey);
181
233
  (0, react_1.useLayoutEffect)(() => {
@@ -220,6 +272,6 @@ const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth
220
272
  const updateSnapPointsRef = (0, react_1.useRef)(() => undefined);
221
273
  const onSnapPointsChange = (0, react_1.useCallback)((snapPoints) => updateSnapPointsRef.current(snapPoints), []);
222
274
  return (jsx_runtime_1.jsxs("svg", { ref: overlayRef, style: outlineContainer, width: "100%", height: "100%", "aria-hidden": "true", children: [
223
- jsx_runtime_1.jsx(SelectedOutlineHoverCleanup, { targets: renderState.targets }), jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapIndicators, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, scale: scale, updateSnapPointsRef: updateSnapPointsRef }), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement_1.SelectedOutlineElement, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getAllRotationDragTargets: getAllRotationDragTargets, getAllScaleDragTargets: getAllScaleDragTargets, getLatestTargetByKey: getLatestOutlineTargetByKey, outline: outline, onDraggingChange: onDraggingChange, onContextMenuOpenChange: onContextMenuOpenChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, scale: scale, layoutTarget: targetsByKey.get(outline.key) }, outline.key))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle_1.SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-transform-origin`)))] }));
275
+ jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: overlayRef, getItems: getDelegatedContextMenuItems, onOpenChange: onContextMenuOpenChange }), jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapIndicators, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, scale: scale, updateSnapPointsRef: updateSnapPointsRef }), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement_1.SelectedOutlineElement, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getLatestTargetByKey: getLatestOutlineTargetByKey, outline: outline, onDraggingChange: onDraggingChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, registerContextMenuOpen: registerContextMenuOpen, scale: scale, layoutTarget: targetsByKey.get(outline.key) }, outline.key))), outlinesForEditingHandles.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineEditingHandles_1.SelectedOutlineEditingHandles, { dragging: dragging, getAllRotationDragTargets: getAllRotationDragTargets, getAllScaleDragTargets: getAllScaleDragTargets, getContextMenuOpenByKey: getContextMenuOpenByKey, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key), onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline }, `${outline.key}-editing-handles`))), outlinesForUvHandles.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlinesForUvHandles.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`))), outlinesForTransformOrigin.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle_1.SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-transform-origin`)))] }));
224
276
  };
225
277
  exports.SelectedOutlineRenderer = react_1.default.memo(SelectedOutlineRendererUnmemoized);
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- type SettingsTab = 'apps' | 'rendering' | 'studio' | 'license';
2
+ type SettingsTab = 'apps' | 'rendering' | 'studio' | 'packages' | 'shortcuts' | 'skills' | 'license';
3
3
  export declare const SettingsModal: React.FC<{
4
4
  readonly initialTab: SettingsTab;
5
5
  readonly initialPublicLicenseKey: string | null;
@@ -3,13 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SettingsModal = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
6
7
  const apps_1 = require("../icons/apps");
7
- const certificate_1 = require("../icons/certificate");
8
+ const keyboard_1 = require("../icons/keyboard");
9
+ const license_1 = require("../icons/license");
10
+ const package_1 = require("../icons/package");
8
11
  const remotion_triangle_1 = require("../icons/remotion-triangle");
12
+ const skills_1 = require("../icons/skills");
9
13
  const video_1 = require("../icons/video");
10
14
  const modals_1 = require("../state/modals");
11
15
  const ConfigureDefaultEditorModal_1 = require("./ConfigureDefaultEditorModal");
12
16
  const ConfigureLicenseModal_1 = require("./ConfigureLicenseModal");
17
+ const InstallPackage_1 = require("./InstallPackage");
18
+ const KeyboardShortcutsSettings_1 = require("./KeyboardShortcutsSettings");
13
19
  const is_menu_item_1 = require("./Menu/is-menu-item");
14
20
  const ModalHeader_1 = require("./ModalHeader");
15
21
  const DismissableModal_1 = require("./NewComposition/DismissableModal");
@@ -17,6 +23,7 @@ const RenderingSettings_1 = require("./RenderingSettings");
17
23
  const render_modals_1 = require("./RenderModal/render-modals");
18
24
  const SettingsContext_1 = require("./SettingsContext");
19
25
  const SettingsModalFooter_1 = require("./SettingsModalFooter");
26
+ const SkillsSettings_1 = require("./SkillsSettings");
20
27
  const StudioSettings_1 = require("./StudioSettings");
21
28
  const vertical_1 = require("./Tabs/vertical");
22
29
  const hiddenPanel = {
@@ -27,21 +34,38 @@ const settingsOptionsPanel = {
27
34
  boxSizing: 'border-box',
28
35
  paddingBottom: 16,
29
36
  };
37
+ const settingsLeftSidebar = {
38
+ ...render_modals_1.leftSidebar,
39
+ paddingLeft: 8,
40
+ };
30
41
  const appsIcon = {
31
42
  ...render_modals_1.icon,
32
- height: 20,
33
- width: 20,
43
+ flexShrink: 0,
44
+ height: 24,
45
+ width: 24,
34
46
  };
35
- const appsIconContainer = {
36
- ...render_modals_1.iconContainer,
47
+ const skillsIcon = {
48
+ ...render_modals_1.icon,
49
+ flexShrink: 0,
37
50
  height: 20,
38
51
  width: 20,
39
52
  };
53
+ const keyboardIcon = {
54
+ ...render_modals_1.icon,
55
+ height: 16,
56
+ width: 16,
57
+ };
40
58
  const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
41
59
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
42
60
  const { setPublicLicenseKey } = (0, SettingsContext_1.useSettings)();
61
+ const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
62
+ const packageManager = window.remotion_packageManager === 'unknown'
63
+ ? null
64
+ : window.remotion_packageManager;
65
+ const showPackages = (0, browser_studio_operations_1.canInstallPackages)() && (isBrowserStudio || packageManager !== null);
43
66
  const [tab, setTab] = (0, react_1.useState)(initialTab);
44
67
  const [openedTabs, setOpenedTabs] = (0, react_1.useState)([initialTab]);
68
+ const [packagesFooterContainer, setPackagesFooterContainer] = (0, react_1.useState)(null);
45
69
  const dismiss = (0, react_1.useCallback)(() => {
46
70
  setSelectedModal(null);
47
71
  }, [setSelectedModal]);
@@ -59,7 +83,6 @@ const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
59
83
  }, [initialPublicLicenseKey, setPublicLicenseKey]);
60
84
  return (jsx_runtime_1.jsx(DismissableModal_1.DismissableModal, { panelStyle: render_modals_1.outerModalStyle, children: jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
61
85
  jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Settings", onClose: dismiss }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
62
- jsx_runtime_1.jsxs("div", { style: render_modals_1.leftSidebar, children: [jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'rendering', onClick: () => selectTab('rendering'), 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: "Defaults" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'studio', onClick: () => selectTab('studio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(remotion_triangle_1.RemotionTriangleIcon, { color: color, style: render_modals_1.icon }) })), children: "Studio" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: appsIconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" }), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(certificate_1.CertificateIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })] }), openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, {}) })) : null, openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, {}) })) : null, openedTabs.includes('rendering') ? (jsx_runtime_1.jsx("div", { style: tab === 'rendering' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(RenderingSettings_1.RenderingSettings, {}) })) : null, openedTabs.includes('studio') ? (jsx_runtime_1.jsx("div", { style: tab === 'studio' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(StudioSettings_1.StudioSettings, {}) })) : null] }), jsx_runtime_1.jsx(SettingsModalFooter_1.SettingsModalFooter, {})
63
- ] }) }));
86
+ jsx_runtime_1.jsxs("div", { style: settingsLeftSidebar, children: [isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'rendering', onClick: () => selectTab('rendering'), 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: "Defaults" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'studio', onClick: () => selectTab('studio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(remotion_triangle_1.RemotionTriangleIcon, { color: color, style: render_modals_1.icon }) })), children: "Studio" })), jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'shortcuts', onClick: () => selectTab('shortcuts'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(keyboard_1.KeyboardIcon, { color: color, style: keyboardIcon }) })), children: "Shortcuts" }), showPackages ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'packages', onClick: () => selectTab('packages'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(package_1.PackageIcon, { color: color, style: render_modals_1.icon }) })), children: "Packages" })) : null, isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'skills', onClick: () => selectTab('skills'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(skills_1.SkillsIcon, { color: color, style: skillsIcon }) })), children: "Skills" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" })), isBrowserStudio ? null : (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(license_1.LicenseIcon, { color: color, style: render_modals_1.icon }) })), children: "License" }))] }), openedTabs.includes('packages') ? (jsx_runtime_1.jsx("div", { style: tab === 'packages' ? render_modals_1.optionsPanel : hiddenPanel, children: jsx_runtime_1.jsx(InstallPackage_1.InstallPackageSettings, { footerContainer: packagesFooterContainer, packageManager: packageManager }) })) : null, openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, {}) })) : null, openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, {}) })) : null, openedTabs.includes('skills') ? (jsx_runtime_1.jsx("div", { style: tab === 'skills' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(SkillsSettings_1.SkillsSettings, {}) })) : null, openedTabs.includes('shortcuts') ? (jsx_runtime_1.jsx("div", { style: tab === 'shortcuts' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(KeyboardShortcutsSettings_1.KeyboardShortcutsSettings, {}) })) : null, openedTabs.includes('rendering') ? (jsx_runtime_1.jsx("div", { style: tab === 'rendering' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(RenderingSettings_1.RenderingSettings, {}) })) : null, openedTabs.includes('studio') ? (jsx_runtime_1.jsx("div", { style: tab === 'studio' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(StudioSettings_1.StudioSettings, {}) })) : null] }), tab === 'packages' ? (jsx_runtime_1.jsx("div", { ref: setPackagesFooterContainer })) : isBrowserStudio ? null : (jsx_runtime_1.jsx(SettingsModalFooter_1.SettingsModalFooter, {}))] }) }));
64
87
  };
65
88
  exports.SettingsModal = SettingsModal;
@@ -5,6 +5,7 @@ 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 InspectorOpenInEditor_1 = require("./InspectorOpenInEditor");
8
+ const layout_1 = require("./layout");
8
9
  const ModalFooter_1 = require("./ModalFooter");
9
10
  const footer = {
10
11
  flex: 'none',
@@ -38,7 +39,7 @@ const SettingsModalFooter = () => {
38
39
  };
39
40
  }, []);
40
41
  return (jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { style: footer, children: jsx_runtime_1.jsx("div", { style: footerRow, children: jsx_runtime_1.jsxs("div", { style: configFileHint, children: ["Changes save to",
41
- jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { locationType: null, location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }) })
42
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { locationType: null, location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }) })
42
43
  ] }) }) }));
43
44
  };
44
45
  exports.SettingsModalFooter = SettingsModalFooter;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const SkillsSettings: React.FC;