kritzel-react 0.1.30 → 0.1.32

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 (209) hide show
  1. package/dist/kritzel-react/lib/components/stencil-generated/components.js +122 -0
  2. package/dist/kritzel-react/lib/index.js +2 -0
  3. package/dist/kritzel-stencil/src/classes/core/core.class.js +797 -0
  4. package/dist/kritzel-stencil/src/classes/core/reviver.class.js +97 -0
  5. package/dist/kritzel-stencil/src/classes/core/store.class.js +153 -0
  6. package/dist/kritzel-stencil/src/classes/core/viewport.class.js +311 -0
  7. package/dist/kritzel-stencil/src/classes/core/workspace.class.js +34 -0
  8. package/dist/kritzel-stencil/src/classes/handlers/base.handler.js +6 -0
  9. package/dist/kritzel-stencil/src/classes/handlers/context-menu.handler.js +63 -0
  10. package/dist/kritzel-stencil/src/classes/handlers/hover.handler.js +18 -0
  11. package/dist/kritzel-stencil/src/classes/handlers/key.handler.js +76 -0
  12. package/dist/kritzel-stencil/src/classes/handlers/line-handle.handler.js +382 -0
  13. package/dist/kritzel-stencil/src/classes/handlers/move.handler.js +213 -0
  14. package/dist/kritzel-stencil/src/classes/handlers/resize.handler.js +205 -0
  15. package/dist/kritzel-stencil/src/classes/handlers/rotation.handler.js +117 -0
  16. package/dist/kritzel-stencil/src/classes/handlers/selection.handler.js +313 -0
  17. package/dist/kritzel-stencil/src/classes/managers/anchor.manager.js +1056 -0
  18. package/dist/kritzel-stencil/src/classes/managers/cursor.manager.js +117 -0
  19. package/dist/kritzel-stencil/src/classes/managers/theme.manager.js +103 -0
  20. package/dist/kritzel-stencil/src/classes/objects/base-object.class.js +249 -0
  21. package/dist/kritzel-stencil/src/classes/objects/custom-element.class.js +60 -0
  22. package/dist/kritzel-stencil/src/classes/objects/group.class.js +407 -0
  23. package/dist/kritzel-stencil/src/classes/objects/image.class.js +55 -0
  24. package/dist/kritzel-stencil/src/classes/objects/line.class.js +608 -0
  25. package/dist/kritzel-stencil/src/classes/objects/path.class.js +401 -0
  26. package/dist/kritzel-stencil/src/classes/objects/selection-box.class.js +21 -0
  27. package/dist/kritzel-stencil/src/classes/objects/selection-group.class.js +409 -0
  28. package/dist/kritzel-stencil/src/classes/objects/shape.class.js +412 -0
  29. package/dist/kritzel-stencil/src/classes/objects/text.class.js +292 -0
  30. package/dist/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.js +101 -0
  31. package/dist/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.js +241 -0
  32. package/dist/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.js +43 -0
  33. package/dist/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.js +98 -0
  34. package/dist/kritzel-stencil/src/classes/registries/icon-registry.class.js +66 -0
  35. package/dist/kritzel-stencil/src/classes/registries/tool.registry.js +21 -0
  36. package/dist/kritzel-stencil/src/classes/structures/app-state-map.structure.js +212 -0
  37. package/dist/kritzel-stencil/src/classes/structures/object-map.structure.js +414 -0
  38. package/dist/kritzel-stencil/src/classes/structures/quadtree.structure.js +151 -0
  39. package/dist/kritzel-stencil/src/classes/tools/base-tool.class.js +36 -0
  40. package/dist/kritzel-stencil/src/classes/tools/brush-tool.class.js +161 -0
  41. package/dist/kritzel-stencil/src/classes/tools/eraser-tool.class.js +85 -0
  42. package/dist/kritzel-stencil/src/classes/tools/image-tool.class.js +83 -0
  43. package/dist/kritzel-stencil/src/classes/tools/line-tool.class.js +187 -0
  44. package/dist/kritzel-stencil/src/classes/tools/selection-tool.class.js +429 -0
  45. package/dist/kritzel-stencil/src/classes/tools/shape-tool.class.js +196 -0
  46. package/dist/kritzel-stencil/src/classes/tools/text-tool.class.js +100 -0
  47. package/dist/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.js +1343 -0
  48. package/dist/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.js +46 -0
  49. package/dist/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.js +312 -0
  50. package/dist/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.js +60 -0
  51. package/dist/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.js +105 -0
  52. package/dist/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +53 -0
  53. package/dist/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.js +137 -0
  54. package/dist/kritzel-stencil/src/configs/default-brush-tool.config.js +9 -0
  55. package/dist/kritzel-stencil/src/configs/default-engine-config.js +63 -0
  56. package/dist/kritzel-stencil/src/configs/default-line-tool.config.js +9 -0
  57. package/dist/kritzel-stencil/src/configs/default-sync.config.js +9 -0
  58. package/dist/kritzel-stencil/src/configs/default-text-tool.config.js +7 -0
  59. package/dist/kritzel-stencil/src/constants/color-palette.constants.js +37 -0
  60. package/dist/kritzel-stencil/src/constants/engine.constants.js +2 -0
  61. package/dist/kritzel-stencil/src/enums/event-button.enum.js +6 -0
  62. package/dist/kritzel-stencil/src/enums/handle-type.enum.js +7 -0
  63. package/dist/kritzel-stencil/src/enums/shape-type.enum.js +6 -0
  64. package/dist/kritzel-stencil/src/helpers/class.helper.js +5 -0
  65. package/dist/kritzel-stencil/src/helpers/color.helper.js +106 -0
  66. package/dist/kritzel-stencil/src/helpers/cursor.helper.js +57 -0
  67. package/dist/kritzel-stencil/src/helpers/devices.helper.js +28 -0
  68. package/dist/kritzel-stencil/src/helpers/event.helper.js +58 -0
  69. package/dist/kritzel-stencil/src/helpers/geometry.helper.js +149 -0
  70. package/dist/kritzel-stencil/src/helpers/keyboard.helper.js +51 -0
  71. package/dist/kritzel-stencil/src/helpers/math.helper.js +5 -0
  72. package/dist/kritzel-stencil/src/helpers/object.helper.js +11 -0
  73. package/dist/kritzel-stencil/src/helpers/theme.helper.js +69 -0
  74. package/dist/kritzel-stencil/src/index.js +41 -0
  75. package/dist/kritzel-stencil/src/interfaces/anchor.interface.js +1 -0
  76. package/dist/kritzel-stencil/src/interfaces/arrow-head.interface.js +1 -0
  77. package/dist/kritzel-stencil/src/interfaces/bounding-box.interface.js +1 -0
  78. package/dist/kritzel-stencil/src/interfaces/clonable.interface.js +1 -0
  79. package/dist/kritzel-stencil/src/interfaces/context-menu-item.interface.js +1 -0
  80. package/dist/kritzel-stencil/src/interfaces/debug-info.interface.js +1 -0
  81. package/dist/kritzel-stencil/src/interfaces/dialog.interface.js +1 -0
  82. package/dist/kritzel-stencil/src/interfaces/displayable-shortcut.interface.js +1 -0
  83. package/dist/kritzel-stencil/src/interfaces/engine-state.interface.js +1 -0
  84. package/dist/kritzel-stencil/src/interfaces/line-options.interface.js +1 -0
  85. package/dist/kritzel-stencil/src/interfaces/master-detail.interface.js +1 -0
  86. package/dist/kritzel-stencil/src/interfaces/menu-item.interface.js +1 -0
  87. package/dist/kritzel-stencil/src/interfaces/object.interface.js +1 -0
  88. package/dist/kritzel-stencil/src/interfaces/path-options.interface.js +1 -0
  89. package/dist/kritzel-stencil/src/interfaces/point.interface.js +1 -0
  90. package/dist/kritzel-stencil/src/interfaces/polygon.interface.js +1 -0
  91. package/dist/kritzel-stencil/src/interfaces/serializable.interface.js +1 -0
  92. package/dist/kritzel-stencil/src/interfaces/settings.interface.js +1 -0
  93. package/dist/kritzel-stencil/src/interfaces/shortcut.interface.js +1 -0
  94. package/dist/kritzel-stencil/src/interfaces/sync-config.interface.js +1 -0
  95. package/dist/kritzel-stencil/src/interfaces/sync-provider.interface.js +1 -0
  96. package/dist/kritzel-stencil/src/interfaces/theme.interface.js +1 -0
  97. package/dist/kritzel-stencil/src/interfaces/tool-config.interface.js +1 -0
  98. package/dist/kritzel-stencil/src/interfaces/tool.interface.js +1 -0
  99. package/dist/kritzel-stencil/src/interfaces/toolbar-control.interface.js +1 -0
  100. package/dist/kritzel-stencil/src/interfaces/undo-state.interface.js +1 -0
  101. package/dist/kritzel-stencil/src/themes/dark-theme.js +198 -0
  102. package/dist/kritzel-stencil/src/themes/light-theme.js +199 -0
  103. package/dist/kritzel-stencil/src/types/shortcut.type.js +1 -0
  104. package/dist/kritzel-stencil/src/types/state.types.js +1 -0
  105. package/dist/types/kritzel-react/lib/components/stencil-generated/components.d.ts +74 -0
  106. package/dist/types/kritzel-react/lib/index.d.ts +2 -0
  107. package/dist/types/kritzel-stencil/src/classes/core/core.class.d.ts +101 -0
  108. package/dist/types/kritzel-stencil/src/classes/core/reviver.class.d.ts +6 -0
  109. package/dist/types/kritzel-stencil/src/classes/core/store.class.d.ts +53 -0
  110. package/dist/types/kritzel-stencil/src/classes/core/viewport.class.d.ts +48 -0
  111. package/dist/types/kritzel-stencil/src/classes/core/workspace.class.d.ts +24 -0
  112. package/dist/types/kritzel-stencil/src/classes/handlers/base.handler.d.ts +5 -0
  113. package/dist/types/kritzel-stencil/src/classes/handlers/context-menu.handler.d.ts +8 -0
  114. package/dist/types/kritzel-stencil/src/classes/handlers/hover.handler.d.ts +6 -0
  115. package/dist/types/kritzel-stencil/src/classes/handlers/key.handler.d.ts +11 -0
  116. package/dist/types/kritzel-stencil/src/classes/handlers/line-handle.handler.d.ts +34 -0
  117. package/dist/types/kritzel-stencil/src/classes/handlers/move.handler.d.ts +29 -0
  118. package/dist/types/kritzel-stencil/src/classes/handlers/resize.handler.d.ts +24 -0
  119. package/dist/types/kritzel-stencil/src/classes/handlers/rotation.handler.d.ts +12 -0
  120. package/dist/types/kritzel-stencil/src/classes/handlers/selection.handler.d.ts +27 -0
  121. package/dist/types/kritzel-stencil/src/classes/managers/anchor.manager.d.ts +180 -0
  122. package/dist/types/kritzel-stencil/src/classes/managers/cursor.manager.d.ts +43 -0
  123. package/dist/types/kritzel-stencil/src/classes/managers/theme.manager.d.ts +56 -0
  124. package/dist/types/kritzel-stencil/src/classes/objects/base-object.class.d.ts +76 -0
  125. package/dist/types/kritzel-stencil/src/classes/objects/custom-element.class.d.ts +26 -0
  126. package/dist/types/kritzel-stencil/src/classes/objects/group.class.d.ts +97 -0
  127. package/dist/types/kritzel-stencil/src/classes/objects/image.class.d.ts +17 -0
  128. package/dist/types/kritzel-stencil/src/classes/objects/line.class.d.ts +101 -0
  129. package/dist/types/kritzel-stencil/src/classes/objects/path.class.d.ts +62 -0
  130. package/dist/types/kritzel-stencil/src/classes/objects/selection-box.class.d.ts +6 -0
  131. package/dist/types/kritzel-stencil/src/classes/objects/selection-group.class.d.ts +67 -0
  132. package/dist/types/kritzel-stencil/src/classes/objects/shape.class.d.ts +124 -0
  133. package/dist/types/kritzel-stencil/src/classes/objects/text.class.d.ts +56 -0
  134. package/dist/types/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.d.ts +18 -0
  135. package/dist/types/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.d.ts +120 -0
  136. package/dist/types/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.d.ts +22 -0
  137. package/dist/types/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.d.ts +52 -0
  138. package/dist/types/kritzel-stencil/src/classes/registries/icon-registry.class.d.ts +9 -0
  139. package/dist/types/kritzel-stencil/src/classes/registries/tool.registry.d.ts +8 -0
  140. package/dist/types/kritzel-stencil/src/classes/structures/app-state-map.structure.d.ts +31 -0
  141. package/dist/types/kritzel-stencil/src/classes/structures/object-map.structure.d.ts +63 -0
  142. package/dist/types/kritzel-stencil/src/classes/structures/quadtree.structure.d.ts +36 -0
  143. package/dist/types/kritzel-stencil/src/classes/tools/base-tool.class.d.ts +20 -0
  144. package/dist/types/kritzel-stencil/src/classes/tools/brush-tool.class.d.ts +14 -0
  145. package/dist/types/kritzel-stencil/src/classes/tools/eraser-tool.class.d.ts +9 -0
  146. package/dist/types/kritzel-stencil/src/classes/tools/image-tool.class.d.ts +15 -0
  147. package/dist/types/kritzel-stencil/src/classes/tools/line-tool.class.d.ts +19 -0
  148. package/dist/types/kritzel-stencil/src/classes/tools/selection-tool.class.d.ts +54 -0
  149. package/dist/types/kritzel-stencil/src/classes/tools/shape-tool.class.d.ts +39 -0
  150. package/dist/types/kritzel-stencil/src/classes/tools/text-tool.class.d.ts +13 -0
  151. package/dist/types/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.d.ts +111 -0
  152. package/dist/types/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.d.ts +11 -0
  153. package/dist/types/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.d.ts +46 -0
  154. package/dist/types/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.d.ts +13 -0
  155. package/dist/types/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.d.ts +21 -0
  156. package/dist/types/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.d.ts +10 -0
  157. package/dist/types/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.d.ts +21 -0
  158. package/dist/types/kritzel-stencil/src/configs/default-brush-tool.config.d.ts +2 -0
  159. package/dist/types/kritzel-stencil/src/configs/default-engine-config.d.ts +2 -0
  160. package/dist/types/kritzel-stencil/src/configs/default-line-tool.config.d.ts +2 -0
  161. package/dist/types/kritzel-stencil/src/configs/default-sync.config.d.ts +5 -0
  162. package/dist/types/kritzel-stencil/src/configs/default-text-tool.config.d.ts +2 -0
  163. package/dist/types/kritzel-stencil/src/constants/color-palette.constants.d.ts +29 -0
  164. package/dist/types/kritzel-stencil/src/constants/engine.constants.d.ts +2 -0
  165. package/dist/types/kritzel-stencil/src/enums/event-button.enum.d.ts +5 -0
  166. package/dist/types/kritzel-stencil/src/enums/handle-type.enum.d.ts +6 -0
  167. package/dist/types/kritzel-stencil/src/enums/shape-type.enum.d.ts +5 -0
  168. package/dist/types/kritzel-stencil/src/helpers/class.helper.d.ts +3 -0
  169. package/dist/types/kritzel-stencil/src/helpers/color.helper.d.ts +33 -0
  170. package/dist/types/kritzel-stencil/src/helpers/cursor.helper.d.ts +22 -0
  171. package/dist/types/kritzel-stencil/src/helpers/devices.helper.d.ts +8 -0
  172. package/dist/types/kritzel-stencil/src/helpers/event.helper.d.ts +6 -0
  173. package/dist/types/kritzel-stencil/src/helpers/geometry.helper.d.ts +38 -0
  174. package/dist/types/kritzel-stencil/src/helpers/keyboard.helper.d.ts +6 -0
  175. package/dist/types/kritzel-stencil/src/helpers/math.helper.d.ts +3 -0
  176. package/dist/types/kritzel-stencil/src/helpers/object.helper.d.ts +4 -0
  177. package/dist/types/kritzel-stencil/src/helpers/theme.helper.d.ts +41 -0
  178. package/dist/types/kritzel-stencil/src/index.d.ts +42 -0
  179. package/dist/types/kritzel-stencil/src/interfaces/anchor.interface.d.ts +137 -0
  180. package/dist/types/kritzel-stencil/src/interfaces/arrow-head.interface.d.ts +27 -0
  181. package/dist/types/kritzel-stencil/src/interfaces/bounding-box.interface.d.ts +8 -0
  182. package/dist/types/kritzel-stencil/src/interfaces/clonable.interface.d.ts +3 -0
  183. package/dist/types/kritzel-stencil/src/interfaces/context-menu-item.interface.d.ts +17 -0
  184. package/dist/types/kritzel-stencil/src/interfaces/debug-info.interface.d.ts +4 -0
  185. package/dist/types/kritzel-stencil/src/interfaces/dialog.interface.d.ts +4 -0
  186. package/dist/types/kritzel-stencil/src/interfaces/displayable-shortcut.interface.d.ts +5 -0
  187. package/dist/types/kritzel-stencil/src/interfaces/engine-state.interface.d.ts +73 -0
  188. package/dist/types/kritzel-stencil/src/interfaces/line-options.interface.d.ts +23 -0
  189. package/dist/types/kritzel-stencil/src/interfaces/master-detail.interface.d.ts +14 -0
  190. package/dist/types/kritzel-stencil/src/interfaces/menu-item.interface.d.ts +24 -0
  191. package/dist/types/kritzel-stencil/src/interfaces/object.interface.d.ts +53 -0
  192. package/dist/types/kritzel-stencil/src/interfaces/path-options.interface.d.ts +11 -0
  193. package/dist/types/kritzel-stencil/src/interfaces/point.interface.d.ts +4 -0
  194. package/dist/types/kritzel-stencil/src/interfaces/polygon.interface.d.ts +7 -0
  195. package/dist/types/kritzel-stencil/src/interfaces/serializable.interface.d.ts +5 -0
  196. package/dist/types/kritzel-stencil/src/interfaces/settings.interface.d.ts +11 -0
  197. package/dist/types/kritzel-stencil/src/interfaces/shortcut.interface.d.ts +10 -0
  198. package/dist/types/kritzel-stencil/src/interfaces/sync-config.interface.d.ts +22 -0
  199. package/dist/types/kritzel-stencil/src/interfaces/sync-provider.interface.d.ts +29 -0
  200. package/dist/types/kritzel-stencil/src/interfaces/theme.interface.d.ts +330 -0
  201. package/dist/types/kritzel-stencil/src/interfaces/tool-config.interface.d.ts +26 -0
  202. package/dist/types/kritzel-stencil/src/interfaces/tool.interface.d.ts +7 -0
  203. package/dist/types/kritzel-stencil/src/interfaces/toolbar-control.interface.d.ts +58 -0
  204. package/dist/types/kritzel-stencil/src/interfaces/undo-state.interface.d.ts +6 -0
  205. package/dist/types/kritzel-stencil/src/themes/dark-theme.d.ts +5 -0
  206. package/dist/types/kritzel-stencil/src/themes/light-theme.d.ts +5 -0
  207. package/dist/types/kritzel-stencil/src/types/shortcut.type.d.ts +1 -0
  208. package/dist/types/kritzel-stencil/src/types/state.types.d.ts +3 -0
  209. package/package.json +2 -2
@@ -0,0 +1,429 @@
1
+ import { KritzelEventHelper } from '../../helpers/event.helper';
2
+ import { KritzelColorHelper } from '../../helpers/color.helper';
3
+ import { KritzelMoveHandler } from '../handlers/move.handler';
4
+ import { KritzelResizeHandler } from '../handlers/resize.handler';
5
+ import { KritzelRotationHandler } from '../handlers/rotation.handler';
6
+ import { KritzelSelectionHandler } from '../handlers/selection.handler';
7
+ import { KritzelSelectionGroup } from '../objects/selection-group.class';
8
+ import { KritzelGroup } from '../objects/group.class';
9
+ import { KritzelBaseTool } from './base-tool.class';
10
+ import { KritzelHoverHandler } from '../handlers/hover.handler';
11
+ import { KritzelLineHandleHandler } from '../handlers/line-handle.handler';
12
+ import { KritzelPath } from '../objects/path.class';
13
+ import { KritzelLine } from '../objects/line.class';
14
+ import { KritzelShape } from '../objects/shape.class';
15
+ import { KritzelText } from '../objects/text.class';
16
+ import { KritzelImage } from '../objects/image.class';
17
+ import { DEFAULT_COLOR_PALETTE } from '../../constants/color-palette.constants';
18
+ export class KritzelSelectionTool extends KritzelBaseTool {
19
+ /** Returns true if there are objects in the selection group */
20
+ hasSelection() {
21
+ return !!this._core.store.selectionGroup && this._core.store.selectionGroup.objects.length > 0;
22
+ }
23
+ /** Returns the selected objects or empty array */
24
+ getSelectedObjects() {
25
+ var _a, _b;
26
+ return (_b = (_a = this._core.store.selectionGroup) === null || _a === void 0 ? void 0 : _a.objects) !== null && _b !== void 0 ? _b : [];
27
+ }
28
+ flattenObjects(objects) {
29
+ let result = [];
30
+ for (const obj of objects) {
31
+ if (obj instanceof KritzelGroup) {
32
+ result = result.concat(this.flattenObjects(obj.children));
33
+ }
34
+ else {
35
+ result.push(obj);
36
+ }
37
+ }
38
+ return result;
39
+ }
40
+ get color() {
41
+ const objects = this.flattenObjects(this.getSelectedObjects());
42
+ if (objects.length === 0)
43
+ return DEFAULT_COLOR_PALETTE[0];
44
+ for (const obj of objects) {
45
+ if (obj instanceof KritzelPath)
46
+ return obj.fill;
47
+ if (obj instanceof KritzelLine)
48
+ return obj.stroke;
49
+ if (obj instanceof KritzelText)
50
+ return obj.fontColor;
51
+ if (obj instanceof KritzelShape)
52
+ return obj.strokeColor;
53
+ }
54
+ return DEFAULT_COLOR_PALETTE[0];
55
+ }
56
+ set color(value) {
57
+ const objects = this.flattenObjects(this.getSelectedObjects());
58
+ objects.forEach(obj => {
59
+ if (obj instanceof KritzelPath)
60
+ this._core.updateObject(obj, { fill: value });
61
+ if (obj instanceof KritzelLine)
62
+ this._core.updateObject(obj, { stroke: value });
63
+ if (obj instanceof KritzelText)
64
+ this._core.updateObject(obj, { fontColor: value });
65
+ if (obj instanceof KritzelShape)
66
+ this._core.updateObject(obj, { strokeColor: value });
67
+ });
68
+ this._core.rerender();
69
+ }
70
+ get opacity() {
71
+ const objects = this.flattenObjects(this.getSelectedObjects());
72
+ if (objects.length === 0)
73
+ return 1;
74
+ return objects[0].opacity;
75
+ }
76
+ set opacity(value) {
77
+ const objects = this.flattenObjects(this.getSelectedObjects());
78
+ objects.forEach(obj => this._core.updateObject(obj, { opacity: value }));
79
+ this._core.rerender();
80
+ }
81
+ get size() {
82
+ const objects = this.flattenObjects(this.getSelectedObjects());
83
+ if (objects.length === 0)
84
+ return 1;
85
+ for (const obj of objects) {
86
+ if (obj instanceof KritzelPath)
87
+ return obj.strokeWidth;
88
+ if (obj instanceof KritzelLine)
89
+ return obj.strokeWidth;
90
+ if (obj instanceof KritzelText)
91
+ return obj.fontSize;
92
+ if (obj instanceof KritzelShape)
93
+ return obj.strokeWidth;
94
+ }
95
+ return 1;
96
+ }
97
+ set size(value) {
98
+ const objects = this.flattenObjects(this.getSelectedObjects());
99
+ objects.forEach(obj => {
100
+ if (obj instanceof KritzelPath)
101
+ this._core.updateObject(obj, { strokeWidth: value });
102
+ if (obj instanceof KritzelLine)
103
+ this._core.updateObject(obj, { strokeWidth: value });
104
+ if (obj instanceof KritzelText)
105
+ this._core.updateObject(obj, { fontSize: value });
106
+ if (obj instanceof KritzelShape)
107
+ this._core.updateObject(obj, { strokeWidth: value });
108
+ });
109
+ this._core.rerender();
110
+ this.refreshSelectionGroupDimensions();
111
+ }
112
+ get fillColor() {
113
+ const objects = this.flattenObjects(this.getSelectedObjects());
114
+ for (const obj of objects) {
115
+ if (obj instanceof KritzelShape)
116
+ return obj.fillColor;
117
+ }
118
+ return { light: 'transparent', dark: 'transparent' };
119
+ }
120
+ set fillColor(value) {
121
+ const objects = this.flattenObjects(this.getSelectedObjects());
122
+ objects.forEach(obj => {
123
+ if (obj instanceof KritzelShape) {
124
+ // Calculate new font color based on fill color
125
+ const newFontColor = KritzelColorHelper.determineTextColor(value);
126
+ this._core.updateObject(obj, { fillColor: value, fontColor: newFontColor });
127
+ // When switching to fill mode, also update stroke color to match
128
+ const isTransparent = typeof value === 'string' ? value === 'transparent' :
129
+ (value.light === 'transparent' && value.dark === 'transparent');
130
+ if (!isTransparent) {
131
+ this._core.updateObject(obj, { strokeColor: value });
132
+ }
133
+ }
134
+ });
135
+ this._core.rerender();
136
+ }
137
+ get fontFamily() {
138
+ const objects = this.flattenObjects(this.getSelectedObjects());
139
+ for (const obj of objects) {
140
+ if (obj instanceof KritzelText)
141
+ return obj.fontFamily;
142
+ if (obj instanceof KritzelShape)
143
+ return obj.fontFamily;
144
+ }
145
+ return 'Arial';
146
+ }
147
+ set fontFamily(value) {
148
+ const objects = this.flattenObjects(this.getSelectedObjects());
149
+ objects.forEach(obj => {
150
+ if (obj instanceof KritzelText)
151
+ this._core.updateObject(obj, { fontFamily: value });
152
+ if (obj instanceof KritzelShape)
153
+ this._core.updateObject(obj, { fontFamily: value });
154
+ });
155
+ this._core.rerender();
156
+ this.refreshSelectionGroupDimensions();
157
+ }
158
+ get arrows() {
159
+ const objects = this.flattenObjects(this.getSelectedObjects());
160
+ for (const obj of objects) {
161
+ if (obj instanceof KritzelLine)
162
+ return obj.arrows;
163
+ }
164
+ return { start: { enabled: false }, end: { enabled: false } };
165
+ }
166
+ set arrows(value) {
167
+ const objects = this.flattenObjects(this.getSelectedObjects());
168
+ objects.forEach(obj => {
169
+ if (obj instanceof KritzelLine)
170
+ this._core.updateObject(obj, { arrows: value });
171
+ });
172
+ this._core.rerender();
173
+ this.refreshSelectionGroupDimensions();
174
+ }
175
+ /** Returns the tool config for selected objects, or null if no selection */
176
+ getToolConfig() {
177
+ if (!this.hasSelection())
178
+ return null;
179
+ const objects = this.flattenObjects(this.getSelectedObjects());
180
+ const controls = [];
181
+ const hasShape = objects.some(o => o instanceof KritzelShape);
182
+ const hasText = objects.some(o => o instanceof KritzelText);
183
+ const hasLine = objects.some(o => o instanceof KritzelLine);
184
+ const hasImage = objects.some(o => o instanceof KritzelImage);
185
+ const hasStroke = objects.some(o => o instanceof KritzelPath || o instanceof KritzelLine || o instanceof KritzelShape);
186
+ // If only images are selected, return config with opacity only (no palette, no controls)
187
+ if (hasImage && !hasShape && !hasText && !hasLine && !hasStroke) {
188
+ return {
189
+ type: 'selection',
190
+ colorProperty: 'color',
191
+ sizeProperty: 'size',
192
+ opacityProperty: 'opacity',
193
+ paletteSource: 'none',
194
+ controls: [],
195
+ };
196
+ }
197
+ if (hasText && !hasStroke) {
198
+ controls.push({ type: 'font-size', propertyName: 'size' });
199
+ controls.push({ type: 'font-family', propertyName: 'fontFamily' });
200
+ }
201
+ else if (hasStroke && !hasText) {
202
+ controls.push({ type: 'stroke-size', propertyName: 'size' });
203
+ }
204
+ else {
205
+ if (hasStroke)
206
+ controls.push({ type: 'stroke-size', propertyName: 'size' });
207
+ if (hasText)
208
+ controls.push({ type: 'font-family', propertyName: 'fontFamily' });
209
+ }
210
+ if (hasLine) {
211
+ controls.push({ type: 'line-endings', propertyName: 'arrows' });
212
+ }
213
+ if (hasShape) {
214
+ controls.push({ type: 'shape-fill', propertyName: 'fillColor' });
215
+ }
216
+ return {
217
+ type: 'selection',
218
+ colorProperty: 'color',
219
+ sizeProperty: 'size',
220
+ opacityProperty: 'opacity',
221
+ paletteSource: 'palette',
222
+ controls,
223
+ };
224
+ }
225
+ /**
226
+ * Refreshes the selection group's dimensions after object properties that affect size have changed.
227
+ * Uses requestAnimationFrame to ensure the DOM has been updated before measuring.
228
+ */
229
+ refreshSelectionGroupDimensions() {
230
+ const selectionGroup = this._core.store.selectionGroup;
231
+ if (selectionGroup) {
232
+ requestAnimationFrame(() => {
233
+ requestAnimationFrame(() => {
234
+ selectionGroup.refreshObjectDimensions();
235
+ this._core.rerender();
236
+ });
237
+ });
238
+ }
239
+ }
240
+ constructor(core) {
241
+ super(core);
242
+ this.palette = [...DEFAULT_COLOR_PALETTE];
243
+ this.selectionHandler = new KritzelSelectionHandler(this._core);
244
+ this.moveHandler = new KritzelMoveHandler(this._core);
245
+ this.hoverHandler = new KritzelHoverHandler(this._core);
246
+ this.resizeHandler = new KritzelResizeHandler(this._core);
247
+ this.rotationHandler = new KritzelRotationHandler(this._core);
248
+ this.lineHandleHandler = new KritzelLineHandleHandler(this._core);
249
+ }
250
+ handlePointerDown(event) {
251
+ if (event.cancelable) {
252
+ event.preventDefault();
253
+ }
254
+ if (event.pointerType === 'mouse') {
255
+ if (KritzelEventHelper.isLeftClick(event)) {
256
+ this._core.store.state.isResizeHandleSelected = this.isHandleSelected(event);
257
+ this._core.store.state.isRotationHandleSelected = this.isRotationHandleSelected(event);
258
+ this._core.store.state.isLineHandleSelected = this.isLineHandleSelected(event);
259
+ this._core.store.state.resizeHandleType = this.getHandleType(event);
260
+ this._core.store.state.lineHandleType = this.getLineHandleType(event);
261
+ const selectedObject = this.getSelectedObject(event);
262
+ const selectionGroup = this._core.store.selectionGroup;
263
+ const isDifferentObject = selectedObject && selectionGroup && selectedObject.id !== selectionGroup.id;
264
+ if ((selectedObject === null || isDifferentObject) &&
265
+ selectionGroup &&
266
+ !this._core.store.state.isResizeHandleSelected &&
267
+ !this._core.store.state.isRotationHandleSelected &&
268
+ !this._core.store.state.isLineHandleSelected) {
269
+ this._core.removeSelectionGroup();
270
+ this._core.rerender();
271
+ }
272
+ if (selectedObject && selectedObject.isSelected === false && (selectedObject === null || selectedObject === void 0 ? void 0 : selectedObject.objects.length) === 1 && selectedObject.objects[0].isInteractive) {
273
+ return;
274
+ }
275
+ }
276
+ this.lineHandleHandler.handlePointerDown(event);
277
+ this.moveHandler.handlePointerDown(event);
278
+ this.selectionHandler.handlePointerDown(event);
279
+ this.resizeHandler.handlePointerDown(event);
280
+ this.rotationHandler.handlePointerDown(event);
281
+ this._core.rerender();
282
+ }
283
+ if (event.pointerType === 'touch' || event.pointerType === 'pen') {
284
+ if (this._core.store.state.isScaling === true) {
285
+ return;
286
+ }
287
+ if (this._core.store.state.pointers.size === 1) {
288
+ this._core.store.state.isResizeHandleSelected = this.isHandleSelected(event);
289
+ this._core.store.state.isRotationHandleSelected = this.isRotationHandleSelected(event);
290
+ this._core.store.state.isLineHandleSelected = this.isLineHandleSelected(event);
291
+ this._core.store.state.resizeHandleType = this.getHandleType(event);
292
+ this._core.store.state.lineHandleType = this.getLineHandleType(event);
293
+ const selectedObject = this.getSelectedObject(event);
294
+ const selectionGroup = this._core.store.selectionGroup;
295
+ const isDifferentObject = selectedObject && selectionGroup && selectedObject.id !== selectionGroup.id;
296
+ if (!selectionGroup && selectedObject) {
297
+ this._core.store.state.skipContextMenu = true;
298
+ }
299
+ if ((selectedObject === null || isDifferentObject) &&
300
+ selectionGroup &&
301
+ !this._core.store.state.isResizeHandleSelected &&
302
+ !this._core.store.state.isRotationHandleSelected &&
303
+ !this._core.store.state.isLineHandleSelected) {
304
+ this._core.removeSelectionGroup();
305
+ this._core.rerender();
306
+ }
307
+ }
308
+ this.lineHandleHandler.handlePointerDown(event);
309
+ this.rotationHandler.handlePointerDown(event);
310
+ this.resizeHandler.handlePointerDown(event);
311
+ this.moveHandler.handlePointerDown(event);
312
+ this.selectionHandler.handlePointerDown(event);
313
+ this._core.rerender();
314
+ }
315
+ }
316
+ handlePointerMove(event) {
317
+ if (event.cancelable) {
318
+ event.preventDefault();
319
+ }
320
+ if (event.pointerType === 'mouse') {
321
+ this.lineHandleHandler.handlePointerMove(event);
322
+ this.moveHandler.handlePointerMove(event);
323
+ this.hoverHandler.handlePointerMove(event);
324
+ this.selectionHandler.handlePointerMove(event);
325
+ this.resizeHandler.handlePointerMove(event);
326
+ this.rotationHandler.handlePointerMove(event);
327
+ this._core.rerender();
328
+ }
329
+ if (event.pointerType === 'touch' || event.pointerType === 'pen') {
330
+ if (this._core.store.state.isScaling === true) {
331
+ return;
332
+ }
333
+ this.lineHandleHandler.handlePointerMove(event);
334
+ this.rotationHandler.handlePointerMove(event);
335
+ this.resizeHandler.handlePointerMove(event);
336
+ this.moveHandler.handlePointerMove(event);
337
+ this.selectionHandler.handlePointerMove(event);
338
+ this._core.rerender();
339
+ }
340
+ }
341
+ handlePointerUp(event) {
342
+ if (event.cancelable) {
343
+ event.preventDefault();
344
+ }
345
+ if (event.pointerType === 'mouse') {
346
+ this.lineHandleHandler.handlePointerUp(event);
347
+ this.moveHandler.handlePointerUp(event);
348
+ this.resizeHandler.handlePointerUp(event);
349
+ this.rotationHandler.handlePointerUp(event);
350
+ this.selectionHandler.handlePointerUp(event);
351
+ this._core.rerender();
352
+ }
353
+ if (event.pointerType === 'touch' || event.pointerType === 'pen') {
354
+ if (this._core.store.state.isScaling === true) {
355
+ return;
356
+ }
357
+ this.lineHandleHandler.handlePointerUp(event);
358
+ this.rotationHandler.handlePointerUp(event);
359
+ this.resizeHandler.handlePointerUp(event);
360
+ this.moveHandler.handlePointerUp(event);
361
+ this.selectionHandler.handlePointerUp(event);
362
+ this._core.rerender();
363
+ }
364
+ }
365
+ getSelectedObject(event) {
366
+ const path = event.composedPath().slice(1);
367
+ const objectElement = path.find(element => element.classList && element.classList.contains('object'));
368
+ const object = this._core.findObjectById(objectElement === null || objectElement === void 0 ? void 0 : objectElement.id);
369
+ if (!object) {
370
+ return null;
371
+ }
372
+ const { x, y } = this._core.getCanvasPoint(event);
373
+ if (!object.hitTest(x, y)) {
374
+ return null;
375
+ }
376
+ if (object instanceof KritzelSelectionGroup) {
377
+ return object;
378
+ }
379
+ else {
380
+ const group = KritzelSelectionGroup.create(this._core);
381
+ group.translateX = 0;
382
+ group.translateY = 0;
383
+ group.addOrRemove(object);
384
+ return group;
385
+ }
386
+ }
387
+ getHandleType(event) {
388
+ var _a;
389
+ const shadowRoot = (_a = this._core.store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
390
+ if (!shadowRoot)
391
+ return;
392
+ const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
393
+ const handle = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));
394
+ return handle === null || handle === void 0 ? void 0 : handle.classList[1];
395
+ }
396
+ isHandleSelected(event) {
397
+ var _a;
398
+ const shadowRoot = (_a = this._core.store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
399
+ if (!shadowRoot)
400
+ return false;
401
+ const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
402
+ return elementsAtPoint.some(el => el.classList.contains('resize-handle-overlay'));
403
+ }
404
+ isRotationHandleSelected(event) {
405
+ var _a;
406
+ const shadowRoot = (_a = this._core.store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
407
+ if (!shadowRoot)
408
+ return false;
409
+ const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
410
+ return elementsAtPoint.some(el => el.classList.contains('rotation-handle-overlay'));
411
+ }
412
+ isLineHandleSelected(event) {
413
+ var _a;
414
+ const shadowRoot = (_a = this._core.store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
415
+ if (!shadowRoot)
416
+ return false;
417
+ const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
418
+ return elementsAtPoint.some(el => el.classList.contains('selection-line-handle-overlay'));
419
+ }
420
+ getLineHandleType(event) {
421
+ var _a;
422
+ const shadowRoot = (_a = this._core.store.state.host) === null || _a === void 0 ? void 0 : _a.shadowRoot;
423
+ if (!shadowRoot)
424
+ return;
425
+ const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);
426
+ const handle = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));
427
+ return handle === null || handle === void 0 ? void 0 : handle.classList[1];
428
+ }
429
+ }
@@ -0,0 +1,196 @@
1
+ import { KritzelShape } from '../objects/shape.class';
2
+ import { KritzelBaseTool } from './base-tool.class';
3
+ import { KritzelEventHelper } from '../../helpers/event.helper';
4
+ import { KritzelToolRegistry } from '../registries/tool.registry';
5
+ import { ShapeType } from '../../enums/shape-type.enum';
6
+ import { DEFAULT_COLOR_PALETTE } from '../../constants/color-palette.constants';
7
+ export class KritzelShapeTool extends KritzelBaseTool {
8
+ constructor(core) {
9
+ super(core);
10
+ this.shapeType = ShapeType.Rectangle;
11
+ this.fillColor = { light: 'transparent', dark: 'transparent' };
12
+ this.strokeColor = DEFAULT_COLOR_PALETTE[0];
13
+ this.strokeWidth = 4;
14
+ this.opacity = 1;
15
+ this.fontFamily = 'Arial';
16
+ this.fontSize = 16;
17
+ this.fontColor = DEFAULT_COLOR_PALETTE[0];
18
+ this.palette = [...DEFAULT_COLOR_PALETTE];
19
+ this.startX = 0;
20
+ this.startY = 0;
21
+ this.isDrawing = false;
22
+ this.currentShape = null;
23
+ }
24
+ handlePointerDown(event) {
25
+ if (event.cancelable) {
26
+ event.preventDefault();
27
+ }
28
+ if (event.pointerType === 'mouse') {
29
+ const path = event.composedPath().slice(1);
30
+ const objectElement = path.find(element => element.classList && element.classList.contains('object'));
31
+ const object = this._core.findObjectById(objectElement === null || objectElement === void 0 ? void 0 : objectElement.id);
32
+ const activeShape = this._core.store.activeShape;
33
+ if (activeShape === null && object instanceof KritzelShape) {
34
+ object.edit(event);
35
+ return;
36
+ }
37
+ if (activeShape !== null && object instanceof KritzelShape) {
38
+ activeShape.save();
39
+ object.edit(event);
40
+ return;
41
+ }
42
+ if (activeShape !== null && object instanceof KritzelShape === false) {
43
+ this._core.resetActiveShape();
44
+ this._core.store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
45
+ return;
46
+ }
47
+ if (KritzelEventHelper.isLeftClick(event) === false) {
48
+ return;
49
+ }
50
+ this.startDrawing(event.clientX, event.clientY);
51
+ }
52
+ if (event.pointerType === 'touch' || event.pointerType === 'pen') {
53
+ const activePointers = Array.from(this._core.store.state.pointers.values());
54
+ const path = event.composedPath().slice(1);
55
+ const objectElement = path.find(element => element.classList && element.classList.contains('object'));
56
+ const object = this._core.findObjectById(objectElement === null || objectElement === void 0 ? void 0 : objectElement.id);
57
+ const activeShape = this._core.store.activeShape;
58
+ if (activeShape === null && object instanceof KritzelShape) {
59
+ object.edit(event);
60
+ return;
61
+ }
62
+ if (activeShape !== null && object instanceof KritzelShape) {
63
+ activeShape.save();
64
+ object.edit(event);
65
+ return;
66
+ }
67
+ if (activeShape !== null && object instanceof KritzelShape === false) {
68
+ this._core.resetActiveShape();
69
+ this._core.store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
70
+ return;
71
+ }
72
+ if (activePointers.length > 1) {
73
+ return;
74
+ }
75
+ const clientX = Math.round(activePointers[0].clientX);
76
+ const clientY = Math.round(activePointers[0].clientY);
77
+ this.startDrawing(clientX, clientY);
78
+ }
79
+ }
80
+ handlePointerMove(event) {
81
+ if (event.cancelable) {
82
+ event.preventDefault();
83
+ }
84
+ if (!this.isDrawing || !this.currentShape) {
85
+ return;
86
+ }
87
+ if (event.pointerType === 'mouse') {
88
+ this.updateShapeSize(event.clientX, event.clientY);
89
+ }
90
+ if (event.pointerType === 'touch' || event.pointerType === 'pen') {
91
+ const activePointers = Array.from(this._core.store.state.pointers.values());
92
+ if (activePointers.length === 1) {
93
+ const clientX = Math.round(activePointers[0].clientX);
94
+ const clientY = Math.round(activePointers[0].clientY);
95
+ this.updateShapeSize(clientX, clientY);
96
+ }
97
+ }
98
+ }
99
+ handlePointerUp(event) {
100
+ if (event.cancelable) {
101
+ event.preventDefault();
102
+ }
103
+ if (!this.isDrawing || !this.currentShape) {
104
+ return;
105
+ }
106
+ this.finishDrawing();
107
+ }
108
+ /**
109
+ * Start drawing a shape. Following the same pattern as LineTool/BrushTool:
110
+ * - Store screen coordinates for startX, startY
111
+ * - Set translateX/Y to -viewportTranslateX/Y (viewport offset)
112
+ * - Set x, y to the actual screen position
113
+ * - Let updateDimensions() convert to world coordinates
114
+ */
115
+ startDrawing(clientX, clientY) {
116
+ // Store screen coordinates (relative to host element)
117
+ const viewportScale = this._core.store.state.scale;
118
+ const lockScale = this._core.store.state.lockDrawingScale;
119
+ const divider = lockScale ? viewportScale : 1;
120
+ this.startX = (clientX - this._core.store.offsetX) / divider;
121
+ this.startY = (clientY - this._core.store.offsetY) / divider;
122
+ this.isDrawing = true;
123
+ // Create shape using screen coordinates, following Path/Line pattern
124
+ this.currentShape = KritzelShape.create(this._core, {
125
+ x: this.startX,
126
+ y: this.startY,
127
+ translateX: -this._core.store.state.translateX / divider,
128
+ translateY: -this._core.store.state.translateY / divider,
129
+ width: 1,
130
+ height: 1,
131
+ shapeType: this.shapeType,
132
+ fillColor: this.fillColor,
133
+ strokeColor: this.strokeColor,
134
+ strokeWidth: this.strokeWidth,
135
+ opacity: this.opacity,
136
+ fontSize: this.fontSize,
137
+ fontFamily: this.fontFamily,
138
+ scale: lockScale ? 1 : viewportScale,
139
+ });
140
+ this._core.store.state.objects.insert(this.currentShape);
141
+ this._core.rerender();
142
+ }
143
+ /**
144
+ * Update shape size during drawing. Following the same pattern as LineTool:
145
+ * - Use screen coordinates directly
146
+ * - The shape's x, y, width, height are all in screen space
147
+ * - updateDimensions() handles conversion to world coordinates
148
+ */
149
+ updateShapeSize(clientX, clientY) {
150
+ if (!this.currentShape) {
151
+ return;
152
+ }
153
+ const viewportScale = this._core.store.state.scale;
154
+ const lockScale = this._core.store.state.lockDrawingScale;
155
+ const divider = lockScale ? viewportScale : 1;
156
+ const currentX = (clientX - this._core.store.offsetX) / divider;
157
+ const currentY = (clientY - this._core.store.offsetY) / divider;
158
+ // Calculate bounding box in screen coordinates
159
+ const minX = Math.min(this.startX, currentX);
160
+ const minY = Math.min(this.startY, currentY);
161
+ const width = Math.abs(currentX - this.startX);
162
+ const height = Math.abs(currentY - this.startY);
163
+ // Update shape with screen coordinates
164
+ this.currentShape.x = minX;
165
+ this.currentShape.y = minY;
166
+ this.currentShape.width = Math.max(1, width);
167
+ this.currentShape.height = Math.max(1, height);
168
+ // Recalculate world-space translateX/Y
169
+ // Reset translateX/Y to initial value before updateDimensions
170
+ this.currentShape.translateX = -this._core.store.state.translateX / divider;
171
+ this.currentShape.translateY = -this._core.store.state.translateY / divider;
172
+ this.currentShape.updateDimensions();
173
+ this._core.store.state.objects.update(this.currentShape);
174
+ }
175
+ finishDrawing() {
176
+ if (!this.currentShape) {
177
+ return;
178
+ }
179
+ // Remove shape if it's too small (likely an accidental click)
180
+ // Compare in screen space
181
+ if (this.currentShape.width < 10 && this.currentShape.height < 10) {
182
+ const shapeId = this.currentShape.id;
183
+ this._core.store.state.objects.remove(o => o.id === shapeId);
184
+ }
185
+ else {
186
+ this.currentShape.zIndex = this._core.store.currentZIndex;
187
+ this._core.store.state.objects.update(this.currentShape);
188
+ this._core.engine.emitObjectsChange();
189
+ this._core.selectObjects([this.currentShape]);
190
+ this._core.store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
191
+ }
192
+ this.isDrawing = false;
193
+ this.currentShape = null;
194
+ this._core.rerender();
195
+ }
196
+ }