@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.
- package/dist/api/restart-studio.js +4 -0
- package/dist/components/AssetSelector.js +3 -9
- package/dist/components/AssetSelectorItem.d.ts +2 -1
- package/dist/components/AssetSelectorItem.js +24 -29
- package/dist/components/Canvas.js +7 -4
- package/dist/components/CaptionInspector.d.ts +2 -0
- package/dist/components/CaptionInspector.js +3 -5
- package/dist/components/CompositionSelector.js +6 -3
- package/dist/components/CompositionSelectorItem.js +9 -10
- package/dist/components/ConfigSelect.d.ts +17 -0
- package/dist/components/ConfigSelect.js +50 -0
- package/dist/components/CurrentAsset.d.ts +10 -2
- package/dist/components/CurrentAsset.js +139 -46
- package/dist/components/FixComputedValueModal.js +54 -51
- package/dist/components/GlobalKeybindings.js +5 -5
- package/dist/components/InlineAction.d.ts +1 -1
- package/dist/components/InlineAction.js +12 -2
- package/dist/components/InlineCaptionInspector.d.ts +2 -0
- package/dist/components/InlineCaptionInspector.js +2 -2
- package/dist/components/InlineCompositionName.js +1 -1
- package/dist/components/InlineEditableTitle.js +3 -2
- package/dist/components/InspectorInfoHeader.js +1 -1
- package/dist/components/InspectorOpenInEditor.js +48 -72
- package/dist/components/InspectorPanel/AlignmentControls.js +2 -3
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +7 -0
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +39 -0
- package/dist/components/InspectorPanel/CompositionInspector.js +14 -7
- package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +10 -4
- package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -1
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -4
- package/dist/components/InspectorPanel/common.d.ts +0 -12
- package/dist/components/InspectorPanel/common.js +3 -52
- package/dist/components/InspectorPanel/use-composition-actions.js +0 -1
- package/dist/components/InspectorPanelLayout.d.ts +1 -1
- package/dist/components/InspectorPanelLayout.js +1 -1
- package/dist/components/InspectorSequenceSection.js +40 -54
- package/dist/components/InstallPackage.d.ts +2 -1
- package/dist/components/InstallPackage.js +60 -30
- package/dist/components/InstallablePackage.js +37 -11
- package/dist/components/KeyboardShortcutsSettings.d.ts +2 -0
- package/dist/components/KeyboardShortcutsSettings.js +177 -0
- package/dist/components/MenuBuildIndicator.js +1 -1
- package/dist/components/Modals.js +6 -5
- package/dist/components/NewComposition/CodemodFooter.d.ts +0 -1
- package/dist/components/NewComposition/CodemodFooter.js +2 -8
- package/dist/components/NewComposition/DeleteComposition.js +1 -1
- package/dist/components/NewComposition/DeleteFolder.js +1 -1
- package/dist/components/NewComposition/DuplicateComposition.js +1 -1
- package/dist/components/NewComposition/InputDragger.js +27 -4
- package/dist/components/NewComposition/NewComposition.js +1 -1
- package/dist/components/NewComposition/NewFolder.js +1 -3
- package/dist/components/NewComposition/RenameComposition.js +1 -1
- package/dist/components/NewComposition/RenameFolder.js +1 -1
- package/dist/components/NewComposition/use-rename-static-file.js +1 -1
- package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
- package/dist/components/Notifications/NotificationCenter.js +5 -0
- package/dist/components/OptionsPanel.js +9 -12
- package/dist/components/PreviewToolbar.js +5 -2
- package/dist/components/PreviewToolbarOverflowButton.js +30 -0
- package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +2 -2
- package/dist/components/QuickSwitcher/QuickSwitcherContent.js +14 -30
- package/dist/components/RenderButton.js +66 -183
- package/dist/components/RenderModal/DataEditor.js +15 -12
- package/dist/components/RenderModal/RenderStatusModal.js +0 -1
- package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +3 -1
- package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.d.ts +15 -0
- package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.js +95 -0
- package/dist/components/RenderQueue/RenderQueueRemoveItem.js +1 -6
- package/dist/components/RenderingSettings.js +7 -4
- package/dist/components/RulersAndGuidesToggle.d.ts +2 -0
- package/dist/components/RulersAndGuidesToggle.js +23 -0
- package/dist/components/SegmentedButton.d.ts +29 -0
- package/dist/components/SegmentedButton.js +226 -0
- package/dist/components/SelectedOutlineEditingHandles.d.ts +16 -0
- package/dist/components/SelectedOutlineEditingHandles.js +66 -0
- package/dist/components/SelectedOutlineElement.d.ts +2 -4
- package/dist/components/SelectedOutlineElement.js +15 -54
- package/dist/components/SelectedOutlineOverlay.js +32 -6
- package/dist/components/SelectedOutlinePolygon.d.ts +3 -4
- package/dist/components/SelectedOutlinePolygon.js +18 -16
- package/dist/components/SelectedOutlineRenderer.js +66 -14
- package/dist/components/SettingsModal.d.ts +1 -1
- package/dist/components/SettingsModal.js +30 -7
- package/dist/components/SettingsModalFooter.js +2 -1
- package/dist/components/SkillsSettings.d.ts +2 -0
- package/dist/components/SkillsSettings.js +129 -0
- package/dist/components/StaticFilePreview.js +7 -1
- package/dist/components/StudioSettings.js +7 -48
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Timeline/Timeline.js +0 -1
- package/dist/components/Timeline/TimelineAssetField.d.ts +1 -1
- package/dist/components/Timeline/TimelineAssetField.js +15 -9
- package/dist/components/Timeline/TimelineBooleanField.js +1 -4
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +7 -10
- package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineEffectItem.js +23 -10
- package/dist/components/Timeline/TimelineEffectPropItem.js +15 -2
- package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
- package/dist/components/Timeline/TimelineFieldLabel.js +4 -2
- package/dist/components/Timeline/TimelineFieldRowContent.d.ts +1 -2
- package/dist/components/Timeline/TimelineFieldRowContent.js +8 -21
- package/dist/components/Timeline/TimelineImageInfo.d.ts +0 -1
- package/dist/components/Timeline/TimelineImageInfo.js +13 -32
- package/dist/components/Timeline/TimelineKeyframeControls.js +10 -4
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
- package/dist/components/Timeline/TimelineRotationField.js +0 -2
- package/dist/components/Timeline/TimelineRowChrome.d.ts +0 -1
- package/dist/components/Timeline/TimelineRowChrome.js +3 -4
- package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +0 -1
- package/dist/components/Timeline/TimelineRowLayoutContext.js +1 -4
- package/dist/components/Timeline/TimelineScaleField.js +2 -6
- package/dist/components/Timeline/TimelineSchemaField.js +9 -3
- package/dist/components/Timeline/TimelineSelection.js +1 -1
- package/dist/components/Timeline/TimelineSequence.d.ts +2 -0
- package/dist/components/Timeline/TimelineSequence.js +110 -19
- package/dist/components/Timeline/TimelineSequenceItem.js +5 -5
- package/dist/components/Timeline/TimelineSequencePropItem.js +15 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +4 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +85 -91
- package/dist/components/Timeline/TimelineTrack.js +1 -1
- package/dist/components/Timeline/TimelineTransformOriginField.js +0 -4
- package/dist/components/Timeline/TimelineTranslateField.js +0 -4
- package/dist/components/Timeline/TimelineVirtualization.js +3 -1
- package/dist/components/Timeline/duplicate-selected-timeline-item.js +3 -12
- package/dist/components/Timeline/get-copy-context-for-agents-menu-item.d.ts +4 -0
- package/dist/components/Timeline/get-copy-context-for-agents-menu-item.js +26 -0
- package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -19
- package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +6 -1
- package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +11 -4
- package/dist/components/Timeline/split-selected-timeline-item.js +0 -1
- package/dist/components/Timeline/timeline-field-row-layout.d.ts +1 -1
- package/dist/components/Timeline/timeline-field-row-layout.js +4 -7
- package/dist/components/Timeline/timeline-field-utils.js +0 -2
- package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
- package/dist/components/TimelineCombobox.js +25 -160
- package/dist/components/TimelineInOutToggle.js +4 -1
- package/dist/components/duplicate-jsx-node-api.d.ts +2 -0
- package/dist/components/duplicate-jsx-node-api.js +12 -0
- package/dist/components/effect-drag-and-drop.js +1 -4
- package/dist/components/handle-drop.d.ts +2 -1
- package/dist/components/handle-drop.js +3 -3
- package/dist/components/import-assets.js +9 -65
- package/dist/components/keyboard-shortcuts.d.ts +10 -0
- package/dist/components/keyboard-shortcuts.js +135 -0
- package/dist/components/selected-outline-control-layout.js +2 -6
- package/dist/components/selected-outline-measurement.d.ts +1 -1
- package/dist/components/selected-outline-measurement.js +16 -3
- package/dist/components/use-delete-asset.d.ts +1 -0
- package/dist/components/use-delete-asset.js +40 -0
- package/dist/components/use-selected-outline-control-target.d.ts +11 -0
- package/dist/components/use-selected-outline-control-target.js +79 -0
- package/dist/esm/{chunk-s6k99gh2.js → chunk-4bxz1d3g.js} +3 -2
- package/dist/esm/{chunk-v5a8vpv4.js → chunk-w4244j4n.js} +17766 -17618
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/internals.mjs +17765 -17617
- package/dist/esm/previewEntry.mjs +17570 -17422
- package/dist/esm/renderEntry.mjs +2 -2
- package/dist/helpers/add-asset-cache-bust.d.ts +4 -0
- package/dist/helpers/add-asset-cache-bust.js +10 -0
- package/dist/helpers/calculate-timeline.js +2 -1
- package/dist/helpers/colors.d.ts +2 -0
- package/dist/helpers/colors.js +6 -2
- package/dist/helpers/drag-aware-double-click.d.ts +6 -0
- package/dist/helpers/drag-aware-double-click.js +20 -0
- package/dist/helpers/get-asset-metadata.js +25 -16
- package/dist/helpers/get-sequence-double-click-action.d.ts +2 -1
- package/dist/helpers/get-sequence-double-click-action.js +7 -1
- package/dist/helpers/get-timeline-sequence-layout.d.ts +4 -1
- package/dist/helpers/get-timeline-sequence-layout.js +15 -6
- package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -1
- package/dist/helpers/hoverable.d.ts +1 -0
- package/dist/helpers/hoverable.js +2 -1
- package/dist/helpers/inject-css.js +3 -1
- package/dist/helpers/open-in-remotion-convert.d.ts +7 -0
- package/dist/helpers/open-in-remotion-convert.js +18 -0
- package/dist/helpers/use-media-metadata.d.ts +2 -1
- package/dist/helpers/use-media-metadata.js +12 -5
- package/dist/helpers/use-menu-structure.js +32 -32
- package/dist/icons/align-center-horizontal.js +1 -1
- package/dist/icons/align-left.js +1 -1
- package/dist/icons/align-right.js +1 -1
- package/dist/icons/keyboard.d.ts +4 -0
- package/dist/icons/keyboard.js +10 -0
- package/dist/icons/license.d.ts +4 -0
- package/dist/icons/license.js +8 -0
- package/dist/icons/package.d.ts +4 -0
- package/dist/icons/package.js +8 -0
- package/dist/icons/react.js +1 -1
- package/dist/icons/remotion-convert.d.ts +4 -0
- package/dist/icons/remotion-convert.js +10 -0
- package/dist/icons/skills.d.ts +4 -0
- package/dist/icons/skills.js +10 -0
- package/dist/state/modals.d.ts +2 -5
- package/package.json +12 -12
- package/dist/components/KeyboardShortcutsExplainer.d.ts +0 -2
- 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
|
|
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
|
|
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
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
}>;
|