kritzel-stencil 0.0.126 → 0.0.127

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 (378) hide show
  1. package/dist/cjs/app-globals-V2Kpy_OQ.js +8 -0
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js.map +1 -0
  3. package/dist/cjs/index-BacMQbNR.js +2555 -0
  4. package/dist/cjs/index-BacMQbNR.js.map +1 -0
  5. package/dist/cjs/index-C05uAr89.js +1591 -0
  6. package/dist/cjs/index-C05uAr89.js.map +1 -0
  7. package/dist/cjs/index.cjs.js +19 -0
  8. package/dist/cjs/index.cjs.js.map +1 -0
  9. package/dist/cjs/kritzel-brush-style_18.cjs.entry.js +2365 -0
  10. package/dist/cjs/kritzel-brush-style_18.cjs.entry.js.map +1 -0
  11. package/dist/cjs/loader.cjs.js +16 -0
  12. package/dist/cjs/loader.cjs.js.map +1 -0
  13. package/dist/cjs/stencil.cjs.js +28 -0
  14. package/dist/cjs/stencil.cjs.js.map +1 -0
  15. package/dist/collection/classes/commands/add-object.command.js +14 -0
  16. package/dist/collection/classes/commands/add-object.command.js.map +1 -0
  17. package/dist/collection/classes/commands/add-selection-group.command.js +20 -0
  18. package/dist/collection/classes/commands/add-selection-group.command.js.map +1 -0
  19. package/dist/collection/classes/commands/base.command.js +15 -0
  20. package/dist/collection/classes/commands/base.command.js.map +1 -0
  21. package/dist/collection/classes/commands/batch.command.js +14 -0
  22. package/dist/collection/classes/commands/batch.command.js.map +1 -0
  23. package/dist/collection/classes/commands/move-selection-group.command.js +25 -0
  24. package/dist/collection/classes/commands/move-selection-group.command.js.map +1 -0
  25. package/dist/collection/classes/commands/remove-object.command.js +17 -0
  26. package/dist/collection/classes/commands/remove-object.command.js.map +1 -0
  27. package/dist/collection/classes/commands/remove-selection-group.command.js +18 -0
  28. package/dist/collection/classes/commands/remove-selection-group.command.js.map +1 -0
  29. package/dist/collection/classes/commands/resize-selection-group.command.js +18 -0
  30. package/dist/collection/classes/commands/resize-selection-group.command.js.map +1 -0
  31. package/dist/collection/classes/commands/rotate-selection-group.command.js +24 -0
  32. package/dist/collection/classes/commands/rotate-selection-group.command.js.map +1 -0
  33. package/dist/collection/classes/commands/update-object.command.js +29 -0
  34. package/dist/collection/classes/commands/update-object.command.js.map +1 -0
  35. package/dist/collection/classes/commands/update-viewport.command.js +23 -0
  36. package/dist/collection/classes/commands/update-viewport.command.js.map +1 -0
  37. package/dist/collection/classes/handlers/base.handler.js +7 -0
  38. package/dist/collection/classes/handlers/base.handler.js.map +1 -0
  39. package/dist/collection/classes/handlers/context-menu.handler.js +47 -0
  40. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -0
  41. package/dist/collection/classes/handlers/hover.handler.js +19 -0
  42. package/dist/collection/classes/handlers/hover.handler.js.map +1 -0
  43. package/dist/collection/classes/handlers/key.handler.js +81 -0
  44. package/dist/collection/classes/handlers/key.handler.js.map +1 -0
  45. package/dist/collection/classes/handlers/move.handler.js +84 -0
  46. package/dist/collection/classes/handlers/move.handler.js.map +1 -0
  47. package/dist/collection/classes/handlers/resize.handler.js +150 -0
  48. package/dist/collection/classes/handlers/resize.handler.js.map +1 -0
  49. package/dist/collection/classes/handlers/rotation.handler.js +102 -0
  50. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -0
  51. package/dist/collection/classes/handlers/selection.handler.js +200 -0
  52. package/dist/collection/classes/handlers/selection.handler.js.map +1 -0
  53. package/dist/collection/classes/history.class.js +71 -0
  54. package/dist/collection/classes/history.class.js.map +1 -0
  55. package/dist/collection/classes/objects/base-object.class.js +204 -0
  56. package/dist/collection/classes/objects/base-object.class.js.map +1 -0
  57. package/dist/collection/classes/objects/custom-element.class.js +52 -0
  58. package/dist/collection/classes/objects/custom-element.class.js.map +1 -0
  59. package/dist/collection/classes/objects/image.class.js +53 -0
  60. package/dist/collection/classes/objects/image.class.js.map +1 -0
  61. package/dist/collection/classes/objects/path.class.js +268 -0
  62. package/dist/collection/classes/objects/path.class.js.map +1 -0
  63. package/dist/collection/classes/objects/selection-box.class.js +22 -0
  64. package/dist/collection/classes/objects/selection-box.class.js.map +1 -0
  65. package/dist/collection/classes/objects/selection-group.class.js +157 -0
  66. package/dist/collection/classes/objects/selection-group.class.js.map +1 -0
  67. package/dist/collection/classes/objects/text.class.js +141 -0
  68. package/dist/collection/classes/objects/text.class.js.map +1 -0
  69. package/dist/{stencil/icon-registry.class-Bw5YkOTi.js → collection/classes/registries/icon-registry.class.js} +2 -6
  70. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -0
  71. package/dist/collection/classes/registries/tool.registry.js +18 -0
  72. package/dist/collection/classes/registries/tool.registry.js.map +1 -0
  73. package/dist/collection/classes/reviver.class.js +66 -0
  74. package/dist/collection/classes/reviver.class.js.map +1 -0
  75. package/dist/collection/classes/store.class.js +287 -0
  76. package/dist/collection/classes/store.class.js.map +1 -0
  77. package/dist/collection/classes/structures/circular-buffer.structure.js +46 -0
  78. package/dist/collection/classes/structures/circular-buffer.structure.js.map +1 -0
  79. package/dist/collection/classes/structures/octree.structure.js +111 -0
  80. package/dist/collection/classes/structures/octree.structure.js.map +1 -0
  81. package/dist/collection/classes/tools/base-tool.class.js +31 -0
  82. package/dist/collection/classes/tools/base-tool.class.js.map +1 -0
  83. package/dist/collection/classes/tools/brush-tool.class.js +116 -0
  84. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -0
  85. package/dist/collection/classes/tools/eraser-tool.class.js +86 -0
  86. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -0
  87. package/dist/collection/classes/tools/image-tool.class.js +88 -0
  88. package/dist/collection/classes/tools/image-tool.class.js.map +1 -0
  89. package/dist/collection/classes/tools/selection-tool.class.js +156 -0
  90. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -0
  91. package/dist/collection/classes/tools/text-tool.class.js +116 -0
  92. package/dist/collection/classes/tools/text-tool.class.js.map +1 -0
  93. package/dist/collection/classes/viewport.class.js +148 -0
  94. package/dist/collection/classes/viewport.class.js.map +1 -0
  95. package/dist/collection/collection-manifest.json +29 -0
  96. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.css +10 -0
  97. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +154 -0
  98. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js.map +1 -0
  99. package/dist/collection/components/core/kritzel-editor/kritzel-editor.css +24 -0
  100. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +672 -0
  101. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -0
  102. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +60 -0
  103. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +1287 -0
  104. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -0
  105. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.css +44 -0
  106. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js +100 -0
  107. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js.map +1 -0
  108. package/dist/collection/components/shared/kritzel-color/kritzel-color.css +21 -0
  109. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +108 -0
  110. package/dist/collection/components/shared/kritzel-color/kritzel-color.js.map +1 -0
  111. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +46 -0
  112. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +147 -0
  113. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js.map +1 -0
  114. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.css +53 -0
  115. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js +215 -0
  116. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js.map +1 -0
  117. package/dist/collection/components/shared/kritzel-font/kritzel-font.css +10 -0
  118. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +92 -0
  119. package/dist/collection/components/shared/kritzel-font/kritzel-font.js.map +1 -0
  120. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.css +48 -0
  121. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +115 -0
  122. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js.map +1 -0
  123. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.css +30 -0
  124. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +112 -0
  125. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js.map +1 -0
  126. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.css +17 -0
  127. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.js +94 -0
  128. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.js.map +1 -0
  129. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +28 -0
  130. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +91 -0
  131. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js.map +1 -0
  132. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.css +17 -0
  133. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +181 -0
  134. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js.map +1 -0
  135. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.css +55 -0
  136. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +178 -0
  137. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js.map +1 -0
  138. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +19 -0
  139. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +136 -0
  140. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js.map +1 -0
  141. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.css +19 -0
  142. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +116 -0
  143. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js.map +1 -0
  144. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +124 -0
  145. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +268 -0
  146. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +1 -0
  147. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +33 -0
  148. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +79 -0
  149. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js.map +1 -0
  150. package/dist/{stencil/default-text-tool.config-DvOZmpuR.js → collection/configs/default-brush-tool.config.js} +2 -38
  151. package/dist/collection/configs/default-brush-tool.config.js.map +1 -0
  152. package/dist/collection/configs/default-engine-state.js +58 -0
  153. package/dist/collection/configs/default-engine-state.js.map +1 -0
  154. package/dist/collection/configs/default-text-tool.config.js +32 -0
  155. package/dist/collection/configs/default-text-tool.config.js.map +1 -0
  156. package/dist/collection/constants/engine.constants.js +3 -0
  157. package/dist/collection/constants/engine.constants.js.map +1 -0
  158. package/dist/collection/enums/event-button.enum.js +7 -0
  159. package/dist/collection/enums/event-button.enum.js.map +1 -0
  160. package/dist/collection/enums/handle-type.enum.js +8 -0
  161. package/dist/collection/enums/handle-type.enum.js.map +1 -0
  162. package/dist/collection/helpers/class.helper.js +6 -0
  163. package/dist/collection/helpers/class.helper.js.map +1 -0
  164. package/dist/collection/helpers/devices.helper.js +6 -0
  165. package/dist/collection/helpers/devices.helper.js.map +1 -0
  166. package/dist/collection/helpers/event.helper.js +58 -0
  167. package/dist/collection/helpers/event.helper.js.map +1 -0
  168. package/dist/collection/helpers/geometry.helper.js +53 -0
  169. package/dist/collection/helpers/geometry.helper.js.map +1 -0
  170. package/dist/collection/helpers/html.helper.js +7 -0
  171. package/dist/collection/helpers/html.helper.js.map +1 -0
  172. package/dist/collection/helpers/keyboard.helper.js +31 -0
  173. package/dist/collection/helpers/keyboard.helper.js.map +1 -0
  174. package/dist/collection/helpers/math.helper.js +6 -0
  175. package/dist/collection/helpers/math.helper.js.map +1 -0
  176. package/dist/collection/helpers/object.helper.js +38 -0
  177. package/dist/collection/helpers/object.helper.js.map +1 -0
  178. package/dist/collection/index.js +21 -0
  179. package/dist/collection/index.js.map +1 -0
  180. package/dist/collection/interfaces/bounding-box.interface.js +2 -0
  181. package/dist/collection/interfaces/bounding-box.interface.js.map +1 -0
  182. package/dist/collection/interfaces/command.interface.js +2 -0
  183. package/dist/collection/interfaces/command.interface.js.map +1 -0
  184. package/dist/collection/interfaces/context-menu-item.interface.js +2 -0
  185. package/dist/collection/interfaces/context-menu-item.interface.js.map +1 -0
  186. package/dist/collection/interfaces/debug-info.interface.js +2 -0
  187. package/dist/collection/interfaces/debug-info.interface.js.map +1 -0
  188. package/dist/collection/interfaces/engine-state.interface.js +2 -0
  189. package/dist/collection/interfaces/engine-state.interface.js.map +1 -0
  190. package/dist/collection/interfaces/object.interface.js +2 -0
  191. package/dist/collection/interfaces/object.interface.js.map +1 -0
  192. package/dist/collection/interfaces/path-options.interface.js +2 -0
  193. package/dist/collection/interfaces/path-options.interface.js.map +1 -0
  194. package/dist/collection/interfaces/point.interface.js +2 -0
  195. package/dist/collection/interfaces/point.interface.js.map +1 -0
  196. package/dist/collection/interfaces/polygon.interface.js +2 -0
  197. package/dist/collection/interfaces/polygon.interface.js.map +1 -0
  198. package/dist/collection/interfaces/selection-state.interface.js +2 -0
  199. package/dist/collection/interfaces/selection-state.interface.js.map +1 -0
  200. package/dist/collection/interfaces/serializable.interface.js +2 -0
  201. package/dist/collection/interfaces/serializable.interface.js.map +1 -0
  202. package/dist/collection/interfaces/tool.interface.js +2 -0
  203. package/dist/collection/interfaces/tool.interface.js.map +1 -0
  204. package/dist/collection/interfaces/toolbar-control.interface.js +2 -0
  205. package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -0
  206. package/dist/collection/types/state.types.js +2 -0
  207. package/dist/collection/types/state.types.js.map +1 -0
  208. package/dist/components/index.js +24 -0
  209. package/dist/components/index.js.map +1 -0
  210. package/dist/components/kritzel-brush-style.js +9 -0
  211. package/dist/components/kritzel-brush-style.js.map +1 -0
  212. package/dist/components/kritzel-color-palette.js +9 -0
  213. package/dist/components/kritzel-color-palette.js.map +1 -0
  214. package/dist/components/kritzel-color.js +9 -0
  215. package/dist/components/kritzel-color.js.map +1 -0
  216. package/dist/components/kritzel-context-menu.js +9 -0
  217. package/dist/components/kritzel-context-menu.js.map +1 -0
  218. package/dist/components/kritzel-control-brush-config.js +9 -0
  219. package/dist/components/kritzel-control-brush-config.js.map +1 -0
  220. package/dist/components/kritzel-control-text-config.js +9 -0
  221. package/dist/components/kritzel-control-text-config.js.map +1 -0
  222. package/dist/components/kritzel-controls.js +9 -0
  223. package/dist/components/kritzel-controls.js.map +1 -0
  224. package/dist/components/kritzel-cursor-trail.js +9 -0
  225. package/dist/components/kritzel-cursor-trail.js.map +1 -0
  226. package/dist/components/kritzel-dropdown.js +9 -0
  227. package/dist/components/kritzel-dropdown.js.map +1 -0
  228. package/dist/components/kritzel-editor.js +409 -0
  229. package/dist/components/kritzel-editor.js.map +1 -0
  230. package/dist/components/kritzel-engine.js +9 -0
  231. package/dist/components/kritzel-engine.js.map +1 -0
  232. package/dist/components/kritzel-font-family.js +9 -0
  233. package/dist/components/kritzel-font-family.js.map +1 -0
  234. package/dist/components/kritzel-font-size.js +9 -0
  235. package/dist/components/kritzel-font-size.js.map +1 -0
  236. package/dist/components/kritzel-font.js +9 -0
  237. package/dist/components/kritzel-font.js.map +1 -0
  238. package/dist/components/kritzel-icon.js +9 -0
  239. package/dist/components/kritzel-icon.js.map +1 -0
  240. package/dist/components/kritzel-stroke-size.js +9 -0
  241. package/dist/components/kritzel-stroke-size.js.map +1 -0
  242. package/dist/components/kritzel-tooltip.js +9 -0
  243. package/dist/components/kritzel-tooltip.js.map +1 -0
  244. package/dist/components/kritzel-utility-panel.js +9 -0
  245. package/dist/components/kritzel-utility-panel.js.map +1 -0
  246. package/dist/{stencil/kritzel-context-menu-B2p1_Ffh.js → components/p-2gNwfcSP.js} +39 -11
  247. package/dist/components/p-2gNwfcSP.js.map +1 -0
  248. package/dist/components/p-BOUCnklW.js +54 -0
  249. package/dist/components/p-BOUCnklW.js.map +1 -0
  250. package/dist/components/p-BhC-Et5I.js +102 -0
  251. package/dist/components/p-BhC-Et5I.js.map +1 -0
  252. package/dist/components/p-BkFzf8vg.js +111 -0
  253. package/dist/components/p-BkFzf8vg.js.map +1 -0
  254. package/dist/{stencil/kritzel-font-family.entry.js → components/p-BubFkS0u.js} +35 -11
  255. package/dist/components/p-BubFkS0u.js.map +1 -0
  256. package/dist/components/p-C9usqwb5.js +61 -0
  257. package/dist/components/p-C9usqwb5.js.map +1 -0
  258. package/dist/{stencil/kritzel-tooltip.entry.js → components/p-CmlcJ8Kw.js} +37 -14
  259. package/dist/components/p-CmlcJ8Kw.js.map +1 -0
  260. package/dist/components/p-CtiROna-.js +90 -0
  261. package/dist/components/p-CtiROna-.js.map +1 -0
  262. package/dist/components/p-CudOuOAW.js +2716 -0
  263. package/dist/components/p-CudOuOAW.js.map +1 -0
  264. package/dist/components/p-D5a8vnRF.js +52 -0
  265. package/dist/components/p-D5a8vnRF.js.map +1 -0
  266. package/dist/{stencil/event-button.enum-D8W6LE-c.js → components/p-D8W6LE-c.js} +2 -2
  267. package/dist/components/p-D8W6LE-c.js.map +1 -0
  268. package/dist/components/p-DJN0U8pI.js +1327 -0
  269. package/dist/components/p-DJN0U8pI.js.map +1 -0
  270. package/dist/{stencil/kritzel-color-palette.entry.js → components/p-DJc6_PyL.js} +37 -11
  271. package/dist/components/p-DJc6_PyL.js.map +1 -0
  272. package/dist/{stencil/kritzel-controls.entry.js → components/p-DSWoCkxm.js} +116 -16
  273. package/dist/components/p-DSWoCkxm.js.map +1 -0
  274. package/dist/components/p-DcvujuV_.js +54 -0
  275. package/dist/components/p-DcvujuV_.js.map +1 -0
  276. package/dist/{stencil/kritzel-color.entry.js → components/p-DfJEh7HZ.js} +29 -11
  277. package/dist/components/p-DfJEh7HZ.js.map +1 -0
  278. package/dist/components/p-Dp8hrISj.js +44 -0
  279. package/dist/components/p-Dp8hrISj.js.map +1 -0
  280. package/dist/{stencil/kritzel-cursor-trail.entry.js → components/p-EQo4-DJT.js} +30 -11
  281. package/dist/components/p-EQo4-DJT.js.map +1 -0
  282. package/dist/{stencil/kritzel-dropdown.entry.js → components/p-NZJPrwJV.js} +37 -11
  283. package/dist/components/p-NZJPrwJV.js.map +1 -0
  284. package/dist/{stencil/brush-tool.class-D1U3x9_Y.js → components/p-ljdIU3DL.js} +18 -51
  285. package/dist/components/p-ljdIU3DL.js.map +1 -0
  286. package/dist/esm/app-globals-DQuL1Twl.js +6 -0
  287. package/dist/esm/app-globals-DQuL1Twl.js.map +1 -0
  288. package/dist/esm/index-BGl8znzE.js +1564 -0
  289. package/dist/esm/index-BGl8znzE.js.map +1 -0
  290. package/dist/esm/index-D37FADaF.js +2531 -0
  291. package/dist/esm/index-D37FADaF.js.map +1 -0
  292. package/dist/esm/index.js +4 -0
  293. package/dist/esm/index.js.map +1 -0
  294. package/dist/esm/kritzel-brush-style_18.entry.js +2346 -0
  295. package/dist/esm/kritzel-brush-style_18.entry.js.map +1 -0
  296. package/dist/esm/loader.js +14 -0
  297. package/dist/esm/loader.js.map +1 -0
  298. package/dist/esm/stencil.js +24 -0
  299. package/dist/esm/stencil.js.map +1 -0
  300. package/dist/index.cjs.js +1 -0
  301. package/dist/index.js +1 -0
  302. package/dist/stencil/index.esm.js +1 -16
  303. package/dist/stencil/index.esm.js.map +1 -1
  304. package/dist/stencil/loader.esm.js.map +1 -1
  305. package/dist/stencil/p-BGl8znzE.js +3 -0
  306. package/dist/stencil/p-BGl8znzE.js.map +1 -0
  307. package/dist/stencil/p-D37FADaF.js +2 -0
  308. package/dist/stencil/p-D37FADaF.js.map +1 -0
  309. package/dist/stencil/p-DQuL1Twl.js +2 -0
  310. package/dist/stencil/p-DQuL1Twl.js.map +1 -0
  311. package/dist/stencil/p-e6ac7fc6.entry.js +2 -0
  312. package/dist/stencil/p-e6ac7fc6.entry.js.map +1 -0
  313. package/dist/stencil/stencil.esm.js +1 -49
  314. package/dist/stencil/stencil.esm.js.map +1 -1
  315. package/dist/types/classes/objects/base-object.class.d.ts +1 -0
  316. package/dist/types/classes/objects/path.class.d.ts +1 -0
  317. package/dist/types/interfaces/object.interface.d.ts +1 -0
  318. package/package.json +62 -62
  319. package/dist/stencil/brush-tool.class-D1U3x9_Y.js.map +0 -1
  320. package/dist/stencil/default-text-tool.config-DvOZmpuR.js.map +0 -1
  321. package/dist/stencil/engine.constants-DsjjAmnl.js +0 -7
  322. package/dist/stencil/engine.constants-DsjjAmnl.js.map +0 -1
  323. package/dist/stencil/event-button.enum-D8W6LE-c.js.map +0 -1
  324. package/dist/stencil/icon-registry.class-Bw5YkOTi.js.map +0 -1
  325. package/dist/stencil/image-tool.class-uKAmXFSl.js +0 -1341
  326. package/dist/stencil/image-tool.class-uKAmXFSl.js.map +0 -1
  327. package/dist/stencil/index-Df69oUcb.js +0 -4334
  328. package/dist/stencil/index-Df69oUcb.js.map +0 -1
  329. package/dist/stencil/kritzel-brush-style.entry.esm.js.map +0 -1
  330. package/dist/stencil/kritzel-brush-style.entry.js +0 -31
  331. package/dist/stencil/kritzel-brush-style.entry.js.map +0 -1
  332. package/dist/stencil/kritzel-color-palette.entry.esm.js.map +0 -1
  333. package/dist/stencil/kritzel-color-palette.entry.js.map +0 -1
  334. package/dist/stencil/kritzel-color.entry.esm.js.map +0 -1
  335. package/dist/stencil/kritzel-color.entry.js.map +0 -1
  336. package/dist/stencil/kritzel-context-menu-B2p1_Ffh.js.map +0 -1
  337. package/dist/stencil/kritzel-context-menu-DPHV6MRm.js +0 -91
  338. package/dist/stencil/kritzel-context-menu-DPHV6MRm.js.map +0 -1
  339. package/dist/stencil/kritzel-context-menu.entry.esm.js.map +0 -1
  340. package/dist/stencil/kritzel-context-menu.entry.js +0 -5
  341. package/dist/stencil/kritzel-context-menu.entry.js.map +0 -1
  342. package/dist/stencil/kritzel-control-brush-config.entry.esm.js.map +0 -1
  343. package/dist/stencil/kritzel-control-brush-config.entry.js +0 -54
  344. package/dist/stencil/kritzel-control-brush-config.entry.js.map +0 -1
  345. package/dist/stencil/kritzel-control-text-config.entry.esm.js.map +0 -1
  346. package/dist/stencil/kritzel-control-text-config.entry.js +0 -42
  347. package/dist/stencil/kritzel-control-text-config.entry.js.map +0 -1
  348. package/dist/stencil/kritzel-controls.entry.esm.js.map +0 -1
  349. package/dist/stencil/kritzel-controls.entry.js.map +0 -1
  350. package/dist/stencil/kritzel-cursor-trail.entry.esm.js.map +0 -1
  351. package/dist/stencil/kritzel-cursor-trail.entry.js.map +0 -1
  352. package/dist/stencil/kritzel-dropdown.entry.esm.js.map +0 -1
  353. package/dist/stencil/kritzel-dropdown.entry.js.map +0 -1
  354. package/dist/stencil/kritzel-editor.entry.esm.js.map +0 -1
  355. package/dist/stencil/kritzel-editor.entry.js +0 -180
  356. package/dist/stencil/kritzel-editor.entry.js.map +0 -1
  357. package/dist/stencil/kritzel-engine.entry.esm.js.map +0 -1
  358. package/dist/stencil/kritzel-engine.entry.js +0 -1318
  359. package/dist/stencil/kritzel-engine.entry.js.map +0 -1
  360. package/dist/stencil/kritzel-font-family.entry.esm.js.map +0 -1
  361. package/dist/stencil/kritzel-font-family.entry.js.map +0 -1
  362. package/dist/stencil/kritzel-font-size.entry.esm.js.map +0 -1
  363. package/dist/stencil/kritzel-font-size.entry.js +0 -29
  364. package/dist/stencil/kritzel-font-size.entry.js.map +0 -1
  365. package/dist/stencil/kritzel-font.entry.esm.js.map +0 -1
  366. package/dist/stencil/kritzel-font.entry.js +0 -25
  367. package/dist/stencil/kritzel-font.entry.js.map +0 -1
  368. package/dist/stencil/kritzel-icon.entry.esm.js.map +0 -1
  369. package/dist/stencil/kritzel-icon.entry.js +0 -29
  370. package/dist/stencil/kritzel-icon.entry.js.map +0 -1
  371. package/dist/stencil/kritzel-stroke-size.entry.esm.js.map +0 -1
  372. package/dist/stencil/kritzel-stroke-size.entry.js +0 -28
  373. package/dist/stencil/kritzel-stroke-size.entry.js.map +0 -1
  374. package/dist/stencil/kritzel-tooltip.entry.esm.js.map +0 -1
  375. package/dist/stencil/kritzel-tooltip.entry.js.map +0 -1
  376. package/dist/stencil/kritzel-utility-panel.entry.esm.js.map +0 -1
  377. package/dist/stencil/kritzel-utility-panel.entry.js +0 -33
  378. package/dist/stencil/kritzel-utility-panel.entry.js.map +0 -1
@@ -0,0 +1,268 @@
1
+ import { getStroke } from "perfect-freehand";
2
+ import { KritzelMathHelper } from "../../helpers/math.helper";
3
+ import { KritzelBaseObject } from "./base-object.class";
4
+ import { KritzelGeometryHelper } from "../../helpers/geometry.helper";
5
+ export class KritzelPath extends KritzelBaseObject {
6
+ get viewBox() {
7
+ return `${this.x} ${this.y} ${this.width} ${this.height}`;
8
+ }
9
+ constructor(config) {
10
+ var _a, _b, _c, _d, _e, _f;
11
+ super();
12
+ this.__class__ = 'KritzelPath';
13
+ this.stroke = 'none';
14
+ this.lineSlack = 0.5;
15
+ this.x = 0;
16
+ this.y = 0;
17
+ this.height = 0;
18
+ this.width = 0;
19
+ this.scale = 1;
20
+ this.isVisible = true;
21
+ this.isDebugInfoVisible = true;
22
+ this._adjustedPoints = null;
23
+ this.options = config;
24
+ this.points = (_a = config === null || config === void 0 ? void 0 : config.points) !== null && _a !== void 0 ? _a : [];
25
+ this.translateX = (_b = config === null || config === void 0 ? void 0 : config.translateX) !== null && _b !== void 0 ? _b : 0;
26
+ this.translateY = (_c = config === null || config === void 0 ? void 0 : config.translateY) !== null && _c !== void 0 ? _c : 0;
27
+ this.scale = (_d = config === null || config === void 0 ? void 0 : config.scale) !== null && _d !== void 0 ? _d : 1;
28
+ this.strokeWidth = (_e = config === null || config === void 0 ? void 0 : config.strokeWidth) !== null && _e !== void 0 ? _e : 8;
29
+ this.fill = (_f = config === null || config === void 0 ? void 0 : config.fill) !== null && _f !== void 0 ? _f : '#000000';
30
+ this.d = this.generateSvgPath();
31
+ this.updateDimensions();
32
+ }
33
+ static create(store, options) {
34
+ var _a, _b, _c, _d, _e, _f;
35
+ const object = new KritzelPath();
36
+ object._store = store;
37
+ object.id = object.generateId();
38
+ object.options = options;
39
+ object.points = (_a = options === null || options === void 0 ? void 0 : options.points) !== null && _a !== void 0 ? _a : [];
40
+ object.translateX = (_b = options === null || options === void 0 ? void 0 : options.translateX) !== null && _b !== void 0 ? _b : 0;
41
+ object.translateY = (_c = options === null || options === void 0 ? void 0 : options.translateY) !== null && _c !== void 0 ? _c : 0;
42
+ object.scale = (_d = options === null || options === void 0 ? void 0 : options.scale) !== null && _d !== void 0 ? _d : 1;
43
+ object.strokeWidth = (_e = options === null || options === void 0 ? void 0 : options.strokeWidth) !== null && _e !== void 0 ? _e : 8;
44
+ object.fill = (_f = options === null || options === void 0 ? void 0 : options.fill) !== null && _f !== void 0 ? _f : '#000000';
45
+ object.zIndex = store.currentZIndex;
46
+ object.d = object.generateSvgPath();
47
+ object.updateDimensions();
48
+ return object;
49
+ }
50
+ resize(x, y, width, height) {
51
+ if (width <= 1 || height <= 1) {
52
+ return;
53
+ }
54
+ const scaleX = width / this.width;
55
+ const scaleY = height / this.height;
56
+ this.width = width;
57
+ this.height = height;
58
+ this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);
59
+ this.d = this.generateSvgPath();
60
+ this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;
61
+ this.height = Math.max(...this.points.map(p => p[1])) - Math.min(...this.points.map(p => p[1])) + this.strokeWidth;
62
+ this.x = Math.min(...this.points.map(p => p[0])) - this.strokeWidth / 2;
63
+ this.y = Math.min(...this.points.map(p => p[1])) - this.strokeWidth / 2;
64
+ this.translateX = x;
65
+ this.translateY = y;
66
+ this._adjustedPoints = null;
67
+ }
68
+ rotate(value) {
69
+ this.rotation = value;
70
+ this._adjustedPoints = null;
71
+ }
72
+ move(startX, startY, endX, endY) {
73
+ const deltaX = (startX - endX) / this._store.state.scale;
74
+ const deltaY = (startY - endY) / this._store.state.scale;
75
+ this.translateX += deltaX;
76
+ this.translateY += deltaY;
77
+ this._adjustedPoints = null;
78
+ }
79
+ hitTest(x, y) {
80
+ const halfStroke = this.strokeWidth / this.scale / 2;
81
+ if (this._adjustedPoints === null) {
82
+ this._adjustedPoints = this.computeAdjustedPoints();
83
+ }
84
+ if (this._adjustedPoints.length === 1) {
85
+ const p1 = this._adjustedPoints[0];
86
+ const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p1[0], p1[1]);
87
+ return distance <= halfStroke;
88
+ }
89
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
90
+ const p1 = this._adjustedPoints[i];
91
+ const p2 = this._adjustedPoints[i + 1];
92
+ const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);
93
+ if (distance <= halfStroke) {
94
+ return true;
95
+ }
96
+ }
97
+ return false;
98
+ }
99
+ hitTestPolygon(polygon) {
100
+ const halfStroke = this.strokeWidth / this.scale / 2;
101
+ if (this._adjustedPoints === null) {
102
+ this._adjustedPoints = this.computeAdjustedPoints();
103
+ }
104
+ const polyPoints = [
105
+ { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },
106
+ { x: polygon.bottomRight.x, y: polygon.bottomRight.y },
107
+ { x: polygon.topRight.x, y: polygon.topRight.y },
108
+ { x: polygon.topLeft.x, y: polygon.topLeft.y },
109
+ ];
110
+ for (const [px, py] of this._adjustedPoints) {
111
+ if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {
112
+ return true;
113
+ }
114
+ }
115
+ for (const pt of polyPoints) {
116
+ if (this.hitTest(pt.x, pt.y)) {
117
+ return true;
118
+ }
119
+ }
120
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
121
+ const p1 = { x: this._adjustedPoints[i][0], y: this._adjustedPoints[i][1] };
122
+ const p2 = { x: this._adjustedPoints[i + 1][0], y: this._adjustedPoints[i + 1][1] };
123
+ for (let j = 0; j < polyPoints.length; j++) {
124
+ const q1 = polyPoints[j];
125
+ const q2 = polyPoints[(j + 1) % polyPoints.length];
126
+ if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {
127
+ return true;
128
+ }
129
+ }
130
+ }
131
+ for (let i = 0; i < this._adjustedPoints.length - 1; i++) {
132
+ const p1 = this._adjustedPoints[i];
133
+ const p2 = this._adjustedPoints[i + 1];
134
+ for (let j = 0; j < polyPoints.length; j++) {
135
+ const q1 = polyPoints[j];
136
+ const q2 = polyPoints[(j + 1) % polyPoints.length];
137
+ const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1[0], p1[1], p2[0], p2[1]);
138
+ const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1[0], p1[1], p2[0], p2[1]);
139
+ const d3 = this.pointToLineSegmentDistance(p1[0], p1[1], q1.x, q1.y, q2.x, q2.y);
140
+ const d4 = this.pointToLineSegmentDistance(p2[0], p2[1], q1.x, q1.y, q2.x, q2.y);
141
+ const minD = Math.min(d1, d2, d3, d4);
142
+ if (minD <= halfStroke) {
143
+ return true;
144
+ }
145
+ }
146
+ }
147
+ return false;
148
+ }
149
+ updatePosition(x, y) {
150
+ this.translateX = x;
151
+ this.translateY = y;
152
+ this._adjustedPoints = null;
153
+ this._store.state.objectsOctree.update(this);
154
+ }
155
+ computeAdjustedPoints() {
156
+ var _a;
157
+ if (!((_a = this.points) === null || _a === void 0 ? void 0 : _a.length)) {
158
+ return [];
159
+ }
160
+ const angle = this.rotation;
161
+ const cos = Math.cos(angle);
162
+ const sin = Math.sin(angle);
163
+ const xs = this.points.map(p => p[0]);
164
+ const ys = this.points.map(p => p[1]);
165
+ const pivot = {
166
+ x: (Math.min(...xs) + Math.max(...xs)) / 2,
167
+ y: (Math.min(...ys) + Math.max(...ys)) / 2,
168
+ };
169
+ const { x: cx, y: cy } = pivot;
170
+ const rotatedPoints = this.points.map(([x, y]) => {
171
+ const dx = x - cx;
172
+ const dy = y - cy;
173
+ return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];
174
+ });
175
+ return rotatedPoints.map(([px, py]) => [((Math.abs(px - this.x) / this.scale + this.translateX)), ((Math.abs(py - this.y) / this.scale + this.translateY))]);
176
+ }
177
+ pointToLineSegmentDistance(x, y, x1, y1, x2, y2) {
178
+ const A = x - x1;
179
+ const B = y - y1;
180
+ const C = x2 - x1;
181
+ const D = y2 - y1;
182
+ const dot = A * C + B * D;
183
+ const len_sq = C * C + D * D;
184
+ let param = -1;
185
+ if (len_sq !== 0) {
186
+ // in case of 0 length line
187
+ param = dot / len_sq;
188
+ }
189
+ let xx, yy;
190
+ if (param < 0) {
191
+ xx = x1;
192
+ yy = y1;
193
+ }
194
+ else if (param > 1) {
195
+ xx = x2;
196
+ yy = y2;
197
+ }
198
+ else {
199
+ xx = x1 + param * C;
200
+ yy = y1 + param * D;
201
+ }
202
+ const dx = x - xx;
203
+ const dy = y - yy;
204
+ return Math.sqrt(dx * dx + dy * dy);
205
+ }
206
+ updateDimensions() {
207
+ const rotatedPoints = this.points.map(([x, y]) => {
208
+ const rotatedX = x * Math.cos(this.rotation) - y * Math.sin(this.rotation);
209
+ const rotatedY = x * Math.sin(this.rotation) + y * Math.cos(this.rotation);
210
+ return [rotatedX, rotatedY];
211
+ });
212
+ const minX = Math.min(...rotatedPoints.map(p => p[0] - this.strokeWidth / 2));
213
+ const minY = Math.min(...rotatedPoints.map(p => p[1] - this.strokeWidth / 2));
214
+ const maxX = Math.max(...rotatedPoints.map(p => p[0] + this.strokeWidth / 2));
215
+ const maxY = Math.max(...rotatedPoints.map(p => p[1] + this.strokeWidth / 2));
216
+ this.width = maxX - minX + this.lineSlack;
217
+ this.height = maxY - minY + this.lineSlack;
218
+ this.x = minX;
219
+ this.y = minY;
220
+ this.translateX = (this.x + this.translateX) / this.scale;
221
+ this.translateY = (this.y + this.translateY) / this.scale;
222
+ }
223
+ generateSvgPath() {
224
+ const stroke = this.getStrokeFromPoints(this.points, this.strokeWidth);
225
+ return this.getSvgPathFromStroke(stroke);
226
+ }
227
+ getStrokeFromPoints(points, strokeWidth) {
228
+ return getStroke(points, {
229
+ size: strokeWidth,
230
+ thinning: 0.5,
231
+ smoothing: 0.5,
232
+ streamline: 0.5,
233
+ easing: t => t,
234
+ simulatePressure: true,
235
+ last: true,
236
+ start: {
237
+ cap: true,
238
+ taper: 0,
239
+ easing: t => t,
240
+ },
241
+ end: {
242
+ cap: true,
243
+ taper: 0,
244
+ easing: t => t,
245
+ },
246
+ });
247
+ }
248
+ getSvgPathFromStroke(points, closed = true) {
249
+ const len = points.length;
250
+ if (len < 4) {
251
+ return ``;
252
+ }
253
+ let a = points[0];
254
+ let b = points[1];
255
+ const c = points[2];
256
+ let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${KritzelMathHelper.average(b[0], c[0]).toFixed(2)},${KritzelMathHelper.average(b[1], c[1]).toFixed(2)} T`;
257
+ for (let i = 2, max = len - 1; i < max; i++) {
258
+ a = points[i];
259
+ b = points[i + 1];
260
+ result += `${KritzelMathHelper.average(a[0], b[0]).toFixed(2)},${KritzelMathHelper.average(a[1], b[1]).toFixed(2)} `;
261
+ }
262
+ if (closed) {
263
+ result += 'Z';
264
+ }
265
+ return result;
266
+ }
267
+ }
268
+ //# sourceMappingURL=path.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.class.js","sourceRoot":"","sources":["../../../src/classes/objects/path.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { getStroke } from 'perfect-freehand';\r\nimport { KritzelMathHelper } from '../../helpers/math.helper';\r\nimport { KritzelPathOptions } from '../../interfaces/path-options.interface';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nimport { KritzelStore } from '../store.class';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelPoint } from '../../interfaces/point.interface';\r\n\r\nexport class KritzelPath extends KritzelBaseObject<SVGElement> {\r\n override __class__: string = 'KritzelPath';\r\n\r\n points: number[][];\r\n d: string;\r\n stroke: string = 'none';\r\n strokeWidth: number;\r\n lineSlack: number = 0.5;\r\n fill: string;\r\n x: number = 0;\r\n y: number = 0;\r\n translateX: number;\r\n translateY: number;\r\n height: number = 0;\r\n width: number = 0;\r\n scale: number = 1;\r\n options: KritzelPathOptions | undefined;\r\n\r\n isVisible: boolean = true;\r\n isDebugInfoVisible: boolean = true;\r\n\r\n private _adjustedPoints?: number[][] = null;\r\n\r\n get viewBox(): string {\r\n return `${this.x} ${this.y} ${this.width} ${this.height}`;\r\n }\r\n\r\n constructor(config?: { points: number[][]; translateX?: number; translateY?: number; scale?: number; strokeWidth?: number; fill?: string; lineSlack?: number }) {\r\n super();\r\n this.options = config;\r\n this.points = config?.points ?? [];\r\n this.translateX = config?.translateX ?? 0;\r\n this.translateY = config?.translateY ?? 0;\r\n this.scale = config?.scale ?? 1;\r\n this.strokeWidth = config?.strokeWidth ?? 8;\r\n this.fill = config?.fill ?? '#000000';\r\n this.d = this.generateSvgPath();\r\n this.updateDimensions();\r\n }\r\n\r\n static override create(store: KritzelStore, options?: KritzelPathOptions): KritzelPath {\r\n const object = new KritzelPath();\r\n\r\n object._store = store;\r\n object.id = object.generateId();\r\n object.options = options;\r\n object.points = options?.points ?? [];\r\n object.translateX = options?.translateX ?? 0;\r\n object.translateY = options?.translateY ?? 0;\r\n object.scale = options?.scale ?? 1;\r\n object.strokeWidth = options?.strokeWidth ?? 8;\r\n object.fill = options?.fill ?? '#000000';\r\n object.zIndex = store.currentZIndex;\r\n object.d = object.generateSvgPath();\r\n object.updateDimensions();\r\n\r\n return object;\r\n }\r\n\r\n override resize(x: number | null, y: number | null, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n const scaleX = width / this.width;\r\n const scaleY = height / this.height;\r\n\r\n this.width = width;\r\n this.height = height;\r\n\r\n this.points = this.points.map(([x, y]) => [x * scaleX, y * scaleY]);\r\n this.d = this.generateSvgPath();\r\n\r\n this.width = Math.max(...this.points.map(p => p[0])) - Math.min(...this.points.map(p => p[0])) + this.strokeWidth;\r\n this.height = Math.max(...this.points.map(p => p[1])) - Math.min(...this.points.map(p => p[1])) + this.strokeWidth;\r\n\r\n this.x = Math.min(...this.points.map(p => p[0])) - this.strokeWidth / 2;\r\n this.y = Math.min(...this.points.map(p => p[1])) - this.strokeWidth / 2;\r\n\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._adjustedPoints = null;\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n this._adjustedPoints = null;\r\n }\r\n\r\n override move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._store.state.scale;\r\n const deltaY = (startY - endY) / this._store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._adjustedPoints = null;\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const halfStroke = this.strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n if (this._adjustedPoints.length === 1) {\r\n const p1 = this._adjustedPoints[0];\r\n const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p1[0], p1[1]);\r\n return distance <= halfStroke;\r\n }\r\n\r\n for (let i = 0; i < this._adjustedPoints.length - 1; i++) {\r\n const p1 = this._adjustedPoints[i];\r\n const p2 = this._adjustedPoints[i + 1];\r\n\r\n const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);\r\n\r\n if (distance <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n override hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const halfStroke = this.strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n const polyPoints: KritzelPoint[] = [\r\n { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },\r\n { x: polygon.bottomRight.x, y: polygon.bottomRight.y },\r\n { x: polygon.topRight.x, y: polygon.topRight.y },\r\n { x: polygon.topLeft.x, y: polygon.topLeft.y },\r\n ];\r\n\r\n for (const [px, py] of this._adjustedPoints) {\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {\r\n return true;\r\n }\r\n }\r\n\r\n for (const pt of polyPoints) {\r\n if (this.hitTest(pt.x, pt.y)) {\r\n return true;\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._adjustedPoints.length - 1; i++) {\r\n const p1 = { x: this._adjustedPoints[i][0], y: this._adjustedPoints[i][1] };\r\n const p2 = { x: this._adjustedPoints[i + 1][0], y: this._adjustedPoints[i + 1][1] };\r\n\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n\r\n if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n for (let i = 0; i < this._adjustedPoints.length - 1; i++) {\r\n const p1 = this._adjustedPoints[i];\r\n const p2 = this._adjustedPoints[i + 1];\r\n\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n\r\n const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1[0], p1[1], p2[0], p2[1]);\r\n const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1[0], p1[1], p2[0], p2[1]);\r\n const d3 = this.pointToLineSegmentDistance(p1[0], p1[1], q1.x, q1.y, q2.x, q2.y);\r\n const d4 = this.pointToLineSegmentDistance(p2[0], p2[1], q1.x, q1.y, q2.x, q2.y);\r\n\r\n const minD = Math.min(d1, d2, d3, d4);\r\n if (minD <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n override updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._adjustedPoints = null;\r\n this._store.state.objectsOctree.update(this);\r\n }\r\n\r\n private computeAdjustedPoints(): number[][] {\r\n if (!this.points?.length) {\r\n return [];\r\n }\r\n\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const xs = this.points.map(p => p[0]);\r\n const ys = this.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 = this.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]) => [((Math.abs(px - this.x) / this.scale + this.translateX)), ((Math.abs(py - this.y) / this.scale + this.translateY))]);\r\n }\r\n\r\n private pointToLineSegmentDistance(x: number, y: number, x1: number, y1: number, x2: number, y2: number): number {\r\n const A = x - x1;\r\n const B = y - 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 if (len_sq !== 0) {\r\n // in case of 0 length line\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 = x - xx;\r\n const dy = y - yy;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n private updateDimensions(): void {\r\n const rotatedPoints = this.points.map(([x, y]) => {\r\n const rotatedX = x * Math.cos(this.rotation) - y * Math.sin(this.rotation);\r\n const rotatedY = x * Math.sin(this.rotation) + y * Math.cos(this.rotation);\r\n return [rotatedX, rotatedY];\r\n });\r\n\r\n const minX = Math.min(...rotatedPoints.map(p => p[0] - this.strokeWidth / 2));\r\n const minY = Math.min(...rotatedPoints.map(p => p[1] - this.strokeWidth / 2));\r\n\r\n const maxX = Math.max(...rotatedPoints.map(p => p[0] + this.strokeWidth / 2));\r\n const maxY = Math.max(...rotatedPoints.map(p => p[1] + this.strokeWidth / 2));\r\n\r\n this.width = maxX - minX + this.lineSlack;\r\n this.height = maxY - minY + this.lineSlack;\r\n\r\n this.x = minX;\r\n this.y = minY;\r\n\r\n this.translateX = (this.x + this.translateX) / this.scale;\r\n this.translateY = (this.y + this.translateY) / this.scale;\r\n }\r\n\r\n private generateSvgPath(): string {\r\n const stroke = this.getStrokeFromPoints(this.points, this.strokeWidth);\r\n return this.getSvgPathFromStroke(stroke);\r\n }\r\n\r\n private getStrokeFromPoints(points: number[][], strokeWidth: number): number[][] {\r\n return getStroke(points, {\r\n size: strokeWidth,\r\n thinning: 0.5,\r\n smoothing: 0.5,\r\n streamline: 0.5,\r\n easing: t => t,\r\n simulatePressure: true,\r\n last: true,\r\n start: {\r\n cap: true,\r\n taper: 0,\r\n easing: t => t,\r\n },\r\n end: {\r\n cap: true,\r\n taper: 0,\r\n easing: t => t,\r\n },\r\n });\r\n }\r\n\r\n private getSvgPathFromStroke(points: number[][], closed = true) {\r\n const len = points.length;\r\n\r\n if (len < 4) {\r\n return ``;\r\n }\r\n\r\n let a = points[0];\r\n let b = points[1];\r\n const c = points[2];\r\n\r\n let result = `M${a[0].toFixed(2)},${a[1].toFixed(2)} Q${b[0].toFixed(2)},${b[1].toFixed(2)} ${KritzelMathHelper.average(b[0], c[0]).toFixed(\r\n 2,\r\n )},${KritzelMathHelper.average(b[1], c[1]).toFixed(2)} T`;\r\n\r\n for (let i = 2, max = len - 1; i < max; i++) {\r\n a = points[i];\r\n b = points[i + 1];\r\n result += `${KritzelMathHelper.average(a[0], b[0]).toFixed(2)},${KritzelMathHelper.average(a[1], b[1]).toFixed(2)} `;\r\n }\r\n\r\n if (closed) {\r\n result += 'Z';\r\n }\r\n\r\n return result;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,22 @@
1
+ import { KritzelBaseObject } from "./base-object.class";
2
+ export class KrtizelSelectionBox extends KritzelBaseObject {
3
+ constructor() {
4
+ super(...arguments);
5
+ this.__class__ = 'KrtizelSelectionBox';
6
+ this.objects = [];
7
+ }
8
+ static create(store) {
9
+ const object = new KrtizelSelectionBox();
10
+ object._store = store;
11
+ object.id = object.generateId();
12
+ object.scale = store.state.scale;
13
+ object.zIndex = 99999;
14
+ object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(0, 122, 255, 0.2))';
15
+ object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(0, 122, 255, 0.5))';
16
+ object.borderWidth = 2;
17
+ object.height = 0;
18
+ object.width = 0;
19
+ return object;
20
+ }
21
+ }
22
+ //# sourceMappingURL=selection-box.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-box.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-box.class.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,OAAO,mBAAoB,SAAQ,iBAA8B;IAAvE;;QACW,cAAS,GAAW,qBAAqB,CAAC;QAEnD,YAAO,GAA6B,EAAE,CAAC;IAiBzC,CAAC;IAfC,MAAM,CAAU,MAAM,CAAC,KAAmB;QACxC,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAEzC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACjC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,MAAM,CAAC,eAAe,GAAG,uEAAuE,CAAC;QACjG,MAAM,CAAC,WAAW,GAAG,mEAAmE,CAAC;QACzF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAEjB,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["import { KritzelStore } from '../store.class';\r\nimport { KritzelBaseObject } from './base-object.class';\r\n\r\nexport class KrtizelSelectionBox extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KrtizelSelectionBox';\r\n\r\n objects: KritzelBaseObject<any>[] = [];\r\n\r\n static override create(store: KritzelStore): KrtizelSelectionBox {\r\n const object = new KrtizelSelectionBox();\r\n\r\n object._store = store;\r\n object.id = object.generateId();\r\n object.scale = store.state.scale;\r\n object.zIndex = 99999;\r\n object.backgroundColor = 'var(--kritzel-selection-box-background-color, rgba(0, 122, 255, 0.2))';\r\n object.borderColor = 'var(--kritzel-selection-box-border-color, rgba(0, 122, 255, 0.5))';\r\n object.borderWidth = 2;\r\n object.height = 0;\r\n object.width = 0;\r\n\r\n return object;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,157 @@
1
+ import { ObjectHelper } from "../../helpers/object.helper";
2
+ import { KritzelReviver } from "../reviver.class";
3
+ import { KritzelBaseObject } from "./base-object.class";
4
+ export class KritzelSelectionGroup extends KritzelBaseObject {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.__class__ = 'KritzelSelectionGroup';
8
+ this.objects = [];
9
+ this.unchangedObjects = [];
10
+ }
11
+ get length() {
12
+ return this.objects.length;
13
+ }
14
+ static create(store) {
15
+ const object = new KritzelSelectionGroup();
16
+ object._store = store;
17
+ object.id = object.generateId();
18
+ object.scale = store.state.scale;
19
+ object.zIndex = 99999;
20
+ return object;
21
+ }
22
+ addOrRemove(object) {
23
+ const index = this.objects.findIndex(obj => obj.id === object.id);
24
+ if (index === -1) {
25
+ this.objects.push(object);
26
+ }
27
+ else {
28
+ this.objects.splice(index, 1);
29
+ }
30
+ this.unchangedObjects = ObjectHelper.clone(this.objects);
31
+ this.refreshObjectDimensions();
32
+ }
33
+ deselectAllChildren() {
34
+ this.objects.forEach(obj => (obj.isSelected = false));
35
+ }
36
+ updatePosition(x, y) {
37
+ this.objects.forEach(obj => {
38
+ const deltaX = obj.translateX - this.translateX;
39
+ const deltaY = obj.translateY - this.translateY;
40
+ obj.updatePosition(x + deltaX, y + deltaY);
41
+ });
42
+ this.unchangedObjects.forEach(obj => {
43
+ const deltaX = obj.translateX - this.translateX;
44
+ const deltaY = obj.translateY - this.translateY;
45
+ obj.translateX = x + deltaX;
46
+ obj.translateY = y + deltaY;
47
+ });
48
+ this.translateX = x;
49
+ this.translateY = y;
50
+ this._store.state.objectsOctree.update(this);
51
+ }
52
+ move(startX, startY, endX, endY) {
53
+ const deltaX = (startX - endX) / this._store.state.scale;
54
+ const deltaY = (startY - endY) / this._store.state.scale;
55
+ this.translateX += deltaX;
56
+ this.translateY += deltaY;
57
+ this._store.state.objectsOctree.update(this);
58
+ this.objects.forEach(obj => {
59
+ obj.move(startX, startY, endX, endY);
60
+ this._store.state.objectsOctree.update(obj);
61
+ });
62
+ this.unchangedObjects.forEach(obj => {
63
+ obj.translateX += deltaX;
64
+ obj.translateY += deltaY;
65
+ });
66
+ }
67
+ resize(x, y, width, height) {
68
+ const widthScaleFactor = width / this.width;
69
+ const heightScaleFactor = height / this.height;
70
+ const deltaX = x - this.translateX;
71
+ const deltaY = y - this.translateY;
72
+ this.objects.forEach(child => {
73
+ const updatedWidth = child.width * widthScaleFactor;
74
+ const updatedHeight = child.height * heightScaleFactor;
75
+ const updatedX = child.translateX + deltaX + (child.translateX - this.translateX) * (widthScaleFactor - 1);
76
+ const updatedY = child.translateY + deltaY + (child.translateY - this.translateY) * (heightScaleFactor - 1);
77
+ child.resize(updatedX, updatedY, updatedWidth, updatedHeight);
78
+ this._store.state.objectsOctree.update(child);
79
+ });
80
+ this.refreshObjectDimensions();
81
+ this.unchangedObjects = ObjectHelper.clone(this.objects);
82
+ }
83
+ rotate(value) {
84
+ this.rotation = value;
85
+ const centerX = this.translateX + this.totalWidth / 2 / this.scale;
86
+ const centerY = this.translateY + this.totalHeight / 2 / this.scale;
87
+ const angle = value;
88
+ const cos = Math.cos(angle);
89
+ const sin = Math.sin(angle);
90
+ this.objects.forEach(child => {
91
+ const unchangedChild = this.getUnchangedObject(child.id);
92
+ const offsetX = this.getOffsetXToCenter(unchangedChild);
93
+ const offsetY = this.getOffsetYToCenter(unchangedChild);
94
+ const rotatedX = cos * offsetX - sin * offsetY;
95
+ const rotatedY = sin * offsetX + cos * offsetY;
96
+ child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;
97
+ child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;
98
+ child.rotate(this.objects.length === 1 ? value : value + unchangedChild.rotation);
99
+ this._store.state.objectsOctree.update(child);
100
+ });
101
+ }
102
+ copy() {
103
+ const selectionGroup = KritzelSelectionGroup.create(this._store);
104
+ let currentZIndex = this._store.currentZIndex;
105
+ this.objects.sort((a, b) => a.zIndex - b.zIndex).forEach(obj => {
106
+ const copiedObject = obj.copy();
107
+ copiedObject.zIndex = currentZIndex;
108
+ selectionGroup.addOrRemove(copiedObject);
109
+ currentZIndex++;
110
+ });
111
+ selectionGroup.unchangedObjects = ObjectHelper.clone(selectionGroup.objects);
112
+ if (this.objects.length === 1) {
113
+ selectionGroup.rotation = this.objects[0].rotation;
114
+ }
115
+ return selectionGroup;
116
+ }
117
+ refreshObjectDimensions() {
118
+ if (this.objects.length === 1) {
119
+ const obj = this.objects[0];
120
+ this.minX = obj.boundingBox.x / this.scale;
121
+ this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;
122
+ this.minY = obj.boundingBox.y / this.scale;
123
+ this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;
124
+ this.translateX = (this.minX - this.padding) * this.scale;
125
+ this.translateY = (this.minY - this.padding) * this.scale;
126
+ this.width = (this.maxX - this.minX - this.padding) * this.scale;
127
+ this.height = (this.maxY - this.minY - this.padding) * this.scale;
128
+ }
129
+ else {
130
+ this.minX = Math.min(...this.objects.map(obj => obj.minXRotated));
131
+ this.maxX = Math.max(...this.objects.map(obj => obj.maxXRotated));
132
+ this.minY = Math.min(...this.objects.map(obj => obj.minYRotated));
133
+ this.maxY = Math.max(...this.objects.map(obj => obj.maxYRotated));
134
+ this.translateX = this.minX - this.padding;
135
+ this.translateY = this.minY - this.padding;
136
+ this.width = (this.maxX - this.minX - this.padding) * this.scale;
137
+ this.height = (this.maxY - this.minY - this.padding) * this.scale;
138
+ }
139
+ this._store.state.objectsOctree.update(this);
140
+ }
141
+ getOffsetXToCenter(obj) {
142
+ const objCenterX = obj.translateX + obj.totalWidth / obj.scale / 2;
143
+ const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;
144
+ return objCenterX - groupCenterX;
145
+ }
146
+ getOffsetYToCenter(obj) {
147
+ const objCenterY = obj.translateY + obj.totalHeight / obj.scale / 2;
148
+ const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;
149
+ return objCenterY - groupCenterY;
150
+ }
151
+ getUnchangedObject(objectId) {
152
+ const obj = this.unchangedObjects.find(obj => obj.id === objectId);
153
+ const reviver = new KritzelReviver(this._store);
154
+ return reviver.revive(obj);
155
+ }
156
+ }
157
+ //# sourceMappingURL=selection-group.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-group.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelStore } from '../store.class';\r\nimport { KritzelReviver } from '../reviver.class';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nexport class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelSelectionGroup';\r\n\r\n objects: KritzelBaseObject<any>[] = [];\r\n unchangedObjects: KritzelBaseObject<any>[] = [];\r\n\r\n minX: number;\r\n maxX: number;\r\n\r\n minY: number;\r\n maxY: number;\r\n\r\n get length(): number {\r\n return this.objects.length;\r\n }\r\n\r\n static override create(store: KritzelStore): KritzelSelectionGroup {\r\n const object = new KritzelSelectionGroup();\r\n\r\n object._store = store;\r\n object.id = object.generateId();\r\n object.scale = store.state.scale;\r\n object.zIndex = 99999;\r\n\r\n return object;\r\n }\r\n\r\n addOrRemove(object: KritzelBaseObject<any>) {\r\n const index = this.objects.findIndex(obj => obj.id === object.id);\r\n if (index === -1) {\r\n this.objects.push(object);\r\n } else {\r\n this.objects.splice(index, 1);\r\n }\r\n\r\n this.unchangedObjects = ObjectHelper.clone(this.objects);\r\n this.refreshObjectDimensions();\r\n }\r\n\r\n deselectAllChildren() {\r\n this.objects.forEach(obj => (obj.isSelected = false));\r\n }\r\n\r\n updatePosition(x: number, y: number) {\r\n this.objects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.updatePosition(x + deltaX, y + deltaY);\r\n });\r\n\r\n this.unchangedObjects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.translateX = x + deltaX;\r\n obj.translateY = y + deltaY;\r\n });\r\n\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._store.state.objectsOctree.update(this);\r\n }\r\n\r\n override move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._store.state.scale;\r\n const deltaY = (startY - endY) / this._store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n this._store.state.objectsOctree.update(this);\r\n\r\n this.objects.forEach(obj => {\r\n obj.move(startX, startY, endX, endY);\r\n this._store.state.objectsOctree.update(obj);\r\n });\r\n\r\n this.unchangedObjects.forEach(obj => {\r\n obj.translateX += deltaX;\r\n obj.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n const deltaX = x - this.translateX;\r\n const deltaY = y - this.translateY;\r\n\r\n this.objects.forEach(child => {\r\n const updatedWidth = child.width * widthScaleFactor;\r\n const updatedHeight = child.height * heightScaleFactor;\r\n\r\n const updatedX = child.translateX + deltaX + (child.translateX - this.translateX) * (widthScaleFactor - 1);\r\n const updatedY = child.translateY + deltaY + (child.translateY - this.translateY) * (heightScaleFactor - 1);\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n this._store.state.objectsOctree.update(child);\r\n });\r\n\r\n this.refreshObjectDimensions();\r\n this.unchangedObjects = ObjectHelper.clone(this.objects);\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this.objects.forEach(child => {\r\n const unchangedChild = this.getUnchangedObject(child.id);\r\n\r\n const offsetX = this.getOffsetXToCenter(unchangedChild);\r\n const offsetY = this.getOffsetYToCenter(unchangedChild);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.objects.length === 1 ? value : value + unchangedChild.rotation);\r\n this._store.state.objectsOctree.update(child);\r\n });\r\n }\r\n\r\n override copy(): KritzelBaseObject<HTMLElement> {\r\n const selectionGroup = KritzelSelectionGroup.create(this._store);\r\n\r\n let currentZIndex = this._store.currentZIndex;\r\n\r\n this.objects.sort((a, b) => a.zIndex - b.zIndex).forEach(obj => {\r\n const copiedObject = obj.copy() as KritzelBaseObject<any>;\r\n copiedObject.zIndex = currentZIndex;\r\n selectionGroup.addOrRemove(copiedObject);\r\n currentZIndex++;\r\n });\r\n\r\n selectionGroup.unchangedObjects = ObjectHelper.clone(selectionGroup.objects);\r\n\r\n if (this.objects.length === 1) {\r\n selectionGroup.rotation = this.objects[0].rotation;\r\n }\r\n\r\n return selectionGroup;\r\n }\r\n\r\n refreshObjectDimensions() {\r\n if (this.objects.length === 1) {\r\n const obj = this.objects[0];\r\n this.minX = obj.boundingBox.x / this.scale;\r\n this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;\r\n this.minY = obj.boundingBox.y / this.scale;\r\n this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;\r\n\r\n this.translateX = (this.minX - this.padding) * this.scale;\r\n this.translateY = (this.minY - this.padding) * this.scale;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n } else {\r\n this.minX = Math.min(...this.objects.map(obj => obj.minXRotated));\r\n this.maxX = Math.max(...this.objects.map(obj => obj.maxXRotated));\r\n\r\n this.minY = Math.min(...this.objects.map(obj => obj.minYRotated));\r\n this.maxY = Math.max(...this.objects.map(obj => obj.maxYRotated));\r\n\r\n this.translateX = this.minX - this.padding;\r\n this.translateY = this.minY - this.padding;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n }\r\n\r\n this._store.state.objectsOctree.update(this);\r\n }\r\n\r\n private getOffsetXToCenter(obj: KritzelBaseObject<any>): number {\r\n const objCenterX = obj.translateX + obj.totalWidth / obj.scale / 2;\r\n const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;\r\n return objCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenter(obj: KritzelBaseObject<any>): number {\r\n const objCenterY = obj.translateY + obj.totalHeight / obj.scale / 2;\r\n const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;\r\n return objCenterY - groupCenterY;\r\n }\r\n\r\n private getUnchangedObject(objectId: string): KritzelBaseObject<any> {\r\n const obj = this.unchangedObjects.find(obj => obj.id === objectId);\r\n const reviver = new KritzelReviver(this._store);\r\n return reviver.revive(obj);\r\n }\r\n}\r\n"]}