kritzel-stencil 0.0.144 → 0.0.146

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 (290) hide show
  1. package/dist/cjs/{index-C9GjuVAx.js → default-text-tool.config-C0W0noF9.js} +15960 -1098
  2. package/dist/cjs/default-text-tool.config-C0W0noF9.js.map +1 -0
  3. package/dist/cjs/{index-DcTwXs_q.js → index-Cj__YTlG.js} +9 -11
  4. package/dist/cjs/index-Cj__YTlG.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +1369 -12
  6. package/dist/cjs/index.cjs.js.map +1 -1
  7. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  8. package/dist/cjs/kritzel-color_22.cjs.entry.js +777 -754
  9. package/dist/cjs/loader.cjs.js +2 -2
  10. package/dist/cjs/stencil.cjs.js +3 -3
  11. package/dist/cjs/stencil.cjs.js.map +1 -1
  12. package/dist/collection/classes/core/core.class.js +263 -211
  13. package/dist/collection/classes/core/core.class.js.map +1 -1
  14. package/dist/collection/classes/core/store.class.js +21 -3
  15. package/dist/collection/classes/core/store.class.js.map +1 -1
  16. package/dist/collection/classes/core/viewport.class.js +4 -1
  17. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  18. package/dist/collection/classes/core/workspace.class.js +2 -3
  19. package/dist/collection/classes/core/workspace.class.js.map +1 -1
  20. package/dist/collection/classes/handlers/context-menu.handler.js +11 -14
  21. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
  22. package/dist/collection/classes/handlers/key.handler.js +13 -13
  23. package/dist/collection/classes/handlers/key.handler.js.map +1 -1
  24. package/dist/collection/classes/handlers/move.handler.js +12 -9
  25. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  26. package/dist/collection/classes/handlers/resize.handler.js +20 -17
  27. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  28. package/dist/collection/classes/handlers/rotation.handler.js +26 -23
  29. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  30. package/dist/collection/classes/handlers/selection.handler.js +32 -30
  31. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  32. package/dist/collection/classes/objects/base-object.class.js +6 -15
  33. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  34. package/dist/collection/classes/objects/custom-element.class.js +2 -0
  35. package/dist/collection/classes/objects/custom-element.class.js.map +1 -1
  36. package/dist/collection/classes/objects/image.class.js +2 -0
  37. package/dist/collection/classes/objects/image.class.js.map +1 -1
  38. package/dist/collection/classes/objects/path.class.js +4 -0
  39. package/dist/collection/classes/objects/path.class.js.map +1 -1
  40. package/dist/collection/classes/objects/selection-box.class.js +3 -4
  41. package/dist/collection/classes/objects/selection-box.class.js.map +1 -1
  42. package/dist/collection/classes/objects/selection-group.class.js +109 -49
  43. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  44. package/dist/collection/classes/objects/text.class.js +37 -43
  45. package/dist/collection/classes/objects/text.class.js.map +1 -1
  46. package/dist/collection/classes/providers/broadcast-sync-provider.class.js +93 -0
  47. package/dist/collection/classes/providers/broadcast-sync-provider.class.js.map +1 -0
  48. package/dist/collection/classes/providers/hocuspocus-sync-provider.class.js +232 -0
  49. package/dist/collection/classes/providers/hocuspocus-sync-provider.class.js.map +1 -0
  50. package/dist/collection/classes/providers/indexeddb-sync-provider.class.js +35 -0
  51. package/dist/collection/classes/providers/indexeddb-sync-provider.class.js.map +1 -0
  52. package/dist/collection/classes/providers/websocket-sync-provider.class.js +89 -0
  53. package/dist/collection/classes/providers/websocket-sync-provider.class.js.map +1 -0
  54. package/dist/collection/classes/structures/app-state-map.structure.js +189 -0
  55. package/dist/collection/classes/structures/app-state-map.structure.js.map +1 -0
  56. package/dist/collection/classes/structures/object-map.structure.js +260 -1
  57. package/dist/collection/classes/structures/object-map.structure.js.map +1 -1
  58. package/dist/collection/classes/tools/brush-tool.class.js +48 -37
  59. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  60. package/dist/collection/classes/tools/eraser-tool.class.js +10 -12
  61. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  62. package/dist/collection/classes/tools/image-tool.class.js +2 -10
  63. package/dist/collection/classes/tools/image-tool.class.js.map +1 -1
  64. package/dist/collection/classes/tools/selection-tool.class.js +11 -8
  65. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  66. package/dist/collection/classes/tools/text-tool.class.js +13 -26
  67. package/dist/collection/classes/tools/text-tool.class.js.map +1 -1
  68. package/dist/collection/collection-manifest.json +1 -1
  69. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  70. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +36 -1
  71. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  72. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +61 -35
  73. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  74. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  75. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  76. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  77. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  78. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  79. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  80. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  81. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  82. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  83. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  84. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  85. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  86. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  87. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  88. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  89. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  90. package/dist/collection/configs/{default-engine-state.js → default-engine-config.js} +2 -8
  91. package/dist/collection/configs/default-engine-config.js.map +1 -0
  92. package/dist/collection/configs/default-sync.config.js +12 -0
  93. package/dist/collection/configs/default-sync.config.js.map +1 -0
  94. package/dist/collection/constants/core.constants.js +2 -0
  95. package/dist/collection/constants/core.constants.js.map +1 -0
  96. package/dist/collection/index.js +8 -1
  97. package/dist/collection/index.js.map +1 -1
  98. package/dist/collection/interfaces/debug-info.interface.js.map +1 -1
  99. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  100. package/dist/collection/interfaces/object.interface.js.map +1 -1
  101. package/dist/collection/interfaces/selection-state.interface.js.map +1 -1
  102. package/dist/collection/interfaces/sync-config.interface.js +2 -0
  103. package/dist/collection/interfaces/sync-config.interface.js.map +1 -0
  104. package/dist/collection/interfaces/sync-provider.interface.js +2 -0
  105. package/dist/collection/interfaces/sync-provider.interface.js.map +1 -0
  106. package/dist/components/index.js +1361 -4
  107. package/dist/components/index.js.map +1 -1
  108. package/dist/components/kritzel-brush-style.js +4 -4
  109. package/dist/components/kritzel-color-palette.js +1 -1
  110. package/dist/components/kritzel-color.js +1 -1
  111. package/dist/components/kritzel-context-menu.js +1 -1
  112. package/dist/components/kritzel-control-brush-config.js +1 -1
  113. package/dist/components/kritzel-control-text-config.js +1 -1
  114. package/dist/components/kritzel-controls.js +1 -1
  115. package/dist/components/kritzel-cursor-trail.js +1 -1
  116. package/dist/components/kritzel-dropdown.js +1 -1
  117. package/dist/components/kritzel-editor.js +39 -27
  118. package/dist/components/kritzel-editor.js.map +1 -1
  119. package/dist/components/kritzel-engine.js +1 -1
  120. package/dist/components/kritzel-font-family.js +1 -1
  121. package/dist/components/kritzel-font-size.js +1 -1
  122. package/dist/components/kritzel-font.js +1 -1
  123. package/dist/components/kritzel-icon.js +1 -1
  124. package/dist/components/kritzel-menu-item.js +1 -1
  125. package/dist/components/kritzel-menu.js +1 -1
  126. package/dist/components/kritzel-portal.js +1 -1
  127. package/dist/components/kritzel-split-button.js +1 -1
  128. package/dist/components/kritzel-stroke-size.js +1 -1
  129. package/dist/components/kritzel-tooltip.js +1 -1
  130. package/dist/components/kritzel-utility-panel.js +1 -1
  131. package/dist/components/kritzel-workspace-manager.js +1 -1
  132. package/dist/components/{p-C_hSH2nN.js → p-8iFF5GHL.js} +6 -6
  133. package/dist/components/{p-C_hSH2nN.js.map → p-8iFF5GHL.js.map} +1 -1
  134. package/dist/components/{p-BycHaC-9.js → p-BCrMfH5n.js} +6 -6
  135. package/dist/components/{p-BycHaC-9.js.map → p-BCrMfH5n.js.map} +1 -1
  136. package/dist/components/{p-D_RcVGj0.js → p-BHDOht0m.js} +6 -6
  137. package/dist/components/{p-D_RcVGj0.js.map → p-BHDOht0m.js.map} +1 -1
  138. package/dist/components/{p-DqsgZIHC.js → p-BHT7_POQ.js} +6 -6
  139. package/dist/components/{p-DqsgZIHC.js.map → p-BHT7_POQ.js.map} +1 -1
  140. package/dist/components/{p-DzyZA2GT.js → p-BQ5cdSqE.js} +11 -11
  141. package/dist/components/{p-DzyZA2GT.js.map → p-BQ5cdSqE.js.map} +1 -1
  142. package/dist/components/{p-Co5lU_7h.js → p-BaHZYvfq.js} +13 -13
  143. package/dist/components/{p-Co5lU_7h.js.map → p-BaHZYvfq.js.map} +1 -1
  144. package/dist/components/{p-BJbN3vca.js → p-BctNMdxr.js} +8 -8
  145. package/dist/components/{p-BJbN3vca.js.map → p-BctNMdxr.js.map} +1 -1
  146. package/dist/components/{p-D27d2rKT.js → p-Bhtn9qay.js} +5 -5
  147. package/dist/components/{p-D27d2rKT.js.map → p-Bhtn9qay.js.map} +1 -1
  148. package/dist/components/{p-CEn1WeG3.js → p-Bit0z7Yg.js} +9 -9
  149. package/dist/components/{p-CEn1WeG3.js.map → p-Bit0z7Yg.js.map} +1 -1
  150. package/dist/components/{p-CGb-8cK4.js → p-BlI4vzRZ.js} +5 -5
  151. package/dist/components/{p-CGb-8cK4.js.map → p-BlI4vzRZ.js.map} +1 -1
  152. package/dist/components/{p-fiFoOjv0.js → p-C3_LIgzd.js} +10 -10
  153. package/dist/components/{p-fiFoOjv0.js.map → p-C3_LIgzd.js.map} +1 -1
  154. package/dist/components/{p-DPxzgBs0.js → p-CIXPLjCu.js} +4 -4
  155. package/dist/components/{p-DPxzgBs0.js.map → p-CIXPLjCu.js.map} +1 -1
  156. package/dist/components/{p-dcR2uxM3.js → p-CURq0twf.js} +6 -6
  157. package/dist/components/{p-dcR2uxM3.js.map → p-CURq0twf.js.map} +1 -1
  158. package/dist/components/p-CwHz5s2a.js +18262 -0
  159. package/dist/components/p-CwHz5s2a.js.map +1 -0
  160. package/dist/components/{p-C9hrbrUN.js → p-CwkUrTy1.js} +5 -7
  161. package/dist/{cjs/index-DcTwXs_q.js.map → components/p-CwkUrTy1.js.map} +1 -1
  162. package/dist/components/{p-ByAzDzS5.js → p-D13ydJjo.js} +5 -5
  163. package/dist/components/{p-ByAzDzS5.js.map → p-D13ydJjo.js.map} +1 -1
  164. package/dist/components/{p-1bVCRi-d.js → p-DPN0PZvw.js} +20 -20
  165. package/dist/components/{p-1bVCRi-d.js.map → p-DPN0PZvw.js.map} +1 -1
  166. package/dist/components/{p-BFNwskCY.js → p-Dbp5YJIa.js} +5 -5
  167. package/dist/components/{p-BFNwskCY.js.map → p-Dbp5YJIa.js.map} +1 -1
  168. package/dist/components/{p-BEKicPnH.js → p-Dcf7tVJW.js} +5 -5
  169. package/dist/components/{p-BEKicPnH.js.map → p-Dcf7tVJW.js.map} +1 -1
  170. package/dist/components/{p-CieOx1XL.js → p-EBtkRix7.js} +8 -8
  171. package/dist/components/{p-CieOx1XL.js.map → p-EBtkRix7.js.map} +1 -1
  172. package/dist/components/{p-UsToUu6G.js → p-G2HGJcNm.js} +118 -196
  173. package/dist/components/p-G2HGJcNm.js.map +1 -0
  174. package/dist/components/{p-gCHmJzc2.js → p-NXPGXBZ2.js} +6 -6
  175. package/dist/components/{p-gCHmJzc2.js.map → p-NXPGXBZ2.js.map} +1 -1
  176. package/dist/components/{p-YqK8ch2R.js → p-n789Y3S-.js} +4 -5
  177. package/dist/components/p-n789Y3S-.js.map +1 -0
  178. package/dist/esm/{index-YVlgItFD.js → default-text-tool.config-nXXHSTK9.js} +15920 -1090
  179. package/dist/esm/default-text-tool.config-nXXHSTK9.js.map +1 -0
  180. package/dist/esm/{index-Cw77zP6g.js → index-SGde3HXB.js} +9 -11
  181. package/dist/esm/index-SGde3HXB.js.map +1 -0
  182. package/dist/esm/index.js +1358 -1
  183. package/dist/esm/index.js.map +1 -1
  184. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  185. package/dist/esm/kritzel-color_22.entry.js +732 -709
  186. package/dist/esm/loader.js +3 -3
  187. package/dist/esm/stencil.js +4 -4
  188. package/dist/esm/stencil.js.map +1 -1
  189. package/dist/stencil/index.esm.js +1 -1
  190. package/dist/stencil/index.esm.js.map +1 -1
  191. package/dist/stencil/{p-Cw77zP6g.js → p-SGde3HXB.js} +2 -2
  192. package/dist/stencil/p-SGde3HXB.js.map +1 -0
  193. package/dist/stencil/{p-8b831c94.entry.js → p-d702c5af.entry.js} +2 -2
  194. package/dist/stencil/p-f8a8a8d7.entry.js +2 -0
  195. package/dist/stencil/p-f8a8a8d7.entry.js.map +1 -0
  196. package/dist/stencil/p-nXXHSTK9.js +2 -0
  197. package/dist/stencil/p-nXXHSTK9.js.map +1 -0
  198. package/dist/stencil/stencil.esm.js +1 -1
  199. package/dist/stencil/stencil.esm.js.map +1 -1
  200. package/dist/types/classes/core/core.class.d.ts +34 -21
  201. package/dist/types/classes/core/store.class.d.ts +8 -0
  202. package/dist/types/classes/objects/base-object.class.d.ts +1 -5
  203. package/dist/types/classes/objects/path.class.d.ts +1 -0
  204. package/dist/types/classes/objects/selection-box.class.d.ts +2 -3
  205. package/dist/types/classes/objects/selection-group.class.d.ts +24 -5
  206. package/dist/types/classes/objects/text.class.d.ts +1 -3
  207. package/dist/types/classes/providers/broadcast-sync-provider.class.d.ts +18 -0
  208. package/dist/types/classes/providers/hocuspocus-sync-provider.class.d.ts +120 -0
  209. package/dist/types/classes/providers/indexeddb-sync-provider.class.d.ts +22 -0
  210. package/dist/types/classes/providers/websocket-sync-provider.class.d.ts +52 -0
  211. package/dist/types/classes/structures/app-state-map.structure.d.ts +30 -0
  212. package/dist/types/classes/structures/object-map.structure.d.ts +39 -1
  213. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +3 -0
  214. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +2 -0
  215. package/dist/types/components.d.ts +6 -0
  216. package/dist/types/configs/{default-engine-state.d.ts → default-engine-config.d.ts} +1 -1
  217. package/dist/types/configs/default-sync.config.d.ts +5 -0
  218. package/dist/types/constants/core.constants.d.ts +0 -0
  219. package/dist/types/index.d.ts +8 -1
  220. package/dist/types/interfaces/debug-info.interface.d.ts +0 -1
  221. package/dist/types/interfaces/engine-state.interface.d.ts +1 -10
  222. package/dist/types/interfaces/object.interface.d.ts +1 -1
  223. package/dist/types/interfaces/selection-state.interface.d.ts +0 -4
  224. package/dist/types/interfaces/sync-config.interface.d.ts +22 -0
  225. package/dist/types/interfaces/sync-provider.interface.d.ts +29 -0
  226. package/dist/types/stencil-public-runtime.d.ts +1 -1
  227. package/package.json +16 -11
  228. package/dist/cjs/index-C9GjuVAx.js.map +0 -1
  229. package/dist/collection/classes/commands/add-object.command.js +0 -18
  230. package/dist/collection/classes/commands/add-object.command.js.map +0 -1
  231. package/dist/collection/classes/commands/add-selection-group.command.js +0 -24
  232. package/dist/collection/classes/commands/add-selection-group.command.js.map +0 -1
  233. package/dist/collection/classes/commands/base.command.js +0 -19
  234. package/dist/collection/classes/commands/base.command.js.map +0 -1
  235. package/dist/collection/classes/commands/batch.command.js +0 -15
  236. package/dist/collection/classes/commands/batch.command.js.map +0 -1
  237. package/dist/collection/classes/commands/move-selection-group.command.js +0 -44
  238. package/dist/collection/classes/commands/move-selection-group.command.js.map +0 -1
  239. package/dist/collection/classes/commands/remove-object.command.js +0 -18
  240. package/dist/collection/classes/commands/remove-object.command.js.map +0 -1
  241. package/dist/collection/classes/commands/remove-selection-group.command.js +0 -19
  242. package/dist/collection/classes/commands/remove-selection-group.command.js.map +0 -1
  243. package/dist/collection/classes/commands/resize-selection-group.command.js +0 -29
  244. package/dist/collection/classes/commands/resize-selection-group.command.js.map +0 -1
  245. package/dist/collection/classes/commands/rotate-selection-group.command.js +0 -29
  246. package/dist/collection/classes/commands/rotate-selection-group.command.js.map +0 -1
  247. package/dist/collection/classes/commands/update-object.command.js +0 -38
  248. package/dist/collection/classes/commands/update-object.command.js.map +0 -1
  249. package/dist/collection/classes/commands/update-viewport.command.js +0 -25
  250. package/dist/collection/classes/commands/update-viewport.command.js.map +0 -1
  251. package/dist/collection/classes/core/command-manager.class.js +0 -51
  252. package/dist/collection/classes/core/command-manager.class.js.map +0 -1
  253. package/dist/collection/classes/core/database.class.js +0 -236
  254. package/dist/collection/classes/core/database.class.js.map +0 -1
  255. package/dist/collection/classes/core/history.class.js +0 -51
  256. package/dist/collection/classes/core/history.class.js.map +0 -1
  257. package/dist/collection/classes/structures/circular-buffer.structure.js +0 -48
  258. package/dist/collection/classes/structures/circular-buffer.structure.js.map +0 -1
  259. package/dist/collection/configs/default-engine-state.js.map +0 -1
  260. package/dist/collection/interfaces/command.interface.js +0 -2
  261. package/dist/collection/interfaces/command.interface.js.map +0 -1
  262. package/dist/components/p-C9hrbrUN.js.map +0 -1
  263. package/dist/components/p-UsToUu6G.js.map +0 -1
  264. package/dist/components/p-YqK8ch2R.js.map +0 -1
  265. package/dist/components/p-kn4eunyR.js +0 -3338
  266. package/dist/components/p-kn4eunyR.js.map +0 -1
  267. package/dist/esm/index-Cw77zP6g.js.map +0 -1
  268. package/dist/esm/index-YVlgItFD.js.map +0 -1
  269. package/dist/stencil/p-Cw77zP6g.js.map +0 -1
  270. package/dist/stencil/p-YVlgItFD.js +0 -2
  271. package/dist/stencil/p-YVlgItFD.js.map +0 -1
  272. package/dist/stencil/p-fe738990.entry.js +0 -2
  273. package/dist/stencil/p-fe738990.entry.js.map +0 -1
  274. package/dist/types/classes/commands/add-object.command.d.ts +0 -9
  275. package/dist/types/classes/commands/add-selection-group.command.d.ts +0 -10
  276. package/dist/types/classes/commands/base.command.d.ts +0 -11
  277. package/dist/types/classes/commands/batch.command.d.ts +0 -8
  278. package/dist/types/classes/commands/move-selection-group.command.d.ts +0 -13
  279. package/dist/types/classes/commands/remove-object.command.d.ts +0 -9
  280. package/dist/types/classes/commands/remove-selection-group.command.d.ts +0 -8
  281. package/dist/types/classes/commands/resize-selection-group.command.d.ts +0 -20
  282. package/dist/types/classes/commands/rotate-selection-group.command.d.ts +0 -10
  283. package/dist/types/classes/commands/update-object.command.d.ts +0 -11
  284. package/dist/types/classes/commands/update-viewport.command.d.ts +0 -21
  285. package/dist/types/classes/core/command-manager.class.d.ts +0 -16
  286. package/dist/types/classes/core/database.class.d.ts +0 -29
  287. package/dist/types/classes/core/history.class.d.ts +0 -12
  288. package/dist/types/classes/structures/circular-buffer.structure.d.ts +0 -13
  289. package/dist/types/interfaces/command.interface.d.ts +0 -6
  290. /package/dist/stencil/{p-8b831c94.entry.js.map → p-d702c5af.entry.js.map} +0 -0
@@ -1,168 +1,131 @@
1
1
  import { KritzelContextMenu } from "../../components/ui/kritzel-context-menu/kritzel-context-menu";
2
- import { DEFAULT_ENGINE_STATE } from "../../configs/default-engine-state";
2
+ import { DEFAULT_ENGINE_CONFIG } from "../../configs/default-engine-config";
3
3
  import { ObjectHelper } from "../../helpers/object.helper";
4
- import { AddObjectCommand } from "../commands/add-object.command";
5
- import { AddSelectionGroupCommand } from "../commands/add-selection-group.command";
6
- import { BatchCommand } from "../commands/batch.command";
7
- import { RemoveObjectCommand } from "../commands/remove-object.command";
8
- import { RemoveSelectionGroupCommand } from "../commands/remove-selection-group.command";
9
- import { UpdateObjectCommand } from "../commands/update-object.command";
10
- import { KritzelDatabase } from "./database.class";
11
- import { KritzelHistory } from "./history.class";
12
- import { KrtizelSelectionBox } from "../objects/selection-box.class";
4
+ import { KritzelSelectionBox } from "../objects/selection-box.class";
13
5
  import { KritzelSelectionGroup } from "../objects/selection-group.class";
14
6
  import { KritzelToolRegistry } from "../registries/tool.registry";
15
- import { KritzelReviver } from "./reviver.class";
16
7
  import { KritzelStore } from "./store.class";
17
8
  import { KritzelWorkspace } from "./workspace.class";
18
- import { KritzelCommandManager } from "./command-manager.class";
9
+ import { KritzelObjectMap } from "../structures/object-map.structure";
10
+ import { KritzelAppStateMap } from "../structures/app-state-map.structure";
19
11
  export class KritzelCore {
20
12
  _kritzelEngine;
21
13
  _store;
22
- _history;
23
- _commandManager;
24
- _database;
14
+ _syncConfig;
15
+ _appStateMap;
25
16
  get engine() {
26
17
  return this._kritzelEngine;
27
18
  }
28
- get history() {
29
- return this._history;
30
- }
31
- get commandManager() {
32
- return this._commandManager;
33
- }
34
- get database() {
35
- return this._database;
36
- }
37
19
  get store() {
38
20
  return this._store;
39
21
  }
22
+ get appStateMap() {
23
+ return this._appStateMap;
24
+ }
40
25
  constructor(kritzelEngine) {
41
26
  this._kritzelEngine = kritzelEngine;
42
- this._store = new KritzelStore(DEFAULT_ENGINE_STATE);
43
- this._history = new KritzelHistory(this);
44
- this._commandManager = new KritzelCommandManager(this);
45
- this._database = new KritzelDatabase('kritzelDB', 1, this._store.state.debugInfo.logDatabase);
46
- }
47
- async initializeDatabase() {
48
- await this._database.open([
49
- {
50
- name: 'objects',
51
- options: { keyPath: ['workspaceId', 'id'] },
52
- },
53
- { name: 'workspaces', options: { keyPath: 'id' } },
54
- ]);
55
- this.rerender();
56
- }
57
- async initializeWorkspace(workspace) {
58
- const workspaces = await this.getWorkspaces();
59
- const mostRecentWorkspace = [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0];
60
- const fallbackWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');
61
- const candidateWorkspace = workspace ?? mostRecentWorkspace ?? fallbackWorkspace;
62
- const existingWorkspace = await this.getWorkspace(candidateWorkspace.id);
63
- if (existingWorkspace) {
64
- this._store.state.activeWorkspace = existingWorkspace;
65
- await this.updateWorkspace(this._store.state.activeWorkspace);
27
+ this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);
28
+ this._appStateMap = new KritzelAppStateMap();
29
+ }
30
+ setSyncConfig(config) {
31
+ this._syncConfig = config;
32
+ }
33
+ async initializeYjs() {
34
+ await this._appStateMap.initialize(this, this._syncConfig);
35
+ }
36
+ /**
37
+ * Load all workspaces from app state map
38
+ */
39
+ loadWorkspacesFromAppState() {
40
+ return this._appStateMap.allWorkspaces();
41
+ }
42
+ /**
43
+ * Save a workspace to app state map
44
+ */
45
+ saveWorkspaceToAppState(workspace) {
46
+ if (this._appStateMap.has(workspace.id)) {
47
+ this._appStateMap.update(workspace);
66
48
  }
67
49
  else {
68
- this._store.state.activeWorkspace = candidateWorkspace;
69
- await this.createWorkspace(this._store.state.activeWorkspace);
50
+ this._appStateMap.insert(workspace);
70
51
  }
71
- this._store.state.workspaces = await this.getWorkspaces();
72
- const viewport = this._store.state.activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };
73
- this._store.state.translateX = viewport.translateX ?? 0;
74
- this._store.state.translateY = viewport.translateY ?? 0;
75
- this._store.state.scale = viewport.scale ?? 1;
76
- await this.initializeWorkspaceObjects(this._store.state.activeWorkspace.id);
77
- }
78
- async initializeWorkspaceObjects(workspaceId) {
79
- this._store.state.objectsMap.reset();
80
- this._history.reset();
81
- const objectsFromDb = await this._database.getAllByRange('objects', IDBKeyRange.bound([workspaceId], [workspaceId, '\uffff']));
82
- const reviver = new KritzelReviver(this);
83
- objectsFromDb.forEach(element => {
84
- const revivedObject = reviver.revive(element);
85
- this._store.state.objectsMap.insert(revivedObject);
86
- });
87
- this.rerender();
88
52
  }
89
- async updateWorkspaceViewport(translateX, translateY, scale) {
90
- const activeWorkspace = this._store.state.activeWorkspace;
91
- if (!activeWorkspace) {
92
- throw new Error('Workspace not initialized');
93
- }
94
- activeWorkspace.viewport = { translateX, translateY, scale };
95
- activeWorkspace.updatedAt = new Date();
96
- await this._database.update('workspaces', activeWorkspace);
53
+ /**
54
+ * Delete a workspace from app state map
55
+ */
56
+ deleteWorkspaceFromAppState(workspaceId) {
57
+ this._appStateMap.remove(w => w.id === workspaceId);
97
58
  }
98
- async addObjectToDatabase(object) {
99
- if (!this._database) {
100
- throw new Error('Database not initialized');
59
+ async initializeWorkspace(workspace) {
60
+ // Load all workspaces from app state map
61
+ const workspaces = this.loadWorkspacesFromAppState();
62
+ // Find most recently updated workspace or use provided/fallback
63
+ const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;
64
+ let activeWorkspace;
65
+ if (workspace) {
66
+ // Use provided workspace
67
+ activeWorkspace = workspace;
68
+ const existing = workspaces.find(w => w.id === workspace.id);
69
+ if (!existing) {
70
+ // New workspace, save it
71
+ activeWorkspace._core = this;
72
+ this.saveWorkspaceToAppState(activeWorkspace);
73
+ }
101
74
  }
102
- const activeWorkspace = this._store.state.activeWorkspace;
103
- if (!activeWorkspace) {
104
- throw new Error('Workspace not initialized');
75
+ else if (mostRecentWorkspace) {
76
+ // Use most recent workspace
77
+ activeWorkspace = mostRecentWorkspace;
105
78
  }
106
- activeWorkspace.updatedAt = new Date();
107
- await this._database.batch([db => db.add('objects', object), db => db.update('workspaces', activeWorkspace)]).catch(err => {
108
- console.error('Error adding object to database:', err);
109
- });
110
- }
111
- async updateObjectInDatabase(object) {
112
- if (!this._database) {
113
- throw new Error('Database not initialized');
79
+ else {
80
+ // Create fallback workspace
81
+ activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');
82
+ activeWorkspace._core = this;
83
+ this.saveWorkspaceToAppState(activeWorkspace);
114
84
  }
115
- const activeWorkspace = this._store.state.activeWorkspace;
116
- if (!activeWorkspace) {
117
- throw new Error('Workspace not initialized');
85
+ // Destroy old ObjectMap if switching workspaces
86
+ if (this._store.state.objectsMap && this._store.state.objectsMap.isReady) {
87
+ this._store.state.objectsMap.destroy();
118
88
  }
119
- activeWorkspace.updatedAt = new Date();
120
- await this._database.batch([db => db.update('objects', object), db => db.update('workspaces', activeWorkspace)]).catch(err => {
121
- console.error('Error updating object in database:', err);
122
- });
89
+ // Set active workspace
90
+ this._store.state.activeWorkspace = activeWorkspace;
91
+ this._store.state.workspaces = this.loadWorkspacesFromAppState();
92
+ // Set viewport from workspace
93
+ const viewport = activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };
94
+ this._store.state.translateX = viewport.translateX ?? 0;
95
+ this._store.state.translateY = viewport.translateY ?? 0;
96
+ this._store.state.scale = viewport.scale ?? 1;
97
+ // Create new ObjectMap with its own Y.Doc for this workspace
98
+ const objectsMap = new KritzelObjectMap();
99
+ await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);
100
+ this._store.state.objectsMap = objectsMap;
101
+ this.rerender();
123
102
  }
124
- async deleteObjectFromDatabase(objectId) {
125
- if (!this._database) {
126
- throw new Error('Database not initialized');
127
- }
128
- const activeWorkspace = this._store.state.activeWorkspace;
129
- if (!activeWorkspace) {
130
- throw new Error('Workspace not initialized');
103
+ rerender() {
104
+ if (this._kritzelEngine) {
105
+ this._kritzelEngine.forceUpdate++;
131
106
  }
132
- activeWorkspace.updatedAt = new Date();
133
- await this._database.batch([db => db.delete('objects', [activeWorkspace.id, objectId]), db => db.update('workspaces', activeWorkspace)]).catch(err => {
134
- console.error('Error deleting object from database:', err);
135
- });
136
107
  }
137
- async getWorkspace(id) {
138
- if (!this._database) {
139
- throw new Error('Database not initialized');
108
+ findObjectById(id) {
109
+ for (const object of this._store.allObjects) {
110
+ if (object.id === id) {
111
+ return object;
112
+ }
140
113
  }
141
- const reviver = new KritzelReviver(this);
142
- return this._database.get('workspaces', id).then(rawWorkspace => (rawWorkspace ? reviver.revive(rawWorkspace) : null));
114
+ return null;
143
115
  }
144
- async getWorkspaces() {
145
- if (!this._database) {
146
- throw new Error('Database not initialized');
147
- }
148
- const reviver = new KritzelReviver(this);
149
- return this._database.getAll('workspaces').then(rawWorkspaces => rawWorkspaces.map(ws => reviver.revive(ws)));
116
+ getWorkspaces() {
117
+ return this.loadWorkspacesFromAppState();
150
118
  }
151
- async createWorkspace(workspace) {
152
- if (!this._database) {
153
- throw new Error('Database not initialized');
154
- }
119
+ createWorkspace(workspace) {
120
+ workspace._core = this;
155
121
  workspace.createdAt = new Date();
156
122
  workspace.updatedAt = new Date();
157
- await this._database.add('workspaces', workspace);
158
- this._store.state.workspaces.push(workspace);
123
+ this.saveWorkspaceToAppState(workspace);
124
+ this._store.state.workspaces = this.loadWorkspacesFromAppState();
159
125
  }
160
- async updateWorkspace(workspace) {
161
- if (!this._database) {
162
- throw new Error('Database not initialized');
163
- }
126
+ updateWorkspace(workspace) {
164
127
  workspace.updatedAt = new Date();
165
- await this._database.update('workspaces', workspace);
128
+ this.saveWorkspaceToAppState(workspace);
166
129
  const workspaces = this._store.state.workspaces;
167
130
  const index = workspaces.findIndex(w => w.id === workspace.id);
168
131
  if (index !== -1) {
@@ -170,126 +133,216 @@ export class KritzelCore {
170
133
  this._store.state.workspaces = workspaces;
171
134
  }
172
135
  }
173
- async deleteWorkspace(workspace) {
174
- if (!this._database) {
175
- throw new Error('Database not initialized');
136
+ deleteWorkspace(workspace) {
137
+ // If deleting the active workspace, need to handle ObjectMap cleanup
138
+ if (this._store.state.activeWorkspace?.id === workspace.id) {
139
+ this._store.state.objectsMap?.destroy();
176
140
  }
177
- const objectRange = IDBKeyRange.bound([workspace.id], [workspace.id, '\uffff']);
178
- await this._database.deleteByRange('objects', objectRange);
179
- await this._database.delete('workspaces', workspace.id);
180
- this._store.state.workspaces = this._store.state.workspaces.filter(ws => ws.id !== workspace.id);
141
+ this.deleteWorkspaceFromAppState(workspace.id);
142
+ this._store.state.workspaces = this.loadWorkspacesFromAppState();
143
+ // Also delete the workspace's IndexedDB database
144
+ const dbName = `kritzel-workspace-${workspace.id}`;
145
+ window.indexedDB.deleteDatabase(dbName);
181
146
  }
182
- rerender() {
183
- if (this._kritzelEngine) {
184
- this._kritzelEngine.forceUpdate++;
147
+ updateWorkspaceViewport(translateX, translateY, scale) {
148
+ const activeWorkspace = this._store.state.activeWorkspace;
149
+ if (!activeWorkspace) {
150
+ return;
185
151
  }
152
+ activeWorkspace.viewport = { translateX, translateY, scale };
153
+ activeWorkspace.updatedAt = new Date();
154
+ this.saveWorkspaceToAppState(activeWorkspace);
186
155
  }
187
- findObjectById(id) {
188
- for (const object of this._store.allObjects) {
189
- if (object.id === id) {
190
- return object;
156
+ addObject(object) {
157
+ this._store.state.objectsMap.insert(object);
158
+ }
159
+ removeObject(object) {
160
+ object.isMounted = false;
161
+ this._store.state.objectsMap.remove(o => o.id === object.id);
162
+ }
163
+ updateObject(object, updatedProperties) {
164
+ for (const key in updatedProperties) {
165
+ if (updatedProperties.hasOwnProperty(key)) {
166
+ object[key] = updatedProperties[key];
191
167
  }
192
168
  }
193
- return null;
169
+ this._store.state.objectsMap.update(object);
194
170
  }
195
- deselectAllObjects() {
196
- if (this._store.state.selectionGroup) {
197
- this.commandManager.executeCommand(new RemoveSelectionGroupCommand(this, this, true));
171
+ addSelectionGroup(selectionGroup) {
172
+ this.removeSelectionGroup();
173
+ this.removeSelectionBox();
174
+ this._store.state.objectsMap.insert(selectionGroup);
175
+ }
176
+ removeSelectionGroup() {
177
+ const selectionGroup = this._store.selectionGroup;
178
+ if (selectionGroup) {
179
+ this._store.state.objectsMap.remove(object => object.id === selectionGroup.id);
180
+ }
181
+ }
182
+ removeSelectionBox() {
183
+ const selectionBox = this._store.selectionBox;
184
+ if (selectionBox) {
185
+ this._store.state.objectsMap.remove(object => object.id === selectionBox.id);
198
186
  }
199
187
  }
188
+ deselectAllObjects() {
189
+ this.removeSelectionGroup();
190
+ this.rerender();
191
+ }
200
192
  delete() {
201
- if (!this._store.state.selectionGroup) {
193
+ const selectionGroup = this._store.selectionGroup;
194
+ if (!selectionGroup) {
202
195
  return;
203
196
  }
204
- const deleteSelectedObjectsCommand = this._store.state.selectionGroup.objects.map(obj => new RemoveObjectCommand(this, this._store.state.selectionGroup, obj));
205
- const removeSelectionGroupCommand = new RemoveSelectionGroupCommand(this, this._store.state.selectionGroup);
206
- const commands = [...deleteSelectedObjectsCommand, removeSelectionGroupCommand];
207
- this.commandManager.executeCommand(new BatchCommand(this, this._store.state.selectionGroup, commands));
197
+ selectionGroup.objects.forEach(obj => this.removeObject(obj));
198
+ this.removeSelectionGroup();
199
+ this.rerender();
200
+ }
201
+ undo() {
202
+ this._store.state.objectsMap?.undo();
203
+ }
204
+ redo() {
205
+ this._store.state.objectsMap?.redo();
208
206
  }
209
- deleteObject(id, skipHistory = false) {
207
+ deleteObject(id) {
210
208
  const object = this.findObjectById(id);
211
209
  if (object) {
212
- const removeObjectCommand = new RemoveObjectCommand(this, this, object, skipHistory);
213
- this.commandManager.executeCommand(removeObjectCommand);
210
+ this.removeObject(object);
211
+ this.rerender();
214
212
  }
215
213
  }
216
214
  copy() {
217
- this._store.state.copiedObjects = this._store.state.selectionGroup.copy();
215
+ const selectionGroup = this._store.selectionGroup;
216
+ if (selectionGroup) {
217
+ // Copy each object and store them in an array
218
+ this._store.state.copiedObjects = selectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy());
219
+ }
218
220
  }
219
221
  paste(x, y) {
220
222
  const copiedObjects = this._store.state.copiedObjects;
221
- copiedObjects.isSelected = true;
222
- this._store.state.copiedObjects = copiedObjects;
223
- const adjustedX = x !== undefined ? x : this._store.state.copiedObjects.translateX + 25 / this._store.state.scale;
224
- const adjustedY = y !== undefined ? y : this._store.state.copiedObjects.translateY + 25 / this._store.state.scale;
225
- this._store.state.copiedObjects.updatePosition(adjustedX, adjustedY);
226
- this._store.state.copiedObjects.updateZIndices(this._store.currentZIndex);
223
+ if (!copiedObjects || copiedObjects.length === 0) {
224
+ return;
225
+ }
227
226
  const activeWorkspace = this._store.state.activeWorkspace;
228
- if (this.store.state.copiedObjects.workspaceId !== activeWorkspace.id) {
229
- this.store.state.copiedObjects.updateWorkspaceId(activeWorkspace.id);
227
+ // Check if we're pasting from a different workspace
228
+ const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);
229
+ // Calculate the bounding box of all copied objects
230
+ const minX = Math.min(...copiedObjects.map(obj => obj.translateX));
231
+ const minY = Math.min(...copiedObjects.map(obj => obj.translateY));
232
+ // Determine the paste position
233
+ let pasteX;
234
+ let pasteY;
235
+ if (x !== undefined && y !== undefined) {
236
+ // Explicit position provided (e.g., right-click paste)
237
+ pasteX = x;
238
+ pasteY = y;
239
+ }
240
+ else if (isDifferentWorkspace) {
241
+ // Pasting to different workspace without explicit position
242
+ // Keep original position; will be centered by centerInViewport() later
243
+ pasteX = minX;
244
+ pasteY = minY;
245
+ }
246
+ else {
247
+ // Same workspace paste: offset by 25 pixels from original position
248
+ pasteX = minX + 25 / this._store.state.scale;
249
+ pasteY = minY + 25 / this._store.state.scale;
250
+ }
251
+ // Calculate the offset to apply to all objects
252
+ const offsetX = pasteX - minX;
253
+ const offsetY = pasteY - minY;
254
+ this.removeSelectionGroup();
255
+ this.removeSelectionBox();
256
+ // Create a new selection group for the pasted objects
257
+ const selectionGroup = KritzelSelectionGroup.create(this);
258
+ // First add all copied objects to the objectsMap with updated positions
259
+ copiedObjects.forEach((obj, i) => {
260
+ // Update workspace if pasting to a different workspace
261
+ if (obj.workspaceId !== activeWorkspace.id) {
262
+ obj.workspaceId = activeWorkspace.id;
263
+ }
264
+ // Update position
265
+ obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);
266
+ // Update z-index
267
+ obj.zIndex = this._store.currentZIndex + i;
268
+ // Add to objectsMap
269
+ this.addObject(obj);
270
+ // Add to selection group
271
+ selectionGroup.addOrRemove(obj);
272
+ });
273
+ // Mark selection group as selected
274
+ selectionGroup.isSelected = true;
275
+ // Set rotation for single object
276
+ if (copiedObjects.length === 1) {
277
+ selectionGroup.rotation = copiedObjects[0].rotation;
278
+ }
279
+ // Add the selection group
280
+ this.addSelectionGroup(selectionGroup);
281
+ // Handle cross-workspace paste: center objects in viewport
282
+ if (isDifferentWorkspace) {
230
283
  if (x !== undefined && y !== undefined) {
231
- this._store.state.copiedObjects.updatePosition(x, y);
284
+ // Position was explicitly provided, use it
285
+ selectionGroup.updatePosition(x, y);
232
286
  }
233
287
  else {
234
- this.store.state.copiedObjects.centerInViewport();
288
+ // Center the selection group in the viewport
289
+ selectionGroup.centerInViewport();
235
290
  }
236
- this.engine.viewport.centerFitInViewport(copiedObjects);
291
+ // Fit the viewport to show the pasted objects
292
+ this.engine.viewport.centerFitInViewport(selectionGroup);
237
293
  }
238
- const commands = [];
239
- let previousSelectionGroup = null;
240
- if (this._store.state.selectionGroup !== null) {
241
- previousSelectionGroup = this._store.state.selectionGroup;
242
- commands.push(new RemoveSelectionGroupCommand(this, this._store.state.selectionGroup));
243
- }
244
- const addCopiedObjectsCommands = this._store.state.copiedObjects.objects.map(obj => new AddObjectCommand(this, this, obj));
245
- const addCopiedObjectsAsSelectionGroupCommand = new AddSelectionGroupCommand(this, this, this._store.state.copiedObjects, previousSelectionGroup);
246
- commands.push(...addCopiedObjectsCommands, addCopiedObjectsAsSelectionGroupCommand);
247
- this.commandManager.executeCommand(new BatchCommand(this, this, commands));
248
294
  this._store.state.isSelecting = false;
249
- this._store.state.copiedObjects = this._store.state.selectionGroup.copy();
295
+ // Update copiedObjects to the newly created objects for potential future pastes
296
+ const newSelectionGroup = this._store.selectionGroup;
297
+ if (newSelectionGroup) {
298
+ this._store.state.copiedObjects = newSelectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy());
299
+ }
250
300
  this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
301
+ this.rerender();
251
302
  }
252
303
  bringForward(object) {
253
- const objects = object ? [object] : this._store.state.selectionGroup.objects;
304
+ const selectionGroup = this._store.selectionGroup;
305
+ const objects = object ? [object] : selectionGroup?.objects || [];
254
306
  const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
255
307
  const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;
256
- const increaseZIndexCommands = objects.map(obj => {
257
- if (obj.zIndex === max) {
258
- return;
308
+ objects.forEach(obj => {
309
+ if (obj.zIndex !== max) {
310
+ this.updateObject(obj, { zIndex: obj.zIndex + 1 });
259
311
  }
260
- return new UpdateObjectCommand(this, this, obj, { zIndex: obj.zIndex + 1 });
261
312
  });
262
- this.commandManager.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));
313
+ this.rerender();
263
314
  }
264
315
  sendBackward(object) {
265
- const objects = object ? [object] : this._store.state.selectionGroup.objects;
316
+ const selectionGroup = this._store.selectionGroup;
317
+ const objects = object ? [object] : selectionGroup?.objects || [];
266
318
  const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
267
319
  const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;
268
- const decreaseZIndexCommands = objects.map(obj => {
269
- if (obj.zIndex === min) {
270
- return;
320
+ objects.forEach(obj => {
321
+ if (obj.zIndex !== min) {
322
+ this.updateObject(obj, { zIndex: obj.zIndex - 1 });
271
323
  }
272
- return new UpdateObjectCommand(this, this, obj, { zIndex: obj.zIndex - 1 });
273
324
  });
274
- this.commandManager.executeCommand(new BatchCommand(this, this, decreaseZIndexCommands));
325
+ this.rerender();
275
326
  }
276
327
  bringToFront(object) {
277
- const objects = object ? [object] : this._store.state.selectionGroup.objects;
328
+ const selectionGroup = this._store.selectionGroup;
329
+ const objects = object ? [object] : selectionGroup?.objects || [];
278
330
  const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
279
331
  const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;
280
- const increaseZIndexCommands = objects.map(obj => {
281
- return new UpdateObjectCommand(this, this, obj, { zIndex: max });
332
+ objects.forEach(obj => {
333
+ this.updateObject(obj, { zIndex: max });
282
334
  });
283
- this.commandManager.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));
335
+ this.rerender();
284
336
  }
285
337
  sendToBack(object) {
286
- const objects = object ? [object] : this._store.state.selectionGroup.objects;
338
+ const selectionGroup = this._store.selectionGroup;
339
+ const objects = object ? [object] : selectionGroup?.objects || [];
287
340
  const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
288
341
  const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;
289
- const decreaseZIndexCommands = objects.map(obj => {
290
- return new UpdateObjectCommand(this, this, obj, { zIndex: min });
342
+ objects.forEach(obj => {
343
+ this.updateObject(obj, { zIndex: min });
291
344
  });
292
- this.commandManager.executeCommand(new BatchCommand(this, this, decreaseZIndexCommands));
345
+ this.rerender();
293
346
  }
294
347
  selectObjects(objects) {
295
348
  if (objects.length === 0) {
@@ -301,16 +354,16 @@ export class KritzelCore {
301
354
  selectionGroup.addOrRemove(obj);
302
355
  });
303
356
  selectionGroup.isSelected = true;
304
- this._store.state.selectionBox = selectionGroup;
305
357
  if (objects.length === 1) {
306
358
  selectionGroup.rotation = selectionGroup.objects[0].rotation;
307
359
  }
308
- this.commandManager.executeCommand(new AddSelectionGroupCommand(this, this, selectionGroup));
360
+ this.addSelectionGroup(selectionGroup);
361
+ this.rerender();
309
362
  }
310
363
  selectAllObjectsInViewport() {
311
364
  const objectsInViewport = this._store.state.objectsMap
312
365
  .filter(o => o.isInViewport())
313
- .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox) && !(o instanceof KritzelContextMenu));
366
+ .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));
314
367
  if (objectsInViewport.length > 0) {
315
368
  const selectionGroup = KritzelSelectionGroup.create(this);
316
369
  objectsInViewport.forEach(obj => {
@@ -322,30 +375,29 @@ export class KritzelCore {
322
375
  if (objectsInViewport.length === 1) {
323
376
  selectionGroup.rotation = selectionGroup.objects[0].rotation;
324
377
  }
325
- this.commandManager.executeCommand(new AddSelectionGroupCommand(this, this, selectionGroup));
378
+ this.addSelectionGroup(selectionGroup);
326
379
  this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
380
+ this.rerender();
327
381
  }
328
382
  }
329
383
  clearSelection() {
330
- const command = new RemoveSelectionGroupCommand(this, this);
331
- this.commandManager.executeCommand(command);
332
- this._store.state.selectionGroup = null;
333
- this._store.state.selectionBox = null;
384
+ this.removeSelectionGroup();
385
+ this._store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
334
386
  this._store.state.isSelecting = false;
335
387
  this._store.state.isResizeHandleSelected = false;
336
388
  this._store.state.isRotationHandleSelected = false;
337
389
  this.rerender();
338
390
  }
339
391
  resetActiveText() {
340
- if (this._store.state.activeText) {
341
- if (this._store.state.activeText.isEmpty) {
342
- this.deleteObject(this._store.state.activeText.id, true);
392
+ const activeText = this._store.activeText;
393
+ if (activeText) {
394
+ if (activeText.isEmpty) {
395
+ this.deleteObject(activeText.id);
343
396
  }
344
397
  else {
345
- this._store.state.activeText.save();
398
+ activeText.save();
346
399
  }
347
400
  }
348
- this._store.state.activeText = null;
349
401
  }
350
402
  getObjectFromPointerEvent(event, selector = '.object') {
351
403
  const shadowRoot = this._store.state.host?.shadowRoot;