kritzel-stencil 0.0.147 → 0.0.149

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 (110) hide show
  1. package/dist/cjs/{default-text-tool.config-C0W0noF9.js → default-text-tool.config-BX6sjin6.js} +3 -95
  2. package/dist/cjs/default-text-tool.config-BX6sjin6.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +92 -2
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/kritzel-color_22.cjs.entry.js +17487 -263
  6. package/dist/collection/classes/core/viewport.class.js +3 -9
  7. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  8. package/dist/collection/classes/structures/object-map.structure.js +0 -2
  9. package/dist/collection/classes/structures/object-map.structure.js.map +1 -1
  10. package/dist/collection/components/core/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  11. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +1 -1
  12. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +25 -4
  13. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  14. package/dist/collection/components/shared/kritzel-color/kritzel-color.js +2 -2
  15. package/dist/collection/components/shared/kritzel-color-palette/kritzel-color-palette.js +1 -1
  16. package/dist/collection/components/shared/kritzel-font/kritzel-font.js +1 -1
  17. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +1 -1
  18. package/dist/collection/components/shared/kritzel-font-size/kritzel-font-size.js +1 -1
  19. package/dist/collection/components/shared/kritzel-menu/kritzel-menu.js +1 -1
  20. package/dist/collection/components/shared/kritzel-menu-item/kritzel-menu-item.js +2 -2
  21. package/dist/collection/components/shared/kritzel-portal/kritzel-portal.js +1 -1
  22. package/dist/collection/components/shared/kritzel-split-button/kritzel-split-button.js +1 -1
  23. package/dist/collection/components/shared/kritzel-stroke-size/kritzel-stroke-size.js +1 -1
  24. package/dist/collection/components/shared/kritzel-tooltip/kritzel-tooltip.js +4 -4
  25. package/dist/collection/components/ui/kritzel-context-menu/kritzel-context-menu.js +1 -1
  26. package/dist/collection/components/ui/kritzel-control-brush-config/kritzel-control-brush-config.js +2 -2
  27. package/dist/collection/components/ui/kritzel-control-text-config/kritzel-control-text-config.js +2 -2
  28. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +3 -3
  29. package/dist/collection/components/ui/kritzel-utility-panel/kritzel-utility-panel.js +1 -1
  30. package/dist/collection/configs/default-sync.config.js +1 -3
  31. package/dist/collection/configs/default-sync.config.js.map +1 -1
  32. package/dist/components/index.js +93 -3
  33. package/dist/components/index.js.map +1 -1
  34. package/dist/components/kritzel-color-palette.js +1 -1
  35. package/dist/components/kritzel-color.js +1 -1
  36. package/dist/components/kritzel-context-menu.js +1 -1
  37. package/dist/components/kritzel-control-brush-config.js +1 -1
  38. package/dist/components/kritzel-control-text-config.js +1 -1
  39. package/dist/components/kritzel-controls.js +1 -1
  40. package/dist/components/kritzel-cursor-trail.js +1 -1
  41. package/dist/components/kritzel-editor.js +19 -19
  42. package/dist/components/kritzel-engine.js +1 -1
  43. package/dist/components/kritzel-font-family.js +1 -1
  44. package/dist/components/kritzel-font-size.js +1 -1
  45. package/dist/components/kritzel-font.js +1 -1
  46. package/dist/components/kritzel-menu-item.js +1 -1
  47. package/dist/components/kritzel-menu.js +1 -1
  48. package/dist/components/kritzel-portal.js +1 -1
  49. package/dist/components/kritzel-split-button.js +1 -1
  50. package/dist/components/kritzel-stroke-size.js +1 -1
  51. package/dist/components/kritzel-tooltip.js +1 -1
  52. package/dist/components/kritzel-utility-panel.js +1 -1
  53. package/dist/components/kritzel-workspace-manager.js +1 -1
  54. package/dist/components/{p-BHDOht0m.js → p-BDHz9TkP.js} +4 -4
  55. package/dist/components/{p-BHDOht0m.js.map → p-BDHz9TkP.js.map} +1 -1
  56. package/dist/components/{p-DPN0PZvw.js → p-BP71Fape.js} +15 -15
  57. package/dist/components/{p-DPN0PZvw.js.map → p-BP71Fape.js.map} +1 -1
  58. package/dist/components/{p-CURq0twf.js → p-BgznZoBH.js} +3 -3
  59. package/dist/components/{p-CURq0twf.js.map → p-BgznZoBH.js.map} +1 -1
  60. package/dist/components/{p-BHT7_POQ.js → p-C2sWlNsJ.js} +3 -3
  61. package/dist/components/{p-BHT7_POQ.js.map → p-C2sWlNsJ.js.map} +1 -1
  62. package/dist/components/{p-CrkPot2F.js → p-CE48HcKx.js} +17245 -112
  63. package/dist/components/p-CE48HcKx.js.map +1 -0
  64. package/dist/components/{p-NXPGXBZ2.js → p-CJzBIV7n.js} +4 -4
  65. package/dist/components/{p-NXPGXBZ2.js.map → p-CJzBIV7n.js.map} +1 -1
  66. package/dist/components/{p-D13ydJjo.js → p-CLt3HMl6.js} +3 -3
  67. package/dist/components/{p-D13ydJjo.js.map → p-CLt3HMl6.js.map} +1 -1
  68. package/dist/components/{p-C3_LIgzd.js → p-CRB1YGoc.js} +7 -7
  69. package/dist/components/{p-C3_LIgzd.js.map → p-CRB1YGoc.js.map} +1 -1
  70. package/dist/components/{p-EBtkRix7.js → p-CTP479Lf.js} +6 -6
  71. package/dist/components/{p-EBtkRix7.js.map → p-CTP479Lf.js.map} +1 -1
  72. package/dist/components/{p-Dbp5YJIa.js → p-Cqpp9wKT.js} +3 -3
  73. package/dist/components/{p-Dbp5YJIa.js.map → p-Cqpp9wKT.js.map} +1 -1
  74. package/dist/components/{p-8iFF5GHL.js → p-D4yvhd1d.js} +4 -4
  75. package/dist/components/{p-8iFF5GHL.js.map → p-D4yvhd1d.js.map} +1 -1
  76. package/dist/components/{p-Dcf7tVJW.js → p-D5Wq4x4r.js} +3 -3
  77. package/dist/components/{p-Dcf7tVJW.js.map → p-D5Wq4x4r.js.map} +1 -1
  78. package/dist/components/{p-BCrMfH5n.js → p-DDmSxM5f.js} +4 -4
  79. package/dist/components/{p-BCrMfH5n.js.map → p-DDmSxM5f.js.map} +1 -1
  80. package/dist/components/{p-BQ5cdSqE.js → p-DKVBZiTy.js} +6 -6
  81. package/dist/components/{p-BQ5cdSqE.js.map → p-DKVBZiTy.js.map} +1 -1
  82. package/dist/components/{p-BctNMdxr.js → p-DhDRFCsP.js} +5 -5
  83. package/dist/components/{p-BctNMdxr.js.map → p-DhDRFCsP.js.map} +1 -1
  84. package/dist/components/{p-Bit0z7Yg.js → p-DnOeM6VQ.js} +5 -5
  85. package/dist/components/{p-Bit0z7Yg.js.map → p-DnOeM6VQ.js.map} +1 -1
  86. package/dist/components/{p-BaHZYvfq.js → p-G8Xyn7XV.js} +9 -9
  87. package/dist/components/{p-BaHZYvfq.js.map → p-G8Xyn7XV.js.map} +1 -1
  88. package/dist/components/{p-BlI4vzRZ.js → p-uuRJU2R1.js} +3 -3
  89. package/dist/components/{p-BlI4vzRZ.js.map → p-uuRJU2R1.js.map} +1 -1
  90. package/dist/esm/{default-text-tool.config-nXXHSTK9.js → default-text-tool.config-Bcel-KfG.js} +4 -95
  91. package/dist/esm/default-text-tool.config-Bcel-KfG.js.map +1 -0
  92. package/dist/esm/index.js +93 -3
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/kritzel-color_22.entry.js +17487 -263
  95. package/dist/stencil/index.esm.js +1 -1
  96. package/dist/stencil/index.esm.js.map +1 -1
  97. package/dist/stencil/p-824023c3.entry.js +10 -0
  98. package/dist/stencil/p-824023c3.entry.js.map +1 -0
  99. package/dist/stencil/{p-nXXHSTK9.js → p-Bcel-KfG.js} +2 -2
  100. package/dist/stencil/p-Bcel-KfG.js.map +1 -0
  101. package/dist/stencil/stencil.esm.js +1 -1
  102. package/dist/types/classes/core/viewport.class.d.ts +0 -1
  103. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +3 -0
  104. package/package.json +3 -1
  105. package/dist/cjs/default-text-tool.config-C0W0noF9.js.map +0 -1
  106. package/dist/components/p-CrkPot2F.js.map +0 -1
  107. package/dist/esm/default-text-tool.config-nXXHSTK9.js.map +0 -1
  108. package/dist/stencil/p-5d9c3f1b.entry.js +0 -2
  109. package/dist/stencil/p-5d9c3f1b.entry.js.map +0 -1
  110. package/dist/stencil/p-nXXHSTK9.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import { KritzelMouseButton } from "../../enums/event-button.enum";
2
+ import { debounce } from "lodash";
2
3
  export class KritzelViewport {
3
4
  _core;
4
5
  _debounceUpdate;
@@ -14,16 +15,9 @@ export class KritzelViewport {
14
15
  this._core.store.state.startY = 0;
15
16
  this._core.store.state.translateX = 0;
16
17
  this._core.store.state.translateY = 0;
17
- this._debounceUpdate = this.debounce(() => {
18
+ this._debounceUpdate = debounce(() => {
18
19
  this._core.updateWorkspaceViewport(this._core.store.state.translateX, this._core.store.state.translateY, this._core.store.state.scale);
19
- }, 0);
20
- }
21
- debounce(func, delay) {
22
- let timeoutId;
23
- return () => {
24
- clearTimeout(timeoutId);
25
- timeoutId = setTimeout(func, delay);
26
- };
20
+ }, 300);
27
21
  }
28
22
  handleResize() {
29
23
  this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.class.js","sourceRoot":"","sources":["../../../src/classes/core/viewport.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBaseObject } from '../..';\r\nimport { KritzelMouseButton } from '../../enums/event-button.enum';\r\nimport { KritzelCore } from './core.class';\r\n\r\nexport class KritzelViewport {\r\n private readonly _core: KritzelCore;\r\n private readonly _debounceUpdate: () => void;\r\n\r\n initialTouchDistance: number = 0;\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor(core: KritzelCore, host: HTMLElement) {\r\n this._core = core;\r\n this._core.store.state.host = host;\r\n this._core.store.state.viewportWidth = host.clientWidth;\r\n this._core.store.state.viewportHeight = host.clientHeight;\r\n this._core.store.state.startX = 0;\r\n this._core.store.state.startY = 0;\r\n this._core.store.state.translateX = 0;\r\n this._core.store.state.translateY = 0;\r\n\r\n this._debounceUpdate = this.debounce(() => {\r\n this._core.updateWorkspaceViewport(\r\n this._core.store.state.translateX, \r\n this._core.store.state.translateY, \r\n this._core.store.state.scale\r\n );\r\n }, 0);\r\n }\r\n\r\n private debounce(func: () => void, delay: number): () => void {\r\n let timeoutId: ReturnType<typeof setTimeout>;\r\n return () => {\r\n clearTimeout(timeoutId);\r\n timeoutId = setTimeout(func, delay);\r\n };\r\n }\r\n\r\n handleResize(): void {\r\n this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;\r\n this._core.store.state.viewportHeight = this._core.store.state.host.clientHeight;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.rerender();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._core.store.offsetX;\r\n const adjustedClientY = event.clientY - this._core.store.offsetY;\r\n\r\n if (event.button === KritzelMouseButton.Right) {\r\n this._core.store.state.isPanning = true;\r\n this._core.store.state.startX = adjustedClientX;\r\n this._core.store.state.startY = adjustedClientY;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const currentPath = this._core.store.currentPath;\r\n if (currentPath) {\r\n this._core.store.state.objectsMap.remove(obj => obj.id === currentPath.id);\r\n }\r\n this._core.store.state.isScaling = true;\r\n\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n this.initialTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n this.startX = (firstTouchX + secondTouchX) / 2;\r\n this.startY = (firstTouchY + secondTouchY) / 2;\r\n this._core.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n if (this._core.store.state.isPanning) {\r\n const dx = xRelativeToHost - this._core.store.state.startX;\r\n const dy = yRelativeToHost - this._core.store.state.startY;\r\n\r\n this._core.store.state.translateX += dx;\r\n this._core.store.state.translateY += dy;\r\n this._core.store.state.startX = xRelativeToHost;\r\n this._core.store.state.startY = yRelativeToHost;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.store.state.skipContextMenu = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n const currentTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n const midpointX = (firstTouchX + secondTouchX) / 2;\r\n const midpointY = (firstTouchY + secondTouchY) / 2;\r\n\r\n const scaleRatio = currentTouchDistance / this.initialTouchDistance!;\r\n const newScale = this._core.store.state.scale * scaleRatio;\r\n\r\n if (newScale > this._core.store.state.scaleMax || newScale < this._core.store.state.scaleMin) {\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY;\r\n } else {\r\n const translateXAdjustment = (midpointX - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (midpointY - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment;\r\n this._core.store.state.scale = newScale;\r\n\r\n this.initialTouchDistance = currentTouchDistance;\r\n }\r\n\r\n this.startX = midpointX;\r\n this.startY = midpointY;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isPanning) {\r\n this._core.store.state.isPanning = false;\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n \r\n if (this._core.store.state.pointers.size === 0) {\r\n setTimeout(() => {\r\n this._core.store.state.isScaling = false;\r\n this._core.rerender();\r\n }, 300);\r\n }\r\n }\r\n }\r\n\r\n handleWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n\r\n if (event.ctrlKey === true && Math.abs(event.deltaY) > 0 && Math.abs(event.deltaX) === 0) {\r\n this.handleZoom(event);\r\n }\r\n\r\n if (!event.ctrlKey) {\r\n this.handlePan(event);\r\n }\r\n }\r\n\r\n centerInViewport(object: KritzelBaseObject): void {\r\n const { scale, viewportWidth, viewportHeight } = this._core.store.state;\r\n const { x, y, width, height } = object.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n this._core.store.state.translateX = viewportWidth / 2 - objectCenterX * scale;\r\n this._core.store.state.translateY = viewportHeight / 2 - objectCenterY * scale;\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n\r\n centerFitInViewport(object: KritzelBaseObject): void {\r\n const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);\r\n const scaleY = this._core.store.state.viewportHeight / (object.rotatedBoundingBox.height * 1.1);\r\n const newScale = Math.min(scaleX, scaleY, this._core.store.state.scaleMax);\r\n const clampedScale = Math.max(newScale, this._core.store.state.scaleMin);\r\n\r\n this._core.store.state.scale = clampedScale;\r\n this.centerInViewport(object);\r\n }\r\n\r\n private handleZoom(event: WheelEvent): void {\r\n this._core.store.state.isScaling = true;\r\n const rect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - rect.left;\r\n const yRelativeToHost = event.clientY - rect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n 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;\r\n const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale + delta));\r\n\r\n const scaleRatio = newScale / this._core.store.state.scale;\r\n const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.scale = newScale;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY - translateYAdjustment;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n\r\n setTimeout(() => {\r\n this._core.store.state.isScaling = false;\r\n }, 300);\r\n }\r\n\r\n private handlePan(event: WheelEvent): void {\r\n const panSpeed = 0.8;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;\r\n this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"viewport.class.js","sourceRoot":"","sources":["../../../src/classes/core/viewport.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBaseObject } from '../..';\r\nimport { KritzelMouseButton } from '../../enums/event-button.enum';\r\nimport { KritzelCore } from './core.class';\r\nimport { debounce } from 'lodash';\r\n\r\nexport class KritzelViewport {\r\n private readonly _core: KritzelCore;\r\n private readonly _debounceUpdate: () => void;\r\n\r\n initialTouchDistance: number = 0;\r\n startX: number = 0;\r\n startY: number = 0;\r\n\r\n constructor(core: KritzelCore, host: HTMLElement) {\r\n this._core = core;\r\n this._core.store.state.host = host;\r\n this._core.store.state.viewportWidth = host.clientWidth;\r\n this._core.store.state.viewportHeight = host.clientHeight;\r\n this._core.store.state.startX = 0;\r\n this._core.store.state.startY = 0;\r\n this._core.store.state.translateX = 0;\r\n this._core.store.state.translateY = 0;\r\n\r\n this._debounceUpdate = debounce(() => {\r\n this._core.updateWorkspaceViewport(\r\n this._core.store.state.translateX, \r\n this._core.store.state.translateY, \r\n this._core.store.state.scale\r\n );\r\n }, 300);\r\n }\r\n\r\n handleResize(): void {\r\n this._core.store.state.viewportWidth = this._core.store.state.host.clientWidth;\r\n this._core.store.state.viewportHeight = this._core.store.state.host.clientHeight;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.rerender();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const adjustedClientX = event.clientX - this._core.store.offsetX;\r\n const adjustedClientY = event.clientY - this._core.store.offsetY;\r\n\r\n if (event.button === KritzelMouseButton.Right) {\r\n this._core.store.state.isPanning = true;\r\n this._core.store.state.startX = adjustedClientX;\r\n this._core.store.state.startY = adjustedClientY;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const currentPath = this._core.store.currentPath;\r\n if (currentPath) {\r\n this._core.store.state.objectsMap.remove(obj => obj.id === currentPath.id);\r\n }\r\n this._core.store.state.isScaling = true;\r\n\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n this.initialTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n this.startX = (firstTouchX + secondTouchX) / 2;\r\n this.startY = (firstTouchY + secondTouchY) / 2;\r\n this._core.rerender();\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n if (this._core.store.state.isPanning) {\r\n const dx = xRelativeToHost - this._core.store.state.startX;\r\n const dy = yRelativeToHost - this._core.store.state.startY;\r\n\r\n this._core.store.state.translateX += dx;\r\n this._core.store.state.translateY += dy;\r\n this._core.store.state.startX = xRelativeToHost;\r\n this._core.store.state.startY = yRelativeToHost;\r\n this._core.store.state.hasViewportChanged = true;\r\n this._core.store.state.skipContextMenu = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const hostRect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (activePointers.length === 2) {\r\n const firstTouchX = activePointers[0].clientX - this._core.store.offsetX;\r\n const firstTouchY = activePointers[0].clientY - this._core.store.offsetY;\r\n\r\n const secondTouchX = activePointers[1].clientX - this._core.store.offsetX;\r\n const secondTouchY = activePointers[1].clientY - this._core.store.offsetY;\r\n\r\n const currentTouchDistance = Math.sqrt(Math.pow(firstTouchX - secondTouchX, 2) + Math.pow(firstTouchY - secondTouchY, 2));\r\n\r\n const midpointX = (firstTouchX + secondTouchX) / 2;\r\n const midpointY = (firstTouchY + secondTouchY) / 2;\r\n\r\n const scaleRatio = currentTouchDistance / this.initialTouchDistance!;\r\n const newScale = this._core.store.state.scale * scaleRatio;\r\n\r\n if (newScale > this._core.store.state.scaleMax || newScale < this._core.store.state.scaleMin) {\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY;\r\n } else {\r\n const translateXAdjustment = (midpointX - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (midpointY - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX + midpointX - this.startX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY + midpointY - this.startY - translateYAdjustment;\r\n this._core.store.state.scale = newScale;\r\n\r\n this.initialTouchDistance = currentTouchDistance;\r\n }\r\n\r\n this.startX = midpointX;\r\n this.startY = midpointY;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent): void {\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isPanning) {\r\n this._core.store.state.isPanning = false;\r\n this._core.rerender();\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n \r\n if (this._core.store.state.pointers.size === 0) {\r\n setTimeout(() => {\r\n this._core.store.state.isScaling = false;\r\n this._core.rerender();\r\n }, 300);\r\n }\r\n }\r\n }\r\n\r\n handleWheel(event: WheelEvent): void {\r\n event.preventDefault();\r\n\r\n if (event.ctrlKey === true && Math.abs(event.deltaY) > 0 && Math.abs(event.deltaX) === 0) {\r\n this.handleZoom(event);\r\n }\r\n\r\n if (!event.ctrlKey) {\r\n this.handlePan(event);\r\n }\r\n }\r\n\r\n centerInViewport(object: KritzelBaseObject): void {\r\n const { scale, viewportWidth, viewportHeight } = this._core.store.state;\r\n const { x, y, width, height } = object.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n this._core.store.state.translateX = viewportWidth / 2 - objectCenterX * scale;\r\n this._core.store.state.translateY = viewportHeight / 2 - objectCenterY * scale;\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n\r\n centerFitInViewport(object: KritzelBaseObject): void {\r\n const scaleX = this._core.store.state.viewportWidth / (object.rotatedBoundingBox.width * 1.1);\r\n const scaleY = this._core.store.state.viewportHeight / (object.rotatedBoundingBox.height * 1.1);\r\n const newScale = Math.min(scaleX, scaleY, this._core.store.state.scaleMax);\r\n const clampedScale = Math.max(newScale, this._core.store.state.scaleMin);\r\n\r\n this._core.store.state.scale = clampedScale;\r\n this.centerInViewport(object);\r\n }\r\n\r\n private handleZoom(event: WheelEvent): void {\r\n this._core.store.state.isScaling = true;\r\n const rect = this._core.store.state.host.getBoundingClientRect();\r\n const xRelativeToHost = event.clientX - rect.left;\r\n const yRelativeToHost = event.clientY - rect.top;\r\n\r\n this._core.store.state.pointerX = (xRelativeToHost - this._core.store.state.translateX) / this._core.store.state.scale;\r\n this._core.store.state.pointerY = (yRelativeToHost - this._core.store.state.translateY) / this._core.store.state.scale;\r\n\r\n 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;\r\n const newScale = Math.min(this._core.store.state.scaleMax, Math.max(this._core.store.state.scaleMin, this._core.store.state.scale + delta));\r\n\r\n const scaleRatio = newScale / this._core.store.state.scale;\r\n const translateXAdjustment = (xRelativeToHost - this._core.store.state.translateX) * (scaleRatio - 1);\r\n const translateYAdjustment = (yRelativeToHost - this._core.store.state.translateY) * (scaleRatio - 1);\r\n\r\n this._core.store.state.scale = newScale;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - translateXAdjustment;\r\n this._core.store.state.translateY = this._core.store.state.translateY - translateYAdjustment;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n\r\n setTimeout(() => {\r\n this._core.store.state.isScaling = false;\r\n }, 300);\r\n }\r\n\r\n private handlePan(event: WheelEvent): void {\r\n const panSpeed = 0.8;\r\n\r\n this._core.store.state.translateX = this._core.store.state.translateX - event.deltaX * panSpeed;\r\n this._core.store.state.translateY = this._core.store.state.translateY - event.deltaY * panSpeed;\r\n\r\n this._core.store.state.hasViewportChanged = true;\r\n\r\n this._core.rerender();\r\n this._debounceUpdate();\r\n }\r\n}\r\n"]}
@@ -61,7 +61,6 @@ export class KritzelObjectMap {
61
61
  if (event.origin === 'temporary') {
62
62
  this._temporaryItemsCount++;
63
63
  }
64
- console.log('Undo performed for workspace', workspaceId, this._undoManager.undoStack.length, this._undoManager.redoStack.length);
65
64
  }
66
65
  });
67
66
  this._undoManager.on('stack-item-popped', event => {
@@ -70,7 +69,6 @@ export class KritzelObjectMap {
70
69
  if (event.origin === 'temporary' && this._temporaryItemsCount > 0) {
71
70
  this._temporaryItemsCount--;
72
71
  }
73
- console.log('Redo performed for workspace', workspaceId, this._undoManager.undoStack.length, this._undoManager.redoStack.length);
74
72
  }
75
73
  });
76
74
  // Observe changes to objects and sync with application state
@@ -1 +1 @@
1
- {"version":3,"file":"object-map.structure.js","sourceRoot":"","sources":["../../../src/classes/structures/object-map.structure.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Y from 'yjs';\r\nimport { KritzelReviver } from '../core/reviver.class';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { ISyncProvider } from '../../interfaces/sync-provider.interface';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { DEFAULT_SYNC_CONFIG } from '../../configs/default-sync.config';\r\n\r\nexport class KritzelObjectMap<T extends KritzelBaseObject<any>> {\r\n private map: Map<string, T>;\r\n private _ydoc: Y.Doc | null = null;\r\n private _objectsMap: Y.Map<any> | null = null;\r\n private _providers: ISyncProvider[] = [];\r\n private _undoManager: Y.UndoManager | null = null;\r\n private _reviver: KritzelReviver | null = null;\r\n private _core: KritzelCore | null = null;\r\n private _workspaceId: string | null = null;\r\n private _isReady: boolean = false;\r\n private _temporaryItemsCount: number = 0;\r\n\r\n get isReady(): boolean {\r\n return this._isReady;\r\n }\r\n\r\n get undoManager(): Y.UndoManager | null {\r\n return this._undoManager;\r\n }\r\n\r\n get workspaceId(): string | null {\r\n return this._workspaceId;\r\n }\r\n\r\n constructor() {\r\n this.map = new Map<string, T>();\r\n }\r\n\r\n async initialize(core: KritzelCore, workspaceId: string, config?: KritzelSyncConfig): Promise<void> {\r\n this._core = core;\r\n this._workspaceId = workspaceId;\r\n this._reviver = new KritzelReviver(core);\r\n\r\n // Create a dedicated Y.Doc for this workspace\r\n this._ydoc = new Y.Doc();\r\n this._objectsMap = this._ydoc.getMap('objects');\r\n\r\n const docName = `kritzel-workspace-${workspaceId}`;\r\n const finalConfig = config ?? DEFAULT_SYNC_CONFIG;\r\n\r\n // Instantiate providers from configuration\r\n for (const providerConfig of finalConfig.providers) {\r\n let provider: ISyncProvider;\r\n\r\n // Check if it's a class constructor or a factory\r\n if (typeof providerConfig === 'function') {\r\n // It's a class constructor\r\n provider = new providerConfig(docName, this._ydoc);\r\n } else {\r\n // It's a factory with a create method\r\n provider = providerConfig.create(docName, this._ydoc);\r\n }\r\n\r\n this._providers.push(provider);\r\n }\r\n\r\n // Set up undo/redo manager for this workspace\r\n this._undoManager = new Y.UndoManager([this._objectsMap], {\r\n captureTimeout: 200,\r\n trackedOrigins: new Set(['local', 'temporary']),\r\n ignoreRemoteMapChanges: true,\r\n });\r\n\r\n this._undoManager.on('stack-item-added', event => {\r\n if (event.type === 'undo') {\r\n // Track if this was a temporary item\r\n if (event.origin === 'temporary') {\r\n this._temporaryItemsCount++;\r\n }\r\n console.log('Undo performed for workspace', workspaceId, this._undoManager.undoStack.length, this._undoManager.redoStack.length);\r\n }\r\n });\r\n\r\n this._undoManager.on('stack-item-popped', event => {\r\n if (event.type === 'undo') {\r\n // Reduce temporary count when items are undone\r\n if (event.origin === 'temporary' && this._temporaryItemsCount > 0) {\r\n this._temporaryItemsCount--;\r\n }\r\n console.log('Redo performed for workspace', workspaceId, this._undoManager.undoStack.length, this._undoManager.redoStack.length);\r\n }\r\n });\r\n\r\n // Observe changes to objects and sync with application state\r\n this._objectsMap.observe(event => {\r\n this.handleObjectsChange(event);\r\n });\r\n\r\n // Connect all providers in parallel\r\n await Promise.all(this._providers.map(p => p.connect()));\r\n this._isReady = true;\r\n\r\n // Load objects from Yjs\r\n this.loadFromYjs();\r\n }\r\n\r\n private handleObjectsChange(event: Y.YMapEvent<any>): void {\r\n // Skip Map updates for local changes (already done), but still trigger re-render\r\n // 'temporary' is also a local change that shouldn't be re-deserialized\r\n if (event.transaction.origin === 'local' || event.transaction.origin === 'temporary') {\r\n this._core?.rerender();\r\n return;\r\n }\r\n\r\n const changedKeys = Array.from(event.keysChanged);\r\n const objectsToUpdate = [];\r\n const selectionGroupsToUpdate = [];\r\n const objectsToDelete = [];\r\n\r\n changedKeys.forEach(key => {\r\n const change = event.changes.keys.get(key);\r\n\r\n if (change && change.action === 'delete') {\r\n objectsToDelete.push(key);\r\n } else {\r\n const serialized = this._objectsMap.get(key);\r\n if (serialized) {\r\n const object = this._reviver.revive(serialized);\r\n\r\n // Separate SelectionGroups to process them after regular objects\r\n if (object instanceof KritzelSelectionGroup) {\r\n selectionGroupsToUpdate.push(object);\r\n } else {\r\n objectsToUpdate.push(object);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Delete objects from local map\r\n objectsToDelete.forEach(objectId => {\r\n this.map.delete(objectId);\r\n });\r\n\r\n // First, update or insert regular objects\r\n objectsToUpdate.forEach(object => {\r\n this.map.set(object.id, object);\r\n });\r\n\r\n // Then, update or insert SelectionGroups\r\n selectionGroupsToUpdate.forEach(object => {\r\n this.map.set(object.id, object);\r\n });\r\n\r\n this._core?.rerender();\r\n }\r\n transaction(callback: () => void): void {\r\n if (this._ydoc) {\r\n this._ydoc.transact(callback, 'local');\r\n }\r\n }\r\n\r\n loadFromYjs(): void {\r\n if (!this._objectsMap || !this._reviver) {\r\n return;\r\n }\r\n\r\n this.map.clear();\r\n this._objectsMap.forEach((serialized, key) => {\r\n const object = this._reviver.revive<T>(serialized);\r\n this.map.set(key, object);\r\n });\r\n }\r\n\r\n reset(): void {\r\n this.map.clear();\r\n this._ydoc.transact(() => {\r\n this._objectsMap.clear();\r\n }, 'local');\r\n }\r\n\r\n insert(object: T): boolean {\r\n if (!object.id) {\r\n return false;\r\n }\r\n this.map.set(object.id, object);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n const serialized = object.serialize();\r\n this._ydoc.transact(() => {\r\n this._objectsMap.set(object.id, serialized);\r\n }, 'local');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n update(object: T, options: { temporary?: boolean } = {}): boolean {\r\n if (!object.id || !this.map.has(object.id)) {\r\n return false;\r\n }\r\n this.map.set(object.id, object);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n const serialized = object.serialize();\r\n\r\n const origin = options.temporary ? 'temporary' : 'local';\r\n\r\n this._ydoc.transact(() => {\r\n this._objectsMap.set(object.id, serialized);\r\n }, origin);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n remove(predicate: (object: T) => boolean): void {\r\n for (const [id, object] of this.map) {\r\n if (predicate(object)) {\r\n this.map.delete(id);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n this._ydoc.transact(() => {\r\n this._objectsMap.delete(id);\r\n }, 'local');\r\n }\r\n }\r\n }\r\n }\r\n\r\n filter(predicate: (object: T) => boolean): T[] {\r\n const results: T[] = [];\r\n for (const object of this.map.values()) {\r\n if (predicate(object)) {\r\n results.push(object);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n allObjects(): T[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n private isPersistable(object: T): boolean {\r\n if (object instanceof KritzelSelectionBox) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n undo(): void {\r\n if (this._undoManager && this._undoManager.canUndo()) {\r\n this._undoManager.undo();\r\n }\r\n }\r\n\r\n redo(): void {\r\n if (this._undoManager && this._undoManager.canRedo()) {\r\n this._undoManager.redo();\r\n }\r\n }\r\n\r\n canUndo(): boolean {\r\n return this._undoManager ? this._undoManager.canUndo() : false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this._undoManager ? this._undoManager.canRedo() : false;\r\n }\r\n\r\n clearHistory(): void {\r\n if (this._undoManager) {\r\n this._undoManager.clear();\r\n this._temporaryItemsCount = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Consolidates all temporary items in the undo stack into a single undo item.\r\n * Call this when you want to merge multiple temporary changes (e.g., keystrokes) into one.\r\n */\r\n consolidateTemporaryItems(): void {\r\n if (!this._undoManager || this._temporaryItemsCount === 0) {\r\n return;\r\n }\r\n\r\n // Get current stack length\r\n const stackLength = this._undoManager.undoStack.length;\r\n \r\n if (stackLength === 0) {\r\n this._temporaryItemsCount = 0;\r\n return;\r\n }\r\n\r\n // Stop tracking temporarily\r\n this._undoManager.stopCapturing();\r\n \r\n // The temporary items should be at the end of the stack\r\n // We'll need to undo them all, then redo as a single transaction\r\n const itemsToConsolidate = Math.min(this._temporaryItemsCount, stackLength);\r\n \r\n if (itemsToConsolidate > 1) {\r\n // Store the current state before undoing\r\n const undoneItems: any[] = [];\r\n \r\n // Undo all temporary items\r\n for (let i = 0; i < itemsToConsolidate; i++) {\r\n if (this._undoManager.canUndo()) {\r\n undoneItems.push(this._undoManager.undoStack[this._undoManager.undoStack.length - 1]);\r\n this._undoManager.undo();\r\n }\r\n }\r\n \r\n // Now redo them all as a single 'local' transaction\r\n // This will consolidate them into one undo item\r\n this._ydoc.transact(() => {\r\n for (let i = itemsToConsolidate - 1; i >= 0; i--) {\r\n if (this._undoManager.canRedo()) {\r\n this._undoManager.redo();\r\n }\r\n }\r\n }, 'local');\r\n } else if (itemsToConsolidate === 1) {\r\n // If only one temporary item, just change its origin to 'local'\r\n // This is implicit - next transaction will be separate\r\n }\r\n \r\n this._temporaryItemsCount = 0;\r\n }\r\n\r\n /**\r\n * Removes all temporary items from the undo stack without consolidating them.\r\n * Use this to discard temporary changes completely.\r\n */\r\n clearTemporaryItems(): void {\r\n if (!this._undoManager || this._temporaryItemsCount === 0) {\r\n return;\r\n }\r\n\r\n const stackLength = this._undoManager.undoStack.length;\r\n const itemsToRemove = Math.min(this._temporaryItemsCount, stackLength);\r\n \r\n // Remove items from the end of the stack\r\n for (let i = 0; i < itemsToRemove; i++) {\r\n if (this._undoManager.undoStack.length > 0) {\r\n this._undoManager.undoStack.pop();\r\n }\r\n }\r\n \r\n this._temporaryItemsCount = 0;\r\n }\r\n\r\n destroy(): void {\r\n this._providers.forEach(p => p.destroy());\r\n this._providers = [];\r\n\r\n if (this._ydoc) {\r\n this._ydoc.destroy();\r\n }\r\n this.map.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"object-map.structure.js","sourceRoot":"","sources":["../../../src/classes/structures/object-map.structure.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Y from 'yjs';\r\nimport { KritzelReviver } from '../core/reviver.class';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { ISyncProvider } from '../../interfaces/sync-provider.interface';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { DEFAULT_SYNC_CONFIG } from '../../configs/default-sync.config';\r\n\r\nexport class KritzelObjectMap<T extends KritzelBaseObject<any>> {\r\n private map: Map<string, T>;\r\n private _ydoc: Y.Doc | null = null;\r\n private _objectsMap: Y.Map<any> | null = null;\r\n private _providers: ISyncProvider[] = [];\r\n private _undoManager: Y.UndoManager | null = null;\r\n private _reviver: KritzelReviver | null = null;\r\n private _core: KritzelCore | null = null;\r\n private _workspaceId: string | null = null;\r\n private _isReady: boolean = false;\r\n private _temporaryItemsCount: number = 0;\r\n\r\n get isReady(): boolean {\r\n return this._isReady;\r\n }\r\n\r\n get undoManager(): Y.UndoManager | null {\r\n return this._undoManager;\r\n }\r\n\r\n get workspaceId(): string | null {\r\n return this._workspaceId;\r\n }\r\n\r\n constructor() {\r\n this.map = new Map<string, T>();\r\n }\r\n\r\n async initialize(core: KritzelCore, workspaceId: string, config?: KritzelSyncConfig): Promise<void> {\r\n this._core = core;\r\n this._workspaceId = workspaceId;\r\n this._reviver = new KritzelReviver(core);\r\n\r\n // Create a dedicated Y.Doc for this workspace\r\n this._ydoc = new Y.Doc();\r\n this._objectsMap = this._ydoc.getMap('objects');\r\n\r\n const docName = `kritzel-workspace-${workspaceId}`;\r\n const finalConfig = config ?? DEFAULT_SYNC_CONFIG;\r\n\r\n // Instantiate providers from configuration\r\n for (const providerConfig of finalConfig.providers) {\r\n let provider: ISyncProvider;\r\n\r\n // Check if it's a class constructor or a factory\r\n if (typeof providerConfig === 'function') {\r\n // It's a class constructor\r\n provider = new providerConfig(docName, this._ydoc);\r\n } else {\r\n // It's a factory with a create method\r\n provider = providerConfig.create(docName, this._ydoc);\r\n }\r\n\r\n this._providers.push(provider);\r\n }\r\n\r\n // Set up undo/redo manager for this workspace\r\n this._undoManager = new Y.UndoManager([this._objectsMap], {\r\n captureTimeout: 200,\r\n trackedOrigins: new Set(['local', 'temporary']),\r\n ignoreRemoteMapChanges: true,\r\n });\r\n\r\n this._undoManager.on('stack-item-added', event => {\r\n if (event.type === 'undo') {\r\n // Track if this was a temporary item\r\n if (event.origin === 'temporary') {\r\n this._temporaryItemsCount++;\r\n }\r\n }\r\n });\r\n\r\n this._undoManager.on('stack-item-popped', event => {\r\n if (event.type === 'undo') {\r\n // Reduce temporary count when items are undone\r\n if (event.origin === 'temporary' && this._temporaryItemsCount > 0) {\r\n this._temporaryItemsCount--;\r\n }\r\n }\r\n });\r\n\r\n // Observe changes to objects and sync with application state\r\n this._objectsMap.observe(event => {\r\n this.handleObjectsChange(event);\r\n });\r\n\r\n // Connect all providers in parallel\r\n await Promise.all(this._providers.map(p => p.connect()));\r\n this._isReady = true;\r\n\r\n // Load objects from Yjs\r\n this.loadFromYjs();\r\n }\r\n\r\n private handleObjectsChange(event: Y.YMapEvent<any>): void {\r\n // Skip Map updates for local changes (already done), but still trigger re-render\r\n // 'temporary' is also a local change that shouldn't be re-deserialized\r\n if (event.transaction.origin === 'local' || event.transaction.origin === 'temporary') {\r\n this._core?.rerender();\r\n return;\r\n }\r\n\r\n const changedKeys = Array.from(event.keysChanged);\r\n const objectsToUpdate = [];\r\n const selectionGroupsToUpdate = [];\r\n const objectsToDelete = [];\r\n\r\n changedKeys.forEach(key => {\r\n const change = event.changes.keys.get(key);\r\n\r\n if (change && change.action === 'delete') {\r\n objectsToDelete.push(key);\r\n } else {\r\n const serialized = this._objectsMap.get(key);\r\n if (serialized) {\r\n const object = this._reviver.revive(serialized);\r\n\r\n // Separate SelectionGroups to process them after regular objects\r\n if (object instanceof KritzelSelectionGroup) {\r\n selectionGroupsToUpdate.push(object);\r\n } else {\r\n objectsToUpdate.push(object);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Delete objects from local map\r\n objectsToDelete.forEach(objectId => {\r\n this.map.delete(objectId);\r\n });\r\n\r\n // First, update or insert regular objects\r\n objectsToUpdate.forEach(object => {\r\n this.map.set(object.id, object);\r\n });\r\n\r\n // Then, update or insert SelectionGroups\r\n selectionGroupsToUpdate.forEach(object => {\r\n this.map.set(object.id, object);\r\n });\r\n\r\n this._core?.rerender();\r\n }\r\n transaction(callback: () => void): void {\r\n if (this._ydoc) {\r\n this._ydoc.transact(callback, 'local');\r\n }\r\n }\r\n\r\n loadFromYjs(): void {\r\n if (!this._objectsMap || !this._reviver) {\r\n return;\r\n }\r\n\r\n this.map.clear();\r\n this._objectsMap.forEach((serialized, key) => {\r\n const object = this._reviver.revive<T>(serialized);\r\n this.map.set(key, object);\r\n });\r\n }\r\n\r\n reset(): void {\r\n this.map.clear();\r\n this._ydoc.transact(() => {\r\n this._objectsMap.clear();\r\n }, 'local');\r\n }\r\n\r\n insert(object: T): boolean {\r\n if (!object.id) {\r\n return false;\r\n }\r\n this.map.set(object.id, object);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n const serialized = object.serialize();\r\n this._ydoc.transact(() => {\r\n this._objectsMap.set(object.id, serialized);\r\n }, 'local');\r\n }\r\n\r\n return true;\r\n }\r\n\r\n update(object: T, options: { temporary?: boolean } = {}): boolean {\r\n if (!object.id || !this.map.has(object.id)) {\r\n return false;\r\n }\r\n this.map.set(object.id, object);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n const serialized = object.serialize();\r\n\r\n const origin = options.temporary ? 'temporary' : 'local';\r\n\r\n this._ydoc.transact(() => {\r\n this._objectsMap.set(object.id, serialized);\r\n }, origin);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n remove(predicate: (object: T) => boolean): void {\r\n for (const [id, object] of this.map) {\r\n if (predicate(object)) {\r\n this.map.delete(id);\r\n\r\n if (this._objectsMap && this.isPersistable(object)) {\r\n this._ydoc.transact(() => {\r\n this._objectsMap.delete(id);\r\n }, 'local');\r\n }\r\n }\r\n }\r\n }\r\n\r\n filter(predicate: (object: T) => boolean): T[] {\r\n const results: T[] = [];\r\n for (const object of this.map.values()) {\r\n if (predicate(object)) {\r\n results.push(object);\r\n }\r\n }\r\n return results;\r\n }\r\n\r\n allObjects(): T[] {\r\n return Array.from(this.map.values());\r\n }\r\n\r\n private isPersistable(object: T): boolean {\r\n if (object instanceof KritzelSelectionBox) {\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n undo(): void {\r\n if (this._undoManager && this._undoManager.canUndo()) {\r\n this._undoManager.undo();\r\n }\r\n }\r\n\r\n redo(): void {\r\n if (this._undoManager && this._undoManager.canRedo()) {\r\n this._undoManager.redo();\r\n }\r\n }\r\n\r\n canUndo(): boolean {\r\n return this._undoManager ? this._undoManager.canUndo() : false;\r\n }\r\n\r\n canRedo(): boolean {\r\n return this._undoManager ? this._undoManager.canRedo() : false;\r\n }\r\n\r\n clearHistory(): void {\r\n if (this._undoManager) {\r\n this._undoManager.clear();\r\n this._temporaryItemsCount = 0;\r\n }\r\n }\r\n\r\n /**\r\n * Consolidates all temporary items in the undo stack into a single undo item.\r\n * Call this when you want to merge multiple temporary changes (e.g., keystrokes) into one.\r\n */\r\n consolidateTemporaryItems(): void {\r\n if (!this._undoManager || this._temporaryItemsCount === 0) {\r\n return;\r\n }\r\n\r\n // Get current stack length\r\n const stackLength = this._undoManager.undoStack.length;\r\n \r\n if (stackLength === 0) {\r\n this._temporaryItemsCount = 0;\r\n return;\r\n }\r\n\r\n // Stop tracking temporarily\r\n this._undoManager.stopCapturing();\r\n \r\n // The temporary items should be at the end of the stack\r\n // We'll need to undo them all, then redo as a single transaction\r\n const itemsToConsolidate = Math.min(this._temporaryItemsCount, stackLength);\r\n \r\n if (itemsToConsolidate > 1) {\r\n // Store the current state before undoing\r\n const undoneItems: any[] = [];\r\n \r\n // Undo all temporary items\r\n for (let i = 0; i < itemsToConsolidate; i++) {\r\n if (this._undoManager.canUndo()) {\r\n undoneItems.push(this._undoManager.undoStack[this._undoManager.undoStack.length - 1]);\r\n this._undoManager.undo();\r\n }\r\n }\r\n \r\n // Now redo them all as a single 'local' transaction\r\n // This will consolidate them into one undo item\r\n this._ydoc.transact(() => {\r\n for (let i = itemsToConsolidate - 1; i >= 0; i--) {\r\n if (this._undoManager.canRedo()) {\r\n this._undoManager.redo();\r\n }\r\n }\r\n }, 'local');\r\n } else if (itemsToConsolidate === 1) {\r\n // If only one temporary item, just change its origin to 'local'\r\n // This is implicit - next transaction will be separate\r\n }\r\n \r\n this._temporaryItemsCount = 0;\r\n }\r\n\r\n /**\r\n * Removes all temporary items from the undo stack without consolidating them.\r\n * Use this to discard temporary changes completely.\r\n */\r\n clearTemporaryItems(): void {\r\n if (!this._undoManager || this._temporaryItemsCount === 0) {\r\n return;\r\n }\r\n\r\n const stackLength = this._undoManager.undoStack.length;\r\n const itemsToRemove = Math.min(this._temporaryItemsCount, stackLength);\r\n \r\n // Remove items from the end of the stack\r\n for (let i = 0; i < itemsToRemove; i++) {\r\n if (this._undoManager.undoStack.length > 0) {\r\n this._undoManager.undoStack.pop();\r\n }\r\n }\r\n \r\n this._temporaryItemsCount = 0;\r\n }\r\n\r\n destroy(): void {\r\n this._providers.forEach(p => p.destroy());\r\n this._providers = [];\r\n\r\n if (this._ydoc) {\r\n this._ydoc.destroy();\r\n }\r\n this.map.clear();\r\n }\r\n}\r\n"]}
@@ -63,7 +63,7 @@ export class KritzelCursorTrail {
63
63
  }
64
64
  }
65
65
  render() {
66
- 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: {
66
+ 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: {
67
67
  position: 'absolute',
68
68
  left: '0',
69
69
  top: '0',
@@ -216,7 +216,7 @@ export class KritzelEditor {
216
216
  }
217
217
  }
218
218
  render() {
219
- return (h(Host, { key: '5e91eb780eed57131e0389969c359b9ec9a4faaf' }, h("kritzel-workspace-manager", { key: 'c212455bc5042d35963e774d918ef15f5e4fd7e1', workspaces: this.workspaces, activeWorkspace: this.activeWorkspace, onWorkspaceChange: event => (this.activeWorkspace = event.detail), onIsWorkspaceManagerReady: () => (this.isWorkspaceManagerReady = true) }), h("kritzel-engine", { key: '214b6c42b21893172401a6918b2797c0758b3d48', 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: '32c6b6408e2fd2c4eaa30efc50bb75b55252a265', 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) })));
219
+ 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) })));
220
220
  }
221
221
  static get is() { return "kritzel-editor"; }
222
222
  static get originalStyleUrls() {
@@ -13,6 +13,7 @@ import { KritzelClassHelper } from "../../../helpers/class.helper";
13
13
  import { ABSOLUTE_SCALE_MAX, ABSOLUTE_SCALE_MIN } from "../../../constants/engine.constants";
14
14
  import { KritzelCore } from "../../../classes/core/core.class";
15
15
  import { KritzelDevicesHelper } from "../../../helpers/devices.helper";
16
+ import { throttle } from "lodash";
16
17
  export class KritzelEngine {
17
18
  host;
18
19
  workspace;
@@ -82,9 +83,22 @@ export class KritzelEngine {
82
83
  return;
83
84
  }
84
85
  this.core.store.state.pointers.set(ev.pointerId, ev);
86
+ // Use different throttle functions based on pointer count
87
+ if (this.core.store.state.pointers.size > 1) {
88
+ this.throttledPointerMoveMulti(ev);
89
+ }
90
+ else {
91
+ this.throttledPointerMoveSingle(ev);
92
+ }
93
+ }
94
+ throttledPointerMoveSingle = throttle((ev) => {
85
95
  this.viewport.handlePointerMove(ev);
86
96
  this.core.store.state?.activeTool?.handlePointerMove(ev);
87
- }
97
+ }, 0);
98
+ throttledPointerMoveMulti = throttle((ev) => {
99
+ this.viewport.handlePointerMove(ev);
100
+ this.core.store.state?.activeTool?.handlePointerMove(ev);
101
+ }, 100);
88
102
  handlePointerUp(ev) {
89
103
  if (this.core.store.isDisabled) {
90
104
  return;
@@ -283,6 +297,10 @@ export class KritzelEngine {
283
297
  constructor() {
284
298
  this.core = new KritzelCore(this);
285
299
  }
300
+ disconnectedCallback() {
301
+ this.throttledPointerMoveSingle.cancel();
302
+ this.throttledPointerMoveMulti.cancel();
303
+ }
286
304
  componentWillLoad() {
287
305
  this.validateScaleMax(this.scaleMax);
288
306
  this.validateScaleMin(this.scaleMin);
@@ -333,8 +351,9 @@ export class KritzelEngine {
333
351
  const baseHandleTouchSize = baseHandleSize * 2 < 14 ? 14 : baseHandleSize;
334
352
  const viewportCenterX = this.core.store.state.viewportWidth / 2 + this.core.store.state.translateX;
335
353
  const viewportCenterY = this.core.store.state.viewportHeight / 2 + this.core.store.state.translateY;
336
- return (h(Host, { key: 'b67ab4cce757661cb7b1bdc10035a3aea61cb24d' }, h("div", { key: '54160ed099438a59043ff4f5a774ee8c89a02153', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: '66e3a55bc530877256782073c4378b77d95ccfee' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '841ea8bf317c3ef5ea35950f6bb2be9e6a8116cf' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: 'ec3a7797f01606308b54cf9b13bf7a3722c54287' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '485dbc3021940fad42bae53a825206f27c76e604' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '20fed3eb07d6599a175e43cd7e1708aa2a61cf31' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '06522e742ac0d3d7c36b4b64307d695459b792e4' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: 'e745be888b5e1b36331359ca9fa1afc166333d13' }, "Scale: ", this.core.store.state?.scale), h("div", { key: 'f9074a0e3434aa0fb60d8d1fc1201815cb94fb7c' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '3f96d5f90187cb0e042c4529351681b4799d9b38' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '6ca3d01c4aa817b0ccfd8bd1c5b65588006ecb5b' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'c2941fdce608c0a0396996aa3667f3fa18cc29a3' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '0a99cd2e9767e4a9cb74af735a5eff5a86a9b6c4' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '0e749d3d2e131ab5984acbc7d9d91023b166ed45' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '0f102c2e704a18271e5b322814403c1cd0938356' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: 'd0c7eaa357268d4df97e50e85634e4be36e678ac' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: 'eb7b0d98fd3d4a13f152ded89a6649f408852575' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'bd9a16ff4537a9b6e73bff8d67222c4281a60fa0' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'fdeb2b546e421e9ce9d61e1527fcc79bd1cb217e' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '9e7e93bcb5ce9c92ea9686140fc30851f6a4c66d' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: 'aaad9771c7286e352f99e2613616e8f023044926' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: 'fca0584ae7d2481b2ccdb71a24ad123a5efc6668' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: 'a3f870ca59feb6698f2a9d4a106a694ac9b8cb3f' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: '4616f1af54642b448806e7271b421f3d7e980dd1', id: "origin", class: "origin", style: {
354
+ return (h(Host, { key: '17bf6a3ff6eb5b5d94d786267d3bdff8805cb533' }, h("div", { key: 'f188bf94dcd66074b9e1f71b2c683955f020cb49', class: "debug-panel", style: { display: this.core.store.state.debugInfo.showViewportInfo ? 'block' : 'none' } }, h("div", { key: 'fbb921e10faf42b323decc4871537191c145fc14' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '826207310bbdc2f5e28de541de79016df759aebb' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '42dbb74aa75858a540acabd868a6a16428857028' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: 'b3e88f31170b9ac6e107cf96e31173e6e8e193a9' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: 'b8f9ac44d9488ab10d7118ec676c6897e08f3cd6' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '1a4b6c1ded1d6cda9e2a1777dc3aafeb58f00c46' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '993d90e986fe0b5c60dfa15f952e5f752526518c' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: '32ba561e1129ea5550f03daa81cb5ba5bedbea53' }, "Scale: ", this.core.store.state?.scale), h("div", { key: 'de89601fd42ae57349eae765242ebf9151d9b561' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: 'e661fd788007ef0e0ac68d9950d8a65c54288bc4' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: 'f3c00e656c78ad4e12ebe7dd201f53237687dda0' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: '00e6183e59a302678ea48b3738e32607f34b06bb' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: 'c9cc3a645e47e78e79f28704a3a7a1338c3b14dc' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '4b1a5e76f1bfd1b8f6de5bab444622d5a937caf5' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '326852e22e526f67b75da99947427a50ff9b1b3c' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: 'ca2b54a494f27aff9b9cfa7a09a24c8220412937' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: '7ede9aee3c18143ac66823b78157e4ed35813c6c' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'fdf9863a45c4861bbd1a45817d029cc7be57e305' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: 'b8352a9390586a99adbdfeaead3a53c2f2adcccb' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '8685bfb218fc405abd1e4e060958f05ee5604f5a' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: 'bc35c91f407a5d5c06216a6b549bf1870a10b9f8' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '49ca83379e9cd80be9afe8e51ece26bd860e8b2c' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '61923c56ee0bbde62ecaf15844465fa2552b2e3a' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")")), h("div", { key: '01fad2fea8986db5b423b9ad50fdc729b93f5564', id: "origin", class: "origin", style: {
337
355
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
356
+ willChange: 'transform',
338
357
  } }, this.core.store.state.objectsMap.allObjects()?.map(object => {
339
358
  return (h("div", { key: object.id, style: {
340
359
  display: object.isInViewport() ? 'block' : 'none',
@@ -342,6 +361,8 @@ export class KritzelEngine {
342
361
  transformOrigin: 'top left',
343
362
  zIndex: object.zIndex.toString(),
344
363
  position: 'absolute',
364
+ pointerEvents: this.core.store.state.isScaling ? 'none' : 'auto',
365
+ willChange: this.core.store.state.isScaling ? 'transform' : 'auto',
345
366
  } }, h("svg", { xmlns: "http://www.w3.org/2000/svg", id: object.id, class: "object", style: {
346
367
  height: object?.totalHeight.toString(),
347
368
  width: object?.totalWidth.toString(),
@@ -438,7 +459,7 @@ export class KritzelEngine {
438
459
  fill: 'transparent',
439
460
  cursor: 'grab',
440
461
  }, 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)))))));
441
- })), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '7907e01ea585125e8377d473d8d7d764b5e35609', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
462
+ })), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '9a4985baa6f90aeeeca3a32958f79ebee9645c6d', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
442
463
  position: 'fixed',
443
464
  left: `${this.core.store.state.contextMenuX}px`,
444
465
  top: `${this.core.store.state.contextMenuY}px`,
@@ -449,7 +470,7 @@ export class KritzelEngine {
449
470
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
450
471
  }, this.core.store.selectionGroup?.objects);
451
472
  this.hideContextMenu();
452
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '4cb3d1ce212b078514524e9edc7c22f6117e5160', core: this.core })));
473
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '5793c405666b73a93ba473edf9477653683ef786', core: this.core })));
453
474
  }
454
475
  static get is() { return "kritzel-engine"; }
455
476
  static get encapsulation() { return "shadow"; }