kritzel-stencil 0.0.139 → 0.0.140

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 (159) hide show
  1. package/dist/cjs/{index-DgZMn9B_.js → index-Clh2g9JM.js} +162 -103
  2. package/dist/cjs/index-Clh2g9JM.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/kritzel-color_22.cjs.entry.js +182 -135
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/stencil.cjs.js +1 -1
  7. package/dist/collection/classes/commands/add-selection-group.command.js +4 -4
  8. package/dist/collection/classes/commands/add-selection-group.command.js.map +1 -1
  9. package/dist/collection/classes/commands/move-selection-group.command.js +2 -2
  10. package/dist/collection/classes/commands/move-selection-group.command.js.map +1 -1
  11. package/dist/collection/classes/commands/remove-selection-group.command.js +2 -2
  12. package/dist/collection/classes/commands/remove-selection-group.command.js.map +1 -1
  13. package/dist/collection/classes/commands/resize-selection-group.command.js +2 -2
  14. package/dist/collection/classes/commands/resize-selection-group.command.js.map +1 -1
  15. package/dist/collection/classes/commands/rotate-selection-group.command.js +2 -2
  16. package/dist/collection/classes/commands/rotate-selection-group.command.js.map +1 -1
  17. package/dist/collection/classes/commands/update-viewport.command.js +6 -6
  18. package/dist/collection/classes/commands/update-viewport.command.js.map +1 -1
  19. package/dist/collection/classes/core/core.class.js +43 -27
  20. package/dist/collection/classes/core/core.class.js.map +1 -1
  21. package/dist/collection/classes/core/history.class.js +3 -3
  22. package/dist/collection/classes/core/history.class.js.map +1 -1
  23. package/dist/collection/classes/core/store.class.js +4 -1
  24. package/dist/collection/classes/core/store.class.js.map +1 -1
  25. package/dist/collection/classes/core/viewport.class.js +63 -44
  26. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  27. package/dist/collection/classes/handlers/context-menu.handler.js +16 -8
  28. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
  29. package/dist/collection/classes/handlers/key.handler.js +2 -2
  30. package/dist/collection/classes/handlers/key.handler.js.map +1 -1
  31. package/dist/collection/classes/handlers/move.handler.js +30 -8
  32. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  33. package/dist/collection/classes/handlers/resize.handler.js +6 -6
  34. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  35. package/dist/collection/classes/handlers/rotation.handler.js +6 -6
  36. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  37. package/dist/collection/classes/handlers/selection.handler.js +56 -28
  38. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  39. package/dist/collection/classes/objects/base-object.class.js +9 -3
  40. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  41. package/dist/collection/classes/objects/selection-group.class.js +3 -1
  42. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  43. package/dist/collection/classes/objects/text.class.js +5 -4
  44. package/dist/collection/classes/objects/text.class.js.map +1 -1
  45. package/dist/collection/classes/tools/brush-tool.class.js +16 -16
  46. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  47. package/dist/collection/classes/tools/eraser-tool.class.js +4 -4
  48. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  49. package/dist/collection/classes/tools/selection-tool.class.js +7 -7
  50. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  51. package/dist/collection/classes/tools/text-tool.class.js +6 -6
  52. package/dist/collection/classes/tools/text-tool.class.js.map +1 -1
  53. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  54. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +1 -1
  55. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +18 -16
  56. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  57. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  58. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  59. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  60. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  61. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  62. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  63. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  64. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  65. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  66. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  67. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  68. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  69. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  70. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  71. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  72. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  73. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js +1 -1
  74. package/dist/collection/components/ui/kritzel-workspace-manager/kritzel-workspace-manager.js.map +1 -1
  75. package/dist/components/index.js +2 -2
  76. package/dist/components/kritzel-color-palette.js +1 -1
  77. package/dist/components/kritzel-color.js +1 -1
  78. package/dist/components/kritzel-context-menu.js +1 -1
  79. package/dist/components/kritzel-control-brush-config.js +1 -1
  80. package/dist/components/kritzel-control-text-config.js +1 -1
  81. package/dist/components/kritzel-controls.js +1 -1
  82. package/dist/components/kritzel-cursor-trail.js +1 -1
  83. package/dist/components/kritzel-editor.js +20 -20
  84. package/dist/components/kritzel-engine.js +1 -1
  85. package/dist/components/kritzel-font-family.js +1 -1
  86. package/dist/components/kritzel-font-size.js +1 -1
  87. package/dist/components/kritzel-font.js +1 -1
  88. package/dist/components/kritzel-menu-item.js +1 -1
  89. package/dist/components/kritzel-menu.js +1 -1
  90. package/dist/components/kritzel-portal.js +1 -1
  91. package/dist/components/kritzel-split-button.js +1 -1
  92. package/dist/components/kritzel-stroke-size.js +1 -1
  93. package/dist/components/kritzel-tooltip.js +1 -1
  94. package/dist/components/kritzel-utility-panel.js +1 -1
  95. package/dist/components/kritzel-workspace-manager.js +1 -1
  96. package/dist/components/{p-DjU7p3od.js → p-BFLXutiB.js} +9 -9
  97. package/dist/components/{p-DjU7p3od.js.map → p-BFLXutiB.js.map} +1 -1
  98. package/dist/components/{p-B7kZ1_RH.js → p-BJZudenH.js} +4 -4
  99. package/dist/components/{p-B7kZ1_RH.js.map → p-BJZudenH.js.map} +1 -1
  100. package/dist/components/{p-B7w19kIk.js → p-BLc8TzcU.js} +7 -7
  101. package/dist/components/{p-B7w19kIk.js.map → p-BLc8TzcU.js.map} +1 -1
  102. package/dist/components/{p-BlPlPpUy.js → p-BQJhnpY3.js} +3 -3
  103. package/dist/components/{p-BlPlPpUy.js.map → p-BQJhnpY3.js.map} +1 -1
  104. package/dist/components/{p-KudVTtHk.js → p-BV5iL9W6.js} +283 -184
  105. package/dist/components/p-BV5iL9W6.js.map +1 -0
  106. package/dist/components/{p-DOPuq6gn.js → p-C-ozL_Es.js} +3 -3
  107. package/dist/components/{p-DOPuq6gn.js.map → p-C-ozL_Es.js.map} +1 -1
  108. package/dist/components/{p-BbGgijCS.js → p-C5sTCwe3.js} +38 -31
  109. package/dist/components/p-C5sTCwe3.js.map +1 -0
  110. package/dist/components/{p-BM9IjvnD.js → p-C7UWRUAy.js} +3 -3
  111. package/dist/components/{p-BM9IjvnD.js.map → p-C7UWRUAy.js.map} +1 -1
  112. package/dist/components/{p-sreNwi0N.js → p-CE_sOMS2.js} +4 -4
  113. package/dist/components/{p-sreNwi0N.js.map → p-CE_sOMS2.js.map} +1 -1
  114. package/dist/components/{p-BPsQrpzN.js → p-D2eJXNMx.js} +6 -6
  115. package/dist/components/{p-BPsQrpzN.js.map → p-D2eJXNMx.js.map} +1 -1
  116. package/dist/components/{p-DCx3703u.js → p-D6FeQRzi.js} +3 -3
  117. package/dist/components/{p-DCx3703u.js.map → p-D6FeQRzi.js.map} +1 -1
  118. package/dist/components/{p-Ddlbt3Bj.js → p-DbmQ5DrU.js} +3 -3
  119. package/dist/components/{p-Ddlbt3Bj.js.map → p-DbmQ5DrU.js.map} +1 -1
  120. package/dist/components/{p-BehchtaT.js → p-Dh61W3GT.js} +6 -6
  121. package/dist/components/{p-BehchtaT.js.map → p-Dh61W3GT.js.map} +1 -1
  122. package/dist/components/{p-CsyM5q2M.js → p-IgPm36bH.js} +4 -4
  123. package/dist/components/{p-CsyM5q2M.js.map → p-IgPm36bH.js.map} +1 -1
  124. package/dist/components/{p-BgpsMYcw.js → p-JYqCBcMd.js} +6 -6
  125. package/dist/components/p-JYqCBcMd.js.map +1 -0
  126. package/dist/components/{p-CHdJi6b4.js → p-SKH0G2nM.js} +16 -16
  127. package/dist/components/{p-CHdJi6b4.js.map → p-SKH0G2nM.js.map} +1 -1
  128. package/dist/components/{p-Db3kxVe2.js → p-bC64Ng59.js} +3 -3
  129. package/dist/components/{p-Db3kxVe2.js.map → p-bC64Ng59.js.map} +1 -1
  130. package/dist/components/{p-BorT6g39.js → p-sHDCqDbD.js} +5 -5
  131. package/dist/components/{p-BorT6g39.js.map → p-sHDCqDbD.js.map} +1 -1
  132. package/dist/components/{p-0iJh9Z6m.js → p-vNnVlsJt.js} +4 -4
  133. package/dist/components/{p-0iJh9Z6m.js.map → p-vNnVlsJt.js.map} +1 -1
  134. package/dist/esm/{index-CxieEK_G.js → index-BAbkwyRx.js} +163 -104
  135. package/dist/esm/index-BAbkwyRx.js.map +1 -0
  136. package/dist/esm/index.js +1 -1
  137. package/dist/esm/kritzel-color_22.entry.js +182 -135
  138. package/dist/esm/loader.js +1 -1
  139. package/dist/esm/stencil.js +1 -1
  140. package/dist/stencil/index.esm.js +1 -1
  141. package/dist/stencil/p-BAbkwyRx.js +2 -0
  142. package/dist/stencil/p-BAbkwyRx.js.map +1 -0
  143. package/dist/stencil/p-fe465059.entry.js +2 -0
  144. package/dist/stencil/p-fe465059.entry.js.map +1 -0
  145. package/dist/stencil/stencil.esm.js +1 -1
  146. package/dist/types/classes/core/store.class.d.ts +2 -1
  147. package/dist/types/classes/core/viewport.class.d.ts +3 -0
  148. package/dist/types/classes/handlers/move.handler.d.ts +2 -0
  149. package/dist/types/classes/handlers/selection.handler.d.ts +3 -0
  150. package/package.json +1 -1
  151. package/dist/cjs/index-DgZMn9B_.js.map +0 -1
  152. package/dist/components/p-BbGgijCS.js.map +0 -1
  153. package/dist/components/p-BgpsMYcw.js.map +0 -1
  154. package/dist/components/p-KudVTtHk.js.map +0 -1
  155. package/dist/esm/index-CxieEK_G.js.map +0 -1
  156. package/dist/stencil/p-CxieEK_G.js +0 -2
  157. package/dist/stencil/p-CxieEK_G.js.map +0 -1
  158. package/dist/stencil/p-ab074e87.entry.js +0 -2
  159. package/dist/stencil/p-ab074e87.entry.js.map +0 -1
@@ -1,5 +1,5 @@
1
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';
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-BAbkwyRx.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
  }
@@ -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,18 @@ 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
2022
  if (this._store.state.activeText && this._store.state.activeText.value === ' ') {
1978
2023
  this.deleteObject(this._store.state.activeText.id, true);
1979
2024
  }
1980
- this._store.setState('activeText', null);
2025
+ this._store.state.activeText = null;
1981
2026
  }
1982
2027
  getObjectFromPointerEvent(event, selector = '.object') {
1983
2028
  const shadowRoot = this._store.state.host?.shadowRoot;
@@ -2050,10 +2095,10 @@ const KritzelEngine = class {
2050
2095
  if (newValue > ABSOLUTE_SCALE_MAX) {
2051
2096
  console.warn(`scaleMax cannot be greater than ${ABSOLUTE_SCALE_MAX}.`);
2052
2097
  this.scaleMax = ABSOLUTE_SCALE_MAX;
2053
- this.core.store.setState('scaleMax', this.scaleMax);
2098
+ this.core.store.state.scaleMax = this.scaleMax;
2054
2099
  }
2055
2100
  else {
2056
- this.core.store.setState('scaleMax', newValue);
2101
+ this.core.store.state.scaleMax = newValue;
2057
2102
  }
2058
2103
  }
2059
2104
  scaleMin = ABSOLUTE_SCALE_MIN;
@@ -2061,10 +2106,10 @@ const KritzelEngine = class {
2061
2106
  if (newValue < ABSOLUTE_SCALE_MIN) {
2062
2107
  console.warn(`scaleMin cannot be less than ${ABSOLUTE_SCALE_MIN}.`);
2063
2108
  this.scaleMin = ABSOLUTE_SCALE_MIN;
2064
- this.core.store.setState('scaleMin', this.scaleMin);
2109
+ this.core.store.state.scaleMin = this.scaleMin;
2065
2110
  }
2066
2111
  else {
2067
- this.core.store.setState('scaleMin', newValue);
2112
+ this.core.store.state.scaleMin = newValue;
2068
2113
  }
2069
2114
  }
2070
2115
  isEngineReady;
@@ -2171,11 +2216,11 @@ const KritzelEngine = class {
2171
2216
  tool?.onActivate();
2172
2217
  }
2173
2218
  async disable() {
2174
- this.core.store.setState('isEnabled', false);
2219
+ this.core.store.state.isEnabled = false;
2175
2220
  this.core.rerender();
2176
2221
  }
2177
2222
  async enable() {
2178
- this.core.store.setState('isEnabled', true);
2223
+ this.core.store.state.isEnabled = true;
2179
2224
  this.core.rerender();
2180
2225
  }
2181
2226
  async delete() {
@@ -2207,10 +2252,10 @@ const KritzelEngine = class {
2207
2252
  }
2208
2253
  async hideContextMenu() {
2209
2254
  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);
2255
+ this.core.store.state.isContextMenuVisible = false;
2256
+ this.core.store.state.selectionBox = null;
2257
+ this.core.store.state.isSelecting = false;
2258
+ this.core.store.state.isEnabled = true;
2214
2259
  this.core.rerender();
2215
2260
  }
2216
2261
  async getObjectById(id) {
@@ -2317,7 +2362,7 @@ const KritzelEngine = class {
2317
2362
  await this.core.initializeWorkspace(this.workspace);
2318
2363
  this._registerStateChangeListeners();
2319
2364
  if (this.core.store.state.isReady === false) {
2320
- this.core.store.setState('isReady', true);
2365
+ this.core.store.state.isReady = true;
2321
2366
  this.isEngineReady.emit(this.core.store.state);
2322
2367
  }
2323
2368
  }
@@ -2328,8 +2373,8 @@ const KritzelEngine = class {
2328
2373
  if (!(activeTool instanceof KritzelSelectionTool)) {
2329
2374
  this.core.clearSelection();
2330
2375
  }
2331
- this.core.store.setState('skipContextMenu', false);
2332
- this.core.store.setState('copiedObjects', null);
2376
+ this.core.store.state.skipContextMenu = false;
2377
+ this.core.store.state.copiedObjects = null;
2333
2378
  this.activeToolChange.emit(activeTool);
2334
2379
  KritzelKeyboardHelper.forceHideKeyboard();
2335
2380
  }
@@ -2338,7 +2383,9 @@ const KritzelEngine = class {
2338
2383
  const baseHandleSizePx = computedStyle.getPropertyValue('--kritzel-selection-handle-size').trim() || '6px';
2339
2384
  const baseHandleSize = parseFloat(baseHandleSizePx);
2340
2385
  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: {
2386
+ const viewportCenterX = (this.core.store.state.viewportWidth / 2) + this.core.store.state.translateX;
2387
+ const viewportCenterY = (this.core.store.state.viewportHeight / 2) + this.core.store.state.translateY;
2388
+ return (h(Host, { key: 'e14b9b0d5ece944a28dbdfd55cd15d3889d344ca' }, h("div", { key: '5bb0cf225392a46c81ccc3fc9cecf08ccf5451dd', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '49c54b5c2cf67a3bf98319a87cc6bf43738e260a' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: 'c094fbdee828a5699901e5ba09981fdd2970533a' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '0b260c50045a2dc90f5131bdec5007c5260f435f' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '36ac3660b4dbc902cc6ec4c042f63b03a8b5f38e' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '4d74e2b8b8df35a8f2423e8210662d614e98c9f3' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '2c583b35f9b975191bd30f5bcc44a847d442a75b' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: 'b8f4de7566c250e637f7fb161ee5d4afcf55a862' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '615063733b8a598d24c090397cbda94196f77861' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '66f5d805c6a824bccef568b137a4674007050a1e' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '91f0313f2cfbc7f123be53d8611d0e5f3cfadfae' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '944af3ec28b0e7dcf4696477adbd3182d2371196' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '82cfb1b949a3612f786a2d41074286996c9b18e7' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '743ced0847a98b34c404216e888fc24445e291d5' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '56f7de0f7eb99ee11f4e9c30f14b961c6498415a' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '41c55a52a4a3cb1a04e0bb0249e7095a57c52f78' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: 'f02fbeae6e0e0cb9aca887314f4a5753712373fa' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: '1ff7b7f138a51c5cc16894483c908f7bde31be40' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '25b4a1c609dc968e70636fcf73d330996a137342' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'd9de8d6553664633a0462130ee71fbbb80984ff4' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '3f7d3604c3da89fc3c98fb4704474d41773a51fa' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: 'e32a4265b7ca234766e4ceb5d98c7898917423ef' }, "SelectedObjects: ", this.core.store.state.selectionGroup?.objects.length || 0), h("div", { key: 'c0d4bd0aab851c1ab4c1b1d2fd99db7397538dcd' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: '47cdf9bd5ae9e88ac39376852b4fcf8ebbf44626', id: "origin", class: "origin", style: {
2342
2389
  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
2390
  } }, this.core.store.state.objectsMap.allObjects()?.map(object => {
2344
2391
  return (h("div", { key: object.id, style: {
@@ -2457,7 +2504,7 @@ const KritzelEngine = class {
2457
2504
  transform: this.core.store.state.currentPath?.transformationMatrix,
2458
2505
  transformOrigin: 'top left',
2459
2506
  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: {
2507
+ }, viewBox: this.core.store.state.currentPath?.viewBox }, h("path", { key: '318e360ef363dd90e613e2bc35233d6b045fe6df', 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: '455cd5c01932246ef318e83934b7869edd063a99', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.state.selectionGroup?.objects || [], style: {
2461
2508
  position: 'fixed',
2462
2509
  left: `${this.core.store.state.contextMenuX}px`,
2463
2510
  top: `${this.core.store.state.contextMenuY}px`,
@@ -2468,7 +2515,7 @@ const KritzelEngine = class {
2468
2515
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
2469
2516
  }, this.core.store.state.selectionGroup?.objects);
2470
2517
  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 })));
2518
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'a70d8765402f0938e9df4c1cc2f8c9a13dfa4445', core: this.core })));
2472
2519
  }
2473
2520
  static get watchers() { return {
2474
2521
  "workspace": ["onWorkspaceChange"],
@@ -2488,7 +2535,7 @@ const KritzelFont = class {
2488
2535
  size = 24;
2489
2536
  color = '#000000';
2490
2537
  render() {
2491
- return (h(Host, { key: '0d0f0f75b64f579ca236950334fafde7f0ef2a38' }, h("div", { key: 'e71524879ded9727891bdd43f1a41ae5eef49175', class: "font-preview", style: {
2538
+ return (h(Host, { key: '0a6f1d1326e9dde84a4122d79f75dc1c75ffe0fb' }, h("div", { key: '88a342d01c4150cd4fc5dacca23f7b9904edca52', class: "font-preview", style: {
2492
2539
  fontFamily: this.fontFamily,
2493
2540
  fontSize: `${this.size}px`,
2494
2541
  color: this.color
@@ -2535,7 +2582,7 @@ const KritzelFontFamily = class {
2535
2582
  label: option.label,
2536
2583
  style: { fontFamily: option.value },
2537
2584
  }));
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"))));
2585
+ 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
2586
  }
2540
2587
  };
2541
2588
  KritzelFontFamily.style = kritzelFontFamilyCss;
@@ -2556,7 +2603,7 @@ const KritzelFontSize = class {
2556
2603
  this.sizeChange.emit(size);
2557
2604
  }
2558
2605
  render() {
2559
- return (h(Host, { key: '583659340d8f3bfb2ff6f64f2cd692ac07cb32d6' }, this.sizes.map(size => (h("div", { class: {
2606
+ return (h(Host, { key: '9f3d851d443352f7437116cf91eff8d8de41e322' }, this.sizes.map(size => (h("div", { class: {
2560
2607
  'size-container': true,
2561
2608
  'selected': this.selectedSize === size,
2562
2609
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-font", { fontFamily: this.fontFamily, size: size }))))));
@@ -2651,7 +2698,7 @@ const KritzelMenu = class {
2651
2698
  this.itemCloseChildMenu.emit(event.detail);
2652
2699
  };
2653
2700
  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 })))));
2701
+ 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
2702
  }
2656
2703
  };
2657
2704
  KritzelMenu.style = kritzelMenuCss;
@@ -2752,12 +2799,12 @@ const KritzelMenuItem = class {
2752
2799
  ];
2753
2800
  }
2754
2801
  render() {
2755
- return (h(Host, { key: 'a35e1e3427568f436a36b43ba87af3710a4e83c5', tabIndex: this.item.isDisabled ? -1 : 0, class: {
2802
+ return (h(Host, { key: '9df3acdaff753e3ed910f848c98e8ad73e2b5f5c', tabIndex: this.item.isDisabled ? -1 : 0, class: {
2756
2803
  'selected': this.item.isSelected,
2757
2804
  'editing': this.item.isEditing,
2758
2805
  'disabled': this.item.isDisabled,
2759
2806
  'child-open': this.item.isChildMenuOpen,
2760
- }, onClick: this.handleItemSelect }, h("div", { key: '42eef5a16b9b164839c1fe133e38ecb505c07632', class: "menu-item-overlay" }), this.item.isEditing ? this.renderEditMode() : this.renderViewMode()));
2807
+ }, onClick: this.handleItemSelect }, h("div", { key: 'bb73e5c0c3dd87efabcaa0b53d20c7c477b34aa1', class: "menu-item-overlay" }), this.item.isEditing ? this.renderEditMode() : this.renderViewMode()));
2761
2808
  }
2762
2809
  static get watchers() { return {
2763
2810
  "item": ["onItemChange"]
@@ -2998,7 +3045,7 @@ const KritzelPortal = class {
2998
3045
  this.portal.style.left = `${left}px`;
2999
3046
  }
3000
3047
  render() {
3001
- return (h(Host, { key: 'a906e21c1257dfc6ed21257cce150db17048f04e', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '972544f2258f8b6dc8c691f3762d5ba806a57c41' })));
3048
+ return (h(Host, { key: '9c5cdf7126ff1148dd2364cce9d2524862e27d13', style: { display: this.anchor ? 'block' : 'none' } }, h("slot", { key: '209a77246fedcea0c24882605487452ff5cc62ce' })));
3002
3049
  }
3003
3050
  static get watchers() { return {
3004
3051
  "anchor": ["anchorChanged"]
@@ -3098,7 +3145,7 @@ const KritzelSplitButton = class {
3098
3145
  this.menuScrollTop = event.target.scrollTop;
3099
3146
  };
3100
3147
  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 }))));
3148
+ 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
3149
  }
3103
3150
  };
3104
3151
  KritzelSplitButton.style = kritzelSplitButtonCss;
@@ -3118,7 +3165,7 @@ const KritzelStrokeSize = class {
3118
3165
  this.sizeChange.emit(size);
3119
3166
  }
3120
3167
  render() {
3121
- return (h(Host, { key: '001a0ef8408d19532b57a521929c0cba54e99c52' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
3168
+ return (h(Host, { key: '74579e34c23725e22927afe371c1f7925903720a' }, this.sizes.map(size => (h("div", { tabIndex: 0, class: {
3122
3169
  'size-container': true,
3123
3170
  'selected': this.selectedSize === size,
3124
3171
  }, onClick: () => this.handleSizeClick(size) }, h("kritzel-color", { value: '#000000', size: size }))))));
@@ -3195,23 +3242,23 @@ const KritzelTooltip = class {
3195
3242
  }
3196
3243
  }
3197
3244
  render() {
3198
- return (h(Host, { key: '8c3aeff60625f43f129afa70367cdb7a68a4b271', style: {
3245
+ return (h(Host, { key: '72a6356a43a15a7abc9a46b0d22c3c62217791e8', style: {
3199
3246
  position: 'fixed',
3200
3247
  zIndex: '9999',
3201
3248
  transition: 'opacity 0.3s ease-in-out, transform 0.3s ease-in-out',
3202
3249
  visibility: this.isVisible ? 'visible' : 'hidden',
3203
3250
  left: !this.isMobileView ? `${this.positionX}px` : '50%',
3204
3251
  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: {
3252
+ } }, 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
3253
  position: 'fixed',
3207
3254
  left: this.arrowOffset,
3208
3255
  bottom: `-${this.arrowSize * 2}px`,
3209
- } }, h("div", { key: '850a058d635113a7870f25fa288a6447394c53ed', class: "tooltip-arrow", style: {
3256
+ } }, h("div", { key: '37397c6245dd6b0def23e2611d118e0c4f5860ef', class: "tooltip-arrow", style: {
3210
3257
  borderLeft: `${this.arrowSize}px solid transparent`,
3211
3258
  borderRight: `${this.arrowSize}px solid transparent`,
3212
3259
  borderTop: `${this.arrowSize}px solid var(--kritzel-controls-tooltip-background-color, #ffffff)`,
3213
3260
  filter: 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.2))',
3214
- } }), h("div", { key: 'bbb3dc2673e2dfe4443ad80540dfc9e5a25c6c06', class: "tooltip-arrow-rect", style: {
3261
+ } }), h("div", { key: 'dbf009c371d46ef0a36e27771758c66e817d9b22', class: "tooltip-arrow-rect", style: {
3215
3262
  position: 'relative',
3216
3263
  width: `${this.arrowSize * 2}px`,
3217
3264
  height: `${this.arrowSize}px`,
@@ -3247,7 +3294,7 @@ const KritzelUtilityPanel = class {
3247
3294
  this.redo.emit();
3248
3295
  }
3249
3296
  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() }))));
3297
+ 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
3298
  }
3252
3299
  };
3253
3300
  KritzelUtilityPanel.style = kritzelUtilityPanelCss;