@remotion/studio 4.0.505 → 4.0.507
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/copy-render-output-to-asset.d.ts +4 -0
- package/dist/api/copy-render-output-to-asset.js +11 -0
- package/dist/api/install-package.d.ts +2 -3
- package/dist/api/install-package.js +1 -3
- package/dist/api/visual-control.d.ts +3 -0
- package/dist/api/visual-control.js +3 -0
- package/dist/components/AssetSelector.js +19 -4
- package/dist/components/AssetSelectorItem.js +3 -3
- package/dist/components/Canvas.js +2 -0
- package/dist/components/CodingAgentIcon.d.ts +4 -0
- package/dist/components/CodingAgentIcon.js +17 -0
- package/dist/components/CompositionSelector.js +1 -1
- package/dist/components/CompositionSelectorItem.js +1 -1
- package/dist/components/ConfigureDefaultEditorModal.d.ts +1 -1
- package/dist/components/ConfigureDefaultEditorModal.js +117 -69
- package/dist/components/ConfigureLicenseModal.d.ts +1 -3
- package/dist/components/ConfigureLicenseModal.js +105 -89
- package/dist/components/ConfirmationDialog.js +2 -2
- package/dist/components/ContextMenu.js +10 -8
- package/dist/components/Editor.js +2 -0
- package/dist/components/EditorContexts.js +6 -5
- package/dist/components/EffectPickerModal.js +1 -1
- package/dist/components/ExpandedTracksProvider.js +10 -53
- package/dist/components/GlobalKeybindings.js +3 -2
- package/dist/components/InlineCaptionInspector.d.ts +2 -2
- package/dist/components/InlineDropdown.d.ts +2 -1
- package/dist/components/InlineDropdown.js +10 -4
- package/dist/components/InspectorLocationCopy.js +8 -8
- package/dist/components/InspectorOpenInEditor.d.ts +2 -0
- package/dist/components/InspectorOpenInEditor.js +63 -49
- package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
- package/dist/components/InspectorPanel/CompositionInspector.js +15 -1
- package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +1 -1
- package/dist/components/InspectorPanel/EasingInspector.js +7 -4
- package/dist/components/InspectorPanel/KeyframeInspector.js +5 -1
- package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -0
- package/dist/components/InspectorPanel/SequenceInspectorHeader.js +22 -4
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -1
- package/dist/components/InspectorPanel/common.d.ts +1 -0
- package/dist/components/InspectorPanel/common.js +2 -2
- package/dist/components/InspectorPanel/use-composition-actions.js +4 -1
- package/dist/components/InspectorSequenceSection.js +4 -4
- package/dist/components/InstallPackage.js +1 -1
- package/dist/components/Menu/MenuSectionHeader.d.ts +4 -0
- package/dist/components/Menu/MenuSectionHeader.js +20 -0
- package/dist/components/Menu/SubMenu.js +13 -2
- package/dist/components/Menu/menu-tree-context.d.ts +3 -0
- package/dist/components/Menu/menu-tree-context.js +13 -0
- package/dist/components/MenuBuildIndicator.js +1 -0
- package/dist/components/MenuToolbar.js +1 -1
- package/dist/components/ModalFooter.d.ts +1 -0
- package/dist/components/ModalFooter.js +6 -2
- package/dist/components/ModalHeader.js +1 -1
- package/dist/components/Modals.js +18 -7
- package/dist/components/ModalsProvider.js +5 -6
- package/dist/components/NewComposition/CodemodFooter.js +1 -1
- package/dist/components/NewComposition/ComboBox.d.ts +6 -1
- package/dist/components/NewComposition/DismissableModal.js +1 -1
- package/dist/components/NewComposition/MenuContent.js +27 -19
- package/dist/components/NewComposition/RenameStaticFile.js +1 -1
- package/dist/components/NewComposition/menu-typeahead.js +2 -2
- package/dist/components/OverrideInputProps.js +1 -1
- package/dist/components/PlayPause.js +2 -1
- package/dist/components/PlaybackKeyboardShortcutsManager.js +7 -5
- package/dist/components/Preview.js +29 -4
- package/dist/components/PreviewToolbarOverflowButton.js +4 -2
- package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
- package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
- package/dist/components/RenderButton.d.ts +3 -3
- package/dist/components/RenderButton.js +42 -7
- package/dist/components/RenderModal/RenderStatusModal.js +1 -1
- package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.d.ts +1 -0
- package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +2 -2
- package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +3 -3
- package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
- package/dist/components/RenderModal/ServerRenderModal.js +5 -1
- package/dist/components/RenderModal/WebRenderModal.js +3 -2
- package/dist/components/RenderQueue/RenderQueueError.js +1 -1
- package/dist/components/RenderQueue/RenderQueueItem.js +8 -2
- package/dist/components/RenderQueue/RenderQueueItemStatus.js +1 -1
- package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
- package/dist/components/RenderQueue/RenderQueueRepeat.js +1 -1
- package/dist/components/RenderQueue/actions.d.ts +4 -2
- package/dist/components/RenderQueue/actions.js +4 -2
- package/dist/components/RenderQueue/index.js +3 -4
- package/dist/components/RenderQueue/use-render-output-file-drag.d.ts +8 -0
- package/dist/components/RenderQueue/use-render-output-file-drag.js +121 -0
- package/dist/components/SegmentedControl.js +0 -1
- package/dist/components/SelectedOutlineElement.d.ts +14 -17
- package/dist/components/SelectedOutlineElement.js +113 -931
- package/dist/components/SelectedOutlineKeyboardControls.d.ts +7 -0
- package/dist/components/SelectedOutlineKeyboardControls.js +261 -0
- package/dist/components/SelectedOutlineOverlay.d.ts +6 -13
- package/dist/components/SelectedOutlineOverlay.js +360 -832
- package/dist/components/SelectedOutlinePolygon.d.ts +25 -0
- package/dist/components/SelectedOutlinePolygon.js +359 -0
- package/dist/components/SelectedOutlineRenderer.d.ts +18 -0
- package/dist/components/SelectedOutlineRenderer.js +208 -0
- package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +16 -0
- package/dist/components/SelectedOutlineRotationCornerHandle.js +269 -0
- package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +16 -0
- package/dist/components/SelectedOutlineScaleEdgeLine.js +211 -0
- package/dist/components/SelectedOutlineSnapIndicators.d.ts +9 -0
- package/dist/components/SelectedOutlineSnapIndicators.js +29 -0
- package/dist/components/SelectedOutlineTransformOriginHandle.d.ts +9 -0
- package/dist/components/SelectedOutlineTransformOriginHandle.js +286 -0
- package/dist/components/SelectedOutlineUvControls.d.ts +3 -9
- package/dist/components/SelectedOutlineUvControls.js +57 -12
- package/dist/components/SettingsContext.d.ts +15 -0
- package/dist/components/SettingsContext.js +116 -0
- package/dist/components/SettingsModal.d.ts +7 -0
- package/dist/components/SettingsModal.js +56 -0
- package/dist/components/SettingsModalFooter.d.ts +2 -0
- package/dist/components/SettingsModalFooter.js +44 -0
- package/dist/components/ShowOutlinesProvider.js +2 -3
- package/dist/components/SidebarRenderButton.js +1 -1
- package/dist/components/SvgImportDialog.js +2 -2
- package/dist/components/TimeValue.js +1 -1
- package/dist/components/Timeline/EasingEditorModal.js +66 -22
- package/dist/components/Timeline/Timeline.js +23 -5
- package/dist/components/Timeline/TimelineAssetField.js +1 -1
- package/dist/components/Timeline/TimelineDragHandler.js +3 -3
- package/dist/components/Timeline/TimelineDuplicateCount.d.ts +4 -0
- package/dist/components/Timeline/TimelineDuplicateCount.js +28 -0
- package/dist/components/Timeline/TimelineEffectPropItem.js +5 -3
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +3 -23
- package/dist/components/Timeline/TimelineExpandedRow.d.ts +4 -2
- package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
- package/dist/components/Timeline/TimelineExpandedTrackKeyframes.d.ts +4 -2
- package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +11 -1
- package/dist/components/Timeline/TimelineFontFamilyField.js +3 -1
- package/dist/components/Timeline/TimelineKeyframeControls.js +1 -0
- package/dist/components/Timeline/TimelineSelection.js +1 -0
- package/dist/components/Timeline/TimelineSequence.js +28 -25
- package/dist/components/Timeline/TimelineSequenceItem.js +74 -58
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +1 -1
- package/dist/components/Timeline/TimelineTrack.js +2 -1
- package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +6 -3
- package/dist/components/Timeline/get-sequence-context-menu-items.js +58 -53
- package/dist/components/Timeline/reset-selected-timeline-props.js +1 -1
- package/dist/components/Timeline/should-subscribe-to-sequence-props.d.ts +1 -1
- package/dist/components/Timeline/timeline-asset-link.d.ts +2 -2
- package/dist/components/Timeline/timeline-asset-link.js +2 -2
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +38 -2
- package/dist/components/Timeline/{use-open-sequence-in-editor.d.ts → use-open-sequence-in-apps.d.ts} +4 -1
- package/dist/components/Timeline/{use-open-sequence-in-editor.js → use-open-sequence-in-apps.js} +20 -4
- package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
- package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +5 -0
- package/dist/components/Timeline/use-timeline-expanded-tree.js +50 -1
- package/dist/components/Timeline/use-timeline-height.js +20 -0
- package/dist/components/TimelineInOutToggle.js +5 -1
- package/dist/components/TopPanel.js +16 -0
- package/dist/components/UpdateCheck.js +1 -1
- package/dist/components/effect-drag-and-drop.js +1 -1
- package/dist/components/get-open-in-menu-items.d.ts +12 -0
- package/dist/components/get-open-in-menu-items.js +83 -0
- package/dist/components/handle-drop.d.ts +2 -1
- package/dist/components/handle-drop.js +12 -2
- package/dist/components/import-assets.d.ts +18 -6
- package/dist/components/import-assets.js +76 -32
- package/dist/components/selected-outline-measurement.d.ts +2 -2
- package/dist/components/selected-outline-order.d.ts +12 -0
- package/dist/components/selected-outline-order.js +251 -0
- package/dist/components/selected-outline-types.d.ts +9 -10
- package/dist/components/svg-point-to-client-point.d.ts +2 -0
- package/dist/components/svg-point-to-client-point.js +10 -0
- package/dist/components/use-auto-save-config.d.ts +8 -0
- package/dist/components/use-auto-save-config.js +74 -0
- package/dist/components/use-default-editor-info.d.ts +1 -0
- package/dist/components/use-default-editor-info.js +10 -30
- package/dist/esm/{chunk-jefhcs5z.js → chunk-fgedsvhb.js} +1 -2
- package/dist/esm/{chunk-7pgk8h5m.js → chunk-ptnd65a9.js} +14596 -12725
- package/dist/esm/internals.mjs +14595 -12724
- package/dist/esm/previewEntry.mjs +12726 -10855
- package/dist/esm/renderEntry.mjs +2 -2
- package/dist/helpers/are-sequence-node-path-infos-equal.d.ts +2 -0
- package/dist/helpers/are-sequence-node-path-infos-equal.js +27 -0
- package/dist/helpers/calculate-timeline.js +3 -3
- package/dist/helpers/client-id.d.ts +3 -1
- package/dist/helpers/client-id.js +28 -4
- package/dist/helpers/format-file-location.d.ts +1 -1
- package/dist/helpers/format-file-location.js +3 -3
- package/dist/helpers/install-required-package.d.ts +3 -3
- package/dist/helpers/install-required-package.js +1 -6
- package/dist/helpers/migrate-expanded-tracks-for-subscription-key.js +3 -3
- package/dist/helpers/open-in-editor.d.ts +1 -0
- package/dist/helpers/open-in-editor.js +5 -1
- package/dist/helpers/studio-fit-padding.d.ts +1 -1
- package/dist/helpers/studio-fit-padding.js +1 -1
- package/dist/helpers/studio-runtime-config.js +3 -0
- package/dist/helpers/timeline-layout.d.ts +2 -1
- package/dist/helpers/timeline-layout.js +5 -2
- package/dist/helpers/timeline-node-path-key.d.ts +2 -0
- package/dist/helpers/timeline-node-path-key.js +3 -1
- package/dist/helpers/use-asset-drag-events.d.ts +2 -1
- package/dist/helpers/use-asset-drag-events.js +14 -6
- package/dist/helpers/use-menu-structure.js +25 -35
- package/dist/helpers/use-runtime-values.d.ts +9 -0
- package/dist/helpers/use-runtime-values.js +76 -0
- package/dist/icons/apps.d.ts +2 -0
- package/dist/icons/apps.js +7 -0
- package/dist/icons/browse-elements.d.ts +4 -0
- package/dist/icons/browse-elements.js +10 -0
- package/dist/state/modals.d.ts +5 -6
- package/dist/state/modals.js +5 -3
- package/dist/state/timeline-sequence-hover.d.ts +9 -3
- package/dist/state/timeline-sequence-hover.js +63 -12
- package/package.json +12 -12
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SelectedOutline } from './selected-outline-geometry';
|
|
3
|
+
import { type SelectedOutlineSnapPoint } from './selected-outline-snap';
|
|
4
|
+
import { type SelectedOutlineContextMenuOpenHandler, type SelectedOutlineDragTarget, type SelectedOutlineLayoutTarget, type SelectedOutlineTarget } from './selected-outline-types';
|
|
5
|
+
import type { TimelineSelection, TimelineSelectionInteraction } from './Timeline/TimelineSelection';
|
|
6
|
+
export declare const SelectedOutlinePolygon: React.NamedExoticComponent<{
|
|
7
|
+
readonly compositionHeight: number;
|
|
8
|
+
readonly compositionWidth: number;
|
|
9
|
+
readonly dragging: boolean;
|
|
10
|
+
readonly getAllDragOutlines: () => readonly SelectedOutline[];
|
|
11
|
+
readonly getAllDragTargets: () => readonly SelectedOutlineDragTarget[];
|
|
12
|
+
readonly getLayoutTarget: () => SelectedOutlineLayoutTarget | undefined;
|
|
13
|
+
readonly getTarget: () => SelectedOutlineTarget | undefined;
|
|
14
|
+
readonly hasTarget: boolean;
|
|
15
|
+
readonly hovered: boolean;
|
|
16
|
+
readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
|
|
17
|
+
readonly outline: SelectedOutline;
|
|
18
|
+
readonly onDraggingChange: (dragging: boolean) => void;
|
|
19
|
+
readonly onHoverChange: (key: string | null) => void;
|
|
20
|
+
readonly onSnapPointsChange: (snapPoints: readonly SelectedOutlineSnapPoint[]) => void;
|
|
21
|
+
readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
|
|
22
|
+
readonly onDoubleClickTarget: (target: SelectedOutlineTarget, button: number) => boolean;
|
|
23
|
+
readonly scale: number;
|
|
24
|
+
readonly showSelectedOutline: boolean;
|
|
25
|
+
}>;
|
|
@@ -0,0 +1,359 @@
|
|
|
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.SelectedOutlinePolygon = void 0;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const remotion_1 = require("remotion");
|
|
40
|
+
const client_id_1 = require("../helpers/client-id");
|
|
41
|
+
const colors_1 = require("../helpers/colors");
|
|
42
|
+
const interactivity_enabled_1 = require("../helpers/interactivity-enabled");
|
|
43
|
+
const pointer_session_1 = require("../helpers/pointer-session");
|
|
44
|
+
const editor_guides_1 = require("../state/editor-guides");
|
|
45
|
+
const editor_snapping_1 = require("../state/editor-snapping");
|
|
46
|
+
const ContextMenu_1 = require("./ContextMenu");
|
|
47
|
+
const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
|
|
48
|
+
const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
|
|
49
|
+
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
50
|
+
const selected_outline_drag_1 = require("./selected-outline-drag");
|
|
51
|
+
const selected_outline_measurement_1 = require("./selected-outline-measurement");
|
|
52
|
+
const selected_outline_snap_1 = require("./selected-outline-snap");
|
|
53
|
+
const selected_outline_types_1 = require("./selected-outline-types");
|
|
54
|
+
const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
|
|
55
|
+
const focus_inspector_field_1 = require("./Timeline/focus-inspector-field");
|
|
56
|
+
const imperative_state_1 = require("./Timeline/imperative-state");
|
|
57
|
+
const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
|
|
58
|
+
const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth, dragging, getAllDragOutlines, getAllDragTargets, getLayoutTarget, getTarget, hasTarget, hovered, onContextMenuOpen, outline, onDraggingChange, onHoverChange, onSnapPointsChange, onSelect, onDoubleClickTarget, scale, showSelectedOutline, }) => {
|
|
59
|
+
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
60
|
+
const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
|
|
61
|
+
const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
|
|
62
|
+
const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
|
|
63
|
+
const { editorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
|
|
64
|
+
const { editorShowGuides, guidesList } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
|
|
65
|
+
const polygonRef = (0, react_1.useRef)(null);
|
|
66
|
+
const points = (0, react_1.useMemo)(() => outline.points.map(selected_outline_measurement_1.pointToString).join(' '), [outline.points]);
|
|
67
|
+
const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
|
|
68
|
+
const visible = showSelectedOutline || hovered;
|
|
69
|
+
const getEffectDropTarget = react_1.default.useCallback(() => {
|
|
70
|
+
var _a;
|
|
71
|
+
if (previewServerState.type !== 'connected' ||
|
|
72
|
+
!(0, interactivity_enabled_1.isStudioInteractivityEnabled)()) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const target = getLayoutTarget();
|
|
76
|
+
if (((_a = target === null || target === void 0 ? void 0 : target.sequence.controls) === null || _a === void 0 ? void 0 : _a.supportsEffects) !== true) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const nodePath = target.nodePathInfo.sequenceSubscriptionKey;
|
|
80
|
+
return {
|
|
81
|
+
clientId: previewServerState.clientId,
|
|
82
|
+
fileName: nodePath.absolutePath,
|
|
83
|
+
nodePath,
|
|
84
|
+
};
|
|
85
|
+
}, [getLayoutTarget, previewServerState]);
|
|
86
|
+
const onPointerDown = react_1.default.useCallback((event) => {
|
|
87
|
+
const target = getTarget();
|
|
88
|
+
if (event.button !== 0 || target === undefined) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const { drag, selected } = target;
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
event.stopPropagation();
|
|
94
|
+
const interaction = (0, selected_outline_measurement_1.getOutlineSelectionInteraction)(event);
|
|
95
|
+
const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
|
|
96
|
+
if (shouldUpdateSelection) {
|
|
97
|
+
onSelect(target.selection, interaction);
|
|
98
|
+
}
|
|
99
|
+
if (drag === null || interaction.shiftKey || interaction.toggleKey) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if ((0, focus_inspector_field_1.commitPendingInspectorFields)()) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const startPointerX = event.clientX;
|
|
106
|
+
const startPointerY = event.clientY;
|
|
107
|
+
const dragStates = (0, selected_outline_drag_1.getSelectedOutlineDragStates)({
|
|
108
|
+
dragTargets: selected ? getAllDragTargets() : [drag],
|
|
109
|
+
getDragOverrides,
|
|
110
|
+
timelinePosition: (0, imperative_state_1.getCurrentFrame)(),
|
|
111
|
+
});
|
|
112
|
+
let lastValues = new Map();
|
|
113
|
+
let currentPointerX = startPointerX;
|
|
114
|
+
let currentPointerY = startPointerY;
|
|
115
|
+
let axisLocked = false;
|
|
116
|
+
let dragStarted = false;
|
|
117
|
+
let snappingDisabled = event.metaKey || event.ctrlKey;
|
|
118
|
+
let snapTargets = null;
|
|
119
|
+
const updateDragOverrides = () => {
|
|
120
|
+
const screenDeltaX = currentPointerX - startPointerX;
|
|
121
|
+
const screenDeltaY = currentPointerY - startPointerY;
|
|
122
|
+
if (!dragStarted) {
|
|
123
|
+
if (!(0, selected_outline_drag_1.isSelectedOutlineDragPastThreshold)({
|
|
124
|
+
deltaX: screenDeltaX,
|
|
125
|
+
deltaY: screenDeltaY,
|
|
126
|
+
})) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
dragStarted = true;
|
|
130
|
+
onDraggingChange(true);
|
|
131
|
+
(0, ForceSpecificCursor_1.forceSpecificCursor)('default');
|
|
132
|
+
}
|
|
133
|
+
const axisLockedDirection = axisLocked
|
|
134
|
+
? Math.abs(screenDeltaX) >= Math.abs(screenDeltaY)
|
|
135
|
+
? 'horizontal'
|
|
136
|
+
: 'vertical'
|
|
137
|
+
: null;
|
|
138
|
+
const dragDelta = (0, selected_outline_drag_1.applySelectedOutlineDragAxisLock)({
|
|
139
|
+
deltaX: screenDeltaX / scale,
|
|
140
|
+
deltaY: screenDeltaY / scale,
|
|
141
|
+
axisLocked,
|
|
142
|
+
});
|
|
143
|
+
let { deltaX, deltaY } = dragDelta;
|
|
144
|
+
if (editorSnapping && !snappingDisabled) {
|
|
145
|
+
snapTargets !== null && snapTargets !== void 0 ? snapTargets : (snapTargets = (0, selected_outline_snap_1.getSelectedOutlineSnapTargets)({
|
|
146
|
+
compositionHeight,
|
|
147
|
+
compositionWidth,
|
|
148
|
+
guides: editorShowGuides && (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition'
|
|
149
|
+
? guidesList.filter((guide) => guide.compositionId === canvasContent.compositionId)
|
|
150
|
+
: [],
|
|
151
|
+
}));
|
|
152
|
+
const snapResult = (0, selected_outline_snap_1.findSelectedOutlineSnap)({
|
|
153
|
+
allowX: axisLockedDirection !== 'vertical',
|
|
154
|
+
allowY: axisLockedDirection !== 'horizontal',
|
|
155
|
+
deltaX,
|
|
156
|
+
deltaY,
|
|
157
|
+
outlines: selected ? getAllDragOutlines() : [outline],
|
|
158
|
+
scale,
|
|
159
|
+
targets: snapTargets,
|
|
160
|
+
});
|
|
161
|
+
if (snapResult.snapOffsetX !== null) {
|
|
162
|
+
deltaX += snapResult.snapOffsetX;
|
|
163
|
+
}
|
|
164
|
+
if (snapResult.snapOffsetY !== null) {
|
|
165
|
+
deltaY += snapResult.snapOffsetY;
|
|
166
|
+
}
|
|
167
|
+
onSnapPointsChange(snapResult.activeSnapPoints);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
onSnapPointsChange([]);
|
|
171
|
+
}
|
|
172
|
+
lastValues = (0, selected_outline_drag_1.getSelectedOutlineDragValues)({
|
|
173
|
+
dragStates,
|
|
174
|
+
deltaX,
|
|
175
|
+
deltaY,
|
|
176
|
+
});
|
|
177
|
+
for (const dragState of dragStates) {
|
|
178
|
+
const value = lastValues.get(dragState.key);
|
|
179
|
+
if (value === undefined) {
|
|
180
|
+
throw new Error('Expected drag value to be available');
|
|
181
|
+
}
|
|
182
|
+
if (dragState.target.propStatus.status === 'keyframed') {
|
|
183
|
+
setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
|
|
184
|
+
status: dragState.target.propStatus,
|
|
185
|
+
frame: dragState.sourceFrame,
|
|
186
|
+
value,
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
setDragOverrides(dragState.target.nodePath, selected_outline_types_1.translateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
const onPointerMove = (moveEvent) => {
|
|
195
|
+
moveEvent.preventDefault();
|
|
196
|
+
currentPointerX = moveEvent.clientX;
|
|
197
|
+
currentPointerY = moveEvent.clientY;
|
|
198
|
+
axisLocked = moveEvent.shiftKey;
|
|
199
|
+
snappingDisabled = moveEvent.metaKey || moveEvent.ctrlKey;
|
|
200
|
+
updateDragOverrides();
|
|
201
|
+
};
|
|
202
|
+
const onKeyChange = (keyEvent) => {
|
|
203
|
+
if (keyEvent.key !== 'Shift') {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const nextAxisLocked = keyEvent.type === 'keydown';
|
|
207
|
+
if (nextAxisLocked === axisLocked) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
axisLocked = nextAxisLocked;
|
|
211
|
+
updateDragOverrides();
|
|
212
|
+
};
|
|
213
|
+
const onPointerUp = () => {
|
|
214
|
+
window.removeEventListener('keydown', onKeyChange);
|
|
215
|
+
window.removeEventListener('keyup', onKeyChange);
|
|
216
|
+
if (dragStarted) {
|
|
217
|
+
(0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
|
|
218
|
+
onSnapPointsChange([]);
|
|
219
|
+
onDraggingChange(false);
|
|
220
|
+
}
|
|
221
|
+
const changes = (0, selected_outline_drag_1.getSelectedOutlineDragChanges)({
|
|
222
|
+
dragStates,
|
|
223
|
+
lastValues,
|
|
224
|
+
});
|
|
225
|
+
if (changes.length === 0) {
|
|
226
|
+
(0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const staticChanges = changes.filter((change) => change.type === 'static');
|
|
230
|
+
const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
|
|
231
|
+
Promise.all([
|
|
232
|
+
staticChanges.length > 0
|
|
233
|
+
? (0, save_sequence_prop_1.saveSequenceProps)({
|
|
234
|
+
changes: staticChanges,
|
|
235
|
+
addedKeyframes: null,
|
|
236
|
+
movedKeyframes: null,
|
|
237
|
+
setPropStatuses,
|
|
238
|
+
clientId: drag.clientId,
|
|
239
|
+
undoLabel: changes.length > 1
|
|
240
|
+
? 'Move selected sequences'
|
|
241
|
+
: 'Move sequence',
|
|
242
|
+
redoLabel: changes.length > 1
|
|
243
|
+
? 'Move selected sequences back'
|
|
244
|
+
: 'Move sequence back',
|
|
245
|
+
})
|
|
246
|
+
: Promise.resolve(),
|
|
247
|
+
(0, call_add_keyframe_1.callAddKeyframes)({
|
|
248
|
+
sequenceKeyframes: keyframedChanges,
|
|
249
|
+
effectKeyframes: [],
|
|
250
|
+
setPropStatuses,
|
|
251
|
+
clientId: drag.clientId,
|
|
252
|
+
}),
|
|
253
|
+
])
|
|
254
|
+
.catch((err) => {
|
|
255
|
+
(0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
|
|
256
|
+
})
|
|
257
|
+
.finally(() => {
|
|
258
|
+
(0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
|
|
259
|
+
});
|
|
260
|
+
};
|
|
261
|
+
(0, pointer_session_1.startPointerSession)({
|
|
262
|
+
event,
|
|
263
|
+
target: event.currentTarget,
|
|
264
|
+
onMove: onPointerMove,
|
|
265
|
+
onEnd: onPointerUp,
|
|
266
|
+
});
|
|
267
|
+
window.addEventListener('keydown', onKeyChange);
|
|
268
|
+
window.addEventListener('keyup', onKeyChange);
|
|
269
|
+
}, [
|
|
270
|
+
canvasContent,
|
|
271
|
+
clearDragOverrides,
|
|
272
|
+
compositionHeight,
|
|
273
|
+
compositionWidth,
|
|
274
|
+
editorShowGuides,
|
|
275
|
+
editorSnapping,
|
|
276
|
+
getAllDragOutlines,
|
|
277
|
+
getAllDragTargets,
|
|
278
|
+
getDragOverrides,
|
|
279
|
+
getTarget,
|
|
280
|
+
guidesList,
|
|
281
|
+
onDraggingChange,
|
|
282
|
+
onSelect,
|
|
283
|
+
onSnapPointsChange,
|
|
284
|
+
outline,
|
|
285
|
+
scale,
|
|
286
|
+
setPropStatuses,
|
|
287
|
+
setDragOverrides,
|
|
288
|
+
]);
|
|
289
|
+
const onDoubleClick = react_1.default.useCallback((event) => {
|
|
290
|
+
const target = getTarget();
|
|
291
|
+
if (target === undefined) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (!onDoubleClickTarget(target, event.button)) {
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
event.preventDefault();
|
|
298
|
+
event.stopPropagation();
|
|
299
|
+
}, [getTarget, onDoubleClickTarget]);
|
|
300
|
+
const onEffectDragOver = react_1.default.useCallback((event) => {
|
|
301
|
+
if (!(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
const effectDrop = getEffectDropTarget();
|
|
305
|
+
if (effectDrop === null) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
event.preventDefault();
|
|
309
|
+
event.stopPropagation();
|
|
310
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
311
|
+
setEffectDropHovered(true);
|
|
312
|
+
}, [getEffectDropTarget]);
|
|
313
|
+
const onEffectDragLeave = react_1.default.useCallback((event) => {
|
|
314
|
+
if (event.currentTarget.contains(event.relatedTarget)) {
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
setEffectDropHovered(false);
|
|
318
|
+
}, []);
|
|
319
|
+
const onEffectDrop = react_1.default.useCallback(async (event) => {
|
|
320
|
+
if (!(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
const effectDrop = getEffectDropTarget();
|
|
324
|
+
if (effectDrop === null) {
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
const dragData = (0, effect_drag_and_drop_1.getEffectDragData)(event.dataTransfer);
|
|
328
|
+
if (!dragData) {
|
|
329
|
+
if ((0, effect_drag_and_drop_1.hasExplicitEffectDragType)(event.dataTransfer)) {
|
|
330
|
+
event.preventDefault();
|
|
331
|
+
event.stopPropagation();
|
|
332
|
+
setEffectDropHovered(false);
|
|
333
|
+
(0, NotificationCenter_1.showNotification)('Could not read effect drag data', 3000);
|
|
334
|
+
}
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
event.preventDefault();
|
|
338
|
+
event.stopPropagation();
|
|
339
|
+
setEffectDropHovered(false);
|
|
340
|
+
await (0, effect_drag_and_drop_1.addEffectFromDragData)({
|
|
341
|
+
dragData,
|
|
342
|
+
fileName: effectDrop.fileName,
|
|
343
|
+
nodePath: effectDrop.nodePath,
|
|
344
|
+
clientId: effectDrop.clientId,
|
|
345
|
+
});
|
|
346
|
+
}, [getEffectDropTarget]);
|
|
347
|
+
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
348
|
+
jsx_runtime_1.jsx("polygon", { ref: polygonRef, points: points, fill: effectDropHovered ? colors_1.TIMELINE_DROP_BLUE_ALPHA_12 : colors_1.TRANSPARENT, stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: hasTarget ? 'all' : undefined, onPointerEnter: () => {
|
|
349
|
+
if (!dragging) {
|
|
350
|
+
onHoverChange(outline.key);
|
|
351
|
+
}
|
|
352
|
+
}, onPointerLeave: () => {
|
|
353
|
+
if (!dragging) {
|
|
354
|
+
onHoverChange(null);
|
|
355
|
+
}
|
|
356
|
+
}, onPointerDown: onPointerDown, onDoubleClick: onDoubleClick, onDragOver: onEffectDragOver, onDragLeave: onEffectDragLeave, onDrop: onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, getItems: onContextMenuOpen })
|
|
357
|
+
] }));
|
|
358
|
+
};
|
|
359
|
+
exports.SelectedOutlinePolygon = react_1.default.memo(SelectedOutlinePolygonUnmemoized);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SelectedOutlineLayoutTarget, SelectedOutlineTarget } from './selected-outline-types';
|
|
3
|
+
import type { TimelineSelection, TimelineSelectionInteraction } from './Timeline/TimelineSelection';
|
|
4
|
+
export declare const SelectedOutlineRenderer: React.NamedExoticComponent<{
|
|
5
|
+
readonly compositionHeight: number;
|
|
6
|
+
readonly compositionWidth: number;
|
|
7
|
+
readonly dragging: boolean;
|
|
8
|
+
readonly getLatestOutlineTargetByKey: (key: string) => SelectedOutlineTarget | undefined;
|
|
9
|
+
readonly getOutlineTargets: () => readonly SelectedOutlineLayoutTarget[];
|
|
10
|
+
readonly onDraggingChange: (dragging: boolean) => void;
|
|
11
|
+
readonly onSelect: (item: TimelineSelection, interaction?: TimelineSelectionInteraction | undefined) => void;
|
|
12
|
+
readonly scale: number;
|
|
13
|
+
readonly sequences: readonly {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly parent: string | null;
|
|
16
|
+
}[];
|
|
17
|
+
readonly updateOutlinesRef: React.MutableRefObject<() => void>;
|
|
18
|
+
}>;
|
|
@@ -0,0 +1,208 @@
|
|
|
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.SelectedOutlineRenderer = void 0;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const timeline_sequence_hover_1 = require("../state/timeline-sequence-hover");
|
|
40
|
+
const selected_outline_measurement_1 = require("./selected-outline-measurement");
|
|
41
|
+
const selected_outline_order_1 = require("./selected-outline-order");
|
|
42
|
+
const SelectedOutlineElement_1 = require("./SelectedOutlineElement");
|
|
43
|
+
const SelectedOutlineSnapIndicators_1 = require("./SelectedOutlineSnapIndicators");
|
|
44
|
+
const SelectedOutlineTransformOriginHandle_1 = require("./SelectedOutlineTransformOriginHandle");
|
|
45
|
+
const SelectedOutlineUvControls_1 = require("./SelectedOutlineUvControls");
|
|
46
|
+
const outlineContainer = {
|
|
47
|
+
position: 'absolute',
|
|
48
|
+
inset: 0,
|
|
49
|
+
pointerEvents: 'none',
|
|
50
|
+
overflow: 'visible',
|
|
51
|
+
};
|
|
52
|
+
const emptyRenderState = {
|
|
53
|
+
outlines: [],
|
|
54
|
+
targets: [],
|
|
55
|
+
};
|
|
56
|
+
const SelectedOutlineHoverCleanup = ({ targets }) => {
|
|
57
|
+
const hoveredSequence = (0, timeline_sequence_hover_1.useTimelineSequenceHoverState)();
|
|
58
|
+
const setHoveredSequence = (0, timeline_sequence_hover_1.useSetTimelineSequenceHover)();
|
|
59
|
+
(0, react_1.useEffect)(() => {
|
|
60
|
+
if ((hoveredSequence === null || hoveredSequence === void 0 ? void 0 : hoveredSequence.source) === 'canvas' &&
|
|
61
|
+
!targets.some((target) => target.key === hoveredSequence.key)) {
|
|
62
|
+
setHoveredSequence((currentHover) => (currentHover === null || currentHover === void 0 ? void 0 : currentHover.source) === 'canvas' ? null : currentHover);
|
|
63
|
+
}
|
|
64
|
+
}, [hoveredSequence, setHoveredSequence, targets]);
|
|
65
|
+
return null;
|
|
66
|
+
};
|
|
67
|
+
const SelectedOutlineRendererUnmemoized = ({ compositionHeight, compositionWidth, dragging, getLatestOutlineTargetByKey, getOutlineTargets, onDraggingChange, onSelect, scale, sequences, updateOutlinesRef, }) => {
|
|
68
|
+
const [renderState, setRenderState] = (0, react_1.useState)(emptyRenderState);
|
|
69
|
+
const overlayRef = (0, react_1.useRef)(null);
|
|
70
|
+
const resizeObserverRef = (0, react_1.useRef)(null);
|
|
71
|
+
const resizeObserverAnimationFrameRef = (0, react_1.useRef)(null);
|
|
72
|
+
const observedOutlineElementsRef = (0, react_1.useRef)(new Set());
|
|
73
|
+
const updateOutlines = (0, react_1.useCallback)(() => {
|
|
74
|
+
const targets = getOutlineTargets();
|
|
75
|
+
if (overlayRef.current === null || targets.length === 0) {
|
|
76
|
+
setRenderState((prevState) => prevState.targets.length === 0 ? prevState : emptyRenderState);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const nextOutlines = (0, selected_outline_measurement_1.measureOutlines)(overlayRef.current, targets);
|
|
80
|
+
setRenderState((prevState) => {
|
|
81
|
+
const outlines = (0, selected_outline_measurement_1.outlinesAreEqual)(prevState.outlines, nextOutlines)
|
|
82
|
+
? prevState.outlines
|
|
83
|
+
: nextOutlines;
|
|
84
|
+
if (prevState.targets === targets && prevState.outlines === outlines) {
|
|
85
|
+
return prevState;
|
|
86
|
+
}
|
|
87
|
+
return { outlines, targets };
|
|
88
|
+
});
|
|
89
|
+
}, [getOutlineTargets]);
|
|
90
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
91
|
+
updateOutlinesRef.current = updateOutlines;
|
|
92
|
+
updateOutlines();
|
|
93
|
+
return () => {
|
|
94
|
+
if (updateOutlinesRef.current === updateOutlines) {
|
|
95
|
+
updateOutlinesRef.current = () => undefined;
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}, [updateOutlines, updateOutlinesRef]);
|
|
99
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
100
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
104
|
+
if (resizeObserverAnimationFrameRef.current !== null) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
resizeObserverAnimationFrameRef.current = requestAnimationFrame(() => {
|
|
108
|
+
resizeObserverAnimationFrameRef.current = null;
|
|
109
|
+
updateOutlinesRef.current();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
resizeObserverRef.current = resizeObserver;
|
|
113
|
+
return () => {
|
|
114
|
+
if (resizeObserverAnimationFrameRef.current !== null) {
|
|
115
|
+
cancelAnimationFrame(resizeObserverAnimationFrameRef.current);
|
|
116
|
+
resizeObserverAnimationFrameRef.current = null;
|
|
117
|
+
}
|
|
118
|
+
resizeObserver.disconnect();
|
|
119
|
+
resizeObserverRef.current = null;
|
|
120
|
+
observedOutlineElementsRef.current = new Set();
|
|
121
|
+
};
|
|
122
|
+
}, [updateOutlinesRef]);
|
|
123
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
124
|
+
const resizeObserver = resizeObserverRef.current;
|
|
125
|
+
if (resizeObserver === null) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const nextObservedElements = new Set();
|
|
129
|
+
if (overlayRef.current !== null) {
|
|
130
|
+
nextObservedElements.add(overlayRef.current);
|
|
131
|
+
}
|
|
132
|
+
for (const target of renderState.targets) {
|
|
133
|
+
if (target.ref.current !== null) {
|
|
134
|
+
nextObservedElements.add(target.ref.current);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
for (const element of observedOutlineElementsRef.current) {
|
|
138
|
+
if (!nextObservedElements.has(element)) {
|
|
139
|
+
resizeObserver.unobserve(element);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
for (const element of nextObservedElements) {
|
|
143
|
+
if (!observedOutlineElementsRef.current.has(element)) {
|
|
144
|
+
resizeObserver.observe(element);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
observedOutlineElementsRef.current = nextObservedElements;
|
|
148
|
+
}, [renderState.targets]);
|
|
149
|
+
const targetsByKey = (0, react_1.useMemo)(() => {
|
|
150
|
+
return new Map(renderState.targets.map((target) => [target.key, target]));
|
|
151
|
+
}, [renderState.targets]);
|
|
152
|
+
const outlinesForRendering = (0, react_1.useMemo)(() => {
|
|
153
|
+
return (0, selected_outline_order_1.orderOutlinesForRendering)({
|
|
154
|
+
outlines: renderState.outlines,
|
|
155
|
+
sequences,
|
|
156
|
+
targetsByKey,
|
|
157
|
+
});
|
|
158
|
+
}, [renderState.outlines, sequences, targetsByKey]);
|
|
159
|
+
const outlinesByKey = (0, react_1.useMemo)(() => {
|
|
160
|
+
return new Map(renderState.outlines.map((outline) => [outline.key, outline]));
|
|
161
|
+
}, [renderState.outlines]);
|
|
162
|
+
const targetsRef = (0, react_1.useRef)(renderState.targets);
|
|
163
|
+
const outlinesByKeyRef = (0, react_1.useRef)(outlinesByKey);
|
|
164
|
+
(0, react_1.useLayoutEffect)(() => {
|
|
165
|
+
targetsRef.current = renderState.targets;
|
|
166
|
+
outlinesByKeyRef.current = outlinesByKey;
|
|
167
|
+
}, [outlinesByKey, renderState.targets]);
|
|
168
|
+
const getAllDragTargets = (0, react_1.useCallback)(() => targetsRef.current.flatMap((target) => {
|
|
169
|
+
var _a;
|
|
170
|
+
var _b;
|
|
171
|
+
if (!target.selected && !target.containsSelection) {
|
|
172
|
+
return [];
|
|
173
|
+
}
|
|
174
|
+
const drag = (_b = (_a = getLatestOutlineTargetByKey(target.key)) === null || _a === void 0 ? void 0 : _a.drag) !== null && _b !== void 0 ? _b : null;
|
|
175
|
+
return drag === null ? [] : [drag];
|
|
176
|
+
}), [getLatestOutlineTargetByKey]);
|
|
177
|
+
const getAllDragOutlines = (0, react_1.useCallback)(() => targetsRef.current.flatMap((target) => {
|
|
178
|
+
var _a;
|
|
179
|
+
var _b;
|
|
180
|
+
if ((!target.selected && !target.containsSelection) ||
|
|
181
|
+
((_b = (_a = getLatestOutlineTargetByKey(target.key)) === null || _a === void 0 ? void 0 : _a.drag) !== null && _b !== void 0 ? _b : null) === null) {
|
|
182
|
+
return [];
|
|
183
|
+
}
|
|
184
|
+
const outline = outlinesByKeyRef.current.get(target.key);
|
|
185
|
+
return outline === undefined ? [] : [outline];
|
|
186
|
+
}), [getLatestOutlineTargetByKey]);
|
|
187
|
+
const getAllScaleDragTargets = (0, react_1.useCallback)(() => targetsRef.current.flatMap((target) => {
|
|
188
|
+
var _a;
|
|
189
|
+
var _b;
|
|
190
|
+
const scaleDrag = target.selected
|
|
191
|
+
? ((_b = (_a = getLatestOutlineTargetByKey(target.key)) === null || _a === void 0 ? void 0 : _a.scaleDrag) !== null && _b !== void 0 ? _b : null)
|
|
192
|
+
: null;
|
|
193
|
+
return scaleDrag === null ? [] : [scaleDrag];
|
|
194
|
+
}), [getLatestOutlineTargetByKey]);
|
|
195
|
+
const getAllRotationDragTargets = (0, react_1.useCallback)(() => targetsRef.current.flatMap((target) => {
|
|
196
|
+
var _a;
|
|
197
|
+
var _b;
|
|
198
|
+
const rotationDrag = target.selected
|
|
199
|
+
? ((_b = (_a = getLatestOutlineTargetByKey(target.key)) === null || _a === void 0 ? void 0 : _a.rotationDrag) !== null && _b !== void 0 ? _b : null)
|
|
200
|
+
: null;
|
|
201
|
+
return rotationDrag === null ? [] : [rotationDrag];
|
|
202
|
+
}), [getLatestOutlineTargetByKey]);
|
|
203
|
+
const updateSnapPointsRef = (0, react_1.useRef)(() => undefined);
|
|
204
|
+
const onSnapPointsChange = (0, react_1.useCallback)((snapPoints) => updateSnapPointsRef.current(snapPoints), []);
|
|
205
|
+
return (jsx_runtime_1.jsxs("svg", { ref: overlayRef, style: outlineContainer, width: "100%", height: "100%", "aria-hidden": "true", children: [
|
|
206
|
+
jsx_runtime_1.jsx(SelectedOutlineHoverCleanup, { targets: renderState.targets }), jsx_runtime_1.jsx(SelectedOutlineSnapIndicators_1.SelectedOutlineSnapIndicators, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, scale: scale, updateSnapPointsRef: updateSnapPointsRef }), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement_1.SelectedOutlineElement, { compositionHeight: compositionHeight, compositionWidth: compositionWidth, dragging: dragging, getAllDragOutlines: getAllDragOutlines, getAllDragTargets: getAllDragTargets, getAllRotationDragTargets: getAllRotationDragTargets, getAllScaleDragTargets: getAllScaleDragTargets, getLatestTargetByKey: getLatestOutlineTargetByKey, outline: outline, onDraggingChange: onDraggingChange, onSnapPointsChange: onSnapPointsChange, onSelect: onSelect, scale: scale, layoutTarget: targetsByKey.get(outline.key) }, outline.key))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle_1.SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, getLatestTargetByKey: getLatestOutlineTargetByKey, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-transform-origin`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlinesForRendering.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, onSelect: onSelect, outline: outline, layoutTarget: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`)))] }));
|
|
207
|
+
};
|
|
208
|
+
exports.SelectedOutlineRenderer = react_1.default.memo(SelectedOutlineRendererUnmemoized);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { SelectedOutline } from './selected-outline-geometry';
|
|
3
|
+
import { type SelectedOutlineRotationCorner } from './selected-outline-measurement';
|
|
4
|
+
import { type SelectedOutlineContextMenuOpenHandler, type SelectedOutlineRotationDragTarget, type SelectedOutlineTarget } from './selected-outline-types';
|
|
5
|
+
import type { TimelineSelection, TimelineSelectionInteraction } from './Timeline/TimelineSelection';
|
|
6
|
+
export declare const SelectedOutlineRotationCornerHandle: React.FC<{
|
|
7
|
+
readonly getAllRotationDragTargets: () => readonly SelectedOutlineRotationDragTarget[];
|
|
8
|
+
readonly corner: SelectedOutlineRotationCorner;
|
|
9
|
+
readonly dragging: boolean;
|
|
10
|
+
readonly outline: SelectedOutline;
|
|
11
|
+
readonly onDraggingChange: (dragging: boolean) => void;
|
|
12
|
+
readonly onContextMenuOpen: SelectedOutlineContextMenuOpenHandler;
|
|
13
|
+
readonly onHoverChange: (key: string | null) => void;
|
|
14
|
+
readonly onSelect: (item: TimelineSelection, interaction: TimelineSelectionInteraction) => void;
|
|
15
|
+
readonly target: SelectedOutlineTarget | undefined;
|
|
16
|
+
}>;
|