kritzel-stencil 0.0.139 → 0.0.141

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 (213) hide show
  1. package/dist/cjs/index-BKstgWru.js +16981 -0
  2. package/dist/cjs/index-BKstgWru.js.map +1 -0
  3. package/dist/cjs/{index-nzUNdMPh.js → index-DcTwXs_q.js} +47 -22
  4. package/dist/cjs/index-DcTwXs_q.js.map +1 -0
  5. package/dist/cjs/index.cjs.js +1 -1
  6. package/dist/cjs/kritzel-brush-style.cjs.entry.js +1 -1
  7. package/dist/cjs/kritzel-color_22.cjs.entry.js +205 -157
  8. package/dist/cjs/loader.cjs.js +2 -2
  9. package/dist/cjs/stencil.cjs.js +3 -3
  10. package/dist/cjs/stencil.cjs.js.map +1 -1
  11. package/dist/collection/classes/commands/add-selection-group.command.js +4 -4
  12. package/dist/collection/classes/commands/add-selection-group.command.js.map +1 -1
  13. package/dist/collection/classes/commands/move-selection-group.command.js +2 -2
  14. package/dist/collection/classes/commands/move-selection-group.command.js.map +1 -1
  15. package/dist/collection/classes/commands/remove-selection-group.command.js +2 -2
  16. package/dist/collection/classes/commands/remove-selection-group.command.js.map +1 -1
  17. package/dist/collection/classes/commands/resize-selection-group.command.js +2 -2
  18. package/dist/collection/classes/commands/resize-selection-group.command.js.map +1 -1
  19. package/dist/collection/classes/commands/rotate-selection-group.command.js +2 -2
  20. package/dist/collection/classes/commands/rotate-selection-group.command.js.map +1 -1
  21. package/dist/collection/classes/commands/update-viewport.command.js +6 -6
  22. package/dist/collection/classes/commands/update-viewport.command.js.map +1 -1
  23. package/dist/collection/classes/core/core.class.js +52 -29
  24. package/dist/collection/classes/core/core.class.js.map +1 -1
  25. package/dist/collection/classes/core/history.class.js +3 -3
  26. package/dist/collection/classes/core/history.class.js.map +1 -1
  27. package/dist/collection/classes/core/store.class.js +4 -1
  28. package/dist/collection/classes/core/store.class.js.map +1 -1
  29. package/dist/collection/classes/core/viewport.class.js +63 -44
  30. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  31. package/dist/collection/classes/handlers/context-menu.handler.js +16 -8
  32. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
  33. package/dist/collection/classes/handlers/key.handler.js +4 -4
  34. package/dist/collection/classes/handlers/key.handler.js.map +1 -1
  35. package/dist/collection/classes/handlers/move.handler.js +30 -8
  36. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  37. package/dist/collection/classes/handlers/resize.handler.js +6 -6
  38. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  39. package/dist/collection/classes/handlers/rotation.handler.js +6 -6
  40. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  41. package/dist/collection/classes/handlers/selection.handler.js +56 -28
  42. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  43. package/dist/collection/classes/objects/base-object.class.js +9 -3
  44. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  45. package/dist/collection/classes/objects/selection-group.class.js +3 -1
  46. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  47. package/dist/collection/classes/objects/text.class.js +123 -75
  48. package/dist/collection/classes/objects/text.class.js.map +1 -1
  49. package/dist/collection/classes/tools/brush-tool.class.js +16 -16
  50. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  51. package/dist/collection/classes/tools/eraser-tool.class.js +4 -4
  52. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  53. package/dist/collection/classes/tools/selection-tool.class.js +7 -7
  54. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  55. package/dist/collection/classes/tools/text-tool.class.js +8 -10
  56. package/dist/collection/classes/tools/text-tool.class.js.map +1 -1
  57. package/dist/collection/collection-manifest.json +2 -2
  58. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -2
  59. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js.map +1 -1
  60. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +5 -9
  61. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  62. package/dist/collection/components/core/kritzel-engine/kritzel-engine.css +21 -8
  63. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +30 -38
  64. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  65. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js +1 -2
  66. package/dist/collection/components/shared/kritzel-brush-style/kritzel-brush-style.js.map +1 -1
  67. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +5 -5
  68. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +4 -5
  69. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js.map +1 -1
  70. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js +5 -6
  71. package/dist/collection/components/shared/kritzel-dropdown/kritzel-dropdown.js.map +1 -1
  72. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +4 -4
  73. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +3 -4
  74. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js.map +1 -1
  75. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +3 -4
  76. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js.map +1 -1
  77. package/dist/collection/components/shared/kritzel-icon/kritzel-icon.js +5 -5
  78. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -3
  79. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js.map +1 -1
  80. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -4
  81. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js.map +1 -1
  82. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +6 -7
  83. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js.map +1 -1
  84. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +5 -6
  85. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js.map +1 -1
  86. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +2 -3
  87. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js.map +1 -1
  88. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +7 -8
  89. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js.map +1 -1
  90. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -3
  91. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js.map +1 -1
  92. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +3 -4
  93. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js.map +1 -1
  94. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +3 -4
  95. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js.map +1 -1
  96. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +4 -6
  97. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +1 -1
  98. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  99. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +1 -3
  100. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js.map +1 -1
  101. package/dist/components/index.js +3 -3
  102. package/dist/components/kritzel-brush-style.js +4 -4
  103. package/dist/components/kritzel-color-palette.js +1 -1
  104. package/dist/components/kritzel-color.js +1 -1
  105. package/dist/components/kritzel-context-menu.js +1 -1
  106. package/dist/components/kritzel-control-brush-config.js +1 -1
  107. package/dist/components/kritzel-control-text-config.js +1 -1
  108. package/dist/components/kritzel-controls.js +1 -1
  109. package/dist/components/kritzel-cursor-trail.js +1 -1
  110. package/dist/components/kritzel-dropdown.js +1 -1
  111. package/dist/components/kritzel-editor.js +26 -26
  112. package/dist/components/kritzel-engine.js +1 -1
  113. package/dist/components/kritzel-font-family.js +1 -1
  114. package/dist/components/kritzel-font-size.js +1 -1
  115. package/dist/components/kritzel-font.js +1 -1
  116. package/dist/components/kritzel-icon.js +1 -1
  117. package/dist/components/kritzel-menu-item.js +1 -1
  118. package/dist/components/kritzel-menu.js +1 -1
  119. package/dist/components/kritzel-portal.js +1 -1
  120. package/dist/components/kritzel-split-button.js +1 -1
  121. package/dist/components/kritzel-stroke-size.js +1 -1
  122. package/dist/components/kritzel-tooltip.js +1 -1
  123. package/dist/components/kritzel-utility-panel.js +1 -1
  124. package/dist/components/kritzel-workspace-manager.js +1 -1
  125. package/dist/components/{p-BlPlPpUy.js → p-BEKicPnH.js} +4 -4
  126. package/dist/components/{p-BlPlPpUy.js.map → p-BEKicPnH.js.map} +1 -1
  127. package/dist/components/{p-DCx3703u.js → p-BFNwskCY.js} +5 -5
  128. package/dist/components/{p-DCx3703u.js.map → p-BFNwskCY.js.map} +1 -1
  129. package/dist/components/{p-BorT6g39.js → p-BJbN3vca.js} +7 -7
  130. package/dist/components/{p-BorT6g39.js.map → p-BJbN3vca.js.map} +1 -1
  131. package/dist/components/p-BuDVaqTF.js +15302 -0
  132. package/dist/components/p-BuDVaqTF.js.map +1 -0
  133. package/dist/components/{p-Db3kxVe2.js → p-ByAzDzS5.js} +4 -4
  134. package/dist/components/{p-Db3kxVe2.js.map → p-ByAzDzS5.js.map} +1 -1
  135. package/dist/components/{p-sreNwi0N.js → p-BycHaC-9.js} +5 -5
  136. package/dist/components/{p-sreNwi0N.js.map → p-BycHaC-9.js.map} +1 -1
  137. package/dist/components/{p-KudVTtHk.js → p-C4nj29RW.js} +310 -210
  138. package/dist/components/p-C4nj29RW.js.map +1 -0
  139. package/dist/components/{p-BYanlgdq.js → p-C9hrbrUN.js} +27 -14
  140. package/dist/components/p-C9hrbrUN.js.map +1 -0
  141. package/dist/components/{p-BgpsMYcw.js → p-CEn1WeG3.js} +8 -8
  142. package/dist/components/p-CEn1WeG3.js.map +1 -0
  143. package/dist/components/{p-BM9IjvnD.js → p-CGb-8cK4.js} +4 -4
  144. package/dist/components/{p-BM9IjvnD.js.map → p-CGb-8cK4.js.map} +1 -1
  145. package/dist/components/{p-B7kZ1_RH.js → p-C_hSH2nN.js} +5 -5
  146. package/dist/components/{p-B7kZ1_RH.js.map → p-C_hSH2nN.js.map} +1 -1
  147. package/dist/components/{p-CHdJi6b4.js → p-ChLi4Ufe.js} +20 -20
  148. package/dist/components/{p-CHdJi6b4.js.map → p-ChLi4Ufe.js.map} +1 -1
  149. package/dist/components/{p-BPsQrpzN.js → p-CieOx1XL.js} +8 -8
  150. package/dist/components/{p-BPsQrpzN.js.map → p-CieOx1XL.js.map} +1 -1
  151. package/dist/components/{p-DjU7p3od.js → p-Co5lU_7h.js} +12 -12
  152. package/dist/components/{p-DjU7p3od.js.map → p-Co5lU_7h.js.map} +1 -1
  153. package/dist/components/{p-sq9jgfX0.js → p-D27d2rKT.js} +3 -3
  154. package/dist/components/{p-sq9jgfX0.js.map → p-D27d2rKT.js.map} +1 -1
  155. package/dist/components/{p-DFO-6kuA.js → p-DPxzgBs0.js} +3 -3
  156. package/dist/components/{p-DFO-6kuA.js.map → p-DPxzgBs0.js.map} +1 -1
  157. package/dist/components/{p-0iJh9Z6m.js → p-D_RcVGj0.js} +5 -5
  158. package/dist/components/{p-0iJh9Z6m.js.map → p-D_RcVGj0.js.map} +1 -1
  159. package/dist/components/{p-DOPuq6gn.js → p-DqsgZIHC.js} +5 -5
  160. package/dist/components/{p-DOPuq6gn.js.map → p-DqsgZIHC.js.map} +1 -1
  161. package/dist/components/{p-BehchtaT.js → p-DzyZA2GT.js} +8 -8
  162. package/dist/components/{p-BehchtaT.js.map → p-DzyZA2GT.js.map} +1 -1
  163. package/dist/components/{p-Ddlbt3Bj.js → p-dcR2uxM3.js} +6 -6
  164. package/dist/components/{p-Ddlbt3Bj.js.map → p-dcR2uxM3.js.map} +1 -1
  165. package/dist/components/{p-B7w19kIk.js → p-fiFoOjv0.js} +9 -9
  166. package/dist/components/{p-B7w19kIk.js.map → p-fiFoOjv0.js.map} +1 -1
  167. package/dist/components/{p-CsyM5q2M.js → p-gCHmJzc2.js} +5 -5
  168. package/dist/components/{p-CsyM5q2M.js.map → p-gCHmJzc2.js.map} +1 -1
  169. package/dist/esm/{index-oCOlsFCN.js → index-Cw77zP6g.js} +47 -22
  170. package/dist/esm/index-Cw77zP6g.js.map +1 -0
  171. package/dist/esm/index-D0Q2MKPn.js +16953 -0
  172. package/dist/esm/index-D0Q2MKPn.js.map +1 -0
  173. package/dist/esm/index.js +1 -1
  174. package/dist/esm/kritzel-brush-style.entry.js +1 -1
  175. package/dist/esm/kritzel-color_22.entry.js +205 -157
  176. package/dist/esm/loader.js +3 -3
  177. package/dist/esm/stencil.js +4 -4
  178. package/dist/esm/stencil.js.map +1 -1
  179. package/dist/stencil/index.esm.js +1 -1
  180. package/dist/stencil/p-73784709.entry.js +2 -0
  181. package/dist/stencil/p-73784709.entry.js.map +1 -0
  182. package/dist/stencil/{p-25d1e040.entry.js → p-8b831c94.entry.js} +2 -2
  183. package/dist/stencil/p-Cw77zP6g.js +3 -0
  184. package/dist/stencil/p-Cw77zP6g.js.map +1 -0
  185. package/dist/stencil/p-D0Q2MKPn.js +2 -0
  186. package/dist/stencil/p-D0Q2MKPn.js.map +1 -0
  187. package/dist/stencil/stencil.esm.js +1 -1
  188. package/dist/stencil/stencil.esm.js.map +1 -1
  189. package/dist/types/classes/core/store.class.d.ts +2 -1
  190. package/dist/types/classes/core/viewport.class.d.ts +3 -0
  191. package/dist/types/classes/handlers/move.handler.d.ts +2 -0
  192. package/dist/types/classes/handlers/selection.handler.d.ts +3 -0
  193. package/dist/types/classes/objects/text.class.d.ts +20 -10
  194. package/dist/types/stencil-public-runtime.d.ts +36 -12
  195. package/package.json +7 -2
  196. package/dist/cjs/index-DgZMn9B_.js +0 -2791
  197. package/dist/cjs/index-DgZMn9B_.js.map +0 -1
  198. package/dist/cjs/index-nzUNdMPh.js.map +0 -1
  199. package/dist/components/p-BYanlgdq.js.map +0 -1
  200. package/dist/components/p-BbGgijCS.js +0 -1164
  201. package/dist/components/p-BbGgijCS.js.map +0 -1
  202. package/dist/components/p-BgpsMYcw.js.map +0 -1
  203. package/dist/components/p-KudVTtHk.js.map +0 -1
  204. package/dist/esm/index-CxieEK_G.js +0 -2763
  205. package/dist/esm/index-CxieEK_G.js.map +0 -1
  206. package/dist/esm/index-oCOlsFCN.js.map +0 -1
  207. package/dist/stencil/p-CxieEK_G.js +0 -2
  208. package/dist/stencil/p-CxieEK_G.js.map +0 -1
  209. package/dist/stencil/p-ab074e87.entry.js +0 -2
  210. package/dist/stencil/p-ab074e87.entry.js.map +0 -1
  211. package/dist/stencil/p-oCOlsFCN.js +0 -3
  212. package/dist/stencil/p-oCOlsFCN.js.map +0 -1
  213. /package/dist/stencil/{p-25d1e040.entry.js.map → p-8b831c94.entry.js.map} +0 -0
@@ -1,5 +1,5 @@
1
- import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './index-oCOlsFCN.js';
2
- import { K as KritzelBrushTool, a as KritzelTextTool, b as KritzelMouseButton, c as KritzelSelectionTool, D as DEFAULT_BRUSH_CONFIG, d as KritzelEraserTool, e as DEFAULT_TEXT_CONFIG, f as KritzelImageTool, g as KritzelWorkspace, h as KritzelKeyboardHelper, i as KritzelEventHelper, j as KritzelBaseHandler, k as KritzelToolRegistry, l as KritzelSelectionGroup, B as BatchCommand, R as RemoveSelectionGroupCommand, A as AddSelectionGroupCommand, m as KritzelBaseCommand, n as KrtizelSelectionBox, O as ObjectHelper, o as KritzelReviver, p as RemoveObjectCommand, q as AddObjectCommand, U as UpdateObjectCommand, r as KritzelBaseTool } from './index-CxieEK_G.js';
1
+ import { r as registerInstance, h, H as Host, c as createEvent, g as getElement } from './index-Cw77zP6g.js';
2
+ import { K as KritzelBrushTool, a as KritzelTextTool, b as KritzelMouseButton, c as KritzelSelectionTool, D as DEFAULT_BRUSH_CONFIG, d as KritzelEraserTool, e as DEFAULT_TEXT_CONFIG, f as KritzelImageTool, g as KritzelWorkspace, h as KritzelKeyboardHelper, i as KritzelEventHelper, j as KritzelBaseHandler, k as KritzelToolRegistry, l as KrtizelSelectionBox, m as KritzelSelectionGroup, B as BatchCommand, R as RemoveSelectionGroupCommand, A as AddSelectionGroupCommand, n as KritzelBaseCommand, O as ObjectHelper, o as KritzelReviver, p as RemoveObjectCommand, q as AddObjectCommand, U as UpdateObjectCommand, r as KritzelBaseTool } from './index-D0Q2MKPn.js';
3
3
 
4
4
  const kritzelColorCss = ":host{display:flex}.checkerboard-bg{background:repeating-conic-gradient(#ccc 0% 25%, #fff 0% 50%) 50% / 8px 8px;position:relative;overflow:hidden}.color-circle{width:24px;height:24px;border-radius:50%;box-sizing:border-box;display:block}.color-circle.white{border:1px solid var(--kritzel-color-palette-circle-border-color, #dddcdc)}";
5
5
 
@@ -35,13 +35,13 @@ const KritzelColor = class {
35
35
  }
36
36
  render() {
37
37
  const isColorVeryLight = this.isLightColor(this.value);
38
- return (h(Host, { key: '198dba41e1600d76faace18de78191d2b7a551ec' }, h("div", { key: 'ee690cffb7925e09cb2c51022eec607247a4849f', class: "checkerboard-bg", style: {
38
+ return (h(Host, { key: '000e54c604c8ceca2c44365e95ec1f5bfb1b729a' }, h("div", { key: '77b2abeae70e4a80714e1364eb4e11e67f16d066', class: "checkerboard-bg", style: {
39
39
  width: `${this.size}px`,
40
40
  height: `${this.size}px`,
41
41
  borderRadius: '50%',
42
42
  display: 'inline-block',
43
43
  position: 'relative',
44
- } }, h("div", { key: '66cc8df8fabd008db8c00942994875e3e8d722ce', class: {
44
+ } }, h("div", { key: 'df71720cf51d845a36598499adb900a30770c503', class: {
45
45
  'color-circle': true,
46
46
  'white': isColorVeryLight,
47
47
  }, style: {
@@ -84,7 +84,7 @@ const KritzelColorPalette = class {
84
84
  render() {
85
85
  const displayedColors = this.isExpanded ? this.colors : this.colors.slice(0, 6);
86
86
  const expandedHeight = this.isExpanded ? this.calculateHeight() : '32px';
87
- return (h(Host, { key: '2ead7cd530ce181856e5f582f086a22a1fe69390' }, h("div", { key: 'fcc75b267f36e271d50615bfde42a29c28aa2536', class: {
87
+ return (h(Host, { key: 'd533725a8ab2019ae963959727283fbbf833c56a' }, h("div", { key: '7fb50c16d79e9b7330100b0f4e116f8f07b20827', class: {
88
88
  'color-grid': true,
89
89
  'expanded': this.isExpanded,
90
90
  }, style: {
@@ -149,7 +149,7 @@ const KritzelContextMenu = class {
149
149
  return defaultValue;
150
150
  }
151
151
  render() {
152
- return (h(Host, { key: '908711e45cb4ea41f25c4f66a9d3b03c847f886e' }, h("div", { key: '7dcb6e5654ecafebc1fc1a2efb9fa1b8678236c4', class: "menu-container" }, this.processedItems.map(({ item, isDisabled }, index) => (h("button", { key: `${item.label}-${index}`, class: { 'menu-item': true, 'disabled': isDisabled }, onClick: () => this.handleItemClick(item, isDisabled), disabled: isDisabled }, item.icon && h("kritzel-icon", { name: item.icon, size: 16 }), h("span", { class: "label" }, item.label)))))));
152
+ return (h(Host, { key: '45b9652285f9c3fe7568cbe222667d23c151622f' }, h("div", { key: '9aecc01027f297fa4d991780efaaf51b8d4542dc', class: "menu-container" }, this.processedItems.map(({ item, isDisabled }, index) => (h("button", { key: `${item.label}-${index}`, class: { 'menu-item': true, 'disabled': isDisabled }, onClick: () => this.handleItemClick(item, isDisabled), disabled: isDisabled }, item.icon && h("kritzel-icon", { name: item.icon, size: 16 }), h("span", { class: "label" }, item.label)))))));
153
153
  }
154
154
  static get watchers() { return {
155
155
  "items": ["onItemsChanged"]
@@ -192,14 +192,14 @@ const KritzelControlBrushConfig = class {
192
192
  this.toolChange.emit(this.tool);
193
193
  }
194
194
  render() {
195
- return (h(Host, { key: '8fe8c0564f491121c0c44c6ff4083034f92dbb67' }, h("div", { key: '3e8a69b827785976768bfc1e809126bee7c48c62', style: {
195
+ return (h(Host, { key: '4b060826312e6d5a2117f5ba9522553af9b02d6f' }, h("div", { key: '0975a250184d5bb2d38cc60263bd718157230d8c', style: {
196
196
  display: 'flex',
197
197
  flexDirection: 'row',
198
198
  alignItems: this.isExpanded ? 'flex-start' : 'center',
199
199
  justifyContent: 'flex-start',
200
200
  width: '100%',
201
201
  gap: '8px',
202
- } }, h("kritzel-color-palette", { key: 'c9056f81cf47d81fef0a0f5743000dcd6633258a', colors: this.palette, selectedColor: this.tool.color, isExpanded: this.isExpanded, isOpaque: true, onColorChange: color => this.handleColorChange(color) }), h("button", { key: '2f307264b80a732d976edeb025d509bc1164606b', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand', style: this.palette.length > 6 ? { visibillity: 'visible' } : { visibility: 'hidden' } }, h("kritzel-icon", { key: '08133ba0a23353b2bb3f87c685a7a0798b8dd16c', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-stroke-size", { key: '3de25cc80029ffdfdc173c4c79e937a7dc329743', selectedSize: this.tool.size, onSizeChange: event => this.handleSizeChange(event) })));
202
+ } }, h("kritzel-color-palette", { key: 'df84a6fdda01bc7bf3aff42e3b88c4bd9dca500f', colors: this.palette, selectedColor: this.tool.color, isExpanded: this.isExpanded, isOpaque: true, onColorChange: color => this.handleColorChange(color) }), h("button", { key: 'e43c19612807fc4f9cd1bf04f4fb79a048cfd62b', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand', style: this.palette.length > 6 ? { visibillity: 'visible' } : { visibility: 'hidden' } }, h("kritzel-icon", { key: '915cce6c4744ad175f3836c946330882de840880', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-stroke-size", { key: 'c07eebae3ba1785e2644c6b5a22d23f76be950fb', selectedSize: this.tool.size, onSizeChange: event => this.handleSizeChange(event) })));
203
203
  }
204
204
  static get watchers() { return {
205
205
  "tool": ["handleToolChange"]
@@ -233,14 +233,14 @@ const KritzelControlTextConfig = class {
233
233
  this.toolChange.emit(this.tool);
234
234
  }
235
235
  render() {
236
- return (h(Host, { key: '3695b187943af25566885d63257ae3de9f405ea5' }, h("div", { key: '7bb146ae3c188478ba17f18f70fd170ce3536308', style: {
236
+ return (h(Host, { key: '82e611092700f057bd36823e7f7503fe7a0423ed' }, h("div", { key: '37ed39adeeeb58981a917918cd185e96d589e973', style: {
237
237
  display: 'flex',
238
238
  flexDirection: 'row',
239
239
  alignItems: 'center',
240
240
  justifyContent: 'flex-start',
241
241
  width: '100%',
242
242
  gap: '8px',
243
- } }, h("kritzel-font-family", { key: '87f4c5ac2e2a4cfea216b1b828faad231438b9ec', selectedFontFamily: this.tool.fontFamily, onFontFamilyChange: event => this.handleFamilyChange(event) }), h("button", { key: '2e73aaf7da659b9e069c247cc762f68394212293', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand' }, h("kritzel-icon", { key: '785b664697ba266432c535ea26e0665f8d8d657f', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-color-palette", { key: 'ed2517a39d254b77f45154914b3ce6a934f66c33', colors: this.tool.palette, selectedColor: this.tool.fontColor, isExpanded: this.isExpanded, onColorChange: event => this.handleColorChange(event) }), h("kritzel-font-size", { key: '9b25c9607fa69c991e769852e3e3e378e48387bd', selectedSize: this.tool.fontSize, fontFamily: this.tool.fontFamily, onSizeChange: event => this.handleSizeChange(event) })));
243
+ } }, h("kritzel-font-family", { key: 'cd8afc5c4a1eee087610cd3d5a6c05210cfda6b3', selectedFontFamily: this.tool.fontFamily, onFontFamilyChange: event => this.handleFamilyChange(event) }), h("button", { key: '085f1bba060bde27a7b64dc5477bb51305b76235', class: "expand-toggle", onClick: () => this.handleToggleExpand(), title: this.isExpanded ? 'Collapse' : 'Expand' }, h("kritzel-icon", { key: '3ff8fec207120e67f43315c6dace72fc2f6bd0f1', name: this.isExpanded ? 'chevron-up' : 'chevron-down' }))), h("kritzel-color-palette", { key: '2e29d01a6b5c0e4a8ec347e63b6a2698c282db40', colors: this.tool.palette, selectedColor: this.tool.fontColor, isExpanded: this.isExpanded, onColorChange: event => this.handleColorChange(event) }), h("kritzel-font-size", { key: 'c972068f1251d66e756b8de72fbdd1b6002d1daa', selectedSize: this.tool.fontSize, fontFamily: this.tool.fontFamily, onSizeChange: event => this.handleSizeChange(event) })));
244
244
  }
245
245
  };
246
246
  KritzelControlTextConfig.style = kritzelControlTextConfigCss;
@@ -374,13 +374,13 @@ const KritzelControls = class {
374
374
  }
375
375
  render() {
376
376
  const hasNoConfig = this.activeControl?.config === undefined || this.activeControl?.config === null;
377
- return (h(Host, { key: 'a463310d88265b71097f838bf775abdcabc99225', class: {
377
+ return (h(Host, { key: 'ab3e5f078d6d197c6e10c9dee180c04ef85281bf', class: {
378
378
  mobile: this.isTouchDevice,
379
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '267e9c26b41a52c655209dbaa8c85cbd72323577', style: {
379
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '290ceb6f2c46eb7e869a4741dd6600bc7c47bbb4', style: {
380
380
  position: 'absolute',
381
381
  bottom: '56px',
382
382
  left: '12px',
383
- }, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: 'c55773245c925e1b972f3e83cb4d8f1c93ebe995', class: "kritzel-controls" }, this.controls.map(control => {
383
+ }, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: 'd2590bc56b709e77910e7159296741c8859158d7', class: "kritzel-controls" }, this.controls.map(control => {
384
384
  if (control.type === 'tool') {
385
385
  return (h("button", { class: {
386
386
  'kritzel-control': true,
@@ -477,7 +477,7 @@ const KritzelCursorTrail = class {
477
477
  }
478
478
  }
479
479
  render() {
480
- return (h(Host, { key: '87003b14680b3cbca302e7b31ff57e74cc774e25' }, this.cursorTrailPoints.length > 1 && (h("svg", { key: 'aa6460089c9f3157d2dea9396405b14ab8cc1710', class: "cursor-trail-svg", xmlns: "http://www.w3.org/2000/svg", style: {
480
+ return (h(Host, { key: '10ef620f19d72a8a5c3a12d0d98686bc69308a30' }, this.cursorTrailPoints.length > 1 && (h("svg", { key: 'd03403051e53422aaa28d6360aaa9c0391e3ef6a', class: "cursor-trail-svg", xmlns: "http://www.w3.org/2000/svg", style: {
481
481
  position: 'absolute',
482
482
  left: '0',
483
483
  top: '0',
@@ -848,7 +848,7 @@ const KritzelEditor = class {
848
848
  }
849
849
  }
850
850
  render() {
851
- return (h(Host, { key: 'f4f7cb5fbb6b28bac0735d05c2d1ed788c8ef2a7' }, h("kritzel-workspace-manager", { key: 'bef6f248a06b7a6576687a82a5ea3eb81d3340c3', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-engine", { key: '8ee352db87d94c367389059074842148e43d8d11', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, scaleMax: this.scaleMax, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => (this.workspaces = event.detail) }), h("kritzel-controls", { key: '3e5bfa0fd473a551ba4ab7a7137aedbb3d22db19', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, onIsControlsReady: () => (this.isControlsReady = true) })));
851
+ return (h(Host, { key: '8dc4fa4d4c3512d3a0ac40d5ab67566720b8a3e4' }, h("kritzel-workspace-manager", { key: 'b7a032b8bb01b27af192719b46a3891037770a28', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-engine", { key: '163c4aea9d07290c89e63931ed4a4cf0184757be', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, scaleMax: this.scaleMax, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => (this.workspaces = event.detail) }), h("kritzel-controls", { key: '4c9307c3831f2b179a446265f3226b0ae1541afc', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, onIsControlsReady: () => (this.isControlsReady = true) })));
852
852
  }
853
853
  static get watchers() { return {
854
854
  "isEngineReady": ["onIsEngineReady"],
@@ -864,18 +864,18 @@ class KritzelViewport {
864
864
  startY = 0;
865
865
  constructor(core, host) {
866
866
  this._core = core;
867
- this._core.store.setState('host', host);
868
- this._core.store.setState('viewportWidth', host.clientWidth);
869
- this._core.store.setState('viewportHeight', host.clientHeight);
870
- this._core.store.setState('startX', 0);
871
- this._core.store.setState('startY', 0);
872
- this._core.store.setState('translateX', 0);
873
- this._core.store.setState('translateY', 0);
867
+ this._core.store.state.host = host;
868
+ this._core.store.state.viewportWidth = host.clientWidth;
869
+ this._core.store.state.viewportHeight = host.clientHeight;
870
+ this._core.store.state.startX = 0;
871
+ this._core.store.state.startY = 0;
872
+ this._core.store.state.translateX = 0;
873
+ this._core.store.state.translateY = 0;
874
874
  }
875
875
  handleResize() {
876
- this._core.store.setState('viewportWidth', this._core.store.state.host.clientWidth);
877
- this._core.store.setState('viewportHeight', this._core.store.state.host.clientHeight);
878
- this._core.store.setState('hasViewportChanged', true);
876
+ this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;
877
+ this._core.store.state.viewportHeight = this._core.store.state.host.clientHeight;
878
+ this._core.store.state.hasViewportChanged = true;
879
879
  this._core.rerender();
880
880
  }
881
881
  handlePointerDown(event) {
@@ -883,16 +883,16 @@ class KritzelViewport {
883
883
  const adjustedClientX = event.clientX - this._core.store.offsetX;
884
884
  const adjustedClientY = event.clientY - this._core.store.offsetY;
885
885
  if (event.button === KritzelMouseButton.Right) {
886
- this._core.store.setState('isPanning', true);
887
- this._core.store.setState('startX', adjustedClientX);
888
- this._core.store.setState('startY', adjustedClientY);
886
+ this._core.store.state.isPanning = true;
887
+ this._core.store.state.startX = adjustedClientX;
888
+ this._core.store.state.startY = adjustedClientY;
889
889
  }
890
890
  }
891
891
  if (event.pointerType === 'touch') {
892
892
  const activePointers = Array.from(this._core.store.state.pointers.values());
893
893
  if (activePointers.length === 2) {
894
- this._core.store.setState('currentPath', null);
895
- this._core.store.setState('isScaling', true);
894
+ this._core.store.state.currentPath = null;
895
+ this._core.store.state.isScaling = true;
896
896
  const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;
897
897
  const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;
898
898
  const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;
@@ -909,17 +909,17 @@ class KritzelViewport {
909
909
  const hostRect = this._core.store.state.host.getBoundingClientRect();
910
910
  const xRelativeToHost = event.clientX - hostRect.left;
911
911
  const yRelativeToHost = event.clientY - hostRect.top;
912
- this._core.store.setState('pointerX', (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale);
913
- this._core.store.setState('pointerY', (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale);
912
+ this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;
913
+ this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;
914
914
  if (this._core.store.state.isPanning) {
915
915
  const dx = xRelativeToHost - this._core.store.state.startX;
916
916
  const dy = yRelativeToHost - this._core.store.state.startY;
917
- this._core.store.setState('translateX', this._core.store.state.translateX + dx);
918
- this._core.store.setState('translateY', this._core.store.state.translateY + dy);
919
- this._core.store.setState('startX', xRelativeToHost);
920
- this._core.store.setState('startY', yRelativeToHost);
921
- this._core.store.setState('hasViewportChanged', true);
922
- this._core.store.setState('skipContextMenu', true);
917
+ this._core.store.state.translateX += dx;
918
+ this._core.store.state.translateY += dy;
919
+ this._core.store.state.startX = xRelativeToHost;
920
+ this._core.store.state.startY = yRelativeToHost;
921
+ this._core.store.state.hasViewportChanged = true;
922
+ this._core.store.state.skipContextMenu = true;
923
923
  this._core.rerender();
924
924
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
925
925
  }
@@ -928,8 +928,8 @@ class KritzelViewport {
928
928
  const hostRect = this._core.store.state.host.getBoundingClientRect();
929
929
  const xRelativeToHost = event.clientX - hostRect.left;
930
930
  const yRelativeToHost = event.clientY - hostRect.top;
931
- this._core.store.setState('pointerX', (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale);
932
- this._core.store.setState('pointerY', (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale);
931
+ this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;
932
+ this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;
933
933
  const activePointers = Array.from(this._core.store.state.pointers.values());
934
934
  if (activePointers.length === 2) {
935
935
  const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;
@@ -942,20 +942,20 @@ class KritzelViewport {
942
942
  const scaleRatio = currentTouchDistance / this.initialTouchDistance;
943
943
  const newScale = this._core.store.state.scale * scaleRatio;
944
944
  if (newScale > this._core.store.state.scaleMax || newScale < this._core.store.state.scaleMin) {
945
- this._core.store.setState('translateX', this._core.store.state.translateX + midpointX - this.startX);
946
- this._core.store.setState('translateY', this._core.store.state.translateY + midpointY - this.startY);
945
+ this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX;
946
+ this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY;
947
947
  }
948
948
  else {
949
949
  const translateXAdjustment = (midpointX - this._core.store.state.translateX) * (scaleRatio - 1);
950
950
  const translateYAdjustment = (midpointY - this._core.store.state.translateY) * (scaleRatio - 1);
951
- this._core.store.setState('translateX', this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment);
952
- this._core.store.setState('translateY', this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment);
953
- this._core.store.setState('scale', newScale);
951
+ this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment;
952
+ this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment;
953
+ this._core.store.state.scale = newScale;
954
954
  this.initialTouchDistance = currentTouchDistance;
955
955
  }
956
956
  this.startX = midpointX;
957
957
  this.startY = midpointY;
958
- this._core.store.setState('hasViewportChanged', true);
958
+ this._core.store.state.hasViewportChanged = true;
959
959
  this._core.rerender();
960
960
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
961
961
  }
@@ -964,12 +964,12 @@ class KritzelViewport {
964
964
  handlePointerUp(event) {
965
965
  if (event.pointerType === 'mouse') {
966
966
  if (this._core.store.state.isPanning) {
967
- this._core.store.setState('isPanning', false);
967
+ this._core.store.state.isPanning = false;
968
968
  this._core.rerender();
969
969
  }
970
970
  }
971
971
  if (event.pointerType === 'touch') {
972
- this._core.store.setState('isScaling', false);
972
+ this._core.store.state.isScaling = false;
973
973
  this._core.rerender();
974
974
  }
975
975
  }
@@ -982,33 +982,52 @@ class KritzelViewport {
982
982
  this.handlePan(event);
983
983
  }
984
984
  }
985
+ centerInViewport(object) {
986
+ const { scale, viewportWidth, viewportHeight } = this._core.store.state;
987
+ const { x, y, width, height } = object.rotatedBoundingBox;
988
+ const objectCenterX = x + width / 2;
989
+ const objectCenterY = y + height / 2;
990
+ this._core.store.state.translateX = viewportWidth / 2 - objectCenterX * scale;
991
+ this._core.store.state.translateY = viewportHeight / 2 - objectCenterY * scale;
992
+ this._core.store.state.hasViewportChanged = true;
993
+ this._core.rerender();
994
+ this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
995
+ }
996
+ centerFitInViewport(object) {
997
+ const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);
998
+ const scaleY = this._core.store.state.viewportHeight / (object.rotatedBoundingBox.height * 1.1);
999
+ const newScale = Math.min(scaleX, scaleY, this._core.store.state.scaleMax);
1000
+ const clampedScale = Math.max(newScale, this._core.store.state.scaleMin);
1001
+ this._core.store.state.scale = clampedScale;
1002
+ this.centerInViewport(object);
1003
+ }
985
1004
  handleZoom(event) {
986
- this._core.store.setState('isScaling', true);
1005
+ this._core.store.state.isScaling = true;
987
1006
  const rect = this._core.store.state.host.getBoundingClientRect();
988
1007
  const xRelativeToHost = event.clientX - rect.left;
989
1008
  const yRelativeToHost = event.clientY - rect.top;
990
- this._core.store.setState('pointerX', (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale);
991
- this._core.store.setState('pointerY', (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale);
1009
+ this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;
1010
+ this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;
992
1011
  const delta = event.deltaY > 0 ? -this._core.store.state.scaleStep * this._core.store.state.scale : this._core.store.state.scaleStep * this._core.store.state.scale;
993
1012
  const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale + delta));
994
1013
  const scaleRatio = newScale / this._core.store.state.scale;
995
1014
  const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);
996
1015
  const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);
997
- this._core.store.setState('scale', newScale);
998
- this._core.store.setState('translateX', this._core.store.state.translateX - translateXAdjustment);
999
- this._core.store.setState('translateY', this._core.store.state.translateY - translateYAdjustment);
1000
- this._core.store.setState('hasViewportChanged', true);
1016
+ this._core.store.state.scale = newScale;
1017
+ this._core.store.state.translateX = this._core.store.state.translateX - translateXAdjustment;
1018
+ this._core.store.state.translateY = this._core.store.state.translateY - translateYAdjustment;
1019
+ this._core.store.state.hasViewportChanged = true;
1001
1020
  this._core.rerender();
1002
1021
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
1003
1022
  setTimeout(() => {
1004
- this._core.store.setState('isScaling', false);
1023
+ this._core.store.state.isScaling = false;
1005
1024
  }, 300);
1006
1025
  }
1007
1026
  handlePan(event) {
1008
1027
  const panSpeed = 0.8;
1009
- this._core.store.setState('translateX', this._core.store.state.translateX - event.deltaX * panSpeed);
1010
- this._core.store.setState('translateY', this._core.store.state.translateY - event.deltaY * panSpeed);
1011
- this._core.store.setState('hasViewportChanged', true);
1028
+ this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;
1029
+ this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;
1030
+ this._core.store.state.hasViewportChanged = true;
1012
1031
  this._core.rerender();
1013
1032
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
1014
1033
  }
@@ -1040,8 +1059,8 @@ class KritzelKeyHandler extends KritzelBaseHandler {
1040
1059
  },
1041
1060
  { key: 'v', ctrl: true, condition: c => !!c.store.state.copiedObjects && !c.store.state.activeText, action: c => c.paste() },
1042
1061
  // Text editing
1043
- { key: 'a', ctrl: true, condition: c => !!c.store.state.activeText, action: c => c.store.state.activeText.selectAll() },
1044
- { key: 'v', ctrl: true, condition: c => !!c.store.state.activeText, action: c => c.store.state.activeText.insertFromClipboard() },
1062
+ // { key: 'a', ctrl: true, condition: c => !!c.store.state.activeText, action: c => c.store.state.activeText.selectAll() },
1063
+ // { key: 'v', ctrl: true, condition: c => !!c.store.state.activeText, action: c => c.store.state.activeText.insertFromClipboard() },
1045
1064
  // Object layering
1046
1065
  { key: '+', ctrl: true, condition: c => !!c.store.state.selectionGroup, action: c => c.bringForward() },
1047
1066
  { key: '-', ctrl: true, condition: c => !!c.store.state.selectionGroup, action: c => c.sendBackward() },
@@ -1058,7 +1077,7 @@ class KritzelKeyHandler extends KritzelBaseHandler {
1058
1077
  toolInstance.onActivate();
1059
1078
  }
1060
1079
  handleKeyDown(event) {
1061
- this._core.store.setState('isCtrlKeyPressed', event.ctrlKey);
1080
+ this._core.store.state.isCtrlKeyPressed = event.ctrlKey;
1062
1081
  const shortcut = this.shortcuts.find(s => s.key === event.key && !!s.ctrl === event.ctrlKey && !!s.shift === event.shiftKey && (!s.condition || s.condition(this._core)));
1063
1082
  if (shortcut) {
1064
1083
  event.preventDefault();
@@ -1066,7 +1085,7 @@ class KritzelKeyHandler extends KritzelBaseHandler {
1066
1085
  }
1067
1086
  }
1068
1087
  handleKeyUp(event) {
1069
- this._core.store.setState('isCtrlKeyPressed', event.ctrlKey);
1088
+ this._core.store.state.isCtrlKeyPressed = event.ctrlKey;
1070
1089
  }
1071
1090
  }
1072
1091
 
@@ -1083,23 +1102,30 @@ class KritzelContextMenuHandler extends KritzelBaseHandler {
1083
1102
  return;
1084
1103
  }
1085
1104
  if (this._core.store.state.skipContextMenu) {
1086
- this._core.store.setState('skipContextMenu', false);
1105
+ this._core.store.state.skipContextMenu = false;
1087
1106
  return;
1088
1107
  }
1108
+ const selectionTool = this._core.store.state.activeTool;
1109
+ selectionTool?.moveHandler?.cancelPendingDrag();
1110
+ if (this._core.store.state.selectionBox) {
1111
+ this._core.store.state.objectsMap.remove(object => object instanceof KrtizelSelectionBox);
1112
+ this._core.store.state.selectionBox = null;
1113
+ this._core.store.state.isSelecting = false;
1114
+ }
1089
1115
  const selectedObject = this._core.getObjectFromPointerEvent(event, '.object');
1090
- if (selectedObject && !(selectedObject instanceof KritzelSelectionGroup)) {
1116
+ if (selectedObject && !(selectedObject instanceof KritzelSelectionGroup) && !(selectedObject instanceof KrtizelSelectionBox)) {
1091
1117
  const selectionGroup = KritzelSelectionGroup.create(this._core);
1092
1118
  selectionGroup.addOrRemove(selectedObject);
1093
1119
  selectionGroup.isSelected = true;
1094
1120
  selectionGroup.rotation = selectedObject.rotation;
1095
- this._core.store.setState('isSelecting', false);
1121
+ this._core.store.state.isSelecting = false;
1096
1122
  const batch = new BatchCommand(this._core, this, [
1097
1123
  new RemoveSelectionGroupCommand(this._core, this._core.store.state.selectionGroup),
1098
1124
  new AddSelectionGroupCommand(this._core, this, selectionGroup),
1099
1125
  ]);
1100
1126
  this._core.history.executeCommand(batch);
1101
1127
  }
1102
- this._core.store.setState('contextMenuItems', this._core.store.state.selectionGroup ? this.objectContextMenuItems : this.globalContextMenuItems);
1128
+ this._core.store.state.contextMenuItems = this._core.store.state.selectionGroup ? this.objectContextMenuItems : this.globalContextMenuItems;
1103
1129
  let x = event.clientX - this._core.store.offsetX;
1104
1130
  let y = event.clientY - this._core.store.offsetY;
1105
1131
  const menuWidthEstimate = 150;
@@ -1113,10 +1139,10 @@ class KritzelContextMenuHandler extends KritzelBaseHandler {
1113
1139
  }
1114
1140
  x = Math.max(margin, x);
1115
1141
  y = Math.max(margin, y);
1116
- this._core.store.setState('contextMenuX', x);
1117
- this._core.store.setState('contextMenuY', y);
1118
- this._core.store.setState('isContextMenuVisible', true);
1119
- this._core.store.setState('isEnabled', false);
1142
+ this._core.store.state.contextMenuX = x;
1143
+ this._core.store.state.contextMenuY = y;
1144
+ this._core.store.state.isContextMenuVisible = true;
1145
+ this._core.store.state.isEnabled = false;
1120
1146
  this._core.rerender();
1121
1147
  }
1122
1148
  }
@@ -1437,14 +1463,14 @@ class UpdateViewportCommand extends KritzelBaseCommand {
1437
1463
  };
1438
1464
  }
1439
1465
  execute() {
1440
- this._core.store.setState('scale', this.currentViewport.scale);
1441
- this._core.store.setState('translateX', this.currentViewport.translateX);
1442
- this._core.store.setState('translateY', this.currentViewport.translateY);
1466
+ this._core.store.state.scale = this.currentViewport.scale;
1467
+ this._core.store.state.translateX = this.currentViewport.translateX;
1468
+ this._core.store.state.translateY = this.currentViewport.translateY;
1443
1469
  }
1444
1470
  undo() {
1445
- this._core.store.setState('scale', this.previousViewport.scale);
1446
- this._core.store.setState('translateX', this.previousViewport.translateX);
1447
- this._core.store.setState('translateY', this.previousViewport.translateY);
1471
+ this._core.store.state.scale = this.previousViewport.scale;
1472
+ this._core.store.state.translateX = this.previousViewport.translateX;
1473
+ this._core.store.state.translateY = this.previousViewport.translateY;
1448
1474
  }
1449
1475
  }
1450
1476
 
@@ -1542,7 +1568,7 @@ class KritzelHistory {
1542
1568
  if (this._core.store.state.hasViewportChanged) {
1543
1569
  const command = new UpdateViewportCommand(this._core, this, this.previousViewport);
1544
1570
  command.undo();
1545
- this._core.store.setState('hasViewportChanged', false);
1571
+ this._core.store.state.hasViewportChanged = false;
1546
1572
  this._core.rerender();
1547
1573
  return;
1548
1574
  }
@@ -1553,7 +1579,7 @@ class KritzelHistory {
1553
1579
  console.info('undo', command);
1554
1580
  this.redoStack.add(command);
1555
1581
  }
1556
- this._core.store.setState('copiedObjects', null);
1582
+ this._core.store.state.copiedObjects = null;
1557
1583
  this._core.rerender();
1558
1584
  }
1559
1585
  redo() {
@@ -1573,7 +1599,7 @@ class KritzelHistory {
1573
1599
  if (this.redoStack.isEmpty() === false) {
1574
1600
  this.redoStack.clear();
1575
1601
  }
1576
- this._core.store.setState('hasViewportChanged', false);
1602
+ this._core.store.state.hasViewportChanged = false;
1577
1603
  this.previousViewport = {
1578
1604
  scale: this._core.store.state.scale,
1579
1605
  scaleStep: this._core.store.state.scaleStep,
@@ -1633,11 +1659,14 @@ class KritzelStore {
1633
1659
  return this._state;
1634
1660
  }
1635
1661
  get currentZIndex() {
1636
- return this._state.objectsMap.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox)).length;
1662
+ return Math.max(0, ...this._state.objectsMap.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox)).map(o => o.zIndex)) + 1;
1637
1663
  }
1638
1664
  get allObjects() {
1639
1665
  return this._state.objectsMap.allObjects();
1640
1666
  }
1667
+ get allNonSelectionObjects() {
1668
+ return this._state.objectsMap.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KrtizelSelectionBox));
1669
+ }
1641
1670
  get selectedObjects() {
1642
1671
  return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);
1643
1672
  }
@@ -1711,18 +1740,21 @@ class KritzelCore {
1711
1740
  const workspaces = await this.getWorkspaces();
1712
1741
  const mostRecentWorkspace = [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0];
1713
1742
  const fallbackWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');
1714
- this._store.setState('activeWorkspace', workspace ?? mostRecentWorkspace ?? fallbackWorkspace);
1715
- const isExistingWorkspace = await this.getWorkspace(this._store.state.activeWorkspace.id);
1716
- if (isExistingWorkspace) {
1743
+ const candidateWorkspace = workspace ?? mostRecentWorkspace ?? fallbackWorkspace;
1744
+ const existingWorkspace = await this.getWorkspace(candidateWorkspace.id);
1745
+ if (existingWorkspace) {
1746
+ this._store.state.activeWorkspace = existingWorkspace;
1717
1747
  await this.updateWorkspace(this._store.state.activeWorkspace);
1718
1748
  }
1719
1749
  else {
1750
+ this._store.state.activeWorkspace = candidateWorkspace;
1720
1751
  await this.createWorkspace(this._store.state.activeWorkspace);
1721
1752
  }
1722
- this._store.setState('workspaces', await this.getWorkspaces());
1723
- this._store.setState('translateX', this._store.state.activeWorkspace.viewport.translateX);
1724
- this._store.setState('translateY', this._store.state.activeWorkspace.viewport.translateY);
1725
- this._store.setState('scale', this._store.state.activeWorkspace.viewport.scale);
1753
+ this._store.state.workspaces = await this.getWorkspaces();
1754
+ const viewport = this._store.state.activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };
1755
+ this._store.state.translateX = viewport.translateX ?? 0;
1756
+ this._store.state.translateY = viewport.translateY ?? 0;
1757
+ this._store.state.scale = viewport.scale ?? 1;
1726
1758
  await this.initializeWorkspaceObjects(this._store.state.activeWorkspace.id);
1727
1759
  }
1728
1760
  async initializeWorkspaceObjects(workspaceId) {
@@ -1817,7 +1849,7 @@ class KritzelCore {
1817
1849
  const index = workspaces.findIndex(w => w.id === workspace.id);
1818
1850
  if (index !== -1) {
1819
1851
  workspaces[index] = workspace;
1820
- this._store.setState('workspaces', workspaces);
1852
+ this._store.state.workspaces = workspaces;
1821
1853
  }
1822
1854
  }
1823
1855
  async deleteWorkspace(workspace) {
@@ -1827,7 +1859,7 @@ class KritzelCore {
1827
1859
  const objectRange = IDBKeyRange.bound([workspace.id], [workspace.id, '\uffff']);
1828
1860
  await this._database.deleteByRange('objects', objectRange);
1829
1861
  await this._database.delete('workspaces', workspace.id);
1830
- this._store.setState('workspaces', this._store.state.workspaces.filter(ws => ws.id !== workspace.id));
1862
+ this._store.state.workspaces = this._store.state.workspaces.filter(ws => ws.id !== workspace.id);
1831
1863
  }
1832
1864
  rerender() {
1833
1865
  if (this._kritzelEngine) {
@@ -1864,18 +1896,27 @@ class KritzelCore {
1864
1896
  }
1865
1897
  }
1866
1898
  copy() {
1867
- this._store.setState('copiedObjects', this._store.state.selectionGroup.copy());
1899
+ this._store.state.copiedObjects = this._store.state.selectionGroup.copy();
1868
1900
  }
1869
1901
  paste(x, y) {
1870
1902
  const copiedObjects = this._store.state.copiedObjects;
1871
1903
  copiedObjects.isSelected = true;
1872
- this._store.setState('copiedObjects', copiedObjects);
1904
+ this._store.state.copiedObjects = copiedObjects;
1873
1905
  const adjustedX = x !== undefined ? x : this._store.state.copiedObjects.translateX + 25 / this._store.state.scale;
1874
1906
  const adjustedY = y !== undefined ? y : this._store.state.copiedObjects.translateY + 25 / this._store.state.scale;
1875
1907
  this._store.state.copiedObjects.updatePosition(adjustedX, adjustedY);
1908
+ this._store.state.copiedObjects.updateZIndices(this._store.currentZIndex);
1876
1909
  const activeWorkspace = this._store.state.activeWorkspace;
1877
- this.store.state.copiedObjects.updateWorkspaceId(activeWorkspace.id);
1878
- this.store.state.copiedObjects.updateZIndices(this.store.currentZIndex);
1910
+ if (this.store.state.copiedObjects.workspaceId !== activeWorkspace.id) {
1911
+ this.store.state.copiedObjects.updateWorkspaceId(activeWorkspace.id);
1912
+ if (x !== undefined && y !== undefined) {
1913
+ this._store.state.copiedObjects.updatePosition(x, y);
1914
+ }
1915
+ else {
1916
+ this.store.state.copiedObjects.centerInViewport();
1917
+ }
1918
+ this.engine.viewport.centerFitInViewport(copiedObjects);
1919
+ }
1879
1920
  const commands = [];
1880
1921
  let previousSelectionGroup = null;
1881
1922
  if (this._store.state.selectionGroup !== null) {
@@ -1886,13 +1927,14 @@ class KritzelCore {
1886
1927
  const addCopiedObjectsAsSelectionGroupCommand = new AddSelectionGroupCommand(this, this, this._store.state.copiedObjects, previousSelectionGroup);
1887
1928
  commands.push(...addCopiedObjectsCommands, addCopiedObjectsAsSelectionGroupCommand);
1888
1929
  this.history.executeCommand(new BatchCommand(this, this, commands));
1889
- this._store.setState('isSelecting', false);
1890
- this._store.setState('copiedObjects', this._store.state.selectionGroup.copy());
1930
+ this._store.state.isSelecting = false;
1931
+ this._store.state.copiedObjects = this._store.state.selectionGroup.copy();
1891
1932
  this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
1892
1933
  }
1893
1934
  bringForward(object) {
1894
- const max = this._store.allObjects.length + 1;
1895
1935
  const objects = object ? [object] : this._store.state.selectionGroup.objects;
1936
+ const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
1937
+ const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;
1896
1938
  const increaseZIndexCommands = objects.map(obj => {
1897
1939
  if (obj.zIndex === max) {
1898
1940
  return;
@@ -1902,8 +1944,9 @@ class KritzelCore {
1902
1944
  this.history.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));
1903
1945
  }
1904
1946
  sendBackward(object) {
1905
- const min = 0;
1906
1947
  const objects = object ? [object] : this._store.state.selectionGroup.objects;
1948
+ const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
1949
+ const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;
1907
1950
  const decreaseZIndexCommands = objects.map(obj => {
1908
1951
  if (obj.zIndex === min) {
1909
1952
  return;
@@ -1913,16 +1956,18 @@ class KritzelCore {
1913
1956
  this.history.executeCommand(new BatchCommand(this, this, decreaseZIndexCommands));
1914
1957
  }
1915
1958
  bringToFront(object) {
1916
- const max = Math.max(...this._store.allObjects.map(obj => obj.zIndex)) + 1;
1917
1959
  const objects = object ? [object] : this._store.state.selectionGroup.objects;
1960
+ const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
1961
+ const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;
1918
1962
  const increaseZIndexCommands = objects.map(obj => {
1919
1963
  return new UpdateObjectCommand(this, this, obj, { zIndex: max });
1920
1964
  });
1921
1965
  this.history.executeCommand(new BatchCommand(this, this, increaseZIndexCommands));
1922
1966
  }
1923
1967
  sendToBack(object) {
1924
- const min = Math.min(...this._store.allObjects.map(obj => obj.zIndex)) - 1;
1925
1968
  const objects = object ? [object] : this._store.state.selectionGroup.objects;
1969
+ const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);
1970
+ const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;
1926
1971
  const decreaseZIndexCommands = objects.map(obj => {
1927
1972
  return new UpdateObjectCommand(this, this, obj, { zIndex: min });
1928
1973
  });
@@ -1938,7 +1983,7 @@ class KritzelCore {
1938
1983
  selectionGroup.addOrRemove(obj);
1939
1984
  });
1940
1985
  selectionGroup.isSelected = true;
1941
- this._store.setState('selectionGroup', selectionGroup);
1986
+ this._store.state.selectionBox = selectionGroup;
1942
1987
  if (objects.length === 1) {
1943
1988
  selectionGroup.rotation = selectionGroup.objects[0].rotation;
1944
1989
  }
@@ -1955,7 +2000,7 @@ class KritzelCore {
1955
2000
  selectionGroup.addOrRemove(obj);
1956
2001
  });
1957
2002
  selectionGroup.isSelected = true;
1958
- this._store.setState('isSelecting', false);
2003
+ this._store.state.isSelecting = false;
1959
2004
  if (objectsInViewport.length === 1) {
1960
2005
  selectionGroup.rotation = selectionGroup.objects[0].rotation;
1961
2006
  }
@@ -1966,18 +2011,25 @@ class KritzelCore {
1966
2011
  clearSelection() {
1967
2012
  const command = new RemoveSelectionGroupCommand(this, this._store.state.selectionGroup);
1968
2013
  this.history.executeCommand(command);
1969
- this._store.setState('selectionGroup', null);
1970
- this._store.setState('selectionBox', null);
1971
- this._store.setState('isSelecting', false);
1972
- this._store.setState('isResizeHandleSelected', false);
1973
- this._store.setState('isRotationHandleSelected', false);
2014
+ this._store.state.selectionGroup = null;
2015
+ this._store.state.selectionBox = null;
2016
+ this._store.state.isSelecting = false;
2017
+ this._store.state.isResizeHandleSelected = false;
2018
+ this._store.state.isRotationHandleSelected = false;
1974
2019
  this.rerender();
1975
2020
  }
1976
2021
  resetActiveText() {
1977
- if (this._store.state.activeText && this._store.state.activeText.value === ' ') {
1978
- this.deleteObject(this._store.state.activeText.id, true);
2022
+ if (this._store.state.activeText) {
2023
+ if (this._store.state.activeText.isEmpty) {
2024
+ console.log('Deleting empty text object', this._store.state.activeText.id);
2025
+ this.deleteObject(this._store.state.activeText.id, true);
2026
+ }
2027
+ else {
2028
+ console.log('Saving active text object before resetting', this._store.state.activeText.id);
2029
+ this._store.state.activeText.save();
2030
+ }
1979
2031
  }
1980
- this._store.setState('activeText', null);
2032
+ this._store.state.activeText = null;
1981
2033
  }
1982
2034
  getObjectFromPointerEvent(event, selector = '.object') {
1983
2035
  const shadowRoot = this._store.state.host?.shadowRoot;
@@ -2032,7 +2084,7 @@ class KritzelCore {
2032
2084
  }
2033
2085
  }
2034
2086
 
2035
- const kritzelEngineCss = ":host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}textarea{all:unset;box-sizing:border-box;outline:none !important;border:none !important;overflow:visible}.resize-handle-overlay.top-left,.resize-handle-overlay.bottom-right{cursor:nwse-resize}.resize-handle-overlay.top-right,.resize-handle-overlay.bottom-left{cursor:nesw-resize}.rotation-handle-overlay{cursor:grab}";
2087
+ const kritzelEngineCss = ":host{display:block;position:relative;height:100%;width:100%;overflow:hidden;background-color:var(--kritzel-engine-background-color, #ffffff)}:host,:host *{touch-action:none;user-select:none}.ProseMirror{outline:none}p{margin:0;padding:0}.debug-panel{position:absolute;pointer-events:none;top:0;right:0}.origin{position:relative;top:0;left:0;height:0;width:0;pointer-events:none;-webkit-transform-origin:top left;-moz-transform-origin:top left;transform-origin:top left;overflow:visible}.object{overflow:visible}.resize-handle-overlay.top-left,.resize-handle-overlay.bottom-right{cursor:nwse-resize}.resize-handle-overlay.top-right,.resize-handle-overlay.bottom-left{cursor:nesw-resize}.rotation-handle-overlay{cursor:grab}.PlaygroundEditorTheme__quote{margin:0;margin-left:20px;margin-bottom:10px;font-size:15px;color:rgb(101, 103, 107);border-left-color:rgb(206, 208, 212);border-left-width:4px;border-left-style:solid;padding-left:16px}";
2036
2088
 
2037
2089
  const KritzelEngine = class {
2038
2090
  get host() { return getElement(this); }
@@ -2050,10 +2102,10 @@ const KritzelEngine = class {
2050
2102
  if (newValue > ABSOLUTE_SCALE_MAX) {
2051
2103
  console.warn(`scaleMax cannot be greater than ${ABSOLUTE_SCALE_MAX}.`);
2052
2104
  this.scaleMax = ABSOLUTE_SCALE_MAX;
2053
- this.core.store.setState('scaleMax', this.scaleMax);
2105
+ this.core.store.state.scaleMax = this.scaleMax;
2054
2106
  }
2055
2107
  else {
2056
- this.core.store.setState('scaleMax', newValue);
2108
+ this.core.store.state.scaleMax = newValue;
2057
2109
  }
2058
2110
  }
2059
2111
  scaleMin = ABSOLUTE_SCALE_MIN;
@@ -2061,10 +2113,10 @@ const KritzelEngine = class {
2061
2113
  if (newValue < ABSOLUTE_SCALE_MIN) {
2062
2114
  console.warn(`scaleMin cannot be less than ${ABSOLUTE_SCALE_MIN}.`);
2063
2115
  this.scaleMin = ABSOLUTE_SCALE_MIN;
2064
- this.core.store.setState('scaleMin', this.scaleMin);
2116
+ this.core.store.state.scaleMin = this.scaleMin;
2065
2117
  }
2066
2118
  else {
2067
- this.core.store.setState('scaleMin', newValue);
2119
+ this.core.store.state.scaleMin = newValue;
2068
2120
  }
2069
2121
  }
2070
2122
  isEngineReady;
@@ -2171,11 +2223,11 @@ const KritzelEngine = class {
2171
2223
  tool?.onActivate();
2172
2224
  }
2173
2225
  async disable() {
2174
- this.core.store.setState('isEnabled', false);
2226
+ this.core.store.state.isEnabled = false;
2175
2227
  this.core.rerender();
2176
2228
  }
2177
2229
  async enable() {
2178
- this.core.store.setState('isEnabled', true);
2230
+ this.core.store.state.isEnabled = true;
2179
2231
  this.core.rerender();
2180
2232
  }
2181
2233
  async delete() {
@@ -2207,10 +2259,10 @@ const KritzelEngine = class {
2207
2259
  }
2208
2260
  async hideContextMenu() {
2209
2261
  this.core.store.state.pointers.clear();
2210
- this.core.store.setState('isContextMenuVisible', false);
2211
- this.core.store.setState('selectionBox', null);
2212
- this.core.store.setState('isSelecting', false);
2213
- this.core.store.setState('isEnabled', true);
2262
+ this.core.store.state.isContextMenuVisible = false;
2263
+ this.core.store.state.selectionBox = null;
2264
+ this.core.store.state.isSelecting = false;
2265
+ this.core.store.state.isEnabled = true;
2214
2266
  this.core.rerender();
2215
2267
  }
2216
2268
  async getObjectById(id) {
@@ -2317,7 +2369,7 @@ const KritzelEngine = class {
2317
2369
  await this.core.initializeWorkspace(this.workspace);
2318
2370
  this._registerStateChangeListeners();
2319
2371
  if (this.core.store.state.isReady === false) {
2320
- this.core.store.setState('isReady', true);
2372
+ this.core.store.state.isReady = true;
2321
2373
  this.isEngineReady.emit(this.core.store.state);
2322
2374
  }
2323
2375
  }
@@ -2328,8 +2380,8 @@ const KritzelEngine = class {
2328
2380
  if (!(activeTool instanceof KritzelSelectionTool)) {
2329
2381
  this.core.clearSelection();
2330
2382
  }
2331
- this.core.store.setState('skipContextMenu', false);
2332
- this.core.store.setState('copiedObjects', null);
2383
+ this.core.store.state.skipContextMenu = false;
2384
+ this.core.store.state.copiedObjects = null;
2333
2385
  this.activeToolChange.emit(activeTool);
2334
2386
  KritzelKeyboardHelper.forceHideKeyboard();
2335
2387
  }
@@ -2338,7 +2390,9 @@ const KritzelEngine = class {
2338
2390
  const baseHandleSizePx = computedStyle.getPropertyValue('--kritzel-selection-handle-size').trim() || '6px';
2339
2391
  const baseHandleSize = parseFloat(baseHandleSizePx);
2340
2392
  const baseHandleTouchSize = baseHandleSize * 2 < 14 ? 14 : baseHandleSize;
2341
- return (h(Host, { key: 'b65542448b46000bfb0f467b503b2c9d9e603eaa' }, h("div", { key: '8197e8fe5e768f89d5861cc04d4343d5753b8f88', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '97b720f029fb8034453f28df04779011d641105e' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: 'e4601378a7d3dc92e66edcd5b7ff0022f890c1e3' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '2506d664411df86fd4d59ee703dc1487c7394f15' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: 'cada25c03ba66f54433cd09b83d9826f79c94c43' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '91853038c5c83116e9ffc296e9acc3b525bbed21' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '0d3f9d47a5c5f9adab73a44436b214b537f5dd57' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '079f2314aed15ea9b95ace2be564ff8e0f60acaa' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '7d83d8ef32077e9b8d3bd1ddf23e5e1bcb187d0c' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: 'a63d135300e0a24b20e4ea4b631e123a0c492947' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '258d3b009ea75024fc0d2d06000c7c4228312640' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'c4dcff04abf12c675d995bad82407d0f5047ebd7' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: 'fcd7bc6d221d0d3eb294ec7f6526a604ccc539d2' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '416ac549246b7a43bf644c536acbff1fb292eb52' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '7d061a0515e33ce836bb550250330c4e2819bc14' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '1debb3ee3e6a8297d427d09f61c8df8827bcfa37' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '7d0fbcbc3e4c40ba21d144afd7d7b56b14227ddc' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: '90f5c8d1cf60eb90bb5d136d3457a97d831e361c' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '122a2ad39d27d6f242a286bb2a8298687ab8cbb2' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'f5515be35f5037ec256198f2f916c61b78ab4ec2' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '2c16ecb22f4063450ef7d17be93ec1a0434a5abd' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '69b531a94a9b7430d70ce80ef3247211c67a516e' }, "SelectedObjects: ", this.core.store.state.selectionGroup?.objects.length || 0)), h("div", { key: '52b6e44b6fb2b59743f3c48fb1cc2616b19308c7', id: "origin", class: "origin", style: {
2393
+ const viewportCenterX = this.core.store.state.viewportWidth / 2 + this.core.store.state.translateX;
2394
+ const viewportCenterY = this.core.store.state.viewportHeight / 2 + this.core.store.state.translateY;
2395
+ return (h(Host, { key: 'caabd1ecbf2faccdf7fa50d087a8957df4dd1039' }, h("div", { key: 'd757e7133ed9dd190c17c383fb716f760f2b3906', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '00ced12dd956b6eecff7ac80429c0fd05cc7d1c3' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '771f3269627fbe1ef962027f017cf6bdec7bcf8f' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '0e49a60afdfb776a61f46b53bd6488786778bf77' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: 'e0438479bc9e950ef2cbe88ed0aa0b8ec1888890' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '41d7261ed6b893a97fefb4bb6b199ffea51bd5fe' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '7b6470008968eeebc5097252b3b9e3d172fd5d22' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '4012ebdc3234ee2775021b38f385dfa0917736cb' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '964d26a0ff4ff93dfa1cc928330c4fbdb0ec9b3d' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: 'cd68a81778d3e0f83f9453cd813538b2223541e8' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '2ea80f3b4216a5e3d727c6c94d8b1782fbde80eb' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '02966d69182e95a8e91d5252f3dcfc19237caafd' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '85c06265f3af2b793d1827a40bb74b8837690ce3' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '1a2847a815fabc37cae3b7659844975df0c79a81' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: 'd1482aa165ed6b430ec0e640971c47e233103e87' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '3534e455918183d822374edbc80b621939100bd1' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '7b061a4b08956660ee305316eea2e1d13d66d5de' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: '61998d0f4ffc65f5bb155dfe434a3a07667ca5ee' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'bdaeb0af59e844351eb46caf7bbe7e246174ccfe' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '47518514eb67c486583ee61e6747104b4720924a' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '9b2ef1c30ecb09bc7df7f765e099f87ea836d697' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '72a65218942809918fb5fa1978af83f9442c3ed8' }, "SelectedObjects: ", this.core.store.state.selectionGroup?.objects.length || 0), h("div", { key: '1f2ad6b79f28306becd7e83f21ca877c7d15941d' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: 'ae8afa17ce2a1c0a06a3579091d6f1616fe9b9a7', id: "origin", class: "origin", style: {
2342
2396
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
2343
2397
  } }, this.core.store.state.objectsMap.allObjects()?.map(object => {
2344
2398
  return (h("div", { key: object.id, style: {
@@ -2376,22 +2430,16 @@ const KritzelEngine = class {
2376
2430
  height: '100%',
2377
2431
  userSelect: 'none',
2378
2432
  pointerEvents: 'none',
2379
- }, draggable: false, onDragStart: e => e.preventDefault() })), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("textarea", { ref: el => (el ? object.mount(el) : object.unmount()), value: object.value, onKeyDown: event => object.handleKeyDown(event), onInput: event => object.handleInput(event), rows: object.rows, style: {
2380
- width: '100%',
2381
- height: '100%',
2382
- color: object.fontColor,
2383
- fontSize: object.fontSize?.toString() + 'px',
2384
- fontFamily: object.fontFamily,
2385
- border: 'none',
2386
- outline: 'none',
2387
- resize: 'none',
2388
- overflow: 'hidden',
2389
- display: 'block',
2390
- padding: '1px',
2391
- whiteSpace: 'nowrap',
2392
- pointerEvents: object.isReadonly ? 'none' : 'auto',
2393
- cursor: object.isReadonly ? 'default' : 'text',
2394
- caretColor: object.isReadonly ? 'transparent' : 'auto',
2433
+ }, draggable: false, onDragStart: e => e.preventDefault() })), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("div", { ref: el => (el ? object.mount(el) : object.unmount()), onPointerDown: e => object.handlePointerDown(e), onPointerMove: e => object.handlePointerMove(e), onPointerUp: e => object.handlePointerUp(e), style: {
2434
+ minWidth: object.initialWidth + 'px',
2435
+ minHeight: object.initialHeight + 'px',
2436
+ maxWidth: '500px',
2437
+ height: 'auto',
2438
+ width: 'max-content',
2439
+ transformOrigin: 'top left',
2440
+ transform: `scale(${object.scaleFactor})`,
2441
+ backgroundColor: object.backgroundColor,
2442
+ overflow: 'visible'
2395
2443
  } })), KritzelClassHelper.isInstanceOf(object, 'KritzelCustomElement') && (h("div", { ref: el => (el ? object.mount(el) : object.unmount()), style: {
2396
2444
  width: '100%',
2397
2445
  height: '100%',
@@ -2457,7 +2505,7 @@ const KritzelEngine = class {
2457
2505
  transform: this.core.store.state.currentPath?.transformationMatrix,
2458
2506
  transformOrigin: 'top left',
2459
2507
  overflow: 'visible',
2460
- }, viewBox: this.core.store.state.currentPath?.viewBox }, h("path", { key: '2fa37f509acc3573049fc01f22e41fdda6e4acd9', d: this.core.store.state.currentPath?.d, fill: this.core.store.state.currentPath?.fill, stroke: this.core.store.state.currentPath?.stroke }))), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: 'a17f9ff108cf509f3d6e20fc434cffb7a4d72530', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.state.selectionGroup?.objects || [], style: {
2508
+ }, viewBox: this.core.store.state.currentPath?.viewBox }, h("path", { key: '9428a1401021b38b8b811fd68af9e24d53301c08', d: this.core.store.state.currentPath?.d, fill: this.core.store.state.currentPath?.fill, stroke: this.core.store.state.currentPath?.stroke }))), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '1ccc963df66e4210886717644503be6304c6c99f', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.state.selectionGroup?.objects || [], style: {
2461
2509
  position: 'fixed',
2462
2510
  left: `${this.core.store.state.contextMenuX}px`,
2463
2511
  top: `${this.core.store.state.contextMenuY}px`,
@@ -2468,7 +2516,7 @@ const KritzelEngine = class {
2468
2516
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
2469
2517
  }, this.core.store.state.selectionGroup?.objects);
2470
2518
  this.hideContextMenu();
2471
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'a22fa1dba0442fa77a7660ca230d4bb0236e10ea', core: this.core })));
2519
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '9b51e52c76f21be679491c21d1921d389d6619fc', core: this.core })));
2472
2520
  }
2473
2521
  static get watchers() { return {
2474
2522
  "workspace": ["onWorkspaceChange"],
@@ -2488,7 +2536,7 @@ const KritzelFont = class {
2488
2536
  size = 24;
2489
2537
  color = '#000000';
2490
2538
  render() {
2491
- return (h(Host, { key: '0d0f0f75b64f579ca236950334fafde7f0ef2a38' }, h("div", { key: 'e71524879ded9727891bdd43f1a41ae5eef49175', class: "font-preview", style: {
2539
+ return (h(Host, { key: '0a6f1d1326e9dde84a4122d79f75dc1c75ffe0fb' }, h("div", { key: '88a342d01c4150cd4fc5dacca23f7b9904edca52', class: "font-preview", style: {
2492
2540
  fontFamily: this.fontFamily,
2493
2541
  fontSize: `${this.size}px`,
2494
2542
  color: this.color
@@ -2535,7 +2583,7 @@ const KritzelFontFamily = class {
2535
2583
  label: option.label,
2536
2584
  style: { fontFamily: option.value },
2537
2585
  }));
2538
- return (h(Host, { key: 'd05a099adf8623b8c67d68f3861c1cd401e86e2c' }, h("kritzel-dropdown", { key: 'b95af194feaaf5748bb0d584617d217e4b3b8180', options: dropdownOptions, value: this.selectedFontFamily, onValueChanged: this.handleDropdownValueChange, selectStyles: { fontFamily: this.selectedFontFamily } }, h("button", { key: '04a0a72f9297dc6c34a2a2019cae111d8725bcf4', class: "font-style-button", slot: "suffix" }, "B"), h("button", { key: 'f14b59f29bcce33f890b74c1fb8d1dad0ad6fd31', class: "font-style-button italic-text", slot: "suffix" }, "I"))));
2586
+ return (h(Host, { key: '27d14ddb4a57b9cd7b936047b6ea6a9251a1ab27' }, h("kritzel-dropdown", { key: '20ea042c9a907dc1ac5e16a589a8856f87389e36', options: dropdownOptions, value: this.selectedFontFamily, onValueChanged: this.handleDropdownValueChange, selectStyles: { fontFamily: this.selectedFontFamily } }, h("button", { key: 'f63fed16477a327aadaeb54feefe35df1780e37d', class: "font-style-button", slot: "suffix" }, "B"), h("button", { key: '13b3089606c2e83b256ed2cec6513a9911016754', class: "font-style-button italic-text", slot: "suffix" }, "I"))));
2539
2587
  }
2540
2588
  };
2541
2589
  KritzelFontFamily.style = kritzelFontFamilyCss;
@@ -2556,7 +2604,7 @@ const KritzelFontSize = class {
2556
2604
  this.sizeChange.emit(size);
2557
2605
  }
2558
2606
  render() {
2559
- return (h(Host, { key: '583659340d8f3bfb2ff6f64f2cd692ac07cb32d6' }, this.sizes.map(size => (h("div", { class: {
2607
+ return (h(Host, { key: '9f3d851d443352f7437116cf91eff8d8de41e322' }, this.sizes.map(size => (h("div", { class: {
2560
2608
  'size-container': true,
2561
2609
  'selected': this.selectedSize === size,
2562
2610
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-font", { fontFamily: this.fontFamily, size: size }))))));
@@ -2651,7 +2699,7 @@ const KritzelMenu = class {
2651
2699
  this.itemCloseChildMenu.emit(event.detail);
2652
2700
  };
2653
2701
  render() {
2654
- return (h(Host, { key: '211bd579000294d9edf6f85f2d7244aebe331191', tabIndex: 0, onClick: e => e.stopPropagation() }, this.openChildMenuItem && h("div", { key: 'b1c397118b1fbac934867677073661a69be1cab1', class: "has-open-child-overlay", onClick: this.onOverlayClick }), this.items.map(item => (h("kritzel-menu-item", { key: item.id, item: item, parent: this.parent, style: { pointerEvents: this.editingMenuItem && !item.isEditing ? 'none' : 'auto' }, onItemSelect: this.handleItemSelect, onItemSave: this.handleSave, onItemCancel: this.handleCancel, onItemToggleChildMenu: this.handleToggleChildMenu, onItemCloseChildMenu: this.handleCloseChildMenu })))));
2702
+ return (h(Host, { key: 'be122cb0ecff3227d9e69997de76a73940a61860', tabIndex: 0, onClick: e => e.stopPropagation() }, this.openChildMenuItem && h("div", { key: 'ae10bec61e5c5e1a29b444cb7378f15c6692f3b6', class: "has-open-child-overlay", onClick: this.onOverlayClick }), this.items.map(item => (h("kritzel-menu-item", { key: item.id, item: item, parent: this.parent, style: { pointerEvents: this.editingMenuItem && !item.isEditing ? 'none' : 'auto' }, onItemSelect: this.handleItemSelect, onItemSave: this.handleSave, onItemCancel: this.handleCancel, onItemToggleChildMenu: this.handleToggleChildMenu, onItemCloseChildMenu: this.handleCloseChildMenu })))));
2655
2703
  }
2656
2704
  };
2657
2705
  KritzelMenu.style = kritzelMenuCss;
@@ -2752,12 +2800,12 @@ const KritzelMenuItem = class {
2752
2800
  ];
2753
2801
  }
2754
2802
  render() {
2755
- return (h(Host, { key: 'a35e1e3427568f436a36b43ba87af3710a4e83c5', tabIndex: this.item.isDisabled ? -1 : 0, class: {
2803
+ return (h(Host, { key: '9df3acdaff753e3ed910f848c98e8ad73e2b5f5c', tabIndex: this.item.isDisabled ? -1 : 0, class: {
2756
2804
  'selected': this.item.isSelected,
2757
2805
  'editing': this.item.isEditing,
2758
2806
  'disabled': this.item.isDisabled,
2759
2807
  'child-open': this.item.isChildMenuOpen,
2760
- }, onClick: this.handleItemSelect }, h("div", { key: '42eef5a16b9b164839c1fe133e38ecb505c07632', class: "menu-item-overlay" }), this.item.isEditing ? this.renderEditMode() : this.renderViewMode()));
2808
+ }, onClick: this.handleItemSelect }, h("div", { key: 'bb73e5c0c3dd87efabcaa0b53d20c7c477b34aa1', class: "menu-item-overlay" }), this.item.isEditing ? this.renderEditMode() : this.renderViewMode()));
2761
2809
  }
2762
2810
  static get watchers() { return {
2763
2811
  "item": ["onItemChange"]
@@ -2998,7 +3046,7 @@ const KritzelPortal = class {
2998
3046
  this.portal.style.left = `${left}px`;
2999
3047
  }
3000
3048
  render() {
3001
- return (h(Host, { key: 'a906e21c1257dfc6ed21257cce150db17048f04e', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '972544f2258f8b6dc8c691f3762d5ba806a57c41' })));
3049
+ return (h(Host, { key: '9c5cdf7126ff1148dd2364cce9d2524862e27d13', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '209a77246fedcea0c24882605487452ff5cc62ce' })));
3002
3050
  }
3003
3051
  static get watchers() { return {
3004
3052
  "anchor": ["anchorChanged"]
@@ -3098,7 +3146,7 @@ const KritzelSplitButton = class {
3098
3146
  this.menuScrollTop = event.target.scrollTop;
3099
3147
  };
3100
3148
  render() {
3101
- return (h(Host, { key: 'd18a70b94e3d6860dfac952b26f66e5b96cc6fa0', class: { mobile: this.isTouchDevice } }, h("button", { key: 'ee65221543fd8984f94d0a0b43beb7e1d28411f2', class: "split-main-button", tabIndex: 0, onClick: this.handleButtonClick, disabled: this.mainButtonDisabled }, this.buttonIcon && h("kritzel-icon", { key: '1dbdd1e4db4087564464e9586e91b48f80b88aae', name: this.buttonIcon })), h("div", { key: '78b5e0589e7a3dd0592fb2c1cdaae8732f57b129', class: "split-divider" }), h("button", { key: 'cfc5d53f06485a927608a99ea491e36b0e993fcc', ref: el => (this.splitMenuButtonRef = el), class: "split-menu-button", tabIndex: 0, onClick: this.toggleMenu, disabled: this.menuButtonDisabled }, h("kritzel-icon", { key: '0e141b614cbfc758f01d21908d846d16bdce586d', name: this.dropdownIcon })), h("kritzel-portal", { key: 'b5def34dcfe5cbbf9641b1218af803937d7a77b6', anchor: this.anchorElement, offsetY: 4, onClose: this.closeMenu }, h("kritzel-menu", { key: '695f6c85a8ecd44f74ecf7752bf77d0caac69e6a', ref: el => (this.menuRef = el), items: this.items, onItemSelect: this.handleItemSelect, onItemSave: this.handleItemSave, onItemCancel: this.handleItemCancel, onItemToggleChildMenu: this.handleItemToggleChildMenu, onItemCloseChildMenu: this.handleItemCloseChildMenu, onClose: this.closeMenu, onScroll: this.handleScroll }))));
3149
+ return (h(Host, { key: '4ff7809dd62c1dd60600fda592aeac43cd9bc74c', class: { mobile: this.isTouchDevice } }, h("button", { key: 'db6485fabcffdd75a25d178aca7b653af499a90c', class: "split-main-button", tabIndex: 0, onClick: this.handleButtonClick, disabled: this.mainButtonDisabled }, this.buttonIcon && h("kritzel-icon", { key: '4001a4e23ef53bec2a578310de8c8b593d7b266c', name: this.buttonIcon })), h("div", { key: '8ff86d3c01a48b06afca77dd066518efa3589cb1', class: "split-divider" }), h("button", { key: 'f1c40edbec3756a7f3681de4e8d0f1981dd312a4', ref: el => (this.splitMenuButtonRef = el), class: "split-menu-button", tabIndex: 0, onClick: this.toggleMenu, disabled: this.menuButtonDisabled }, h("kritzel-icon", { key: '0ddb89976632ae7454e66504f8bab3fd5072c252', name: this.dropdownIcon })), h("kritzel-portal", { key: '64531ffd6ac847fd1a99e32aceefea9f18088992', anchor: this.anchorElement, offsetY: 4, onClose: this.closeMenu }, h("kritzel-menu", { key: 'f3b86cb71e5ba39e8f98e26b3669416e2cdb4802', ref: el => (this.menuRef = el), items: this.items, onItemSelect: this.handleItemSelect, onItemSave: this.handleItemSave, onItemCancel: this.handleItemCancel, onItemToggleChildMenu: this.handleItemToggleChildMenu, onItemCloseChildMenu: this.handleItemCloseChildMenu, onClose: this.closeMenu, onScroll: this.handleScroll }))));
3102
3150
  }
3103
3151
  };
3104
3152
  KritzelSplitButton.style = kritzelSplitButtonCss;
@@ -3118,7 +3166,7 @@ const KritzelStrokeSize = class {
3118
3166
  this.sizeChange.emit(size);
3119
3167
  }
3120
3168
  render() {
3121
- return (h(Host, { key: '001a0ef8408d19532b57a521929c0cba54e99c52' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
3169
+ return (h(Host, { key: '74579e34c23725e22927afe371c1f7925903720a' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
3122
3170
  'size-container': true,
3123
3171
  'selected': this.selectedSize === size,
3124
3172
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-color", { value: '#000000', size: size }))))));
@@ -3195,23 +3243,23 @@ const KritzelTooltip = class {
3195
3243
  }
3196
3244
  }
3197
3245
  render() {
3198
- return (h(Host, { key: '8c3aeff60625f43f129afa70367cdb7a68a4b271', style: {
3246
+ return (h(Host, { key: '72a6356a43a15a7abc9a46b0d22c3c62217791e8', style: {
3199
3247
  position: 'fixed',
3200
3248
  zIndex: '9999',
3201
3249
  transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
3202
3250
  visibility: this.isVisible ? 'visible' : 'hidden',
3203
3251
  left: !this.isMobileView ? `${this.positionX}px` : '50%',
3204
3252
  marginBottom: `${this.offsetY + this.arrowSize}px`,
3205
- } }, h("div", { key: 'b22b606c2a836c2c9bbe21c6b470754753ccb309', class: "tooltip-content", onClick: event => event.stopPropagation() }, h("slot", { key: '783403f4b5560012c9f6bd184a8c5eb26428e148' }), h("div", { key: 'bb98400edc5c6e05fd4ed2a476a5821f93964b8e', class: "tooltip-arrow-wrapper", style: {
3253
+ } }, h("div", { key: '75f5350f23ada0eee009279eddd7d25273ad3740', class: "tooltip-content", onClick: event => event.stopPropagation() }, h("slot", { key: 'ad999154289e933cac1fdc13392de2aec78811a8' }), h("div", { key: '6be3f5c24d42898920c339be2cd2f3dd8a82fa80', class: "tooltip-arrow-wrapper", style: {
3206
3254
  position: 'fixed',
3207
3255
  left: this.arrowOffset,
3208
3256
  bottom: `-${this.arrowSize * 2}px`,
3209
- } }, h("div", { key: '850a058d635113a7870f25fa288a6447394c53ed', class: "tooltip-arrow", style: {
3257
+ } }, h("div", { key: '37397c6245dd6b0def23e2611d118e0c4f5860ef', class: "tooltip-arrow", style: {
3210
3258
  borderLeft: `${this.arrowSize}px solid transparent`,
3211
3259
  borderRight: `${this.arrowSize}px solid transparent`,
3212
3260
  borderTop: `${this.arrowSize}px solid var(--kritzel-controls-tooltip-background-color, #ffffff)`,
3213
3261
  filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2))',
3214
- } }), h("div", { key: 'bbb3dc2673e2dfe4443ad80540dfc9e5a25c6c06', class: "tooltip-arrow-rect", style: {
3262
+ } }), h("div", { key: 'dbf009c371d46ef0a36e27771758c66e817d9b22', class: "tooltip-arrow-rect", style: {
3215
3263
  position: 'relative',
3216
3264
  width: `${this.arrowSize * 2}px`,
3217
3265
  height: `${this.arrowSize}px`,
@@ -3247,7 +3295,7 @@ const KritzelUtilityPanel = class {
3247
3295
  this.redo.emit();
3248
3296
  }
3249
3297
  render() {
3250
- return (h(Host, { key: '8109ccff01374c046d057021dfbcabdc632d829f' }, h("button", { key: '0d51cfb401974edf1a2a8810d2244f8a977c347f', class: "utility-button", onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '1d13ee6bbf060402e0b1349d41b728875314e2e5', name: "undo" })), h("button", { key: 'f2fe59e7c99cb1550052088b507313cfaed72f29', class: "utility-button", onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: '74bf8c20f61144ab4abc5804dcd8f39917d2c966', name: "redo" })), h("div", { key: '0c9a942e786425b32e984fefdc97b1abb5077997', class: "utility-separator" }), h("button", { key: '44ca9340c2f73212332e9b3ed93ed93b8f7c6944', class: "utility-button" }, h("kritzel-icon", { key: '7b4c3d9a105e0c25b5bbc11ff1bc1cbed9833e03', name: "delete", onClick: () => this.delete.emit() }))));
3298
+ return (h(Host, { key: '8e2eb13668d8787827b10cee7c9daf2abdecc2c6' }, h("button", { key: '0773e7ef81bc972ba589333f4ac7e85d98737770', class: "utility-button", onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: 'fa69c1a2535d44bfb871a4d719079d0f900cc6c7', name: "undo" })), h("button", { key: 'edc28968f3ec92467d6b4aaa095a71770413d657', class: "utility-button", onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'd4cf72e2bda411fe9942d473c5e1ceae62a76074', name: "redo" })), h("div", { key: '8927237c6099a147495564657cdef97e7d35d7c1', class: "utility-separator" }), h("button", { key: 'e089819f7dd870165130322c3c4a9d754d4ed023', class: "utility-button" }, h("kritzel-icon", { key: 'a143770d1b3f8fdbe5c5b36c5d7eaab511cd8a4b', name: "delete", onClick: () => this.delete.emit() }))));
3251
3299
  }
3252
3300
  };
3253
3301
  KritzelUtilityPanel.style = kritzelUtilityPanelCss;