@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.
Files changed (248) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +51 -0
  3. package/dist/Editor.d.ts +3 -0
  4. package/dist/Editor.d.ts.map +1 -0
  5. package/dist/Editor.js +73 -0
  6. package/dist/Editor.js.map +1 -0
  7. package/dist/ExportDialog.d.ts +12 -0
  8. package/dist/ExportDialog.d.ts.map +1 -0
  9. package/dist/ExportDialog.js +30 -0
  10. package/dist/ExportDialog.js.map +1 -0
  11. package/dist/MotionPathOverlay.d.ts +5 -0
  12. package/dist/MotionPathOverlay.d.ts.map +1 -0
  13. package/dist/MotionPathOverlay.js +156 -0
  14. package/dist/MotionPathOverlay.js.map +1 -0
  15. package/dist/PerfHud.d.ts +2 -0
  16. package/dist/PerfHud.d.ts.map +1 -0
  17. package/dist/PerfHud.js +85 -0
  18. package/dist/PerfHud.js.map +1 -0
  19. package/dist/Stage.d.ts +2 -0
  20. package/dist/Stage.d.ts.map +1 -0
  21. package/dist/Stage.js +406 -0
  22. package/dist/Stage.js.map +1 -0
  23. package/dist/StageOverlay.d.ts +7 -0
  24. package/dist/StageOverlay.d.ts.map +1 -0
  25. package/dist/StageOverlay.js +508 -0
  26. package/dist/StageOverlay.js.map +1 -0
  27. package/dist/commands.d.ts +18 -0
  28. package/dist/commands.d.ts.map +1 -0
  29. package/dist/commands.js +103 -0
  30. package/dist/commands.js.map +1 -0
  31. package/dist/configuration.d.ts +9 -0
  32. package/dist/configuration.d.ts.map +1 -0
  33. package/dist/configuration.js +21 -0
  34. package/dist/configuration.js.map +1 -0
  35. package/dist/controls/AnimationsStack.d.ts +8 -0
  36. package/dist/controls/AnimationsStack.d.ts.map +1 -0
  37. package/dist/controls/AnimationsStack.js +188 -0
  38. package/dist/controls/AnimationsStack.js.map +1 -0
  39. package/dist/controls/CameraControl.d.ts +19 -0
  40. package/dist/controls/CameraControl.d.ts.map +1 -0
  41. package/dist/controls/CameraControl.js +47 -0
  42. package/dist/controls/CameraControl.js.map +1 -0
  43. package/dist/controls/CaptionLengthControl.d.ts +5 -0
  44. package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
  45. package/dist/controls/CaptionLengthControl.js +11 -0
  46. package/dist/controls/CaptionLengthControl.js.map +1 -0
  47. package/dist/controls/CaptionTranscribe.d.ts +2 -0
  48. package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
  49. package/dist/controls/CaptionTranscribe.js +95 -0
  50. package/dist/controls/CaptionTranscribe.js.map +1 -0
  51. package/dist/controls/ColorPicker.d.ts +17 -0
  52. package/dist/controls/ColorPicker.d.ts.map +1 -0
  53. package/dist/controls/ColorPicker.js +354 -0
  54. package/dist/controls/ColorPicker.js.map +1 -0
  55. package/dist/controls/ControlRenderer.d.ts +20 -0
  56. package/dist/controls/ControlRenderer.d.ts.map +1 -0
  57. package/dist/controls/ControlRenderer.js +106 -0
  58. package/dist/controls/ControlRenderer.js.map +1 -0
  59. package/dist/controls/CropControl.d.ts +2 -0
  60. package/dist/controls/CropControl.d.ts.map +1 -0
  61. package/dist/controls/CropControl.js +177 -0
  62. package/dist/controls/CropControl.js.map +1 -0
  63. package/dist/controls/EffectsStack.d.ts +8 -0
  64. package/dist/controls/EffectsStack.d.ts.map +1 -0
  65. package/dist/controls/EffectsStack.js +89 -0
  66. package/dist/controls/EffectsStack.js.map +1 -0
  67. package/dist/controls/GradeControl.d.ts +2 -0
  68. package/dist/controls/GradeControl.d.ts.map +1 -0
  69. package/dist/controls/GradeControl.js +120 -0
  70. package/dist/controls/GradeControl.js.map +1 -0
  71. package/dist/controls/KeyframeDiamond.d.ts +11 -0
  72. package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
  73. package/dist/controls/KeyframeDiamond.js +87 -0
  74. package/dist/controls/KeyframeDiamond.js.map +1 -0
  75. package/dist/controls/LightingControls.d.ts +24 -0
  76. package/dist/controls/LightingControls.d.ts.map +1 -0
  77. package/dist/controls/LightingControls.js +108 -0
  78. package/dist/controls/LightingControls.js.map +1 -0
  79. package/dist/controls/ShapePresetControl.d.ts +4 -0
  80. package/dist/controls/ShapePresetControl.d.ts.map +1 -0
  81. package/dist/controls/ShapePresetControl.js +30 -0
  82. package/dist/controls/ShapePresetControl.js.map +1 -0
  83. package/dist/controls/ValueField.d.ts +10 -0
  84. package/dist/controls/ValueField.d.ts.map +1 -0
  85. package/dist/controls/ValueField.js +158 -0
  86. package/dist/controls/ValueField.js.map +1 -0
  87. package/dist/controls/VolumeControl.d.ts +10 -0
  88. package/dist/controls/VolumeControl.d.ts.map +1 -0
  89. package/dist/controls/VolumeControl.js +75 -0
  90. package/dist/controls/VolumeControl.js.map +1 -0
  91. package/dist/controls/compound.d.ts +46 -0
  92. package/dist/controls/compound.d.ts.map +1 -0
  93. package/dist/controls/compound.js +160 -0
  94. package/dist/controls/compound.js.map +1 -0
  95. package/dist/controls/layout.d.ts +38 -0
  96. package/dist/controls/layout.d.ts.map +1 -0
  97. package/dist/controls/layout.js +162 -0
  98. package/dist/controls/layout.js.map +1 -0
  99. package/dist/controls/primitives.d.ts +83 -0
  100. package/dist/controls/primitives.d.ts.map +1 -0
  101. package/dist/controls/primitives.js +194 -0
  102. package/dist/controls/primitives.js.map +1 -0
  103. package/dist/controls/transcribe.worker.d.ts +2 -0
  104. package/dist/controls/transcribe.worker.d.ts.map +1 -0
  105. package/dist/controls/transcribe.worker.js +22 -0
  106. package/dist/controls/transcribe.worker.js.map +1 -0
  107. package/dist/frame/AddElementBar.d.ts +2 -0
  108. package/dist/frame/AddElementBar.d.ts.map +1 -0
  109. package/dist/frame/AddElementBar.js +103 -0
  110. package/dist/frame/AddElementBar.js.map +1 -0
  111. package/dist/frame/Breadcrumbs.d.ts +2 -0
  112. package/dist/frame/Breadcrumbs.d.ts.map +1 -0
  113. package/dist/frame/Breadcrumbs.js +32 -0
  114. package/dist/frame/Breadcrumbs.js.map +1 -0
  115. package/dist/frame/GroupFlash.d.ts +2 -0
  116. package/dist/frame/GroupFlash.d.ts.map +1 -0
  117. package/dist/frame/GroupFlash.js +65 -0
  118. package/dist/frame/GroupFlash.js.map +1 -0
  119. package/dist/frame/Resizable.d.ts +12 -0
  120. package/dist/frame/Resizable.d.ts.map +1 -0
  121. package/dist/frame/Resizable.js +37 -0
  122. package/dist/frame/Resizable.js.map +1 -0
  123. package/dist/frame/Section.d.ts +23 -0
  124. package/dist/frame/Section.d.ts.map +1 -0
  125. package/dist/frame/Section.js +23 -0
  126. package/dist/frame/Section.js.map +1 -0
  127. package/dist/frame/ZoomControl.d.ts +9 -0
  128. package/dist/frame/ZoomControl.d.ts.map +1 -0
  129. package/dist/frame/ZoomControl.js +15 -0
  130. package/dist/frame/ZoomControl.js.map +1 -0
  131. package/dist/index.d.ts +9 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +13 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lib/camera-gizmo.d.ts +15 -0
  136. package/dist/lib/camera-gizmo.d.ts.map +1 -0
  137. package/dist/lib/camera-gizmo.js +57 -0
  138. package/dist/lib/camera-gizmo.js.map +1 -0
  139. package/dist/lib/camera-tool.d.ts +43 -0
  140. package/dist/lib/camera-tool.d.ts.map +1 -0
  141. package/dist/lib/camera-tool.js +80 -0
  142. package/dist/lib/camera-tool.js.map +1 -0
  143. package/dist/lib/caption-segments.d.ts +17 -0
  144. package/dist/lib/caption-segments.d.ts.map +1 -0
  145. package/dist/lib/caption-segments.js +50 -0
  146. package/dist/lib/caption-segments.js.map +1 -0
  147. package/dist/lib/group.d.ts +12 -0
  148. package/dist/lib/group.d.ts.map +1 -0
  149. package/dist/lib/group.js +61 -0
  150. package/dist/lib/group.js.map +1 -0
  151. package/dist/lib/keyframes.d.ts +29 -0
  152. package/dist/lib/keyframes.d.ts.map +1 -0
  153. package/dist/lib/keyframes.js +92 -0
  154. package/dist/lib/keyframes.js.map +1 -0
  155. package/dist/lib/sfx-preview.d.ts +18 -0
  156. package/dist/lib/sfx-preview.d.ts.map +1 -0
  157. package/dist/lib/sfx-preview.js +74 -0
  158. package/dist/lib/sfx-preview.js.map +1 -0
  159. package/dist/lib/shape-presets.d.ts +35 -0
  160. package/dist/lib/shape-presets.d.ts.map +1 -0
  161. package/dist/lib/shape-presets.js +81 -0
  162. package/dist/lib/shape-presets.js.map +1 -0
  163. package/dist/lib/ungroup.d.ts +12 -0
  164. package/dist/lib/ungroup.d.ts.map +1 -0
  165. package/dist/lib/ungroup.js +40 -0
  166. package/dist/lib/ungroup.js.map +1 -0
  167. package/dist/lib/utils.d.ts +3 -0
  168. package/dist/lib/utils.d.ts.map +1 -0
  169. package/dist/lib/utils.js +9 -0
  170. package/dist/lib/utils.js.map +1 -0
  171. package/dist/panels/AssetsPanel.d.ts +2 -0
  172. package/dist/panels/AssetsPanel.d.ts.map +1 -0
  173. package/dist/panels/AssetsPanel.js +108 -0
  174. package/dist/panels/AssetsPanel.js.map +1 -0
  175. package/dist/panels/InspectorPanel.d.ts +2 -0
  176. package/dist/panels/InspectorPanel.d.ts.map +1 -0
  177. package/dist/panels/InspectorPanel.js +286 -0
  178. package/dist/panels/InspectorPanel.js.map +1 -0
  179. package/dist/panels/InterpolationPanel.d.ts +2 -0
  180. package/dist/panels/InterpolationPanel.d.ts.map +1 -0
  181. package/dist/panels/InterpolationPanel.js +226 -0
  182. package/dist/panels/InterpolationPanel.js.map +1 -0
  183. package/dist/panels/LayersTree.d.ts +4 -0
  184. package/dist/panels/LayersTree.d.ts.map +1 -0
  185. package/dist/panels/LayersTree.js +137 -0
  186. package/dist/panels/LayersTree.js.map +1 -0
  187. package/dist/panels/LeftRail.d.ts +6 -0
  188. package/dist/panels/LeftRail.d.ts.map +1 -0
  189. package/dist/panels/LeftRail.js +35 -0
  190. package/dist/panels/LeftRail.js.map +1 -0
  191. package/dist/panels/SourcePanel.d.ts +2 -0
  192. package/dist/panels/SourcePanel.d.ts.map +1 -0
  193. package/dist/panels/SourcePanel.js +470 -0
  194. package/dist/panels/SourcePanel.js.map +1 -0
  195. package/dist/panels/TimelinePanel.d.ts +11 -0
  196. package/dist/panels/TimelinePanel.d.ts.map +1 -0
  197. package/dist/panels/TimelinePanel.js +98 -0
  198. package/dist/panels/TimelinePanel.js.map +1 -0
  199. package/dist/panels/assets/SfxBrowser.d.ts +2 -0
  200. package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
  201. package/dist/panels/assets/SfxBrowser.js +49 -0
  202. package/dist/panels/assets/SfxBrowser.js.map +1 -0
  203. package/dist/panels/assets/use-assets.d.ts +11 -0
  204. package/dist/panels/assets/use-assets.d.ts.map +1 -0
  205. package/dist/panels/assets/use-assets.js +84 -0
  206. package/dist/panels/assets/use-assets.js.map +1 -0
  207. package/dist/panels/assets/use-sfx.d.ts +6 -0
  208. package/dist/panels/assets/use-sfx.d.ts.map +1 -0
  209. package/dist/panels/assets/use-sfx.js +47 -0
  210. package/dist/panels/assets/use-sfx.js.map +1 -0
  211. package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
  212. package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
  213. package/dist/panels/timeline/CanvasTimeline.js +1536 -0
  214. package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
  215. package/dist/panels/timeline/Clip.d.ts +37 -0
  216. package/dist/panels/timeline/Clip.d.ts.map +1 -0
  217. package/dist/panels/timeline/Clip.js +176 -0
  218. package/dist/panels/timeline/Clip.js.map +1 -0
  219. package/dist/panels/timeline/CurveEditor.d.ts +2 -0
  220. package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
  221. package/dist/panels/timeline/CurveEditor.js +233 -0
  222. package/dist/panels/timeline/CurveEditor.js.map +1 -0
  223. package/dist/panels/timeline/MixerRail.d.ts +7 -0
  224. package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
  225. package/dist/panels/timeline/MixerRail.js +295 -0
  226. package/dist/panels/timeline/MixerRail.js.map +1 -0
  227. package/dist/panels/timeline/Waveform.d.ts +11 -0
  228. package/dist/panels/timeline/Waveform.d.ts.map +1 -0
  229. package/dist/panels/timeline/Waveform.js +63 -0
  230. package/dist/panels/timeline/Waveform.js.map +1 -0
  231. package/dist/panels/timeline/clip-style.d.ts +10 -0
  232. package/dist/panels/timeline/clip-style.d.ts.map +1 -0
  233. package/dist/panels/timeline/clip-style.js +20 -0
  234. package/dist/panels/timeline/clip-style.js.map +1 -0
  235. package/dist/panels/timeline/filmstrip.d.ts +7 -0
  236. package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
  237. package/dist/panels/timeline/filmstrip.js +135 -0
  238. package/dist/panels/timeline/filmstrip.js.map +1 -0
  239. package/dist/panels/timeline/timeline-layout.d.ts +65 -0
  240. package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
  241. package/dist/panels/timeline/timeline-layout.js +118 -0
  242. package/dist/panels/timeline/timeline-layout.js.map +1 -0
  243. package/dist/types.d.ts +68 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +3 -0
  246. package/dist/types.js.map +1 -0
  247. package/package.json +56 -0
  248. 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"}