@clipkit/editor 1.0.0
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/LICENSE +201 -0
- package/README.md +51 -0
- package/dist/Editor.d.ts +3 -0
- package/dist/Editor.d.ts.map +1 -0
- package/dist/Editor.js +73 -0
- package/dist/Editor.js.map +1 -0
- package/dist/ExportDialog.d.ts +12 -0
- package/dist/ExportDialog.d.ts.map +1 -0
- package/dist/ExportDialog.js +30 -0
- package/dist/ExportDialog.js.map +1 -0
- package/dist/MotionPathOverlay.d.ts +5 -0
- package/dist/MotionPathOverlay.d.ts.map +1 -0
- package/dist/MotionPathOverlay.js +156 -0
- package/dist/MotionPathOverlay.js.map +1 -0
- package/dist/PerfHud.d.ts +2 -0
- package/dist/PerfHud.d.ts.map +1 -0
- package/dist/PerfHud.js +85 -0
- package/dist/PerfHud.js.map +1 -0
- package/dist/Stage.d.ts +2 -0
- package/dist/Stage.d.ts.map +1 -0
- package/dist/Stage.js +406 -0
- package/dist/Stage.js.map +1 -0
- package/dist/StageOverlay.d.ts +7 -0
- package/dist/StageOverlay.d.ts.map +1 -0
- package/dist/StageOverlay.js +508 -0
- package/dist/StageOverlay.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +103 -0
- package/dist/commands.js.map +1 -0
- package/dist/configuration.d.ts +9 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +21 -0
- package/dist/configuration.js.map +1 -0
- package/dist/controls/AnimationsStack.d.ts +8 -0
- package/dist/controls/AnimationsStack.d.ts.map +1 -0
- package/dist/controls/AnimationsStack.js +188 -0
- package/dist/controls/AnimationsStack.js.map +1 -0
- package/dist/controls/CameraControl.d.ts +19 -0
- package/dist/controls/CameraControl.d.ts.map +1 -0
- package/dist/controls/CameraControl.js +47 -0
- package/dist/controls/CameraControl.js.map +1 -0
- package/dist/controls/CaptionLengthControl.d.ts +5 -0
- package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
- package/dist/controls/CaptionLengthControl.js +11 -0
- package/dist/controls/CaptionLengthControl.js.map +1 -0
- package/dist/controls/CaptionTranscribe.d.ts +2 -0
- package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
- package/dist/controls/CaptionTranscribe.js +95 -0
- package/dist/controls/CaptionTranscribe.js.map +1 -0
- package/dist/controls/ColorPicker.d.ts +17 -0
- package/dist/controls/ColorPicker.d.ts.map +1 -0
- package/dist/controls/ColorPicker.js +354 -0
- package/dist/controls/ColorPicker.js.map +1 -0
- package/dist/controls/ControlRenderer.d.ts +20 -0
- package/dist/controls/ControlRenderer.d.ts.map +1 -0
- package/dist/controls/ControlRenderer.js +106 -0
- package/dist/controls/ControlRenderer.js.map +1 -0
- package/dist/controls/CropControl.d.ts +2 -0
- package/dist/controls/CropControl.d.ts.map +1 -0
- package/dist/controls/CropControl.js +177 -0
- package/dist/controls/CropControl.js.map +1 -0
- package/dist/controls/EffectsStack.d.ts +8 -0
- package/dist/controls/EffectsStack.d.ts.map +1 -0
- package/dist/controls/EffectsStack.js +89 -0
- package/dist/controls/EffectsStack.js.map +1 -0
- package/dist/controls/GradeControl.d.ts +2 -0
- package/dist/controls/GradeControl.d.ts.map +1 -0
- package/dist/controls/GradeControl.js +120 -0
- package/dist/controls/GradeControl.js.map +1 -0
- package/dist/controls/KeyframeDiamond.d.ts +11 -0
- package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
- package/dist/controls/KeyframeDiamond.js +87 -0
- package/dist/controls/KeyframeDiamond.js.map +1 -0
- package/dist/controls/LightingControls.d.ts +24 -0
- package/dist/controls/LightingControls.d.ts.map +1 -0
- package/dist/controls/LightingControls.js +108 -0
- package/dist/controls/LightingControls.js.map +1 -0
- package/dist/controls/ShapePresetControl.d.ts +4 -0
- package/dist/controls/ShapePresetControl.d.ts.map +1 -0
- package/dist/controls/ShapePresetControl.js +30 -0
- package/dist/controls/ShapePresetControl.js.map +1 -0
- package/dist/controls/ValueField.d.ts +10 -0
- package/dist/controls/ValueField.d.ts.map +1 -0
- package/dist/controls/ValueField.js +158 -0
- package/dist/controls/ValueField.js.map +1 -0
- package/dist/controls/VolumeControl.d.ts +10 -0
- package/dist/controls/VolumeControl.d.ts.map +1 -0
- package/dist/controls/VolumeControl.js +75 -0
- package/dist/controls/VolumeControl.js.map +1 -0
- package/dist/controls/compound.d.ts +46 -0
- package/dist/controls/compound.d.ts.map +1 -0
- package/dist/controls/compound.js +160 -0
- package/dist/controls/compound.js.map +1 -0
- package/dist/controls/layout.d.ts +38 -0
- package/dist/controls/layout.d.ts.map +1 -0
- package/dist/controls/layout.js +162 -0
- package/dist/controls/layout.js.map +1 -0
- package/dist/controls/primitives.d.ts +83 -0
- package/dist/controls/primitives.d.ts.map +1 -0
- package/dist/controls/primitives.js +194 -0
- package/dist/controls/primitives.js.map +1 -0
- package/dist/controls/transcribe.worker.d.ts +2 -0
- package/dist/controls/transcribe.worker.d.ts.map +1 -0
- package/dist/controls/transcribe.worker.js +22 -0
- package/dist/controls/transcribe.worker.js.map +1 -0
- package/dist/frame/AddElementBar.d.ts +2 -0
- package/dist/frame/AddElementBar.d.ts.map +1 -0
- package/dist/frame/AddElementBar.js +103 -0
- package/dist/frame/AddElementBar.js.map +1 -0
- package/dist/frame/Breadcrumbs.d.ts +2 -0
- package/dist/frame/Breadcrumbs.d.ts.map +1 -0
- package/dist/frame/Breadcrumbs.js +32 -0
- package/dist/frame/Breadcrumbs.js.map +1 -0
- package/dist/frame/GroupFlash.d.ts +2 -0
- package/dist/frame/GroupFlash.d.ts.map +1 -0
- package/dist/frame/GroupFlash.js +65 -0
- package/dist/frame/GroupFlash.js.map +1 -0
- package/dist/frame/Resizable.d.ts +12 -0
- package/dist/frame/Resizable.d.ts.map +1 -0
- package/dist/frame/Resizable.js +37 -0
- package/dist/frame/Resizable.js.map +1 -0
- package/dist/frame/Section.d.ts +23 -0
- package/dist/frame/Section.d.ts.map +1 -0
- package/dist/frame/Section.js +23 -0
- package/dist/frame/Section.js.map +1 -0
- package/dist/frame/ZoomControl.d.ts +9 -0
- package/dist/frame/ZoomControl.d.ts.map +1 -0
- package/dist/frame/ZoomControl.js +15 -0
- package/dist/frame/ZoomControl.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/camera-gizmo.d.ts +15 -0
- package/dist/lib/camera-gizmo.d.ts.map +1 -0
- package/dist/lib/camera-gizmo.js +57 -0
- package/dist/lib/camera-gizmo.js.map +1 -0
- package/dist/lib/camera-tool.d.ts +43 -0
- package/dist/lib/camera-tool.d.ts.map +1 -0
- package/dist/lib/camera-tool.js +80 -0
- package/dist/lib/camera-tool.js.map +1 -0
- package/dist/lib/caption-segments.d.ts +17 -0
- package/dist/lib/caption-segments.d.ts.map +1 -0
- package/dist/lib/caption-segments.js +50 -0
- package/dist/lib/caption-segments.js.map +1 -0
- package/dist/lib/group.d.ts +12 -0
- package/dist/lib/group.d.ts.map +1 -0
- package/dist/lib/group.js +61 -0
- package/dist/lib/group.js.map +1 -0
- package/dist/lib/keyframes.d.ts +29 -0
- package/dist/lib/keyframes.d.ts.map +1 -0
- package/dist/lib/keyframes.js +92 -0
- package/dist/lib/keyframes.js.map +1 -0
- package/dist/lib/sfx-preview.d.ts +18 -0
- package/dist/lib/sfx-preview.d.ts.map +1 -0
- package/dist/lib/sfx-preview.js +74 -0
- package/dist/lib/sfx-preview.js.map +1 -0
- package/dist/lib/shape-presets.d.ts +35 -0
- package/dist/lib/shape-presets.d.ts.map +1 -0
- package/dist/lib/shape-presets.js +81 -0
- package/dist/lib/shape-presets.js.map +1 -0
- package/dist/lib/ungroup.d.ts +12 -0
- package/dist/lib/ungroup.d.ts.map +1 -0
- package/dist/lib/ungroup.js +40 -0
- package/dist/lib/ungroup.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/panels/AssetsPanel.d.ts +2 -0
- package/dist/panels/AssetsPanel.d.ts.map +1 -0
- package/dist/panels/AssetsPanel.js +108 -0
- package/dist/panels/AssetsPanel.js.map +1 -0
- package/dist/panels/InspectorPanel.d.ts +2 -0
- package/dist/panels/InspectorPanel.d.ts.map +1 -0
- package/dist/panels/InspectorPanel.js +286 -0
- package/dist/panels/InspectorPanel.js.map +1 -0
- package/dist/panels/InterpolationPanel.d.ts +2 -0
- package/dist/panels/InterpolationPanel.d.ts.map +1 -0
- package/dist/panels/InterpolationPanel.js +226 -0
- package/dist/panels/InterpolationPanel.js.map +1 -0
- package/dist/panels/LayersTree.d.ts +4 -0
- package/dist/panels/LayersTree.d.ts.map +1 -0
- package/dist/panels/LayersTree.js +137 -0
- package/dist/panels/LayersTree.js.map +1 -0
- package/dist/panels/LeftRail.d.ts +6 -0
- package/dist/panels/LeftRail.d.ts.map +1 -0
- package/dist/panels/LeftRail.js +35 -0
- package/dist/panels/LeftRail.js.map +1 -0
- package/dist/panels/SourcePanel.d.ts +2 -0
- package/dist/panels/SourcePanel.d.ts.map +1 -0
- package/dist/panels/SourcePanel.js +470 -0
- package/dist/panels/SourcePanel.js.map +1 -0
- package/dist/panels/TimelinePanel.d.ts +11 -0
- package/dist/panels/TimelinePanel.d.ts.map +1 -0
- package/dist/panels/TimelinePanel.js +98 -0
- package/dist/panels/TimelinePanel.js.map +1 -0
- package/dist/panels/assets/SfxBrowser.d.ts +2 -0
- package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
- package/dist/panels/assets/SfxBrowser.js +49 -0
- package/dist/panels/assets/SfxBrowser.js.map +1 -0
- package/dist/panels/assets/use-assets.d.ts +11 -0
- package/dist/panels/assets/use-assets.d.ts.map +1 -0
- package/dist/panels/assets/use-assets.js +84 -0
- package/dist/panels/assets/use-assets.js.map +1 -0
- package/dist/panels/assets/use-sfx.d.ts +6 -0
- package/dist/panels/assets/use-sfx.d.ts.map +1 -0
- package/dist/panels/assets/use-sfx.js +47 -0
- package/dist/panels/assets/use-sfx.js.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.js +1536 -0
- package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
- package/dist/panels/timeline/Clip.d.ts +37 -0
- package/dist/panels/timeline/Clip.d.ts.map +1 -0
- package/dist/panels/timeline/Clip.js +176 -0
- package/dist/panels/timeline/Clip.js.map +1 -0
- package/dist/panels/timeline/CurveEditor.d.ts +2 -0
- package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
- package/dist/panels/timeline/CurveEditor.js +233 -0
- package/dist/panels/timeline/CurveEditor.js.map +1 -0
- package/dist/panels/timeline/MixerRail.d.ts +7 -0
- package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
- package/dist/panels/timeline/MixerRail.js +295 -0
- package/dist/panels/timeline/MixerRail.js.map +1 -0
- package/dist/panels/timeline/Waveform.d.ts +11 -0
- package/dist/panels/timeline/Waveform.d.ts.map +1 -0
- package/dist/panels/timeline/Waveform.js +63 -0
- package/dist/panels/timeline/Waveform.js.map +1 -0
- package/dist/panels/timeline/clip-style.d.ts +10 -0
- package/dist/panels/timeline/clip-style.d.ts.map +1 -0
- package/dist/panels/timeline/clip-style.js +20 -0
- package/dist/panels/timeline/clip-style.js.map +1 -0
- package/dist/panels/timeline/filmstrip.d.ts +7 -0
- package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
- package/dist/panels/timeline/filmstrip.js +135 -0
- package/dist/panels/timeline/filmstrip.js.map +1 -0
- package/dist/panels/timeline/timeline-layout.d.ts +65 -0
- package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
- package/dist/panels/timeline/timeline-layout.js +118 -0
- package/dist/panels/timeline/timeline-layout.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
- package/src/styles.css +185 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
// Stage overlay — sits inside the Stage viewport on top of the canvas.
|
|
3
|
+
// Draws the selection bounding box, resize handles (for single
|
|
4
|
+
// selection), and captures pointer events to move + resize selected
|
|
5
|
+
// elements. The renderer never knows the user is editing — this
|
|
6
|
+
// overlay computes new transform fields in source space and dispatches
|
|
7
|
+
// `moveElements` patches. Same data direction as everything else.
|
|
8
|
+
//
|
|
9
|
+
// Drag modes (discriminated):
|
|
10
|
+
// - 'move' — drag the box body, translate all selected by a delta
|
|
11
|
+
// - 'resize' — drag a corner / edge handle, change width/height/x/y
|
|
12
|
+
// of a single element with the opposite edge fixed
|
|
13
|
+
//
|
|
14
|
+
// Single-element-only resize for now; multi-select still moves as a
|
|
15
|
+
// group. Rotated hit-testing + rotation handles are follow-up phases.
|
|
16
|
+
import { useEffect, useMemo, useRef, useState, } from 'react';
|
|
17
|
+
import { useEditor } from '@clipkit/editor-core';
|
|
18
|
+
import { useEditorContext } from '@clipkit/editor-core';
|
|
19
|
+
import { useEditorStore } from '@clipkit/editor-core';
|
|
20
|
+
import { angleFromAnchor, computeResize, computeRotation, elementRotation, elementSourceBox, hitTest, resolveGroupPath, parseAnchor, screenToSource, HANDLE_CURSOR, HANDLE_POSITION, RESIZE_HANDLES, } from '@clipkit/editor-core';
|
|
21
|
+
import { cameraGizmosActive, cameraHitTest, projectElementQuad, unprojectToPlane, elementDepthZ, } from './lib/camera-gizmo.js';
|
|
22
|
+
import { evalExpr } from '@clipkit/runtime';
|
|
23
|
+
export function StageOverlay({ viewportRef }) {
|
|
24
|
+
// Note on playback.time: NOT subscribed. The hover hit-test reads
|
|
25
|
+
// the latest value via store.getState() in the mousemove handler;
|
|
26
|
+
// subscribing would re-render this component ~10×/sec during
|
|
27
|
+
// playback for no visual benefit (the overlay returns null while
|
|
28
|
+
// playing anyway).
|
|
29
|
+
const { store } = useEditorContext();
|
|
30
|
+
const source = useEditorStore((s) => s.source);
|
|
31
|
+
const selection = useEditorStore((s) => s.selection);
|
|
32
|
+
const groupPath = useEditorStore((s) => s.ui.groupPath);
|
|
33
|
+
const _scope = resolveGroupPath(source.elements, groupPath);
|
|
34
|
+
const scopedElements = _scope.elements;
|
|
35
|
+
const groupOffset = _scope.timeOffset;
|
|
36
|
+
const groupPos = _scope.offset;
|
|
37
|
+
const zoom = useEditorStore((s) => s.ui.stageZoom);
|
|
38
|
+
const tool = useEditorStore((s) => s.ui.tool);
|
|
39
|
+
// Hand tool: disable the overlay's interactive hit-targets so a drag falls
|
|
40
|
+
// through to the Stage and pans (over elements too), instead of moving them.
|
|
41
|
+
const pe = tool === 'hand' ? 'pointer-events-none' : 'pointer-events-auto';
|
|
42
|
+
const pan = useEditorStore((s) => s.ui.stagePan);
|
|
43
|
+
const stageView = useEditorStore((s) => s.ui.stageView);
|
|
44
|
+
const cameraActive = cameraGizmosActive(source, stageView);
|
|
45
|
+
// Camera gizmos depend on the playhead (keyframed camera / animated
|
|
46
|
+
// element). Subscribed only so a paused scrub re-projects; the overlay
|
|
47
|
+
// early-returns null while playing, so playback churn is a no-op render.
|
|
48
|
+
const playheadTime = useEditorStore((s) => s.playback.time);
|
|
49
|
+
const playbackDuration = useEditorStore((s) => s.playback.duration);
|
|
50
|
+
// During playback the overlay goes inert — no hover, no boxes, no
|
|
51
|
+
// hit-testing — so React isn't spending main-thread time on stuff
|
|
52
|
+
// the user can't interact with anyway, and the presenter loop's
|
|
53
|
+
// drawImage stays unblocked.
|
|
54
|
+
const playing = useEditorStore((s) => s.playback.playing);
|
|
55
|
+
const { moveElements, pushHistory, setInteractive, flushPendingSource, selectOne, } = useEditor();
|
|
56
|
+
const dragRef = useRef(null);
|
|
57
|
+
const [dragging, setDragging] = useState(false);
|
|
58
|
+
const [hoveredId, setHoveredId] = useState(null);
|
|
59
|
+
// ── Selected element boxes — read directly from source ────────────
|
|
60
|
+
const selectedBoxes = useMemo(() => {
|
|
61
|
+
if (selection.length === 0)
|
|
62
|
+
return [];
|
|
63
|
+
const out = [];
|
|
64
|
+
for (const el of scopedElements) {
|
|
65
|
+
if (!el.id || !selection.includes(el.id))
|
|
66
|
+
continue;
|
|
67
|
+
const box = elementSourceBox(el, source, { time: playheadTime - groupOffset, evalExpr });
|
|
68
|
+
if (!box)
|
|
69
|
+
continue;
|
|
70
|
+
out.push({
|
|
71
|
+
el,
|
|
72
|
+
sx: box.x + groupPos.x,
|
|
73
|
+
sy: box.y + groupPos.y,
|
|
74
|
+
sw: box.w,
|
|
75
|
+
sh: box.h,
|
|
76
|
+
rotation: elementRotation(el),
|
|
77
|
+
// Rotation pivots the box CENTRE (the runtime rotates around the
|
|
78
|
+
// geometric centre regardless of anchor) — drives transformOrigin.
|
|
79
|
+
xAnchor: 0.5,
|
|
80
|
+
yAnchor: 0.5,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}, [source, selection, playheadTime, groupPath]);
|
|
85
|
+
// ── Drag starters ────────────────────────────────────────────────
|
|
86
|
+
const beginDrag = (ctx) => {
|
|
87
|
+
dragRef.current = ctx;
|
|
88
|
+
setDragging(true);
|
|
89
|
+
pushHistory();
|
|
90
|
+
setInteractive(true);
|
|
91
|
+
};
|
|
92
|
+
const startMoveDrag = (e, target) => {
|
|
93
|
+
if (e.button !== 0)
|
|
94
|
+
return;
|
|
95
|
+
if (!target.id)
|
|
96
|
+
return;
|
|
97
|
+
const viewport = viewportRef.current;
|
|
98
|
+
if (!viewport)
|
|
99
|
+
return;
|
|
100
|
+
e.stopPropagation();
|
|
101
|
+
e.preventDefault();
|
|
102
|
+
const ids = selection.includes(target.id) ? selection : [target.id];
|
|
103
|
+
const initial = new Map();
|
|
104
|
+
for (const id of ids) {
|
|
105
|
+
const el = findById(source.elements, id);
|
|
106
|
+
if (!el)
|
|
107
|
+
continue;
|
|
108
|
+
const sw = source.width ?? 1920;
|
|
109
|
+
const sh = source.height ?? 1080;
|
|
110
|
+
initial.set(id, {
|
|
111
|
+
x: typeof el.x === 'number' ? el.x : sw / 2,
|
|
112
|
+
y: typeof el.y === 'number' ? el.y : sh / 2,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
let cameraCtx;
|
|
116
|
+
if (cameraActive) {
|
|
117
|
+
const rect = viewport.getBoundingClientRect();
|
|
118
|
+
const time = store.getState().playback.time;
|
|
119
|
+
const planeZ = new Map();
|
|
120
|
+
for (const id of ids) {
|
|
121
|
+
const el = findById(source.elements, id);
|
|
122
|
+
if (el)
|
|
123
|
+
planeZ.set(id, elementDepthZ(source, el, time));
|
|
124
|
+
}
|
|
125
|
+
cameraCtx = { time, rectLeft: rect.left, rectTop: rect.top, panX: pan.x, panY: pan.y, planeZ };
|
|
126
|
+
}
|
|
127
|
+
beginDrag({
|
|
128
|
+
type: 'move',
|
|
129
|
+
ids,
|
|
130
|
+
initial,
|
|
131
|
+
startClientX: e.clientX,
|
|
132
|
+
startClientY: e.clientY,
|
|
133
|
+
zoom: zoom || 1,
|
|
134
|
+
camera: cameraCtx,
|
|
135
|
+
});
|
|
136
|
+
};
|
|
137
|
+
const startRotateDrag = (e, target) => {
|
|
138
|
+
if (e.button !== 0)
|
|
139
|
+
return;
|
|
140
|
+
if (!target.id)
|
|
141
|
+
return;
|
|
142
|
+
const viewport = viewportRef.current;
|
|
143
|
+
if (!viewport)
|
|
144
|
+
return;
|
|
145
|
+
e.stopPropagation();
|
|
146
|
+
e.preventDefault();
|
|
147
|
+
const rect = viewport.getBoundingClientRect();
|
|
148
|
+
const cursorX = (e.clientX - rect.left - pan.x) / zoom;
|
|
149
|
+
const cursorY = (e.clientY - rect.top - pan.y) / zoom;
|
|
150
|
+
const sw = source.width ?? 1920;
|
|
151
|
+
const sh = source.height ?? 1080;
|
|
152
|
+
const anchorX = typeof target.x === 'number' ? target.x : sw / 2;
|
|
153
|
+
const anchorY = typeof target.y === 'number' ? target.y : sh / 2;
|
|
154
|
+
const initialRotation = elementRotation(target);
|
|
155
|
+
const initialCursorAngle = angleFromAnchor(anchorX, anchorY, cursorX, cursorY);
|
|
156
|
+
beginDrag({
|
|
157
|
+
type: 'rotate',
|
|
158
|
+
id: target.id,
|
|
159
|
+
anchorX,
|
|
160
|
+
anchorY,
|
|
161
|
+
initialRotation,
|
|
162
|
+
initialCursorAngle,
|
|
163
|
+
startCursorSourceX: cursorX,
|
|
164
|
+
startCursorSourceY: cursorY,
|
|
165
|
+
startClientX: e.clientX,
|
|
166
|
+
startClientY: e.clientY,
|
|
167
|
+
zoom: zoom || 1,
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
const startResizeDrag = (e, target, handle) => {
|
|
171
|
+
if (e.button !== 0)
|
|
172
|
+
return;
|
|
173
|
+
if (!target.id)
|
|
174
|
+
return;
|
|
175
|
+
if (typeof target.width !== 'number' || typeof target.height !== 'number') {
|
|
176
|
+
// Element doesn't have explicit numeric dims; can't resize via
|
|
177
|
+
// bounding box. Skip silently.
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const viewport = viewportRef.current;
|
|
181
|
+
if (!viewport)
|
|
182
|
+
return;
|
|
183
|
+
e.stopPropagation();
|
|
184
|
+
e.preventDefault();
|
|
185
|
+
const rect = viewport.getBoundingClientRect();
|
|
186
|
+
const startCursorSourceX = (e.clientX - rect.left - pan.x) / zoom;
|
|
187
|
+
const startCursorSourceY = (e.clientY - rect.top - pan.y) / zoom;
|
|
188
|
+
const sw = source.width ?? 1920;
|
|
189
|
+
const sh = source.height ?? 1080;
|
|
190
|
+
const init = {
|
|
191
|
+
x: typeof target.x === 'number' ? target.x : sw / 2,
|
|
192
|
+
y: typeof target.y === 'number' ? target.y : sh / 2,
|
|
193
|
+
width: target.width,
|
|
194
|
+
height: target.height,
|
|
195
|
+
xAnchor: parseAnchor(target.x_anchor),
|
|
196
|
+
yAnchor: parseAnchor(target.y_anchor),
|
|
197
|
+
};
|
|
198
|
+
beginDrag({
|
|
199
|
+
type: 'resize',
|
|
200
|
+
id: target.id,
|
|
201
|
+
handle,
|
|
202
|
+
init,
|
|
203
|
+
startCursorSourceX,
|
|
204
|
+
startCursorSourceY,
|
|
205
|
+
startClientX: e.clientX,
|
|
206
|
+
startClientY: e.clientY,
|
|
207
|
+
zoom: zoom || 1,
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
// ── Hover tracking ───────────────────────────────────────────────
|
|
211
|
+
// Listen for mousemove on the viewport, hit-test, surface a hovered
|
|
212
|
+
// id. The hover ghost box renders below — pointer-events: none, so
|
|
213
|
+
// it never interferes with click-to-select or the selection handles.
|
|
214
|
+
// Suppressed while dragging (otherwise the box flickers under your
|
|
215
|
+
// cursor mid-drag).
|
|
216
|
+
useEffect(() => {
|
|
217
|
+
const viewport = viewportRef.current;
|
|
218
|
+
if (!viewport)
|
|
219
|
+
return;
|
|
220
|
+
if (dragging || playing) {
|
|
221
|
+
// Drop any stale hover so it doesn't flash back when the drag
|
|
222
|
+
// ends or playback stops over a different element.
|
|
223
|
+
if (hoveredId !== null)
|
|
224
|
+
setHoveredId(null);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const onMove = (ev) => {
|
|
228
|
+
const rect = viewport.getBoundingClientRect();
|
|
229
|
+
const dur = playbackDuration > 0 ? playbackDuration : 1e9;
|
|
230
|
+
// Read the playhead lazily — no subscription, no re-render
|
|
231
|
+
// churn on time updates.
|
|
232
|
+
const t = store.getState().playback.time;
|
|
233
|
+
let hit;
|
|
234
|
+
if (cameraActive) {
|
|
235
|
+
const cpt = {
|
|
236
|
+
x: (ev.clientX - rect.left - pan.x) / (zoom || 1),
|
|
237
|
+
y: (ev.clientY - rect.top - pan.y) / (zoom || 1),
|
|
238
|
+
};
|
|
239
|
+
hit = cameraHitTest(source, cpt, t, dur);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
const pt = screenToSource(ev.clientX, ev.clientY, rect, zoom, pan);
|
|
243
|
+
hit = hitTest(scopedElements, source, { x: pt.x - groupPos.x, y: pt.y - groupPos.y }, t - groupOffset, dur);
|
|
244
|
+
}
|
|
245
|
+
const nextId = hit?.id ?? null;
|
|
246
|
+
setHoveredId((prev) => (prev === nextId ? prev : nextId));
|
|
247
|
+
};
|
|
248
|
+
const onLeave = () => setHoveredId(null);
|
|
249
|
+
viewport.addEventListener('mousemove', onMove);
|
|
250
|
+
viewport.addEventListener('mouseleave', onLeave);
|
|
251
|
+
return () => {
|
|
252
|
+
viewport.removeEventListener('mousemove', onMove);
|
|
253
|
+
viewport.removeEventListener('mouseleave', onLeave);
|
|
254
|
+
};
|
|
255
|
+
}, [
|
|
256
|
+
viewportRef,
|
|
257
|
+
playing,
|
|
258
|
+
dragging,
|
|
259
|
+
hoveredId,
|
|
260
|
+
source,
|
|
261
|
+
zoom,
|
|
262
|
+
pan,
|
|
263
|
+
cameraActive,
|
|
264
|
+
playbackDuration,
|
|
265
|
+
store,
|
|
266
|
+
groupPath,
|
|
267
|
+
]);
|
|
268
|
+
// ── Live drag dispatches ─────────────────────────────────────────
|
|
269
|
+
// Per-frame math is pure delta in client space → source space via
|
|
270
|
+
// the zoom captured at drag-start. We deliberately don't touch the
|
|
271
|
+
// viewport rect, pan, or live store zoom here — that keeps drags
|
|
272
|
+
// immune to layout changes (Panel sliding in on select) and to mid-
|
|
273
|
+
// drag wheel-zooms.
|
|
274
|
+
useEffect(() => {
|
|
275
|
+
if (!dragging)
|
|
276
|
+
return;
|
|
277
|
+
const dispatchUpdate = (ev) => {
|
|
278
|
+
const ctx = dragRef.current;
|
|
279
|
+
if (!ctx)
|
|
280
|
+
return;
|
|
281
|
+
const dSourceX = (ev.clientX - ctx.startClientX) / ctx.zoom;
|
|
282
|
+
const dSourceY = (ev.clientY - ctx.startClientY) / ctx.zoom;
|
|
283
|
+
if (ctx.type === 'move') {
|
|
284
|
+
const updates = [];
|
|
285
|
+
const cam = ctx.camera;
|
|
286
|
+
for (const [id, init] of ctx.initial) {
|
|
287
|
+
let dx = dSourceX;
|
|
288
|
+
let dy = dSourceY;
|
|
289
|
+
if (cam) {
|
|
290
|
+
// Camera view: unproject the start and current pointer onto
|
|
291
|
+
// the element's own depth plane, so the drag tracks the
|
|
292
|
+
// cursor through the perspective.
|
|
293
|
+
const z = cam.planeZ.get(id) ?? 0;
|
|
294
|
+
const toCanvas = (cx, cy) => ({
|
|
295
|
+
x: (cx - cam.rectLeft - cam.panX) / ctx.zoom,
|
|
296
|
+
y: (cy - cam.rectTop - cam.panY) / ctx.zoom,
|
|
297
|
+
});
|
|
298
|
+
const wStart = unprojectToPlane(source, cam.time, toCanvas(ctx.startClientX, ctx.startClientY), z);
|
|
299
|
+
const wNow = unprojectToPlane(source, cam.time, toCanvas(ev.clientX, ev.clientY), z);
|
|
300
|
+
if (wStart && wNow) {
|
|
301
|
+
dx = wNow.x - wStart.x;
|
|
302
|
+
dy = wNow.y - wStart.y;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
updates.push({
|
|
306
|
+
id,
|
|
307
|
+
patch: { x: init.x + dx, y: init.y + dy },
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
moveElements(updates, { skipHistory: true });
|
|
311
|
+
}
|
|
312
|
+
else if (ctx.type === 'resize') {
|
|
313
|
+
const cursorX = ctx.startCursorSourceX + dSourceX;
|
|
314
|
+
const cursorY = ctx.startCursorSourceY + dSourceY;
|
|
315
|
+
const result = computeResize(ctx.init, ctx.handle, cursorX, cursorY, ev.shiftKey);
|
|
316
|
+
moveElements([{ id: ctx.id, patch: result }], { skipHistory: true });
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
// rotate
|
|
320
|
+
const cursorX = ctx.startCursorSourceX + dSourceX;
|
|
321
|
+
const cursorY = ctx.startCursorSourceY + dSourceY;
|
|
322
|
+
const cursorAngle = angleFromAnchor(ctx.anchorX, ctx.anchorY, cursorX, cursorY);
|
|
323
|
+
const newRotation = computeRotation(ctx.initialRotation, ctx.initialCursorAngle, cursorAngle, ev.shiftKey);
|
|
324
|
+
moveElements([{ id: ctx.id, patch: { rotation: newRotation } }], { skipHistory: true });
|
|
325
|
+
}
|
|
326
|
+
};
|
|
327
|
+
const onMove = (ev) => {
|
|
328
|
+
dispatchUpdate(ev);
|
|
329
|
+
};
|
|
330
|
+
const onUp = (ev) => {
|
|
331
|
+
// Final dispatch with mouseup coords — closes the ~16ms gap
|
|
332
|
+
// between the last mousemove sample and the actual release point.
|
|
333
|
+
dispatchUpdate(ev);
|
|
334
|
+
flushPendingSource();
|
|
335
|
+
dragRef.current = null;
|
|
336
|
+
setDragging(false);
|
|
337
|
+
setInteractive(false);
|
|
338
|
+
};
|
|
339
|
+
window.addEventListener('mousemove', onMove);
|
|
340
|
+
window.addEventListener('mouseup', onUp);
|
|
341
|
+
return () => {
|
|
342
|
+
window.removeEventListener('mousemove', onMove);
|
|
343
|
+
window.removeEventListener('mouseup', onUp);
|
|
344
|
+
};
|
|
345
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
346
|
+
}, [dragging]);
|
|
347
|
+
// Single-selection shows resize handles. Multi-select just shows
|
|
348
|
+
// bounding boxes for moveable group context.
|
|
349
|
+
const showHandles = selection.length === 1;
|
|
350
|
+
// Hover ghost — only shown when the hovered element isn't already
|
|
351
|
+
// selected (the selection box subsumes it).
|
|
352
|
+
const hoveredBox = useMemo(() => {
|
|
353
|
+
if (!hoveredId)
|
|
354
|
+
return null;
|
|
355
|
+
if (selection.includes(hoveredId))
|
|
356
|
+
return null;
|
|
357
|
+
const el = scopedElements.find((e) => e.id === hoveredId);
|
|
358
|
+
if (!el)
|
|
359
|
+
return null;
|
|
360
|
+
const box = elementSourceBox(el, source, { time: playheadTime - groupOffset, evalExpr });
|
|
361
|
+
if (!box)
|
|
362
|
+
return null;
|
|
363
|
+
return {
|
|
364
|
+
el,
|
|
365
|
+
sx: box.x + groupPos.x,
|
|
366
|
+
sy: box.y + groupPos.y,
|
|
367
|
+
sw: box.w,
|
|
368
|
+
sh: box.h,
|
|
369
|
+
rotation: elementRotation(el),
|
|
370
|
+
// Rotation pivots the box CENTRE (see selectedBoxes) — for transformOrigin.
|
|
371
|
+
xAnchor: 0.5,
|
|
372
|
+
yAnchor: 0.5,
|
|
373
|
+
};
|
|
374
|
+
}, [hoveredId, selection, source, playheadTime, groupPath]);
|
|
375
|
+
// While playing, render nothing. The Stage's onMouseDown still
|
|
376
|
+
// handles clicks (and will pause the playback), but there's no
|
|
377
|
+
// hover ghost, no selection frame, no handles — keeps the canvas
|
|
378
|
+
// clean during preview and frees the main thread from per-mousemove
|
|
379
|
+
// hit-testing and per-time-tick box re-positioning.
|
|
380
|
+
if (playing)
|
|
381
|
+
return null;
|
|
382
|
+
// Camera view: gizmos are SVG polygons through the element's PROJECTED
|
|
383
|
+
// corners (move + select only; resize/rotate stay a Flat-view op).
|
|
384
|
+
if (cameraActive) {
|
|
385
|
+
const toScreen = (el) => {
|
|
386
|
+
const q = projectElementQuad(source, el, playheadTime);
|
|
387
|
+
if (!q)
|
|
388
|
+
return null;
|
|
389
|
+
return q.map((p) => ({ x: pan.x + p.x * zoom, y: pan.y + p.y * zoom }));
|
|
390
|
+
};
|
|
391
|
+
const pts = (q) => q.map((p) => `${p.x},${p.y}`).join(' ');
|
|
392
|
+
const hoverEl = hoveredId && !selection.includes(hoveredId)
|
|
393
|
+
? scopedElements.find((e) => e.id === hoveredId) ?? null
|
|
394
|
+
: null;
|
|
395
|
+
const hoverQuad = hoverEl ? toScreen(hoverEl) : null;
|
|
396
|
+
return (_jsxs("svg", { className: "absolute inset-0 pointer-events-none", style: { width: '100%', height: '100%', overflow: 'visible' }, children: [hoverQuad && hoverEl && (_jsx("polygon", { points: pts(hoverQuad), className: pe, style: { fill: 'transparent', stroke: 'var(--color-accent, #3b82f6)', strokeWidth: 1.5, cursor: 'move' }, onMouseDown: (e) => {
|
|
397
|
+
if (e.button !== 0 || !hoverEl.id)
|
|
398
|
+
return;
|
|
399
|
+
selectOne(hoverEl.id);
|
|
400
|
+
startMoveDrag(e, hoverEl);
|
|
401
|
+
} })), selectedBoxes.map(({ el }) => {
|
|
402
|
+
const q = toScreen(el);
|
|
403
|
+
if (!q)
|
|
404
|
+
return null;
|
|
405
|
+
return (_jsxs("g", { children: [_jsx("polygon", { points: pts(q), className: pe, style: { fill: 'transparent', stroke: 'var(--color-foreground)', strokeWidth: 1.5, cursor: dragging ? 'grabbing' : 'move' }, onMouseDown: (e) => startMoveDrag(e, el) }), q.map((p, i) => (_jsx("rect", { x: p.x - 4, y: p.y - 4, width: 8, height: 8, style: { fill: 'var(--color-background)', stroke: 'var(--color-foreground)', strokeWidth: 1.5 } }, i)))] }, el.id));
|
|
406
|
+
})] }));
|
|
407
|
+
}
|
|
408
|
+
return (_jsxs("div", { className: "absolute inset-0 pointer-events-none", children: [hoveredBox && (_jsx("div", { className: `absolute ${pe}`, style: {
|
|
409
|
+
left: pan.x + hoveredBox.sx * zoom,
|
|
410
|
+
top: pan.y + hoveredBox.sy * zoom,
|
|
411
|
+
width: hoveredBox.sw * zoom,
|
|
412
|
+
height: hoveredBox.sh * zoom,
|
|
413
|
+
transform: hoveredBox.rotation !== 0
|
|
414
|
+
? `rotate(${hoveredBox.rotation}deg)`
|
|
415
|
+
: undefined,
|
|
416
|
+
transformOrigin: `${hoveredBox.xAnchor * 100}% ${hoveredBox.yAnchor * 100}%`,
|
|
417
|
+
border: '1.5px solid var(--color-accent, #3b82f6)',
|
|
418
|
+
borderRadius: 1,
|
|
419
|
+
// Faint, no inset shadow — distinct from the selection box.
|
|
420
|
+
boxShadow: 'none',
|
|
421
|
+
cursor: 'move',
|
|
422
|
+
},
|
|
423
|
+
// Click on hover ghost: select + immediately start a move drag,
|
|
424
|
+
// so the user can click-and-drag in one motion (Figma-style).
|
|
425
|
+
// If they release without moving, it just selects.
|
|
426
|
+
onMouseDown: (e) => {
|
|
427
|
+
if (e.button !== 0)
|
|
428
|
+
return;
|
|
429
|
+
if (!hoveredBox.el.id)
|
|
430
|
+
return;
|
|
431
|
+
selectOne(hoveredBox.el.id);
|
|
432
|
+
startMoveDrag(e, hoveredBox.el);
|
|
433
|
+
} })), selectedBoxes.map(({ el, sx, sy, sw, sh, rotation, xAnchor, yAnchor }) => {
|
|
434
|
+
const screenX = pan.x + sx * zoom;
|
|
435
|
+
const screenY = pan.y + sy * zoom;
|
|
436
|
+
const screenW = sw * zoom;
|
|
437
|
+
const screenH = sh * zoom;
|
|
438
|
+
// Resize knobs need explicit numeric width/height — we patch
|
|
439
|
+
// those values, and string/percent/"auto" sizing doesn't have a
|
|
440
|
+
// sensible "drag the edge by N pixels" semantic. Rotation has
|
|
441
|
+
// no such dependency; it just toggles a number field.
|
|
442
|
+
const canResize = showHandles &&
|
|
443
|
+
typeof el.width === 'number' &&
|
|
444
|
+
typeof el.height === 'number';
|
|
445
|
+
const canRotate = showHandles;
|
|
446
|
+
return (_jsxs("div", { className: "absolute", style: {
|
|
447
|
+
left: screenX,
|
|
448
|
+
top: screenY,
|
|
449
|
+
width: screenW,
|
|
450
|
+
height: screenH,
|
|
451
|
+
// Rotate the wrapper around the box CENTRE so the overlay
|
|
452
|
+
// matches the render (the runtime pivots rotation at the
|
|
453
|
+
// geometric centre regardless of anchor).
|
|
454
|
+
transform: rotation !== 0 ? `rotate(${rotation}deg)` : undefined,
|
|
455
|
+
transformOrigin: `${xAnchor * 100}% ${yAnchor * 100}%`,
|
|
456
|
+
pointerEvents: 'none',
|
|
457
|
+
}, children: [_jsx("div", { className: `absolute inset-0 ${pe}`, style: {
|
|
458
|
+
cursor: dragging ? 'grabbing' : 'move',
|
|
459
|
+
border: '1.5px solid var(--color-foreground)',
|
|
460
|
+
boxShadow: '0 0 0 1px rgba(0,0,0,0.4) inset',
|
|
461
|
+
}, onMouseDown: (e) => startMoveDrag(e, el) }), canResize &&
|
|
462
|
+
RESIZE_HANDLES.map((h) => {
|
|
463
|
+
const pos = HANDLE_POSITION[h];
|
|
464
|
+
return (_jsx("div", { className: `absolute ${pe}`, style: {
|
|
465
|
+
left: pos.left,
|
|
466
|
+
top: pos.top,
|
|
467
|
+
width: 10,
|
|
468
|
+
height: 10,
|
|
469
|
+
transform: 'translate(-50%, -50%)',
|
|
470
|
+
background: 'var(--color-background)',
|
|
471
|
+
border: '1.5px solid var(--color-foreground)',
|
|
472
|
+
borderRadius: 2,
|
|
473
|
+
cursor: HANDLE_CURSOR[h],
|
|
474
|
+
}, onMouseDown: (e) => startResizeDrag(e, el, h) }, h));
|
|
475
|
+
}), canRotate && (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute pointer-events-none", style: {
|
|
476
|
+
left: '50%',
|
|
477
|
+
top: 0,
|
|
478
|
+
width: 1,
|
|
479
|
+
height: 16,
|
|
480
|
+
background: 'var(--color-foreground)',
|
|
481
|
+
transform: 'translate(-50%, -100%)',
|
|
482
|
+
} }), _jsx("div", { className: `absolute ${pe}`, style: {
|
|
483
|
+
left: '50%',
|
|
484
|
+
top: 0,
|
|
485
|
+
width: 12,
|
|
486
|
+
height: 12,
|
|
487
|
+
transform: 'translate(-50%, calc(-100% - 16px))',
|
|
488
|
+
background: 'var(--color-background)',
|
|
489
|
+
border: '1.5px solid var(--color-foreground)',
|
|
490
|
+
borderRadius: '50%',
|
|
491
|
+
cursor: 'grab',
|
|
492
|
+
}, onMouseDown: (e) => startRotateDrag(e, el), title: "Drag to rotate \u00B7 Shift for 15\u00B0 increments" })] }))] }, el.id));
|
|
493
|
+
})] }));
|
|
494
|
+
}
|
|
495
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
496
|
+
function findById(elements, id) {
|
|
497
|
+
for (const el of elements) {
|
|
498
|
+
if (el.id === id)
|
|
499
|
+
return el;
|
|
500
|
+
if (el.type === 'group') {
|
|
501
|
+
const nested = findById(el.elements, id);
|
|
502
|
+
if (nested)
|
|
503
|
+
return nested;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
return null;
|
|
507
|
+
}
|
|
508
|
+
//# sourceMappingURL=StageOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StageOverlay.js","sourceRoot":"","sources":["../src/StageOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PlaybackEngine } from '@clipkit/playback';
|
|
2
|
+
import type { EditorStore, UseEditorReturn } from '@clipkit/editor-core';
|
|
3
|
+
export interface CommandContext {
|
|
4
|
+
store: EditorStore;
|
|
5
|
+
engine: PlaybackEngine | null;
|
|
6
|
+
actions: UseEditorReturn;
|
|
7
|
+
}
|
|
8
|
+
export interface EditorCommand {
|
|
9
|
+
id: string;
|
|
10
|
+
title: string;
|
|
11
|
+
/** Display + match key, e.g. 'Space', 'ArrowLeft', 'Mod+Z', 'Shift+Mod+Z'. */
|
|
12
|
+
shortcut?: string;
|
|
13
|
+
run: (ctx: CommandContext) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const EDITOR_COMMANDS: readonly EditorCommand[];
|
|
16
|
+
/** Bind the command table to the window. One listener per editor. */
|
|
17
|
+
export declare function useKeyboardCommands(ctx: CommandContext): void;
|
|
18
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,IAAI,CAAC;CACpC;AAED,eAAO,MAAM,eAAe,EAAE,SAAS,aAAa,EAmDnD,CAAC;AA0BF,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAgB7D"}
|