kritzel-stencil 0.0.161 → 0.0.162

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 (126) hide show
  1. package/dist/cjs/{default-text-tool.config-zB3FPuXq.js → default-line-tool.config-D1Ns0NmM.js} +3156 -1052
  2. package/dist/cjs/default-line-tool.config-D1Ns0NmM.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +131 -127
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/kritzel-color_22.cjs.entry.js +480 -147
  6. package/dist/collection/classes/core/core.class.js +140 -3
  7. package/dist/collection/classes/core/core.class.js.map +1 -1
  8. package/dist/collection/classes/core/reviver.class.js +8 -0
  9. package/dist/collection/classes/core/reviver.class.js.map +1 -1
  10. package/dist/collection/classes/core/store.class.js +5 -0
  11. package/dist/collection/classes/core/store.class.js.map +1 -1
  12. package/dist/collection/classes/handlers/line-handle.handler.js +383 -0
  13. package/dist/collection/classes/handlers/line-handle.handler.js.map +1 -0
  14. package/dist/collection/classes/handlers/move.handler.js +2 -2
  15. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  16. package/dist/collection/classes/managers/anchor.manager.js +874 -0
  17. package/dist/collection/classes/managers/anchor.manager.js.map +1 -0
  18. package/dist/collection/classes/managers/cursor.manager.js +117 -0
  19. package/dist/collection/classes/managers/cursor.manager.js.map +1 -0
  20. package/dist/collection/classes/objects/base-object.class.js +4 -2
  21. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  22. package/dist/collection/classes/objects/line.class.js +564 -0
  23. package/dist/collection/classes/objects/line.class.js.map +1 -0
  24. package/dist/collection/classes/objects/selection-group.class.js +4 -0
  25. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  26. package/dist/collection/classes/registries/icon-registry.class.js +1 -0
  27. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  28. package/dist/collection/classes/tools/line-tool.class.js +172 -0
  29. package/dist/collection/classes/tools/line-tool.class.js.map +1 -0
  30. package/dist/collection/classes/tools/selection-tool.class.js +41 -8
  31. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  32. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +11 -2
  33. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  34. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +130 -58
  35. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  36. package/dist/collection/configs/default-engine-config.js +4 -0
  37. package/dist/collection/configs/default-engine-config.js.map +1 -1
  38. package/dist/collection/configs/default-line-tool.config.js +34 -0
  39. package/dist/collection/configs/default-line-tool.config.js.map +1 -0
  40. package/dist/collection/helpers/geometry.helper.js +42 -0
  41. package/dist/collection/helpers/geometry.helper.js.map +1 -1
  42. package/dist/collection/index.js +5 -0
  43. package/dist/collection/index.js.map +1 -1
  44. package/dist/collection/interfaces/anchor.interface.js +2 -0
  45. package/dist/collection/interfaces/anchor.interface.js.map +1 -0
  46. package/dist/collection/interfaces/arrow-head.interface.js +2 -0
  47. package/dist/collection/interfaces/arrow-head.interface.js.map +1 -0
  48. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  49. package/dist/collection/interfaces/line-options.interface.js +2 -0
  50. package/dist/collection/interfaces/line-options.interface.js.map +1 -0
  51. package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -1
  52. package/dist/components/index.js +4 -4
  53. package/dist/components/kritzel-brush-style.js +1 -1
  54. package/dist/components/kritzel-context-menu.js +1 -1
  55. package/dist/components/kritzel-control-brush-config.js +1 -1
  56. package/dist/components/kritzel-control-text-config.js +1 -1
  57. package/dist/components/kritzel-controls.js +1 -1
  58. package/dist/components/kritzel-editor.js +54 -13
  59. package/dist/components/kritzel-editor.js.map +1 -1
  60. package/dist/components/kritzel-engine.js +1 -1
  61. package/dist/components/kritzel-icon.js +1 -1
  62. package/dist/components/kritzel-menu-item.js +1 -1
  63. package/dist/components/kritzel-menu.js +1 -1
  64. package/dist/components/kritzel-split-button.js +1 -1
  65. package/dist/components/kritzel-utility-panel.js +1 -1
  66. package/dist/components/kritzel-workspace-manager.js +1 -1
  67. package/dist/components/{p-BdZKPKnx.js → p-7_lwv0zQ.js} +4 -4
  68. package/dist/components/{p-BdZKPKnx.js.map → p-7_lwv0zQ.js.map} +1 -1
  69. package/dist/components/{p-DbKKCHKd.js → p-BixlbUD7.js} +3 -2
  70. package/dist/components/p-BixlbUD7.js.map +1 -0
  71. package/dist/components/{p-Doixm8-N.js → p-CDteBYm9.js} +3 -3
  72. package/dist/components/{p-Doixm8-N.js.map → p-CDteBYm9.js.map} +1 -1
  73. package/dist/components/{p-58y59Acb.js → p-CkD1PQQX.js} +5 -5
  74. package/dist/components/{p-58y59Acb.js.map → p-CkD1PQQX.js.map} +1 -1
  75. package/dist/components/{p-DxNbcUzt.js → p-Cqr0Bah5.js} +3 -3
  76. package/dist/components/{p-DxNbcUzt.js.map → p-Cqr0Bah5.js.map} +1 -1
  77. package/dist/components/{p-D7BLVRXX.js → p-CuhOrcET.js} +2726 -380
  78. package/dist/components/p-CuhOrcET.js.map +1 -0
  79. package/dist/components/{p-i0IlGLv2.js → p-CvLFRlQU.js} +3 -3
  80. package/dist/components/{p-i0IlGLv2.js.map → p-CvLFRlQU.js.map} +1 -1
  81. package/dist/components/{p-BpXgwgnV.js → p-DKwJJuFb.js} +7 -7
  82. package/dist/components/{p-BpXgwgnV.js.map → p-DKwJJuFb.js.map} +1 -1
  83. package/dist/components/{p-CC8KFHSe.js → p-DZ7kxJUx.js} +3 -3
  84. package/dist/components/{p-CC8KFHSe.js.map → p-DZ7kxJUx.js.map} +1 -1
  85. package/dist/components/{p-D_ygcWSz.js → p-dMCB4tJA.js} +3 -3
  86. package/dist/components/{p-D_ygcWSz.js.map → p-dMCB4tJA.js.map} +1 -1
  87. package/dist/components/{p-CBYBurdY.js → p-sokRZ7Vn.js} +49 -5
  88. package/dist/components/p-sokRZ7Vn.js.map +1 -0
  89. package/dist/esm/{default-text-tool.config-BvCgOiKA.js → default-line-tool.config-C35m-d1Y.js} +3152 -1053
  90. package/dist/esm/default-line-tool.config-C35m-d1Y.js.map +1 -0
  91. package/dist/esm/index.js +2 -2
  92. package/dist/esm/kritzel-color_22.entry.js +399 -66
  93. package/dist/stencil/index.esm.js +1 -1
  94. package/dist/stencil/p-C35m-d1Y.js +2 -0
  95. package/dist/stencil/p-C35m-d1Y.js.map +1 -0
  96. package/dist/stencil/p-d142ef46.entry.js +10 -0
  97. package/dist/stencil/p-d142ef46.entry.js.map +1 -0
  98. package/dist/stencil/stencil.esm.js +1 -1
  99. package/dist/types/classes/core/core.class.d.ts +18 -0
  100. package/dist/types/classes/core/store.class.d.ts +2 -0
  101. package/dist/types/classes/handlers/line-handle.handler.d.ts +34 -0
  102. package/dist/types/classes/managers/anchor.manager.d.ts +160 -0
  103. package/dist/types/classes/managers/cursor.manager.d.ts +43 -0
  104. package/dist/types/classes/objects/line.class.d.ts +98 -0
  105. package/dist/types/classes/tools/line-tool.class.d.ts +17 -0
  106. package/dist/types/classes/tools/selection-tool.class.d.ts +4 -0
  107. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +2 -4
  108. package/dist/types/components.d.ts +5 -5
  109. package/dist/types/configs/default-line-tool.config.d.ts +2 -0
  110. package/dist/types/helpers/geometry.helper.d.ts +10 -0
  111. package/dist/types/index.d.ts +5 -0
  112. package/dist/types/interfaces/anchor.interface.d.ts +137 -0
  113. package/dist/types/interfaces/arrow-head.interface.d.ts +26 -0
  114. package/dist/types/interfaces/engine-state.interface.d.ts +8 -0
  115. package/dist/types/interfaces/line-options.interface.d.ts +21 -0
  116. package/dist/types/interfaces/toolbar-control.interface.d.ts +17 -1
  117. package/package.json +1 -1
  118. package/dist/cjs/default-text-tool.config-zB3FPuXq.js.map +0 -1
  119. package/dist/components/p-CBYBurdY.js.map +0 -1
  120. package/dist/components/p-D7BLVRXX.js.map +0 -1
  121. package/dist/components/p-DbKKCHKd.js.map +0 -1
  122. package/dist/esm/default-text-tool.config-BvCgOiKA.js.map +0 -1
  123. package/dist/stencil/p-6d9756d9.entry.js +0 -10
  124. package/dist/stencil/p-6d9756d9.entry.js.map +0 -1
  125. package/dist/stencil/p-BvCgOiKA.js +0 -2
  126. package/dist/stencil/p-BvCgOiKA.js.map +0 -1
@@ -14,7 +14,6 @@ import { ABSOLUTE_SCALE_MAX, ABSOLUTE_SCALE_MIN } from "../../../constants/engin
14
14
  import { KritzelCore } from "../../../classes/core/core.class";
15
15
  import { KritzelDevicesHelper } from "../../../helpers/devices.helper";
16
16
  import { throttle } from "lodash";
17
- import { KritzelCursorHelper } from "../../../helpers/cursor.helper";
18
17
  export class KritzelEngine {
19
18
  host;
20
19
  workspace;
@@ -54,12 +53,7 @@ export class KritzelEngine {
54
53
  }
55
54
  cursorTarget;
56
55
  onCursorTargetChange(newValue) {
57
- // Reset cursor on old target
58
- if (this.cursorTargetElement) {
59
- this.cursorTargetElement.style.cursor = '';
60
- }
61
- // Set new target (defaults to document.body)
62
- this.cursorTargetElement = newValue || document.body;
56
+ this.core.cursorManager.setTargetElement(newValue || document.body);
63
57
  }
64
58
  isEngineReady;
65
59
  activeToolChange;
@@ -107,6 +101,8 @@ export class KritzelEngine {
107
101
  if (this.core.store.state.pointers.size > 1) {
108
102
  this.throttledPointerMoveMulti(ev);
109
103
  }
104
+ // Update cursor for handle hover states using elementsFromPoint
105
+ this.core.cursorManager.updateHoverState(ev);
110
106
  this.viewport.handlePointerMove(ev);
111
107
  this.core.store.state?.activeTool?.handlePointerMove(ev);
112
108
  }
@@ -118,7 +114,7 @@ export class KritzelEngine {
118
114
  this.host.releasePointerCapture(ev.pointerId);
119
115
  // Reset cursor to default when all pointers are released
120
116
  if (this.core.store.state.pointers.size === 0) {
121
- this.core.store.state.cursor = { icon: 'default', iconActive: 'default' };
117
+ this.core.cursorManager.resetToDefault();
122
118
  }
123
119
  this.viewport.handlePointerUp(ev);
124
120
  this.core.store.state?.activeTool?.handlePointerUp(ev);
@@ -131,7 +127,7 @@ export class KritzelEngine {
131
127
  this.core.store.state.pointers.delete(ev.pointerId);
132
128
  // Reset cursor to default when all pointers are released
133
129
  if (this.core.store.state.pointers.size === 0) {
134
- this.core.store.state.cursor = { icon: 'default', iconActive: 'default' };
130
+ this.core.cursorManager.resetToDefault();
135
131
  }
136
132
  this.viewport.handlePointerUp(ev);
137
133
  this.core.store.state?.activeTool?.handlePointerUp(ev);
@@ -307,7 +303,6 @@ export class KritzelEngine {
307
303
  contextMenuHandler;
308
304
  keyHandler;
309
305
  contextMenuElement = null;
310
- cursorTargetElement = null;
311
306
  get isSelecting() {
312
307
  return this.core.store.state.activeTool instanceof KritzelSelectionTool && this.core.store.state.isSelecting;
313
308
  }
@@ -320,12 +315,7 @@ export class KritzelEngine {
320
315
  disconnectedCallback() {
321
316
  this.throttledWheel.cancel();
322
317
  this.throttledPointerMoveMulti.cancel();
323
- // Reset cursor on target element
324
- if (this.cursorTargetElement) {
325
- this.cursorTargetElement.style.cursor = '';
326
- this.cursorTargetElement.style.removeProperty('--kritzel-pointer-cursor');
327
- this.cursorTargetElement = null;
328
- }
318
+ this.core.cursorManager.cleanup();
329
319
  }
330
320
  componentWillLoad() {
331
321
  this.validateScaleMax(this.scaleMax);
@@ -335,10 +325,9 @@ export class KritzelEngine {
335
325
  this.contextMenuHandler = new KritzelContextMenuHandler(this.core, this.globalContextMenuItems, this.objectContextMenuItems);
336
326
  this.keyHandler = new KritzelKeyHandler(this.core);
337
327
  this.viewport = new KritzelViewport(this.core, this.host);
338
- // Set cursor target element (use prop value or default to document.body)
339
- this.cursorTargetElement = this.cursorTarget || document.body;
340
- // Set the pointer cursor CSS variable for child components to use
341
- this.cursorTargetElement.style.setProperty('--kritzel-pointer-cursor', KritzelCursorHelper.getPointerCursor());
328
+ // Initialize cursor manager with target element and shadow root
329
+ this.core.cursorManager.setTargetElement(this.cursorTarget || document.body);
330
+ this.core.cursorManager.setShadowRoot(this.host.shadowRoot);
342
331
  // Set sync configuration if provided
343
332
  if (this.syncConfig) {
344
333
  this.core.setSyncConfig(this.syncConfig);
@@ -380,20 +369,6 @@ export class KritzelEngine {
380
369
  KritzelKeyboardHelper.forceHideKeyboard();
381
370
  this.core.rerender();
382
371
  }
383
- updateCursor() {
384
- const state = this.core.store.state;
385
- const isPointerDown = this.core.store.isPointerDown;
386
- const icon = state.cursor?.icon;
387
- const iconActive = state.cursor?.iconActive ?? icon;
388
- const rotation = state.cursor?.rotation;
389
- const cursor = KritzelCursorHelper.getCursor({
390
- iconName: isPointerDown ? iconActive : icon,
391
- rotation: rotation,
392
- });
393
- if (this.cursorTargetElement) {
394
- this.cursorTargetElement.style.cursor = cursor;
395
- }
396
- }
397
372
  render() {
398
373
  const computedStyle = window.getComputedStyle(this.host);
399
374
  const baseHandleSizePx = computedStyle.getPropertyValue('--kritzel-selection-handle-size').trim() || '6px';
@@ -410,17 +385,17 @@ export class KritzelEngine {
410
385
  depth: 100,
411
386
  };
412
387
  const visibleObjects = this.core.store.state.objects.query(viewportBounds);
413
- this.updateCursor();
414
- return (h(Host, { key: '192c356c5476b2b3cf370b05efd5742776423200' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: 'fae1b053c1eda01726f6b583a8dd167bb1c34aa1', class: "debug-panel" }, h("div", { key: '0e0fab7c39c1c8116831cf7b228914b0c40fb338' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '770d284f5104919c5c6a36e653971d3662e9428b' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '4937256ccf074a0a2fffb9c8c32a8c6ba41d3fb4' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '447d95aed0dda6e212e7c67ff4bc0a2e574131fd' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '548a04b16f68873e5fc0a2767146b52e83b9f0f8' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: '16a92abf89f1b438f14f311dd248ae82e1ac1982' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '92a2abc5a757c64d764f3e1ee525556eb6a88852' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: '7677d4fd149ef2507626e50502d7c2b74fb294af' }, "Scale: ", this.core.store.state?.scale), h("div", { key: '3120c7ff85fd9f8ef14fb313b9aae6f2fc817f75' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '100cd8a8c221d66046d9ff869b23809ca2568d12' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: '2efec039f635eec81d172113d55284eb9002f339' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'f1df2fbf86a1944831c26a23e8c0baadd5ba1c56' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '10098cd2ffd07200fc8a12941ffd91fc1fac4de8' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '75043ccdac3ef3b02dae17b758813132174c2034' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '59217b67d572cc60fc8381bcc930a952fea2faaa' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: 'c4a7d64031d3b430673adb6adcb7f525f7a47ddc' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: 'd62bef9cab424e77781a3d5639552b8122e92238' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'ab5dbbc947b335a1396a945328a5939d690d8cd0' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: 'fb2c19a0cdc070ecbf28e51b08112a73ffcf2817' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '2d5519541aeb9a6423524463a03d1626f5eaf6ca' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: 'f86b578263c68ac194d6b3d606a1cb31717b1792' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: '52ed5379ef3e9a18cbabe14be8106055a8f71ede' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '6b97e5f6c90666283fb5cfed0cf0e3b7bc0fffe3' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '5f80b9d4121974ee1e8afe89925b6b38b840e90f' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: '8a280b4454677f5dc29e4a2a39fd4f7cfc8c26df' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: '660dd95852906f5c049b9527b26ea0af3fa04274', id: "origin", class: "origin", style: {
388
+ this.core.cursorManager.applyCursor();
389
+ return (h(Host, { key: '4a7e8c72ad1f80c3c31aa37eff33e78634cb37d1' }, this.core.store.state.debugInfo.showViewportInfo && (h("div", { key: '3c8981ce6cafbc49f4f04189d27809c511bf45c4', class: "debug-panel" }, h("div", { key: '428d483a87b98cde24446a0a26ba790ec2a6358b' }, "ActiveWorkspaceId: ", this.core.store.state?.activeWorkspace?.id), h("div", { key: '3ec597c219109c026f78e5018a885e88e51aa5c4' }, "ActiveWorkspaceName: ", this.core.store.state?.activeWorkspace?.name), h("div", { key: '803c0d009b19fdc7c465ef14f3b5f278a954a912' }, "TranslateX: ", this.core.store.state?.translateX), h("div", { key: '8b1aef0ae845cdf4b93afe59d8c78c84dd181a2d' }, "TranslateY: ", this.core.store.state?.translateY), h("div", { key: '137ead0c39a2fba55b4c4dde53fb09d0832439e1' }, "ViewportWidth: ", this.core.store.state?.viewportWidth), h("div", { key: 'b19f710385e4306620176551853eb2645b96ca7a' }, "ViewportHeight: ", this.core.store.state?.viewportHeight), h("div", { key: '943b55daada95aa37b759e45a15ffcfca76fba72' }, "PointerCount: ", this.core.store.state.pointers.size), h("div", { key: 'd001782dd4bc48c84c08477b26e5f3fce8df0b47' }, "Scale: ", this.core.store.state?.scale), h("div", { key: 'ed640d3905b39a995ba40a1cbf38f10a4aa1b400' }, "ActiveTool: ", this.core.store.state?.activeTool?.name), h("div", { key: '154888aabbb56365aaf4584b0b991be848629e3e' }, "HasViewportChanged: ", this.core.store.state?.hasViewportChanged ? 'true' : 'false'), h("div", { key: 'c0c39e988940baf20137de8a0eeda2c085da2810' }, "IsEnabled: ", this.core.store.state?.isEnabled ? 'true' : 'false'), h("div", { key: 'abd5a79b27bc75e898877d33097597c057dc3f2b' }, "IsScaling: ", this.core.store.state?.isScaling ? 'true' : 'false'), h("div", { key: '9c49bf3246525c9a755bb293bec8a143ade97158' }, "IsPanning: ", this.core.store.state?.isPanning ? 'true' : 'false'), h("div", { key: '88ff8ab48af31bf036719f72a5a3726780ab9720' }, "IsSelecting: ", this.isSelecting ? 'true' : 'false'), h("div", { key: '9650075f855fcf91b7303d3ace14242075fc523d' }, "IsSelectionActive: ", this.isSelectionActive ? 'true' : 'false'), h("div", { key: '911acb1f90f9812d30dc0aebceb207aecf9b4248' }, "IsResizeHandleSelected: ", this.core.store.state.isResizeHandleSelected ? 'true' : 'false'), h("div", { key: 'b65db638d3cefbd74e2d03b639ee5fe86a2a858b' }, "IsRotationHandleSelected: ", this.core.store.state.isRotationHandleSelected ? 'true' : 'false'), h("div", { key: 'c53ca259dadc656762733119b4086c1f82235a7e' }, "IsRotationHandleHovered: ", this.core.store.state.isRotationHandleHovered ? 'true' : 'false'), h("div", { key: 'ae2d7a8917af450eb3bfd8e171a87530f337c0c2' }, "IsDrawing: ", this.core.store.state.isDrawing ? 'true' : 'false'), h("div", { key: '5633cd9901ec028e4f5433c84b07321932beea66' }, "IsWriting: ", this.core.store.state.isWriting ? 'true' : 'false'), h("div", { key: '82232a8eec470562e5658dee9713c855e78ca6a3' }, "IsPointerDown: ", this.core.store.isPointerDown ? 'true' : 'false'), h("div", { key: '5b6b04b323a21ef37ddb144721ea01dccc7aec8b' }, "PointerX: ", this.core.store.state?.pointerX), h("div", { key: '3287f804515cfa31eaa755332e2043fce4feb7a9' }, "PointerY: ", this.core.store.state?.pointerY), h("div", { key: '3a59fd4db60f6f05d419de39149ea10e482875d4' }, "SelectedObjects: ", this.core.store.selectionGroup?.objects.length || 0), h("div", { key: 'f91a8ea9dfc50e5f1ae89d66c7609a103e3263a4' }, "ViewportCenter: (", viewportCenterX.toFixed(2), ", ", viewportCenterY.toFixed(2), ")"))), h("div", { key: '40ba8fb5530243c18e0b0c3ad68dadb2cbc615a1', id: "origin", class: "origin", style: {
415
390
  transform: `matrix(${this.core.store.state?.scale}, 0, 0, ${this.core.store.state?.scale}, ${this.core.store.state?.translateX}, ${this.core.store.state?.translateY})`,
416
391
  } }, visibleObjects?.map(object => {
417
392
  return (h("div", { key: object.id, style: {
418
393
  transform: object?.transformationMatrix,
419
394
  transformOrigin: 'top left',
420
- zIndex: object.zIndex.toString(),
421
395
  position: 'absolute',
422
396
  pointerEvents: this.core.store.state.isScaling ? 'none' : 'auto',
423
397
  } }, h("svg", { xmlns: "http://www.w3.org/2000/svg", id: object.id, class: "object", style: {
398
+ zIndex: object.zIndex.toString(),
424
399
  height: object?.totalHeight.toString(),
425
400
  width: object?.totalWidth.toString(),
426
401
  left: '0',
@@ -430,7 +405,7 @@ export class KritzelEngine {
430
405
  transformOrigin: `${object.totalWidth / 2}px ${object.totalHeight / 2}px`,
431
406
  opacity: object.markedForRemoval ? '0.5' : object.opacity.toString(),
432
407
  pointerEvents: object.markedForRemoval ? 'none' : 'auto',
433
- } }, h("foreignObject", { x: "0", y: "0", width: object.totalWidth.toString(), height: object.totalHeight.toString(), style: {
408
+ } }, KritzelClassHelper.isInstanceOf(object, 'KritzelPath') && (h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: { overflow: 'visible' }, viewBox: object?.viewBox }, h("path", { d: object?.d, fill: object.fill, stroke: object?.stroke, "shape-rendering": object.isLowRes() ? 'optimizeSpeed' : 'auto' }))), KritzelClassHelper.isInstanceOf(object, 'KritzelLine') && (h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: { overflow: 'visible' }, viewBox: object?.viewBox }, h("defs", null, object.hasStartArrow && (h("marker", { id: object.startMarkerId, markerWidth: object.getArrowSize('start'), markerHeight: object.getArrowSize('start'), refX: 0, refY: object.getArrowSize('start') / 2, orient: "auto-start-reverse", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.start?.style), fill: object.getArrowFill('start'), transform: `scale(${object.getArrowSize('start') / 10})` }))), object.hasEndArrow && (h("marker", { id: object.endMarkerId, markerWidth: object.getArrowSize('end'), markerHeight: object.getArrowSize('end'), refX: 0, refY: object.getArrowSize('end') / 2, orient: "auto", markerUnits: "userSpaceOnUse" }, h("path", { d: object.getArrowPath(object.arrows?.end?.style), fill: object.getArrowFill('end'), transform: `scale(${object.getArrowSize('end') / 10})` })))), h("path", { d: this.core.anchorManager.computeClippedLinePath(object), fill: "none", stroke: object?.stroke, "stroke-width": object?.strokeWidth, "stroke-linecap": "round", "marker-start": object.hasStartArrow ? `url(#${object.startMarkerId})` : undefined, "marker-end": object.hasEndArrow ? `url(#${object.endMarkerId})` : undefined }))), h("foreignObject", { x: "0", y: "0", width: object.totalWidth.toString(), height: object.totalHeight.toString(), style: {
434
409
  minHeight: '0',
435
410
  minWidth: '0',
436
411
  backgroundColor: object.backgroundColor,
@@ -439,18 +414,14 @@ export class KritzelEngine {
439
414
  borderStyle: 'solid',
440
415
  padding: object.padding + 'px',
441
416
  overflow: 'visible',
442
- } }, KritzelClassHelper.isInstanceOf(object, 'KritzelPath') && (h("svg", { ref: el => object.mount(el), xmlns: "http://www.w3.org/2000/svg", style: {
443
- height: object?.height.toString(),
444
- width: object?.width.toString(),
445
- position: 'absolute',
446
- overflow: 'visible',
447
- }, 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: {
417
+ display: KritzelClassHelper.isInstanceOf(object, 'KritzelLine') || KritzelClassHelper.isInstanceOf(object, 'KritzelPath') ? 'none' : 'block'
418
+ } }, KritzelClassHelper.isInstanceOf(object, 'KritzelImage') && (h("img", { ref: el => object.mount(el), src: object.src, style: {
448
419
  width: '100%',
449
420
  height: '100%',
450
421
  userSelect: 'none',
451
422
  pointerEvents: 'none',
452
423
  imageRendering: this.core.store.state.isScaling || this.core.store.state.isPanning ? 'pixelated' : 'auto',
453
- }, draggable: false, onDragStart: e => e.preventDefault() })), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("div", { ref: el => object.mount(el), onPointerDown: e => object.handlePointerDown(e), onPointerMove: e => object.handlePointerMove(e), onPointerUp: e => object.handlePointerUp(e), style: {
424
+ }, draggable: false, onDragStart: e => e.preventDefault() })), KritzelClassHelper.isInstanceOf(object, 'KritzelText') && (h("div", { id: "text-object", ref: el => object.mount(el), onPointerDown: e => object.handlePointerDown(e), onPointerMove: e => object.handlePointerMove(e), onPointerUp: e => object.handlePointerUp(e), style: {
454
425
  minWidth: object.initialWidth + 'px',
455
426
  minHeight: object.initialHeight + 'px',
456
427
  maxWidth: '500px',
@@ -467,7 +438,7 @@ export class KritzelEngine {
467
438
  pointerEvents: 'auto',
468
439
  overflow: 'hidden',
469
440
  display: 'block',
470
- } })), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionGroup') && (h("div", { ref: el => object.mount(el), style: {
441
+ } })), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionGroup') && !this.core.displaySelectionLineUI(object) && (h("div", { ref: el => object.mount(el), style: {
471
442
  width: '100%',
472
443
  height: '100%',
473
444
  } })), KritzelClassHelper.isInstanceOf(object, 'KritzelSelectionBox') && (h("div", { ref: el => object.mount(el), style: {
@@ -477,7 +448,8 @@ export class KritzelEngine {
477
448
  borderWidth: KritzelDevicesHelper.isFirefox() ? object.borderWidth + 'px' : '0',
478
449
  borderStyle: KritzelDevicesHelper.isFirefox() ? 'solid' : 'none',
479
450
  borderColor: KritzelDevicesHelper.isFirefox() ? object.borderColor : 'transparent',
480
- } }))), 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)))))), h("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
451
+ } }))), 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), h("div", { style: { whiteSpace: 'nowrap' } }, "rotationDegrees: ", object.rotationDegrees)))))), h("svg", { xmlns: "http://www.w3.org/2000/svg", style: {
452
+ zIndex: (object.zIndex + 1).toString(),
481
453
  height: object?.totalHeight.toString(),
482
454
  width: object?.totalWidth.toString(),
483
455
  left: '0',
@@ -487,7 +459,7 @@ export class KritzelEngine {
487
459
  transformOrigin: `${object.totalWidth / 2}px ${object.totalHeight / 2}px`,
488
460
  overflow: 'visible',
489
461
  pointerEvents: 'none',
490
- } }, object.isSelected && (h("g", { class: "selection-borders", style: { pointerEvents: 'none' } }, h("line", { x1: "0", y1: "0", x2: object.totalWidth, y2: "0", style: {
462
+ } }, this.core.displaySelectionGroupUI(object) && (h("g", { class: "selection-group-ui", style: { pointerEvents: 'none' } }, h("g", { class: "selection-group-borders" }, h("line", { x1: "0", y1: "0", x2: object.totalWidth, y2: "0", style: {
491
463
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
492
464
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
493
465
  strokeLinecap: 'square',
@@ -503,31 +475,31 @@ export class KritzelEngine {
503
475
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
504
476
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
505
477
  strokeLinecap: 'square',
506
- } }))), object.isSelected && !this.isSelecting && (h("g", { class: "selection-handles", style: { pointerEvents: 'auto' } }, h("circle", { class: "resize-handle top-left", cx: "0", cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
478
+ } })), !this.isSelecting && (h("g", { class: "selection-group-handles", style: { pointerEvents: 'auto' } }, h("circle", { class: "resize-handle top-left", cx: "0", cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
507
479
  fill: 'var(--kritzel-selection-handle-color, #000000)',
508
480
  paintOrder: 'fill',
509
481
  } }), h("circle", { class: "resize-handle-overlay top-left", cx: "0", cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
510
482
  fill: 'transparent',
511
483
  paintOrder: 'fill',
512
- }, onPointerEnter: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'move-vertical', rotation: object.rotationDegrees - 45 }), onPointerLeave: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'default', iconActive: 'default' }) }), h("circle", { class: "resize-handle top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
484
+ } }), h("circle", { class: "resize-handle top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
513
485
  fill: 'var(--kritzel-selection-handle-color, #000000)',
514
486
  paintOrder: 'fill',
515
487
  } }), h("circle", { class: "resize-handle-overlay top-right", cx: object.totalWidth, cy: "0", r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
516
488
  fill: 'transparent',
517
489
  paintOrder: 'fill',
518
- }, onPointerEnter: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'move-vertical', rotation: object.rotationDegrees + 45 }), onPointerLeave: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'default', iconActive: 'default' }) }), h("circle", { class: "resize-handle bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
490
+ } }), h("circle", { class: "resize-handle bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
519
491
  fill: 'var(--kritzel-selection-handle-color, #000000)',
520
492
  paintOrder: 'fill',
521
493
  } }), h("circle", { class: "resize-handle-overlay bottom-left", cx: "0", cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
522
494
  fill: 'transparent',
523
495
  paintOrder: 'fill',
524
- }, onPointerEnter: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'move-vertical', rotation: object.rotationDegrees + 45 }), onPointerLeave: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'default', iconActive: 'default' }) }), h("circle", { class: "resize-handle bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
496
+ } }), h("circle", { class: "resize-handle bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
525
497
  fill: 'var(--kritzel-selection-handle-color, #000000)',
526
498
  paintOrder: 'fill',
527
499
  } }), h("circle", { class: "resize-handle-overlay bottom-right", cx: object.totalWidth, cy: object.totalHeight, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
528
500
  fill: 'transparent',
529
501
  paintOrder: 'fill',
530
- }, onPointerEnter: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'move-vertical', rotation: object.rotationDegrees - 45 }), onPointerLeave: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'default', iconActive: 'default' }) }), h("line", { x1: object.totalWidth / 2, y1: "0", x2: object.totalWidth / 2, y2: -((15 * object.scale) / this.core.store.state?.scale), style: {
502
+ } }), h("line", { x1: object.totalWidth / 2, y1: "0", x2: object.totalWidth / 2, y2: -((15 * object.scale) / this.core.store.state?.scale), style: {
531
503
  stroke: 'var(--kritzel-selection-border-color, #007AFF)',
532
504
  strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
533
505
  } }), 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: {
@@ -536,8 +508,103 @@ export class KritzelEngine {
536
508
  } }), 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: {
537
509
  fill: 'transparent',
538
510
  paintOrder: 'fill',
539
- }, onPointerEnter: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' }), onPointerLeave: () => !this.core.store.isPointerDown && (this.core.store.state.cursor = { icon: 'default', iconActive: 'default' }) }))))));
540
- })), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '0da13416f8f2cf2f0eb6fcbb8eacb942dda0efb5', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
511
+ } }))))), this.core.displaySelectionLineUI(object) && KritzelClassHelper.isInstanceOf(object, 'KritzelLine') && (h("g", { class: "selection-line-ui", style: { pointerEvents: 'none' } }, h("g", { class: "selection-line-borders" }, h("path", { class: "selection-line-border", d: this.core.anchorManager.computeClippedLinePath(object, true), style: {
512
+ stroke: 'var(--kritzel-selection-border-color, #007AFF)',
513
+ strokeWidth: `calc(var(--kritzel-selection-border-width, 2px) * ${object.scale} / ${this.core.store.state?.scale})`,
514
+ strokeLinecap: 'round',
515
+ fill: 'none',
516
+ } })), !this.isSelecting && (h("g", { class: "selection-line-handles", style: { pointerEvents: 'auto' } }, h("circle", { class: "selection-line-handle start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
517
+ fill: 'var(--kritzel-selection-handle-color, #000000)',
518
+ paintOrder: 'fill',
519
+ } }), h("circle", { class: "selection-line-handle-overlay start", cx: object.startX - object.x, cy: object.startY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
520
+ fill: 'transparent',
521
+ paintOrder: 'fill',
522
+ } }), h("circle", { class: "selection-line-handle center", cx: object.controlX !== undefined ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x : (object.startX - object.x + object.endX - object.x) / 2, cy: object.controlY !== undefined ? (object.startY + 2 * object.controlY + object.endY) / 4 - object.y : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
523
+ fill: 'var(--kritzel-selection-handle-color, #000000)',
524
+ paintOrder: 'fill',
525
+ } }), h("circle", { class: "selection-line-handle-overlay center", cx: object.controlX !== undefined ? (object.startX + 2 * object.controlX + object.endX) / 4 - object.x : (object.startX - object.x + object.endX - object.x) / 2, cy: object.controlY !== undefined ? (object.startY + 2 * object.controlY + object.endY) / 4 - object.y : (object.startY - object.y + object.endY - object.y) / 2, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
526
+ fill: 'transparent',
527
+ paintOrder: 'fill',
528
+ } }), h("circle", { class: "selection-line-handle end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleSize * object.scale) / this.core.store.state?.scale}`, style: {
529
+ fill: 'var(--kritzel-selection-handle-color, #000000)',
530
+ paintOrder: 'fill',
531
+ } }), h("circle", { class: "selection-line-handle-overlay end", cx: object.endX - object.x, cy: object.endY - object.y, r: `${(baseHandleTouchSize * object.scale) / this.core.store.state?.scale}`, style: {
532
+ fill: 'transparent',
533
+ paintOrder: 'fill',
534
+ } }))))))));
535
+ }), (() => {
536
+ const data = this.core.anchorManager.getAnchorLinesRenderData();
537
+ if (!data)
538
+ return null;
539
+ return (h("svg", { xmlns: "http://www.w3.org/2000/svg", class: "anchor-lines", style: {
540
+ position: 'absolute',
541
+ left: '0',
542
+ top: '0',
543
+ width: '1px',
544
+ height: '1px',
545
+ pointerEvents: 'none',
546
+ zIndex: '9998',
547
+ overflow: 'visible',
548
+ } }, data.startAnchorViz && (h("g", { class: "anchor-line-start" }, data.startAnchorViz.pathD ? (h("path", { d: data.startAnchorViz.pathD, style: {
549
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))',
550
+ strokeWidth: `${data.lineStrokeWidth}`,
551
+ strokeDasharray: data.dashArray,
552
+ strokeLinecap: 'round',
553
+ fill: 'none',
554
+ } })) : (h("line", { x1: data.startAnchorViz.edgeX, y1: data.startAnchorViz.edgeY, x2: data.startAnchorViz.centerX, y2: data.startAnchorViz.centerY, style: {
555
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.3))',
556
+ strokeWidth: `${data.lineStrokeWidth}`,
557
+ strokeDasharray: data.dashArray,
558
+ strokeLinecap: 'round',
559
+ } })), h("circle", { cx: data.startAnchorViz.centerX, cy: data.startAnchorViz.centerY, r: data.indicatorRadius, style: {
560
+ fill: 'var(--kritzel-snap-indicator-fill, rgba(0, 0, 0))',
561
+ stroke: 'var(--kritzel-snap-indicator-stroke, #3b82f6)',
562
+ strokeWidth: data.indicatorStrokeWidth,
563
+ } }))), data.endAnchorViz && (h("g", { class: "anchor-line-end" }, data.endAnchorViz.pathD ? (h("path", { d: data.endAnchorViz.pathD, style: {
564
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))',
565
+ strokeWidth: `${data.lineStrokeWidth}`,
566
+ strokeDasharray: data.dashArray,
567
+ strokeLinecap: 'round',
568
+ fill: 'none',
569
+ } })) : (h("line", { x1: data.endAnchorViz.edgeX, y1: data.endAnchorViz.edgeY, x2: data.endAnchorViz.centerX, y2: data.endAnchorViz.centerY, style: {
570
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))',
571
+ strokeWidth: `${data.lineStrokeWidth}`,
572
+ strokeDasharray: data.dashArray,
573
+ strokeLinecap: 'round',
574
+ } })), h("circle", { cx: data.endAnchorViz.centerX, cy: data.endAnchorViz.centerY, r: data.indicatorRadius, style: {
575
+ fill: 'var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))',
576
+ stroke: 'var(--kritzel-snap-indicator-stroke, #3b82f6)',
577
+ strokeWidth: data.indicatorStrokeWidth,
578
+ } })))));
579
+ })(), (() => {
580
+ const data = this.core.anchorManager.getSnapIndicatorRenderData();
581
+ if (!data)
582
+ return null;
583
+ return (h("svg", { xmlns: "http://www.w3.org/2000/svg", class: "snap-indicator", style: {
584
+ position: 'absolute',
585
+ left: '0',
586
+ top: '0',
587
+ width: '1px',
588
+ height: '1px',
589
+ pointerEvents: 'none',
590
+ zIndex: '9999',
591
+ overflow: 'visible',
592
+ } }, h("g", null, data.snapLinePath ? (h("path", { d: data.snapLinePath, fill: "none", style: {
593
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))',
594
+ strokeWidth: data.lineStrokeWidth,
595
+ strokeDasharray: data.dashArray,
596
+ strokeLinecap: 'round',
597
+ } })) : (data.edgeX !== undefined && data.edgeY !== undefined && (h("line", { x1: data.edgeX, y1: data.edgeY, x2: data.centerX, y2: data.centerY, style: {
598
+ stroke: 'var(--kritzel-snap-line-stroke, rgba(0, 0, 0, 0.2))',
599
+ strokeWidth: data.lineStrokeWidth,
600
+ strokeDasharray: data.dashArray,
601
+ strokeLinecap: 'round',
602
+ } }))), h("circle", { cx: data.centerX, cy: data.centerY, r: data.indicatorRadius, style: {
603
+ fill: 'var(--kritzel-snap-indicator-fill, rgba(59, 130, 246, 0.3))',
604
+ stroke: 'var(--kritzel-snap-indicator-stroke, #3b82f6)',
605
+ strokeWidth: data.indicatorStrokeWidth,
606
+ } }))));
607
+ })()), this.core.store.state.isContextMenuVisible && (h("kritzel-context-menu", { key: '7e350c48da76c54a223f23ead9dea8018b0bc36c', class: "context-menu", ref: el => (this.contextMenuElement = el), items: this.core.store.state.contextMenuItems, objects: this.core.store.selectionGroup?.objects || [], style: {
541
608
  position: 'fixed',
542
609
  left: `${this.core.store.state.contextMenuX}px`,
543
610
  top: `${this.core.store.state.contextMenuY}px`,
@@ -548,7 +615,7 @@ export class KritzelEngine {
548
615
  y: (-this.core.store.state.translateY + this.core.store.state.contextMenuY) / this.core.store.state.scale,
549
616
  }, this.core.store.selectionGroup?.objects);
550
617
  this.hideContextMenu();
551
- }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '609dd8438a2678eaa3ce0a73858d9236c9371f96', core: this.core })));
618
+ }, onClose: () => this.hideContextMenu() })), this.core.store.state?.activeTool instanceof KritzelEraserTool && !this.core.store.state.isScaling && h("kritzel-cursor-trail", { key: '7923a3f6a92fa71911c971166171317b5bc421bf', core: this.core })));
552
619
  }
553
620
  static get is() { return "kritzel-engine"; }
554
621
  static get encapsulation() { return "shadow"; }
@@ -880,7 +947,7 @@ export class KritzelEngine {
880
947
  return {
881
948
  "registerTool": {
882
949
  "complexType": {
883
- "signature": "(toolName: string, toolClass: any, toolConfig?: KritzelTextToolConfig | KritzelBrushToolConfig) => Promise<KritzelBaseTool>",
950
+ "signature": "(toolName: string, toolClass: any, toolConfig?: KritzelTextToolConfig | KritzelBrushToolConfig | KritzelLineToolConfig) => Promise<KritzelBaseTool>",
884
951
  "parameters": [{
885
952
  "name": "toolName",
886
953
  "type": "string",
@@ -891,7 +958,7 @@ export class KritzelEngine {
891
958
  "docs": ""
892
959
  }, {
893
960
  "name": "toolConfig",
894
- "type": "KritzelTextToolConfig | KritzelBrushToolConfig",
961
+ "type": "KritzelTextToolConfig | KritzelBrushToolConfig | KritzelLineToolConfig",
895
962
  "docs": ""
896
963
  }],
897
964
  "references": {
@@ -913,6 +980,11 @@ export class KritzelEngine {
913
980
  "location": "import",
914
981
  "path": "../../../interfaces/toolbar-control.interface",
915
982
  "id": "src/interfaces/toolbar-control.interface.ts::KritzelBrushToolConfig"
983
+ },
984
+ "KritzelLineToolConfig": {
985
+ "location": "import",
986
+ "path": "../../../interfaces/toolbar-control.interface",
987
+ "id": "src/interfaces/toolbar-control.interface.ts::KritzelLineToolConfig"
916
988
  }
917
989
  },
918
990
  "return": "Promise<KritzelBaseTool>"