@open-draw/canvas 0.0.0-stage → 0.2.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 (331) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +77 -2
  3. package/dist/a11y.d.ts +13 -0
  4. package/dist/a11y.d.ts.map +1 -0
  5. package/dist/a11y.js +41 -0
  6. package/dist/a11y.js.map +1 -0
  7. package/dist/camera.d.ts +96 -0
  8. package/dist/camera.d.ts.map +1 -0
  9. package/dist/camera.js +208 -0
  10. package/dist/camera.js.map +1 -0
  11. package/dist/capabilities/clipping/defs.d.ts +7 -0
  12. package/dist/capabilities/clipping/defs.d.ts.map +1 -0
  13. package/dist/capabilities/clipping/defs.js +2 -0
  14. package/dist/capabilities/clipping/defs.js.map +1 -0
  15. package/dist/capabilities/clipping/index.d.ts +3 -0
  16. package/dist/capabilities/clipping/index.d.ts.map +1 -0
  17. package/dist/capabilities/clipping/index.js +3 -0
  18. package/dist/capabilities/clipping/index.js.map +1 -0
  19. package/dist/capabilities/clipping/manager.d.ts +14 -0
  20. package/dist/capabilities/clipping/manager.d.ts.map +1 -0
  21. package/dist/capabilities/clipping/manager.js +75 -0
  22. package/dist/capabilities/clipping/manager.js.map +1 -0
  23. package/dist/capabilities/connector/defs.d.ts +9 -0
  24. package/dist/capabilities/connector/defs.d.ts.map +1 -0
  25. package/dist/capabilities/connector/defs.js +2 -0
  26. package/dist/capabilities/connector/defs.js.map +1 -0
  27. package/dist/capabilities/connector/index.d.ts +3 -0
  28. package/dist/capabilities/connector/index.d.ts.map +1 -0
  29. package/dist/capabilities/connector/index.js +3 -0
  30. package/dist/capabilities/connector/index.js.map +1 -0
  31. package/dist/capabilities/connector/manager.d.ts +19 -0
  32. package/dist/capabilities/connector/manager.d.ts.map +1 -0
  33. package/dist/capabilities/connector/manager.js +108 -0
  34. package/dist/capabilities/connector/manager.js.map +1 -0
  35. package/dist/capabilities/text-editing/defs.d.ts +2 -0
  36. package/dist/capabilities/text-editing/defs.d.ts.map +1 -0
  37. package/dist/capabilities/text-editing/defs.js +2 -0
  38. package/dist/capabilities/text-editing/defs.js.map +1 -0
  39. package/dist/capabilities/text-editing/index.d.ts +3 -0
  40. package/dist/capabilities/text-editing/index.d.ts.map +1 -0
  41. package/dist/capabilities/text-editing/index.js +3 -0
  42. package/dist/capabilities/text-editing/index.js.map +1 -0
  43. package/dist/capabilities/text-editing/manager.d.ts +20 -0
  44. package/dist/capabilities/text-editing/manager.d.ts.map +1 -0
  45. package/dist/capabilities/text-editing/manager.js +153 -0
  46. package/dist/capabilities/text-editing/manager.js.map +1 -0
  47. package/dist/editor.d.ts +94 -0
  48. package/dist/editor.d.ts.map +1 -0
  49. package/dist/editor.js +241 -0
  50. package/dist/editor.js.map +1 -0
  51. package/dist/eraser/eraser.d.ts +21 -0
  52. package/dist/eraser/eraser.d.ts.map +1 -0
  53. package/dist/eraser/eraser.js +147 -0
  54. package/dist/eraser/eraser.js.map +1 -0
  55. package/dist/eraser/index.d.ts +2 -0
  56. package/dist/eraser/index.d.ts.map +1 -0
  57. package/dist/eraser/index.js +2 -0
  58. package/dist/eraser/index.js.map +1 -0
  59. package/dist/export/index.d.ts +2 -0
  60. package/dist/export/index.d.ts.map +1 -0
  61. package/dist/export/index.js +2 -0
  62. package/dist/export/index.js.map +1 -0
  63. package/dist/export/png.d.ts +17 -0
  64. package/dist/export/png.d.ts.map +1 -0
  65. package/dist/export/png.js +130 -0
  66. package/dist/export/png.js.map +1 -0
  67. package/dist/gesture/gesture.d.ts +36 -0
  68. package/dist/gesture/gesture.d.ts.map +1 -0
  69. package/dist/gesture/gesture.js +268 -0
  70. package/dist/gesture/gesture.js.map +1 -0
  71. package/dist/gesture/index.d.ts +2 -0
  72. package/dist/gesture/index.d.ts.map +1 -0
  73. package/dist/gesture/index.js +2 -0
  74. package/dist/gesture/index.js.map +1 -0
  75. package/dist/index.d.ts +36 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +37 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/input/commands.d.ts +12 -0
  80. package/dist/input/commands.d.ts.map +1 -0
  81. package/dist/input/commands.js +195 -0
  82. package/dist/input/commands.js.map +1 -0
  83. package/dist/input/index.d.ts +5 -0
  84. package/dist/input/index.d.ts.map +1 -0
  85. package/dist/input/index.js +5 -0
  86. package/dist/input/index.js.map +1 -0
  87. package/dist/input/keyboard.d.ts +13 -0
  88. package/dist/input/keyboard.d.ts.map +1 -0
  89. package/dist/input/keyboard.js +83 -0
  90. package/dist/input/keyboard.js.map +1 -0
  91. package/dist/input/keymap.d.ts +10 -0
  92. package/dist/input/keymap.d.ts.map +1 -0
  93. package/dist/input/keymap.js +75 -0
  94. package/dist/input/keymap.js.map +1 -0
  95. package/dist/input/utils.d.ts +5 -0
  96. package/dist/input/utils.d.ts.map +1 -0
  97. package/dist/input/utils.js +4 -0
  98. package/dist/input/utils.js.map +1 -0
  99. package/dist/interaction.d.ts +29 -0
  100. package/dist/interaction.d.ts.map +1 -0
  101. package/dist/interaction.js +248 -0
  102. package/dist/interaction.js.map +1 -0
  103. package/dist/perf/index.d.ts +2 -0
  104. package/dist/perf/index.d.ts.map +1 -0
  105. package/dist/perf/index.js +2 -0
  106. package/dist/perf/index.js.map +1 -0
  107. package/dist/perf/telemetry.d.ts +33 -0
  108. package/dist/perf/telemetry.d.ts.map +1 -0
  109. package/dist/perf/telemetry.js +145 -0
  110. package/dist/perf/telemetry.js.map +1 -0
  111. package/dist/registry.d.ts +68 -0
  112. package/dist/registry.d.ts.map +1 -0
  113. package/dist/registry.js +34 -0
  114. package/dist/registry.js.map +1 -0
  115. package/dist/renderer.d.ts +29 -0
  116. package/dist/renderer.d.ts.map +1 -0
  117. package/dist/renderer.js +257 -0
  118. package/dist/renderer.js.map +1 -0
  119. package/dist/selection/defs.d.ts +6 -0
  120. package/dist/selection/defs.d.ts.map +1 -0
  121. package/dist/selection/defs.js +2 -0
  122. package/dist/selection/defs.js.map +1 -0
  123. package/dist/selection/group.d.ts +7 -0
  124. package/dist/selection/group.d.ts.map +1 -0
  125. package/dist/selection/group.js +25 -0
  126. package/dist/selection/group.js.map +1 -0
  127. package/dist/selection/handles.d.ts +9 -0
  128. package/dist/selection/handles.d.ts.map +1 -0
  129. package/dist/selection/handles.js +19 -0
  130. package/dist/selection/handles.js.map +1 -0
  131. package/dist/selection/handlesView.d.ts +4 -0
  132. package/dist/selection/handlesView.d.ts.map +1 -0
  133. package/dist/selection/handlesView.js +98 -0
  134. package/dist/selection/handlesView.js.map +1 -0
  135. package/dist/selection/index.d.ts +10 -0
  136. package/dist/selection/index.d.ts.map +1 -0
  137. package/dist/selection/index.js +10 -0
  138. package/dist/selection/index.js.map +1 -0
  139. package/dist/selection/manager.d.ts +29 -0
  140. package/dist/selection/manager.d.ts.map +1 -0
  141. package/dist/selection/manager.js +195 -0
  142. package/dist/selection/manager.js.map +1 -0
  143. package/dist/selection/marquee.d.ts +11 -0
  144. package/dist/selection/marquee.d.ts.map +1 -0
  145. package/dist/selection/marquee.js +52 -0
  146. package/dist/selection/marquee.js.map +1 -0
  147. package/dist/selection/reparent.d.ts +12 -0
  148. package/dist/selection/reparent.d.ts.map +1 -0
  149. package/dist/selection/reparent.js +57 -0
  150. package/dist/selection/reparent.js.map +1 -0
  151. package/dist/selection/resize.d.ts +10 -0
  152. package/dist/selection/resize.d.ts.map +1 -0
  153. package/dist/selection/resize.js +66 -0
  154. package/dist/selection/resize.js.map +1 -0
  155. package/dist/selection/rotate.d.ts +18 -0
  156. package/dist/selection/rotate.d.ts.map +1 -0
  157. package/dist/selection/rotate.js +39 -0
  158. package/dist/selection/rotate.js.map +1 -0
  159. package/dist/shapes/arrow/defs.d.ts +17 -0
  160. package/dist/shapes/arrow/defs.d.ts.map +1 -0
  161. package/dist/shapes/arrow/defs.js +7 -0
  162. package/dist/shapes/arrow/defs.js.map +1 -0
  163. package/dist/shapes/arrow/geometry.d.ts +11 -0
  164. package/dist/shapes/arrow/geometry.d.ts.map +1 -0
  165. package/dist/shapes/arrow/geometry.js +77 -0
  166. package/dist/shapes/arrow/geometry.js.map +1 -0
  167. package/dist/shapes/arrow/index.d.ts +7 -0
  168. package/dist/shapes/arrow/index.d.ts.map +1 -0
  169. package/dist/shapes/arrow/index.js +23 -0
  170. package/dist/shapes/arrow/index.js.map +1 -0
  171. package/dist/shapes/arrow/render.d.ts +6 -0
  172. package/dist/shapes/arrow/render.d.ts.map +1 -0
  173. package/dist/shapes/arrow/render.js +84 -0
  174. package/dist/shapes/arrow/render.js.map +1 -0
  175. package/dist/shapes/ellipse/defs.d.ts +8 -0
  176. package/dist/shapes/ellipse/defs.d.ts.map +1 -0
  177. package/dist/shapes/ellipse/defs.js +2 -0
  178. package/dist/shapes/ellipse/defs.js.map +1 -0
  179. package/dist/shapes/ellipse/geometry.d.ts +9 -0
  180. package/dist/shapes/ellipse/geometry.d.ts.map +1 -0
  181. package/dist/shapes/ellipse/geometry.js +74 -0
  182. package/dist/shapes/ellipse/geometry.js.map +1 -0
  183. package/dist/shapes/ellipse/index.d.ts +7 -0
  184. package/dist/shapes/ellipse/index.d.ts.map +1 -0
  185. package/dist/shapes/ellipse/index.js +21 -0
  186. package/dist/shapes/ellipse/index.js.map +1 -0
  187. package/dist/shapes/ellipse/render.d.ts +6 -0
  188. package/dist/shapes/ellipse/render.d.ts.map +1 -0
  189. package/dist/shapes/ellipse/render.js +39 -0
  190. package/dist/shapes/ellipse/render.js.map +1 -0
  191. package/dist/shapes/frame/defs.d.ts +9 -0
  192. package/dist/shapes/frame/defs.d.ts.map +1 -0
  193. package/dist/shapes/frame/defs.js +8 -0
  194. package/dist/shapes/frame/defs.js.map +1 -0
  195. package/dist/shapes/frame/geometry.d.ts +4 -0
  196. package/dist/shapes/frame/geometry.d.ts.map +1 -0
  197. package/dist/shapes/frame/geometry.js +66 -0
  198. package/dist/shapes/frame/geometry.js.map +1 -0
  199. package/dist/shapes/frame/index.d.ts +7 -0
  200. package/dist/shapes/frame/index.d.ts.map +1 -0
  201. package/dist/shapes/frame/index.js +20 -0
  202. package/dist/shapes/frame/index.js.map +1 -0
  203. package/dist/shapes/frame/render.d.ts +6 -0
  204. package/dist/shapes/frame/render.d.ts.map +1 -0
  205. package/dist/shapes/frame/render.js +73 -0
  206. package/dist/shapes/frame/render.js.map +1 -0
  207. package/dist/shapes/group/defs.d.ts +6 -0
  208. package/dist/shapes/group/defs.d.ts.map +1 -0
  209. package/dist/shapes/group/defs.js +2 -0
  210. package/dist/shapes/group/defs.js.map +1 -0
  211. package/dist/shapes/group/geometry.d.ts +8 -0
  212. package/dist/shapes/group/geometry.d.ts.map +1 -0
  213. package/dist/shapes/group/geometry.js +19 -0
  214. package/dist/shapes/group/geometry.js.map +1 -0
  215. package/dist/shapes/group/index.d.ts +7 -0
  216. package/dist/shapes/group/index.d.ts.map +1 -0
  217. package/dist/shapes/group/index.js +23 -0
  218. package/dist/shapes/group/index.js.map +1 -0
  219. package/dist/shapes/group/render.d.ts +6 -0
  220. package/dist/shapes/group/render.d.ts.map +1 -0
  221. package/dist/shapes/group/render.js +9 -0
  222. package/dist/shapes/group/render.js.map +1 -0
  223. package/dist/shapes/image/defs.d.ts +10 -0
  224. package/dist/shapes/image/defs.d.ts.map +1 -0
  225. package/dist/shapes/image/defs.js +2 -0
  226. package/dist/shapes/image/defs.js.map +1 -0
  227. package/dist/shapes/image/geometry.d.ts +21 -0
  228. package/dist/shapes/image/geometry.d.ts.map +1 -0
  229. package/dist/shapes/image/geometry.js +79 -0
  230. package/dist/shapes/image/geometry.js.map +1 -0
  231. package/dist/shapes/image/handlers.d.ts +10 -0
  232. package/dist/shapes/image/handlers.d.ts.map +1 -0
  233. package/dist/shapes/image/handlers.js +85 -0
  234. package/dist/shapes/image/handlers.js.map +1 -0
  235. package/dist/shapes/image/index.d.ts +8 -0
  236. package/dist/shapes/image/index.d.ts.map +1 -0
  237. package/dist/shapes/image/index.js +21 -0
  238. package/dist/shapes/image/index.js.map +1 -0
  239. package/dist/shapes/image/render.d.ts +6 -0
  240. package/dist/shapes/image/render.d.ts.map +1 -0
  241. package/dist/shapes/image/render.js +28 -0
  242. package/dist/shapes/image/render.js.map +1 -0
  243. package/dist/shapes/ink/defs.d.ts +10 -0
  244. package/dist/shapes/ink/defs.d.ts.map +1 -0
  245. package/dist/shapes/ink/defs.js +13 -0
  246. package/dist/shapes/ink/defs.js.map +1 -0
  247. package/dist/shapes/ink/geometry.d.ts +4 -0
  248. package/dist/shapes/ink/geometry.d.ts.map +1 -0
  249. package/dist/shapes/ink/geometry.js +67 -0
  250. package/dist/shapes/ink/geometry.js.map +1 -0
  251. package/dist/shapes/ink/index.d.ts +9 -0
  252. package/dist/shapes/ink/index.d.ts.map +1 -0
  253. package/dist/shapes/ink/index.js +22 -0
  254. package/dist/shapes/ink/index.js.map +1 -0
  255. package/dist/shapes/ink/rdp.d.ts +2 -0
  256. package/dist/shapes/ink/rdp.d.ts.map +1 -0
  257. package/dist/shapes/ink/rdp.js +37 -0
  258. package/dist/shapes/ink/rdp.js.map +1 -0
  259. package/dist/shapes/ink/render.d.ts +7 -0
  260. package/dist/shapes/ink/render.d.ts.map +1 -0
  261. package/dist/shapes/ink/render.js +81 -0
  262. package/dist/shapes/ink/render.js.map +1 -0
  263. package/dist/shapes/note/defs.d.ts +7 -0
  264. package/dist/shapes/note/defs.d.ts.map +1 -0
  265. package/dist/shapes/note/defs.js +2 -0
  266. package/dist/shapes/note/defs.js.map +1 -0
  267. package/dist/shapes/note/geometry.d.ts +11 -0
  268. package/dist/shapes/note/geometry.d.ts.map +1 -0
  269. package/dist/shapes/note/geometry.js +70 -0
  270. package/dist/shapes/note/geometry.js.map +1 -0
  271. package/dist/shapes/note/index.d.ts +7 -0
  272. package/dist/shapes/note/index.d.ts.map +1 -0
  273. package/dist/shapes/note/index.js +41 -0
  274. package/dist/shapes/note/index.js.map +1 -0
  275. package/dist/shapes/note/render.d.ts +6 -0
  276. package/dist/shapes/note/render.d.ts.map +1 -0
  277. package/dist/shapes/note/render.js +38 -0
  278. package/dist/shapes/note/render.js.map +1 -0
  279. package/dist/shapes/rect/defs.d.ts +9 -0
  280. package/dist/shapes/rect/defs.d.ts.map +1 -0
  281. package/dist/shapes/rect/defs.js +2 -0
  282. package/dist/shapes/rect/defs.js.map +1 -0
  283. package/dist/shapes/rect/geometry.d.ts +9 -0
  284. package/dist/shapes/rect/geometry.d.ts.map +1 -0
  285. package/dist/shapes/rect/geometry.js +68 -0
  286. package/dist/shapes/rect/geometry.js.map +1 -0
  287. package/dist/shapes/rect/index.d.ts +7 -0
  288. package/dist/shapes/rect/index.d.ts.map +1 -0
  289. package/dist/shapes/rect/index.js +22 -0
  290. package/dist/shapes/rect/index.js.map +1 -0
  291. package/dist/shapes/rect/render.d.ts +6 -0
  292. package/dist/shapes/rect/render.d.ts.map +1 -0
  293. package/dist/shapes/rect/render.js +42 -0
  294. package/dist/shapes/rect/render.js.map +1 -0
  295. package/dist/shapes/text/defs.d.ts +9 -0
  296. package/dist/shapes/text/defs.d.ts.map +1 -0
  297. package/dist/shapes/text/defs.js +2 -0
  298. package/dist/shapes/text/defs.js.map +1 -0
  299. package/dist/shapes/text/geometry.d.ts +9 -0
  300. package/dist/shapes/text/geometry.d.ts.map +1 -0
  301. package/dist/shapes/text/geometry.js +68 -0
  302. package/dist/shapes/text/geometry.js.map +1 -0
  303. package/dist/shapes/text/index.d.ts +7 -0
  304. package/dist/shapes/text/index.d.ts.map +1 -0
  305. package/dist/shapes/text/index.js +43 -0
  306. package/dist/shapes/text/index.js.map +1 -0
  307. package/dist/shapes/text/render.d.ts +6 -0
  308. package/dist/shapes/text/render.d.ts.map +1 -0
  309. package/dist/shapes/text/render.js +23 -0
  310. package/dist/shapes/text/render.js.map +1 -0
  311. package/dist/store/index.d.ts +5 -0
  312. package/dist/store/index.d.ts.map +1 -0
  313. package/dist/store/index.js +5 -0
  314. package/dist/store/index.js.map +1 -0
  315. package/dist/store/snapshot.d.ts +5 -0
  316. package/dist/store/snapshot.d.ts.map +1 -0
  317. package/dist/store/snapshot.js +76 -0
  318. package/dist/store/snapshot.js.map +1 -0
  319. package/dist/store/store.d.ts +52 -0
  320. package/dist/store/store.d.ts.map +1 -0
  321. package/dist/store/store.js +252 -0
  322. package/dist/store/store.js.map +1 -0
  323. package/dist/store/types.d.ts +13 -0
  324. package/dist/store/types.d.ts.map +1 -0
  325. package/dist/store/types.js +2 -0
  326. package/dist/store/types.js.map +1 -0
  327. package/dist/store/zorder.d.ts +4 -0
  328. package/dist/store/zorder.d.ts.map +1 -0
  329. package/dist/store/zorder.js +53 -0
  330. package/dist/store/zorder.js.map +1 -0
  331. package/package.json +29 -4
@@ -0,0 +1,36 @@
1
+ import type { Point, ShapeId, ShapeRecord } from '@open-draw/schema';
2
+ import type { CanvasEditor } from '../editor.js';
3
+ import type { HandleType } from '../selection/handles.js';
4
+ export type GestureType = 'none' | 'move' | 'resize' | 'rotate';
5
+ export declare class GestureController {
6
+ private editor;
7
+ private currentType;
8
+ private targetShapeId;
9
+ private handleType;
10
+ private startPointer;
11
+ private initialBounds;
12
+ private initialShapes;
13
+ private previewShapes;
14
+ private candidateFrameId;
15
+ private hasMoved;
16
+ constructor(editor: CanvasEditor);
17
+ get isActive(): boolean;
18
+ get type(): GestureType;
19
+ get didMove(): boolean;
20
+ getPreviewShape(id: ShapeId): ShapeRecord | undefined;
21
+ startMove(clickedShapeId: ShapeId, startPointer: Point): boolean;
22
+ startResize(handleType: HandleType, shapeId: ShapeId, startPointer: Point): boolean;
23
+ startRotate(shapeId: ShapeId, startPointer: Point): boolean;
24
+ move(currentPointer: Point, e: PointerEvent | MouseEvent): void;
25
+ commit(): void;
26
+ cancel(): void;
27
+ private _moveShapes;
28
+ private _resizeShape;
29
+ private _rotateShape;
30
+ private _updateCandidateFrameHighlight;
31
+ private _clearFrameHighlight;
32
+ private _applyWillChange;
33
+ private _clearWillChange;
34
+ private _reset;
35
+ }
36
+ //# sourceMappingURL=gesture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture.d.ts","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAO1D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEhE,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAuB;IAC1C,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,gBAAgB,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,MAAM,EAAE,YAAY,EAE/B;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,IAAI,IAAI,WAAW,CAEtB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAEpD;IAED,SAAS,CAAC,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,GAAG,OAAO,CAgC/D;IAED,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,GAAG,OAAO,CAkBlF;IAED,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,GAAG,OAAO,CAiB1D;IAED,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI,CA0B9D;IAED,MAAM,IAAI,IAAI,CA4Bb;IAED,MAAM,IAAI,IAAI,CAQb;IAED,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,8BAA8B;IAuBtC,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,MAAM;CAWf"}
@@ -0,0 +1,268 @@
1
+ import { boundsCenter } from '@open-draw/schema';
2
+ import { resizeBounds } from '../selection/resize.js';
3
+ import { computeRotationAngle } from '../selection/rotate.js';
4
+ import { handleGestureReparent } from '../selection/reparent.js';
5
+ import { findSuggestedParent } from '../capabilities/clipping/index.js';
6
+ import { isGroupShape, getGroupMembers } from '../selection/group.js';
7
+ export class GestureController {
8
+ editor;
9
+ currentType = 'none';
10
+ targetShapeId = null;
11
+ handleType = null;
12
+ startPointer = null;
13
+ initialBounds = null;
14
+ initialShapes = new Map();
15
+ previewShapes = new Map();
16
+ candidateFrameId = null;
17
+ hasMoved = false;
18
+ constructor(editor) {
19
+ this.editor = editor;
20
+ }
21
+ get isActive() {
22
+ return this.currentType !== 'none';
23
+ }
24
+ get type() {
25
+ return this.currentType;
26
+ }
27
+ get didMove() {
28
+ return this.hasMoved;
29
+ }
30
+ getPreviewShape(id) {
31
+ return this.previewShapes.get(id);
32
+ }
33
+ startMove(clickedShapeId, startPointer) {
34
+ this._reset();
35
+ const shapesToMove = new Set();
36
+ for (const selId of this.editor.selection) {
37
+ shapesToMove.add(selId);
38
+ const shape = this.editor.store.getShape(selId);
39
+ if (shape && isGroupShape(shape, this.editor.registry)) {
40
+ for (const m of getGroupMembers(shape, this.editor.registry))
41
+ shapesToMove.add(m);
42
+ }
43
+ for (const candidate of this.editor.store.listShapes()) {
44
+ if (candidate.meta['parent'] === selId || candidate.meta['parentId'] === selId) {
45
+ shapesToMove.add(candidate.id);
46
+ }
47
+ }
48
+ }
49
+ if (!shapesToMove.has(clickedShapeId))
50
+ shapesToMove.add(clickedShapeId);
51
+ for (const id of shapesToMove) {
52
+ const shape = this.editor.store.getShape(id);
53
+ if (shape) {
54
+ this.initialShapes.set(id, shape);
55
+ this.previewShapes.set(id, shape);
56
+ }
57
+ }
58
+ this.currentType = 'move';
59
+ this.targetShapeId = clickedShapeId;
60
+ this.startPointer = startPointer;
61
+ this.hasMoved = false;
62
+ this._applyWillChange();
63
+ return true;
64
+ }
65
+ startResize(handleType, shapeId, startPointer) {
66
+ if (handleType === 'rotate')
67
+ return this.startRotate(shapeId, startPointer);
68
+ this._reset();
69
+ const shape = this.editor.store.getShape(shapeId);
70
+ if (!shape)
71
+ return false;
72
+ const def = this.editor.registry.get(shape.type);
73
+ if (!def)
74
+ return false;
75
+ this.initialShapes.set(shapeId, shape);
76
+ this.previewShapes.set(shapeId, shape);
77
+ this.initialBounds = def.geometry.bounds(shape);
78
+ this.handleType = handleType;
79
+ this.targetShapeId = shapeId;
80
+ this.startPointer = startPointer;
81
+ this.currentType = 'resize';
82
+ this.hasMoved = false;
83
+ this._applyWillChange();
84
+ return true;
85
+ }
86
+ startRotate(shapeId, startPointer) {
87
+ this._reset();
88
+ const shape = this.editor.store.getShape(shapeId);
89
+ if (!shape)
90
+ return false;
91
+ const def = this.editor.registry.get(shape.type);
92
+ if (!def)
93
+ return false;
94
+ this.initialShapes.set(shapeId, shape);
95
+ this.previewShapes.set(shapeId, shape);
96
+ this.initialBounds = def.geometry.bounds(shape);
97
+ this.handleType = 'rotate';
98
+ this.targetShapeId = shapeId;
99
+ this.startPointer = startPointer;
100
+ this.currentType = 'rotate';
101
+ this.hasMoved = false;
102
+ this._applyWillChange();
103
+ return true;
104
+ }
105
+ move(currentPointer, e) {
106
+ if (!this.isActive || !this.startPointer)
107
+ return;
108
+ const dx = currentPointer.x - this.startPointer.x;
109
+ const dy = currentPointer.y - this.startPointer.y;
110
+ if (this.currentType === 'rotate') {
111
+ this.hasMoved = true;
112
+ if (this.targetShapeId && this.initialBounds) {
113
+ this._rotateShape(currentPointer, e);
114
+ }
115
+ return;
116
+ }
117
+ if (!this.hasMoved) {
118
+ if (Math.abs(dx) > 1 || Math.abs(dy) > 1) {
119
+ this.hasMoved = true;
120
+ }
121
+ else {
122
+ return;
123
+ }
124
+ }
125
+ if (this.currentType === 'move') {
126
+ this._moveShapes(dx, dy);
127
+ }
128
+ else if (this.currentType === 'resize' && this.targetShapeId && this.initialBounds && this.handleType) {
129
+ this._resizeShape(dx, dy, e);
130
+ }
131
+ }
132
+ commit() {
133
+ if (!this.isActive)
134
+ return;
135
+ this._clearFrameHighlight();
136
+ if (this.hasMoved && this.previewShapes.size > 0) {
137
+ const patches = new Map(this.previewShapes);
138
+ const gestureType = this.currentType;
139
+ const targetId = this.targetShapeId;
140
+ this.editor.store.transact(() => {
141
+ if (gestureType === 'move') {
142
+ for (const [id, preview] of patches) {
143
+ this.editor.store.updateShape(id, { x: preview.x, y: preview.y });
144
+ }
145
+ for (const id of this.editor.selection) {
146
+ handleGestureReparent(id, this.editor.store, this.editor.registry, this.editor.camera);
147
+ }
148
+ }
149
+ else if (gestureType === 'resize' && targetId) {
150
+ const p = patches.get(targetId);
151
+ if (p)
152
+ this.editor.store.updateShape(targetId, { x: p.x, y: p.y, rotation: p.rotation, props: p.props });
153
+ }
154
+ else if (gestureType === 'rotate' && targetId) {
155
+ const p = patches.get(targetId);
156
+ if (p)
157
+ this.editor.store.updateShape(targetId, { rotation: p.rotation });
158
+ }
159
+ });
160
+ }
161
+ this._reset();
162
+ }
163
+ cancel() {
164
+ if (!this.isActive)
165
+ return;
166
+ this._clearFrameHighlight();
167
+ for (const [id, initial] of this.initialShapes) {
168
+ this.editor.renderer.updatePreview(initial);
169
+ }
170
+ this._reset();
171
+ this.editor.selectionManager.updateVisuals(this.editor.renderer, this.editor.store, this.editor.registry, this.editor.camera.camera);
172
+ }
173
+ _moveShapes(dx, dy) {
174
+ for (const [id, initial] of this.initialShapes) {
175
+ const preview = { ...initial, x: initial.x + dx, y: initial.y + dy };
176
+ this.previewShapes.set(id, preview);
177
+ this.editor.renderer.updatePreview(preview);
178
+ }
179
+ this.editor.selectionManager.updateVisuals(this.editor.renderer, this.editor.store, this.editor.registry, this.editor.camera.camera);
180
+ this._updateCandidateFrameHighlight();
181
+ }
182
+ _resizeShape(dx, dy, e) {
183
+ const shape = this.initialShapes.get(this.targetShapeId);
184
+ const newBounds = resizeBounds(this.initialBounds, this.handleType, dx, dy, {
185
+ aspect: e.shiftKey,
186
+ fromCenter: e.altKey,
187
+ });
188
+ const def = this.editor.registry.get(shape.type);
189
+ if (!def)
190
+ return;
191
+ const patch = def.geometry.resize(shape, newBounds);
192
+ const preview = { ...shape, ...patch };
193
+ this.previewShapes.set(shape.id, preview);
194
+ this.editor.renderer.updatePreview(preview);
195
+ this.editor.selectionManager.updateVisuals(this.editor.renderer, this.editor.store, this.editor.registry, this.editor.camera.camera);
196
+ }
197
+ _rotateShape(currentPointer, e) {
198
+ const shape = this.initialShapes.get(this.targetShapeId);
199
+ const center = boundsCenter(this.initialBounds);
200
+ const snap = !e.shiftKey;
201
+ const angle = computeRotationAngle(center, currentPointer, { snap });
202
+ const preview = { ...shape, rotation: angle };
203
+ this.previewShapes.set(shape.id, preview);
204
+ this.editor.renderer.updatePreview(preview);
205
+ this.editor.selectionManager.updateVisuals(this.editor.renderer, this.editor.store, this.editor.registry, this.editor.camera.camera);
206
+ }
207
+ _updateCandidateFrameHighlight() {
208
+ if (this.currentType !== 'move' || this.editor.selection.length !== 1) {
209
+ this._clearFrameHighlight();
210
+ return;
211
+ }
212
+ const selId = this.editor.selection[0];
213
+ const preview = this.previewShapes.get(selId);
214
+ if (!preview)
215
+ return;
216
+ const def = this.editor.registry.get(preview.type);
217
+ if (!def)
218
+ return;
219
+ const bounds = def.geometry.bounds(preview);
220
+ const suggested = findSuggestedParent(bounds, this.editor.store.listShapes(), this.editor.registry, selId);
221
+ const nextId = suggested?.id ?? null;
222
+ if (this.candidateFrameId !== nextId) {
223
+ this._clearFrameHighlight();
224
+ this.candidateFrameId = nextId;
225
+ if (this.candidateFrameId) {
226
+ this.editor.renderer.getShapeWrapper(this.candidateFrameId)?.classList.add('od-frame-target');
227
+ }
228
+ }
229
+ }
230
+ _clearFrameHighlight() {
231
+ if (this.candidateFrameId) {
232
+ this.editor.renderer.getShapeWrapper(this.candidateFrameId)?.classList.remove('od-frame-target');
233
+ this.candidateFrameId = null;
234
+ }
235
+ }
236
+ _applyWillChange() {
237
+ for (const id of this.initialShapes.keys()) {
238
+ const el = this.editor.renderer.getShapeWrapper(id);
239
+ if (el)
240
+ el.style.willChange = 'transform';
241
+ const slot = this.editor.renderer.getOverlaySlot(id);
242
+ if (slot)
243
+ slot.style.willChange = 'transform';
244
+ }
245
+ }
246
+ _clearWillChange() {
247
+ for (const id of this.initialShapes.keys()) {
248
+ const el = this.editor.renderer.getShapeWrapper(id);
249
+ if (el)
250
+ el.style.willChange = '';
251
+ const slot = this.editor.renderer.getOverlaySlot(id);
252
+ if (slot)
253
+ slot.style.willChange = '';
254
+ }
255
+ }
256
+ _reset() {
257
+ this._clearWillChange();
258
+ this.currentType = 'none';
259
+ this.targetShapeId = null;
260
+ this.handleType = null;
261
+ this.startPointer = null;
262
+ this.initialBounds = null;
263
+ this.initialShapes.clear();
264
+ this.previewShapes.clear();
265
+ this.hasMoved = false;
266
+ }
267
+ }
268
+ //# sourceMappingURL=gesture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gesture.js","sourceRoot":"","sources":["../../src/gesture/gesture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { GestureController, type GestureType } from './gesture.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { GestureController } from './gesture.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gesture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAoB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @open-draw/canvas
3
+ * DOM Canvas engine — every shape a real SVG/DOM element.
4
+ */
5
+ export * from './store/index.js';
6
+ export * from './camera.js';
7
+ export * from './editor.js';
8
+ export * from './renderer.js';
9
+ export * from './registry.js';
10
+ export * from './shapes/rect/index.js';
11
+ export * from './shapes/ellipse/index.js';
12
+ export * from './shapes/note/index.js';
13
+ export * from './shapes/image/index.js';
14
+ export * from './shapes/text/index.js';
15
+ export * from './shapes/frame/index.js';
16
+ export * from './shapes/arrow/index.js';
17
+ export * from './shapes/ink/index.js';
18
+ export * from './shapes/group/index.js';
19
+ export * from './capabilities/text-editing/index.js';
20
+ export * from './capabilities/clipping/index.js';
21
+ export * from './capabilities/connector/index.js';
22
+ export * from './selection/index.js';
23
+ export * from './input/index.js';
24
+ export * from './eraser/index.js';
25
+ export * from './gesture/index.js';
26
+ export * from './perf/index.js';
27
+ export * from './export/index.js';
28
+ export interface CanvasEngineOptions {
29
+ readonly readonly?: boolean;
30
+ }
31
+ export declare class DOMCanvasEngine {
32
+ readonly options: CanvasEngineOptions;
33
+ constructor(options?: CanvasEngineOptions);
34
+ isReady(): boolean;
35
+ }
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAElC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAEtC,YAAY,OAAO,GAAE,mBAAwB,EAE5C;IAED,OAAO,IAAI,OAAO,CAEjB;CACF"}
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @open-draw/canvas
3
+ * DOM Canvas engine — every shape a real SVG/DOM element.
4
+ */
5
+ export * from './store/index.js';
6
+ export * from './camera.js';
7
+ export * from './editor.js';
8
+ export * from './renderer.js';
9
+ export * from './registry.js';
10
+ export * from './shapes/rect/index.js';
11
+ export * from './shapes/ellipse/index.js';
12
+ export * from './shapes/note/index.js';
13
+ export * from './shapes/image/index.js';
14
+ export * from './shapes/text/index.js';
15
+ export * from './shapes/frame/index.js';
16
+ export * from './shapes/arrow/index.js';
17
+ export * from './shapes/ink/index.js';
18
+ export * from './shapes/group/index.js';
19
+ export * from './capabilities/text-editing/index.js';
20
+ export * from './capabilities/clipping/index.js';
21
+ export * from './capabilities/connector/index.js';
22
+ export * from './selection/index.js';
23
+ export * from './input/index.js';
24
+ export * from './eraser/index.js';
25
+ export * from './gesture/index.js';
26
+ export * from './perf/index.js';
27
+ export * from './export/index.js';
28
+ export class DOMCanvasEngine {
29
+ options;
30
+ constructor(options = {}) {
31
+ this.options = options;
32
+ }
33
+ isReady() {
34
+ return true;
35
+ }
36
+ }
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sCAAsC,CAAC;AACrD,cAAc,kCAAkC,CAAC;AACjD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAMlC,MAAM,OAAO,eAAe;IACjB,OAAO,CAAsB;IAEtC,YAAY,OAAO,GAAwB,EAAE;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { CanvasEditor } from '../editor.js';
2
+ import type { CommandId } from './keymap.js';
3
+ export declare function nudge(editor: CanvasEditor, dir: 'up' | 'down' | 'left' | 'right', amount: number): void;
4
+ export declare function deleteSelection(editor: CanvasEditor): void;
5
+ export declare function duplicateSelection(editor: CanvasEditor): void;
6
+ export declare function clipboardCopy(editor: CanvasEditor): void;
7
+ export declare function clipboardCut(editor: CanvasEditor): void;
8
+ export declare function clipboardPaste(editor: CanvasEditor): void;
9
+ export declare function zoomFit(editor: CanvasEditor): void;
10
+ export declare function zoomSelection(editor: CanvasEditor): void;
11
+ export declare function executeCommand(command: CommandId, editor: CanvasEditor): void;
12
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../../src/input/commands.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAiC7C,wBAAgB,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA+BvG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAU1D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAsB7D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAKxD;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAGvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAkBzD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAKlD;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAMxD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAkC7E"}
@@ -0,0 +1,195 @@
1
+ let lastNudgeTime = 0;
2
+ let lastNudgeDir = '';
3
+ let clipboard = [];
4
+ function computeUnionBounds(shapes, registry) {
5
+ let minX = Infinity;
6
+ let minY = Infinity;
7
+ let maxX = -Infinity;
8
+ let maxY = -Infinity;
9
+ for (const s of shapes) {
10
+ if (s.hidden)
11
+ continue;
12
+ const def = registry.get(s.type);
13
+ if (!def)
14
+ continue;
15
+ const b = def.geometry.bounds(s);
16
+ minX = Math.min(minX, b.x);
17
+ minY = Math.min(minY, b.y);
18
+ maxX = Math.max(maxX, b.x + b.width);
19
+ maxY = Math.max(maxY, b.y + b.height);
20
+ }
21
+ if (minX === Infinity)
22
+ return null;
23
+ return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
24
+ }
25
+ function getViewportSize(editor) {
26
+ const container = editor.getShapeWrapper(editor.selection[0] ?? '')?.closest('.od-canvas-root') ?? null;
27
+ const rect = container?.getBoundingClientRect();
28
+ return { width: rect?.width || 800, height: rect?.height || 600 };
29
+ }
30
+ export function nudge(editor, dir, amount) {
31
+ const sel = editor.selection;
32
+ if (sel.length === 0)
33
+ return;
34
+ const screenDelta = {
35
+ x: dir === 'left' ? -amount : dir === 'right' ? amount : 0,
36
+ y: dir === 'up' ? -amount : dir === 'down' ? amount : 0,
37
+ };
38
+ const p0 = editor.camera.screenToPage({ x: 0, y: 0 });
39
+ const p1 = editor.camera.screenToPage(screenDelta);
40
+ const dx = p1.x - p0.x;
41
+ const dy = p1.y - p0.y;
42
+ const now = Date.now();
43
+ const shouldMerge = dir === lastNudgeDir && now - lastNudgeTime < 500;
44
+ lastNudgeTime = now;
45
+ lastNudgeDir = dir;
46
+ editor.store.transact(() => {
47
+ for (const id of sel) {
48
+ const s = editor.store.getShape(id);
49
+ if (s) {
50
+ editor.store.updateShape(id, { x: s.x + dx, y: s.y + dy });
51
+ }
52
+ }
53
+ });
54
+ if (shouldMerge) {
55
+ editor.store.mergeLastHistoryEntry();
56
+ }
57
+ }
58
+ export function deleteSelection(editor) {
59
+ const sel = [...editor.selection];
60
+ if (sel.length === 0)
61
+ return;
62
+ editor.store.transact(() => {
63
+ for (const id of sel) {
64
+ editor.deleteShape(id);
65
+ }
66
+ });
67
+ editor.clearSelection();
68
+ }
69
+ export function duplicateSelection(editor) {
70
+ const sel = editor.selection;
71
+ if (sel.length === 0)
72
+ return;
73
+ const newIds = [];
74
+ editor.store.transact(() => {
75
+ for (const id of sel) {
76
+ const s = editor.store.getShape(id);
77
+ if (s) {
78
+ const copy = editor.createShape({
79
+ type: s.type,
80
+ x: s.x + 10,
81
+ y: s.y + 10,
82
+ rotation: s.rotation,
83
+ props: s.props,
84
+ meta: s.meta,
85
+ });
86
+ newIds.push(copy.id);
87
+ }
88
+ }
89
+ });
90
+ editor.setSelection(newIds);
91
+ }
92
+ export function clipboardCopy(editor) {
93
+ clipboard = editor.selection
94
+ .map((id) => editor.store.getShape(id))
95
+ .filter(Boolean)
96
+ .map((s) => JSON.parse(JSON.stringify(s)));
97
+ }
98
+ export function clipboardCut(editor) {
99
+ clipboardCopy(editor);
100
+ deleteSelection(editor);
101
+ }
102
+ export function clipboardPaste(editor) {
103
+ if (clipboard.length === 0)
104
+ return;
105
+ const newIds = [];
106
+ editor.store.transact(() => {
107
+ for (const s of clipboard) {
108
+ const copy = editor.createShape({
109
+ type: s.type,
110
+ x: s.x + 10,
111
+ y: s.y + 10,
112
+ rotation: s.rotation,
113
+ props: s.props,
114
+ meta: s.meta,
115
+ });
116
+ newIds.push(copy.id);
117
+ }
118
+ });
119
+ editor.setSelection(newIds);
120
+ }
121
+ export function zoomFit(editor) {
122
+ const bounds = computeUnionBounds(editor.store.listShapes(), editor.registry);
123
+ if (bounds) {
124
+ editor.camera.fitToBounds(bounds, getViewportSize(editor));
125
+ }
126
+ }
127
+ export function zoomSelection(editor) {
128
+ const shapes = editor.selection.map((id) => editor.store.getShape(id)).filter(Boolean);
129
+ const bounds = computeUnionBounds(shapes, editor.registry);
130
+ if (bounds) {
131
+ editor.camera.fitToBounds(bounds, getViewportSize(editor));
132
+ }
133
+ }
134
+ export function executeCommand(command, editor) {
135
+ if (command === 'select-all')
136
+ return editor.selectAll();
137
+ if (command === 'clear-selection') {
138
+ if (editor.gesture.isActive) {
139
+ editor.gesture.cancel();
140
+ return;
141
+ }
142
+ return editor.clearSelection();
143
+ }
144
+ if (command === 'cycle-forward')
145
+ return editor.cycleSelection('forward');
146
+ if (command === 'cycle-backward')
147
+ return editor.cycleSelection('backward');
148
+ if (command === 'nudge-up')
149
+ return nudge(editor, 'up', 1);
150
+ if (command === 'nudge-down')
151
+ return nudge(editor, 'down', 1);
152
+ if (command === 'nudge-left')
153
+ return nudge(editor, 'left', 1);
154
+ if (command === 'nudge-right')
155
+ return nudge(editor, 'right', 1);
156
+ if (command === 'nudge-up-big')
157
+ return nudge(editor, 'up', 10);
158
+ if (command === 'nudge-down-big')
159
+ return nudge(editor, 'down', 10);
160
+ if (command === 'nudge-left-big')
161
+ return nudge(editor, 'left', 10);
162
+ if (command === 'nudge-right-big')
163
+ return nudge(editor, 'right', 10);
164
+ if (command === 'delete')
165
+ return deleteSelection(editor);
166
+ if (command === 'duplicate')
167
+ return duplicateSelection(editor);
168
+ if (command === 'clipboard-copy')
169
+ return clipboardCopy(editor);
170
+ if (command === 'clipboard-cut')
171
+ return clipboardCut(editor);
172
+ if (command === 'clipboard-paste')
173
+ return clipboardPaste(editor);
174
+ if (command === 'undo')
175
+ return void editor.undo();
176
+ if (command === 'redo')
177
+ return void editor.redo();
178
+ if (command === 'zoom-reset')
179
+ return void editor.camera.reset();
180
+ if (command === 'zoom-fit')
181
+ return zoomFit(editor);
182
+ if (command === 'zoom-selection')
183
+ return zoomSelection(editor);
184
+ if (command === 'bring-to-front')
185
+ return editor.store.reorderShapes('front', editor.selection);
186
+ if (command === 'send-to-back')
187
+ return editor.store.reorderShapes('back', editor.selection);
188
+ if (command === 'bring-forward')
189
+ return editor.store.reorderShapes('forward', editor.selection);
190
+ if (command === 'send-backward')
191
+ return editor.store.reorderShapes('backward', editor.selection);
192
+ if (command.startsWith('tool-'))
193
+ return editor.setTool(command.slice(5));
194
+ }
195
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/input/commands.ts"],"names":[],"mappings":"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"}