@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,9 @@
1
+ import type { Bounds, Point } from '@open-draw/schema';
2
+ export type HandleType = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w' | 'rotate';
3
+ export interface HandleDescriptor {
4
+ readonly type: HandleType;
5
+ readonly point: Point;
6
+ readonly cursor: string;
7
+ }
8
+ export declare function getHandleDescriptors(bounds: Bounds, rotateOffset?: number): readonly HandleDescriptor[];
9
+ //# sourceMappingURL=handles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handles.d.ts","sourceRoot":"","sources":["../../src/selection/handles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,UAAU,GAClB,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,IAAI,GACJ,GAAG,GACH,QAAQ,CAAC;AAEb,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,SAAK,GAAG,SAAS,gBAAgB,EAAE,CAkBnG"}
@@ -0,0 +1,19 @@
1
+ export function getHandleDescriptors(bounds, rotateOffset = 24) {
2
+ const { x, y, width, height } = bounds;
3
+ const midX = x + width / 2;
4
+ const midY = y + height / 2;
5
+ const right = x + width;
6
+ const bottom = y + height;
7
+ return [
8
+ { type: 'nw', point: { x, y }, cursor: 'nwse-resize' },
9
+ { type: 'n', point: { x: midX, y }, cursor: 'ns-resize' },
10
+ { type: 'ne', point: { x: right, y }, cursor: 'nesw-resize' },
11
+ { type: 'e', point: { x: right, y: midY }, cursor: 'ew-resize' },
12
+ { type: 'se', point: { x: right, y: bottom }, cursor: 'nwse-resize' },
13
+ { type: 's', point: { x: midX, y: bottom }, cursor: 'ns-resize' },
14
+ { type: 'sw', point: { x, y: bottom }, cursor: 'nesw-resize' },
15
+ { type: 'w', point: { x, y: midY }, cursor: 'ew-resize' },
16
+ { type: 'rotate', point: { x: midX, y: y - rotateOffset }, cursor: 'grab' },
17
+ ];
18
+ }
19
+ //# sourceMappingURL=handles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handles.js","sourceRoot":"","sources":["../../src/selection/handles.ts"],"names":[],"mappings":"AAmBA,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,YAAY,GAAG,EAAE;IACpE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC;IAE1B,OAAO;QACL,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QACtD,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACzD,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QAC7D,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QAChE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QACrE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACjE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE;QAC9D,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;QACzD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;KAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Bounds, Camera } from '@open-draw/schema';
2
+ export declare function renderHandles(slot: SVGGElement, localBounds: Bounds, camera?: Camera): SVGGElement;
3
+ export declare function removeHandles(slot: SVGGElement): void;
4
+ //# sourceMappingURL=handlesView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlesView.d.ts","sourceRoot":"","sources":["../../src/selection/handlesView.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAOxD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,MAAgC,GACvC,WAAW,CAuDb;AA0CD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAGrD"}
@@ -0,0 +1,98 @@
1
+ import { getHandleDescriptors } from './handles.js';
2
+ const SVG_NS = 'http://www.w3.org/2000/svg';
3
+ const BASE_HANDLE_SIZE = 8;
4
+ const BASE_ROTATE_OFFSET = 24;
5
+ export function renderHandles(slot, localBounds, camera = { x: 0, y: 0, zoom: 1 }) {
6
+ const handleScale = 1 / camera.zoom; // EXEMPTION: counter-scaling handles for constant screen size per §3.2
7
+ const size = BASE_HANDLE_SIZE * handleScale;
8
+ const half = size / 2;
9
+ const rotOffset = BASE_ROTATE_OFFSET * handleScale;
10
+ let frame = slot.querySelector(':scope > .od-selection-frame');
11
+ if (!frame) {
12
+ frame = document.createElementNS(SVG_NS, 'g');
13
+ frame.setAttribute('class', 'od-selection-frame');
14
+ slot.appendChild(frame);
15
+ }
16
+ // 1. Selection outline
17
+ let outline = frame.querySelector(':scope > .od-selection-outline');
18
+ if (!outline) {
19
+ outline = document.createElementNS(SVG_NS, 'rect');
20
+ outline.setAttribute('class', 'od-selection-outline');
21
+ outline.setAttribute('fill', 'none');
22
+ outline.setAttribute('stroke', '#3b82f6');
23
+ outline.setAttribute('stroke-width', '1.5');
24
+ outline.setAttribute('pointer-events', 'none');
25
+ outline.setAttribute('vector-effect', 'non-scaling-stroke');
26
+ frame.appendChild(outline);
27
+ }
28
+ outline.setAttribute('x', String(localBounds.x));
29
+ outline.setAttribute('y', String(localBounds.y));
30
+ outline.setAttribute('width', String(Math.max(1, localBounds.width)));
31
+ outline.setAttribute('height', String(Math.max(1, localBounds.height)));
32
+ // 2. Connector line to rotate handle
33
+ const midX = localBounds.x + localBounds.width / 2;
34
+ const rotY = localBounds.y - rotOffset;
35
+ let connector = frame.querySelector(':scope > .od-handle-connector');
36
+ if (!connector) {
37
+ connector = document.createElementNS(SVG_NS, 'line');
38
+ connector.setAttribute('class', 'od-handle-connector');
39
+ connector.setAttribute('stroke', '#3b82f6');
40
+ connector.setAttribute('stroke-width', '1');
41
+ connector.setAttribute('vector-effect', 'non-scaling-stroke');
42
+ connector.setAttribute('pointer-events', 'none');
43
+ frame.appendChild(connector);
44
+ }
45
+ connector.setAttribute('x1', String(midX));
46
+ connector.setAttribute('y1', String(localBounds.y));
47
+ connector.setAttribute('x2', String(midX));
48
+ connector.setAttribute('y2', String(rotY));
49
+ // 3. Handles
50
+ const descriptors = getHandleDescriptors(localBounds, rotOffset);
51
+ for (const d of descriptors) {
52
+ _renderHandle(frame, d, size, half);
53
+ }
54
+ return frame;
55
+ }
56
+ function _renderHandle(frame, d, size, half) {
57
+ if (d.type === 'rotate') {
58
+ let circle = frame.querySelector(':scope > .od-handle-rotate');
59
+ if (!circle) {
60
+ circle = document.createElementNS(SVG_NS, 'circle');
61
+ circle.setAttribute('class', 'od-handle od-handle-rotate');
62
+ circle.setAttribute('data-handle', 'rotate');
63
+ circle.setAttribute('fill', '#ffffff');
64
+ circle.setAttribute('stroke', '#3b82f6');
65
+ circle.setAttribute('stroke-width', '1.5');
66
+ circle.setAttribute('vector-effect', 'non-scaling-stroke');
67
+ circle.style.pointerEvents = 'auto';
68
+ circle.style.cursor = d.cursor;
69
+ frame.appendChild(circle);
70
+ }
71
+ circle.setAttribute('cx', String(d.point.x));
72
+ circle.setAttribute('cy', String(d.point.y));
73
+ circle.setAttribute('r', String(half));
74
+ return;
75
+ }
76
+ let rect = frame.querySelector(`:scope > .od-handle-${d.type}`);
77
+ if (!rect) {
78
+ rect = document.createElementNS(SVG_NS, 'rect');
79
+ rect.setAttribute('class', `od-handle od-handle-${d.type}`);
80
+ rect.setAttribute('data-handle', d.type);
81
+ rect.setAttribute('fill', '#ffffff');
82
+ rect.setAttribute('stroke', '#3b82f6');
83
+ rect.setAttribute('stroke-width', '1.5');
84
+ rect.setAttribute('vector-effect', 'non-scaling-stroke');
85
+ rect.style.pointerEvents = 'auto';
86
+ rect.style.cursor = d.cursor;
87
+ frame.appendChild(rect);
88
+ }
89
+ rect.setAttribute('x', String(d.point.x - half));
90
+ rect.setAttribute('y', String(d.point.y - half));
91
+ rect.setAttribute('width', String(size));
92
+ rect.setAttribute('height', String(size));
93
+ }
94
+ export function removeHandles(slot) {
95
+ const frame = slot.querySelector(':scope > .od-selection-frame');
96
+ frame?.remove();
97
+ }
98
+ //# sourceMappingURL=handlesView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handlesView.js","sourceRoot":"","sources":["../../src/selection/handlesView.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from './defs.js';
2
+ export * from './manager.js';
3
+ export * from './group.js';
4
+ export * from './marquee.js';
5
+ export * from './handles.js';
6
+ export * from './resize.js';
7
+ export * from './rotate.js';
8
+ export * from './handlesView.js';
9
+ export * from './reparent.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/selection/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,10 @@
1
+ export * from './defs.js';
2
+ export * from './manager.js';
3
+ export * from './group.js';
4
+ export * from './marquee.js';
5
+ export * from './handles.js';
6
+ export * from './resize.js';
7
+ export * from './rotate.js';
8
+ export * from './handlesView.js';
9
+ export * from './reparent.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/selection/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { Camera, ShapeId, ShapeRecord } from '@open-draw/schema';
2
+ import type { ShapeRegistry } from '../registry.js';
3
+ import type { SVGRenderer } from '../renderer.js';
4
+ import type { CanvasStore } from '../store/index.js';
5
+ import type { SelectionListener } from './defs.js';
6
+ export declare class SelectionManager {
7
+ private selectedIds;
8
+ private listeners;
9
+ private prevRenderedIds;
10
+ get selection(): readonly ShapeId[];
11
+ setSelection(ids: readonly ShapeId[]): void;
12
+ select(id: ShapeId): void;
13
+ toggle(id: ShapeId): void;
14
+ add(ids: readonly ShapeId[]): void;
15
+ remove(ids: readonly ShapeId[]): void;
16
+ clear(): void;
17
+ selectAll(shapes: readonly ShapeRecord[]): void;
18
+ cycleZOrder(shapes: readonly ShapeRecord[], direction?: 'forward' | 'backward'): void;
19
+ isSelected(id: ShapeId): boolean;
20
+ subscribe(listener: SelectionListener): () => void;
21
+ updateVisuals(renderer: SVGRenderer, store: CanvasStore, registry: ShapeRegistry, camera?: Camera): void;
22
+ private _renderSingleSelection;
23
+ private _computeBounds;
24
+ private _renderOutline;
25
+ private _removeOutline;
26
+ private _notify;
27
+ private _arraysEqual;
28
+ }
29
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/selection/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,SAAS,CAAqC;IACtD,OAAO,CAAC,eAAe,CAA2B;IAElD,IAAI,SAAS,IAAI,SAAS,OAAO,EAAE,CAElC;IAED,YAAY,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAK1C;IAED,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAExB;IAED,MAAM,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAMxB;IAED,GAAG,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAEjC;IAED,MAAM,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,CAGpC;IAED,KAAK,IAAI,IAAI,CAEZ;IAED,SAAS,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAG9C;IAED,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,GAAE,SAAS,GAAG,UAAsB,GAAG,IAAI,CAuB/F;IAED,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAE/B;IAED,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAGjD;IAED,aAAa,CACX,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAgCN;IAED,OAAO,CAAC,sBAAsB;IAsB9B,OAAO,CAAC,cAAc;IAgCtB,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,OAAO;IAMf,OAAO,CAAC,YAAY;CAOrB"}
@@ -0,0 +1,195 @@
1
+ import { renderHandles, removeHandles } from './handlesView.js';
2
+ export class SelectionManager {
3
+ selectedIds = [];
4
+ listeners = new Set();
5
+ prevRenderedIds = new Set();
6
+ get selection() {
7
+ return this.selectedIds;
8
+ }
9
+ setSelection(ids) {
10
+ const next = Array.from(new Set(ids));
11
+ if (this._arraysEqual(this.selectedIds, next))
12
+ return;
13
+ this.selectedIds = next;
14
+ this._notify();
15
+ }
16
+ select(id) {
17
+ this.setSelection([id]);
18
+ }
19
+ toggle(id) {
20
+ if (this.selectedIds.includes(id)) {
21
+ this.setSelection(this.selectedIds.filter((item) => item !== id));
22
+ }
23
+ else {
24
+ this.setSelection([...this.selectedIds, id]);
25
+ }
26
+ }
27
+ add(ids) {
28
+ this.setSelection([...this.selectedIds, ...ids]);
29
+ }
30
+ remove(ids) {
31
+ const toRemove = new Set(ids);
32
+ this.setSelection(this.selectedIds.filter((id) => !toRemove.has(id)));
33
+ }
34
+ clear() {
35
+ this.setSelection([]);
36
+ }
37
+ selectAll(shapes) {
38
+ const visibleIds = shapes.filter((s) => !s.hidden).map((s) => s.id);
39
+ this.setSelection(visibleIds);
40
+ }
41
+ cycleZOrder(shapes, direction = 'forward') {
42
+ const visible = shapes.filter((s) => !s.hidden);
43
+ if (visible.length === 0)
44
+ return;
45
+ if (this.selectedIds.length === 0) {
46
+ const target = direction === 'forward' ? visible[0] : visible[visible.length - 1];
47
+ this.select(target.id);
48
+ return;
49
+ }
50
+ const currentId = this.selectedIds[this.selectedIds.length - 1];
51
+ const currentIndex = visible.findIndex((s) => s.id === currentId);
52
+ let nextIndex;
53
+ if (currentIndex === -1) {
54
+ nextIndex = 0;
55
+ }
56
+ else if (direction === 'forward') {
57
+ nextIndex = (currentIndex + 1) % visible.length;
58
+ }
59
+ else {
60
+ nextIndex = (currentIndex - 1 + visible.length) % visible.length;
61
+ }
62
+ this.select(visible[nextIndex].id);
63
+ }
64
+ isSelected(id) {
65
+ return this.selectedIds.includes(id);
66
+ }
67
+ subscribe(listener) {
68
+ this.listeners.add(listener);
69
+ return () => this.listeners.delete(listener);
70
+ }
71
+ updateVisuals(renderer, store, registry, camera) {
72
+ const idsToRender = new Set();
73
+ for (const id of this.selectedIds) {
74
+ idsToRender.add(id);
75
+ const shape = store.getShape(id);
76
+ if (shape) {
77
+ const def = registry.get(shape.type);
78
+ if (def?.capabilities?.group?.isGroup) {
79
+ const members = def.capabilities.group.getMembers ? def.capabilities.group.getMembers(shape) : [];
80
+ for (const m of members)
81
+ idsToRender.add(m);
82
+ }
83
+ }
84
+ }
85
+ for (const prevId of this.prevRenderedIds) {
86
+ if (!idsToRender.has(prevId)) {
87
+ this._removeOutline(renderer, prevId);
88
+ }
89
+ }
90
+ const singleSelectedId = this.selectedIds.length === 1 ? this.selectedIds[0] : null;
91
+ for (const id of idsToRender) {
92
+ if (id === singleSelectedId) {
93
+ this._renderSingleSelection(renderer, store, registry, id, camera);
94
+ }
95
+ else {
96
+ this._renderOutline(renderer, store, registry, id);
97
+ }
98
+ }
99
+ this.prevRenderedIds = idsToRender;
100
+ }
101
+ _renderSingleSelection(renderer, store, registry, id, camera) {
102
+ const slot = renderer.getOverlaySlot(id);
103
+ const shape = renderer.getShapeRecord(id) ?? store.getShape(id);
104
+ if (!slot || !shape)
105
+ return;
106
+ const legacy = slot.querySelector(':scope > .od-selection-outline');
107
+ legacy?.remove();
108
+ const bounds = this._computeBounds(shape, store, registry, renderer);
109
+ if (!bounds)
110
+ return;
111
+ const lx = bounds.x - shape.x;
112
+ const ly = bounds.y - shape.y;
113
+ renderHandles(slot, { x: lx, y: ly, width: bounds.width, height: bounds.height }, camera);
114
+ }
115
+ _computeBounds(shape, store, registry, renderer) {
116
+ const def = registry.get(shape.type);
117
+ if (!def)
118
+ return null;
119
+ let bounds = def.geometry.bounds(shape);
120
+ if (def.capabilities?.group?.isGroup) {
121
+ const members = def.capabilities.group.getMembers ? def.capabilities.group.getMembers(shape) : [];
122
+ const memberShapes = members
123
+ .map((mid) => (renderer ? renderer.getShapeRecord(mid) : null) ?? store.getShape(mid))
124
+ .filter(Boolean);
125
+ if (memberShapes.length > 0) {
126
+ let minX = Infinity;
127
+ let minY = Infinity;
128
+ let maxX = -Infinity;
129
+ let maxY = -Infinity;
130
+ for (const m of memberShapes) {
131
+ const mDef = registry.get(m.type);
132
+ if (!mDef)
133
+ continue;
134
+ const mb = mDef.geometry.bounds(m);
135
+ minX = Math.min(minX, mb.x);
136
+ minY = Math.min(minY, mb.y);
137
+ maxX = Math.max(maxX, mb.x + mb.width);
138
+ maxY = Math.max(maxY, mb.y + mb.height);
139
+ }
140
+ if (minX !== Infinity) {
141
+ bounds = { x: minX, y: minY, width: maxX - minX, height: maxY - minY };
142
+ }
143
+ }
144
+ }
145
+ return bounds;
146
+ }
147
+ _renderOutline(renderer, store, registry, id) {
148
+ const slot = renderer.getOverlaySlot(id);
149
+ const shape = renderer.getShapeRecord(id) ?? store.getShape(id);
150
+ if (!slot || !shape)
151
+ return;
152
+ const bounds = this._computeBounds(shape, store, registry, renderer);
153
+ if (!bounds)
154
+ return;
155
+ const lx = bounds.x - shape.x;
156
+ const ly = bounds.y - shape.y;
157
+ let outline = slot.querySelector(':scope > .od-selection-outline');
158
+ if (!outline) {
159
+ outline = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
160
+ outline.setAttribute('class', 'od-selection-outline');
161
+ outline.setAttribute('fill', 'none');
162
+ outline.setAttribute('stroke', '#3b82f6');
163
+ outline.setAttribute('stroke-width', '1.5');
164
+ outline.setAttribute('pointer-events', 'none');
165
+ slot.appendChild(outline);
166
+ }
167
+ outline.setAttribute('x', String(lx - 2));
168
+ outline.setAttribute('y', String(ly - 2));
169
+ outline.setAttribute('width', String(Math.max(1, bounds.width + 4)));
170
+ outline.setAttribute('height', String(Math.max(1, bounds.height + 4)));
171
+ }
172
+ _removeOutline(renderer, id) {
173
+ const slot = renderer.getOverlaySlot(id);
174
+ if (!slot)
175
+ return;
176
+ const outline = slot.querySelector(':scope > .od-selection-outline');
177
+ outline?.remove();
178
+ removeHandles(slot);
179
+ }
180
+ _notify() {
181
+ for (const listener of this.listeners) {
182
+ listener(this.selectedIds);
183
+ }
184
+ }
185
+ _arraysEqual(a, b) {
186
+ if (a.length !== b.length)
187
+ return false;
188
+ for (let i = 0; i < a.length; i++) {
189
+ if (a[i] !== b[i])
190
+ return false;
191
+ }
192
+ return true;
193
+ }
194
+ }
195
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/selection/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Bounds, Point, ShapeId } from '@open-draw/schema';
2
+ import type { ShapeRegistry } from '../registry.js';
3
+ import type { CanvasStore } from '../store/index.js';
4
+ export declare function computeMarqueeBounds(start: Point, current: Point): Bounds;
5
+ export declare function findIntersectingShapes(box: Bounds, store: CanvasStore, registry: ShapeRegistry): readonly ShapeId[];
6
+ export declare class MarqueeOverlay {
7
+ private el;
8
+ show(container: HTMLElement, bounds: Bounds): void;
9
+ hide(): void;
10
+ }
11
+ //# sourceMappingURL=marquee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee.d.ts","sourceRoot":"","sources":["../../src/selection/marquee.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,GAAG,MAAM,CAMzE;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,GACtB,SAAS,OAAO,EAAE,CAYpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA+B;IAEzC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAmBjD;IAED,IAAI,IAAI,IAAI,CAKX;CACF"}
@@ -0,0 +1,52 @@
1
+ import { boundsIntersect, boundsOf } from '@open-draw/schema';
2
+ export function computeMarqueeBounds(start, current) {
3
+ const x = Math.min(start.x, current.x);
4
+ const y = Math.min(start.y, current.y);
5
+ const width = Math.abs(current.x - start.x);
6
+ const height = Math.abs(current.y - start.y);
7
+ return boundsOf(x, y, width, height);
8
+ }
9
+ export function findIntersectingShapes(box, store, registry) {
10
+ const hitIds = [];
11
+ for (const shape of store.listShapes()) {
12
+ if (shape.hidden)
13
+ continue;
14
+ const def = registry.get(shape.type);
15
+ if (!def)
16
+ continue;
17
+ const shapeBounds = def.geometry.bounds(shape);
18
+ if (boundsIntersect(box, shapeBounds)) {
19
+ hitIds.push(shape.id);
20
+ }
21
+ }
22
+ return hitIds;
23
+ }
24
+ export class MarqueeOverlay {
25
+ el = null;
26
+ show(container, bounds) {
27
+ const viewport = container.querySelector('.od-viewport');
28
+ if (!viewport)
29
+ return;
30
+ if (!this.el) {
31
+ this.el = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
32
+ this.el.setAttribute('class', 'od-marquee');
33
+ this.el.setAttribute('fill', 'rgba(59, 130, 246, 0.1)');
34
+ this.el.setAttribute('stroke', '#3b82f6');
35
+ this.el.setAttribute('stroke-width', '1');
36
+ this.el.setAttribute('stroke-dasharray', '3 3');
37
+ this.el.setAttribute('pointer-events', 'none');
38
+ viewport.appendChild(this.el);
39
+ }
40
+ this.el.setAttribute('x', String(bounds.x));
41
+ this.el.setAttribute('y', String(bounds.y));
42
+ this.el.setAttribute('width', String(bounds.width));
43
+ this.el.setAttribute('height', String(bounds.height));
44
+ }
45
+ hide() {
46
+ if (this.el) {
47
+ this.el.remove();
48
+ this.el = null;
49
+ }
50
+ }
51
+ }
52
+ //# sourceMappingURL=marquee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marquee.js","sourceRoot":"","sources":["../../src/selection/marquee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ShapeId } from '@open-draw/schema';
2
+ import type { ShapeRegistry } from '../registry.js';
3
+ import type { CanvasStore } from '../store/index.js';
4
+ import type { CameraController } from '../camera.js';
5
+ /**
6
+ * Handles gesture-based re-parenting and detaching when dragging shapes (§5).
7
+ * - Dragging a shape OUT of its frame past bounds + threshold (12px screen) detaches it.
8
+ * - Dropping a shape fully inside another frame parents it (smallest-area wins on overlap).
9
+ * - Dragging between frames (out of A, into B) executes as a single atomic transaction.
10
+ */
11
+ export declare function handleGestureReparent(shapeId: ShapeId, store: CanvasStore, registry: ShapeRegistry, camera: CameraController): void;
12
+ //# sourceMappingURL=reparent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reparent.d.ts","sourceRoot":"","sources":["../../src/selection/reparent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,gBAAgB,GACvB,IAAI,CAmDN"}
@@ -0,0 +1,57 @@
1
+ import { findSuggestedParent } from '../capabilities/clipping/index.js';
2
+ /**
3
+ * Handles gesture-based re-parenting and detaching when dragging shapes (§5).
4
+ * - Dragging a shape OUT of its frame past bounds + threshold (12px screen) detaches it.
5
+ * - Dropping a shape fully inside another frame parents it (smallest-area wins on overlap).
6
+ * - Dragging between frames (out of A, into B) executes as a single atomic transaction.
7
+ */
8
+ export function handleGestureReparent(shapeId, store, registry, camera) {
9
+ const shape = store.getShape(shapeId);
10
+ if (!shape)
11
+ return;
12
+ const def = registry.get(shape.type);
13
+ if (!def)
14
+ return;
15
+ const bounds = def.geometry.bounds(shape);
16
+ const currentParentId = (shape.meta['parent'] ?? shape.meta['parentId']);
17
+ // 1. Check if dropped fully inside any frame (smallest area candidate wins)
18
+ const suggested = findSuggestedParent(bounds, store.listShapes(), registry, shape.id);
19
+ if (suggested) {
20
+ if (suggested.id !== currentParentId) {
21
+ store.updateShape(shape.id, {
22
+ meta: { ...shape.meta, parent: suggested.id, parentId: undefined },
23
+ });
24
+ }
25
+ return;
26
+ }
27
+ // 2. If it was inside a parent, check if dragged past threshold to detach
28
+ if (currentParentId) {
29
+ const parent = store.getShape(currentParentId);
30
+ if (!parent) {
31
+ _detach(shape, store);
32
+ return;
33
+ }
34
+ const parentDef = registry.get(parent.type);
35
+ if (!parentDef) {
36
+ _detach(shape, store);
37
+ return;
38
+ }
39
+ const parentBounds = parentDef.geometry.bounds(parent);
40
+ const p0 = camera.screenToPage({ x: 0, y: 0 });
41
+ const p1 = camera.screenToPage({ x: 12, y: 0 });
42
+ const threshold = Math.abs(p1.x - p0.x);
43
+ const isPastThreshold = bounds.x < parentBounds.x - threshold ||
44
+ bounds.y < parentBounds.y - threshold ||
45
+ bounds.x + bounds.width > parentBounds.x + parentBounds.width + threshold ||
46
+ bounds.y + bounds.height > parentBounds.y + parentBounds.height + threshold;
47
+ if (isPastThreshold) {
48
+ _detach(shape, store);
49
+ }
50
+ }
51
+ }
52
+ function _detach(shape, store) {
53
+ store.updateShape(shape.id, {
54
+ meta: { ...shape.meta, parent: undefined, parentId: undefined },
55
+ });
56
+ }
57
+ //# sourceMappingURL=reparent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reparent.js","sourceRoot":"","sources":["../../src/selection/reparent.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAgB,EAChB,KAAkB,EAClB,QAAuB,EACvB,MAAwB;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAuB,CAAC;IAE/F,4EAA4E;IAC5E,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;IAEtF,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,SAAS,CAAC,EAAE,KAAK,eAAe,EAAE,CAAC;YACrC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE;gBAC1B,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE;aACnE,CAAC,CAAC;QACL,CAAC;QACD,OAAO;IACT,CAAC;IAED,0EAA0E;IAC1E,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,eAAe,GACnB,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,SAAS;YACrC,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,GAAG,SAAS;YACrC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,KAAK,GAAG,SAAS;YACzE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC;QAE9E,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,KAAkB,EAAE,KAAkB;IACrD,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE;QAC1B,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE;KAChE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Bounds } from '@open-draw/schema';
2
+ import type { HandleType } from './handles.js';
3
+ export interface ResizeOptions {
4
+ readonly aspect?: boolean;
5
+ readonly fromCenter?: boolean;
6
+ readonly minW?: number;
7
+ readonly minH?: number;
8
+ }
9
+ export declare function resizeBounds(initial: Bounds, handle: HandleType, dx: number, dy: number, options?: ResizeOptions): Bounds;
10
+ //# sourceMappingURL=resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize.d.ts","sourceRoot":"","sources":["../../src/selection/resize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,aAAkB,GAC1B,MAAM,CAqER"}