kritzel-stencil 0.0.152 → 0.0.154

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 (140) hide show
  1. package/dist/cjs/{default-text-tool.config-BX6sjin6.js → default-text-tool.config-BySzvIox.js} +69 -40
  2. package/dist/cjs/default-text-tool.config-BySzvIox.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/kritzel-color_22.cjs.entry.js +129 -78
  5. package/dist/cjs/loader.cjs.js +1 -1
  6. package/dist/cjs/stencil.cjs.js +1 -1
  7. package/dist/collection/classes/core/core.class.js +16 -14
  8. package/dist/collection/classes/core/core.class.js.map +1 -1
  9. package/dist/collection/classes/core/store.class.js +8 -8
  10. package/dist/collection/classes/core/store.class.js.map +1 -1
  11. package/dist/collection/classes/core/viewport.class.js +11 -10
  12. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  13. package/dist/collection/classes/handlers/context-menu.handler.js +1 -1
  14. package/dist/collection/classes/handlers/context-menu.handler.js.map +1 -1
  15. package/dist/collection/classes/handlers/move.handler.js +2 -0
  16. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  17. package/dist/collection/classes/handlers/resize.handler.js +2 -0
  18. package/dist/collection/classes/handlers/resize.handler.js.map +1 -1
  19. package/dist/collection/classes/handlers/rotation.handler.js +2 -0
  20. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  21. package/dist/collection/classes/handlers/selection.handler.js +7 -5
  22. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  23. package/dist/collection/classes/objects/base-object.class.js +11 -5
  24. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  25. package/dist/collection/classes/objects/custom-element.class.js +1 -1
  26. package/dist/collection/classes/objects/custom-element.class.js.map +1 -1
  27. package/dist/collection/classes/objects/image.class.js +1 -1
  28. package/dist/collection/classes/objects/image.class.js.map +1 -1
  29. package/dist/collection/classes/objects/path.class.js +14 -5
  30. package/dist/collection/classes/objects/path.class.js.map +1 -1
  31. package/dist/collection/classes/objects/selection-group.class.js +10 -10
  32. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  33. package/dist/collection/classes/objects/text.class.js +5 -4
  34. package/dist/collection/classes/objects/text.class.js.map +1 -1
  35. package/dist/collection/classes/structures/object-map.structure.js +10 -0
  36. package/dist/collection/classes/structures/object-map.structure.js.map +1 -1
  37. package/dist/collection/classes/tools/brush-tool.class.js +8 -6
  38. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  39. package/dist/collection/classes/tools/eraser-tool.class.js +2 -0
  40. package/dist/collection/classes/tools/eraser-tool.class.js.map +1 -1
  41. package/dist/collection/classes/tools/image-tool.class.js +1 -0
  42. package/dist/collection/classes/tools/image-tool.class.js.map +1 -1
  43. package/dist/collection/classes/tools/text-tool.class.js +2 -2
  44. package/dist/collection/classes/tools/text-tool.class.js.map +1 -1
  45. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +60 -4
  46. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  47. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +89 -27
  48. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  49. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.css +0 -5
  50. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.css +0 -3
  51. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.css +0 -2
  52. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.css +0 -1
  53. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.css +0 -4
  54. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.css +0 -4
  55. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +0 -5
  56. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +28 -3
  57. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +1 -1
  58. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.css +8 -2
  59. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +30 -1
  60. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js.map +1 -1
  61. package/dist/collection/configs/default-engine-config.js +1 -2
  62. package/dist/collection/configs/default-engine-config.js.map +1 -1
  63. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  64. package/dist/collection/interfaces/undo-state.interface.js +2 -0
  65. package/dist/collection/interfaces/undo-state.interface.js.map +1 -0
  66. package/dist/components/index.js +3 -3
  67. package/dist/components/kritzel-color-palette.js +1 -1
  68. package/dist/components/kritzel-control-brush-config.js +1 -1
  69. package/dist/components/kritzel-control-text-config.js +1 -1
  70. package/dist/components/kritzel-controls.js +1 -1
  71. package/dist/components/kritzel-editor.js +30 -14
  72. package/dist/components/kritzel-editor.js.map +1 -1
  73. package/dist/components/kritzel-engine.js +1 -1
  74. package/dist/components/kritzel-menu-item.js +1 -1
  75. package/dist/components/kritzel-menu.js +1 -1
  76. package/dist/components/kritzel-split-button.js +1 -1
  77. package/dist/components/kritzel-stroke-size.js +1 -1
  78. package/dist/components/kritzel-utility-panel.js +1 -1
  79. package/dist/components/kritzel-workspace-manager.js +1 -1
  80. package/dist/components/{p-BP71Fape.js → p-1lIHoOlH.js} +14 -12
  81. package/dist/components/p-1lIHoOlH.js.map +1 -0
  82. package/dist/components/{p-BDHz9TkP.js → p-B4kxkVe-.js} +3 -3
  83. package/dist/components/p-B4kxkVe-.js.map +1 -0
  84. package/dist/components/{p-G8Xyn7XV.js → p-BQg4YML7.js} +3 -3
  85. package/dist/components/{p-G8Xyn7XV.js.map → p-BQg4YML7.js.map} +1 -1
  86. package/dist/components/{p-DIp1AvzL.js → p-BfaEHdtM.js} +127 -82
  87. package/dist/components/p-BfaEHdtM.js.map +1 -0
  88. package/dist/components/{p-G2HGJcNm.js → p-CBYBurdY.js} +42 -24
  89. package/dist/components/p-CBYBurdY.js.map +1 -0
  90. package/dist/components/{p-DnOeM6VQ.js → p-CK6no3mi.js} +4 -4
  91. package/dist/components/{p-DnOeM6VQ.js.map → p-CK6no3mi.js.map} +1 -1
  92. package/dist/components/{p-DKVBZiTy.js → p-CsA9M6me.js} +4 -4
  93. package/dist/components/p-CsA9M6me.js.map +1 -0
  94. package/dist/components/{p-CJzBIV7n.js → p-D1uj4A4F.js} +3 -3
  95. package/dist/components/p-D1uj4A4F.js.map +1 -0
  96. package/dist/components/{p-Cqpp9wKT.js → p-DAfkuR8U.js} +8 -5
  97. package/dist/components/p-DAfkuR8U.js.map +1 -0
  98. package/dist/components/{p-CRB1YGoc.js → p-Ddh40W3x.js} +5 -5
  99. package/dist/components/p-Ddh40W3x.js.map +1 -0
  100. package/dist/components/{p-DhDRFCsP.js → p-TdCTkEu0.js} +4 -4
  101. package/dist/components/p-TdCTkEu0.js.map +1 -0
  102. package/dist/esm/{default-text-tool.config-Bcel-KfG.js → default-text-tool.config-2YFQA3SF.js} +69 -40
  103. package/dist/esm/default-text-tool.config-2YFQA3SF.js.map +1 -0
  104. package/dist/esm/index.js +2 -2
  105. package/dist/esm/kritzel-color_22.entry.js +129 -78
  106. package/dist/esm/loader.js +1 -1
  107. package/dist/esm/stencil.js +1 -1
  108. package/dist/stencil/index.esm.js +1 -1
  109. package/dist/stencil/p-2YFQA3SF.js +2 -0
  110. package/dist/stencil/p-2YFQA3SF.js.map +1 -0
  111. package/dist/stencil/p-bb5b2f78.entry.js +10 -0
  112. package/dist/stencil/p-bb5b2f78.entry.js.map +1 -0
  113. package/dist/stencil/stencil.esm.js +1 -1
  114. package/dist/types/classes/core/store.class.d.ts +4 -3
  115. package/dist/types/classes/core/viewport.class.d.ts +1 -0
  116. package/dist/types/classes/objects/path.class.d.ts +1 -0
  117. package/dist/types/classes/structures/object-map.structure.d.ts +2 -0
  118. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +8 -1
  119. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +5 -0
  120. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +2 -0
  121. package/dist/types/components/ui/kritzel-utility-panel/kritzel-utility-panel.d.ts +2 -0
  122. package/dist/types/components.d.ts +28 -0
  123. package/dist/types/interfaces/engine-state.interface.d.ts +1 -2
  124. package/dist/types/interfaces/undo-state.interface.d.ts +6 -0
  125. package/package.json +1 -1
  126. package/dist/cjs/default-text-tool.config-BX6sjin6.js.map +0 -1
  127. package/dist/components/p-BDHz9TkP.js.map +0 -1
  128. package/dist/components/p-BP71Fape.js.map +0 -1
  129. package/dist/components/p-CJzBIV7n.js.map +0 -1
  130. package/dist/components/p-CRB1YGoc.js.map +0 -1
  131. package/dist/components/p-Cqpp9wKT.js.map +0 -1
  132. package/dist/components/p-DIp1AvzL.js.map +0 -1
  133. package/dist/components/p-DKVBZiTy.js.map +0 -1
  134. package/dist/components/p-DhDRFCsP.js.map +0 -1
  135. package/dist/components/p-G2HGJcNm.js.map +0 -1
  136. package/dist/esm/default-text-tool.config-Bcel-KfG.js.map +0 -1
  137. package/dist/stencil/p-76adbc98.entry.js +0 -10
  138. package/dist/stencil/p-76adbc98.entry.js.map +0 -1
  139. package/dist/stencil/p-Bcel-KfG.js +0 -2
  140. package/dist/stencil/p-Bcel-KfG.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-SGde3HXB.js';
2
- import { T as KritzelDevicesHelper, G as KritzelBrushTool, L as KritzelTextTool, U as KritzelMouseButton, M as KritzelSelectionTool, R as DEFAULT_BRUSH_CONFIG, I as KritzelEraserTool, S as DEFAULT_TEXT_CONFIG, J as KritzelImageTool, Q as KritzelWorkspace, V as KritzelKeyboardHelper, W as KritzelBaseHandler, X as KritzelToolRegistry, Y as KritzelSelectionBox, Z as KritzelSelectionGroup, _ as KritzelBaseObject, F as KritzelImage, K as KritzelText, E as KritzelPath, $ as Doc, a0 as DEFAULT_SYNC_CONFIG, a1 as UndoManager, P as KritzelAppStateMap, a2 as ObjectHelper, a3 as KritzelEventHelper, a4 as KritzelBaseTool } from './default-text-tool.config-Bcel-KfG.js';
2
+ import { T as KritzelDevicesHelper, G as KritzelBrushTool, L as KritzelTextTool, U as KritzelMouseButton, M as KritzelSelectionTool, R as DEFAULT_BRUSH_CONFIG, I as KritzelEraserTool, S as DEFAULT_TEXT_CONFIG, J as KritzelImageTool, Q as KritzelWorkspace, V as KritzelKeyboardHelper, W as KritzelBaseHandler, X as KritzelToolRegistry, Y as KritzelSelectionBox, Z as KritzelSelectionGroup, _ as KritzelBaseObject, F as KritzelImage, K as KritzelText, E as KritzelPath, $ as Doc, a0 as DEFAULT_SYNC_CONFIG, a1 as UndoManager, P as KritzelAppStateMap, a2 as ObjectHelper, a3 as KritzelEventHelper, a4 as KritzelBaseTool } from './default-text-tool.config-2YFQA3SF.js';
3
3
 
4
4
  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
5
5
 
@@ -60,7 +60,7 @@ const KritzelColor = class {
60
60
  };
61
61
  KritzelColor.style = kritzelColorCss;
62
62
 
63
- const kritzelColorPaletteCss = ":host{display:flex;align-items:flex-start;gap:8px;padding:8px;width:100%;box-sizing:border-box}.color-grid{width:100%;display:grid;grid-template-columns:repeat(6, 32px);gap:8px;justify-items:center;overflow:hidden;height:40px;transition:height 0.1s ease-in-out}.color-grid.expanded{height:500px}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.color-container:focus-visible{outline:var(--kritzel-color-palette-focus-outline, 2px auto #e3e3e3)}.color-container:hover{background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.color-container.selected{border-color:var(--kritzel-selection-border-color, #007AFF);background-color:var(--kritzel-color-palette-selected-background-color)}";
63
+ const kritzelColorPaletteCss = ":host{display:flex;align-items:flex-start;gap:8px;padding:8px;width:100%;box-sizing:border-box}.color-grid{width:100%;display:grid;grid-template-columns:repeat(6, 32px);gap:8px;justify-items:center;overflow:hidden;height:40px;transition:height 0.1s ease-in-out}.color-grid.expanded{height:500px}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.color-container:hover{background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.color-container.selected{border-color:var(--kritzel-selection-border-color, #007AFF);background-color:var(--kritzel-color-palette-selected-background-color)}";
64
64
 
65
65
  const KritzelColorPalette = class {
66
66
  constructor(hostRef) {
@@ -159,7 +159,7 @@ const KritzelContextMenu = class {
159
159
  };
160
160
  KritzelContextMenu.style = kritzelContextMenuCss;
161
161
 
162
- const kritzelControlBrushConfigCss = ":host{display:flex;flex-direction:column;width:100%}.expand-toggle{background:none;border:none;cursor:pointer;font-size:14px;line-height:1;padding:8px;color:var(--kritzel-color-palette-expand-toggle-color, #666666)}.expand-toggle:focus-visible{outline:var(--kritzel-color-palette-focus-outline, 2px auto #e3e3e3)}.expand-toggle:hover{color:var(--kritzel-color-palette-expand-toggle-hover-color, #333333)}";
162
+ const kritzelControlBrushConfigCss = ":host{display:flex;flex-direction:column;width:100%}.expand-toggle{background:none;border:none;cursor:pointer;font-size:14px;line-height:1;padding:8px;color:var(--kritzel-color-palette-expand-toggle-color, #666666)}.expand-toggle:hover{color:var(--kritzel-color-palette-expand-toggle-hover-color, #333333)}";
163
163
 
164
164
  const KritzelControlBrushConfig = class {
165
165
  constructor(hostRef) {
@@ -247,7 +247,7 @@ const KritzelControlTextConfig = class {
247
247
  };
248
248
  KritzelControlTextConfig.style = kritzelControlTextConfigCss;
249
249
 
250
- const kritzelControlsCss = ":host{display:flex;flex-direction:column;user-select:none}:host(.mobile){--kritzel-controls-control-hover-background-color:transparent;--kritzel-controls-control-active-background-color:transparent}.kritzel-controls{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--kritzel-controls-gap, 8px);height:100%;padding:var(--kritzel-controls-padding, 8px);background-color:var(--kritzel-controls-background-color, #ffffff);border-radius:var(--kritzel-controls-border-radius, 16px);box-shadow:var(--kritzel-controls-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-controls-border, 1px solid #ebebeb);z-index:10000;position:relative}.kritzel-control{display:flex;justify-content:center;align-items:center;color:var(--kritzel-controls-control-color, #000000);border-radius:var(--kritzel-controls-control-border-radius, 12px);padding:var(--kritzel-controls-control-padding, 8px);border:none;outline:none;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent;font-weight:bold}.kritzel-control:focus,.kritzel-control:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control.selected,.kritzel-control.selected:hover,.kritzel-control.selected:active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control.selected:focus{background-color:var(--kritzel-controls-control-selected-background-color, #007bffe3) !important}.kritzel-divider{width:var(--kritzel-controls-divider-width, 1px);height:var(--kritzel-controls-divider-height, 24px);background-color:var(--kritzel-controls-divider-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-config-container{position:relative;display:flex;justify-content:center;align-items:center;width:40px;height:40px;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.kritzel-config{display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:50%}.kritzel-config:focus{outline:var(--kritzel-menu-focus-outline, 2px solid #e3e3e3)}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.font-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.no-config{height:24px;width:24px;border-radius:50%;border:1px dashed gray}kritzel-tooltip{position:fixed;bottom:56px;left:50%;transform:translateX(-50%);z-index:10001}";
250
+ const kritzelControlsCss = ":host{display:flex;flex-direction:column;user-select:none}:host(.mobile){--kritzel-controls-control-hover-background-color:transparent;--kritzel-controls-control-active-background-color:transparent}.kritzel-controls{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;gap:var(--kritzel-controls-gap, 8px);height:100%;padding:var(--kritzel-controls-padding, 8px);background-color:var(--kritzel-controls-background-color, #ffffff);border-radius:var(--kritzel-controls-border-radius, 16px);box-shadow:var(--kritzel-controls-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-controls-border, 1px solid #ebebeb);z-index:10000;position:relative}.kritzel-control{display:flex;justify-content:center;align-items:center;color:var(--kritzel-controls-control-color, #000000);border-radius:var(--kritzel-controls-control-border-radius, 12px);padding:var(--kritzel-controls-control-padding, 8px);border:none;background:none;cursor:pointer;-webkit-tap-highlight-color:transparent;font-weight:bold}.kritzel-control:focus,.kritzel-control:hover{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-control:active{background-color:var(--kritzel-controls-control-active-background-color, hsl(0, 0%, 0%, 8.6%))}.kritzel-control.selected,.kritzel-control.selected:hover,.kritzel-control.selected:active{background-color:var(--kritzel-controls-control-selected-background-color, #007AFF) !important;color:var(--kritzel-controls-control-selected-color, #ffffff) !important}.kritzel-control.selected:focus{background-color:var(--kritzel-controls-control-selected-background-color, #007bffe3) !important}.kritzel-divider{width:var(--kritzel-controls-divider-width, 1px);height:var(--kritzel-controls-divider-height, 24px);background-color:var(--kritzel-controls-divider-background-color, hsl(0, 0%, 0%, 4.3%))}.kritzel-config-container{position:relative;display:flex;justify-content:center;align-items:center;width:40px;height:40px;box-sizing:border-box;-webkit-tap-highlight-color:transparent}.kritzel-config{display:flex;justify-content:center;align-items:center;cursor:pointer;border-radius:50%}.color-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.font-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box;background-color:var(--kritzel-color-palette-hover-background-color, #ebebeb)}.no-config{height:24px;width:24px;border-radius:50%;border:1px dashed gray}kritzel-tooltip{position:fixed;bottom:56px;left:50%;transform:translateX(-50%);z-index:10001}";
251
251
 
252
252
  const KritzelControls = class {
253
253
  constructor(hostRef) {
@@ -258,6 +258,7 @@ const KritzelControls = class {
258
258
  controls = [];
259
259
  activeControl = null;
260
260
  isUtilityPanelVisible = true;
261
+ undoState = null;
261
262
  isControlsReady;
262
263
  firstConfig = null;
263
264
  isTooltipVisible = false;
@@ -350,13 +351,13 @@ const KritzelControls = class {
350
351
  }
351
352
  render() {
352
353
  const hasNoConfig = this.activeControl?.config === undefined || this.activeControl?.config === null;
353
- return (h(Host, { key: 'ab3e5f078d6d197c6e10c9dee180c04ef85281bf', class: {
354
+ return (h(Host, { key: '6ea9de8d541e3fc02c5ceeebf4c2c5fb4d8ad926', class: {
354
355
  mobile: this.isTouchDevice,
355
- } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '290ceb6f2c46eb7e869a4741dd6600bc7c47bbb4', style: {
356
+ } }, this.isUtilityPanelVisible && (h("kritzel-utility-panel", { key: '7506b42f05c3f49aa5c936d267c5de44b3ebb9cd', style: {
356
357
  position: 'absolute',
357
358
  bottom: '56px',
358
359
  left: '12px',
359
- }, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: 'd2590bc56b709e77910e7159296741c8859158d7', class: "kritzel-controls" }, this.controls.map(control => {
360
+ }, undoState: this.undoState, onUndo: () => this.kritzelEngine?.undo(), onRedo: () => this.kritzelEngine?.redo(), onDelete: () => this.kritzelEngine?.delete() })), h("div", { key: '1299fce4adea3f9a529bbaf73d35e2676b6850e4', class: "kritzel-controls" }, this.controls.map(control => {
360
361
  if (control.type === 'tool') {
361
362
  return (h("button", { class: {
362
363
  'kritzel-control': true,
@@ -628,6 +629,8 @@ const KritzelEditor = class {
628
629
  constructor(hostRef) {
629
630
  registerInstance(this, hostRef);
630
631
  this.isReady = createEvent(this, "isReady");
632
+ this.objectsChange = createEvent(this, "objectsChange");
633
+ this.undoStateChange = createEvent(this, "undoStateChange");
631
634
  }
632
635
  get host() { return getElement(this); }
633
636
  scaleMax = ABSOLUTE_SCALE_MAX;
@@ -701,12 +704,15 @@ const KritzelEditor = class {
701
704
  isUtilityPanelVisible = true;
702
705
  syncConfig;
703
706
  isReady;
707
+ objectsChange;
708
+ undoStateChange;
704
709
  isEngineReady = false;
705
710
  isControlsReady = false;
706
711
  isWorkspaceManagerReady = false;
707
712
  workspaces = [];
708
713
  activeWorkspace;
709
714
  isVirtualKeyboardOpen = false;
715
+ undoState = null;
710
716
  onIsEngineReady(newValue) {
711
717
  if (newValue && this.isControlsReady) {
712
718
  this.checkIsReady();
@@ -725,7 +731,7 @@ const KritzelEditor = class {
725
731
  }
726
732
  }
727
733
  }
728
- handleTouchStart(event) {
734
+ onTouchStart(event) {
729
735
  if (event.cancelable) {
730
736
  event.preventDefault();
731
737
  }
@@ -796,6 +802,16 @@ const KritzelEditor = class {
796
802
  this.activeWorkspace = event.detail.activeWorkspace;
797
803
  this.workspaces = event.detail.workspaces;
798
804
  }
805
+ handleWorkspacesChange(event) {
806
+ this.workspaces = event.detail;
807
+ }
808
+ handleObjectsChange(event) {
809
+ this.objectsChange.emit(event.detail);
810
+ }
811
+ handleUndoStateChange(event) {
812
+ this.undoStateChange.emit(event.detail);
813
+ this.undoState = event.detail;
814
+ }
799
815
  registerCustomSvgIcons() {
800
816
  for (const [name, svg] of Object.entries(this.customSvgIcons)) {
801
817
  KritzelIconRegistry.register(name, svg);
@@ -833,7 +849,7 @@ const KritzelEditor = class {
833
849
  }
834
850
  }
835
851
  render() {
836
- return (h(Host, { key: '97ab11381c7ba448814b6b463a3bd9135e5d328f' }, h("kritzel-workspace-manager", { key: '2eb9bb27e0e613537a2ceea4144a7753313d1c78', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-engine", { key: '4c3b68eec1c2e2ac879a6fb34edcefcefdf2cea7', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, 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: 'beef7d08c44673a50184722a8201a12bf4635ce8', 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
+ return (h(Host, { key: '87983fe2d4fcdbf226851190e7529f12e7b5fdbf' }, h("kritzel-workspace-manager", { key: 'a1e0f522a7075ef4e2b5eab47dab5dc77098b402', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-engine", { key: '18e78080712e53ead39ff07e43b7035e43a096f2', ref: el => (this.engineRef = el), workspace: this.activeWorkspace, syncConfig: this.syncConfig, scaleMax: this.scaleMax, scaleMin: this.scaleMin, globalContextMenuItems: this.globalContextMenuItems, objectContextMenuItems: this.objectContextMenuItems, onIsEngineReady: event => this.onEngineReady(event), onWorkspacesChange: event => this.handleWorkspacesChange(event), onObjectsChange: event => this.handleObjectsChange(event), onUndoStateChange: event => this.handleUndoStateChange(event) }), h("kritzel-controls", { key: '5ffaebbbeecbeebab050b3f990d027c6653a1940', class: { 'keyboard-open': this.isVirtualKeyboardOpen }, style: { display: this.isControlsVisible ? 'flex' : 'none' }, ref: el => (this.controlsRef = el), controls: this.controls, isUtilityPanelVisible: this.isUtilityPanelVisible, undoState: this.undoState, onIsControlsReady: () => (this.isControlsReady = true) })));
837
853
  }
838
854
  static get watchers() { return {
839
855
  "isEngineReady": ["onIsEngineReady"],
@@ -18057,6 +18073,7 @@ var lodashExports = requireLodash();
18057
18073
  class KritzelViewport {
18058
18074
  _core;
18059
18075
  _debounceUpdate;
18076
+ _debounceEndScaling;
18060
18077
  initialTouchDistance = 0;
18061
18078
  startX = 0;
18062
18079
  startY = 0;
@@ -18072,6 +18089,10 @@ class KritzelViewport {
18072
18089
  this._debounceUpdate = lodashExports.debounce(() => {
18073
18090
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
18074
18091
  }, 300);
18092
+ this._debounceEndScaling = lodashExports.debounce(() => {
18093
+ this._core.store.state.isScaling = false;
18094
+ this._core.rerender();
18095
+ }, 100);
18075
18096
  }
18076
18097
  handleResize() {
18077
18098
  this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;
@@ -18094,7 +18115,7 @@ class KritzelViewport {
18094
18115
  if (activePointers.length === 2) {
18095
18116
  const currentPath = this._core.store.currentPath;
18096
18117
  if (currentPath) {
18097
- this._core.store.state.objectsMap.remove(obj => obj.id === currentPath.id);
18118
+ this._core.store.state.objects.remove(obj => obj.id === currentPath.id);
18098
18119
  }
18099
18120
  this._core.store.state.isScaling = true;
18100
18121
  const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;
@@ -18174,10 +18195,7 @@ class KritzelViewport {
18174
18195
  }
18175
18196
  if (event.pointerType === 'touch') {
18176
18197
  if (this._core.store.state.pointers.size === 0) {
18177
- setTimeout(() => {
18178
- this._core.store.state.isScaling = false;
18179
- this._core.rerender();
18180
- }, 300);
18198
+ this._debounceEndScaling();
18181
18199
  }
18182
18200
  }
18183
18201
  }
@@ -18216,8 +18234,9 @@ class KritzelViewport {
18216
18234
  const yRelativeToHost = event.clientY - rect.top;
18217
18235
  this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;
18218
18236
  this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;
18219
- 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;
18220
- const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale + delta));
18237
+ const rawScaleFactor = 1 + (event.deltaY * -0.012);
18238
+ const scaleFactor = Math.max(0.8, Math.min(1.2, rawScaleFactor));
18239
+ const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale * scaleFactor));
18221
18240
  const scaleRatio = newScale / this._core.store.state.scale;
18222
18241
  const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);
18223
18242
  const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);
@@ -18227,9 +18246,7 @@ class KritzelViewport {
18227
18246
  this._core.store.state.hasViewportChanged = true;
18228
18247
  this._core.rerender();
18229
18248
  this._debounceUpdate();
18230
- setTimeout(() => {
18231
- this._core.store.state.isScaling = false;
18232
- }, 300);
18249
+ this._debounceEndScaling();
18233
18250
  }
18234
18251
  handlePan(event) {
18235
18252
  const panSpeed = 0.8;
@@ -18316,7 +18333,7 @@ class KritzelContextMenuHandler extends KritzelBaseHandler {
18316
18333
  const selectionTool = this._core.store.state.activeTool;
18317
18334
  selectionTool?.moveHandler?.cancelPendingDrag();
18318
18335
  if (this._core.store.selectionBox) {
18319
- this._core.store.state.objectsMap.remove(object => object instanceof KritzelSelectionBox);
18336
+ this._core.store.state.objects.remove(object => object instanceof KritzelSelectionBox);
18320
18337
  this._core.store.state.isSelecting = false;
18321
18338
  }
18322
18339
  const selectedObject = this._core.getObjectFromPointerEvent(event, '.object');
@@ -18365,7 +18382,7 @@ const DEFAULT_ENGINE_CONFIG = {
18365
18382
  activeWorkspace: null,
18366
18383
  activeTool: null,
18367
18384
  copiedObjects: null,
18368
- objectsMap: null,
18385
+ objects: null,
18369
18386
  resizeHandleType: null,
18370
18387
  hasViewportChanged: false,
18371
18388
  hasObjectsChanged: false,
@@ -18398,7 +18415,6 @@ const DEFAULT_ENGINE_CONFIG = {
18398
18415
  scale: 1,
18399
18416
  scaleMax: 1,
18400
18417
  scaleMin: 1,
18401
- scaleStep: 0.075,
18402
18418
  startX: 0,
18403
18419
  startY: 0,
18404
18420
  translateX: 0,
@@ -18464,7 +18480,7 @@ class KritzelCustomElement extends KritzelBaseObject {
18464
18480
  this.element.style.height = `${height}px`;
18465
18481
  }
18466
18482
  // Update to sync changes to y.js and propagate to other tabs
18467
- this._core.store.state.objectsMap.update(this);
18483
+ this._core.store.state.objects.update(this);
18468
18484
  }
18469
18485
  copy() {
18470
18486
  const copiedObject = Object.create(Object.getPrototypeOf(this));
@@ -18556,6 +18572,14 @@ class KritzelObjectMap {
18556
18572
  get workspaceId() {
18557
18573
  return this._workspaceId;
18558
18574
  }
18575
+ get undoState() {
18576
+ return {
18577
+ canUndo: this._undoManager ? this._undoManager.canUndo() : false,
18578
+ canRedo: this._undoManager ? this._undoManager.canRedo() : false,
18579
+ undoStackSize: this._undoManager ? this._undoManager.undoStack.length : 0,
18580
+ redoStackSize: this._undoManager ? this._undoManager.redoStack.length : 0,
18581
+ };
18582
+ }
18559
18583
  constructor() {
18560
18584
  this.map = new Map();
18561
18585
  }
@@ -18739,11 +18763,13 @@ class KritzelObjectMap {
18739
18763
  undo() {
18740
18764
  if (this._undoManager && this._undoManager.canUndo()) {
18741
18765
  this._undoManager.undo();
18766
+ this._core.engine.emitObjectsChange();
18742
18767
  }
18743
18768
  }
18744
18769
  redo() {
18745
18770
  if (this._undoManager && this._undoManager.canRedo()) {
18746
18771
  this._undoManager.redo();
18772
+ this._core.engine.emitObjectsChange();
18747
18773
  }
18748
18774
  }
18749
18775
  canUndo() {
@@ -18831,31 +18857,31 @@ class KritzelStore {
18831
18857
  return this._state;
18832
18858
  }
18833
18859
  get currentZIndex() {
18834
- return Math.max(0, ...this._state.objectsMap.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;
18860
+ return Math.max(0, ...this._state.objects.filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox)).map(o => o.zIndex)) + 1;
18835
18861
  }
18836
18862
  get allObjects() {
18837
- return this._state.objectsMap.allObjects();
18863
+ return this._state.objects.allObjects();
18838
18864
  }
18839
18865
  get allNonSelectionObjects() {
18840
- return this._state.objectsMap.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));
18866
+ return this._state.objects.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));
18841
18867
  }
18842
18868
  get selectedObjects() {
18843
18869
  return this.allObjects.filter(o => !(o instanceof KritzelSelectionGroup)).filter(o => o.isSelected);
18844
18870
  }
18845
18871
  get selectionBox() {
18846
- const selectionBoxes = this._state.objectsMap.filter(o => o instanceof KritzelSelectionBox);
18872
+ const selectionBoxes = this._state.objects.filter(o => o instanceof KritzelSelectionBox);
18847
18873
  return selectionBoxes.length > 0 ? selectionBoxes[0] : null;
18848
18874
  }
18849
18875
  get selectionGroup() {
18850
- const selectionGroups = this._state.objectsMap.filter(o => o instanceof KritzelSelectionGroup);
18876
+ const selectionGroups = this._state.objects.filter(o => o instanceof KritzelSelectionGroup);
18851
18877
  return selectionGroups.length > 0 ? selectionGroups[0] : null;
18852
18878
  }
18853
18879
  get activeText() {
18854
- const activeTexts = this._state.objectsMap.filter(o => o instanceof KritzelText && o.isEditing);
18880
+ const activeTexts = this._state.objects.filter(o => o instanceof KritzelText && o.isEditing);
18855
18881
  return activeTexts.length > 0 ? activeTexts[0] : null;
18856
18882
  }
18857
18883
  get currentPath() {
18858
- const drawingPaths = this._state.objectsMap.filter(o => o instanceof KritzelPath && o.isCompleted === false);
18884
+ const drawingPaths = this._state.objects.filter(o => o instanceof KritzelPath && o.isCompleted === false);
18859
18885
  return drawingPaths.length > 0 ? drawingPaths[0] : null;
18860
18886
  }
18861
18887
  get offsetX() {
@@ -18869,7 +18895,7 @@ class KritzelStore {
18869
18895
  }
18870
18896
  constructor(state) {
18871
18897
  this._state = state;
18872
- this._state.objectsMap = new KritzelObjectMap();
18898
+ this._state.objects = new KritzelObjectMap();
18873
18899
  }
18874
18900
  onStateChange(property, listener) {
18875
18901
  if (!this._listeners.has(property)) {
@@ -18966,8 +18992,8 @@ class KritzelCore {
18966
18992
  this.saveWorkspaceToAppState(activeWorkspace);
18967
18993
  }
18968
18994
  // Destroy old ObjectMap if switching workspaces
18969
- if (this._store.state.objectsMap && this._store.state.objectsMap.isReady) {
18970
- this._store.state.objectsMap.destroy();
18995
+ if (this._store.state.objects && this._store.state.objects.isReady) {
18996
+ this._store.state.objects.destroy();
18971
18997
  }
18972
18998
  // Set active workspace
18973
18999
  this._store.state.activeWorkspace = activeWorkspace;
@@ -18980,7 +19006,8 @@ class KritzelCore {
18980
19006
  // Create new ObjectMap with its own Y.Doc for this workspace
18981
19007
  const objectsMap = new KritzelObjectMap();
18982
19008
  await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);
18983
- this._store.state.objectsMap = objectsMap;
19009
+ this._store.state.objects = objectsMap;
19010
+ this.engine.emitObjectsChange();
18984
19011
  this.rerender();
18985
19012
  }
18986
19013
  rerender() {
@@ -19019,7 +19046,7 @@ class KritzelCore {
19019
19046
  deleteWorkspace(workspace) {
19020
19047
  // If deleting the active workspace, need to handle ObjectMap cleanup
19021
19048
  if (this._store.state.activeWorkspace?.id === workspace.id) {
19022
- this._store.state.objectsMap?.destroy();
19049
+ this._store.state.objects?.destroy();
19023
19050
  }
19024
19051
  this.deleteWorkspaceFromAppState(workspace.id);
19025
19052
  this._store.state.workspaces = this.loadWorkspacesFromAppState();
@@ -19037,11 +19064,11 @@ class KritzelCore {
19037
19064
  this.saveWorkspaceToAppState(activeWorkspace);
19038
19065
  }
19039
19066
  addObject(object) {
19040
- this._store.state.objectsMap.insert(object);
19067
+ this._store.state.objects.insert(object);
19041
19068
  }
19042
19069
  removeObject(object) {
19043
19070
  object.isMounted = false;
19044
- this._store.state.objectsMap.remove(o => o.id === object.id);
19071
+ this._store.state.objects.remove(o => o.id === object.id);
19045
19072
  }
19046
19073
  updateObject(object, updatedProperties) {
19047
19074
  for (const key in updatedProperties) {
@@ -19049,23 +19076,23 @@ class KritzelCore {
19049
19076
  object[key] = updatedProperties[key];
19050
19077
  }
19051
19078
  }
19052
- this._store.state.objectsMap.update(object);
19079
+ this._store.state.objects.update(object);
19053
19080
  }
19054
19081
  addSelectionGroup(selectionGroup) {
19055
19082
  this.removeSelectionGroup();
19056
19083
  this.removeSelectionBox();
19057
- this._store.state.objectsMap.insert(selectionGroup);
19084
+ this._store.state.objects.insert(selectionGroup);
19058
19085
  }
19059
19086
  removeSelectionGroup() {
19060
19087
  const selectionGroup = this._store.selectionGroup;
19061
19088
  if (selectionGroup) {
19062
- this._store.state.objectsMap.remove(object => object.id === selectionGroup.id);
19089
+ this._store.state.objects.remove(object => object.id === selectionGroup.id);
19063
19090
  }
19064
19091
  }
19065
19092
  removeSelectionBox() {
19066
19093
  const selectionBox = this._store.selectionBox;
19067
19094
  if (selectionBox) {
19068
- this._store.state.objectsMap.remove(object => object.id === selectionBox.id);
19095
+ this._store.state.objects.remove(object => object.id === selectionBox.id);
19069
19096
  }
19070
19097
  }
19071
19098
  deselectAllObjects() {
@@ -19082,10 +19109,10 @@ class KritzelCore {
19082
19109
  this.rerender();
19083
19110
  }
19084
19111
  undo() {
19085
- this._store.state.objectsMap?.undo();
19112
+ this._store.state.objects?.undo();
19086
19113
  }
19087
19114
  redo() {
19088
- this._store.state.objectsMap?.redo();
19115
+ this._store.state.objects?.redo();
19089
19116
  }
19090
19117
  deleteObject(id) {
19091
19118
  const object = this.findObjectById(id);
@@ -19181,6 +19208,7 @@ class KritzelCore {
19181
19208
  this._store.state.copiedObjects = newSelectionGroup.objects.sort((a, b) => a.zIndex - b.zIndex).map(obj => obj.copy());
19182
19209
  }
19183
19210
  this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));
19211
+ this.engine.emitObjectsChange();
19184
19212
  this.rerender();
19185
19213
  }
19186
19214
  bringForward(object) {
@@ -19244,7 +19272,7 @@ class KritzelCore {
19244
19272
  this.rerender();
19245
19273
  }
19246
19274
  selectAllObjectsInViewport() {
19247
- const objectsInViewport = this._store.state.objectsMap
19275
+ const objectsInViewport = this._store.state.objects
19248
19276
  .filter(o => o.isInViewport())
19249
19277
  .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));
19250
19278
  if (objectsInViewport.length > 0) {
@@ -19265,7 +19293,7 @@ class KritzelCore {
19265
19293
  }
19266
19294
  clearSelection() {
19267
19295
  this.removeSelectionGroup();
19268
- this._store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
19296
+ this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);
19269
19297
  this._store.state.isSelecting = false;
19270
19298
  this._store.state.isResizeHandleSelected = false;
19271
19299
  this._store.state.isRotationHandleSelected = false;
@@ -19383,7 +19411,13 @@ const KritzelEngine = class {
19383
19411
  activeToolChange;
19384
19412
  workspacesChange;
19385
19413
  longpress;
19414
+ objectsChange;
19415
+ undoStateChange;
19386
19416
  forceUpdate = 0;
19417
+ throttledWheel = lodashExports.throttle((ev) => {
19418
+ this.viewport.handleWheel(ev);
19419
+ this.core.store.state?.activeTool?.handleWheel(ev);
19420
+ }, 16);
19387
19421
  handleWheel(ev) {
19388
19422
  if (this.core.store.isDisabled) {
19389
19423
  return;
@@ -19391,8 +19425,7 @@ const KritzelEngine = class {
19391
19425
  if (this.core.store.state.isContextMenuVisible) {
19392
19426
  this.hideContextMenu();
19393
19427
  }
19394
- this.viewport.handleWheel(ev);
19395
- this.core.store.state?.activeTool?.handleWheel(ev);
19428
+ this.throttledWheel(ev);
19396
19429
  }
19397
19430
  handlePointerDown(ev) {
19398
19431
  if (this.core.store.isDisabled) {
@@ -19527,7 +19560,7 @@ const KritzelEngine = class {
19527
19560
  async hideContextMenu() {
19528
19561
  this.core.store.state.pointers.clear();
19529
19562
  this.core.store.state.isContextMenuVisible = false;
19530
- this.core.store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox);
19563
+ this.core.store.state.objects.remove(o => o instanceof KritzelSelectionBox);
19531
19564
  this.core.store.state.isSelecting = false;
19532
19565
  this.core.store.state.isEnabled = true;
19533
19566
  this.core.rerender();
@@ -19554,7 +19587,7 @@ const KritzelEngine = class {
19554
19587
  }
19555
19588
  async removeObject(object) {
19556
19589
  this.core.deselectAllObjects();
19557
- this.core.removeObject(object);
19590
+ this.core.store.state.objects.remove(o => o.id === object.id);
19558
19591
  this.core.rerender();
19559
19592
  return object;
19560
19593
  }
@@ -19622,9 +19655,12 @@ const KritzelEngine = class {
19622
19655
  this.activeToolChange = createEvent(this, "activeToolChange");
19623
19656
  this.workspacesChange = createEvent(this, "workspacesChange");
19624
19657
  this.longpress = createEvent(this, "longpress");
19658
+ this.objectsChange = createEvent(this, "objectsChange");
19659
+ this.undoStateChange = createEvent(this, "undoStateChange");
19625
19660
  this.core = new KritzelCore(this);
19626
19661
  }
19627
19662
  disconnectedCallback() {
19663
+ this.throttledWheel.cancel();
19628
19664
  this.throttledPointerMoveMulti.cancel();
19629
19665
  }
19630
19666
  componentWillLoad() {
@@ -19653,13 +19689,19 @@ const KritzelEngine = class {
19653
19689
  this.isEngineReady.emit(this.core.store.state);
19654
19690
  }
19655
19691
  }
19692
+ emitObjectsChange() {
19693
+ const objects = this.core.store.allObjects;
19694
+ const undoState = this.core.store.state.objects.undoState;
19695
+ this.objectsChange.emit(objects);
19696
+ this.undoStateChange.emit(undoState);
19697
+ }
19656
19698
  _registerStateChangeListeners() {
19657
19699
  this.core.store.onStateChange('activeTool', this._handleActiveToolChange.bind(this));
19658
19700
  }
19659
19701
  _handleActiveToolChange(activeTool) {
19660
19702
  if (!(activeTool instanceof KritzelSelectionTool)) {
19661
19703
  this.core.clearSelection();
19662
- this.core.store.state.objectsMap.remove(o => o instanceof KritzelSelectionBox);
19704
+ this.core.store.state.objects.remove(o => o instanceof KritzelSelectionBox);
19663
19705
  this.core.store.state.isSelecting = false;
19664
19706
  this.core.store.state.isResizeHandleSelected = false;
19665
19707
  this.core.store.state.isRotationHandleSelected = false;
@@ -19677,11 +19719,12 @@ const KritzelEngine = class {
19677
19719
  const baseHandleTouchSize = baseHandleSize * 2 < 14 ? 14 : baseHandleSize;
19678
19720
  const viewportCenterX = this.core.store.state.viewportWidth / 2 + this.core.store.state.translateX;
19679
19721
  const viewportCenterY = this.core.store.state.viewportHeight / 2 + this.core.store.state.translateY;
19680
- return (h(Host, { key: '3e05ce246b599985a06e54e0d81a63b4765ff506' }, h("div", { key: '6169eb0566bb2965c7d1569492a62a1ef1d4b7ef', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '598db5c39099553997248086e392c168c583aca9' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '6d5de3390f2e32dbaa7fe52521b8fd9c0e8706de' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '6006c27d020aeea24170a09140e3bc5c2ea459cf' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: 'edfa3cb59d47df747dc9f003ce08345348ba586d' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '799f714d6e4b129f59be7cbc52f657e9b21f9879' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '4a8f545cf72fe496abf18a4907743ac6b46ef889' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '8e665e3c23424cb4e76b2d4354bb4472a5b3ddbe' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: 'c168b114e204b90dafaf8736a571171a748047c1' }, "Scale: ", this.core.store.state?.scale), h("div", { key: 'bee83601a571727a06235c674e7300cdc398dfac' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '0a2f5f36143c587ddc9b3ae487ce32196cd17232' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '515959ec3700ecdc9dd3ca9183bfacd854d173d2' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '5a9ca8f3ba91f10e9d6bec07c6005c1e43713d69' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: 'f5d1a5d59828be47be31e794b3b41c1e14c50780' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '1db8cdad160c131542fd787d104b4b979415ec4c' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: 'baae83187cfb4c21ea07c7834017df92a7340d5b' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '6b248cb6fad7fb4dd5162fb2529dfec821a708fc' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '0eae863f48c27867d0fa0f8c767b50c13be48271' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'a4ca58af5858725d4f1d0e00547e6e42365cb8fe' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '8f978714060623d3daa9454e04ef929b1f02b143' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '9b274d7785a9e4a36128c273bcee6b692d815a86' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '0c248bc24c164c4c52fb06b17347f107e3f0995f' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '21f3664f0978f308d88a976c47b875dd5bb08b95' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: 'e1161aa45ea02de914e01a93ec159447b5e17e8b' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: '87249fcc3f23632739631b8fdbc64371694d6206', id: "origin", class: "origin", style: {
19722
+ // Performance optimization: skip viewport filtering during scaling/panning
19723
+ const visibleObjects = this.core.store.state.objects.allObjects().filter(obj => obj.isInViewport());
19724
+ return (h(Host, { key: '27fe100b91431ac60e92bf760037cc447a63e38a' }, h("div", { key: '7e114372f5fa323a859157f3755d3fa5d4b08d47', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '1863b8445ddd28130a54e02bb89d9ed274f8260c' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '1640063aec9f5afd6ac967d7f65d99b36795bc3a' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '199c6d4f705f5ae11b36e1d1331a580248ae0084' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '274033ad94cf606bc23200964ed9243f62150b86' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: 'cc8779f3a09206db0bbad9703a85c824439a7937' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '043c6e466232f30d352c059090a577555ed77408' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: 'ccc766354a394c94ae72152b56b3b3be127fb81f' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: '02ad8120fb92b4f03b658c64370dedf263c1379c' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '5ae8ad9b57519bb6a37878a9c2705e516f3938c8' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '2087eeeba5781392f25fc68b055c58304533a4ac' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: 'e144771bcf53633acc0f9c5dd67cd47a39e9fdc4' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'ca6ab6ec3fe102fef9439d345784a6d665f5830d' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '39771b31899d1d8a03866327b003f6a136465ef6' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: 'a018739b027928ea79199c87236f539031c75665' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '9a726c78db50c847990a0da94d47944ab67a4032' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '4a071e003c6829fd77e24feff0505179e4ddb6e5' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '5de9101a5f8adc50d0205d1dc2c9c6ecfaee775b' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'b7cc40f141d38f1c44504537cb17d3715c463ef6' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'ec70a94cedaa20185c736619aeed903d47873a26' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '004ba71d21b338ea4ccea9c2bd7a7e910d5fad5f' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '8e0b4ce18754f469a1cb86fc411090333e12f59f' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: 'bb439deff145d1b362580945fedfa294c85e3a4d' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: 'ffdaa445890c5e86eb38a746d4ac6d35cd9e132a' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: '7770448d56a980d9c68cf95cc3deb81c00c0eb6f', id: "origin", class: "origin", style: {
19681
19725
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
19682
- } }, this.core.store.state.objectsMap.allObjects()?.map(object => {
19726
+ } }, visibleObjects?.map(object => {
19683
19727
  return (h("div", { key: object.id, style: {
19684
- display: object.isInViewport() ? 'block' : 'none',
19685
19728
  transform: object?.transformationMatrix,
19686
19729
  transformOrigin: 'top left',
19687
19730
  zIndex: object.zIndex.toString(),
@@ -19711,7 +19754,7 @@ const KritzelEngine = class {
19711
19754
  width: object?.width.toString(),
19712
19755
  position: 'absolute',
19713
19756
  overflow: 'visible',
19714
- }, viewBox: object?.viewBox }, h("path", { d: object?.d, fill: object.fill, stroke: object?.stroke, "shape-rendering": "auto" }))), KritzelClassHelper.isInstanceOf(object, 'KritzelImage') && (h("img", { ref: el => object.mount(el), src: object.src, style: {
19757
+ }, viewBox: object?.viewBox }, h("path", { d: object?.d, fill: object.fill, stroke: object?.stroke, "shape-rendering": object.isLowRes() ? 'optimizeSpeed' : 'auto' }))), KritzelClassHelper.isInstanceOf(object, 'KritzelImage') && (h("img", { ref: el => object.mount(el), src: object.src, style: {
19715
19758
  width: '100%',
19716
19759
  height: '100%',
19717
19760
  userSelect: 'none',
@@ -19744,48 +19787,55 @@ const KritzelEngine = class {
19744
19787
  borderWidth: KritzelDevicesHelper.isFirefox() ? object.borderWidth + 'px' : '0',
19745
19788
  borderStyle: KritzelDevicesHelper.isFirefox() ? 'solid' : 'none',
19746
19789
  borderColor: KritzelDevicesHelper.isFirefox() ? object.borderColor : 'transparent',
19747
- } }))), h("line", { x1: "0", y1: "0", x2: object.totalWidth, y2: "0", style: {
19790
+ } })), object.isSelected && (h("svg", { style: {
19791
+ height: object?.height.toString(),
19792
+ width: object?.width.toString(),
19793
+ position: 'absolute',
19794
+ overflow: 'visible',
19795
+ top: '0',
19796
+ left: '0',
19797
+ } }, h("g", { class: "selection-borders" }, h("line", { x1: "0", y1: "0", x2: object.totalWidth, y2: "0", style: {
19748
19798
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
19749
19799
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
19750
19800
  strokeLinecap: 'square',
19751
- }, visibility: object.isSelected ? 'visible' : 'hidden' }), h("line", { x1: "0", y1: "0", x2: "0", y2: object.totalHeight, style: {
19801
+ } }), h("line", { x1: "0", y1: "0", x2: "0", y2: object.totalHeight, style: {
19752
19802
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
19753
19803
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
19754
19804
  strokeLinecap: 'square',
19755
- }, visibility: object.isSelected ? 'visible' : 'hidden' }), h("line", { x1: "0", y1: object.totalHeight, x2: object.totalWidth, y2: object.totalHeight, style: {
19805
+ } }), h("line", { x1: "0", y1: object.totalHeight, x2: object.totalWidth, y2: object.totalHeight, style: {
19756
19806
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
19757
19807
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
19758
19808
  strokeLinecap: 'square',
19759
- }, visibility: object.isSelected ? 'visible' : 'hidden' }), h("line", { x1: object.totalWidth, y1: "0", x2: object.totalWidth, y2: object.totalHeight, style: {
19809
+ } }), h("line", { x1: object.totalWidth, y1: "0", x2: object.totalWidth, y2: object.totalHeight, style: {
19760
19810
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
19761
19811
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
19762
19812
  strokeLinecap: 'square',
19763
- }, visibility: object.isSelected ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle top-left", cx: "0", cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19813
+ } }))))), object.isSelected && !this.isSelecting && (h("g", { class: "selection-handles" }, h("circle", { class: "resize-handle top-left", cx: "0", cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19764
19814
  fill: 'var(--kritzel-selection-handle-color, #000000)',
19765
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle-overlay top-left", cx: "0", cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19815
+ } }), h("circle", { class: "resize-handle-overlay top-left", cx: "0", cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19766
19816
  fill: 'transparent',
19767
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19817
+ } }), h("circle", { class: "resize-handle top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19768
19818
  fill: 'var(--kritzel-selection-handle-color, #000000)',
19769
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle-overlay top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19819
+ } }), h("circle", { class: "resize-handle-overlay top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19770
19820
  fill: 'transparent',
19771
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19821
+ } }), h("circle", { class: "resize-handle bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19772
19822
  fill: 'var(--kritzel-selection-handle-color, #000000)',
19773
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle-overlay bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19823
+ } }), h("circle", { class: "resize-handle-overlay bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19774
19824
  fill: 'transparent',
19775
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19825
+ } }), h("circle", { class: "resize-handle bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19776
19826
  fill: 'var(--kritzel-selection-handle-color, #000000)',
19777
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "resize-handle-overlay bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19827
+ } }), h("circle", { class: "resize-handle-overlay bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19778
19828
  fill: 'transparent',
19779
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("line", { x1: object.totalWidth / 2, y1: "0", x2: object.totalWidth / 2, y2: -((15 * object.scale) / this.core.store.state?.scale), style: {
19829
+ } }), h("line", { x1: object.totalWidth / 2, y1: "0", x2: object.totalWidth / 2, y2: -((15 * object.scale) / this.core.store.state?.scale), style: {
19780
19830
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
19781
19831
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
19782
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "rotation-handle", cx: object.totalWidth / 2, cy: -((15 * object.scale) / this.core.store.state?.scale), r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19832
+ } }), h("circle", { class: "rotation-handle", cx: object.totalWidth / 2, cy: -((15 * object.scale) / this.core.store.state?.scale), r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
19783
19833
  fill: 'var(--kritzel-selection-handle-color, #000000)',
19784
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("circle", { class: "rotation-handle-overlay", cx: object.totalWidth / 2, cy: -((15 * object.scale) / this.core.store.state?.scale), r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19834
+ } }), h("circle", { class: "rotation-handle-overlay", cx: object.totalWidth / 2, cy: -((15 * object.scale) / this.core.store.state?.scale), r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
19785
19835
  fill: 'transparent',
19786
19836
  cursor: 'grab',
19787
- }, visibility: object.isSelected && !this.isSelecting ? 'visible' : 'hidden' }), h("g", { style: { display: this.core.store.state.debugInfo.showObjectInfo ? 'block' : 'none', pointerEvents: 'none' } }, h("foreignObject", { x: object.totalWidth.toString(), y: "0", width: "400px", height: "160px", style: { minHeight: '0', minWidth: '0', display: object.isDebugInfoVisible ? 'block' : 'none' } }, h("div", { style: { width: '100%', height: '100%' } }, h("div", { style: { whitespace: 'nowrap' } }, "Id: ", object.id), h("div", { style: { whiteSpace: 'nowrap' } }, "width: ", object.width), h("div", { style: { whiteSpace: 'nowrap' } }, "height: ", object.height), h("div", { style: { whiteSpace: 'nowrap' } }, "translateX: ", object.translateX), h("div", { style: { whiteSpace: 'nowrap' } }, "translateY: ", object.translateY)))))));
19788
- })), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: 'cd93542307cce6de36db2937a96345bb1c3b4861', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
19837
+ } }))), this.core.store.state.debugInfo.showObjectInfo && object.isDebugInfoVisible && (h("g", { style: { pointerEvents: 'none' } }, h("foreignObject", { x: object.totalWidth.toString(), y: "0", width: "400px", height: "160px", style: { minHeight: '0', minWidth: '0' } }, h("div", { style: { width: '100%', height: '100%' } }, h("div", { style: { whiteSpace: 'nowrap' } }, "Id: ", object.id), h("div", { style: { whiteSpace: 'nowrap' } }, "width: ", object.width), h("div", { style: { whiteSpace: 'nowrap' } }, "height: ", object.height), h("div", { style: { whiteSpace: 'nowrap' } }, "translateX: ", object.translateX), h("div", { style: { whiteSpace: 'nowrap' } }, "translateY: ", object.translateY))))))));
19838
+ })), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '282fac28f1351ef700ed01edd5e22644c53f2d0e', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
19789
19839
  position: 'fixed',
19790
19840
  left: `${this.core.store.state.contextMenuX}px`,
19791
19841
  top: `${this.core.store.state.contextMenuY}px`,
@@ -19796,7 +19846,7 @@ const KritzelEngine = class {
19796
19846
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
19797
19847
  }, this.core.store.selectionGroup?.objects);
19798
19848
  this.hideContextMenu();
19799
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: 'c6f59b5b0999eeb4bac270a0c1085ed898cdad78', core: this.core })));
19849
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '9adc32d16e9c1f28596a029edf8b0f759cfa9f05', core: this.core })));
19800
19850
  }
19801
19851
  static get watchers() { return {
19802
19852
  "workspace": ["onWorkspaceChange"],
@@ -19916,7 +19966,7 @@ const KritzelIcon = class {
19916
19966
  };
19917
19967
  KritzelIcon.style = kritzelIconCss;
19918
19968
 
19919
- const kritzelMenuCss = ":host{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-menu-background-color, #ffffff);width:var(--kritzel-menu-width, 200px);padding:var(--kritzel-menu-padding, 8px);border-radius:var(--kritzel-menu-border-radius, 12px);box-shadow:var(--kritzel-menu-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-menu-border, 1px solid #ebebeb);z-index:2;gap:var(--kritzel-menu-gap, 4px);overflow-y:auto;scrollbar-color:#ebebeb transparent;scrollbar-width:thin;max-height:300px}:host(:focus-visible){outline:var(--kritzel-menu-focus-outline, 2px solid #e3e3e3)}.has-open-child-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3}";
19969
+ const kritzelMenuCss = ":host{position:relative;display:flex;flex-direction:column;background-color:var(--kritzel-menu-background-color, #ffffff);width:var(--kritzel-menu-width, 200px);padding:var(--kritzel-menu-padding, 8px);border-radius:var(--kritzel-menu-border-radius, 12px);box-shadow:var(--kritzel-menu-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-menu-border, 1px solid #ebebeb);z-index:2;gap:var(--kritzel-menu-gap, 4px);overflow-y:auto;scrollbar-color:#ebebeb transparent;scrollbar-width:thin;max-height:300px}.has-open-child-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3}";
19920
19970
 
19921
19971
  const KritzelMenu = class {
19922
19972
  constructor(hostRef) {
@@ -19984,7 +20034,7 @@ const KritzelMenu = class {
19984
20034
  };
19985
20035
  KritzelMenu.style = kritzelMenuCss;
19986
20036
 
19987
- const kritzelMenuItemCss = ":host{position:relative;display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--kritzel-menu-item-padding, 8px);box-sizing:border-box;gap:16px;height:var(--kritzel-menu-item-height, 40px);min-height:var(--kritzel-menu-item-min-height, 40px);font-family:sans-serif;font-size:var(--kritzel-menu-item-font-size, 14px);color:var(--kritzel-menu-item-color, #333333);border-radius:var(--kritzel-menu-item-border-radius, 12px);outline:none;cursor:default}:host(:hover) .menu-item-overlay,:host(:focus-within) .menu-item-overlay{background-color:var(--kritzel-menu-item-overlay-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff);color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected.editing){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}:host(.selected) .edit-input{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-selected-color, #ffffff)}kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-color, #333333)}:host(.selected) .edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, rgba(255, 255, 255, 0.16))}:host(.editing){background-color:var(--kritzel-menu-item-editing-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.disabled){opacity:0.5;pointer-events:none !important}:host(.child-open){background-color:var(--kritzel-menu-item-child-open-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.child-open.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}.menu-item-overlay{position:absolute;inset:0;background-color:transparent;z-index:0;pointer-events:none;border-radius:var(--kritzel-menu-item-border-radius, 12px)}.menu-item-content{display:flex;align-items:center;gap:8px;position:relative;z-index:1;height:100%}.left{justify-content:flex-start;flex:1;min-width:0}.left>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.right{justify-content:flex-end}.edit-input{flex:1;height:var(--kritzel-menu-item-input-height, 24px);padding:0;background-color:transparent;border-radius:0;border:none;border-bottom:1px solid var(--kritzel-menu-item-input-border, #ccc);font-size:var(--kritzel-context-menu-item-font-size, 14px);width:100%;min-width:0;box-sizing:border-box;outline:none}.edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, #007bff);color:var(--kritzel-menu-item-input-selection-text-color, #ffffff)}.action-button{padding:4px;border-radius:8px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;background-color:transparent;background:transparent;outline:none;-webkit-tap-highlight-color:transparent}.action-button:hover,.action-button:focus{background-color:var(--kritzel-menu-item-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.action-button.disabled{pointer-events:none;opacity:0.5}";
20037
+ const kritzelMenuItemCss = ":host{position:relative;display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--kritzel-menu-item-padding, 8px);box-sizing:border-box;gap:16px;height:var(--kritzel-menu-item-height, 40px);min-height:var(--kritzel-menu-item-min-height, 40px);font-family:sans-serif;font-size:var(--kritzel-menu-item-font-size, 14px);color:var(--kritzel-menu-item-color, #333333);border-radius:var(--kritzel-menu-item-border-radius, 12px);cursor:default}:host(:hover) .menu-item-overlay,:host(:focus-within) .menu-item-overlay{background-color:var(--kritzel-menu-item-overlay-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff);color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected.editing){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}:host(.selected) .edit-input{color:var(--kritzel-menu-item-selected-color, #ffffff)}:host(.selected) .action-button kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-selected-color, #ffffff)}kritzel-icon{--kritzel-icon-color:var(--kritzel-menu-item-color, #333333)}:host(.selected) .edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, rgba(255, 255, 255, 0.16))}:host(.editing){background-color:var(--kritzel-menu-item-editing-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.disabled){opacity:0.5;pointer-events:none !important}:host(.child-open){background-color:var(--kritzel-menu-item-child-open-background-color, hsl(0, 0%, 0%, 4.3%))}:host(.child-open.selected){background-color:var(--kritzel-menu-item-selected-bg, #007aff)}.menu-item-overlay{position:absolute;inset:0;background-color:transparent;z-index:0;pointer-events:none;border-radius:var(--kritzel-menu-item-border-radius, 12px)}.menu-item-content{display:flex;align-items:center;gap:8px;position:relative;z-index:1;height:100%}.left{justify-content:flex-start;flex:1;min-width:0}.left>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.right{justify-content:flex-end}.edit-input{flex:1;height:var(--kritzel-menu-item-input-height, 24px);padding:0;background-color:transparent;border-radius:0;border:none;border-bottom:1px solid var(--kritzel-menu-item-input-border, #ccc);font-size:var(--kritzel-context-menu-item-font-size, 14px);width:100%;min-width:0;box-sizing:border-box;outline:none}.edit-input::selection{background-color:var(--kritzel-menu-item-input-selection-color, #007bff);color:var(--kritzel-menu-item-input-selection-text-color, #ffffff)}.action-button{padding:4px;border-radius:8px;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;background-color:transparent;background:transparent;-webkit-tap-highlight-color:transparent}.action-button:hover,.action-button:focus{background-color:var(--kritzel-menu-item-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.action-button.disabled{pointer-events:none;opacity:0.5}";
19988
20038
 
19989
20039
  const KritzelMenuItem = class {
19990
20040
  constructor(hostRef) {
@@ -20333,7 +20383,7 @@ const KritzelPortal = class {
20333
20383
  }; }
20334
20384
  };
20335
20385
 
20336
- const kritzelSplitButtonCss = ":host{position:relative;display:flex;align-items:center;font-family:sans-serif;z-index:1;padding:var(--kritzel-split-button-padding, 4px);background-color:var(--kritzel-split-button-background-color, #ffffff);border-radius:var(--kritzel-split-button-border-radius, 12px);box-shadow:var(--kritzel-split-button-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-split-button-border, 1px solid #ebebeb);gap:var(--kritzel-split-button-gap, 4px)}:host(.mobile){--kritzel-split-button-hover-background-color:transparent}button{border:none;background-color:transparent;padding:0;margin:0;font-family:inherit;font-size:inherit;color:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;text-align:center;display:flex;align-items:center;justify-content:center;pointer-events:all;-webkit-tap-highlight-color:transparent}.split-main-button,.split-menu-button{height:auto;display:flex;align-items:center;padding:var(--kritzel-split-button-padding, 8px);background-color:var(--kritzel-split-button-background-color, #ffffff);border-radius:var(--kritzel-split-button-border-radius, 12px);font-size:var(--kritzel-split-button-font-size, 14px)}.split-main-button:hover,.split-menu-button:hover{background-color:var(--kritzel-split-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.split-main-button:focus,.split-menu-button:focus{outline:none;background-color:var(--kritzel-split-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.split-main-button{gap:var(--kritzel-split-button-gap, 4px)}.split-menu-button{border-left:none;justify-content:center}.split-divider{width:var(--kritzel-split-button-divider-width, 1px);height:24px;background-color:var(--kritzel-split-button-divider-background-color, hsl(0, 0%, 0%, 4.3%))}:disabled{pointer-events:none;opacity:0.5}";
20386
+ const kritzelSplitButtonCss = ":host{position:relative;display:flex;align-items:center;font-family:sans-serif;z-index:1;padding:var(--kritzel-split-button-padding, 4px);background-color:var(--kritzel-split-button-background-color, #ffffff);border-radius:var(--kritzel-split-button-border-radius, 12px);box-shadow:var(--kritzel-split-button-box-shadow, 0 0 3px rgba(0, 0, 0, 0.08));border:var(--kritzel-split-button-border, 1px solid #ebebeb);gap:var(--kritzel-split-button-gap, 4px)}:host(.mobile){--kritzel-split-button-hover-background-color:transparent}button{border:none;background-color:transparent;padding:0;margin:0;font-family:inherit;font-size:inherit;color:inherit;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;text-align:center;display:flex;align-items:center;justify-content:center;pointer-events:all;-webkit-tap-highlight-color:transparent}.split-main-button,.split-menu-button{height:auto;display:flex;align-items:center;padding:var(--kritzel-split-button-padding, 8px);background-color:var(--kritzel-split-button-background-color, #ffffff);border-radius:var(--kritzel-split-button-border-radius, 12px);font-size:var(--kritzel-split-button-font-size, 14px)}.split-main-button:hover,.split-menu-button:hover{background-color:var(--kritzel-split-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.split-main-button:focus,.split-menu-button:focus{background-color:var(--kritzel-split-button-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.split-main-button{gap:var(--kritzel-split-button-gap, 4px)}.split-menu-button{border-left:none;justify-content:center}.split-divider{width:var(--kritzel-split-button-divider-width, 1px);height:24px;background-color:var(--kritzel-split-button-divider-background-color, hsl(0, 0%, 0%, 4.3%))}:disabled{pointer-events:none;opacity:0.5}";
20337
20387
 
20338
20388
  const KritzelSplitButton = class {
20339
20389
  constructor(hostRef) {
@@ -20431,7 +20481,7 @@ const KritzelSplitButton = class {
20431
20481
  };
20432
20482
  KritzelSplitButton.style = kritzelSplitButtonCss;
20433
20483
 
20434
- const kritzelStrokeSizeCss = ":host{display:flex;align-items:flex-start;gap:8px;padding:8px;box-sizing:border-box}.size-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.size-container:focus-visible{outline:var(--kritzel-stroke-size-focus-outline, 2px auto #e3e3e3)}.size-container:hover{background-color:var(--kritzel-stroke-size-hover-background-color, #ebebeb)}.size-container.selected{border-color:var(--kritzel-selection-border-color, #007AFF);background-color:var(--kritzel-stroke-size-selected-background-color, #ebebeb)}";
20484
+ const kritzelStrokeSizeCss = ":host{display:flex;align-items:flex-start;gap:8px;padding:8px;box-sizing:border-box}.size-container{display:flex;justify-content:center;align-items:center;width:32px;height:32px;border-radius:50%;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.size-container:hover{background-color:var(--kritzel-stroke-size-hover-background-color, #ebebeb)}.size-container.selected{border-color:var(--kritzel-selection-border-color, #007AFF);background-color:var(--kritzel-stroke-size-selected-background-color, #ebebeb)}";
20435
20485
 
20436
20486
  const KritzelStrokeSize = class {
20437
20487
  constructor(hostRef) {
@@ -20550,7 +20600,7 @@ const KritzelTooltip = class {
20550
20600
  };
20551
20601
  KritzelTooltip.style = kritzelTooltipCss;
20552
20602
 
20553
- const kritzelUtilityPanelCss = ":host{display:flex;flex-direction:row;align-items:center;padding:4px;gap:8px;border-top-left-radius:12px;border-top-right-radius:12px;background-color:rgb(226, 226, 226);width:fit-content;user-select:none}.utility-button{display:flex;justify-content:center;align-items:center;width:28px;height:28px;padding:8px 4px;border:none;outline:none;background:none;cursor:pointer;color:#333333;-webkit-tap-highlight-color:transparent;border-radius:var(--kritzel-utility-panel-button-border-radius, 8px)}.utility-button:focus{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.utility-separator{width:1px;height:16px;background-color:hsl(0, 0%, 0%, 4.3%)}";
20603
+ const kritzelUtilityPanelCss = ":host{display:flex;flex-direction:row;align-items:center;padding:4px;gap:8px;border-top-left-radius:12px;border-top-right-radius:12px;background-color:rgb(226, 226, 226);width:fit-content;user-select:none}.utility-button{display:flex;justify-content:center;align-items:center;width:28px;height:28px;padding:8px 4px;border:none;background:none;cursor:pointer;color:#333333;-webkit-tap-highlight-color:transparent;border-radius:var(--kritzel-utility-panel-button-border-radius, 8px)}.utility-button:hover,.utility-button:focus-visible{background-color:var(--kritzel-controls-control-hover-background-color, hsl(0, 0%, 0%, 4.3%))}.utility-button:disabled{opacity:0.4;cursor:not-allowed;pointer-events:none}.utility-separator{width:1px;height:16px;background-color:hsl(0, 0%, 0%, 4.3%)}";
20554
20604
 
20555
20605
  const KritzelUtilityPanel = class {
20556
20606
  constructor(hostRef) {
@@ -20559,6 +20609,7 @@ const KritzelUtilityPanel = class {
20559
20609
  this.redo = createEvent(this, "redo");
20560
20610
  this.delete = createEvent(this, "delete");
20561
20611
  }
20612
+ undoState = null;
20562
20613
  undo;
20563
20614
  redo;
20564
20615
  delete;
@@ -20575,7 +20626,7 @@ const KritzelUtilityPanel = class {
20575
20626
  this.redo.emit();
20576
20627
  }
20577
20628
  render() {
20578
- 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() }))));
20629
+ return (h(Host, { key: '47e35a4c61d2807d220888eb90e325e24b9baf90' }, h("button", { key: '4e6ec69fc83242a9c1340a31351da1cccd90b1ba', class: "utility-button", disabled: !this.undoState?.canUndo, onClick: event => this.handleUndo(event) }, h("kritzel-icon", { key: '57bf4920ff9f0b2de8b0c1625dd844bba0c7f66d', name: "undo" })), h("button", { key: '759b9d13a679455fccd00e3d8c84e51b184659df', class: "utility-button", disabled: !this.undoState?.canRedo, onClick: event => this.handleRedo(event) }, h("kritzel-icon", { key: 'f3650d9dcf0c09086ec707443deb6055f7a709ec', name: "redo" })), h("div", { key: 'f414bc1d4be24a1f48d77911db4b9064c898ed8d', class: "utility-separator" }), h("button", { key: 'f542539422b6040bc7b90ceccad075e8f7150a4e', class: "utility-button" }, h("kritzel-icon", { key: 'da8e3cfe848384c3bb984b34d7ad9a6c9c1feba8', name: "delete", onClick: () => this.delete.emit() }))));
20579
20630
  }
20580
20631
  };
20581
20632
  KritzelUtilityPanel.style = kritzelUtilityPanelCss;