@remotion/studio 4.0.474 → 4.0.475
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/components/Canvas.js +6 -0
- package/dist/components/ColorPicker/ColorPicker.js +4 -31
- package/dist/components/CompositionSelectorItem.js +4 -4
- package/dist/components/Editor.js +4 -1
- package/dist/components/Modals.js +2 -1
- package/dist/components/NewComposition/ComboBox.js +1 -0
- package/dist/components/PreviewToolbar.js +2 -2
- package/dist/components/SelectedOutlineOverlay.d.ts +58 -32
- package/dist/components/SelectedOutlineOverlay.js +766 -315
- package/dist/components/SelectedOutlineUvControls.d.ts +17 -0
- package/dist/components/SelectedOutlineUvControls.js +167 -0
- package/dist/components/StudioCanvasCapture.d.ts +5 -0
- package/dist/components/StudioCanvasCapture.js +40 -0
- package/dist/components/Timeline/EasingEditorModal.d.ts +11 -0
- package/dist/components/Timeline/EasingEditorModal.js +247 -0
- package/dist/components/Timeline/KeyframeSettingsModal.js +1 -0
- package/dist/components/Timeline/Timeline.js +10 -7
- package/dist/components/Timeline/TimelineDeleteKeybindings.js +64 -35
- package/dist/components/Timeline/TimelineDragHandler.js +2 -2
- package/dist/components/Timeline/TimelineEffectItem.js +1 -2
- package/dist/components/Timeline/TimelineEffectPropItem.js +1 -1
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.d.ts +1 -0
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +2 -2
- package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +1 -1
- package/dist/components/Timeline/TimelineHeightContainer.js +2 -0
- package/dist/components/Timeline/TimelineItemStack.js +3 -56
- package/dist/components/Timeline/TimelineKeyframeControls.d.ts +7 -0
- package/dist/components/Timeline/TimelineKeyframeControls.js +259 -62
- package/dist/components/Timeline/TimelineKeyframeDiamond.js +4 -2
- package/dist/components/Timeline/TimelineKeyframeEasingLine.js +128 -3
- package/dist/components/Timeline/TimelineKeyframeTracksContext.d.ts +7 -0
- package/dist/components/Timeline/TimelineKeyframeTracksContext.js +17 -0
- package/dist/components/Timeline/TimelineMediaInfo.js +4 -24
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
- package/dist/components/Timeline/TimelineRotationField.js +5 -23
- package/dist/components/Timeline/TimelineScrollable.js +19 -3
- package/dist/components/Timeline/TimelineSelection.d.ts +67 -3
- package/dist/components/Timeline/TimelineSelection.js +289 -32
- package/dist/components/Timeline/TimelineSequence.js +17 -9
- package/dist/components/Timeline/TimelineSequenceItem.js +29 -61
- package/dist/components/Timeline/TimelineSequenceName.js +3 -17
- package/dist/components/Timeline/TimelineSequencePropItem.js +1 -1
- package/dist/components/Timeline/TimelineTimeIndicators.js +4 -2
- package/dist/components/Timeline/TimelineTransformOriginField.d.ts +11 -0
- package/dist/components/Timeline/TimelineTransformOriginField.js +138 -0
- package/dist/components/Timeline/call-add-keyframe.d.ts +17 -0
- package/dist/components/Timeline/call-add-keyframe.js +65 -1
- package/dist/components/Timeline/delete-selected-timeline-item.js +23 -13
- package/dist/components/Timeline/reset-selected-timeline-props.js +13 -5
- package/dist/components/Timeline/timeline-rotation-utils.d.ts +2 -0
- package/dist/components/Timeline/timeline-rotation-utils.js +32 -0
- package/dist/components/Timeline/transform-origin-utils.d.ts +24 -0
- package/dist/components/Timeline/transform-origin-utils.js +170 -0
- package/dist/components/Timeline/update-selected-easing.d.ts +35 -0
- package/dist/components/Timeline/update-selected-easing.js +133 -0
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +1 -0
- package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +28 -0
- package/dist/components/canvas-capture-enabled.d.ts +1 -0
- package/dist/components/canvas-capture-enabled.js +4 -0
- package/dist/components/effect-drag-and-drop.d.ts +11 -0
- package/dist/components/effect-drag-and-drop.js +73 -0
- package/dist/components/selected-outline-geometry.d.ts +20 -0
- package/dist/components/selected-outline-geometry.js +18 -0
- package/dist/components/selected-outline-uv.d.ts +46 -0
- package/dist/components/selected-outline-uv.js +240 -0
- package/dist/esm/{chunk-xjvc8qen.js → chunk-qaqqvw4q.js} +7418 -4943
- package/dist/esm/internals.mjs +7418 -4943
- package/dist/esm/previewEntry.mjs +7426 -4951
- package/dist/esm/renderEntry.mjs +1 -1
- package/dist/helpers/colors.d.ts +0 -1
- package/dist/helpers/colors.js +1 -2
- package/dist/state/modals.d.ts +2 -1
- package/package.json +11 -10
|
@@ -33,8 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.SelectedOutlineOverlay = exports.getSelectedOutlineScaleDragChanges = exports.getSelectedOutlineScaleDragValues = exports.getSelectedOutlineScaleDragStates = exports.getSelectedOutlineScaleEdgeInfo = exports.getSelectedOutlineDragChanges = exports.getSelectedOutlineDragValues = exports.getSequencesWithSelectableOutlines = exports.getSelectedEffectFieldsBySequenceKey = exports.getOutlineSelectionInteraction = exports.getSelectedSequenceKeys = exports.
|
|
37
|
-
exports.constrainUv = constrainUv;
|
|
36
|
+
exports.SelectedOutlineOverlay = exports.compensateTranslateForTransformOrigin = exports.getSelectedOutlineRotationDragChanges = exports.getSelectedOutlineRotationDragValues = exports.getSelectedOutlineRotationDragStates = exports.getSelectedOutlineScaleDragChanges = exports.getSelectedOutlineScaleDragValues = exports.getSelectedOutlineScaleDragStates = exports.getSelectedOutlineScaleEdgeInfo = exports.getSelectedOutlineDragChanges = exports.applySelectedOutlineDragAxisLock = exports.getSelectedOutlineDragValues = exports.getSequencesWithSelectableOutlines = exports.getSelectedEffectFieldsBySequenceKey = exports.getOutlineSelectionInteraction = exports.getSelectedSequenceKeys = exports.getSelectedOutlineRotationCornerInfo = exports.getSelectedOutlineRotationDeltaDegrees = void 0;
|
|
38
37
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
38
|
const react_1 = __importStar(require("react"));
|
|
40
39
|
const remotion_1 = require("remotion");
|
|
@@ -48,16 +47,25 @@ const open_in_editor_1 = require("../helpers/open-in-editor");
|
|
|
48
47
|
const editor_outlines_1 = require("../state/editor-outlines");
|
|
49
48
|
const scale_lock_1 = require("../state/scale-lock");
|
|
50
49
|
const ContextMenu_1 = require("./ContextMenu");
|
|
50
|
+
const effect_drag_and_drop_1 = require("./effect-drag-and-drop");
|
|
51
|
+
const ForceSpecificCursor_1 = require("./ForceSpecificCursor");
|
|
51
52
|
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
53
|
+
const selected_outline_geometry_1 = require("./selected-outline-geometry");
|
|
54
|
+
const selected_outline_uv_1 = require("./selected-outline-uv");
|
|
55
|
+
const SelectedOutlineUvControls_1 = require("./SelectedOutlineUvControls");
|
|
52
56
|
const call_add_keyframe_1 = require("./Timeline/call-add-keyframe");
|
|
53
|
-
const
|
|
57
|
+
const parse_keyframe_field_from_node_path_1 = require("./Timeline/parse-keyframe-field-from-node-path");
|
|
54
58
|
const save_sequence_prop_1 = require("./Timeline/save-sequence-prop");
|
|
59
|
+
const timeline_rotation_utils_1 = require("./Timeline/timeline-rotation-utils");
|
|
55
60
|
const timeline_translate_utils_1 = require("./Timeline/timeline-translate-utils");
|
|
56
61
|
const TimelineScaleField_1 = require("./Timeline/TimelineScaleField");
|
|
57
62
|
const TimelineSelection_1 = require("./Timeline/TimelineSelection");
|
|
58
63
|
const get_stack_1 = require("./Timeline/TimelineStack/get-stack");
|
|
64
|
+
const transform_origin_utils_1 = require("./Timeline/transform-origin-utils");
|
|
59
65
|
const translateFieldKey = 'style.translate';
|
|
60
66
|
const scaleFieldKey = 'style.scale';
|
|
67
|
+
const rotateFieldKey = 'style.rotate';
|
|
68
|
+
const transformOriginFieldKey = 'style.transformOrigin';
|
|
61
69
|
const outlineContainer = {
|
|
62
70
|
position: 'absolute',
|
|
63
71
|
inset: 0,
|
|
@@ -66,188 +74,74 @@ const outlineContainer = {
|
|
|
66
74
|
};
|
|
67
75
|
const emptyContextMenuValues = [];
|
|
68
76
|
const pointToString = (point) => `${point.x},${point.y}`;
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
value.length === 2 &&
|
|
72
|
-
value.every((item) => typeof item === 'number' && Number.isFinite(item))) {
|
|
73
|
-
return [value[0], value[1]];
|
|
74
|
-
}
|
|
75
|
-
return null;
|
|
76
|
-
};
|
|
77
|
-
const tuplesEqual = (left, right) => {
|
|
78
|
-
if (!Array.isArray(left) || left.length !== 2) {
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
return left[0] === right[0] && left[1] === right[1];
|
|
82
|
-
};
|
|
83
|
-
const mix = (from, to, progress) => {
|
|
84
|
-
return from + (to - from) * progress;
|
|
77
|
+
const midpoint = (from, to) => {
|
|
78
|
+
return (0, selected_outline_geometry_1.mixPoint)(from, to, 0.5);
|
|
85
79
|
};
|
|
86
|
-
const
|
|
80
|
+
const getOutlineCenter = (points) => {
|
|
81
|
+
const [tl, tr, br, bl] = points;
|
|
87
82
|
return {
|
|
88
|
-
x:
|
|
89
|
-
y:
|
|
83
|
+
x: (tl.x + tr.x + br.x + bl.x) / 4,
|
|
84
|
+
y: (tl.y + tr.y + br.y + bl.y) / 4,
|
|
90
85
|
};
|
|
91
86
|
};
|
|
92
|
-
const midpoint = (from, to) => {
|
|
93
|
-
return mixPoint(from, to, 0.5);
|
|
94
|
-
};
|
|
95
87
|
const dot = (left, right) => {
|
|
96
88
|
return left.x * right.x + left.y * right.y;
|
|
97
89
|
};
|
|
98
90
|
const vectorLength = (vector) => {
|
|
99
91
|
return Math.hypot(vector.x, vector.y);
|
|
100
92
|
};
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
const top = mixPoint(tl, tr, uv[0]);
|
|
104
|
-
const bottom = mixPoint(bl, br, uv[0]);
|
|
105
|
-
return mixPoint(top, bottom, uv[1]);
|
|
106
|
-
};
|
|
107
|
-
const projectiveEpsilon = 0.000001;
|
|
108
|
-
const getProjectiveTransform = (points) => {
|
|
109
|
-
const [tl, tr, br, bl] = points;
|
|
110
|
-
const dx1 = tr.x - br.x;
|
|
111
|
-
const dx2 = bl.x - br.x;
|
|
112
|
-
const dx3 = tl.x - tr.x + br.x - bl.x;
|
|
113
|
-
const dy1 = tr.y - br.y;
|
|
114
|
-
const dy2 = bl.y - br.y;
|
|
115
|
-
const dy3 = tl.y - tr.y + br.y - bl.y;
|
|
116
|
-
let g = 0;
|
|
117
|
-
let h = 0;
|
|
118
|
-
if (Math.abs(dx3) > projectiveEpsilon || Math.abs(dy3) > projectiveEpsilon) {
|
|
119
|
-
const determinant = dx1 * dy2 - dx2 * dy1;
|
|
120
|
-
if (Math.abs(determinant) < projectiveEpsilon) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
g = (dx3 * dy2 - dx2 * dy3) / determinant;
|
|
124
|
-
h = (dx1 * dy3 - dx3 * dy1) / determinant;
|
|
125
|
-
}
|
|
126
|
-
return {
|
|
127
|
-
a: tr.x - tl.x + g * tr.x,
|
|
128
|
-
b: bl.x - tl.x + h * bl.x,
|
|
129
|
-
c: tl.x,
|
|
130
|
-
d: tr.y - tl.y + g * tr.y,
|
|
131
|
-
e: bl.y - tl.y + h * bl.y,
|
|
132
|
-
f: tl.y,
|
|
133
|
-
g,
|
|
134
|
-
h,
|
|
135
|
-
};
|
|
93
|
+
const vectorBetween = (from, to) => {
|
|
94
|
+
return { x: to.x - from.x, y: to.y - from.y };
|
|
136
95
|
};
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
return {
|
|
140
|
-
x: (transform.a * uv[0] + transform.b * uv[1] + transform.c) / denominator,
|
|
141
|
-
y: (transform.d * uv[0] + transform.e * uv[1] + transform.f) / denominator,
|
|
142
|
-
};
|
|
96
|
+
const getAngleDegrees = (from, to) => {
|
|
97
|
+
return Math.atan2(to.y - from.y, to.x - from.x) * (180 / Math.PI);
|
|
143
98
|
};
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
return transform === null
|
|
147
|
-
? getBilinearUvHandlePosition(points, uv)
|
|
148
|
-
: applyProjectiveTransform(transform, uv);
|
|
99
|
+
const getSelectedOutlineRotationDeltaDegrees = ({ from, to, }) => {
|
|
100
|
+
return ((((to - from) % 360) + 540) % 360) - 180;
|
|
149
101
|
};
|
|
150
|
-
exports.
|
|
151
|
-
const
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
handle,
|
|
155
|
-
]));
|
|
156
|
-
const seenPairs = new Set();
|
|
157
|
-
const lines = [];
|
|
158
|
-
for (const handle of handles) {
|
|
159
|
-
const targetFieldKey = handle.fieldSchema.lineTo;
|
|
160
|
-
if (targetFieldKey === undefined || targetFieldKey === handle.fieldKey) {
|
|
161
|
-
continue;
|
|
162
|
-
}
|
|
163
|
-
const target = handlesByField.get(`${handle.effectIndex}\u0000${targetFieldKey}`);
|
|
164
|
-
if (target === undefined) {
|
|
165
|
-
continue;
|
|
166
|
-
}
|
|
167
|
-
const pairKey = [
|
|
168
|
-
handle.effectIndex,
|
|
169
|
-
...[handle.fieldKey, targetFieldKey].sort(),
|
|
170
|
-
].join('\u0000');
|
|
171
|
-
if (seenPairs.has(pairKey)) {
|
|
172
|
-
continue;
|
|
173
|
-
}
|
|
174
|
-
seenPairs.add(pairKey);
|
|
175
|
-
lines.push({
|
|
176
|
-
key: `${handle.effectIndex}-${handle.fieldKey}-${targetFieldKey}`,
|
|
177
|
-
from: (0, exports.getUvHandlePosition)(points, handle.value),
|
|
178
|
-
to: (0, exports.getUvHandlePosition)(points, target.value),
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
return lines;
|
|
102
|
+
exports.getSelectedOutlineRotationDeltaDegrees = getSelectedOutlineRotationDeltaDegrees;
|
|
103
|
+
const normalizeRotationCursorDegrees = (rotation) => {
|
|
104
|
+
const normalizedRotation = ((rotation % 360) + 360) % 360;
|
|
105
|
+
return Number(normalizedRotation.toFixed(3));
|
|
182
106
|
};
|
|
183
|
-
|
|
184
|
-
const
|
|
185
|
-
|
|
107
|
+
const getRotationCursor = (rotation) => {
|
|
108
|
+
const normalizedRotation = normalizeRotationCursorDegrees(rotation);
|
|
109
|
+
const transform = normalizedRotation === 0
|
|
110
|
+
? ''
|
|
111
|
+
: `<g transform="rotate(${normalizedRotation} 32 32)">`;
|
|
112
|
+
const transformEnd = normalizedRotation === 0 ? '' : '</g>';
|
|
113
|
+
const svg = `<svg width="24" height="24" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">${transform}<g transform="scale(0.876712329)" filter="url(#filter0_d_1_14)"><path d="M10.9111 17.7687C10.3413 18.3701 10.367 19.3195 10.9684 19.8893L20.7687 29.1738C21.3701 29.7436 22.3195 29.7179 22.8893 29.1165C23.459 28.5151 23.4334 27.5657 22.832 26.996L14.1206 18.7431L22.3735 10.0316C22.9432 9.43022 22.9176 8.48082 22.3162 7.91107C21.7148 7.34133 20.7654 7.36699 20.1956 7.96839L10.9111 17.7687ZM49.3923 58.3118C49.9509 58.9235 50.8996 58.9667 51.5114 58.4081L61.481 49.3055C62.0927 48.7469 62.1359 47.7981 61.5773 47.1863C61.0187 46.5745 60.0699 46.5314 59.4581 47.09L50.5963 55.1812L42.5051 46.3194C41.9465 45.7076 40.9977 45.6645 40.386 46.2231C39.7742 46.7817 39.7311 47.7304 40.2896 48.3422L49.3923 58.3118ZM12.6747 18.7431L13 19.8893C22.1283 19.6426 30.7584 21.4283 37.8564 26.6927C44.8518 31.8809 49.734 39.8538 49 56H50.5963H51.5114C52.2774 39.1461 47.6482 30.2198 39.6436 24.2831C31.7416 18.4224 22.3717 17.2467 13 17.5L12.6747 18.7431Z" fill="black"/><path d="M19.1064 6.93652C20.2459 5.73379 22.1448 5.68278 23.3477 6.82227C24.5505 7.96181 24.6022 9.86076 23.4629 11.0635L18.7373 16.0508C26.3487 16.4239 33.9128 18.1651 40.5371 23.0781C44.7339 26.1907 48.0794 30.1189 50.2568 35.4834C51.9666 39.6958 52.9327 44.7395 53.0742 50.8867L58.4463 45.9824C59.6697 44.8654 61.5673 44.9514 62.6846 46.1748C63.8018 47.3985 63.7155 49.296 62.4922 50.4131L52.5225 59.5156C51.337 60.5979 49.5196 60.5507 48.3916 59.4346L48.2842 59.3232L39.1816 49.3535C38.0648 48.1301 38.1507 46.2324 39.374 45.1152C40.5975 43.9979 42.4961 44.0841 43.6133 45.3076L47.4756 49.5381C47.1908 44.7613 46.2876 40.9448 44.9482 37.8291C43.0666 33.4521 40.2851 30.3614 36.9629 27.8975C31.8259 24.0875 25.8071 22.1663 19.2891 21.5732L23.8633 25.9072C25.0662 27.0468 25.1178 28.9457 23.9785 30.1484C22.8746 31.3135 21.0576 31.3982 19.8516 30.3662L19.7373 30.2627L9.93652 20.9785C8.73384 19.839 8.6828 17.9401 9.82227 16.7373L19.1064 6.93652Z" stroke="white" stroke-width="3"/></g>${transformEnd}<defs><filter id="filter0_d_1_14" x="0" y="0" width="72.4696" height="72.3004" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB"><feFlood flood-opacity="0" result="BackgroundImageFix"/><feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/><feOffset dy="3"/><feGaussianBlur stdDeviation="3.75"/><feComposite in2="hardAlpha" operator="out"/><feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/><feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_1_14"/><feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_1_14" result="shape"/></filter></defs></svg>`;
|
|
114
|
+
return `url("data:image/svg+xml,${encodeURIComponent(svg)}") 12 12, alias`;
|
|
186
115
|
};
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
const current = getBilinearUvHandlePosition(points, [u, v]);
|
|
193
|
-
const errorX = current.x - point.x;
|
|
194
|
-
const errorY = current.y - point.y;
|
|
195
|
-
if (Math.abs(errorX) + Math.abs(errorY) < 0.001) {
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
const du = {
|
|
199
|
-
x: mix(tr.x - tl.x, br.x - bl.x, v),
|
|
200
|
-
y: mix(tr.y - tl.y, br.y - bl.y, v),
|
|
201
|
-
};
|
|
202
|
-
const dv = vectorBetween(mixPoint(tl, tr, u), mixPoint(bl, br, u));
|
|
203
|
-
const determinant = du.x * dv.y - du.y * dv.x;
|
|
204
|
-
if (Math.abs(determinant) < 0.000001) {
|
|
205
|
-
break;
|
|
206
|
-
}
|
|
207
|
-
u -= (errorX * dv.y - errorY * dv.x) / determinant;
|
|
208
|
-
v -= (du.x * errorY - du.y * errorX) / determinant;
|
|
209
|
-
}
|
|
210
|
-
return [u, v];
|
|
116
|
+
const rotationCursorBaseDegrees = {
|
|
117
|
+
'top-left': 270,
|
|
118
|
+
'top-right': 0,
|
|
119
|
+
'bottom-right': 90,
|
|
120
|
+
'bottom-left': 180,
|
|
211
121
|
};
|
|
212
|
-
const
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
return getBilinearUvCoordinateForPoint(points, point);
|
|
216
|
-
}
|
|
217
|
-
const determinant = transform.a * (transform.e - transform.f * transform.h) -
|
|
218
|
-
transform.b * (transform.d - transform.f * transform.g) +
|
|
219
|
-
transform.c * (transform.d * transform.h - transform.e * transform.g);
|
|
220
|
-
if (Math.abs(determinant) < projectiveEpsilon) {
|
|
221
|
-
return getBilinearUvCoordinateForPoint(points, point);
|
|
222
|
-
}
|
|
223
|
-
const inverseA = transform.e - transform.f * transform.h;
|
|
224
|
-
const inverseB = transform.c * transform.h - transform.b;
|
|
225
|
-
const inverseC = transform.b * transform.f - transform.c * transform.e;
|
|
226
|
-
const inverseD = transform.f * transform.g - transform.d;
|
|
227
|
-
const inverseE = transform.a - transform.c * transform.g;
|
|
228
|
-
const inverseF = transform.c * transform.d - transform.a * transform.f;
|
|
229
|
-
const inverseG = transform.d * transform.h - transform.e * transform.g;
|
|
230
|
-
const inverseH = transform.b * transform.g - transform.a * transform.h;
|
|
231
|
-
const inverseI = transform.a * transform.e - transform.b * transform.d;
|
|
232
|
-
const denominator = inverseG * point.x + inverseH * point.y + inverseI;
|
|
233
|
-
if (Math.abs(denominator) < projectiveEpsilon) {
|
|
234
|
-
return getBilinearUvCoordinateForPoint(points, point);
|
|
235
|
-
}
|
|
236
|
-
return [
|
|
237
|
-
(inverseA * point.x + inverseB * point.y + inverseC) / denominator,
|
|
238
|
-
(inverseD * point.x + inverseE * point.y + inverseF) / denominator,
|
|
239
|
-
];
|
|
122
|
+
const getOutlineRotationDegrees = (points) => {
|
|
123
|
+
const [tl, tr] = points;
|
|
124
|
+
return getAngleDegrees(tl, tr);
|
|
240
125
|
};
|
|
241
|
-
|
|
242
|
-
const
|
|
243
|
-
|
|
126
|
+
const getRotationCursorDegrees = (points, corner) => normalizeRotationCursorDegrees(getOutlineRotationDegrees(points) + rotationCursorBaseDegrees[corner]);
|
|
127
|
+
const getSelectedOutlineRotationCornerInfo = (points, corner) => {
|
|
128
|
+
const [tl, tr, br, bl] = points;
|
|
129
|
+
const point = {
|
|
130
|
+
'top-left': tl,
|
|
131
|
+
'top-right': tr,
|
|
132
|
+
'bottom-right': br,
|
|
133
|
+
'bottom-left': bl,
|
|
134
|
+
}[corner];
|
|
135
|
+
const center = getOutlineCenter(points);
|
|
136
|
+
const cursorDegrees = getRotationCursorDegrees(points, corner);
|
|
137
|
+
return {
|
|
138
|
+
center,
|
|
139
|
+
cursor: getRotationCursor(cursorDegrees),
|
|
140
|
+
cursorDegrees,
|
|
141
|
+
point,
|
|
142
|
+
};
|
|
244
143
|
};
|
|
245
|
-
|
|
246
|
-
var _a, _b;
|
|
247
|
-
const min = (_a = schema.min) !== null && _a !== void 0 ? _a : -Infinity;
|
|
248
|
-
const max = (_b = schema.max) !== null && _b !== void 0 ? _b : Infinity;
|
|
249
|
-
return [clamp(value[0], min, max), clamp(value[1], min, max)];
|
|
250
|
-
}
|
|
144
|
+
exports.getSelectedOutlineRotationCornerInfo = getSelectedOutlineRotationCornerInfo;
|
|
251
145
|
const rectToPoints = (elementRect, containerRect) => {
|
|
252
146
|
const left = elementRect.left - containerRect.left;
|
|
253
147
|
const top = elementRect.top - containerRect.top;
|
|
@@ -329,6 +223,31 @@ const getSelectedEffectFieldsBySequenceKey = (selectedItems) => {
|
|
|
329
223
|
return selectedEffects;
|
|
330
224
|
};
|
|
331
225
|
exports.getSelectedEffectFieldsBySequenceKey = getSelectedEffectFieldsBySequenceKey;
|
|
226
|
+
const getSelectedTransformOriginInfo = (selectedItems) => {
|
|
227
|
+
if (selectedItems.length !== 1) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
const [selectedItem] = selectedItems;
|
|
231
|
+
if (selectedItem.type === 'sequence-prop' &&
|
|
232
|
+
selectedItem.key === transformOriginFieldKey) {
|
|
233
|
+
return {
|
|
234
|
+
sequenceKey: (0, TimelineSelection_1.getTimelineSequenceSelectionKey)(selectedItem.nodePathInfo),
|
|
235
|
+
displayFrame: null,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (selectedItem.type !== 'keyframe') {
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
const field = (0, parse_keyframe_field_from_node_path_1.parseKeyframeFieldFromNodePath)(selectedItem.nodePathInfo.auxiliaryKeys);
|
|
242
|
+
if ((field === null || field === void 0 ? void 0 : field.type) !== 'sequence' ||
|
|
243
|
+
field.fieldKey !== transformOriginFieldKey) {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
sequenceKey: (0, TimelineSelection_1.getTimelineSequenceSelectionKey)(selectedItem.nodePathInfo),
|
|
248
|
+
displayFrame: selectedItem.frame,
|
|
249
|
+
};
|
|
250
|
+
};
|
|
332
251
|
const getSequencesWithSelectableOutlines = ({ sequences, overrideIdsToNodePaths, }) => {
|
|
333
252
|
return (0, calculate_timeline_1.calculateTimeline)({
|
|
334
253
|
sequences: [...sequences],
|
|
@@ -338,7 +257,8 @@ const getSequencesWithSelectableOutlines = ({ sequences, overrideIdsToNodePaths,
|
|
|
338
257
|
if (track.nodePathInfo === null) {
|
|
339
258
|
return false;
|
|
340
259
|
}
|
|
341
|
-
return track.
|
|
260
|
+
return (track.sequence.showInTimeline &&
|
|
261
|
+
track.nodePathInfo.auxiliaryKeys.length === 0);
|
|
342
262
|
})
|
|
343
263
|
.filter((track) => track.sequence.refForOutline !== null)
|
|
344
264
|
.sort((a, b) => a.depth - b.depth)
|
|
@@ -356,71 +276,6 @@ const getSequencesWithSelectableOutlines = ({ sequences, overrideIdsToNodePaths,
|
|
|
356
276
|
});
|
|
357
277
|
};
|
|
358
278
|
exports.getSequencesWithSelectableOutlines = getSequencesWithSelectableOutlines;
|
|
359
|
-
const getSelectedUvHandles = ({ propStatuses, clientId, getEffectDragOverrides, nodePath, selectedEffects, sequence, }) => {
|
|
360
|
-
if (clientId === null || selectedEffects === undefined) {
|
|
361
|
-
return [];
|
|
362
|
-
}
|
|
363
|
-
const handles = [];
|
|
364
|
-
for (const [effectIndex, selectedFields] of selectedEffects) {
|
|
365
|
-
const effect = sequence.effects[effectIndex];
|
|
366
|
-
if (!effect) {
|
|
367
|
-
continue;
|
|
368
|
-
}
|
|
369
|
-
const effectStatus = remotion_1.Internals.getEffectPropStatusesCtx({
|
|
370
|
-
propStatuses,
|
|
371
|
-
nodePath,
|
|
372
|
-
effectIndex,
|
|
373
|
-
});
|
|
374
|
-
if (effectStatus.type !== 'can-update-effect') {
|
|
375
|
-
continue;
|
|
376
|
-
}
|
|
377
|
-
const dragOverrides = getEffectDragOverrides(nodePath, effectIndex);
|
|
378
|
-
const activeSchema = remotion_1.Internals.flattenActiveSchema(effect.schema, (key) => {
|
|
379
|
-
const dragOverride = remotion_1.Internals.getStaticDragOverrideValue(dragOverrides[key]);
|
|
380
|
-
if (dragOverride !== undefined) {
|
|
381
|
-
return dragOverride;
|
|
382
|
-
}
|
|
383
|
-
const propStatus = effectStatus.props[key];
|
|
384
|
-
if ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'static') {
|
|
385
|
-
return undefined;
|
|
386
|
-
}
|
|
387
|
-
return propStatus.codeValue;
|
|
388
|
-
});
|
|
389
|
-
for (const [fieldKey, fieldSchema] of Object.entries(activeSchema)) {
|
|
390
|
-
if (fieldSchema.type !== 'uv-coordinate' ||
|
|
391
|
-
(!selectedFields.allFields && !selectedFields.fieldKeys.has(fieldKey))) {
|
|
392
|
-
continue;
|
|
393
|
-
}
|
|
394
|
-
const propStatus = effectStatus.props[fieldKey];
|
|
395
|
-
if ((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) !== 'static') {
|
|
396
|
-
continue;
|
|
397
|
-
}
|
|
398
|
-
const dragOverrideValue = dragOverrides[fieldKey];
|
|
399
|
-
const effectiveValue = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
400
|
-
propStatus,
|
|
401
|
-
dragOverrideValue,
|
|
402
|
-
defaultValue: fieldSchema.default,
|
|
403
|
-
shouldResortToDefaultValueIfUndefined: true,
|
|
404
|
-
});
|
|
405
|
-
const value = parseUvCoordinate(effectiveValue);
|
|
406
|
-
if (value === null) {
|
|
407
|
-
continue;
|
|
408
|
-
}
|
|
409
|
-
handles.push({
|
|
410
|
-
clientId,
|
|
411
|
-
propStatus,
|
|
412
|
-
effectIndex,
|
|
413
|
-
fieldDefault: fieldSchema.default,
|
|
414
|
-
fieldKey,
|
|
415
|
-
fieldSchema,
|
|
416
|
-
nodePath,
|
|
417
|
-
schema: effect.schema,
|
|
418
|
-
value,
|
|
419
|
-
});
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
return handles;
|
|
423
|
-
};
|
|
424
279
|
const measureOutlines = (container, targets) => {
|
|
425
280
|
const containerRect = container.getBoundingClientRect();
|
|
426
281
|
const outlines = [];
|
|
@@ -433,11 +288,21 @@ const measureOutlines = (container, targets) => {
|
|
|
433
288
|
if (points === null) {
|
|
434
289
|
continue;
|
|
435
290
|
}
|
|
436
|
-
outlines.push({
|
|
291
|
+
outlines.push({
|
|
292
|
+
key: target.key,
|
|
293
|
+
dimensions: element instanceof HTMLElement
|
|
294
|
+
? {
|
|
295
|
+
width: element.offsetWidth,
|
|
296
|
+
height: element.offsetHeight,
|
|
297
|
+
}
|
|
298
|
+
: null,
|
|
299
|
+
points,
|
|
300
|
+
});
|
|
437
301
|
}
|
|
438
302
|
return outlines;
|
|
439
303
|
};
|
|
440
304
|
const outlinesAreEqual = (a, b) => {
|
|
305
|
+
var _a, _b, _c, _d;
|
|
441
306
|
if (a.length !== b.length) {
|
|
442
307
|
return false;
|
|
443
308
|
}
|
|
@@ -445,6 +310,10 @@ const outlinesAreEqual = (a, b) => {
|
|
|
445
310
|
if (a[i].key !== b[i].key) {
|
|
446
311
|
return false;
|
|
447
312
|
}
|
|
313
|
+
if (((_a = a[i].dimensions) === null || _a === void 0 ? void 0 : _a.width) !== ((_b = b[i].dimensions) === null || _b === void 0 ? void 0 : _b.width) ||
|
|
314
|
+
((_c = a[i].dimensions) === null || _c === void 0 ? void 0 : _c.height) !== ((_d = b[i].dimensions) === null || _d === void 0 ? void 0 : _d.height)) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
448
317
|
for (let j = 0; j < a[i].points.length; j++) {
|
|
449
318
|
if (Math.abs(a[i].points[j].x - b[i].points[j].x) > 0.01 ||
|
|
450
319
|
Math.abs(a[i].points[j].y - b[i].points[j].y) > 0.01) {
|
|
@@ -486,6 +355,16 @@ const getSelectedOutlineDragValues = ({ dragStates, deltaX, deltaY, }) => {
|
|
|
486
355
|
]));
|
|
487
356
|
};
|
|
488
357
|
exports.getSelectedOutlineDragValues = getSelectedOutlineDragValues;
|
|
358
|
+
const applySelectedOutlineDragAxisLock = ({ deltaX, deltaY, axisLocked, }) => {
|
|
359
|
+
if (!axisLocked) {
|
|
360
|
+
return { deltaX, deltaY };
|
|
361
|
+
}
|
|
362
|
+
if (Math.abs(deltaX) >= Math.abs(deltaY)) {
|
|
363
|
+
return { deltaX, deltaY: 0 };
|
|
364
|
+
}
|
|
365
|
+
return { deltaX: 0, deltaY };
|
|
366
|
+
};
|
|
367
|
+
exports.applySelectedOutlineDragAxisLock = applySelectedOutlineDragAxisLock;
|
|
489
368
|
const getSelectedOutlineDragChanges = ({ dragStates, lastValues, }) => {
|
|
490
369
|
const changes = [];
|
|
491
370
|
for (const dragState of dragStates) {
|
|
@@ -597,8 +476,8 @@ const getSelectedOutlineScaleDragValues = ({ axis, dragStates, scaleFactor, }) =
|
|
|
597
476
|
max,
|
|
598
477
|
})
|
|
599
478
|
: axis === 'x'
|
|
600
|
-
? [clamp(newValue, min, max), baseY]
|
|
601
|
-
: [baseX, clamp(newValue, min, max)];
|
|
479
|
+
? [(0, selected_outline_geometry_1.clamp)(newValue, min, max), baseY]
|
|
480
|
+
: [baseX, (0, selected_outline_geometry_1.clamp)(newValue, min, max)];
|
|
602
481
|
return [
|
|
603
482
|
dragState.key,
|
|
604
483
|
no_react_1.NoReactInternals.serializeScaleValue([x, y, dragState.startZ]),
|
|
@@ -633,6 +512,81 @@ const getSelectedOutlineScaleDragChanges = ({ dragStates, lastValues, }) => {
|
|
|
633
512
|
});
|
|
634
513
|
};
|
|
635
514
|
exports.getSelectedOutlineScaleDragChanges = getSelectedOutlineScaleDragChanges;
|
|
515
|
+
const getSelectedOutlineRotationDragStates = ({ dragTargets, getDragOverrides, timelinePosition, }) => {
|
|
516
|
+
return dragTargets.map((target) => {
|
|
517
|
+
var _a;
|
|
518
|
+
const dragOverrideValue = ((_a = getDragOverrides(target.nodePath)) !== null && _a !== void 0 ? _a : {})[rotateFieldKey];
|
|
519
|
+
const sourceFrame = timelinePosition - target.keyframeDisplayOffset;
|
|
520
|
+
const effectiveValue = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
521
|
+
propStatus: target.propStatus,
|
|
522
|
+
dragOverrideValue,
|
|
523
|
+
defaultValue: target.fieldDefault,
|
|
524
|
+
frame: sourceFrame,
|
|
525
|
+
shouldResortToDefaultValueIfUndefined: true,
|
|
526
|
+
});
|
|
527
|
+
return {
|
|
528
|
+
defaultValue: target.fieldDefault !== undefined
|
|
529
|
+
? JSON.stringify(target.fieldDefault)
|
|
530
|
+
: null,
|
|
531
|
+
key: remotion_1.Internals.makeSequencePropsSubscriptionKey(target.nodePath),
|
|
532
|
+
sourceFrame,
|
|
533
|
+
startDegrees: (0, timeline_rotation_utils_1.parseCssRotationToDegrees)(String(effectiveValue !== null && effectiveValue !== void 0 ? effectiveValue : '0deg')),
|
|
534
|
+
target,
|
|
535
|
+
};
|
|
536
|
+
});
|
|
537
|
+
};
|
|
538
|
+
exports.getSelectedOutlineRotationDragStates = getSelectedOutlineRotationDragStates;
|
|
539
|
+
const getSelectedOutlineRotationDragValues = ({ dragStates, rotationDeltaDegrees, }) => {
|
|
540
|
+
return new Map(dragStates.map((dragState) => [
|
|
541
|
+
dragState.key,
|
|
542
|
+
(0, timeline_rotation_utils_1.serializeCssRotation)(dragState.startDegrees + rotationDeltaDegrees),
|
|
543
|
+
]));
|
|
544
|
+
};
|
|
545
|
+
exports.getSelectedOutlineRotationDragValues = getSelectedOutlineRotationDragValues;
|
|
546
|
+
const getSelectedOutlineRotationDragChanges = ({ dragStates, lastValues, }) => {
|
|
547
|
+
const changes = [];
|
|
548
|
+
for (const dragState of dragStates) {
|
|
549
|
+
const value = lastValues.get(dragState.key);
|
|
550
|
+
if (value === undefined) {
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (dragState.target.propStatus.status === 'keyframed') {
|
|
554
|
+
const startValue = (0, timeline_rotation_utils_1.serializeCssRotation)(dragState.startDegrees);
|
|
555
|
+
if (value === startValue) {
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
changes.push({
|
|
559
|
+
type: 'keyframed',
|
|
560
|
+
fileName: dragState.target.nodePath.absolutePath,
|
|
561
|
+
nodePath: dragState.target.nodePath,
|
|
562
|
+
fieldKey: rotateFieldKey,
|
|
563
|
+
sourceFrame: dragState.sourceFrame,
|
|
564
|
+
value,
|
|
565
|
+
schema: dragState.target.schema,
|
|
566
|
+
clientId: dragState.target.clientId,
|
|
567
|
+
});
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
const stringifiedValue = JSON.stringify(value);
|
|
571
|
+
const shouldSave = value !== dragState.target.propStatus.codeValue &&
|
|
572
|
+
!(dragState.defaultValue === stringifiedValue &&
|
|
573
|
+
dragState.target.propStatus.codeValue === undefined);
|
|
574
|
+
if (!shouldSave) {
|
|
575
|
+
continue;
|
|
576
|
+
}
|
|
577
|
+
changes.push({
|
|
578
|
+
type: 'static',
|
|
579
|
+
fileName: dragState.target.nodePath.absolutePath,
|
|
580
|
+
nodePath: dragState.target.nodePath,
|
|
581
|
+
fieldKey: rotateFieldKey,
|
|
582
|
+
value,
|
|
583
|
+
defaultValue: dragState.defaultValue,
|
|
584
|
+
schema: dragState.target.schema,
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
return changes;
|
|
588
|
+
};
|
|
589
|
+
exports.getSelectedOutlineRotationDragChanges = getSelectedOutlineRotationDragChanges;
|
|
636
590
|
const clearSelectedOutlineDragOverrides = ({ clearDragOverrides, dragStates, }) => {
|
|
637
591
|
for (const dragState of dragStates) {
|
|
638
592
|
clearDragOverrides(dragState.target.nodePath);
|
|
@@ -643,8 +597,250 @@ const clearSelectedOutlineScaleDragOverrides = ({ clearDragOverrides, dragStates
|
|
|
643
597
|
clearDragOverrides(dragState.target.nodePath);
|
|
644
598
|
}
|
|
645
599
|
};
|
|
600
|
+
const clearSelectedOutlineRotationDragOverrides = ({ clearDragOverrides, dragStates, }) => {
|
|
601
|
+
for (const dragState of dragStates) {
|
|
602
|
+
clearDragOverrides(dragState.target.nodePath);
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
const parseCssRotationToRadians = (value) => {
|
|
606
|
+
const match = value
|
|
607
|
+
.trim()
|
|
608
|
+
.match(/^([+-]?(?:\d+\.?\d*|\.\d+))(deg|rad|turn|grad)$/);
|
|
609
|
+
if (!match) {
|
|
610
|
+
return null;
|
|
611
|
+
}
|
|
612
|
+
const number = Number(match[1]);
|
|
613
|
+
if (!Number.isFinite(number)) {
|
|
614
|
+
return null;
|
|
615
|
+
}
|
|
616
|
+
if (match[2] === 'rad') {
|
|
617
|
+
return number;
|
|
618
|
+
}
|
|
619
|
+
if (match[2] === 'turn') {
|
|
620
|
+
return number * Math.PI * 2;
|
|
621
|
+
}
|
|
622
|
+
if (match[2] === 'grad') {
|
|
623
|
+
return (number / 400) * Math.PI * 2;
|
|
624
|
+
}
|
|
625
|
+
return (number / 180) * Math.PI;
|
|
626
|
+
};
|
|
627
|
+
const compensateTranslateForTransformOrigin = ({ startTranslate, deltaOrigin, rotate, scale, }) => {
|
|
628
|
+
const cos = Math.cos(rotate);
|
|
629
|
+
const sin = Math.sin(rotate);
|
|
630
|
+
const matrixA = cos * scale[0];
|
|
631
|
+
const matrixB = sin * scale[0];
|
|
632
|
+
const matrixC = -sin * scale[1];
|
|
633
|
+
const matrixD = cos * scale[1];
|
|
634
|
+
const transformedDeltaX = matrixA * deltaOrigin[0] + matrixC * deltaOrigin[1];
|
|
635
|
+
const transformedDeltaY = matrixB * deltaOrigin[0] + matrixD * deltaOrigin[1];
|
|
636
|
+
const compensationX = deltaOrigin[0] - transformedDeltaX;
|
|
637
|
+
const compensationY = deltaOrigin[1] - transformedDeltaY;
|
|
638
|
+
return [startTranslate[0] - compensationX, startTranslate[1] - compensationY];
|
|
639
|
+
};
|
|
640
|
+
exports.compensateTranslateForTransformOrigin = compensateTranslateForTransformOrigin;
|
|
641
|
+
const uvsEqual = (left, right) => Math.abs(left[0] - right[0]) < 0.000001 &&
|
|
642
|
+
Math.abs(left[1] - right[1]) < 0.000001;
|
|
643
|
+
const SelectedOutlineTransformOriginHandle = ({ outline, onDraggingChange, target }) => {
|
|
644
|
+
var _a;
|
|
645
|
+
const { setDragOverrides, clearDragOverrides, setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
|
|
646
|
+
const transformOriginDrag = (_a = target === null || target === void 0 ? void 0 : target.transformOriginDrag) !== null && _a !== void 0 ? _a : null;
|
|
647
|
+
const parsed = (0, react_1.useMemo)(() => transformOriginDrag === null
|
|
648
|
+
? null
|
|
649
|
+
: (0, transform_origin_utils_1.parseTransformOrigin)(transformOriginDrag.originValue), [transformOriginDrag]);
|
|
650
|
+
const uv = (0, react_1.useMemo)(() => {
|
|
651
|
+
if (parsed === null || outline.dimensions === null) {
|
|
652
|
+
return null;
|
|
653
|
+
}
|
|
654
|
+
return (0, transform_origin_utils_1.parsedTransformOriginToUv)({
|
|
655
|
+
parsed,
|
|
656
|
+
width: outline.dimensions.width,
|
|
657
|
+
height: outline.dimensions.height,
|
|
658
|
+
});
|
|
659
|
+
}, [outline.dimensions, parsed]);
|
|
660
|
+
const position = (0, react_1.useMemo)(() => (uv === null ? null : (0, selected_outline_uv_1.getUvHandlePosition)(outline.points, uv)), [outline.points, uv]);
|
|
661
|
+
const onPointerDown = react_1.default.useCallback((event) => {
|
|
662
|
+
if (event.button !== 0 ||
|
|
663
|
+
transformOriginDrag === null ||
|
|
664
|
+
parsed === null ||
|
|
665
|
+
uv === null ||
|
|
666
|
+
outline.dimensions === null) {
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
event.preventDefault();
|
|
670
|
+
event.stopPropagation();
|
|
671
|
+
const svg = event.currentTarget.ownerSVGElement;
|
|
672
|
+
if (svg === null) {
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
const rotation = parseCssRotationToRadians(transformOriginDrag.rotateValue);
|
|
676
|
+
if (rotation === null) {
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
const { dimensions } = outline;
|
|
680
|
+
if (dimensions === null) {
|
|
681
|
+
return;
|
|
682
|
+
}
|
|
683
|
+
const [scaleX, scaleY] = no_react_1.NoReactInternals.parseScaleValue(transformOriginDrag.scaleValue);
|
|
684
|
+
const startTranslate = (0, timeline_translate_utils_1.parseTranslate)(transformOriginDrag.translateValue);
|
|
685
|
+
const svgRect = svg.getBoundingClientRect();
|
|
686
|
+
const defaultOrigin = transformOriginDrag.originDefault !== undefined
|
|
687
|
+
? JSON.stringify(transformOriginDrag.originDefault)
|
|
688
|
+
: null;
|
|
689
|
+
const defaultTranslate = transformOriginDrag.translateDefault !== undefined
|
|
690
|
+
? JSON.stringify(transformOriginDrag.translateDefault)
|
|
691
|
+
: null;
|
|
692
|
+
let last = null;
|
|
693
|
+
onDraggingChange(true);
|
|
694
|
+
(0, ForceSpecificCursor_1.forceSpecificCursor)('crosshair');
|
|
695
|
+
const updateFromPointerEvent = (pointerEvent) => {
|
|
696
|
+
const point = {
|
|
697
|
+
x: pointerEvent.clientX - svgRect.left,
|
|
698
|
+
y: pointerEvent.clientY - svgRect.top,
|
|
699
|
+
};
|
|
700
|
+
const nextUv = (0, selected_outline_uv_1.getUvCoordinateForPoint)(outline.points, point);
|
|
701
|
+
const deltaOrigin = [
|
|
702
|
+
(nextUv[0] - uv[0]) * dimensions.width,
|
|
703
|
+
(nextUv[1] - uv[1]) * dimensions.height,
|
|
704
|
+
];
|
|
705
|
+
const [nextTranslateX, nextTranslateY] = (0, exports.compensateTranslateForTransformOrigin)({
|
|
706
|
+
startTranslate,
|
|
707
|
+
deltaOrigin,
|
|
708
|
+
rotate: rotation,
|
|
709
|
+
scale: [scaleX, scaleY],
|
|
710
|
+
});
|
|
711
|
+
const origin = (0, transform_origin_utils_1.serializeTransformOrigin)({
|
|
712
|
+
uv: nextUv,
|
|
713
|
+
z: parsed.z,
|
|
714
|
+
});
|
|
715
|
+
const translate = (0, timeline_translate_utils_1.serializeTranslate)(nextTranslateX, nextTranslateY);
|
|
716
|
+
last = { uv: nextUv, origin, translate };
|
|
717
|
+
setDragOverrides(transformOriginDrag.nodePath, transformOriginFieldKey, transformOriginDrag.originPropStatus.status === 'keyframed'
|
|
718
|
+
? remotion_1.Internals.makeKeyframedDragOverride({
|
|
719
|
+
status: transformOriginDrag.originPropStatus,
|
|
720
|
+
frame: transformOriginDrag.sourceFrame,
|
|
721
|
+
value: origin,
|
|
722
|
+
})
|
|
723
|
+
: remotion_1.Internals.makeStaticDragOverride(origin));
|
|
724
|
+
setDragOverrides(transformOriginDrag.nodePath, translateFieldKey, transformOriginDrag.translatePropStatus.status === 'keyframed'
|
|
725
|
+
? remotion_1.Internals.makeKeyframedDragOverride({
|
|
726
|
+
status: transformOriginDrag.translatePropStatus,
|
|
727
|
+
frame: transformOriginDrag.sourceFrame,
|
|
728
|
+
value: translate,
|
|
729
|
+
})
|
|
730
|
+
: remotion_1.Internals.makeStaticDragOverride(translate));
|
|
731
|
+
};
|
|
732
|
+
updateFromPointerEvent(event);
|
|
733
|
+
const onPointerMove = (moveEvent) => {
|
|
734
|
+
moveEvent.preventDefault();
|
|
735
|
+
updateFromPointerEvent(moveEvent);
|
|
736
|
+
};
|
|
737
|
+
const onPointerUp = () => {
|
|
738
|
+
window.removeEventListener('pointermove', onPointerMove);
|
|
739
|
+
window.removeEventListener('pointerup', onPointerUp);
|
|
740
|
+
window.removeEventListener('pointercancel', onPointerUp);
|
|
741
|
+
(0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
|
|
742
|
+
onDraggingChange(false);
|
|
743
|
+
if (last === null || uvsEqual(last.uv, uv)) {
|
|
744
|
+
clearDragOverrides(transformOriginDrag.nodePath);
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
const originChanged = last.origin !== transformOriginDrag.originValue;
|
|
748
|
+
const translateChanged = last.translate !== transformOriginDrag.translateValue;
|
|
749
|
+
if (!originChanged && !translateChanged) {
|
|
750
|
+
clearDragOverrides(transformOriginDrag.nodePath);
|
|
751
|
+
return;
|
|
752
|
+
}
|
|
753
|
+
const shouldSaveAsKeyframes = transformOriginDrag.originPropStatus.status === 'keyframed' ||
|
|
754
|
+
transformOriginDrag.translatePropStatus.status === 'keyframed';
|
|
755
|
+
const promise = shouldSaveAsKeyframes
|
|
756
|
+
? (0, call_add_keyframe_1.callAddKeyframes)({
|
|
757
|
+
sequenceKeyframes: [
|
|
758
|
+
originChanged
|
|
759
|
+
? {
|
|
760
|
+
fileName: transformOriginDrag.nodePath.absolutePath,
|
|
761
|
+
nodePath: transformOriginDrag.nodePath,
|
|
762
|
+
fieldKey: transformOriginFieldKey,
|
|
763
|
+
sourceFrame: transformOriginDrag.sourceFrame,
|
|
764
|
+
value: last.origin,
|
|
765
|
+
schema: transformOriginDrag.schema,
|
|
766
|
+
}
|
|
767
|
+
: null,
|
|
768
|
+
translateChanged
|
|
769
|
+
? {
|
|
770
|
+
fileName: transformOriginDrag.nodePath.absolutePath,
|
|
771
|
+
nodePath: transformOriginDrag.nodePath,
|
|
772
|
+
fieldKey: translateFieldKey,
|
|
773
|
+
sourceFrame: transformOriginDrag.sourceFrame,
|
|
774
|
+
value: last.translate,
|
|
775
|
+
schema: transformOriginDrag.schema,
|
|
776
|
+
}
|
|
777
|
+
: null,
|
|
778
|
+
].filter(no_react_1.NoReactInternals.truthy),
|
|
779
|
+
effectKeyframes: [],
|
|
780
|
+
setPropStatuses,
|
|
781
|
+
clientId: transformOriginDrag.clientId,
|
|
782
|
+
})
|
|
783
|
+
: (0, save_sequence_prop_1.saveSequenceProps)({
|
|
784
|
+
changes: [
|
|
785
|
+
originChanged
|
|
786
|
+
? {
|
|
787
|
+
fileName: transformOriginDrag.nodePath.absolutePath,
|
|
788
|
+
nodePath: transformOriginDrag.nodePath,
|
|
789
|
+
fieldKey: transformOriginFieldKey,
|
|
790
|
+
value: last.origin,
|
|
791
|
+
defaultValue: defaultOrigin,
|
|
792
|
+
schema: transformOriginDrag.schema,
|
|
793
|
+
}
|
|
794
|
+
: null,
|
|
795
|
+
translateChanged
|
|
796
|
+
? {
|
|
797
|
+
fileName: transformOriginDrag.nodePath.absolutePath,
|
|
798
|
+
nodePath: transformOriginDrag.nodePath,
|
|
799
|
+
fieldKey: translateFieldKey,
|
|
800
|
+
value: last.translate,
|
|
801
|
+
defaultValue: defaultTranslate,
|
|
802
|
+
schema: transformOriginDrag.schema,
|
|
803
|
+
}
|
|
804
|
+
: null,
|
|
805
|
+
].filter(no_react_1.NoReactInternals.truthy),
|
|
806
|
+
setPropStatuses,
|
|
807
|
+
clientId: transformOriginDrag.clientId,
|
|
808
|
+
undoLabel: 'Move transform origin',
|
|
809
|
+
redoLabel: 'Move transform origin back',
|
|
810
|
+
});
|
|
811
|
+
promise
|
|
812
|
+
.catch((err) => {
|
|
813
|
+
(0, NotificationCenter_1.showNotification)(`Could not save transform origin: ${err instanceof Error ? err.message : String(err)}`, 4000);
|
|
814
|
+
})
|
|
815
|
+
.finally(() => {
|
|
816
|
+
clearDragOverrides(transformOriginDrag.nodePath);
|
|
817
|
+
});
|
|
818
|
+
};
|
|
819
|
+
window.addEventListener('pointermove', onPointerMove);
|
|
820
|
+
window.addEventListener('pointerup', onPointerUp);
|
|
821
|
+
window.addEventListener('pointercancel', onPointerUp);
|
|
822
|
+
}, [
|
|
823
|
+
clearDragOverrides,
|
|
824
|
+
onDraggingChange,
|
|
825
|
+
outline,
|
|
826
|
+
parsed,
|
|
827
|
+
setDragOverrides,
|
|
828
|
+
setPropStatuses,
|
|
829
|
+
transformOriginDrag,
|
|
830
|
+
uv,
|
|
831
|
+
]);
|
|
832
|
+
if (transformOriginDrag === null ||
|
|
833
|
+
parsed === null ||
|
|
834
|
+
uv === null ||
|
|
835
|
+
position === null) {
|
|
836
|
+
return null;
|
|
837
|
+
}
|
|
838
|
+
return (jsx_runtime_1.jsxs("g", { pointerEvents: "all", cursor: "crosshair", onPointerDown: onPointerDown, "aria-hidden": "true", children: [
|
|
839
|
+
jsx_runtime_1.jsx("line", { x1: position.x - 8, y1: position.y, x2: position.x + 8, y2: position.y, stroke: "white", strokeWidth: 4, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("line", { x1: position.x, y1: position.y - 8, x2: position.x, y2: position.y + 8, stroke: "white", strokeWidth: 4, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("circle", { cx: position.x, cy: position.y, r: 4, fill: "white", stroke: colors_1.BLUE, strokeWidth: 2, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("line", { x1: position.x - 8, y1: position.y, x2: position.x + 8, y2: position.y, stroke: colors_1.BLUE, strokeWidth: 2, vectorEffect: "non-scaling-stroke" }), jsx_runtime_1.jsx("line", { x1: position.x, y1: position.y - 8, x2: position.x, y2: position.y + 8, stroke: colors_1.BLUE, strokeWidth: 2, vectorEffect: "non-scaling-stroke" })
|
|
840
|
+
] }));
|
|
841
|
+
};
|
|
646
842
|
const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, hovered, onContextMenuOpen, outline, onDraggingChange, onHoverChange, onSelect, scale, target, }) => {
|
|
647
|
-
var _a, _b, _c;
|
|
843
|
+
var _a, _b, _c, _d;
|
|
648
844
|
const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
|
|
649
845
|
const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
|
|
650
846
|
const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
|
|
@@ -655,6 +851,8 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
655
851
|
const drag = (_a = target === null || target === void 0 ? void 0 : target.drag) !== null && _a !== void 0 ? _a : null;
|
|
656
852
|
const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
|
|
657
853
|
const containsSelection = (_c = target === null || target === void 0 ? void 0 : target.containsSelection) !== null && _c !== void 0 ? _c : false;
|
|
854
|
+
const effectDrop = (_d = target === null || target === void 0 ? void 0 : target.effectDrop) !== null && _d !== void 0 ? _d : null;
|
|
855
|
+
const [effectDropHovered, setEffectDropHovered] = (0, react_1.useState)(false);
|
|
658
856
|
const visible = containsSelection || hovered;
|
|
659
857
|
const onPointerDown = react_1.default.useCallback((event) => {
|
|
660
858
|
if (event.button !== 0 || target === undefined) {
|
|
@@ -679,12 +877,19 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
679
877
|
timelinePosition: timelinePositionRef.current,
|
|
680
878
|
});
|
|
681
879
|
let lastValues = new Map();
|
|
682
|
-
|
|
683
|
-
|
|
880
|
+
let currentPointerX = startPointerX;
|
|
881
|
+
let currentPointerY = startPointerY;
|
|
882
|
+
let axisLocked = false;
|
|
883
|
+
const updateDragOverrides = () => {
|
|
884
|
+
const dragDelta = (0, exports.applySelectedOutlineDragAxisLock)({
|
|
885
|
+
deltaX: (currentPointerX - startPointerX) / scale,
|
|
886
|
+
deltaY: (currentPointerY - startPointerY) / scale,
|
|
887
|
+
axisLocked,
|
|
888
|
+
});
|
|
684
889
|
lastValues = (0, exports.getSelectedOutlineDragValues)({
|
|
685
890
|
dragStates,
|
|
686
|
-
deltaX:
|
|
687
|
-
deltaY:
|
|
891
|
+
deltaX: dragDelta.deltaX,
|
|
892
|
+
deltaY: dragDelta.deltaY,
|
|
688
893
|
});
|
|
689
894
|
for (const dragState of dragStates) {
|
|
690
895
|
const value = lastValues.get(dragState.key);
|
|
@@ -703,10 +908,30 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
703
908
|
}
|
|
704
909
|
}
|
|
705
910
|
};
|
|
911
|
+
const onPointerMove = (moveEvent) => {
|
|
912
|
+
moveEvent.preventDefault();
|
|
913
|
+
currentPointerX = moveEvent.clientX;
|
|
914
|
+
currentPointerY = moveEvent.clientY;
|
|
915
|
+
axisLocked = moveEvent.shiftKey;
|
|
916
|
+
updateDragOverrides();
|
|
917
|
+
};
|
|
918
|
+
const onKeyChange = (keyEvent) => {
|
|
919
|
+
if (keyEvent.key !== 'Shift') {
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
const nextAxisLocked = keyEvent.type === 'keydown';
|
|
923
|
+
if (nextAxisLocked === axisLocked) {
|
|
924
|
+
return;
|
|
925
|
+
}
|
|
926
|
+
axisLocked = nextAxisLocked;
|
|
927
|
+
updateDragOverrides();
|
|
928
|
+
};
|
|
706
929
|
const onPointerUp = () => {
|
|
707
930
|
window.removeEventListener('pointermove', onPointerMove);
|
|
708
931
|
window.removeEventListener('pointerup', onPointerUp);
|
|
709
932
|
window.removeEventListener('pointercancel', onPointerUp);
|
|
933
|
+
window.removeEventListener('keydown', onKeyChange);
|
|
934
|
+
window.removeEventListener('keyup', onKeyChange);
|
|
710
935
|
onDraggingChange(false);
|
|
711
936
|
const changes = (0, exports.getSelectedOutlineDragChanges)({
|
|
712
937
|
dragStates,
|
|
@@ -753,6 +978,8 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
753
978
|
window.addEventListener('pointermove', onPointerMove);
|
|
754
979
|
window.addEventListener('pointerup', onPointerUp);
|
|
755
980
|
window.addEventListener('pointercancel', onPointerUp);
|
|
981
|
+
window.addEventListener('keydown', onKeyChange);
|
|
982
|
+
window.addEventListener('keyup', onKeyChange);
|
|
756
983
|
}, [
|
|
757
984
|
allDragTargets,
|
|
758
985
|
clearDragOverrides,
|
|
@@ -766,8 +993,47 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
766
993
|
setDragOverrides,
|
|
767
994
|
target,
|
|
768
995
|
]);
|
|
996
|
+
const onEffectDragOver = react_1.default.useCallback((event) => {
|
|
997
|
+
if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
|
|
998
|
+
return;
|
|
999
|
+
}
|
|
1000
|
+
event.preventDefault();
|
|
1001
|
+
event.stopPropagation();
|
|
1002
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
1003
|
+
setEffectDropHovered(true);
|
|
1004
|
+
}, [effectDrop]);
|
|
1005
|
+
const onEffectDragLeave = react_1.default.useCallback((event) => {
|
|
1006
|
+
if (event.currentTarget.contains(event.relatedTarget)) {
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
1009
|
+
setEffectDropHovered(false);
|
|
1010
|
+
}, []);
|
|
1011
|
+
const onEffectDrop = react_1.default.useCallback(async (event) => {
|
|
1012
|
+
if (effectDrop === null || !(0, effect_drag_and_drop_1.hasEffectDragType)(event.dataTransfer)) {
|
|
1013
|
+
return;
|
|
1014
|
+
}
|
|
1015
|
+
const dragData = (0, effect_drag_and_drop_1.getEffectDragData)(event.dataTransfer);
|
|
1016
|
+
if (!dragData) {
|
|
1017
|
+
if ((0, effect_drag_and_drop_1.hasExplicitEffectDragType)(event.dataTransfer)) {
|
|
1018
|
+
event.preventDefault();
|
|
1019
|
+
event.stopPropagation();
|
|
1020
|
+
setEffectDropHovered(false);
|
|
1021
|
+
(0, NotificationCenter_1.showNotification)('Could not read effect drag data', 3000);
|
|
1022
|
+
}
|
|
1023
|
+
return;
|
|
1024
|
+
}
|
|
1025
|
+
event.preventDefault();
|
|
1026
|
+
event.stopPropagation();
|
|
1027
|
+
setEffectDropHovered(false);
|
|
1028
|
+
await (0, effect_drag_and_drop_1.addEffectFromDragData)({
|
|
1029
|
+
dragData,
|
|
1030
|
+
fileName: effectDrop.fileName,
|
|
1031
|
+
nodePath: effectDrop.nodePath,
|
|
1032
|
+
clientId: effectDrop.clientId,
|
|
1033
|
+
});
|
|
1034
|
+
}, [effectDrop]);
|
|
769
1035
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
770
|
-
jsx_runtime_1.jsx("polygon", { ref: polygonRef, points: points, fill:
|
|
1036
|
+
jsx_runtime_1.jsx("polygon", { ref: polygonRef, points: points, fill: effectDropHovered ? 'rgba(0, 155, 255, 0.12)' : 'transparent', stroke: colors_1.BLUE, strokeOpacity: visible || effectDropHovered ? 1 : 0, strokeWidth: 2, vectorEffect: "non-scaling-stroke", pointerEvents: target === undefined ? undefined : 'all', onPointerEnter: () => {
|
|
771
1037
|
if (!dragging) {
|
|
772
1038
|
onHoverChange(outline.key);
|
|
773
1039
|
}
|
|
@@ -775,7 +1041,7 @@ const SelectedOutlinePolygon = ({ allDragTargets, contextMenuValues, dragging, h
|
|
|
775
1041
|
if (!dragging) {
|
|
776
1042
|
onHoverChange(null);
|
|
777
1043
|
}
|
|
778
|
-
}, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
|
|
1044
|
+
}, onPointerDown: onPointerDown, onDragOver: effectDrop === null ? undefined : onEffectDragOver, onDragLeave: effectDrop === null ? undefined : onEffectDragLeave, onDrop: effectDrop === null ? undefined : onEffectDrop }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: polygonRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
|
|
779
1045
|
] }));
|
|
780
1046
|
};
|
|
781
1047
|
const SelectedOutlineScaleEdgeLine = ({ allScaleDragTargets, contextMenuValues, dragging, edge, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
|
|
@@ -894,21 +1160,25 @@ const SelectedOutlineScaleEdgeLine = ({ allScaleDragTargets, contextMenuValues,
|
|
|
894
1160
|
}, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: lineRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
|
|
895
1161
|
] }));
|
|
896
1162
|
};
|
|
897
|
-
const
|
|
1163
|
+
const svgPointToClientPoint = (point, rect) => {
|
|
898
1164
|
return {
|
|
899
|
-
x:
|
|
900
|
-
y:
|
|
1165
|
+
x: point.x + rect.left,
|
|
1166
|
+
y: point.y + rect.top,
|
|
901
1167
|
};
|
|
902
1168
|
};
|
|
903
|
-
const
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
};
|
|
907
|
-
const
|
|
908
|
-
const
|
|
909
|
-
|
|
1169
|
+
const SelectedOutlineRotationCornerHandle = ({ allRotationDragTargets, contextMenuValues, corner, dragging, outline, onDraggingChange, onContextMenuOpen, onHoverChange, onSelect, target, }) => {
|
|
1170
|
+
var _a, _b;
|
|
1171
|
+
const { getDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
|
|
1172
|
+
const { setPropStatuses, setDragOverrides, clearDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
|
|
1173
|
+
const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
|
|
1174
|
+
const timelinePositionRef = (0, react_1.useRef)(timelinePosition);
|
|
1175
|
+
timelinePositionRef.current = timelinePosition;
|
|
1176
|
+
const rotationDrag = (_a = target === null || target === void 0 ? void 0 : target.rotationDrag) !== null && _a !== void 0 ? _a : null;
|
|
1177
|
+
const selected = (_b = target === null || target === void 0 ? void 0 : target.selected) !== null && _b !== void 0 ? _b : false;
|
|
1178
|
+
const circleRef = (0, react_1.useRef)(null);
|
|
1179
|
+
const cornerInfo = (0, react_1.useMemo)(() => (0, exports.getSelectedOutlineRotationCornerInfo)(outline.points, corner), [corner, outline.points]);
|
|
910
1180
|
const onPointerDown = react_1.default.useCallback((event) => {
|
|
911
|
-
if (event.button !== 0) {
|
|
1181
|
+
if (event.button !== 0 || rotationDrag === null) {
|
|
912
1182
|
return;
|
|
913
1183
|
}
|
|
914
1184
|
event.preventDefault();
|
|
@@ -917,69 +1187,148 @@ const SelectedUvHandleCircle = ({ handle, onDraggingChange, outline }) => {
|
|
|
917
1187
|
if (svg === null) {
|
|
918
1188
|
return;
|
|
919
1189
|
}
|
|
920
|
-
const
|
|
921
|
-
|
|
1190
|
+
const interaction = (0, exports.getOutlineSelectionInteraction)(event);
|
|
1191
|
+
const shouldUpdateSelection = !selected || interaction.shiftKey || interaction.toggleKey;
|
|
1192
|
+
if (shouldUpdateSelection && target !== undefined) {
|
|
1193
|
+
onSelect(target.selection, interaction);
|
|
1194
|
+
}
|
|
1195
|
+
if (interaction.shiftKey || interaction.toggleKey) {
|
|
1196
|
+
return;
|
|
1197
|
+
}
|
|
922
1198
|
onDraggingChange(true);
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
const
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
};
|
|
935
|
-
|
|
1199
|
+
(0, ForceSpecificCursor_1.forceSpecificCursor)(cornerInfo.cursor);
|
|
1200
|
+
const svgRect = svg.getBoundingClientRect();
|
|
1201
|
+
const center = svgPointToClientPoint(cornerInfo.center, svgRect);
|
|
1202
|
+
const dragStates = (0, exports.getSelectedOutlineRotationDragStates)({
|
|
1203
|
+
dragTargets: selected ? allRotationDragTargets : [rotationDrag],
|
|
1204
|
+
getDragOverrides,
|
|
1205
|
+
timelinePosition: timelinePositionRef.current,
|
|
1206
|
+
});
|
|
1207
|
+
let previousAngle = getAngleDegrees(center, {
|
|
1208
|
+
x: event.clientX,
|
|
1209
|
+
y: event.clientY,
|
|
1210
|
+
});
|
|
1211
|
+
let accumulatedDelta = 0;
|
|
1212
|
+
let lastValues = new Map();
|
|
936
1213
|
const onPointerMove = (moveEvent) => {
|
|
937
1214
|
moveEvent.preventDefault();
|
|
938
|
-
|
|
1215
|
+
const nextAngle = getAngleDegrees(center, {
|
|
1216
|
+
x: moveEvent.clientX,
|
|
1217
|
+
y: moveEvent.clientY,
|
|
1218
|
+
});
|
|
1219
|
+
accumulatedDelta += (0, exports.getSelectedOutlineRotationDeltaDegrees)({
|
|
1220
|
+
from: previousAngle,
|
|
1221
|
+
to: nextAngle,
|
|
1222
|
+
});
|
|
1223
|
+
previousAngle = nextAngle;
|
|
1224
|
+
lastValues = (0, exports.getSelectedOutlineRotationDragValues)({
|
|
1225
|
+
dragStates,
|
|
1226
|
+
rotationDeltaDegrees: accumulatedDelta,
|
|
1227
|
+
});
|
|
1228
|
+
(0, ForceSpecificCursor_1.forceSpecificCursor)(getRotationCursor(cornerInfo.cursorDegrees + accumulatedDelta));
|
|
1229
|
+
for (const dragState of dragStates) {
|
|
1230
|
+
const value = lastValues.get(dragState.key);
|
|
1231
|
+
if (value === undefined) {
|
|
1232
|
+
throw new Error('Expected rotation drag value to be available');
|
|
1233
|
+
}
|
|
1234
|
+
if (dragState.target.propStatus.status === 'keyframed') {
|
|
1235
|
+
setDragOverrides(dragState.target.nodePath, rotateFieldKey, remotion_1.Internals.makeKeyframedDragOverride({
|
|
1236
|
+
status: dragState.target.propStatus,
|
|
1237
|
+
frame: dragState.sourceFrame,
|
|
1238
|
+
value,
|
|
1239
|
+
}));
|
|
1240
|
+
}
|
|
1241
|
+
else {
|
|
1242
|
+
setDragOverrides(dragState.target.nodePath, rotateFieldKey, remotion_1.Internals.makeStaticDragOverride(value));
|
|
1243
|
+
}
|
|
1244
|
+
}
|
|
939
1245
|
};
|
|
940
1246
|
const onPointerUp = () => {
|
|
941
1247
|
window.removeEventListener('pointermove', onPointerMove);
|
|
942
1248
|
window.removeEventListener('pointerup', onPointerUp);
|
|
943
1249
|
window.removeEventListener('pointercancel', onPointerUp);
|
|
1250
|
+
(0, ForceSpecificCursor_1.stopForcingSpecificCursor)();
|
|
944
1251
|
onDraggingChange(false);
|
|
945
|
-
const
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
1252
|
+
const changes = (0, exports.getSelectedOutlineRotationDragChanges)({
|
|
1253
|
+
dragStates,
|
|
1254
|
+
lastValues,
|
|
1255
|
+
});
|
|
1256
|
+
if (changes.length === 0) {
|
|
1257
|
+
clearSelectedOutlineRotationDragOverrides({
|
|
1258
|
+
clearDragOverrides,
|
|
1259
|
+
dragStates,
|
|
1260
|
+
});
|
|
952
1261
|
return;
|
|
953
1262
|
}
|
|
954
|
-
(
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1263
|
+
const staticChanges = changes.filter((change) => change.type === 'static');
|
|
1264
|
+
const keyframedChanges = changes.filter((change) => change.type === 'keyframed');
|
|
1265
|
+
Promise.all([
|
|
1266
|
+
staticChanges.length > 0
|
|
1267
|
+
? (0, save_sequence_prop_1.saveSequenceProps)({
|
|
1268
|
+
changes: staticChanges,
|
|
1269
|
+
setPropStatuses,
|
|
1270
|
+
clientId: rotationDrag.clientId,
|
|
1271
|
+
undoLabel: changes.length > 1
|
|
1272
|
+
? 'Rotate selected sequences'
|
|
1273
|
+
: 'Rotate sequence',
|
|
1274
|
+
redoLabel: changes.length > 1
|
|
1275
|
+
? 'Rotate selected sequences back'
|
|
1276
|
+
: 'Rotate sequence back',
|
|
1277
|
+
})
|
|
1278
|
+
: Promise.resolve(),
|
|
1279
|
+
...keyframedChanges.map((change) => (0, call_add_keyframe_1.callAddSequenceKeyframe)({
|
|
1280
|
+
fileName: change.fileName,
|
|
1281
|
+
nodePath: change.nodePath,
|
|
1282
|
+
fieldKey: change.fieldKey,
|
|
1283
|
+
sourceFrame: change.sourceFrame,
|
|
1284
|
+
value: change.value,
|
|
1285
|
+
schema: change.schema,
|
|
1286
|
+
setPropStatuses,
|
|
1287
|
+
clientId: change.clientId,
|
|
1288
|
+
})),
|
|
1289
|
+
])
|
|
1290
|
+
.catch((err) => {
|
|
1291
|
+
(0, NotificationCenter_1.showNotification)(`Could not save sequence props: ${err instanceof Error ? err.message : String(err)}`, 4000);
|
|
1292
|
+
})
|
|
1293
|
+
.finally(() => {
|
|
1294
|
+
clearSelectedOutlineRotationDragOverrides({
|
|
1295
|
+
clearDragOverrides,
|
|
1296
|
+
dragStates,
|
|
1297
|
+
});
|
|
967
1298
|
});
|
|
968
1299
|
};
|
|
969
1300
|
window.addEventListener('pointermove', onPointerMove);
|
|
970
1301
|
window.addEventListener('pointerup', onPointerUp);
|
|
971
1302
|
window.addEventListener('pointercancel', onPointerUp);
|
|
972
1303
|
}, [
|
|
973
|
-
|
|
974
|
-
|
|
1304
|
+
allRotationDragTargets,
|
|
1305
|
+
clearDragOverrides,
|
|
1306
|
+
cornerInfo,
|
|
1307
|
+
getDragOverrides,
|
|
975
1308
|
onDraggingChange,
|
|
976
|
-
|
|
1309
|
+
onSelect,
|
|
1310
|
+
rotationDrag,
|
|
1311
|
+
selected,
|
|
977
1312
|
setPropStatuses,
|
|
978
|
-
|
|
1313
|
+
setDragOverrides,
|
|
1314
|
+
target,
|
|
979
1315
|
]);
|
|
980
|
-
|
|
1316
|
+
if (rotationDrag === null) {
|
|
1317
|
+
return null;
|
|
1318
|
+
}
|
|
1319
|
+
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
1320
|
+
jsx_runtime_1.jsx("circle", { ref: circleRef, cx: cornerInfo.point.x, cy: cornerInfo.point.y, r: 12, fill: "transparent", stroke: "transparent", vectorEffect: "non-scaling-stroke", pointerEvents: "all", cursor: cornerInfo.cursor, onPointerEnter: () => {
|
|
1321
|
+
if (!dragging) {
|
|
1322
|
+
onHoverChange(outline.key);
|
|
1323
|
+
}
|
|
1324
|
+
}, onPointerLeave: () => {
|
|
1325
|
+
if (!dragging) {
|
|
1326
|
+
onHoverChange(null);
|
|
1327
|
+
}
|
|
1328
|
+
}, onPointerDown: onPointerDown }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: circleRef, values: [...contextMenuValues], onOpen: onContextMenuOpen })
|
|
1329
|
+
] }));
|
|
981
1330
|
};
|
|
982
|
-
const SelectedOutlineElement = ({ allDragTargets, allScaleDragTargets, dragging, hovered, outline, onDraggingChange, onHoverChange, onSelect, scale, target, }) => {
|
|
1331
|
+
const SelectedOutlineElement = ({ allDragTargets, allRotationDragTargets, allScaleDragTargets, dragging, hovered, outline, onDraggingChange, onHoverChange, onSelect, scale, target, }) => {
|
|
983
1332
|
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
984
1333
|
const updateResolvedStackTrace = (0, react_1.useContext)(remotion_1.Internals.SequenceStackTracesUpdateContext);
|
|
985
1334
|
const onContextMenuOpen = react_1.default.useCallback(async () => {
|
|
@@ -1058,19 +1407,10 @@ const SelectedOutlineElement = ({ allDragTargets, allScaleDragTargets, dragging,
|
|
|
1058
1407
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
1059
1408
|
jsx_runtime_1.jsx(SelectedOutlinePolygon, { allDragTargets: allDragTargets, contextMenuValues: emptyContextMenuValues, dragging: dragging, hovered: hovered, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, scale: scale, target: target }), (target === null || target === void 0 ? void 0 : target.containsSelection) || hovered
|
|
1060
1409
|
? ['top', 'right', 'bottom', 'left'].map((edge) => (jsx_runtime_1.jsx(SelectedOutlineScaleEdgeLine, { allScaleDragTargets: allScaleDragTargets, contextMenuValues: emptyContextMenuValues, dragging: dragging, edge: edge, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, edge)))
|
|
1061
|
-
: null
|
|
1062
|
-
}
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
return null;
|
|
1066
|
-
}
|
|
1067
|
-
return (jsx_runtime_1.jsx(SelectedUvHandleConnectionLines, { handles: target.uvHandles, outline: outline }));
|
|
1068
|
-
};
|
|
1069
|
-
const SelectedOutlineUvHandleCircleLayer = ({ onDraggingChange, outline, target }) => {
|
|
1070
|
-
if (!(target === null || target === void 0 ? void 0 : target.containsSelection) || target.uvHandles.length === 0) {
|
|
1071
|
-
return null;
|
|
1072
|
-
}
|
|
1073
|
-
return (jsx_runtime_1.jsx(jsx_runtime_1.Fragment, { children: target.uvHandles.map((handle) => (jsx_runtime_1.jsx(SelectedUvHandleCircle, { handle: handle, onDraggingChange: onDraggingChange, outline: outline }, `${handle.effectIndex}-${handle.fieldKey}`))) }));
|
|
1410
|
+
: null, (target === null || target === void 0 ? void 0 : target.containsSelection) || hovered
|
|
1411
|
+
? ['top-left', 'top-right', 'bottom-right', 'bottom-left'].map((corner) => (jsx_runtime_1.jsx(SelectedOutlineRotationCornerHandle, { allRotationDragTargets: allRotationDragTargets, contextMenuValues: emptyContextMenuValues, corner: corner, dragging: dragging, outline: outline, onContextMenuOpen: onContextMenuOpen, onDraggingChange: onDraggingChange, onHoverChange: onHoverChange, onSelect: onSelect, target: target }, corner)))
|
|
1412
|
+
: null, jsx_runtime_1.jsx(SelectedOutlineTransformOriginHandle, { outline: outline, onDraggingChange: onDraggingChange, target: target })
|
|
1413
|
+
] }));
|
|
1074
1414
|
};
|
|
1075
1415
|
const SelectedOutlineOverlay = ({ scale }) => {
|
|
1076
1416
|
const { selectedItems, selectItem } = (0, TimelineSelection_1.useTimelineSelection)();
|
|
@@ -1081,6 +1421,7 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1081
1421
|
const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
|
|
1082
1422
|
const { getScaleLockState } = (0, react_1.useContext)(scale_lock_1.ScaleLockContext);
|
|
1083
1423
|
const { editorShowOutlines } = (0, react_1.useContext)(editor_outlines_1.EditorShowOutlinesContext);
|
|
1424
|
+
const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
|
|
1084
1425
|
const [outlines, setOutlines] = (0, react_1.useState)([]);
|
|
1085
1426
|
const [hoveredOutlineKey, setHoveredOutlineKey] = (0, react_1.useState)(null);
|
|
1086
1427
|
const [draggingOutline, setDraggingOutline] = (0, react_1.useState)(false);
|
|
@@ -1092,12 +1433,13 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1092
1433
|
}
|
|
1093
1434
|
}, []);
|
|
1094
1435
|
const outlineTargets = (0, react_1.useMemo)(() => {
|
|
1095
|
-
if (!
|
|
1436
|
+
if (!editorShowOutlines) {
|
|
1096
1437
|
return [];
|
|
1097
1438
|
}
|
|
1098
1439
|
const selectedSequenceKeys = (0, exports.getSelectedSequenceKeys)(selectedItems);
|
|
1099
1440
|
const sequenceKeysContainingSelection = getSequenceKeysContainingSelection(selectedItems);
|
|
1100
1441
|
const selectedEffectsBySequenceKey = (0, exports.getSelectedEffectFieldsBySequenceKey)(selectedItems);
|
|
1442
|
+
const selectedTransformOriginInfo = getSelectedTransformOriginInfo(selectedItems);
|
|
1101
1443
|
const clientId = previewServerState.type === 'connected'
|
|
1102
1444
|
? previewServerState.clientId
|
|
1103
1445
|
: null;
|
|
@@ -1105,7 +1447,8 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1105
1447
|
sequences,
|
|
1106
1448
|
overrideIdsToNodePaths: overrideIdToNodePathMappings,
|
|
1107
1449
|
}).map(({ key, keyframeDisplayOffset, nodePathInfo, sequence }) => {
|
|
1108
|
-
var _a
|
|
1450
|
+
var _a;
|
|
1451
|
+
var _b, _c, _d, _e, _f, _g, _h, _j;
|
|
1109
1452
|
if (sequence.refForOutline === null) {
|
|
1110
1453
|
throw new Error('Expected sequence to have a ref for outline');
|
|
1111
1454
|
}
|
|
@@ -1114,12 +1457,20 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1114
1457
|
const nodePath = nodePathInfo.sequenceSubscriptionKey;
|
|
1115
1458
|
const { controls } = sequence;
|
|
1116
1459
|
const fieldSchema = controls === null || controls === void 0 ? void 0 : controls.schema[translateFieldKey];
|
|
1117
|
-
const
|
|
1460
|
+
const nodePropStatuses = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath);
|
|
1461
|
+
const propStatus = nodePropStatuses === null || nodePropStatuses === void 0 ? void 0 : nodePropStatuses[translateFieldKey];
|
|
1118
1462
|
const scaleFieldSchema = controls === null || controls === void 0 ? void 0 : controls.schema[scaleFieldKey];
|
|
1119
|
-
const scalePropStatus =
|
|
1463
|
+
const scalePropStatus = nodePropStatuses === null || nodePropStatuses === void 0 ? void 0 : nodePropStatuses[scaleFieldKey];
|
|
1464
|
+
const rotationFieldSchema = controls === null || controls === void 0 ? void 0 : controls.schema[rotateFieldKey];
|
|
1465
|
+
const rotationPropStatus = (_a = remotion_1.Internals.getPropStatusesCtx(propStatuses, nodePath)) === null || _a === void 0 ? void 0 : _a[rotateFieldKey];
|
|
1466
|
+
const transformOriginFieldSchema = controls === null || controls === void 0 ? void 0 : controls.schema[transformOriginFieldKey];
|
|
1467
|
+
const transformOriginPropStatus = nodePropStatuses === null || nodePropStatuses === void 0 ? void 0 : nodePropStatuses[transformOriginFieldKey];
|
|
1120
1468
|
const canDragStatus = (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static' ||
|
|
1121
1469
|
((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' &&
|
|
1122
1470
|
propStatus.interpolationFunction === 'interpolate');
|
|
1471
|
+
const canRotationDragStatus = (rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'static' ||
|
|
1472
|
+
((rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'keyframed' &&
|
|
1473
|
+
rotationPropStatus.interpolationFunction === 'interpolate');
|
|
1123
1474
|
const canDrag = previewServerState.type === 'connected' &&
|
|
1124
1475
|
controls !== null &&
|
|
1125
1476
|
(fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.type) === 'translate' &&
|
|
@@ -1128,9 +1479,40 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1128
1479
|
controls !== null &&
|
|
1129
1480
|
(scaleFieldSchema === null || scaleFieldSchema === void 0 ? void 0 : scaleFieldSchema.type) === 'scale' &&
|
|
1130
1481
|
(scalePropStatus === null || scalePropStatus === void 0 ? void 0 : scalePropStatus.status) === 'static';
|
|
1482
|
+
const canRotationDrag = previewServerState.type === 'connected' &&
|
|
1483
|
+
controls !== null &&
|
|
1484
|
+
(rotationFieldSchema === null || rotationFieldSchema === void 0 ? void 0 : rotationFieldSchema.type) === 'rotation-css' &&
|
|
1485
|
+
canRotationDragStatus;
|
|
1486
|
+
const selectedForTransformOrigin = (selectedTransformOriginInfo === null || selectedTransformOriginInfo === void 0 ? void 0 : selectedTransformOriginInfo.sequenceKey) === key;
|
|
1487
|
+
const transformOriginSourceFrame = (selectedTransformOriginInfo === null || selectedTransformOriginInfo === void 0 ? void 0 : selectedTransformOriginInfo.displayFrame) === null ||
|
|
1488
|
+
(selectedTransformOriginInfo === null || selectedTransformOriginInfo === void 0 ? void 0 : selectedTransformOriginInfo.displayFrame) === undefined
|
|
1489
|
+
? timelinePosition - keyframeDisplayOffset
|
|
1490
|
+
: selectedTransformOriginInfo.displayFrame - keyframeDisplayOffset;
|
|
1491
|
+
const canTransformOriginStatus = (transformOriginPropStatus === null || transformOriginPropStatus === void 0 ? void 0 : transformOriginPropStatus.status) === 'static' ||
|
|
1492
|
+
((transformOriginPropStatus === null || transformOriginPropStatus === void 0 ? void 0 : transformOriginPropStatus.status) === 'keyframed' &&
|
|
1493
|
+
transformOriginPropStatus.interpolationFunction === 'interpolate');
|
|
1494
|
+
const canTransformOriginTranslateStatus = (propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'static' ||
|
|
1495
|
+
((propStatus === null || propStatus === void 0 ? void 0 : propStatus.status) === 'keyframed' &&
|
|
1496
|
+
propStatus.interpolationFunction === 'interpolate');
|
|
1497
|
+
const canTransformOriginDrag = previewServerState.type === 'connected' &&
|
|
1498
|
+
selectedForTransformOrigin &&
|
|
1499
|
+
controls !== null &&
|
|
1500
|
+
(transformOriginFieldSchema === null || transformOriginFieldSchema === void 0 ? void 0 : transformOriginFieldSchema.type) === 'transform-origin' &&
|
|
1501
|
+
(fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema.type) === 'translate' &&
|
|
1502
|
+
canTransformOriginStatus &&
|
|
1503
|
+
canTransformOriginTranslateStatus;
|
|
1504
|
+
const canDropEffect = previewServerState.type === 'connected' &&
|
|
1505
|
+
(controls === null || controls === void 0 ? void 0 : controls.supportsEffects) === true;
|
|
1131
1506
|
return {
|
|
1132
1507
|
key,
|
|
1133
1508
|
containsSelection,
|
|
1509
|
+
effectDrop: canDropEffect
|
|
1510
|
+
? {
|
|
1511
|
+
clientId: previewServerState.clientId,
|
|
1512
|
+
fileName: nodePath.absolutePath,
|
|
1513
|
+
nodePath,
|
|
1514
|
+
}
|
|
1515
|
+
: null,
|
|
1134
1516
|
nodePathInfo,
|
|
1135
1517
|
ref: sequence.refForOutline,
|
|
1136
1518
|
selected,
|
|
@@ -1172,14 +1554,77 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1172
1554
|
schema: controls.schema,
|
|
1173
1555
|
}
|
|
1174
1556
|
: null,
|
|
1557
|
+
rotationDrag: canRotationDrag
|
|
1558
|
+
? {
|
|
1559
|
+
propStatus: rotationPropStatus,
|
|
1560
|
+
clientId: previewServerState.clientId,
|
|
1561
|
+
fieldDefault: rotationFieldSchema.default,
|
|
1562
|
+
fieldSchema: rotationFieldSchema,
|
|
1563
|
+
keyframeDisplayOffset,
|
|
1564
|
+
nodePath,
|
|
1565
|
+
schema: controls.schema,
|
|
1566
|
+
}
|
|
1567
|
+
: null,
|
|
1568
|
+
transformOriginDrag: canTransformOriginDrag
|
|
1569
|
+
? {
|
|
1570
|
+
clientId: previewServerState.clientId,
|
|
1571
|
+
keyframeDisplayOffset,
|
|
1572
|
+
nodePath,
|
|
1573
|
+
originDefault: transformOriginFieldSchema.default,
|
|
1574
|
+
originPropStatus: transformOriginPropStatus,
|
|
1575
|
+
originValue: String((_c = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
1576
|
+
propStatus: transformOriginPropStatus,
|
|
1577
|
+
dragOverrideValue: ((_b = getDragOverrides(nodePath)) !== null && _b !== void 0 ? _b : {})[transformOriginFieldKey],
|
|
1578
|
+
defaultValue: transformOriginFieldSchema.default,
|
|
1579
|
+
frame: transformOriginSourceFrame,
|
|
1580
|
+
shouldResortToDefaultValueIfUndefined: true,
|
|
1581
|
+
})) !== null && _c !== void 0 ? _c : transformOriginFieldSchema.default),
|
|
1582
|
+
rotateValue: String((rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'static' ||
|
|
1583
|
+
(rotationPropStatus === null || rotationPropStatus === void 0 ? void 0 : rotationPropStatus.status) === 'keyframed'
|
|
1584
|
+
? ((_e = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
1585
|
+
propStatus: rotationPropStatus,
|
|
1586
|
+
dragOverrideValue: ((_d = getDragOverrides(nodePath)) !== null && _d !== void 0 ? _d : {})[rotateFieldKey],
|
|
1587
|
+
defaultValue: (rotationFieldSchema === null || rotationFieldSchema === void 0 ? void 0 : rotationFieldSchema.type) === 'rotation-css'
|
|
1588
|
+
? rotationFieldSchema.default
|
|
1589
|
+
: '0deg',
|
|
1590
|
+
frame: transformOriginSourceFrame,
|
|
1591
|
+
shouldResortToDefaultValueIfUndefined: true,
|
|
1592
|
+
})) !== null && _e !== void 0 ? _e : '0deg')
|
|
1593
|
+
: '0deg'),
|
|
1594
|
+
scaleValue: (scalePropStatus === null || scalePropStatus === void 0 ? void 0 : scalePropStatus.status) === 'static' ||
|
|
1595
|
+
(scalePropStatus === null || scalePropStatus === void 0 ? void 0 : scalePropStatus.status) === 'keyframed'
|
|
1596
|
+
? String((_g = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
1597
|
+
propStatus: scalePropStatus,
|
|
1598
|
+
dragOverrideValue: ((_f = getDragOverrides(nodePath)) !== null && _f !== void 0 ? _f : {})[scaleFieldKey],
|
|
1599
|
+
defaultValue: (scaleFieldSchema === null || scaleFieldSchema === void 0 ? void 0 : scaleFieldSchema.type) === 'scale'
|
|
1600
|
+
? scaleFieldSchema.default
|
|
1601
|
+
: 1,
|
|
1602
|
+
frame: transformOriginSourceFrame,
|
|
1603
|
+
shouldResortToDefaultValueIfUndefined: true,
|
|
1604
|
+
})) !== null && _g !== void 0 ? _g : 1)
|
|
1605
|
+
: '1',
|
|
1606
|
+
schema: controls.schema,
|
|
1607
|
+
sourceFrame: transformOriginSourceFrame,
|
|
1608
|
+
translateDefault: fieldSchema.default,
|
|
1609
|
+
translatePropStatus: propStatus,
|
|
1610
|
+
translateValue: String((_j = remotion_1.Internals.getEffectiveVisualModeValue({
|
|
1611
|
+
propStatus,
|
|
1612
|
+
dragOverrideValue: ((_h = getDragOverrides(nodePath)) !== null && _h !== void 0 ? _h : {})[translateFieldKey],
|
|
1613
|
+
defaultValue: fieldSchema.default,
|
|
1614
|
+
frame: transformOriginSourceFrame,
|
|
1615
|
+
shouldResortToDefaultValueIfUndefined: true,
|
|
1616
|
+
})) !== null && _j !== void 0 ? _j : fieldSchema.default),
|
|
1617
|
+
}
|
|
1618
|
+
: null,
|
|
1175
1619
|
uvHandles: containsSelection
|
|
1176
|
-
? getSelectedUvHandles({
|
|
1620
|
+
? (0, selected_outline_uv_1.getSelectedUvHandles)({
|
|
1177
1621
|
propStatuses,
|
|
1178
1622
|
clientId,
|
|
1179
1623
|
getEffectDragOverrides,
|
|
1180
1624
|
nodePath,
|
|
1181
1625
|
selectedEffects: selectedEffectsBySequenceKey.get(key),
|
|
1182
1626
|
sequence,
|
|
1627
|
+
sourceFrame: timelinePosition - keyframeDisplayOffset,
|
|
1183
1628
|
})
|
|
1184
1629
|
: [],
|
|
1185
1630
|
};
|
|
@@ -1194,6 +1639,7 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1194
1639
|
previewServerState,
|
|
1195
1640
|
selectedItems,
|
|
1196
1641
|
sequences,
|
|
1642
|
+
timelinePosition,
|
|
1197
1643
|
]);
|
|
1198
1644
|
(0, react_1.useEffect)(() => {
|
|
1199
1645
|
if (hoveredOutlineKey !== null &&
|
|
@@ -1210,6 +1656,11 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1210
1656
|
const allScaleDragTargets = (0, react_1.useMemo)(() => {
|
|
1211
1657
|
return outlineTargets.flatMap((target) => target.selected && target.scaleDrag !== null ? [target.scaleDrag] : []);
|
|
1212
1658
|
}, [outlineTargets]);
|
|
1659
|
+
const allRotationDragTargets = (0, react_1.useMemo)(() => {
|
|
1660
|
+
return outlineTargets.flatMap((target) => target.selected && target.rotationDrag !== null
|
|
1661
|
+
? [target.rotationDrag]
|
|
1662
|
+
: []);
|
|
1663
|
+
}, [outlineTargets]);
|
|
1213
1664
|
(0, react_1.useEffect)(() => {
|
|
1214
1665
|
if (outlineTargets.length === 0) {
|
|
1215
1666
|
setOutlines((prevOutlines) => prevOutlines.length === 0 ? prevOutlines : []);
|
|
@@ -1235,6 +1686,6 @@ const SelectedOutlineOverlay = ({ scale }) => {
|
|
|
1235
1686
|
if (outlineTargets.length === 0) {
|
|
1236
1687
|
return null;
|
|
1237
1688
|
}
|
|
1238
|
-
return (jsx_runtime_1.jsxs("svg", { ref: overlayRef, style: outlineContainer, width: "100%", height: "100%", "aria-hidden": "true", children: [outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement, { allDragTargets: allDragTargets, allScaleDragTargets: allScaleDragTargets, dragging: draggingOutline, hovered: hoveredOutlineKey === outline.key, outline: outline, onDraggingChange: onDraggingChange, onHoverChange: setHoveredOutlineKey, onSelect: selectItem, scale: scale, target: targetsByKey.get(outline.key) }, outline.key))), outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvHandleConnectionLayer, { outline: outline, target: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, outline: outline, target: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`)))] }));
|
|
1689
|
+
return (jsx_runtime_1.jsxs("svg", { ref: overlayRef, style: outlineContainer, width: "100%", height: "100%", "aria-hidden": "true", children: [outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineElement, { allDragTargets: allDragTargets, allRotationDragTargets: allRotationDragTargets, allScaleDragTargets: allScaleDragTargets, dragging: draggingOutline, hovered: hoveredOutlineKey === outline.key, outline: outline, onDraggingChange: onDraggingChange, onHoverChange: setHoveredOutlineKey, onSelect: selectItem, scale: scale, target: targetsByKey.get(outline.key) }, outline.key))), outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleConnectionLayer, { outline: outline, target: targetsByKey.get(outline.key) }, `${outline.key}-uv-connection-lines`))), outlines.map((outline) => (jsx_runtime_1.jsx(SelectedOutlineUvControls_1.SelectedOutlineUvHandleCircleLayer, { onDraggingChange: onDraggingChange, outline: outline, target: targetsByKey.get(outline.key) }, `${outline.key}-uv-handles`)))] }));
|
|
1239
1690
|
};
|
|
1240
1691
|
exports.SelectedOutlineOverlay = SelectedOutlineOverlay;
|