kritzel-stencil 0.0.171 → 0.1.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 (406) hide show
  1. package/dist/cjs/app-globals-V2Kpy_OQ.js +0 -3
  2. package/dist/cjs/{default-line-tool.config-JuTDR6PF.js → default-line-tool.config-7eJND6Jb.js} +1516 -206
  3. package/dist/cjs/index-BeKMS-Zt.js +3280 -0
  4. package/dist/cjs/index.cjs.js +10 -7
  5. package/dist/cjs/kritzel-brush-style.cjs.entry.js +4 -5
  6. package/dist/cjs/kritzel-color_22.cjs.entry.js +291 -106
  7. package/dist/cjs/loader.cjs.js +2 -3
  8. package/dist/cjs/stencil.cjs.js +3 -4
  9. package/dist/collection/classes/core/core.class.js +0 -1
  10. package/dist/collection/classes/core/reviver.class.js +0 -1
  11. package/dist/collection/classes/core/store.class.js +0 -1
  12. package/dist/collection/classes/core/viewport.class.js +0 -1
  13. package/dist/collection/classes/core/workspace.class.js +0 -1
  14. package/dist/collection/classes/handlers/base.handler.js +0 -1
  15. package/dist/collection/classes/handlers/context-menu.handler.js +0 -1
  16. package/dist/collection/classes/handlers/hover.handler.js +0 -1
  17. package/dist/collection/classes/handlers/key.handler.js +0 -1
  18. package/dist/collection/classes/handlers/line-handle.handler.js +0 -1
  19. package/dist/collection/classes/handlers/move.handler.js +0 -1
  20. package/dist/collection/classes/handlers/resize.handler.js +0 -1
  21. package/dist/collection/classes/handlers/rotation.handler.js +0 -1
  22. package/dist/collection/classes/handlers/selection.handler.js +0 -1
  23. package/dist/collection/classes/managers/anchor.manager.js +0 -1
  24. package/dist/collection/classes/managers/cursor.manager.js +0 -1
  25. package/dist/collection/classes/objects/base-object.class.js +0 -1
  26. package/dist/collection/classes/objects/custom-element.class.js +0 -1
  27. package/dist/collection/classes/objects/group.class.js +0 -1
  28. package/dist/collection/classes/objects/image.class.js +0 -1
  29. package/dist/collection/classes/objects/line.class.js +0 -1
  30. package/dist/collection/classes/objects/path.class.js +0 -1
  31. package/dist/collection/classes/objects/selection-box.class.js +0 -1
  32. package/dist/collection/classes/objects/selection-group.class.js +0 -1
  33. package/dist/collection/classes/objects/shape.class.js +0 -1
  34. package/dist/collection/classes/objects/text.class.js +0 -1
  35. package/dist/collection/classes/providers/broadcast-sync-provider.class.js +0 -1
  36. package/dist/collection/classes/providers/hocuspocus-sync-provider.class.js +0 -1
  37. package/dist/collection/classes/providers/indexeddb-sync-provider.class.js +0 -1
  38. package/dist/collection/classes/providers/websocket-sync-provider.class.js +0 -1
  39. package/dist/collection/classes/registries/icon-registry.class.js +0 -1
  40. package/dist/collection/classes/registries/tool.registry.js +0 -1
  41. package/dist/collection/classes/structures/app-state-map.structure.js +0 -1
  42. package/dist/collection/classes/structures/object-map.structure.js +0 -1
  43. package/dist/collection/classes/structures/quadtree.structure.js +0 -1
  44. package/dist/collection/classes/tools/base-tool.class.js +0 -1
  45. package/dist/collection/classes/tools/brush-tool.class.js +0 -1
  46. package/dist/collection/classes/tools/eraser-tool.class.js +0 -1
  47. package/dist/collection/classes/tools/image-tool.class.js +0 -1
  48. package/dist/collection/classes/tools/line-tool.class.js +0 -1
  49. package/dist/collection/classes/tools/selection-tool.class.js +0 -1
  50. package/dist/collection/classes/tools/shape-tool.class.js +0 -1
  51. package/dist/collection/classes/tools/text-tool.class.js +0 -1
  52. package/dist/collection/collection-manifest.json +2 -2
  53. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -2
  54. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +2 -3
  55. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +6 -7
  56. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js +1 -2
  57. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -3
  58. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +8 -3
  59. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +151 -21
  60. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js +192 -23
  61. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -2
  62. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -2
  63. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +8 -3
  64. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.js +0 -1
  65. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -2
  66. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -3
  67. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -2
  68. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -2
  69. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -2
  70. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +2 -3
  71. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -2
  72. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -3
  73. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -3
  74. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +1 -2
  75. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -4
  76. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -2
  77. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +0 -1
  78. package/dist/collection/configs/default-brush-tool.config.js +0 -1
  79. package/dist/collection/configs/default-engine-config.js +0 -1
  80. package/dist/collection/configs/default-line-tool.config.js +0 -1
  81. package/dist/collection/configs/default-shape-tool.config.js +0 -1
  82. package/dist/collection/configs/default-sync.config.js +0 -1
  83. package/dist/collection/configs/default-text-tool.config.js +0 -1
  84. package/dist/collection/constants/core.constants.js +0 -1
  85. package/dist/collection/constants/engine.constants.js +0 -1
  86. package/dist/collection/enums/event-button.enum.js +0 -1
  87. package/dist/collection/enums/handle-type.enum.js +0 -1
  88. package/dist/collection/enums/shape-type.enum.js +0 -1
  89. package/dist/collection/helpers/class.helper.js +0 -1
  90. package/dist/collection/helpers/cursor.helper.js +0 -1
  91. package/dist/collection/helpers/devices.helper.js +0 -1
  92. package/dist/collection/helpers/event.helper.js +0 -1
  93. package/dist/collection/helpers/geometry.helper.js +0 -1
  94. package/dist/collection/helpers/html.helper.js +0 -1
  95. package/dist/collection/helpers/keyboard.helper.js +0 -1
  96. package/dist/collection/helpers/math.helper.js +0 -1
  97. package/dist/collection/helpers/object.helper.js +0 -1
  98. package/dist/collection/index.js +0 -1
  99. package/dist/collection/interfaces/anchor.interface.js +0 -1
  100. package/dist/collection/interfaces/arrow-head.interface.js +0 -1
  101. package/dist/collection/interfaces/bounding-box.interface.js +0 -1
  102. package/dist/collection/interfaces/clonable.interface.js +0 -1
  103. package/dist/collection/interfaces/context-menu-item.interface.js +0 -1
  104. package/dist/collection/interfaces/debug-info.interface.js +0 -1
  105. package/dist/collection/interfaces/engine-state.interface.js +0 -1
  106. package/dist/collection/interfaces/line-options.interface.js +0 -1
  107. package/dist/collection/interfaces/menu-item.interface.js +0 -1
  108. package/dist/collection/interfaces/object.interface.js +0 -1
  109. package/dist/collection/interfaces/path-options.interface.js +0 -1
  110. package/dist/collection/interfaces/point.interface.js +0 -1
  111. package/dist/collection/interfaces/polygon.interface.js +0 -1
  112. package/dist/collection/interfaces/selection-state.interface.js +0 -1
  113. package/dist/collection/interfaces/serializable.interface.js +0 -1
  114. package/dist/collection/interfaces/shortcut.interface.js +0 -1
  115. package/dist/collection/interfaces/sync-config.interface.js +0 -1
  116. package/dist/collection/interfaces/sync-provider.interface.js +0 -1
  117. package/dist/collection/interfaces/tool.interface.js +0 -1
  118. package/dist/collection/interfaces/toolbar-control.interface.js +0 -1
  119. package/dist/collection/interfaces/undo-state.interface.js +0 -1
  120. package/dist/collection/types/deep-readonly.type.js +0 -1
  121. package/dist/collection/types/state.types.js +0 -1
  122. package/dist/components/index.d.ts +1 -0
  123. package/dist/components/index.js +1 -1477
  124. package/dist/components/kritzel-brush-style.js +1 -67
  125. package/dist/components/kritzel-color-palette.js +1 -9
  126. package/dist/components/kritzel-color.js +1 -9
  127. package/dist/components/kritzel-context-menu.js +1 -9
  128. package/dist/components/kritzel-control-brush-config.js +1 -9
  129. package/dist/components/kritzel-control-text-config.js +1 -9
  130. package/dist/components/kritzel-controls.js +1 -9
  131. package/dist/components/kritzel-cursor-trail.js +1 -9
  132. package/dist/components/kritzel-dropdown.js +1 -9
  133. package/dist/components/kritzel-editor.js +1 -605
  134. package/dist/components/kritzel-engine.js +1 -9
  135. package/dist/components/kritzel-font-family.js +1 -9
  136. package/dist/components/kritzel-font-size.js +1 -9
  137. package/dist/components/kritzel-font.js +1 -9
  138. package/dist/components/kritzel-icon.js +1 -9
  139. package/dist/components/kritzel-menu-item.js +1 -9
  140. package/dist/components/kritzel-menu.js +1 -9
  141. package/dist/components/kritzel-portal.js +1 -9
  142. package/dist/components/kritzel-split-button.js +1 -9
  143. package/dist/components/kritzel-stroke-size.js +1 -9
  144. package/dist/components/kritzel-tooltip.js +1 -9
  145. package/dist/components/kritzel-utility-panel.js +1 -9
  146. package/dist/components/kritzel-workspace-manager.js +1 -9
  147. package/dist/components/p-1z-ds26_.js +1 -0
  148. package/dist/components/p-4FEa4ADy.js +1 -0
  149. package/dist/components/p-B0kd2rUI.js +1 -16
  150. package/dist/components/p-B7Fdo5QJ.js +1 -0
  151. package/dist/components/p-BXaWhpO2.js +1 -0
  152. package/dist/components/p-Bj_Og27M.js +1 -0
  153. package/dist/components/p-BtuXeItZ.js +1 -0
  154. package/dist/components/p-C-d2IH4v.js +1 -0
  155. package/dist/components/p-C3UriJh7.js +1 -0
  156. package/dist/components/p-C4krHoUl.js +1 -0
  157. package/dist/components/p-C6qB08BS.js +1 -68
  158. package/dist/components/p-CF5L2Gdl.js +1 -0
  159. package/dist/components/p-CXzfYQ_u.js +1 -0
  160. package/dist/components/p-CeKT_dTd.js +1 -0
  161. package/dist/components/p-Cp15toXH.js +1 -0
  162. package/dist/components/p-Cy77SpWt.js +1 -0
  163. package/dist/components/p-D1tfzpy8.js +1 -0
  164. package/dist/components/p-D3LRBk2t.js +9 -0
  165. package/dist/components/p-D5ZsALCP.js +1 -0
  166. package/dist/components/p-D8W6LE-c.js +1 -11
  167. package/dist/components/p-DB5s1NY4.js +1 -0
  168. package/dist/components/p-DTezr6w9.js +1 -0
  169. package/dist/components/p-Du1vxHy8.js +1 -0
  170. package/dist/components/p-IAqZFssU.js +1 -0
  171. package/dist/components/p-g0N9j_uT.js +1 -0
  172. package/dist/components/p-l10It7Nm.js +1 -30
  173. package/dist/components/p-n789Y3S-.js +1 -45
  174. package/dist/esm/app-globals-DQuL1Twl.js +0 -3
  175. package/dist/esm/{default-line-tool.config-CuBm2vpW.js → default-line-tool.config-CD5sTKH-.js} +1515 -205
  176. package/dist/esm/index-BqhmuUH2.js +3253 -0
  177. package/dist/esm/index.js +11 -8
  178. package/dist/esm/kritzel-brush-style.entry.js +4 -5
  179. package/dist/esm/kritzel-color_22.entry.js +291 -106
  180. package/dist/esm/loader.js +3 -4
  181. package/dist/esm/stencil.js +4 -5
  182. package/dist/stencil/index.esm.js +1 -2
  183. package/dist/stencil/p-09295079.entry.js +1 -0
  184. package/dist/stencil/p-381c0e9c.entry.js +9 -0
  185. package/dist/stencil/p-BqhmuUH2.js +2 -0
  186. package/dist/stencil/p-CD5sTKH-.js +1 -0
  187. package/dist/stencil/p-DQuL1Twl.js +1 -2
  188. package/dist/stencil/stencil.esm.js +1 -2
  189. package/dist/types/components/shared/kritzel-color-palette/kritzel-color-palette.d.ts +1 -0
  190. package/dist/types/components/shared/kritzel-dropdown/kritzel-dropdown.d.ts +22 -3
  191. package/dist/types/components/shared/kritzel-font-size/kritzel-font-size.d.ts +1 -0
  192. package/dist/types/components.d.ts +2 -2
  193. package/dist/types/stencil-public-runtime.d.ts +57 -3
  194. package/package.json +6 -1
  195. package/dist/cjs/app-globals-V2Kpy_OQ.js.map +0 -1
  196. package/dist/cjs/default-line-tool.config-JuTDR6PF.js.map +0 -1
  197. package/dist/cjs/index-Cj__YTlG.js +0 -1650
  198. package/dist/cjs/index-Cj__YTlG.js.map +0 -1
  199. package/dist/cjs/index.cjs.js.map +0 -1
  200. package/dist/cjs/kritzel-brush-style.entry.cjs.js.map +0 -1
  201. package/dist/cjs/loader.cjs.js.map +0 -1
  202. package/dist/cjs/stencil.cjs.js.map +0 -1
  203. package/dist/collection/classes/core/core.class.js.map +0 -1
  204. package/dist/collection/classes/core/reviver.class.js.map +0 -1
  205. package/dist/collection/classes/core/store.class.js.map +0 -1
  206. package/dist/collection/classes/core/viewport.class.js.map +0 -1
  207. package/dist/collection/classes/core/workspace.class.js.map +0 -1
  208. package/dist/collection/classes/handlers/base.handler.js.map +0 -1
  209. package/dist/collection/classes/handlers/context-menu.handler.js.map +0 -1
  210. package/dist/collection/classes/handlers/hover.handler.js.map +0 -1
  211. package/dist/collection/classes/handlers/key.handler.js.map +0 -1
  212. package/dist/collection/classes/handlers/line-handle.handler.js.map +0 -1
  213. package/dist/collection/classes/handlers/move.handler.js.map +0 -1
  214. package/dist/collection/classes/handlers/resize.handler.js.map +0 -1
  215. package/dist/collection/classes/handlers/rotation.handler.js.map +0 -1
  216. package/dist/collection/classes/handlers/selection.handler.js.map +0 -1
  217. package/dist/collection/classes/managers/anchor.manager.js.map +0 -1
  218. package/dist/collection/classes/managers/cursor.manager.js.map +0 -1
  219. package/dist/collection/classes/objects/base-object.class.js.map +0 -1
  220. package/dist/collection/classes/objects/custom-element.class.js.map +0 -1
  221. package/dist/collection/classes/objects/group.class.js.map +0 -1
  222. package/dist/collection/classes/objects/image.class.js.map +0 -1
  223. package/dist/collection/classes/objects/line.class.js.map +0 -1
  224. package/dist/collection/classes/objects/path.class.js.map +0 -1
  225. package/dist/collection/classes/objects/selection-box.class.js.map +0 -1
  226. package/dist/collection/classes/objects/selection-group.class.js.map +0 -1
  227. package/dist/collection/classes/objects/shape.class.js.map +0 -1
  228. package/dist/collection/classes/objects/text.class.js.map +0 -1
  229. package/dist/collection/classes/providers/broadcast-sync-provider.class.js.map +0 -1
  230. package/dist/collection/classes/providers/hocuspocus-sync-provider.class.js.map +0 -1
  231. package/dist/collection/classes/providers/indexeddb-sync-provider.class.js.map +0 -1
  232. package/dist/collection/classes/providers/websocket-sync-provider.class.js.map +0 -1
  233. package/dist/collection/classes/registries/icon-registry.class.js.map +0 -1
  234. package/dist/collection/classes/registries/tool.registry.js.map +0 -1
  235. package/dist/collection/classes/structures/app-state-map.structure.js.map +0 -1
  236. package/dist/collection/classes/structures/object-map.structure.js.map +0 -1
  237. package/dist/collection/classes/structures/quadtree.structure.js.map +0 -1
  238. package/dist/collection/classes/tools/base-tool.class.js.map +0 -1
  239. package/dist/collection/classes/tools/brush-tool.class.js.map +0 -1
  240. package/dist/collection/classes/tools/eraser-tool.class.js.map +0 -1
  241. package/dist/collection/classes/tools/image-tool.class.js.map +0 -1
  242. package/dist/collection/classes/tools/line-tool.class.js.map +0 -1
  243. package/dist/collection/classes/tools/selection-tool.class.js.map +0 -1
  244. package/dist/collection/classes/tools/shape-tool.class.js.map +0 -1
  245. package/dist/collection/classes/tools/text-tool.class.js.map +0 -1
  246. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js.map +0 -1
  247. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +0 -1
  248. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +0 -1
  249. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js.map +0 -1
  250. package/dist/collection/components/shared/kritzel-color/kritzel-color.js.map +0 -1
  251. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js.map +0 -1
  252. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js.map +0 -1
  253. package/dist/collection/components/shared/kritzel-font/kritzel-font.js.map +0 -1
  254. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js.map +0 -1
  255. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js.map +0 -1
  256. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.js.map +0 -1
  257. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js.map +0 -1
  258. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js.map +0 -1
  259. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js.map +0 -1
  260. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js.map +0 -1
  261. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js.map +0 -1
  262. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js.map +0 -1
  263. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js.map +0 -1
  264. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js.map +0 -1
  265. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js.map +0 -1
  266. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +0 -1
  267. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js.map +0 -1
  268. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js.map +0 -1
  269. package/dist/collection/configs/default-brush-tool.config.js.map +0 -1
  270. package/dist/collection/configs/default-engine-config.js.map +0 -1
  271. package/dist/collection/configs/default-line-tool.config.js.map +0 -1
  272. package/dist/collection/configs/default-shape-tool.config.js.map +0 -1
  273. package/dist/collection/configs/default-sync.config.js.map +0 -1
  274. package/dist/collection/configs/default-text-tool.config.js.map +0 -1
  275. package/dist/collection/constants/core.constants.js.map +0 -1
  276. package/dist/collection/constants/engine.constants.js.map +0 -1
  277. package/dist/collection/enums/event-button.enum.js.map +0 -1
  278. package/dist/collection/enums/handle-type.enum.js.map +0 -1
  279. package/dist/collection/enums/shape-type.enum.js.map +0 -1
  280. package/dist/collection/helpers/class.helper.js.map +0 -1
  281. package/dist/collection/helpers/cursor.helper.js.map +0 -1
  282. package/dist/collection/helpers/devices.helper.js.map +0 -1
  283. package/dist/collection/helpers/event.helper.js.map +0 -1
  284. package/dist/collection/helpers/geometry.helper.js.map +0 -1
  285. package/dist/collection/helpers/html.helper.js.map +0 -1
  286. package/dist/collection/helpers/keyboard.helper.js.map +0 -1
  287. package/dist/collection/helpers/math.helper.js.map +0 -1
  288. package/dist/collection/helpers/object.helper.js.map +0 -1
  289. package/dist/collection/index.js.map +0 -1
  290. package/dist/collection/interfaces/anchor.interface.js.map +0 -1
  291. package/dist/collection/interfaces/arrow-head.interface.js.map +0 -1
  292. package/dist/collection/interfaces/bounding-box.interface.js.map +0 -1
  293. package/dist/collection/interfaces/clonable.interface.js.map +0 -1
  294. package/dist/collection/interfaces/context-menu-item.interface.js.map +0 -1
  295. package/dist/collection/interfaces/debug-info.interface.js.map +0 -1
  296. package/dist/collection/interfaces/engine-state.interface.js.map +0 -1
  297. package/dist/collection/interfaces/line-options.interface.js.map +0 -1
  298. package/dist/collection/interfaces/menu-item.interface.js.map +0 -1
  299. package/dist/collection/interfaces/object.interface.js.map +0 -1
  300. package/dist/collection/interfaces/path-options.interface.js.map +0 -1
  301. package/dist/collection/interfaces/point.interface.js.map +0 -1
  302. package/dist/collection/interfaces/polygon.interface.js.map +0 -1
  303. package/dist/collection/interfaces/selection-state.interface.js.map +0 -1
  304. package/dist/collection/interfaces/serializable.interface.js.map +0 -1
  305. package/dist/collection/interfaces/shortcut.interface.js.map +0 -1
  306. package/dist/collection/interfaces/sync-config.interface.js.map +0 -1
  307. package/dist/collection/interfaces/sync-provider.interface.js.map +0 -1
  308. package/dist/collection/interfaces/tool.interface.js.map +0 -1
  309. package/dist/collection/interfaces/toolbar-control.interface.js.map +0 -1
  310. package/dist/collection/interfaces/undo-state.interface.js.map +0 -1
  311. package/dist/collection/types/deep-readonly.type.js.map +0 -1
  312. package/dist/collection/types/state.types.js.map +0 -1
  313. package/dist/components/index.js.map +0 -1
  314. package/dist/components/kritzel-brush-style.js.map +0 -1
  315. package/dist/components/kritzel-color-palette.js.map +0 -1
  316. package/dist/components/kritzel-color.js.map +0 -1
  317. package/dist/components/kritzel-context-menu.js.map +0 -1
  318. package/dist/components/kritzel-control-brush-config.js.map +0 -1
  319. package/dist/components/kritzel-control-text-config.js.map +0 -1
  320. package/dist/components/kritzel-controls.js.map +0 -1
  321. package/dist/components/kritzel-cursor-trail.js.map +0 -1
  322. package/dist/components/kritzel-dropdown.js.map +0 -1
  323. package/dist/components/kritzel-editor.js.map +0 -1
  324. package/dist/components/kritzel-engine.js.map +0 -1
  325. package/dist/components/kritzel-font-family.js.map +0 -1
  326. package/dist/components/kritzel-font-size.js.map +0 -1
  327. package/dist/components/kritzel-font.js.map +0 -1
  328. package/dist/components/kritzel-icon.js.map +0 -1
  329. package/dist/components/kritzel-menu-item.js.map +0 -1
  330. package/dist/components/kritzel-menu.js.map +0 -1
  331. package/dist/components/kritzel-portal.js.map +0 -1
  332. package/dist/components/kritzel-split-button.js.map +0 -1
  333. package/dist/components/kritzel-stroke-size.js.map +0 -1
  334. package/dist/components/kritzel-tooltip.js.map +0 -1
  335. package/dist/components/kritzel-utility-panel.js.map +0 -1
  336. package/dist/components/kritzel-workspace-manager.js.map +0 -1
  337. package/dist/components/p-B0kd2rUI.js.map +0 -1
  338. package/dist/components/p-B6r22FSC.js +0 -57
  339. package/dist/components/p-B6r22FSC.js.map +0 -1
  340. package/dist/components/p-BUsg2vtg.js +0 -14897
  341. package/dist/components/p-BUsg2vtg.js.map +0 -1
  342. package/dist/components/p-B_3OZeom.js +0 -119
  343. package/dist/components/p-B_3OZeom.js.map +0 -1
  344. package/dist/components/p-BdwB-S9G.js +0 -130
  345. package/dist/components/p-BdwB-S9G.js.map +0 -1
  346. package/dist/components/p-BhLtP5Cg.js +0 -308
  347. package/dist/components/p-BhLtP5Cg.js.map +0 -1
  348. package/dist/components/p-Brd9SxWS.js +0 -73
  349. package/dist/components/p-Brd9SxWS.js.map +0 -1
  350. package/dist/components/p-C29Efgmc.js +0 -106
  351. package/dist/components/p-C29Efgmc.js.map +0 -1
  352. package/dist/components/p-C6-tSCMR.js +0 -272
  353. package/dist/components/p-C6-tSCMR.js.map +0 -1
  354. package/dist/components/p-C6qB08BS.js.map +0 -1
  355. package/dist/components/p-CFH6XRL5.js +0 -75
  356. package/dist/components/p-CFH6XRL5.js.map +0 -1
  357. package/dist/components/p-CIts5Uma.js +0 -110
  358. package/dist/components/p-CIts5Uma.js.map +0 -1
  359. package/dist/components/p-CO8bwl_3.js +0 -103
  360. package/dist/components/p-CO8bwl_3.js.map +0 -1
  361. package/dist/components/p-CRGwaUcp.js +0 -55
  362. package/dist/components/p-CRGwaUcp.js.map +0 -1
  363. package/dist/components/p-Ck4lGnmt.js +0 -46
  364. package/dist/components/p-Ck4lGnmt.js.map +0 -1
  365. package/dist/components/p-CwkUrTy1.js +0 -1367
  366. package/dist/components/p-CwkUrTy1.js.map +0 -1
  367. package/dist/components/p-D0UgEnEL.js +0 -39586
  368. package/dist/components/p-D0UgEnEL.js.map +0 -1
  369. package/dist/components/p-D8W6LE-c.js.map +0 -1
  370. package/dist/components/p-DGnDUmrk.js +0 -62
  371. package/dist/components/p-DGnDUmrk.js.map +0 -1
  372. package/dist/components/p-DO4auCYf.js +0 -111
  373. package/dist/components/p-DO4auCYf.js.map +0 -1
  374. package/dist/components/p-LAsVgL2e.js +0 -83
  375. package/dist/components/p-LAsVgL2e.js.map +0 -1
  376. package/dist/components/p-aeYt0bPO.js +0 -231
  377. package/dist/components/p-aeYt0bPO.js.map +0 -1
  378. package/dist/components/p-l10It7Nm.js.map +0 -1
  379. package/dist/components/p-n789Y3S-.js.map +0 -1
  380. package/dist/components/p-nIBAWFcK.js +0 -132
  381. package/dist/components/p-nIBAWFcK.js.map +0 -1
  382. package/dist/components/p-nZdy-Ii5.js +0 -157
  383. package/dist/components/p-nZdy-Ii5.js.map +0 -1
  384. package/dist/components/p-y25EBKEA.js +0 -201
  385. package/dist/components/p-y25EBKEA.js.map +0 -1
  386. package/dist/esm/app-globals-DQuL1Twl.js.map +0 -1
  387. package/dist/esm/default-line-tool.config-CuBm2vpW.js.map +0 -1
  388. package/dist/esm/index-SGde3HXB.js +0 -1623
  389. package/dist/esm/index-SGde3HXB.js.map +0 -1
  390. package/dist/esm/index.js.map +0 -1
  391. package/dist/esm/kritzel-brush-style.entry.js.map +0 -1
  392. package/dist/esm/loader.js.map +0 -1
  393. package/dist/esm/stencil.js.map +0 -1
  394. package/dist/stencil/index.esm.js.map +0 -1
  395. package/dist/stencil/kritzel-brush-style.entry.esm.js.map +0 -1
  396. package/dist/stencil/loader.esm.js.map +0 -1
  397. package/dist/stencil/p-385bab97.entry.js +0 -2
  398. package/dist/stencil/p-385bab97.entry.js.map +0 -1
  399. package/dist/stencil/p-CuBm2vpW.js +0 -2
  400. package/dist/stencil/p-CuBm2vpW.js.map +0 -1
  401. package/dist/stencil/p-DQuL1Twl.js.map +0 -1
  402. package/dist/stencil/p-SGde3HXB.js +0 -3
  403. package/dist/stencil/p-SGde3HXB.js.map +0 -1
  404. package/dist/stencil/p-d3f7214e.entry.js +0 -10
  405. package/dist/stencil/p-d3f7214e.entry.js.map +0 -1
  406. package/dist/stencil/stencil.esm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"line-handle.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/line-handle.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\n\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { SnapTarget } from '../../interfaces/anchor.interface';\r\n\r\nexport type LineHandleType = 'start' | 'end' | 'center';\r\n\r\nexport class KritzelLineHandleHandler extends KritzelBaseHandler {\r\n initialMouseX = 0;\r\n initialMouseY = 0;\r\n\r\n initialStartX = 0;\r\n initialStartY = 0;\r\n initialEndX = 0;\r\n initialEndY = 0;\r\n initialControlX: number | undefined;\r\n initialControlY: number | undefined;\r\n initialTranslateX = 0;\r\n initialTranslateY = 0;\r\n\r\n hasMoved = false;\r\n\r\n /** Current snap target during drag, if any */\r\n private currentSnapTarget: SnapTarget | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset(): void {\r\n this.initialMouseX = 0;\r\n this.initialMouseY = 0;\r\n this.initialStartX = 0;\r\n this.initialStartY = 0;\r\n this.initialEndX = 0;\r\n this.initialEndY = 0;\r\n this.initialControlX = undefined;\r\n this.initialControlY = undefined;\r\n this.initialTranslateX = 0;\r\n this.initialTranslateY = 0;\r\n this.hasMoved = false;\r\n this.currentSnapTarget = null;\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n this.startHandleDrag(event);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n if (activePointers.length === 1) {\r\n this.startHandleDrag(event);\r\n }\r\n }\r\n }\r\n\r\n private startHandleDrag(event: PointerEvent): void {\r\n const line = this.getSelectedLine();\r\n if (!line || !this._core.store.state.isLineHandleSelected) {\r\n return;\r\n }\r\n\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isLineHandleDragging = true;\r\n this.initialMouseX = clientX;\r\n this.initialMouseY = clientY;\r\n\r\n // Store initial line state\r\n this.initialStartX = line.startX;\r\n this.initialStartY = line.startY;\r\n this.initialEndX = line.endX;\r\n this.initialEndY = line.endY;\r\n this.initialControlX = line.controlX;\r\n this.initialControlY = line.controlY;\r\n this.initialTranslateX = line.translateX;\r\n this.initialTranslateY = line.translateY;\r\n\r\n // Remove existing anchor for this endpoint when starting to drag\r\n const handleType = this._core.store.state.lineHandleType;\r\n if (handleType === 'start' || handleType === 'end') {\r\n this._core.anchorManager.removeAnchor(line.id, handleType);\r\n }\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n const line = this.getSelectedLine();\r\n if (!line || !this._core.store.state.isLineHandleDragging) {\r\n return;\r\n }\r\n\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const dx = clientX - this.initialMouseX;\r\n const dy = clientY - this.initialMouseY;\r\n\r\n const moveThreshold = 3;\r\n if (Math.abs(dx) > moveThreshold || Math.abs(dy) > moveThreshold) {\r\n this.hasMoved = true;\r\n }\r\n\r\n if (!this.hasMoved) {\r\n return;\r\n }\r\n\r\n const viewportScale = this._core.store.state.scale;\r\n const objectScale = line.scale || 1;\r\n const rotation = line.rotation;\r\n\r\n // Convert mouse delta to world coordinates\r\n const worldDx = dx / viewportScale;\r\n const worldDy = dy / viewportScale;\r\n\r\n // Rotate the delta into the line's local coordinate system\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const localDx = (worldDx * cos - worldDy * sin) * objectScale;\r\n const localDy = (worldDx * sin + worldDy * cos) * objectScale;\r\n\r\n const handleType = this._core.store.state.lineHandleType;\r\n\r\n if (handleType === 'start') {\r\n // Calculate world position directly from mouse position for snap detection\r\n const worldX = (clientX - this._core.store.state.translateX) / viewportScale;\r\n const worldY = (clientY - this._core.store.state.translateY) / viewportScale;\r\n\r\n // Get other endpoint's anchor to prevent anchoring both to same object\r\n const otherAnchorId = line.endAnchor?.objectId;\r\n\r\n // Check for snap target\r\n const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);\r\n this.currentSnapTarget = snapTarget;\r\n\r\n if (snapTarget) {\r\n // Snap to target center - convert world coords to local\r\n const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);\r\n this.updateLineEndpoint(line, localCoords.x, localCoords.y, this.initialEndX, this.initialEndY);\r\n\r\n // Get the other endpoint's world position for edge intersection calculation\r\n const otherEndpointWorld = this.lineLocalToWorld(line, this.initialEndX, this.initialEndY);\r\n\r\n // Calculate edge intersection point using AnchorManager to support curves\r\n const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);\r\n let edgeX: number | undefined;\r\n let edgeY: number | undefined;\r\n let t: number | undefined;\r\n\r\n if (targetObject) {\r\n const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'start', targetObject);\r\n if (clipInfo) {\r\n edgeX = clipInfo.worldX;\r\n edgeY = clipInfo.worldY;\r\n t = clipInfo.t;\r\n }\r\n }\r\n\r\n // Calculate control point in world coordinates if it exists\r\n let controlWorld = undefined;\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);\r\n }\r\n\r\n // Update snap indicator\r\n this._core.anchorManager.setSnapCandidate({\r\n objectId: snapTarget.objectId,\r\n endpoint: 'start',\r\n centerX: snapTarget.centerX,\r\n centerY: snapTarget.centerY,\r\n lineEndpointX: otherEndpointWorld.x,\r\n lineEndpointY: otherEndpointWorld.y,\r\n controlX: controlWorld?.x,\r\n controlY: controlWorld?.y,\r\n t,\r\n edgeX,\r\n edgeY,\r\n lineStroke: line.stroke,\r\n lineStrokeWidth: line.strokeWidth / line.scale,\r\n arrowOffset: line.hasStartArrow ? line.getArrowSize('start') / line.scale : undefined,\r\n arrowStyle: line.hasStartArrow ? line.arrows?.start?.style : undefined,\r\n arrowFill: line.hasStartArrow ? line.getArrowFill('start') : undefined,\r\n });\r\n } else {\r\n // No snap - use regular position\r\n const newStartX = this.initialStartX + localDx;\r\n const newStartY = this.initialStartY + localDy;\r\n this.updateLineEndpoint(line, newStartX, newStartY, this.initialEndX, this.initialEndY);\r\n\r\n // Clear snap indicator\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n } else if (handleType === 'end') {\r\n // Calculate world position directly from mouse position for snap detection\r\n const worldX = (clientX - this._core.store.state.translateX) / viewportScale;\r\n const worldY = (clientY - this._core.store.state.translateY) / viewportScale;\r\n\r\n // Get other endpoint's anchor to prevent anchoring both to same object\r\n const otherAnchorId = line.startAnchor?.objectId;\r\n\r\n // Check for snap target\r\n const snapTarget = this._core.anchorManager.findSnapTarget(worldX, worldY, line.id, otherAnchorId);\r\n this.currentSnapTarget = snapTarget;\r\n\r\n if (snapTarget) {\r\n // Snap to target center - convert world coords to local\r\n const localCoords = this.worldToLineLocal(line, snapTarget.centerX, snapTarget.centerY);\r\n this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, localCoords.x, localCoords.y);\r\n\r\n // Get the other endpoint's world position for edge intersection calculation\r\n const otherEndpointWorld = this.lineLocalToWorld(line, this.initialStartX, this.initialStartY);\r\n\r\n // Calculate edge intersection point using AnchorManager to support curves\r\n const targetObject = this._core.store.allNonSelectionObjects.find(obj => obj.id === snapTarget.objectId);\r\n let edgeX: number | undefined;\r\n let edgeY: number | undefined;\r\n let t: number | undefined;\r\n\r\n if (targetObject) {\r\n const clipInfo = this._core.anchorManager.computeAnchorClipInfo(line, 'end', targetObject);\r\n if (clipInfo) {\r\n edgeX = clipInfo.worldX;\r\n edgeY = clipInfo.worldY;\r\n t = clipInfo.t;\r\n }\r\n }\r\n\r\n // Calculate control point in world coordinates if it exists\r\n let controlWorld = undefined;\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n controlWorld = this.lineLocalToWorld(line, line.controlX, line.controlY);\r\n }\r\n\r\n // Update snap indicator\r\n this._core.anchorManager.setSnapCandidate({\r\n objectId: snapTarget.objectId,\r\n endpoint: 'end',\r\n centerX: snapTarget.centerX,\r\n centerY: snapTarget.centerY,\r\n lineEndpointX: otherEndpointWorld.x,\r\n lineEndpointY: otherEndpointWorld.y,\r\n controlX: controlWorld?.x,\r\n controlY: controlWorld?.y,\r\n t,\r\n edgeX,\r\n edgeY,\r\n lineStroke: line.stroke,\r\n lineStrokeWidth: line.strokeWidth / line.scale,\r\n arrowOffset: line.hasEndArrow ? line.getArrowSize('end') / line.scale : undefined,\r\n arrowStyle: line.hasEndArrow ? line.arrows?.end?.style : undefined,\r\n arrowFill: line.hasEndArrow ? line.getArrowFill('end') : undefined,\r\n });\r\n } else {\r\n // No snap - use regular position\r\n const newEndX = this.initialEndX + localDx;\r\n const newEndY = this.initialEndY + localDy;\r\n this.updateLineEndpoint(line, this.initialStartX, this.initialStartY, newEndX, newEndY);\r\n\r\n // Clear snap indicator\r\n this._core.anchorManager.clearSnapCandidate();\r\n }\r\n } else if (handleType === 'center') {\r\n const startControlX = this.initialControlX ?? (this.initialStartX + this.initialEndX) / 2;\r\n const startControlY = this.initialControlY ?? (this.initialStartY + this.initialEndY) / 2;\r\n const newControlX = startControlX + localDx * 2;\r\n const newControlY = startControlY + localDy * 2;\r\n\r\n // Check distance to line segment for snapping back to straight\r\n const x1 = line.startX;\r\n const y1 = line.startY;\r\n const x2 = line.endX;\r\n const y2 = line.endY;\r\n\r\n const A = newControlX - x1;\r\n const B = newControlY - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = newControlX - xx;\r\n const dy = newControlY - yy;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n // Threshold for snapping back to straight line\r\n const snapToStraightThreshold = 15;\r\n\r\n if (distance < snapToStraightThreshold) {\r\n line.updateControlPoint(undefined, undefined);\r\n } else {\r\n line.updateControlPoint(newControlX, newControlY);\r\n }\r\n }\r\n\r\n this._core.rerender();\r\n }\r\n\r\n /**\r\n * Converts world coordinates to a line's local coordinate system.\r\n */\r\n private worldToLineLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n const dx = (worldX - line.translateX) * line.scale;\r\n const dy = (worldY - line.translateY) * line.scale;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n\r\n const rotatedX = (dx - cx) * cos - (dy - cy) * sin + cx;\r\n const rotatedY = (dx - cx) * sin + (dy - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX + line.x,\r\n y: rotatedY + line.y,\r\n };\r\n }\r\n\r\n /**\r\n * Converts a line's local coordinate system to world coordinates.\r\n */\r\n private lineLocalToWorld(line: KritzelLine, localX: number, localY: number): { x: number; y: number } {\r\n const px = localX - line.x;\r\n const py = localY - line.y;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(line.rotation);\r\n const sin = Math.sin(line.rotation);\r\n\r\n const rotatedX = (px - cx) * cos - (py - cy) * sin + cx;\r\n const rotatedY = (px - cx) * sin + (py - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX / line.scale + line.translateX,\r\n y: rotatedY / line.scale + line.translateY,\r\n };\r\n }\r\n\r\n private updateLineEndpoint(line: KritzelLine, startX: number, startY: number, endX: number, endY: number): void {\r\n // Calculate new bounding box using the static method that accounts for curve extrema\r\n const { minX, minY, maxX, maxY } = KritzelLine.calculateBoundingBox(\r\n startX,\r\n startY,\r\n endX,\r\n endY,\r\n line.controlX,\r\n line.controlY,\r\n line.strokeWidth,\r\n );\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n // Calculate old bounding box\r\n const {\r\n minX: oldMinX,\r\n minY: oldMinY,\r\n maxX: oldMaxX,\r\n maxY: oldMaxY,\r\n } = KritzelLine.calculateBoundingBox(\r\n this.initialStartX,\r\n this.initialStartY,\r\n this.initialEndX,\r\n this.initialEndY,\r\n this.initialControlX,\r\n this.initialControlY,\r\n line.strokeWidth,\r\n );\r\n\r\n const oldWidth = oldMaxX - oldMinX;\r\n const oldHeight = oldMaxY - oldMinY;\r\n\r\n // Calculate center shift in local space\r\n const shiftX = minX - oldMinX;\r\n const shiftY = minY - oldMinY;\r\n\r\n const deltaCx = shiftX + (newWidth - oldWidth) / 2;\r\n const deltaCy = shiftY + (newHeight - oldHeight) / 2;\r\n\r\n // Convert the center shift to world coordinates\r\n const rotation = line.rotation;\r\n const cos = Math.cos(rotation);\r\n const sin = Math.sin(rotation);\r\n const scale = 1 / line.scale;\r\n\r\n const rotatedDeltaCx = deltaCx * cos - deltaCy * sin;\r\n const rotatedDeltaCy = deltaCx * sin + deltaCy * cos;\r\n\r\n // Calculate new translate\r\n const newTranslateX = this.initialTranslateX + scale * (oldWidth - newWidth) / 2 + scale * rotatedDeltaCx;\r\n const newTranslateY = this.initialTranslateY + scale * (oldHeight - newHeight) / 2 + scale * rotatedDeltaCy;\r\n\r\n // Update the line properties\r\n line.startX = startX;\r\n line.startY = startY;\r\n line.endX = endX;\r\n line.endY = endY;\r\n line.x = minX;\r\n line.y = minY;\r\n line.width = newWidth;\r\n line.height = newHeight;\r\n\r\n // Adjust translateX/Y to compensate for the bounding box shift\r\n line.translateX = newTranslateX;\r\n line.translateY = newTranslateY;\r\n\r\n // Clear cached adjusted points\r\n (line as unknown as { _adjustedPoints: number[][] | null })._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(line);\r\n }\r\n\r\n handlePointerUp(_event: PointerEvent): void {\r\n if (this._core.store.state.isLineHandleDragging) {\r\n const line = this.getSelectedLine();\r\n const handleType = this._core.store.state.lineHandleType;\r\n\r\n if (line && this.hasMoved) {\r\n // If we were snapped to a target, create the anchor\r\n if (this.currentSnapTarget && (handleType === 'start' || handleType === 'end')) {\r\n this._core.anchorManager.setAnchor(line.id, handleType, this.currentSnapTarget.objectId);\r\n }\r\n\r\n // Refresh the selection group dimensions after line endpoint change\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup) {\r\n selectionGroup.refreshObjectDimensions();\r\n selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n\r\n this._core.store.state.isLineHandleDragging = false;\r\n this.reset();\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n private getSelectedLine(): KritzelLine | null {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup || selectionGroup.objects.length !== 1) {\r\n return null;\r\n }\r\n\r\n const object = selectionGroup.objects[0];\r\n if (object instanceof KritzelLine) {\r\n return object;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"move.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/move.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\n\r\n/** Threshold in screen pixels for disconnecting anchored lines during drag */\r\nconst ANCHOR_DISCONNECT_THRESHOLD = 30;\r\n\r\nexport class KritzelMoveHandler extends KritzelBaseHandler {\r\n dragStartX: number;\r\n dragStartY: number;\r\n\r\n startX: number;\r\n startY: number;\r\n\r\n endX: number;\r\n endY: number;\r\n\r\n /** Initial position when drag started (for calculating total accumulated distance) */\r\n private initialDragX: number = 0;\r\n private initialDragY: number = 0;\r\n\r\n /** Set of line IDs that have been disconnected from anchors during this drag */\r\n private disconnectedLineIds: Set<string> = new Set();\r\n\r\n hasMoved: boolean = false;\r\n private trackedPointerId: number | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.dragStartX = 0;\r\n this.dragStartY = 0;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.endX = 0;\r\n this.endY = 0;\r\n this.initialDragX = 0;\r\n this.initialDragY = 0;\r\n this.disconnectedLineIds.clear();\r\n this.hasMoved = false;\r\n this.trackedPointerId = null;\r\n }\r\n\r\n cancelPendingDrag(): void {\r\n this._core.store.state.isDragging = false;\r\n this.reset();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isDragging = true;\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.startX = this.dragStartX;\r\n this.startY = this.dragStartY;\r\n this.initialDragX = clientX;\r\n this.initialDragY = clientY;\r\n this.disconnectedLineIds.clear();\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (this._core.store.state.pointers.size === 1) {\r\n if (this._core.store.state.isScaling) {\r\n this.trackedPointerId = null;\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.startX = x;\r\n this.startY = y;\r\n this.initialDragX = x;\r\n this.initialDragY = y;\r\n this.disconnectedLineIds.clear();\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isDragging && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this.endX = clientX;\r\n this.endY = clientY;\r\n\r\n const moveDeltaX = Math.abs(clientX - this.startX);\r\n const moveDeltaY = Math.abs(clientY - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n // Check for anchor disconnect threshold on lines\r\n this.checkAndDisconnectAnchors(clientX, clientY);\r\n\r\n selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (\r\n this._core.store.state.pointers.size === 1 &&\r\n selectionGroup &&\r\n !this._core.store.state.isResizeHandleSelected &&\r\n !this._core.store.state.isRotationHandleSelected &&\r\n !this._core.store.state.isScaling\r\n ) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isDragging = true;\r\n this.endX = x;\r\n this.endY = y;\r\n\r\n const moveDeltaX = Math.abs(x - this.startX);\r\n const moveDeltaY = Math.abs(y - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n\r\n // Check for anchor disconnect threshold on lines\r\n this.checkAndDisconnectAnchors(x, y);\r\n\r\n selectionGroup.move(x, y, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Checks if the total accumulated drag distance exceeds the anchor disconnect threshold.\r\n * If so, disconnects all anchors from any KritzelLine objects in the selection group.\r\n * This allows anchored lines to be freely moved after dragging beyond the threshold.\r\n */\r\n private checkAndDisconnectAnchors(currentX: number, currentY: number): void {\r\n const totalDeltaX = currentX - this.initialDragX;\r\n const totalDeltaY = currentY - this.initialDragY;\r\n const totalDistance = Math.sqrt(totalDeltaX * totalDeltaX + totalDeltaY * totalDeltaY);\r\n\r\n if (totalDistance < ANCHOR_DISCONNECT_THRESHOLD) {\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n // Find and disconnect anchors from all anchored lines in the selection\r\n for (const obj of selectionGroup.objects) {\r\n // Skip if already disconnected in this drag session\r\n if (this.disconnectedLineIds.has(obj.id)) {\r\n continue;\r\n }\r\n\r\n // Check if this is a line with anchors\r\n if (obj instanceof KritzelLine) {\r\n const line = obj;\r\n const hasAnchors = line.startAnchor || line.endAnchor;\r\n\r\n if (hasAnchors) {\r\n // Disconnect both anchors\r\n if (line.startAnchor) {\r\n this._core.anchorManager.removeAnchor(line.id, 'start');\r\n }\r\n if (line.endAnchor) {\r\n this._core.anchorManager.removeAnchor(line.id, 'end');\r\n }\r\n\r\n // Mark as disconnected so we don't try again\r\n this.disconnectedLineIds.add(line.id);\r\n\r\n // Update the line to persist the change\r\n this._core.store.state.objects.update(line);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resize.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/resize.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelHandleType } from '../../enums/handle-type.enum';\r\nimport { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\n\r\nexport class KritzelResizeHandler extends KritzelBaseHandler {\r\n initialMouseX: number = 0;\r\n initialMouseY: number = 0;\r\n\r\n initialSize: { x: number; y: number; width: number; height: number } = { x: 0, y: 0, width: 0, height: 0 };\r\n\r\n newSize: { x: number; y: number; width: number; height: number } = { x: 0, y: 0, width: 0, height: 0 };\r\n\r\n hasResized: boolean = false;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.initialMouseX = 0;\r\n this.initialMouseY = 0;\r\n this.initialSize = { x: 0, y: 0, width: 0, height: 0 };\r\n this.newSize = { x: 0, y: 0, width: 0, height: 0 };\r\n this.hasResized = false;\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup && this._core.store.state.isResizeHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isResizing = true;\r\n this.initialMouseX = clientX;\r\n this.initialMouseY = clientY;\r\n this.initialSize.width = selectionGroup.width;\r\n this.initialSize.height = selectionGroup.height;\r\n this.initialSize.x = selectionGroup.translateX;\r\n this.initialSize.y = selectionGroup.translateY;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const firstTouch = activePointers[0];\r\n\r\n if (!firstTouch) {\r\n return;\r\n }\r\n\r\n if (activePointers.length === 1) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup && this._core.store.state.isResizeHandleSelected) {\r\n const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);\r\n const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isResizing = true;\r\n this.initialMouseX = clientX;\r\n this.initialMouseY = clientY;\r\n this.initialSize.width = selectionGroup.width;\r\n this.initialSize.height = selectionGroup.height;\r\n this.initialSize.x = selectionGroup.translateX;\r\n this.initialSize.y = selectionGroup.translateY;\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isResizing && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const dx = clientX - this.initialMouseX;\r\n const dy = clientY - this.initialMouseY;\r\n\r\n const resizeDeltaX = Math.abs(dx);\r\n const resizeDeltaY = Math.abs(dy);\r\n const resizeThreshold = 5;\r\n\r\n if (resizeDeltaX > resizeThreshold || resizeDeltaY > resizeThreshold) {\r\n this.hasResized = true;\r\n }\r\n\r\n if (!this.hasResized) {\r\n return;\r\n }\r\n\r\n const rotation = selectionGroup.rotation;\r\n const sin = Math.sin(rotation);\r\n const cos = Math.cos(rotation);\r\n const objectScale = selectionGroup.scale || 1;\r\n const currentScale = this._core.store.state.scale;\r\n\r\n // Calculate delta in local unrotated space\r\n // We rotate the screen delta by -rotation to align with the object's axes\r\n const localDx = (dx * cos + dy * sin) / currentScale;\r\n const localDy = (-dx * sin + dy * cos) / currentScale;\r\n\r\n // Calculate the center of the selection group before resize\r\n const initialCenterX = this.initialSize.x + this.initialSize.width / objectScale / 2;\r\n const initialCenterY = this.initialSize.y + this.initialSize.height / objectScale / 2;\r\n\r\n // The center moves by half of the screen delta (scaled)\r\n // This is true regardless of rotation because the resize happens symmetrically around the center\r\n // relative to the fixed point logic\r\n const newCenterX = initialCenterX + dx / currentScale / 2;\r\n const newCenterY = initialCenterY + dy / currentScale / 2;\r\n\r\n switch (this._core.store.state.resizeHandleType) {\r\n case KritzelHandleType.TopLeft:\r\n this.newSize.width = this.initialSize.width - localDx * objectScale;\r\n this.newSize.height = this.initialSize.height - localDy * objectScale;\r\n break;\r\n case KritzelHandleType.TopRight:\r\n this.newSize.width = this.initialSize.width + localDx * objectScale;\r\n this.newSize.height = this.initialSize.height - localDy * objectScale;\r\n break;\r\n case KritzelHandleType.BottomLeft:\r\n this.newSize.width = this.initialSize.width - localDx * objectScale;\r\n this.newSize.height = this.initialSize.height + localDy * objectScale;\r\n break;\r\n case KritzelHandleType.BottomRight:\r\n this.newSize.width = this.initialSize.width + localDx * objectScale;\r\n this.newSize.height = this.initialSize.height + localDy * objectScale;\r\n break;\r\n }\r\n\r\n this.newSize.x = newCenterX - this.newSize.width / objectScale / 2;\r\n this.newSize.y = newCenterY - this.newSize.height / objectScale / 2;\r\n\r\n selectionGroup.resize(this.newSize.x, this.newSize.y, this.newSize.width, this.newSize.height);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const oneFingerTouch = activePointers[0];\r\n\r\n if (!oneFingerTouch) {\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isResizing && selectionGroup) {\r\n const clientX = Math.round(oneFingerTouch.clientX - this._core.store.offsetX);\r\n const clientY = Math.round(oneFingerTouch.clientY - this._core.store.offsetY);\r\n\r\n const dx = clientX - this.initialMouseX;\r\n const dy = clientY - this.initialMouseY;\r\n\r\n const resizeDeltaX = Math.abs(dx);\r\n const resizeDeltaY = Math.abs(dy);\r\n const resizeThreshold = 5;\r\n\r\n if (resizeDeltaX > resizeThreshold || resizeDeltaY > resizeThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n this.hasResized = true;\r\n }\r\n\r\n if (!this.hasResized) {\r\n return;\r\n }\r\n\r\n const rotation = selectionGroup.rotation;\r\n const sin = Math.sin(rotation);\r\n const cos = Math.cos(rotation);\r\n const objectScale = selectionGroup.scale || 1;\r\n const currentScale = this._core.store.state.scale;\r\n\r\n // Calculate delta in local unrotated space\r\n // We rotate the screen delta by -rotation to align with the object's axes\r\n const localDx = (dx * cos + dy * sin) / currentScale;\r\n const localDy = (-dx * sin + dy * cos) / currentScale;\r\n\r\n // Calculate the center of the selection group before resize\r\n const initialCenterX = this.initialSize.x + this.initialSize.width / objectScale / 2;\r\n const initialCenterY = this.initialSize.y + this.initialSize.height / objectScale / 2;\r\n\r\n // The center moves by half of the screen delta (scaled)\r\n // This is true regardless of rotation because the resize happens symmetrically around the center\r\n // relative to the fixed point logic\r\n const newCenterX = initialCenterX + dx / currentScale / 2;\r\n const newCenterY = initialCenterY + dy / currentScale / 2;\r\n\r\n switch (this._core.store.state.resizeHandleType) {\r\n case KritzelHandleType.TopLeft:\r\n this.newSize.width = this.initialSize.width - localDx * objectScale;\r\n this.newSize.height = this.initialSize.height - localDy * objectScale;\r\n break;\r\n case KritzelHandleType.TopRight:\r\n this.newSize.width = this.initialSize.width + localDx * objectScale;\r\n this.newSize.height = this.initialSize.height - localDy * objectScale;\r\n break;\r\n case KritzelHandleType.BottomLeft:\r\n this.newSize.width = this.initialSize.width - localDx * objectScale;\r\n this.newSize.height = this.initialSize.height + localDy * objectScale;\r\n break;\r\n case KritzelHandleType.BottomRight:\r\n this.newSize.width = this.initialSize.width + localDx * objectScale;\r\n this.newSize.height = this.initialSize.height + localDy * objectScale;\r\n break;\r\n }\r\n\r\n this.newSize.x = newCenterX - this.newSize.width / objectScale / 2;\r\n this.newSize.y = newCenterY - this.newSize.height / objectScale / 2;\r\n\r\n selectionGroup.resize(this.newSize.x, this.newSize.y, this.newSize.width, this.newSize.height);\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isResizing) {\r\n this._core.store.state.isResizing = false;\r\n\r\n if (this.hasResized) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n\r\n this.reset();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isResizing) {\r\n this._core.store.state.isResizing = false;\r\n\r\n if (this.hasResized) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n\r\n this.reset();\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rotation.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/rotation.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\n\r\nexport class KritzelRotationHandler extends KritzelBaseHandler {\r\n initialRotation: number = 0;\r\n\r\n rotation: number = 0;\r\n\r\n unchangedObjects: KritzelBaseObject<any>[] = [];\r\n\r\n initialSelectionGroupRotation: number = 0;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.initialRotation = 0;\r\n this.rotation = 0;\r\n this.unchangedObjects = [];\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup && this._core.store.state.isRotationHandleSelected) {\r\n selectionGroup.beginTransform();\r\n\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isRotating = true;\r\n\r\n const objectScale = selectionGroup.scale || 1;\r\n const centerX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;\r\n const centerY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;\r\n\r\n const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n this.initialSelectionGroupRotation = selectionGroup.rotation;\r\n this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;\r\n\r\n this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const firstTouch = activePointers[0];\r\n\r\n if (!firstTouch) {\r\n return;\r\n }\r\n\r\n if (activePointers.length === 1) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup && this._core.store.state.isRotationHandleSelected) {\r\n selectionGroup.beginTransform();\r\n\r\n const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);\r\n const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isRotating = true;\r\n\r\n const objectScale = selectionGroup.scale || 1;\r\n const centerX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;\r\n const centerY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;\r\n\r\n const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n this.initialSelectionGroupRotation = selectionGroup.rotation;\r\n this.initialRotation = Math.atan2(centerY - cursorY, centerX - cursorX) - selectionGroup.rotation;\r\n\r\n this.unchangedObjects = selectionGroup.objects.map(obj => obj.clone());\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isRotating && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const objectScale = selectionGroup.scale || 1;\r\n const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;\r\n const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;\r\n\r\n const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const currentRotation = Math.atan2(groupCenterY - cursorY, groupCenterX - cursorX);\r\n\r\n this.rotation = currentRotation - this.initialRotation;\r\n\r\n selectionGroup.rotate(this.rotation);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const firstTouch = activePointers[0];\r\n\r\n if (!firstTouch) {\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isRotating && selectionGroup) {\r\n const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);\r\n const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);\r\n\r\n const objectScale = selectionGroup.scale || 1;\r\n const groupCenterX = selectionGroup.translateX + selectionGroup.width / 2 / objectScale;\r\n const groupCenterY = selectionGroup.translateY + selectionGroup.height / 2 / objectScale;\r\n\r\n const cursorX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n const cursorY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const currentRotation = Math.atan2(groupCenterY - cursorY, groupCenterX - cursorX);\r\n\r\n this.rotation = currentRotation - this.initialRotation;\r\n\r\n selectionGroup.rotate(this.rotation);\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isRotating) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.isRotating = false;\r\n this._core.store.state.hasObjectsChanged = true;\r\n\r\n this.reset();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isRotating) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.isRotating = false;\r\n this._core.store.state.hasObjectsChanged = true;\r\n\r\n this.reset();\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"selection.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/selection.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelGroup } from '../objects/group.class';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelCore } from '../core/core.class';\r\n\r\nexport class KritzelSelectionHandler extends KritzelBaseHandler {\r\n startX: number;\r\n startY: number;\r\n\r\n touchStartX: number = 0;\r\n touchStartY: number = 0;\r\n\r\n touchStartTimeout: any = null;\r\n\r\n get isSelectionClick() {\r\n const selectionBox = this._core.store.selectionBox;\r\n return selectionBox && selectionBox.width === 0 && selectionBox.height === 0;\r\n }\r\n\r\n get isSelectionDrag() {\r\n const selectionBox = this._core.store.selectionBox;\r\n return selectionBox && (selectionBox.width > 0 || selectionBox.height > 0);\r\n }\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event) && !this._core.store.selectionGroup) {\r\n this.startMouseSelection(event);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n this.touchStartTimeout = setTimeout(() => {\r\n if (this._core.store.state.pointers.size === 1 && !this._core.store.state.isScaling && !this._core.store.selectionGroup) {\r\n this.startTouchSelection();\r\n this.updateTouchSelection();\r\n }\r\n }, 80);\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isSelecting) {\r\n this.updateMouseSelection(event);\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n const moveDeltaX = Math.abs(x - this.touchStartX);\r\n const moveDeltaY = Math.abs(y - this.touchStartY);\r\n const moveThreshold = 5;\r\n\r\n if ((moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) && this._core.store.state.isSelecting) {\r\n this.updateTouchSelection();\r\n\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const hasObjectsMoved = this._core.store.state.hasObjectsChanged;\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (selectionGroup?.objects.length === 1 && hasObjectsMoved === false) {\r\n selectionGroup.objects[0].edit(event);\r\n }\r\n\r\n this._core.store.state.hasObjectsChanged = false;\r\n\r\n if (this._core.store.state.isSelecting) {\r\n if (this.isSelectionClick) {\r\n this.handleSelectionClick(event);\r\n }\r\n\r\n if (this.isSelectionDrag) {\r\n this.updateMouseSelection(event);\r\n this.addSelectedObjectsToSelectionGroup();\r\n this.removeSelectionBox();\r\n }\r\n\r\n this._core.engine.emitObjectsChange();\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n clearTimeout(this.touchStartTimeout);\r\n\r\n const hasObjectsMoved = this._core.store.state.hasObjectsChanged;\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (selectionGroup?.objects.length === 1 && hasObjectsMoved === false) {\r\n selectionGroup.objects[0].edit(event);\r\n }\r\n\r\n this._core.store.state.hasObjectsChanged = false;\r\n\r\n if (this._core.store.state.isSelecting) {\r\n if (this.isSelectionClick) {\r\n this.handleSelectionClick(event);\r\n }\r\n\r\n if (this.isSelectionDrag) {\r\n this.updateTouchSelection();\r\n this.addSelectedObjectsToSelectionGroup();\r\n this.removeSelectionBox();\r\n }\r\n\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.skipContextMenu = false;\r\n }\r\n }\r\n }\r\n\r\n private removeSelectionBox(): void {\r\n this._core.store.state.isSelecting = false;\r\n this._core.store.state.objects.remove(o => o instanceof KritzelSelectionBox);\r\n }\r\n\r\n private startMouseSelection(event: MouseEvent): void {\r\n let clientX, clientY;\r\n\r\n clientX = event.clientX - this._core.store.offsetX;\r\n clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const selectionBox = KritzelSelectionBox.create(this._core);\r\n\r\n this.startX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this.startY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n selectionBox.translateX = this.startX;\r\n selectionBox.translateY = this.startY;\r\n\r\n this._core.store.state.isSelecting = true;\r\n\r\n this._core.store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._core.store.state.objects.insert(selectionBox);\r\n }\r\n\r\n private startTouchSelection(): void {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const firstTouch = activePointers[0];\r\n\r\n if (!firstTouch) {\r\n return;\r\n }\r\n\r\n let clientX, clientY;\r\n\r\n clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);\r\n clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);\r\n this.touchStartX = clientX;\r\n this.touchStartY = clientY;\r\n\r\n const selectionBox = KritzelSelectionBox.create(this._core);\r\n\r\n this.startX = (clientX - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this.startY = (clientY - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n selectionBox.translateX = this.startX;\r\n selectionBox.translateY = this.startY;\r\n\r\n this._core.store.state.isSelecting = true;\r\n\r\n this._core.store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._core.store.state.objects.insert(selectionBox);\r\n }\r\n\r\n private updateMouseSelection(event: MouseEvent): void {\r\n let clientX, clientY;\r\n\r\n clientX = event.clientX - this._core.store.offsetX;\r\n clientY = event.clientY - this._core.store.offsetY;\r\n\r\n const selectionBox = this._core.store.selectionBox;\r\n\r\n if (selectionBox) {\r\n const currentX = (clientX - this._core.store.state.translateX) / selectionBox.scale;\r\n const currentY = (clientY - this._core.store.state.translateY) / selectionBox.scale;\r\n\r\n const width = Math.abs(currentX - this.startX) * selectionBox.scale;\r\n const height = Math.abs(currentY - this.startY) * selectionBox.scale;\r\n\r\n selectionBox.width = width;\r\n selectionBox.height = height;\r\n selectionBox.translateX = Math.min(currentX, this.startX);\r\n selectionBox.translateY = Math.min(currentY, this.startY);\r\n\r\n if (width > 0 || height > 0) {\r\n this.updateSelectedObjects();\r\n } else {\r\n this.clearSelectionPreview();\r\n }\r\n }\r\n }\r\n\r\n private updateTouchSelection(): void {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const firstTouch = activePointers[0];\r\n\r\n if (!firstTouch) {\r\n return;\r\n }\r\n\r\n let clientX, clientY;\r\n\r\n clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);\r\n clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);\r\n\r\n const selectionBox = this._core.store.selectionBox;\r\n\r\n if (selectionBox) {\r\n const currentX = (clientX - this._core.store.state.translateX) / selectionBox.scale;\r\n const currentY = (clientY - this._core.store.state.translateY) / selectionBox.scale;\r\n\r\n const width = Math.abs(currentX - this.startX) * selectionBox.scale;\r\n const height = Math.abs(currentY - this.startY) * selectionBox.scale;\r\n\r\n selectionBox.width = width;\r\n selectionBox.height = height;\r\n selectionBox.translateX = Math.min(currentX, this.startX);\r\n selectionBox.translateY = Math.min(currentY, this.startY);\r\n\r\n if (width > 0 || height > 0) {\r\n this.updateSelectedObjects();\r\n } else {\r\n this.clearSelectionPreview();\r\n }\r\n }\r\n }\r\n\r\n private updateSelectedObjects(): void {\r\n const selectionBox = this._core.store.selectionBox;\r\n if (selectionBox) {\r\n this._core.store.allObjects\r\n .filter(o => !(o instanceof KritzelSelectionBox))\r\n .forEach(object => (object.isSelected = object.hitTestPolygon(selectionBox.rotatedPolygon)));\r\n }\r\n }\r\n\r\n private handleSelectionClick(event: PointerEvent): void {\r\n const selectedObject = this.getTopmostHitObject(event);\r\n\r\n this.clearSelectionPreview();\r\n\r\n this.addObjectToSelectionGroup(selectedObject);\r\n this.removeSelectionBox();\r\n }\r\n\r\n private getTopmostHitObject(event: PointerEvent): KritzelBaseObject<any> | null {\r\n const pointerX = this._core.store.state.pointerX;\r\n const pointerY = this._core.store.state.pointerY;\r\n const overlappingObjects = this._core.getObjectsFromPointerEvent(event, '.object');\r\n\r\n for (const object of overlappingObjects) {\r\n if (object.hitTest(pointerX, pointerY)) {\r\n return object;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private clearSelectionPreview(): void {\r\n this._core.store.allNonSelectionObjects.forEach(object => {\r\n object.isSelected = false;\r\n });\r\n }\r\n\r\n private addObjectToSelectionGroup(object: KritzelBaseObject): void {\r\n if (!object) {\r\n return;\r\n }\r\n\r\n // Resolve child objects to their parent groups\r\n const parentGroup = KritzelGroup.findParentGroup(this._core, object.id);\r\n const objectToSelect = parentGroup || object;\r\n\r\n objectToSelect.isSelected = false;\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n selectionGroup.addOrRemove(objectToSelect);\r\n selectionGroup.isSelected = true;\r\n selectionGroup.rotation = objectToSelect.rotation;\r\n\r\n this._core.addSelectionGroup(selectionGroup);\r\n this._core.rerender();\r\n }\r\n\r\n private addSelectedObjectsToSelectionGroup(): void {\r\n const selectedObjects = this._core.store.selectedObjects;\r\n\r\n if (selectedObjects.length === 0) {\r\n return;\r\n }\r\n\r\n // Resolve child objects to their parent groups to avoid double-move\r\n const resolvedObjects = new Map<string, KritzelBaseObject<any>>();\r\n\r\n selectedObjects.forEach(obj => {\r\n // Check if this object is a child of a KritzelGroup\r\n const parentGroup = KritzelGroup.findParentGroup(this._core, obj.id);\r\n\r\n if (parentGroup) {\r\n // Add the parent group instead of the child\r\n resolvedObjects.set(parentGroup.id, parentGroup);\r\n } else {\r\n // Not a child of any group, add the object itself\r\n resolvedObjects.set(obj.id, obj);\r\n }\r\n\r\n obj.isSelected = false;\r\n });\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n resolvedObjects.forEach(o => {\r\n selectionGroup.addOrRemove(o);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n if (selectionGroup.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this._core.addSelectionGroup(selectionGroup);\r\n this._core.rerender();\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anchor.manager.js","sourceRoot":"","sources":["../../../src/classes/managers/anchor.manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { AnchorIndexEntry, AnchorLinesRenderData, AnchorVisualization, LineAnchor, SnapCandidate, SnapIndicatorRenderData, SnapTarget } from '../../interfaces/anchor.interface';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelShape } from '../objects/shape.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelClassHelper } from '../../helpers/class.helper';\r\nimport { KritzelPoint } from '../../interfaces/point.interface';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\n\r\ntype AnchorClipInfo = {\r\n localX: number;\r\n localY: number;\r\n worldX: number;\r\n worldY: number;\r\n t?: number;\r\n};\r\n\r\ntype QuadraticPoint = { x: number; y: number };\r\n\r\ntype QuadraticSegment = {\r\n start: QuadraticPoint;\r\n control: QuadraticPoint;\r\n end: QuadraticPoint;\r\n};\r\n\r\n/**\r\n * Manages anchor connections between line endpoints and other objects.\r\n * Maintains a runtime index for efficient reverse lookups and handles\r\n * snap detection during line endpoint dragging.\r\n */\r\nexport class KritzelAnchorManager {\r\n private readonly _core: KritzelCore;\r\n\r\n /**\r\n * Runtime index mapping objectId to the lines anchored to it.\r\n * This is derived from the anchor properties on lines and rebuilt as needed.\r\n */\r\n private readonly _anchorIndex: Map<string, Set<AnchorIndexEntry>> = new Map();\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n // ============================================\r\n // Anchor CRUD Operations\r\n // ============================================\r\n\r\n /**\r\n * Sets an anchor from a line endpoint to a target object's center.\r\n * Updates both the line's anchor property and the internal index.\r\n */\r\n setAnchor(lineId: string, endpoint: 'start' | 'end', targetObjectId: string): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n // Prevent anchoring both endpoints to the same object\r\n if (endpoint === 'start' && line.endAnchor?.objectId === targetObjectId) {\r\n return;\r\n }\r\n if (endpoint === 'end' && line.startAnchor?.objectId === targetObjectId) {\r\n return;\r\n }\r\n\r\n // Remove existing anchor if any\r\n this.removeAnchor(lineId, endpoint);\r\n\r\n // Set the anchor on the line\r\n const anchor: LineAnchor = { objectId: targetObjectId };\r\n if (endpoint === 'start') {\r\n line.startAnchor = anchor;\r\n } else {\r\n line.endAnchor = anchor;\r\n }\r\n\r\n // Update the index\r\n this.addToIndex(targetObjectId, lineId, endpoint);\r\n\r\n // Snap the endpoint to the target's center\r\n this.snapEndpointToObject(line, endpoint, targetObjectId);\r\n\r\n // Persist the change\r\n this._core.store.state.objects.update(line);\r\n }\r\n\r\n /**\r\n * Removes an anchor from a line endpoint.\r\n * Updates both the line's anchor property and the internal index.\r\n */\r\n removeAnchor(lineId: string, endpoint: 'start' | 'end'): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) {\r\n return;\r\n }\r\n\r\n // Remove from index\r\n this.removeFromIndex(anchor.objectId, lineId, endpoint);\r\n\r\n // Clear the anchor on the line\r\n if (endpoint === 'start') {\r\n line.startAnchor = undefined;\r\n } else {\r\n line.endAnchor = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the anchor for a specific line endpoint.\r\n */\r\n getAnchor(lineId: string, endpoint: 'start' | 'end'): LineAnchor | null {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return null;\r\n }\r\n\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n return anchor ?? null;\r\n }\r\n\r\n // ============================================\r\n // Query Operations\r\n // ============================================\r\n\r\n /**\r\n * Gets all lines that have an endpoint anchored to the specified object.\r\n */\r\n getLinesAnchoredTo(objectId: string): AnchorIndexEntry[] {\r\n const entries = this._anchorIndex.get(objectId);\r\n return entries ? Array.from(entries) : [];\r\n }\r\n\r\n // ============================================\r\n // Position Updates\r\n // ============================================\r\n\r\n /**\r\n * Updates all line endpoints that are anchored to the specified object.\r\n * Should be called when an object moves.\r\n */\r\n updateAnchorsForObject(objectId: string): void {\r\n const entries = this.getLinesAnchoredTo(objectId);\r\n if (entries.length === 0) {\r\n return;\r\n }\r\n\r\n const targetObject = this.getObjectById(objectId);\r\n if (!targetObject) {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n const line = this.getLineById(entry.lineId);\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n this.snapEndpointToObject(line, entry.endpoint, objectId);\r\n }\r\n }\r\n\r\n /**\r\n * Snaps a line endpoint to an object's center.\r\n */\r\n private snapEndpointToObject(line: KritzelLine, endpoint: 'start' | 'end', targetObjectId: string): void {\r\n const targetObject = this.getObjectById(targetObjectId);\r\n if (!targetObject) {\r\n return;\r\n }\r\n\r\n // Get target center in world coordinates\r\n const targetCenterX = targetObject.centerX;\r\n const targetCenterY = targetObject.centerY;\r\n\r\n // Convert world coordinates to line's local coordinate system\r\n const localCoords = this.worldToLineLocal(line, targetCenterX, targetCenterY);\r\n\r\n // Update the endpoint\r\n line.updateEndpoint(endpoint, localCoords.x, localCoords.y);\r\n }\r\n\r\n /**\r\n * Converts world coordinates to a line's local coordinate system.\r\n */\r\n private worldToLineLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n // Get line center in world coordinates\r\n const cx = line.centerX;\r\n const cy = line.centerY;\r\n\r\n // Translate to center\r\n const dx = worldX - cx;\r\n const dy = worldY - cy;\r\n\r\n // Apply inverse rotation\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n const rotatedX = dx * cos - dy * sin;\r\n const rotatedY = dx * sin + dy * cos;\r\n\r\n // Calculate local coordinates relative to the unrotated bounding box top-left\r\n const relativeX = rotatedX + (line.totalWidth / 2) / line.scale;\r\n const relativeY = rotatedY + (line.totalHeight / 2) / line.scale;\r\n\r\n // Convert to internal coordinates\r\n const localX = relativeX * line.scale + line.x;\r\n const localY = relativeY * line.scale + line.y;\r\n\r\n return { x: localX, y: localY };\r\n }\r\n\r\n // ============================================\r\n // Snap Detection\r\n // ============================================\r\n\r\n /**\r\n * Finds the nearest object that can be snapped to within the snap threshold.\r\n * Returns null if no suitable snap target is found.\r\n *\r\n * @param worldX - X coordinate in world space\r\n * @param worldY - Y coordinate in world space\r\n * @param excludeLineId - ID of the line being edited (to exclude from snap targets)\r\n * @param otherEndpointAnchorId - ID of object anchored to the other endpoint (to prevent same-object anchoring)\r\n */\r\n findSnapTarget(\r\n worldX: number,\r\n worldY: number,\r\n excludeLineId: string,\r\n otherEndpointAnchorId?: string\r\n ): SnapTarget | null {\r\n let bestTarget: SnapTarget | null = null;\r\n let highestZIndex = -Infinity;\r\n\r\n const objects = this._core.store.allNonSelectionObjects;\r\n\r\n for (const object of objects) {\r\n // Skip the line being edited\r\n if (object.id === excludeLineId) {\r\n continue;\r\n }\r\n\r\n // Skip if this is the object anchored to the other endpoint\r\n if (otherEndpointAnchorId && object.id === otherEndpointAnchorId) {\r\n continue;\r\n }\r\n\r\n // Skip non-anchorable objects\r\n if (!this.isAnchorable(object)) {\r\n continue;\r\n }\r\n\r\n // Check if point is inside the object's rotated polygon\r\n const polygon = object.rotatedPolygon;\r\n const points = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: worldX, y: worldY }, points)) {\r\n // If inside, check if this object is \"above\" the current best target\r\n if (object.zIndex > highestZIndex) {\r\n highestZIndex = object.zIndex;\r\n bestTarget = {\r\n objectId: object.id,\r\n centerX: object.centerX,\r\n centerY: object.centerY,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return bestTarget;\r\n }\r\n\r\n /**\r\n * Sets the current snap candidate for visual feedback.\r\n */\r\n setSnapCandidate(candidate: SnapCandidate | null): void {\r\n this._core.store.state.snapCandidate = candidate;\r\n this._core.rerender();\r\n }\r\n\r\n /**\r\n * Gets the current snap candidate.\r\n */\r\n getSnapCandidate(): SnapCandidate | null {\r\n return this._core.store.state.snapCandidate ?? null;\r\n }\r\n\r\n /**\r\n * Clears the snap candidate.\r\n */\r\n clearSnapCandidate(): void {\r\n this._core.store.state.snapCandidate = null;\r\n this._core.rerender();\r\n }\r\n\r\n // ============================================\r\n // Render Data\r\n // ============================================\r\n\r\n /**\r\n * Gets render data for anchor lines visualization.\r\n * Returns null if there's no selected line with anchors or if snap is in progress.\r\n */\r\n getAnchorLinesRenderData(): AnchorLinesRenderData | null {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup || selectionGroup.objects.length !== 1) return null;\r\n\r\n const selectedObject = selectionGroup.objects[0];\r\n if (!KritzelClassHelper.isInstanceOf<KritzelLine>(selectedObject, 'KritzelLine')) return null;\r\n\r\n const line = selectedObject as KritzelLine;\r\n\r\n\r\n\r\n const startAnchorViz = this.computeAnchorVisualization(line, 'start');\r\n const endAnchorViz = this.computeAnchorVisualization(line, 'end');\r\n\r\n if (!startAnchorViz && !endAnchorViz) return null;\r\n\r\n const scale = this._core.store.state.scale;\r\n const lineStrokeWidth = line.strokeWidth / line.scale;\r\n const indicatorStrokeWidth = `${2 / scale}`;\r\n const dashLength = Math.max(lineStrokeWidth * 2, 4 / scale);\r\n const dashArray = `${dashLength} ${dashLength}`;\r\n const indicatorRadius = 8 / scale;\r\n\r\n return {\r\n lineStrokeWidth,\r\n indicatorStrokeWidth,\r\n dashArray,\r\n indicatorRadius,\r\n startAnchorViz,\r\n endAnchorViz,\r\n };\r\n }\r\n\r\n /**\r\n * Gets render data for snap indicator visualization.\r\n * Returns null if there's no snap candidate.\r\n */\r\n getSnapIndicatorRenderData(): SnapIndicatorRenderData | null {\r\n const snapCandidate = this.getSnapCandidate();\r\n if (!snapCandidate) return null;\r\n\r\n const scale = this._core.store.state.scale;\r\n const indicatorRadius = 8 / scale;\r\n const indicatorStrokeWidth = `${2 / scale}`;\r\n const lineStrokeWidth = snapCandidate.lineStrokeWidth\r\n ? `${snapCandidate.lineStrokeWidth}`\r\n : `${4 / scale}`;\r\n const lineStrokeWidthNum = snapCandidate.lineStrokeWidth || (4 / scale);\r\n const dashLength = Math.max(lineStrokeWidthNum * 2, 4 / scale);\r\n const dashArray = `${dashLength} ${dashLength}`;\r\n const lineStroke = snapCandidate.lineStroke || '#000000';\r\n\r\n let solidLineEndX = snapCandidate.edgeX;\r\n let solidLineEndY = snapCandidate.edgeY;\r\n let arrowPoints: string | undefined;\r\n\r\n if (snapCandidate.arrowOffset && snapCandidate.edgeX !== undefined && snapCandidate.edgeY !== undefined) {\r\n const dx = snapCandidate.lineEndpointX - snapCandidate.edgeX;\r\n const dy = snapCandidate.lineEndpointY - snapCandidate.edgeY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (length > snapCandidate.arrowOffset) {\r\n solidLineEndX = snapCandidate.edgeX + (dx / length) * snapCandidate.arrowOffset;\r\n solidLineEndY = snapCandidate.edgeY + (dy / length) * snapCandidate.arrowOffset;\r\n }\r\n\r\n // Calculate arrow head points\r\n // Direction from line endpoint to edge (arrow direction)\r\n const arrowDx = snapCandidate.edgeX - snapCandidate.lineEndpointX;\r\n const arrowDy = snapCandidate.edgeY - snapCandidate.lineEndpointY;\r\n const arrowLengthTotal = Math.sqrt(arrowDx * arrowDx + arrowDy * arrowDy);\r\n\r\n if (arrowLengthTotal > 0) {\r\n const ux = arrowDx / arrowLengthTotal;\r\n const uy = arrowDy / arrowLengthTotal;\r\n // Perpendicular vector\r\n const px = -uy;\r\n const py = ux;\r\n\r\n // Arrow dimensions\r\n const arrowLength = snapCandidate.arrowOffset;\r\n const arrowWidth = arrowLength; // 1:1 ratio\r\n\r\n // Arrow tip at edge\r\n const tipX = snapCandidate.edgeX;\r\n const tipY = snapCandidate.edgeY;\r\n\r\n // Arrow base\r\n const baseX = tipX - ux * arrowLength;\r\n const baseY = tipY - uy * arrowLength;\r\n\r\n // Arrow wings\r\n const leftX = baseX + px * arrowWidth / 2;\r\n const leftY = baseY + py * arrowWidth / 2;\r\n const rightX = baseX - px * arrowWidth / 2;\r\n const rightY = baseY - py * arrowWidth / 2;\r\n\r\n arrowPoints = `${tipX},${tipY} ${leftX},${leftY} ${rightX},${rightY}`;\r\n }\r\n }\r\n return {\r\n indicatorRadius,\r\n indicatorStrokeWidth,\r\n lineStrokeWidth,\r\n dashArray,\r\n lineStroke,\r\n centerX: snapCandidate.centerX,\r\n centerY: snapCandidate.centerY,\r\n lineEndpointX: snapCandidate.lineEndpointX,\r\n lineEndpointY: snapCandidate.lineEndpointY,\r\n edgeX: snapCandidate.edgeX,\r\n edgeY: snapCandidate.edgeY,\r\n arrowOffset: snapCandidate.arrowOffset,\r\n arrowStyle: snapCandidate.arrowStyle,\r\n arrowFill: snapCandidate.arrowFill,\r\n solidLineEndX,\r\n solidLineEndY,\r\n arrowPoints,\r\n snapLinePath: (() => {\r\n if (\r\n snapCandidate.controlX !== undefined &&\r\n snapCandidate.controlY !== undefined &&\r\n snapCandidate.t !== undefined\r\n ) {\r\n const startT = snapCandidate.endpoint === 'start' ? 1 - snapCandidate.t : snapCandidate.t;\r\n\r\n // Ensure meaningful range\r\n if (startT >= 1) return undefined;\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: snapCandidate.lineEndpointX, y: snapCandidate.lineEndpointY },\r\n { x: snapCandidate.controlX, y: snapCandidate.controlY },\r\n { x: snapCandidate.centerX, y: snapCandidate.centerY },\r\n startT,\r\n 1\r\n );\r\n return `M ${segment.start.x} ${segment.start.y} Q ${segment.control.x} ${segment.control.y} ${segment.end.x} ${segment.end.y}`;\r\n }\r\n return undefined;\r\n })(),\r\n };\r\n }\r\n\r\n // ============================================\r\n // Cleanup Operations\r\n // ============================================\r\n\r\n /**\r\n * Handles cleanup when an object is deleted.\r\n * Detaches all lines that were anchored to the deleted object.\r\n */\r\n handleObjectDeleted(objectId: string): void {\r\n const entries = this.getLinesAnchoredTo(objectId);\r\n\r\n for (const entry of entries) {\r\n this.removeAnchor(entry.lineId, entry.endpoint);\r\n\r\n // Update the line to persist the change\r\n const line = this.getLineById(entry.lineId);\r\n if (line) {\r\n this._core.store.state.objects.update(line);\r\n }\r\n }\r\n\r\n // Remove the object from the index\r\n this._anchorIndex.delete(objectId);\r\n }\r\n\r\n /**\r\n * Handles cleanup when a line is deleted.\r\n * Removes all anchor index entries for the line.\r\n */\r\n handleLineDeleted(lineId: string): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n if (line.startAnchor) {\r\n this.removeFromIndex(line.startAnchor.objectId, lineId, 'start');\r\n }\r\n if (line.endAnchor) {\r\n this.removeFromIndex(line.endAnchor.objectId, lineId, 'end');\r\n }\r\n }\r\n\r\n // ============================================\r\n // Index Management\r\n // ============================================\r\n\r\n /**\r\n * Rebuilds the anchor index from all lines in the object map.\r\n * Should be called after loading/deserializing objects.\r\n */\r\n rebuildIndex(): void {\r\n this._anchorIndex.clear();\r\n\r\n const objects = this._core.store.allObjects;\r\n\r\n for (const object of objects) {\r\n if (object instanceof KritzelLine) {\r\n if (object.startAnchor) {\r\n this.addToIndex(object.startAnchor.objectId, object.id, 'start');\r\n }\r\n if (object.endAnchor) {\r\n this.addToIndex(object.endAnchor.objectId, object.id, 'end');\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Adds an entry to the anchor index.\r\n */\r\n private addToIndex(objectId: string, lineId: string, endpoint: 'start' | 'end'): void {\r\n if (!this._anchorIndex.has(objectId)) {\r\n this._anchorIndex.set(objectId, new Set());\r\n }\r\n\r\n const entries = this._anchorIndex.get(objectId)!;\r\n\r\n // Check if entry already exists\r\n for (const entry of entries) {\r\n if (entry.lineId === lineId && entry.endpoint === endpoint) {\r\n return;\r\n }\r\n }\r\n\r\n entries.add({ lineId, endpoint });\r\n }\r\n\r\n /**\r\n * Removes an entry from the anchor index.\r\n */\r\n private removeFromIndex(objectId: string, lineId: string, endpoint: 'start' | 'end'): void {\r\n const entries = this._anchorIndex.get(objectId);\r\n if (!entries) {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (entry.lineId === lineId && entry.endpoint === endpoint) {\r\n entries.delete(entry);\r\n break;\r\n }\r\n }\r\n\r\n // Clean up empty sets\r\n if (entries.size === 0) {\r\n this._anchorIndex.delete(objectId);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Helper Methods\r\n // ============================================\r\n\r\n /**\r\n * Gets a line by its ID.\r\n */\r\n private getLineById(lineId: string): KritzelLine | null {\r\n const objects = this._core.store.state.objects.filter(o => o.id === lineId);\r\n if (objects.length === 0) {\r\n return null;\r\n }\r\n const object = objects[0];\r\n return object instanceof KritzelLine ? object : null;\r\n }\r\n\r\n /**\r\n * Gets an object by its ID.\r\n */\r\n private getObjectById(objectId: string): KritzelBaseObject<Element> | null {\r\n const objects = this._core.store.state.objects.filter(o => o.id === objectId);\r\n return objects.length > 0 ? objects[0] : null;\r\n }\r\n\r\n private findAnchorTarget(line: KritzelLine, endpoint: 'start' | 'end'): KritzelBaseObject<Element> | null {\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) {\r\n return null;\r\n }\r\n return this._core.store.allNonSelectionObjects.find(obj => obj.id === anchor.objectId) ?? null;\r\n }\r\n\r\n // ============================================\r\n // Visualization Helpers\r\n // ============================================\r\n\r\n /**\r\n * Computes anchor visualization data for a line with anchors.\r\n * Returns edge intersection points for rendering dashed lines from edge to center.\r\n */\r\n computeAnchorVisualization(line: KritzelLine, endpoint: 'start' | 'end'): AnchorVisualization | null {\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) return null;\r\n\r\n const targetObject = this.findAnchorTarget(line, endpoint);\r\n if (!targetObject) return null;\r\n\r\n const clipInfo = this.computeAnchorClipInfo(line, endpoint, targetObject);\r\n if (!clipInfo) return null;\r\n\r\n const centerX = targetObject.centerX;\r\n const centerY = targetObject.centerY;\r\n\r\n return {\r\n edgeX: clipInfo.worldX,\r\n edgeY: clipInfo.worldY,\r\n centerX,\r\n centerY,\r\n pathD: this.buildAnchorPath(line, endpoint, clipInfo, targetObject) ?? undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Computes a clipped line path that stops at anchor edges instead of going to anchor centers.\r\n * When arrows are present on anchored ends, the line is shortened so the arrow tip appears at the edge.\r\n * Returns the SVG path 'd' attribute string, or the original path if no clipping is needed.\r\n * @param line The line object\r\n * @param offsetByViewBox If true, subtracts line.x and line.y from coordinates (for selection UI)\r\n */\r\n computeClippedLinePath(line: KritzelLine, offsetByViewBox: boolean = false): string {\r\n // Check for snap candidate first - this applies during drag operations even without anchors\r\n const snapCandidate = this.getSnapCandidate();\r\n const selectionGroup = this._core.store.selectionGroup;\r\n const hasActiveSnapCandidate = snapCandidate && selectionGroup && selectionGroup.objects.length === 1 && selectionGroup.objects[0].id === line.id;\r\n\r\n // If no anchors and no active snap candidate, return original path (with or without offset)\r\n if (!line.startAnchor && !line.endAnchor && !hasActiveSnapCandidate) {\r\n if (offsetByViewBox) {\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n return `M ${line.startX - line.x} ${line.startY - line.y} Q ${line.controlX - line.x} ${line.controlY - line.y} ${line.endX - line.x} ${line.endY - line.y}`;\r\n }\r\n return `M ${line.startX - line.x} ${line.startY - line.y} L ${line.endX - line.x} ${line.endY - line.y}`;\r\n }\r\n return line.d;\r\n }\r\n\r\n const startTarget = line.startAnchor ? this.findAnchorTarget(line, 'start') : null;\r\n const endTarget = line.endAnchor ? this.findAnchorTarget(line, 'end') : null;\r\n let startClip = startTarget ? this.computeAnchorClipInfo(line, 'start', startTarget) : null;\r\n let endClip = endTarget ? this.computeAnchorClipInfo(line, 'end', endTarget) : null;\r\n\r\n // Apply snap candidate if present and matches this line\r\n if (hasActiveSnapCandidate) {\r\n if (snapCandidate.edgeX !== undefined && snapCandidate.edgeY !== undefined) {\r\n const localEdge = this.lineWorldToLocal(line, snapCandidate.edgeX, snapCandidate.edgeY);\r\n const clipInfo: AnchorClipInfo = {\r\n worldX: snapCandidate.edgeX,\r\n worldY: snapCandidate.edgeY,\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n t: snapCandidate.t\r\n };\r\n\r\n if (snapCandidate.endpoint === 'start') {\r\n startClip = clipInfo;\r\n } else {\r\n endClip = clipInfo;\r\n }\r\n }\r\n }\r\n\r\n // Apply offset if requested (for selection UI which uses coordinates relative to 0,0)\r\n const offsetX = offsetByViewBox ? line.x : 0;\r\n const offsetY = offsetByViewBox ? line.y : 0;\r\n\r\n // Handle curved lines by splitting the quadratic at the clipped parameters\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n let startT = startClip?.t ?? 0;\r\n let endT = endClip?.t ?? 1;\r\n\r\n\r\n // Adjust for start arrow\r\n if (startClip && line.hasStartArrow) {\r\n const arrowOffset = line.getArrowSize('start');\r\n const speed = this.evaluateDerivativeSpeedAtT(line, startT);\r\n if (speed > 0) {\r\n startT += arrowOffset / speed;\r\n }\r\n }\r\n\r\n // Adjust for end arrow\r\n if (endClip && line.hasEndArrow) {\r\n const arrowOffset = line.getArrowSize('end');\r\n const speed = this.evaluateDerivativeSpeedAtT(line, endT);\r\n if (speed > 0) {\r\n endT -= arrowOffset / speed;\r\n }\r\n }\r\n\r\n // Ensure valid range\r\n if (startT < 0) startT = 0;\r\n if (endT > 1) endT = 1;\r\n\r\n // Handle overlap or invalid range\r\n if (endT <= startT) {\r\n // If the arrow adjustment caused them to cross, or they were already crossed/close\r\n // We can either effectively hide the line, or just clamp them.\r\n // If we clamp them to the midpoint, the line becomes a point.\r\n // Let's ensure a minimal gap or just set them equal.\r\n const mid = (startT + endT) / 2;\r\n startT = mid;\r\n endT = mid;\r\n }\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: line.startX, y: line.startY },\r\n { x: line.controlX, y: line.controlY },\r\n { x: line.endX, y: line.endY },\r\n startT,\r\n endT\r\n );\r\n\r\n return `M ${segment.start.x - offsetX} ${segment.start.y - offsetY} Q ${segment.control.x - offsetX} ${segment.control.y - offsetY} ${segment.end.x - offsetX} ${segment.end.y - offsetY}`;\r\n }\r\n\r\n // Straight lines fall back to linear interpolation\r\n let startX = startClip?.localX ?? line.startX;\r\n let startY = startClip?.localY ?? line.startY;\r\n let endX = endClip?.localX ?? line.endX;\r\n let endY = endClip?.localY ?? line.endY;\r\n\r\n if (startClip && line.hasStartArrow) {\r\n const arrowOffset = line.getArrowSize('start');\r\n const dx = endX - startX;\r\n const dy = endY - startY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n if (length > arrowOffset) {\r\n startX += (dx / length) * arrowOffset;\r\n startY += (dy / length) * arrowOffset;\r\n }\r\n }\r\n\r\n if (endClip && line.hasEndArrow) {\r\n const arrowOffset = line.getArrowSize('end');\r\n const dx = startX - endX;\r\n const dy = startY - endY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n if (length > arrowOffset) {\r\n endX += (dx / length) * arrowOffset;\r\n endY += (dy / length) * arrowOffset;\r\n }\r\n }\r\n\r\n return `M ${startX - offsetX} ${startY - offsetY} L ${endX - offsetX} ${endY - offsetY}`;\r\n }\r\n\r\n public computeAnchorClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n return this.computeCurvedClipInfo(line, endpoint, targetObject);\r\n }\r\n return this.computeStraightClipInfo(line, endpoint, targetObject);\r\n }\r\n\r\n private computeStraightClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n const reference = endpoint === 'start'\r\n ? this.lineLocalToWorld(line, line.endX, line.endY)\r\n : this.lineLocalToWorld(line, line.startX, line.startY);\r\n\r\n // Check for path object (uses stroke edge detection)\r\n const pathClipPoint = this.getPathClipPoint(targetObject, reference);\r\n if (pathClipPoint) {\r\n const localEdge = this.lineWorldToLocal(line, pathClipPoint.x, pathClipPoint.y);\r\n const totalLength = Math.sqrt(\r\n Math.pow(line.endX - line.startX, 2) +\r\n Math.pow(line.endY - line.startY, 2)\r\n );\r\n const distanceFromStart = Math.sqrt(\r\n Math.pow(localEdge.x - line.startX, 2) +\r\n Math.pow(localEdge.y - line.startY, 2)\r\n );\r\n const t = totalLength > 0 ? distanceFromStart / totalLength : endpoint === 'start' ? 0 : 1;\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: pathClipPoint.x,\r\n worldY: pathClipPoint.y,\r\n t,\r\n };\r\n }\r\n\r\n // Check for custom clip polygon (ellipse, triangle shapes)\r\n const customClipPolygon = this.getClipPolygonForObject(targetObject);\r\n\r\n let edgeIntersection: KritzelPoint | null;\r\n if (customClipPolygon) {\r\n // Use custom polygon for non-rectangular shapes\r\n edgeIntersection = KritzelGeometryHelper.getLinePointsArrayIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n customClipPolygon\r\n );\r\n } else {\r\n // Fall back to bounding box for rectangles and other objects\r\n edgeIntersection = KritzelGeometryHelper.getLinePolygonIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n targetObject.rotatedPolygon\r\n );\r\n }\r\n\r\n if (!edgeIntersection) {\r\n return null;\r\n }\r\n\r\n const localEdge = this.lineWorldToLocal(line, edgeIntersection.x, edgeIntersection.y);\r\n const totalLength = Math.sqrt(\r\n Math.pow(line.endX - line.startX, 2) +\r\n Math.pow(line.endY - line.startY, 2)\r\n );\r\n const distanceFromStart = Math.sqrt(\r\n Math.pow(localEdge.x - line.startX, 2) +\r\n Math.pow(localEdge.y - line.startY, 2)\r\n );\r\n const t = totalLength > 0 ? distanceFromStart / totalLength : endpoint === 'start' ? 0 : 1;\r\n\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: edgeIntersection.x,\r\n worldY: edgeIntersection.y,\r\n t,\r\n };\r\n }\r\n\r\n private computeCurvedClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n // Check for path object (uses stroke edge detection via sampling)\r\n if (KritzelClassHelper.isInstanceOf<KritzelPath>(targetObject, 'KritzelPath')) {\r\n // For curved lines to paths, sample along the curve to find stroke edge\r\n const path = targetObject as KritzelPath;\r\n return this.findCurveExitPointForPath(line, endpoint, path);\r\n }\r\n\r\n // Check for custom clip polygon (ellipse, triangle shapes)\r\n const customClipPolygon = this.getClipPolygonForObject(targetObject);\r\n const polygonPoints = customClipPolygon ?? this.getPolygonPoints(targetObject.rotatedPolygon);\r\n\r\n const exitPoint = this.findCurveExitPoint(line, endpoint, polygonPoints);\r\n if (exitPoint) {\r\n return exitPoint;\r\n }\r\n\r\n const reference = endpoint === 'start'\r\n ? this.lineLocalToWorld(line, line.endX, line.endY)\r\n : this.lineLocalToWorld(line, line.startX, line.startY);\r\n\r\n let fallbackIntersection: KritzelPoint | null;\r\n if (customClipPolygon) {\r\n fallbackIntersection = KritzelGeometryHelper.getLinePointsArrayIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n customClipPolygon\r\n );\r\n } else {\r\n fallbackIntersection = KritzelGeometryHelper.getLinePolygonIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n targetObject.rotatedPolygon\r\n );\r\n }\r\n\r\n if (!fallbackIntersection) {\r\n return null;\r\n }\r\n\r\n const localEdge = this.lineWorldToLocal(line, fallbackIntersection.x, fallbackIntersection.y);\r\n const approxT = this.approximateParameterForWorldPoint(line, fallbackIntersection);\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: fallbackIntersection.x,\r\n worldY: fallbackIntersection.y,\r\n t: approxT,\r\n };\r\n }\r\n\r\n private findCurveExitPoint(line: KritzelLine, endpoint: 'start' | 'end', polygonPoints: KritzelPoint[]): AnchorClipInfo | null {\r\n const steps = 64;\r\n const initialT = endpoint === 'start' ? 0 : 1;\r\n const initialSample = this.evaluateLineAtT(line, initialT);\r\n let prevInside = KritzelGeometryHelper.isPointInPolygon({ x: initialSample.worldX, y: initialSample.worldY }, polygonPoints);\r\n let prevT = initialT;\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const t = endpoint === 'start' ? i / steps : 1 - i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const inside = KritzelGeometryHelper.isPointInPolygon({ x: sample.worldX, y: sample.worldY }, polygonPoints);\r\n\r\n if (prevInside && !inside) {\r\n const refinedT = this.refineCurveExitParameter(line, polygonPoints, prevT, t);\r\n const refinedPoint = this.evaluateLineAtT(line, refinedT);\r\n return {\r\n localX: refinedPoint.localX,\r\n localY: refinedPoint.localY,\r\n worldX: refinedPoint.worldX,\r\n worldY: refinedPoint.worldY,\r\n t: refinedT,\r\n };\r\n }\r\n\r\n prevInside = inside;\r\n prevT = t;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds the exit point for a curved line going to a Path object.\r\n * Uses distance-to-stroke sampling instead of polygon containment.\r\n */\r\n private findCurveExitPointForPath(line: KritzelLine, endpoint: 'start' | 'end', path: KritzelPath): AnchorClipInfo | null {\r\n const steps = 64;\r\n const initialT = endpoint === 'start' ? 0 : 1;\r\n const halfStroke = path.strokeWidth / path.scale / 2;\r\n\r\n // Ensure path has computed points\r\n const pathPoints = this.getPathAdjustedPoints(path);\r\n if (pathPoints.length < 1) {\r\n return null;\r\n }\r\n\r\n // Check if starting point is inside the stroke\r\n const initialSample = this.evaluateLineAtT(line, initialT);\r\n let prevInside = this.isPointInPathStroke(initialSample.worldX, initialSample.worldY, pathPoints, halfStroke);\r\n let prevT = initialT;\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const t = endpoint === 'start' ? i / steps : 1 - i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const inside = this.isPointInPathStroke(sample.worldX, sample.worldY, pathPoints, halfStroke);\r\n\r\n if (prevInside && !inside) {\r\n // Refine using binary search\r\n const refinedT = this.refineCurveExitParameterForPath(line, pathPoints, halfStroke, prevT, t);\r\n const refinedPoint = this.evaluateLineAtT(line, refinedT);\r\n return {\r\n localX: refinedPoint.localX,\r\n localY: refinedPoint.localY,\r\n worldX: refinedPoint.worldX,\r\n worldY: refinedPoint.worldY,\r\n t: refinedT,\r\n };\r\n }\r\n\r\n prevInside = inside;\r\n prevT = t;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private refineCurveExitParameterForPath(\r\n line: KritzelLine,\r\n pathPoints: number[][],\r\n halfStroke: number,\r\n insideT: number,\r\n outsideT: number\r\n ): number {\r\n let tInside = insideT;\r\n let tOutside = outsideT;\r\n\r\n for (let i = 0; i < 8; i++) {\r\n const mid = (tInside + tOutside) / 2;\r\n const sample = this.evaluateLineAtT(line, mid);\r\n const inside = this.isPointInPathStroke(sample.worldX, sample.worldY, pathPoints, halfStroke);\r\n if (inside) {\r\n tInside = mid;\r\n } else {\r\n tOutside = mid;\r\n }\r\n }\r\n\r\n return (tInside + tOutside) / 2;\r\n }\r\n\r\n private getPathAdjustedPoints(path: KritzelPath): number[][] {\r\n // Access the path's adjusted points through its internal computation\r\n // We'll need to manually compute them since they're private\r\n return this.computePathAdjustedPoints(path);\r\n }\r\n\r\n private computePathAdjustedPoints(path: KritzelPath): number[][] {\r\n if (!path.points?.length) {\r\n return [];\r\n }\r\n\r\n const angle = path.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const xs = path.points.map(p => p[0]);\r\n const ys = path.points.map(p => p[1]);\r\n const pivot = {\r\n x: (Math.min(...xs) + Math.max(...xs)) / 2,\r\n y: (Math.min(...ys) + Math.max(...ys)) / 2,\r\n };\r\n\r\n const { x: cx, y: cy } = pivot;\r\n\r\n const rotatedPoints = path.points.map(([x, y]) => {\r\n const dx = x - cx;\r\n const dy = y - cy;\r\n return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];\r\n });\r\n\r\n return rotatedPoints.map(([px, py]) => [\r\n Math.abs(px - path.x) / path.scale + path.translateX,\r\n Math.abs(py - path.y) / path.scale + path.translateY,\r\n ]);\r\n }\r\n\r\n private isPointInPathStroke(x: number, y: number, pathPoints: number[][], halfStroke: number): boolean {\r\n if (pathPoints.length === 1) {\r\n const p = pathPoints[0];\r\n const dx = x - p[0];\r\n const dy = y - p[1];\r\n return Math.sqrt(dx * dx + dy * dy) <= halfStroke;\r\n }\r\n\r\n for (let i = 0; i < pathPoints.length - 1; i++) {\r\n const p1 = pathPoints[i];\r\n const p2 = pathPoints[i + 1];\r\n const dist = this.pointToSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);\r\n if (dist <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private pointToSegmentDistance(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const lengthSquared = dx * dx + dy * dy;\r\n\r\n if (lengthSquared === 0) {\r\n return Math.sqrt((px - x1) * (px - x1) + (py - y1) * (py - y1));\r\n }\r\n\r\n let t = ((px - x1) * dx + (py - y1) * dy) / lengthSquared;\r\n t = Math.max(0, Math.min(1, t));\r\n\r\n const nearestX = x1 + t * dx;\r\n const nearestY = y1 + t * dy;\r\n\r\n return Math.sqrt((px - nearestX) * (px - nearestX) + (py - nearestY) * (py - nearestY));\r\n }\r\n\r\n\r\n\r\n private refineCurveExitParameter(line: KritzelLine, polygonPoints: KritzelPoint[], insideT: number, outsideT: number): number {\r\n let tInside = insideT;\r\n let tOutside = outsideT;\r\n\r\n for (let i = 0; i < 8; i++) {\r\n const mid = (tInside + tOutside) / 2;\r\n const sample = this.evaluateLineAtT(line, mid);\r\n const inside = KritzelGeometryHelper.isPointInPolygon({ x: sample.worldX, y: sample.worldY }, polygonPoints);\r\n if (inside) {\r\n tInside = mid;\r\n } else {\r\n tOutside = mid;\r\n }\r\n }\r\n\r\n return (tInside + tOutside) / 2;\r\n }\r\n\r\n private approximateParameterForWorldPoint(line: KritzelLine, target: { x: number; y: number }): number {\r\n const steps = 80;\r\n let bestT = 0;\r\n let bestDistance = Infinity;\r\n\r\n for (let i = 0; i <= steps; i++) {\r\n const t = i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const distance = Math.hypot(sample.worldX - target.x, sample.worldY - target.y);\r\n if (distance < bestDistance) {\r\n bestDistance = distance;\r\n bestT = t;\r\n }\r\n }\r\n\r\n return bestT;\r\n }\r\n\r\n private evaluateLineAtT(\r\n line: KritzelLine,\r\n t: number\r\n ): { t: number; localX: number; localY: number; worldX: number; worldY: number } {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n let localX: number;\r\n let localY: number;\r\n\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n const oneMinusT = 1 - clampedT;\r\n localX = oneMinusT * oneMinusT * line.startX + 2 * oneMinusT * clampedT * line.controlX + clampedT * clampedT * line.endX;\r\n localY = oneMinusT * oneMinusT * line.startY + 2 * oneMinusT * clampedT * line.controlY + clampedT * clampedT * line.endY;\r\n } else {\r\n localX = line.startX + (line.endX - line.startX) * clampedT;\r\n localY = line.startY + (line.endY - line.startY) * clampedT;\r\n }\r\n\r\n const world = this.lineLocalToWorld(line, localX, localY);\r\n return { t: clampedT, localX, localY, worldX: world.x, worldY: world.y };\r\n }\r\n\r\n private evaluateDerivativeSpeedAtT(line: KritzelLine, t: number): number {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n // Quadratic Bezier derivative: B'(t) = 2(1-t)(P1-P0) + 2t(P2-P1)\r\n const p0x = line.startX;\r\n const p0y = line.startY;\r\n const p1x = line.controlX;\r\n const p1y = line.controlY;\r\n const p2x = line.endX;\r\n const p2y = line.endY;\r\n\r\n const dx = 2 * (1 - clampedT) * (p1x - p0x) + 2 * clampedT * (p2x - p1x);\r\n const dy = 2 * (1 - clampedT) * (p1y - p0y) + 2 * clampedT * (p2y - p1y);\r\n\r\n return Math.sqrt(dx * dx + dy * dy);\r\n } else {\r\n // Straight line speed is constant length\r\n const dx = line.endX - line.startX;\r\n const dy = line.endY - line.startY;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n }\r\n\r\n private extractQuadraticSegment(\r\n start: QuadraticPoint,\r\n control: QuadraticPoint,\r\n end: QuadraticPoint,\r\n tStart: number,\r\n tEnd: number\r\n ): QuadraticSegment {\r\n let normalizedStart = Math.max(0, Math.min(1, tStart));\r\n let normalizedEnd = Math.max(0, Math.min(1, tEnd));\r\n\r\n if (normalizedEnd < normalizedStart) {\r\n const swap = normalizedStart;\r\n normalizedStart = normalizedEnd;\r\n normalizedEnd = swap;\r\n }\r\n\r\n let segment: QuadraticSegment = { start, control, end };\r\n\r\n if (normalizedStart > 0) {\r\n const split = this.splitQuadraticSegment(segment, normalizedStart);\r\n segment = split.right;\r\n const remainingRange = 1 - normalizedStart;\r\n normalizedEnd = remainingRange > 0 ? (normalizedEnd - normalizedStart) / remainingRange : 1;\r\n }\r\n\r\n if (normalizedEnd < 1) {\r\n const split = this.splitQuadraticSegment(segment, normalizedEnd);\r\n segment = split.left;\r\n }\r\n\r\n return segment;\r\n }\r\n\r\n private splitQuadraticSegment(segment: QuadraticSegment, t: number): { left: QuadraticSegment; right: QuadraticSegment } {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n const p0 = segment.start;\r\n const p1 = segment.control;\r\n const p2 = segment.end;\r\n\r\n const p01 = this.lerpPoint(p0, p1, clampedT);\r\n const p12 = this.lerpPoint(p1, p2, clampedT);\r\n const p012 = this.lerpPoint(p01, p12, clampedT);\r\n\r\n return {\r\n left: { start: p0, control: p01, end: p012 },\r\n right: { start: p012, control: p12, end: p2 },\r\n };\r\n }\r\n\r\n private lerpPoint(a: QuadraticPoint, b: QuadraticPoint, t: number): QuadraticPoint {\r\n return {\r\n x: a.x + (b.x - a.x) * t,\r\n y: a.y + (b.y - a.y) * t,\r\n };\r\n }\r\n\r\n private buildAnchorPath(\r\n line: KritzelLine,\r\n endpoint: 'start' | 'end',\r\n clipInfo: AnchorClipInfo,\r\n targetObject: KritzelBaseObject<Element>\r\n ): string | null {\r\n if (line.controlX === undefined || line.controlY === undefined || clipInfo.t === undefined) {\r\n return `M ${clipInfo.worldX} ${clipInfo.worldY} L ${targetObject.centerX} ${targetObject.centerY}`;\r\n }\r\n\r\n const startT = endpoint === 'start' ? 0 : clipInfo.t;\r\n const endT = endpoint === 'start' ? clipInfo.t : 1;\r\n\r\n if (endT <= startT) {\r\n return `M ${clipInfo.worldX} ${clipInfo.worldY} L ${targetObject.centerX} ${targetObject.centerY}`;\r\n }\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: line.startX, y: line.startY },\r\n { x: line.controlX, y: line.controlY },\r\n { x: line.endX, y: line.endY },\r\n startT,\r\n endT\r\n );\r\n\r\n const reverse = endpoint === 'start';\r\n return this.buildWorldQuadraticPath(line, segment, reverse);\r\n }\r\n\r\n private buildWorldQuadraticPath(line: KritzelLine, segment: QuadraticSegment, reverse: boolean = false): string {\r\n const startPoint = reverse ? segment.end : segment.start;\r\n const endPoint = reverse ? segment.start : segment.end;\r\n const controlPoint = segment.control;\r\n\r\n const startWorld = this.lineLocalToWorld(line, startPoint.x, startPoint.y);\r\n const controlWorld = this.lineLocalToWorld(line, controlPoint.x, controlPoint.y);\r\n const endWorld = this.lineLocalToWorld(line, endPoint.x, endPoint.y);\r\n\r\n return `M ${startWorld.x} ${startWorld.y} Q ${controlWorld.x} ${controlWorld.y} ${endWorld.x} ${endWorld.y}`;\r\n }\r\n\r\n private getPolygonPoints(polygon: KritzelPolygon): KritzelPoint[] {\r\n return [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n }\r\n\r\n /**\r\n * Gets the custom clip polygon for an object if it has one.\r\n * Returns null for objects that should use the default rotatedPolygon.\r\n */\r\n private getClipPolygonForObject(object: KritzelBaseObject<Element>): KritzelPoint[] | null {\r\n // Check if the object is a KritzelShape with a custom clip polygon\r\n if (KritzelClassHelper.isInstanceOf<KritzelShape>(object, 'KritzelShape')) {\r\n const shape = object as KritzelShape;\r\n return shape.getClipPolygon();\r\n }\r\n // Path objects use getPathClipPoint instead of polygon\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the clip point for a Path object (stroke edge intersection).\r\n * Returns null if the object is not a Path or no intersection found.\r\n */\r\n private getPathClipPoint(object: KritzelBaseObject<Element>, outsidePoint: KritzelPoint): KritzelPoint | null {\r\n if (KritzelClassHelper.isInstanceOf<KritzelPath>(object, 'KritzelPath')) {\r\n const path = object as KritzelPath;\r\n return path.getClipPoint(outsidePoint);\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Converts local line coordinates to world coordinates.\r\n */\r\n private lineLocalToWorld(line: KritzelLine, localX: number, localY: number): { x: number; y: number } {\r\n const px = localX - line.x;\r\n const py = localY - line.y;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(line.rotation);\r\n const sin = Math.sin(line.rotation);\r\n\r\n const rotatedX = (px - cx) * cos - (py - cy) * sin + cx;\r\n const rotatedY = (px - cx) * sin + (py - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX / line.scale + line.translateX,\r\n y: rotatedY / line.scale + line.translateY,\r\n };\r\n }\r\n\r\n /**\r\n * Converts world coordinates to line's local SVG coordinates.\r\n */\r\n private lineWorldToLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n const dx = (worldX - line.translateX) * line.scale;\r\n const dy = (worldY - line.translateY) * line.scale;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n\r\n const rotatedX = (dx - cx) * cos - (dy - cy) * sin + cx;\r\n const rotatedY = (dx - cx) * sin + (dy - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX + line.x,\r\n y: rotatedY + line.y,\r\n };\r\n }\r\n\r\n /**\r\n * Checks if an object can be used as an anchor target.\r\n */\r\n private isAnchorable(object: KritzelBaseObject<Element>): boolean {\r\n // Exclude selection-related objects\r\n if (object instanceof KritzelSelectionBox || object instanceof KritzelSelectionGroup) {\r\n return false;\r\n }\r\n\r\n // Exclude line objects - lines cannot be anchored to other lines\r\n if (object instanceof KritzelLine) {\r\n return false;\r\n }\r\n\r\n // All other visible objects can be anchored to\r\n return object.isVisible;\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cursor.manager.js","sourceRoot":"","sources":["../../../src/classes/managers/cursor.manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCursorHelper } from '../../helpers/cursor.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\n\r\n/**\r\n * Manages cursor state and updates across the application.\r\n * Handles cursor changes based on handle hovers, tool states, and interactions.\r\n */\r\nexport class KritzelCursorManager {\r\n private readonly _core: KritzelCore;\r\n private _targetElement: HTMLElement | null = null;\r\n private _shadowRoot: ShadowRoot | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n /**\r\n * Sets the target element where cursor styles will be applied.\r\n * Also sets the pointer cursor CSS variable for child components.\r\n */\r\n setTargetElement(element: HTMLElement | null): void {\r\n // Reset cursor on old target\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = '';\r\n this._targetElement.style.removeProperty('--kritzel-pointer-cursor');\r\n }\r\n\r\n this._targetElement = element;\r\n\r\n // Set the pointer cursor CSS variable for child components to use\r\n if (this._targetElement) {\r\n this._targetElement.style.setProperty('--kritzel-pointer-cursor', KritzelCursorHelper.getPointerCursor());\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current cursor target element.\r\n */\r\n getTargetElement(): HTMLElement | null {\r\n return this._targetElement;\r\n }\r\n\r\n /**\r\n * Sets the shadow root for element detection.\r\n */\r\n setShadowRoot(shadowRoot: ShadowRoot): void {\r\n this._shadowRoot = shadowRoot;\r\n }\r\n\r\n /**\r\n * Resets cursor to default state.\r\n * Should be called when all pointers are released.\r\n */\r\n resetToDefault(): void {\r\n this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };\r\n }\r\n\r\n /**\r\n * Detects handle hover states using elementsFromPoint() to work with overlapped elements.\r\n * This approach finds all elements at the pointer position instead of relying on pointerenter/pointerleave.\r\n */\r\n updateHoverState(ev: PointerEvent): void {\r\n if (this._core.store.isPointerDown) return;\r\n if (!this._shadowRoot) return;\r\n\r\n const elementsAtPoint = this._shadowRoot.elementsFromPoint(ev.clientX, ev.clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return;\r\n\r\n // Check for resize handle overlays (selection group)\r\n const resizeHandleOverlay = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));\r\n if (resizeHandleOverlay) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n const rotationDegrees = selectionGroup?.rotationDegrees ?? 0;\r\n\r\n // Determine rotation offset based on handle position\r\n const isTopLeft = resizeHandleOverlay.classList.contains('top-left');\r\n const isBottomRight = resizeHandleOverlay.classList.contains('bottom-right');\r\n const rotationOffset = (isTopLeft || isBottomRight) ? -45 : 45;\r\n\r\n this._core.store.state.cursor = { icon: 'move-vertical', rotation: rotationDegrees + rotationOffset };\r\n return;\r\n }\r\n\r\n // Check for rotation handle overlay\r\n const rotationHandleOverlay = elementsAtPoint.find(el => el.classList.contains('rotation-handle-overlay'));\r\n if (rotationHandleOverlay) {\r\n this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };\r\n return;\r\n }\r\n\r\n // Check for line handle overlays (selection line)\r\n const lineHandleOverlay = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));\r\n if (lineHandleOverlay) {\r\n this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };\r\n return;\r\n }\r\n\r\n // Reset cursor if not hovering any handle\r\n this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };\r\n }\r\n\r\n /**\r\n * Applies the current cursor state to the target element.\r\n * Should be called in the render loop.\r\n */\r\n applyCursor(): void {\r\n const state = this._core.store.state;\r\n const isPointerDown = this._core.store.isPointerDown;\r\n\r\n const icon = state.cursor?.icon;\r\n const iconActive = state.cursor?.iconActive ?? icon;\r\n const rotation = state.cursor?.rotation;\r\n\r\n const cursor = KritzelCursorHelper.getCursor({\r\n iconName: isPointerDown ? iconActive : icon,\r\n rotation: rotation,\r\n });\r\n\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = cursor;\r\n }\r\n }\r\n\r\n /**\r\n * Cleans up cursor state when the component is disconnected.\r\n */\r\n cleanup(): void {\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = '';\r\n this._targetElement.style.removeProperty('--kritzel-pointer-cursor');\r\n }\r\n this._targetElement = null;\r\n this._shadowRoot = null;\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"base-object.class.js","sourceRoot":"","sources":["../../../src/classes/objects/base-object.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBoundingBox } from '../../interfaces/bounding-box.interface';\r\nimport { KritzelObject } from '../../interfaces/object.interface';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelSerializable } from '../../interfaces/serializable.interface';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelClonable } from '../../interfaces/clonable.interface';\r\n\r\nexport class KritzelBaseObject<T extends Element = HTMLElement | SVGElement> implements KritzelObject<T>, KritzelSerializable, KritzelClonable<KritzelBaseObject<T>> {\r\n __class__: string = 'KritzelBaseObject';\r\n\r\n _core: KritzelCore;\r\n _elementRef: T;\r\n\r\n id: string;\r\n workspaceId: string;\r\n x: number;\r\n y: number;\r\n translateX: number;\r\n translateY: number;\r\n height: number;\r\n width: number;\r\n backgroundColor: string;\r\n borderColor: string;\r\n borderWidth: number = 0;\r\n opacity: number = 1;\r\n padding: number = 0;\r\n scale: number;\r\n resizing: boolean = false;\r\n rotation: number = 0;\r\n markedForRemoval: boolean = false;\r\n zIndex: number = 0;\r\n\r\n isVisible: boolean = true;\r\n isSelected: boolean = false;\r\n isHovered: boolean = false;\r\n isMounted: boolean = false;\r\n isEditable: boolean = false;\r\n isInteractive: boolean = false;\r\n isDebugInfoVisible: boolean = false;\r\n\r\n get totalWidth(): number {\r\n return this.width + this.padding * 2;\r\n }\r\n\r\n get totalHeight(): number {\r\n return this.height + this.padding * 2;\r\n }\r\n\r\n set elementRef(element: T) {\r\n this._elementRef = element;\r\n }\r\n\r\n get elementRef(): T {\r\n return this._elementRef;\r\n }\r\n\r\n get boundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.translateX,\r\n y: this.translateY,\r\n z: this.scale,\r\n width: this.totalWidth / this.scale,\r\n height: this.totalHeight / this.scale,\r\n };\r\n }\r\n\r\n get rotatedBoundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.minXRotated,\r\n y: this.minYRotated,\r\n z: this.scale,\r\n width: this.maxXRotated - this.minXRotated,\r\n height: this.maxYRotated - this.minYRotated,\r\n };\r\n }\r\n\r\n get rotatedPolygon(): KritzelPolygon {\r\n const cx = this.translateX + this.totalWidth / 2 / this.scale;\r\n const cy = this.translateY + this.totalHeight / 2 / this.scale;\r\n const angle = this.rotation;\r\n\r\n const adjustedWidth = this.totalWidth / this.scale;\r\n const adjustedHeight = this.totalHeight / this.scale;\r\n\r\n const corners = {\r\n topLeft: { x: this.translateX, y: this.translateY },\r\n topRight: { x: this.translateX + adjustedWidth, y: this.translateY },\r\n bottomRight: { x: this.translateX + adjustedWidth, y: this.translateY + adjustedHeight },\r\n bottomLeft: { x: this.translateX, y: this.translateY + adjustedHeight },\r\n };\r\n\r\n const rotatedCorners = Object.keys(corners).reduce((acc, key) => {\r\n const corner = corners[key];\r\n const rotatedX = Math.cos(angle) * (corner.x - cx) - Math.sin(angle) * (corner.y - cy) + cx;\r\n const rotatedY = Math.sin(angle) * (corner.x - cx) + Math.cos(angle) * (corner.y - cy) + cy;\r\n acc[key] = { x: rotatedX, y: rotatedY };\r\n return acc;\r\n }, {});\r\n\r\n return rotatedCorners as KritzelPolygon;\r\n }\r\n\r\n get minXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get minYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get maxXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get maxYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get transformationMatrix(): string {\r\n const scale = 1 / this.scale;\r\n const translateX = this.translateX;\r\n const translateY = this.translateY;\r\n\r\n return `matrix(${scale}, 0, 0, ${scale}, ${translateX}, ${translateY})`;\r\n }\r\n\r\n get rotationDegrees(): number {\r\n return this.rotation * (180 / Math.PI);\r\n }\r\n\r\n get centerX(): number {\r\n return this.translateX + this.totalWidth / 2 / this.scale;\r\n }\r\n\r\n get centerY(): number {\r\n return this.translateY + this.totalHeight / 2 / this.scale;\r\n }\r\n\r\n constructor() {\r\n this.id = this.generateId();\r\n }\r\n\r\n static create(core: KritzelCore): KritzelBaseObject<Element> {\r\n const object = new KritzelBaseObject();\r\n\r\n object._core = core;\r\n object.zIndex = core.store.currentZIndex;\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n\r\n return object;\r\n }\r\n\r\n mount(element: T): void {\r\n if (this.isMounted) {\r\n return;\r\n }\r\n\r\n this.elementRef = element;\r\n this.isMounted = true;\r\n }\r\n\r\n generateId(): string {\r\n return ObjectHelper.generateUUID();\r\n }\r\n\r\n isInViewport(): boolean {\r\n\r\n const viewportScale = this._core.store.state.scale;\r\n const scaledWidth = this.boundingBox.width * viewportScale;\r\n const scaledHeight = this.boundingBox.height * viewportScale;\r\n \r\n if(scaledWidth * scaledHeight < 0.5){\r\n return false;\r\n }\r\n\r\n\r\n const viewportBounds: KritzelBoundingBox = {\r\n x: -this._core.store.state.translateX / this._core.store.state.scale,\r\n y: -this._core.store.state.translateY / this._core.store.state.scale,\r\n z: this._core.store.state.scale,\r\n width: this._core.store.state.viewportWidth / this._core.store.state.scale,\r\n height: this._core.store.state.viewportHeight / this._core.store.state.scale,\r\n };\r\n\r\n return (\r\n this.rotatedBoundingBox.x < viewportBounds.x + viewportBounds.width &&\r\n this.rotatedBoundingBox.x + this.rotatedBoundingBox.width > viewportBounds.x &&\r\n this.rotatedBoundingBox.y < viewportBounds.y + viewportBounds.height &&\r\n this.rotatedBoundingBox.y + this.rotatedBoundingBox.height > viewportBounds.y\r\n );\r\n }\r\n\r\n centerInViewport(): void {\r\n const { viewportWidth, viewportHeight, translateX: viewportTranslateX, translateY: viewportTranslateY, scale: viewportScale } = this._core.store.state;\r\n const { x, y, width, height } = this.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n const targetCenterX = (viewportWidth / 2 - viewportTranslateX) / viewportScale;\r\n const targetCenterY = (viewportHeight / 2 - viewportTranslateY) / viewportScale;\r\n\r\n const deltaX = targetCenterX - objectCenterX;\r\n const deltaY = targetCenterY - objectCenterY;\r\n\r\n this.updatePosition(this.translateX + deltaX, this.translateY + deltaY);\r\n }\r\n\r\n update(): void {\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._core.store.state.scale;\r\n const deltaY = (startY - endY) / this._core.store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n resize(x: number, y: number, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._core.store.state.objects.update(this);\r\n\r\n // Update any lines that are anchored to this object (after position is updated)\r\n this._core.anchorManager.updateAnchorsForObject(this.id);\r\n }\r\n\r\n rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n clone(): KritzelBaseObject<T> {\r\n const clone = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(clone, this);\r\n clone.id = this.id;\r\n return clone;\r\n }\r\n\r\n copy(): KritzelBaseObject<T> {\r\n const copiedObject: KritzelBaseObject<T> = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(copiedObject, this);\r\n copiedObject.id = this.generateId();\r\n copiedObject.isMounted = false;\r\n return copiedObject;\r\n }\r\n\r\n serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {\r\n clonedProps.element = element.cloneNode(true) as HTMLElement;\r\n }\r\n\r\n return clonedProps;\r\n }\r\n\r\n deserialize<T>(object: any): T {\r\n Object.assign(this, object);\r\n return this as unknown as T;\r\n }\r\n\r\n isClass<T extends KritzelBaseObject>(this: T, className: string): this is T {\r\n return this.__class__ === className;\r\n }\r\n\r\n edit(_event?: PointerEvent): void {\r\n // This method can be overridden by subclasses to handle edit actions.\r\n }\r\n\r\n hitTest(_x: number, _y: number): boolean {\r\n return true; // Default implementation, can be overridden by subclasses\r\n }\r\n\r\n hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const objectPolygon = this.rotatedPolygon;\r\n return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);\r\n }\r\n\r\n updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._core.store.state.objects.update(this);\r\n }\r\n}\r\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"custom-element.class.js","sourceRoot":"","sources":["../../../src/classes/objects/custom-element.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelBaseObject } from './base-object.class';\r\n\r\nexport class KritzelCustomElement extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelCustomElement';\r\n\r\n element: HTMLElement;\r\n\r\n isInteractive: boolean = true;\r\n\r\n constructor(config?: { element: HTMLElement; translateX?: number; translateY?: number; scale?: number, height?: number; width?: number }) {\r\n super();\r\n\r\n if (config) {\r\n this.translateX = config.translateX || 0;\r\n this.translateY = config.translateY || 0;\r\n this.scale = config.scale || 1;\r\n this.element = config.element;\r\n this.height = config.height || 0;\r\n this.width = config.width || 0;\r\n }\r\n }\r\n\r\n static override create(core: KritzelCore, config?: {\r\n element: HTMLElement;\r\n translateX?: number;\r\n translateY?: number;\r\n scale?: number;\r\n height?: number;\r\n width?: number;\r\n }): KritzelBaseObject<Element> {\r\n const object = new KritzelCustomElement(config);\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id\r\n\r\n\r\n return object;\r\n }\r\n\r\n override mount(element: HTMLElement): void {\r\n if (element === null) {\r\n return;\r\n }\r\n\r\n // If already mounted to the same element and content is still attached, skip\r\n if (this.isMounted && this.elementRef === element && this.element.parentElement === element) {\r\n return;\r\n }\r\n\r\n this.elementRef = element;\r\n this.isMounted = true;\r\n \r\n // Clear existing content and append the element\r\n this.elementRef.innerHTML = '';\r\n this.elementRef.appendChild(this.element);\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n if (this.element) {\r\n this.element.style.width = `${width}px`;\r\n this.element.style.height = `${height}px`;\r\n }\r\n\r\n // Update to sync changes to y.js and propagate to other tabs\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override copy(): KritzelCustomElement {\r\n const copiedObject: KritzelCustomElement = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(copiedObject, this);\r\n copiedObject.id = this.generateId();\r\n copiedObject.isMounted = false;\r\n copiedObject.element = this.element.cloneNode(true) as HTMLElement;\r\n return copiedObject;\r\n }\r\n\r\n}\r\n"]}