@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
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SegmentedButton = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const player_1 = require("@remotion/player");
9
+ const react_1 = require("react");
10
+ const react_dom_1 = __importDefault(require("react-dom"));
11
+ const colors_1 = require("../helpers/colors");
12
+ const hoverable_1 = require("../helpers/hoverable");
13
+ const mobile_layout_1 = require("../helpers/mobile-layout");
14
+ const noop_1 = require("../helpers/noop");
15
+ const z_index_1 = require("../state/z-index");
16
+ const is_menu_item_1 = require("./Menu/is-menu-item");
17
+ const portals_1 = require("./Menu/portals");
18
+ const styles_1 = require("./Menu/styles");
19
+ const MenuContent_1 = require("./NewComposition/MenuContent");
20
+ const SEGMENTED_BUTTON_BORDER_RADIUS = 6;
21
+ const containerStyle = {
22
+ alignItems: 'center',
23
+ borderRadius: SEGMENTED_BUTTON_BORDER_RADIUS,
24
+ boxSizing: 'border-box',
25
+ display: 'inline-flex',
26
+ flexDirection: 'row',
27
+ flexShrink: 0,
28
+ gap: 1,
29
+ height: 24,
30
+ overflow: 'hidden',
31
+ };
32
+ const segmentStyle = {
33
+ alignItems: 'center',
34
+ appearance: 'none',
35
+ border: 'none',
36
+ boxSizing: 'border-box',
37
+ cursor: 'default',
38
+ display: 'inline-flex',
39
+ fontFamily: 'sans-serif',
40
+ fontSize: 12,
41
+ height: '100%',
42
+ justifyContent: 'center',
43
+ lineHeight: '16px',
44
+ margin: 0,
45
+ minWidth: 0,
46
+ padding: '0 6px',
47
+ whiteSpace: 'nowrap',
48
+ };
49
+ const getSegmentBorderRadius = ({ index, segmentCount, }) => {
50
+ if (segmentCount === 1) {
51
+ return SEGMENTED_BUTTON_BORDER_RADIUS;
52
+ }
53
+ if (index === 0) {
54
+ return `${SEGMENTED_BUTTON_BORDER_RADIUS}px 0 0 ${SEGMENTED_BUTTON_BORDER_RADIUS}px`;
55
+ }
56
+ if (index === segmentCount - 1) {
57
+ return `0 ${SEGMENTED_BUTTON_BORDER_RADIUS}px ${SEGMENTED_BUTTON_BORDER_RADIUS}px 0`;
58
+ }
59
+ return 0;
60
+ };
61
+ const preventPointerFocus = (event) => {
62
+ if (event.button !== 0) {
63
+ return;
64
+ }
65
+ if (document.activeElement instanceof HTMLElement) {
66
+ document.activeElement.blur();
67
+ }
68
+ event.preventDefault();
69
+ };
70
+ const preventMouseFocus = (event) => {
71
+ event.stopPropagation();
72
+ if (event.button !== 0) {
73
+ return;
74
+ }
75
+ if (document.activeElement instanceof HTMLElement) {
76
+ document.activeElement.blur();
77
+ }
78
+ event.preventDefault();
79
+ };
80
+ const SegmentedButtonAction = ({ index, segment, segmentCount }) => {
81
+ var _a, _b;
82
+ const { tabIndex } = (0, z_index_1.useZIndex)();
83
+ const style = (0, react_1.useMemo)(() => {
84
+ return {
85
+ ...segmentStyle,
86
+ borderRadius: getSegmentBorderRadius({ index, segmentCount }),
87
+ opacity: segment.disabled ? 0.5 : 1,
88
+ ...(0, hoverable_1.hoverableStyle)({
89
+ idleBackground: colors_1.TRANSPARENT,
90
+ hoverBackground: segment.disabled
91
+ ? colors_1.TRANSPARENT
92
+ : (0, colors_1.getBackgroundFromHoverState)({ hovered: true, selected: false }),
93
+ idleColor: segment.idleColor,
94
+ hoverColor: segment.disabled ? segment.idleColor : colors_1.WHITE,
95
+ }),
96
+ ...segment.style,
97
+ };
98
+ }, [index, segment, segmentCount]);
99
+ const onClick = (0, react_1.useCallback)((event) => {
100
+ event.stopPropagation();
101
+ segment.onClick(event);
102
+ }, [segment]);
103
+ const onPointerDown = (0, react_1.useCallback)((event) => {
104
+ var _a;
105
+ event.stopPropagation();
106
+ (_a = segment.onPointerDown) === null || _a === void 0 ? void 0 : _a.call(segment, event);
107
+ preventPointerFocus(event);
108
+ }, [segment]);
109
+ return (jsx_runtime_1.jsx("button", { "aria-label": segment.ariaLabel, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: segment.disabled, id: (_a = segment.buttonId) !== null && _a !== void 0 ? _a : undefined, onClick: onClick, onMouseDown: preventMouseFocus, onPointerDown: onPointerDown, style: style, tabIndex: tabIndex, title: (_b = segment.title) !== null && _b !== void 0 ? _b : undefined, type: "button", children: segment.renderContent(colors_1.CURRENT_COLOR) }));
110
+ };
111
+ const SegmentedButtonMenu = ({ index, segment, segmentCount }) => {
112
+ var _a, _b;
113
+ const [opened, setOpened] = (0, react_1.useState)(false);
114
+ const ref = (0, react_1.useRef)(null);
115
+ const { currentZIndex, tabIndex } = (0, z_index_1.useZIndex)();
116
+ const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
117
+ const size = player_1.PlayerInternals.useElementSize(ref, {
118
+ triggerOnWindowResize: true,
119
+ shouldApplyCssTransforms: true,
120
+ });
121
+ const refresh = size === null || size === void 0 ? void 0 : size.refresh;
122
+ const onHide = (0, react_1.useCallback)(() => {
123
+ var _a;
124
+ setOpened(false);
125
+ (_a = segment.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(segment, false);
126
+ }, [segment]);
127
+ const onOutsideClick = (0, react_1.useCallback)((target) => {
128
+ var _a;
129
+ if ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(target)) {
130
+ return;
131
+ }
132
+ onHide();
133
+ }, [onHide]);
134
+ const onClick = (0, react_1.useCallback)((event) => {
135
+ event.preventDefault();
136
+ event.stopPropagation();
137
+ if (segment.values.length === 0) {
138
+ return;
139
+ }
140
+ refresh === null || refresh === void 0 ? void 0 : refresh();
141
+ setOpened((currentlyOpened) => {
142
+ var _a;
143
+ const next = !currentlyOpened;
144
+ (_a = segment.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(segment, next);
145
+ return next;
146
+ });
147
+ }, [refresh, segment]);
148
+ const onPointerDown = (0, react_1.useCallback)((event) => {
149
+ event.stopPropagation();
150
+ preventPointerFocus(event);
151
+ }, []);
152
+ const spaceToBottom = (0, react_1.useMemo)(() => {
153
+ if (!size || !opened) {
154
+ return 0;
155
+ }
156
+ return size.windowSize.height - (size.top + size.height) - 10;
157
+ }, [opened, size]);
158
+ const spaceToTop = (0, react_1.useMemo)(() => {
159
+ if (!size || !opened) {
160
+ return 0;
161
+ }
162
+ return size.top - 10;
163
+ }, [opened, size]);
164
+ const portalStyle = (0, react_1.useMemo)(() => {
165
+ if (!opened || !size) {
166
+ return null;
167
+ }
168
+ const minSpaceRequired = isMobileLayout
169
+ ? styles_1.MAX_MOBILE_MENU_WIDTH
170
+ : styles_1.MAX_MENU_WIDTH;
171
+ const spaceToRight = size.windowSize.width - size.left;
172
+ const spaceToLeft = size.left + size.width;
173
+ const canOpenOnLeft = spaceToLeft >= minSpaceRequired;
174
+ const canOpenOnRight = spaceToRight >= minSpaceRequired;
175
+ const openTowardsTop = spaceToTop > spaceToBottom;
176
+ return {
177
+ ...(openTowardsTop
178
+ ? {
179
+ ...styles_1.menuContainerTowardsTop,
180
+ bottom: size.windowSize.height - size.top,
181
+ }
182
+ : {
183
+ ...styles_1.menuContainerTowardsBottom,
184
+ top: size.top + size.height,
185
+ }),
186
+ ...(canOpenOnRight
187
+ ? { left: size.left }
188
+ : canOpenOnLeft
189
+ ? { right: size.windowSize.width - size.left - size.width }
190
+ : { left: 0 }),
191
+ };
192
+ }, [isMobileLayout, opened, size, spaceToBottom, spaceToTop]);
193
+ const style = (0, react_1.useMemo)(() => {
194
+ return {
195
+ ...segmentStyle,
196
+ borderRadius: getSegmentBorderRadius({ index, segmentCount }),
197
+ opacity: segment.disabled ? 0.5 : 1,
198
+ ...(0, hoverable_1.hoverableStyle)({
199
+ idleBackground: opened
200
+ ? (0, colors_1.getBackgroundFromHoverState)({ hovered: false, selected: true })
201
+ : colors_1.TRANSPARENT,
202
+ hoverBackground: segment.disabled
203
+ ? colors_1.TRANSPARENT
204
+ : (0, colors_1.getBackgroundFromHoverState)({ hovered: true, selected: opened }),
205
+ idleColor: opened ? colors_1.WHITE : segment.idleColor,
206
+ hoverColor: segment.disabled ? segment.idleColor : colors_1.WHITE,
207
+ }),
208
+ ...segment.style,
209
+ };
210
+ }, [index, opened, segment, segmentCount]);
211
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
212
+ jsx_runtime_1.jsx("button", { ref: ref, "aria-expanded": opened, "aria-haspopup": "menu", "aria-label": segment.ariaLabel, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME} ${is_menu_item_1.MENU_INITIATOR_CLASSNAME}`, disabled: segment.disabled, id: (_a = segment.buttonId) !== null && _a !== void 0 ? _a : undefined, onClick: onClick, onMouseDown: preventMouseFocus, onPointerDown: onPointerDown, style: style, tabIndex: tabIndex, title: (_b = segment.title) !== null && _b !== void 0 ? _b : undefined, type: "button", children: segment.renderContent(colors_1.CURRENT_COLOR) }), portalStyle
213
+ ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, onPointerDown: (event) => event.stopPropagation(), children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onOutsideClick, onEscape: onHide, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { fixedHeight: Math.max(spaceToBottom, spaceToTop), leaveLeftSpace: segment.leaveLeftSpace, onHide: onHide, onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, preselectIndex: segment.selectedId === null
214
+ ? false
215
+ : segment.values.findIndex((value) => value.id === segment.selectedId), topItemCanBeUnselected: false, values: segment.values }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
216
+ : null] }));
217
+ };
218
+ const SegmentedButton = ({ segments, style, title }) => {
219
+ return (jsx_runtime_1.jsx("div", { style: { ...containerStyle, ...style }, title: title !== null && title !== void 0 ? title : undefined, children: segments.map((segment, index) => {
220
+ if (segment.type === 'action') {
221
+ return (jsx_runtime_1.jsx(SegmentedButtonAction, { index: index, segment: segment, segmentCount: segments.length }, segment.segmentId));
222
+ }
223
+ return (jsx_runtime_1.jsx(SegmentedButtonMenu, { index: index, segment: segment, segmentCount: segments.length }, segment.segmentId));
224
+ }) }));
225
+ };
226
+ exports.SegmentedButton = SegmentedButton;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import type { SelectedOutline } from './selected-outline-geometry';
3
+ import type { SelectedOutlineContextMenuOpenHandler, SelectedOutlineLayoutTarget, SelectedOutlineRotationDragTarget, SelectedOutlineScaleDragTarget, SelectedOutlineTarget } from './selected-outline-types';
4
+ import type { TimelineSelection, TimelineSelectionInteraction } from './Timeline/TimelineSelection';
5
+ export declare const SelectedOutlineEditingHandles: React.FC<{
6
+ readonly dragging: boolean;
7
+ readonly getAllRotationDragTargets: () => readonly SelectedOutlineRotationDragTarget[];
8
+ readonly getAllScaleDragTargets: () => readonly SelectedOutlineScaleDragTarget[];
9
+ readonly getContextMenuOpenByKey: (key: string) => SelectedOutlineContextMenuOpenHandler | undefined;
10
+ readonly getLatestTargetByKey: (key: string) => SelectedOutlineTarget | undefined;
11
+ readonly layoutTarget: SelectedOutlineLayoutTarget | undefined;
12
+ readonly onContextMenuOpenChange: (open: boolean) => void;
13
+ readonly onDraggingChange: (dragging: boolean) => void;
14
+ readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
15
+ readonly outline: SelectedOutline;
16
+ }>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SelectedOutlineEditingHandles = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const react_1 = __importStar(require("react"));
39
+ const selected_outline_control_layout_1 = require("./selected-outline-control-layout");
40
+ const SelectedOutlineCropControls_1 = require("./SelectedOutlineCropControls");
41
+ const SelectedOutlineRotationCornerHandle_1 = require("./SelectedOutlineRotationCornerHandle");
42
+ const SelectedOutlineScaleEdgeLine_1 = require("./SelectedOutlineScaleEdgeLine");
43
+ const use_selected_outline_control_target_1 = require("./use-selected-outline-control-target");
44
+ const SelectedOutlineEditingHandles = ({ dragging, getAllRotationDragTargets, getAllScaleDragTargets, getContextMenuOpenByKey, getLatestTargetByKey, layoutTarget, onContextMenuOpenChange, onDraggingChange, onSelect, outline, }) => {
45
+ const { controlTarget, hovered, onHoverChange } = (0, use_selected_outline_control_target_1.useSelectedOutlineControlTarget)({
46
+ getLatestTargetByKey,
47
+ layoutTarget,
48
+ });
49
+ const controlLayout = (0, react_1.useMemo)(() => (0, selected_outline_control_layout_1.getSelectedOutlineControlLayout)(outline.points), [outline.points]);
50
+ const onContextMenuOpen = react_1.default.useCallback(() => {
51
+ var _a;
52
+ var _b;
53
+ return (_b = (_a = getContextMenuOpenByKey(outline.key)) === null || _a === void 0 ? void 0 : _a()) !== null && _b !== void 0 ? _b : false;
54
+ }, [getContextMenuOpenByKey, outline.key]);
55
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
56
+ jsx_runtime_1.jsx(SelectedOutlineCropControls_1.SelectedOutlineCropControls, { outline: outline, onDraggingChange: onDraggingChange, target: controlTarget }), (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
57
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
58
+ ? controlLayout.scaleEdges.map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine_1.SelectedOutlineScaleEdgeLine, { getAllScaleDragTargets: getAllScaleDragTargets, dragging: dragging, edge: edge, hitWidth: edge === 'top' || edge === 'bottom'
59
+ ? controlLayout.scaleHitWidth.horizontal
60
+ : controlLayout.scaleHitWidth.vertical, outline: outline, onContextMenuOpen: onContextMenuOpen, onContextMenuOpenChange: onContextMenuOpenChange, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: controlTarget }, edge)))
61
+ : null, (controlTarget === null || controlTarget === void 0 ? void 0 : controlTarget.cropDrag) === null &&
62
+ ((layoutTarget === null || layoutTarget === void 0 ? void 0 : layoutTarget.containsSelection) || hovered)
63
+ ? 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)))
64
+ : null] }));
65
+ };
66
+ exports.SelectedOutlineEditingHandles = SelectedOutlineEditingHandles;
@@ -1,7 +1,7 @@
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 SelectedOutlineDragTarget, type SelectedOutlineLayoutTarget, type SelectedOutlineRotationDragTarget, type SelectedOutlineScaleDragTarget, type SelectedOutlineTarget } from './selected-outline-types';
4
+ import { type SelectedOutlineContextMenuOpenHandler, type SelectedOutlineDragTarget, type SelectedOutlineLayoutTarget, type SelectedOutlineTarget } from './selected-outline-types';
5
5
  import { type TimelineSelection, type TimelineSelectionInteraction } from './Timeline/TimelineSelection';
6
6
  type SelectedOutlineElementProps = {
7
7
  readonly compositionHeight: number;
@@ -9,15 +9,13 @@ type SelectedOutlineElementProps = {
9
9
  readonly dragging: boolean;
10
10
  readonly getAllDragOutlines: () => readonly SelectedOutline[];
11
11
  readonly getAllDragTargets: () => readonly SelectedOutlineDragTarget[];
12
- readonly getAllRotationDragTargets: () => readonly SelectedOutlineRotationDragTarget[];
13
- readonly getAllScaleDragTargets: () => readonly SelectedOutlineScaleDragTarget[];
14
12
  readonly getLatestTargetByKey: (key: string) => SelectedOutlineTarget | undefined;
15
13
  readonly layoutTarget: SelectedOutlineLayoutTarget | undefined;
16
14
  readonly outline: SelectedOutline;
17
15
  readonly onDraggingChange: (dragging: boolean) => void;
18
- readonly onContextMenuOpenChange: (open: boolean) => void;
19
16
  readonly onSnapPointsChange: (snapPoints: readonly SelectedOutlineSnapPoint[]) => void;
20
17
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
18
+ readonly registerContextMenuOpen: (key: string, handler: SelectedOutlineContextMenuOpenHandler | null) => void;
21
19
  readonly scale: number;
22
20
  };
23
21
  export declare const SelectedOutlineElement: React.NamedExoticComponent<SelectedOutlineElementProps>;
@@ -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, 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, 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, transform3DMode: controlTarget.rotationDrag.transform3DMode })) : 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,8 +1,9 @@
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;
@@ -15,14 +16,12 @@ export declare const SelectedOutlinePolygon: React.NamedExoticComponent<{
15
16
  readonly getTarget: () => SelectedOutlineTarget | undefined;
16
17
  readonly hasTarget: boolean;
17
18
  readonly hovered: boolean;
18
- readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
19
- readonly onContextMenuOpenChange: (open: boolean) => void;
20
19
  readonly outline: SelectedOutline;
21
20
  readonly onDraggingChange: (dragging: boolean) => void;
22
21
  readonly onHoverChange: (key: string | null) => void;
23
22
  readonly onSnapPointsChange: (snapPoints: readonly SelectedOutlineSnapPoint[]) => void;
24
23
  readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
25
- readonly onDoubleClickTarget: (target: SelectedOutlineTarget, button: number) => boolean;
24
+ readonly onDoubleClickTarget: (target: SelectedOutlineTarget, button: number, sequenceWasDragged: boolean) => boolean;
26
25
  readonly scale: number;
27
26
  readonly showSelectedOutline: boolean;
28
27
  }>;