kritzel-stencil 0.0.161 → 0.0.163

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 (155) hide show
  1. package/dist/cjs/{default-text-tool.config-zB3FPuXq.js → default-line-tool.config-DJMYrkSu.js} +6301 -3866
  2. package/dist/cjs/default-line-tool.config-DJMYrkSu.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 +1233 -167
  6. package/dist/cjs/loader.cjs.js +1 -1
  7. package/dist/cjs/stencil.cjs.js +1 -1
  8. package/dist/collection/classes/core/core.class.js +159 -6
  9. package/dist/collection/classes/core/core.class.js.map +1 -1
  10. package/dist/collection/classes/core/reviver.class.js +24 -0
  11. package/dist/collection/classes/core/reviver.class.js.map +1 -1
  12. package/dist/collection/classes/core/store.class.js +10 -0
  13. package/dist/collection/classes/core/store.class.js.map +1 -1
  14. package/dist/collection/classes/core/viewport.class.js +8 -0
  15. package/dist/collection/classes/core/viewport.class.js.map +1 -1
  16. package/dist/collection/classes/handlers/line-handle.handler.js +383 -0
  17. package/dist/collection/classes/handlers/line-handle.handler.js.map +1 -0
  18. package/dist/collection/classes/handlers/move.handler.js +2 -2
  19. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  20. package/dist/collection/classes/managers/anchor.manager.js +1052 -0
  21. package/dist/collection/classes/managers/anchor.manager.js.map +1 -0
  22. package/dist/collection/classes/managers/cursor.manager.js +117 -0
  23. package/dist/collection/classes/managers/cursor.manager.js.map +1 -0
  24. package/dist/collection/classes/objects/base-object.class.js +4 -2
  25. package/dist/collection/classes/objects/base-object.class.js.map +1 -1
  26. package/dist/collection/classes/objects/line.class.js +564 -0
  27. package/dist/collection/classes/objects/line.class.js.map +1 -0
  28. package/dist/collection/classes/objects/path.class.js +85 -0
  29. package/dist/collection/classes/objects/path.class.js.map +1 -1
  30. package/dist/collection/classes/objects/selection-group.class.js +4 -0
  31. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  32. package/dist/collection/classes/objects/shape.class.js +372 -0
  33. package/dist/collection/classes/objects/shape.class.js.map +1 -0
  34. package/dist/collection/classes/registries/icon-registry.class.js +5 -0
  35. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  36. package/dist/collection/classes/tools/brush-tool.class.js +2 -2
  37. package/dist/collection/classes/tools/brush-tool.class.js.map +1 -1
  38. package/dist/collection/classes/tools/line-tool.class.js +172 -0
  39. package/dist/collection/classes/tools/line-tool.class.js.map +1 -0
  40. package/dist/collection/classes/tools/selection-tool.class.js +41 -8
  41. package/dist/collection/classes/tools/selection-tool.class.js.map +1 -1
  42. package/dist/collection/classes/tools/shape-tool.class.js +204 -0
  43. package/dist/collection/classes/tools/shape-tool.class.js.map +1 -0
  44. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +26 -6
  45. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  46. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +168 -60
  47. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  48. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.css +143 -5
  49. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +76 -12
  50. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js.map +1 -1
  51. package/dist/collection/configs/default-engine-config.js +5 -1
  52. package/dist/collection/configs/default-engine-config.js.map +1 -1
  53. package/dist/collection/configs/default-line-tool.config.js +34 -0
  54. package/dist/collection/configs/default-line-tool.config.js.map +1 -0
  55. package/dist/collection/configs/default-shape-tool.config.js +26 -0
  56. package/dist/collection/configs/default-shape-tool.config.js.map +1 -0
  57. package/dist/collection/enums/shape-type.enum.js +7 -0
  58. package/dist/collection/enums/shape-type.enum.js.map +1 -0
  59. package/dist/collection/helpers/geometry.helper.js +97 -0
  60. package/dist/collection/helpers/geometry.helper.js.map +1 -1
  61. package/dist/collection/index.js +5 -0
  62. package/dist/collection/index.js.map +1 -1
  63. package/dist/collection/interfaces/anchor.interface.js +2 -0
  64. package/dist/collection/interfaces/anchor.interface.js.map +1 -0
  65. package/dist/collection/interfaces/arrow-head.interface.js +2 -0
  66. package/dist/collection/interfaces/arrow-head.interface.js.map +1 -0
  67. package/dist/collection/interfaces/engine-state.interface.js.map +1 -1
  68. package/dist/collection/interfaces/line-options.interface.js +2 -0
  69. package/dist/collection/interfaces/line-options.interface.js.map +1 -0
  70. package/dist/collection/interfaces/toolbar-control.interface.js.map +1 -1
  71. package/dist/components/index.js +4 -4
  72. package/dist/components/kritzel-brush-style.js +1 -1
  73. package/dist/components/kritzel-context-menu.js +1 -1
  74. package/dist/components/kritzel-control-brush-config.js +1 -1
  75. package/dist/components/kritzel-control-text-config.js +1 -1
  76. package/dist/components/kritzel-controls.js +1 -1
  77. package/dist/components/kritzel-editor.js +91 -17
  78. package/dist/components/kritzel-editor.js.map +1 -1
  79. package/dist/components/kritzel-engine.js +1 -1
  80. package/dist/components/kritzel-icon.js +1 -1
  81. package/dist/components/kritzel-menu-item.js +1 -1
  82. package/dist/components/kritzel-menu.js +1 -1
  83. package/dist/components/kritzel-split-button.js +1 -1
  84. package/dist/components/kritzel-utility-panel.js +1 -1
  85. package/dist/components/kritzel-workspace-manager.js +1 -1
  86. package/dist/components/{p-DxNbcUzt.js → p-5OECjGHq.js} +3 -3
  87. package/dist/components/{p-DxNbcUzt.js.map → p-5OECjGHq.js.map} +1 -1
  88. package/dist/components/{p-i0IlGLv2.js → p-BSBMBjhq.js} +3 -3
  89. package/dist/components/{p-i0IlGLv2.js.map → p-BSBMBjhq.js.map} +1 -1
  90. package/dist/components/{p-BdZKPKnx.js → p-BuS7MM1j.js} +4 -4
  91. package/dist/components/{p-BdZKPKnx.js.map → p-BuS7MM1j.js.map} +1 -1
  92. package/dist/components/{p-D7BLVRXX.js → p-CnRfQsIC.js} +3716 -554
  93. package/dist/components/p-CnRfQsIC.js.map +1 -0
  94. package/dist/components/{p-DbKKCHKd.js → p-Cv4BGNPb.js} +7 -2
  95. package/dist/components/p-Cv4BGNPb.js.map +1 -0
  96. package/dist/components/{p-D_ygcWSz.js → p-D1YAsWrL.js} +3 -3
  97. package/dist/components/{p-D_ygcWSz.js.map → p-D1YAsWrL.js.map} +1 -1
  98. package/dist/components/{p-Doixm8-N.js → p-D8L0t-Ro.js} +3 -3
  99. package/dist/components/{p-Doixm8-N.js.map → p-D8L0t-Ro.js.map} +1 -1
  100. package/dist/components/{p-CC8KFHSe.js → p-DguzZn_x.js} +3 -3
  101. package/dist/components/{p-CC8KFHSe.js.map → p-DguzZn_x.js.map} +1 -1
  102. package/dist/components/{p-CBYBurdY.js → p-Dz2XHHqa.js} +191 -7
  103. package/dist/components/p-Dz2XHHqa.js.map +1 -0
  104. package/dist/components/{p-58y59Acb.js → p-I3iPEDpx.js} +5 -5
  105. package/dist/components/{p-58y59Acb.js.map → p-I3iPEDpx.js.map} +1 -1
  106. package/dist/components/{p-BpXgwgnV.js → p-tp96UZ0l.js} +83 -19
  107. package/dist/components/p-tp96UZ0l.js.map +1 -0
  108. package/dist/esm/{default-text-tool.config-BvCgOiKA.js → default-line-tool.config-C35P3XfD.js} +6288 -3867
  109. package/dist/esm/default-line-tool.config-C35P3XfD.js.map +1 -0
  110. package/dist/esm/index.js +2 -2
  111. package/dist/esm/kritzel-color_22.entry.js +1154 -88
  112. package/dist/esm/loader.js +1 -1
  113. package/dist/esm/stencil.js +1 -1
  114. package/dist/stencil/index.esm.js +1 -1
  115. package/dist/stencil/p-9d43b708.entry.js +10 -0
  116. package/dist/stencil/p-9d43b708.entry.js.map +1 -0
  117. package/dist/stencil/p-C35P3XfD.js +2 -0
  118. package/dist/stencil/p-C35P3XfD.js.map +1 -0
  119. package/dist/stencil/stencil.esm.js +1 -1
  120. package/dist/types/classes/core/core.class.d.ts +19 -0
  121. package/dist/types/classes/core/store.class.d.ts +4 -0
  122. package/dist/types/classes/core/viewport.class.d.ts +6 -0
  123. package/dist/types/classes/handlers/line-handle.handler.d.ts +34 -0
  124. package/dist/types/classes/managers/anchor.manager.d.ts +180 -0
  125. package/dist/types/classes/managers/cursor.manager.d.ts +43 -0
  126. package/dist/types/classes/objects/line.class.d.ts +98 -0
  127. package/dist/types/classes/objects/path.class.d.ts +7 -0
  128. package/dist/types/classes/objects/shape.class.d.ts +116 -0
  129. package/dist/types/classes/tools/line-tool.class.d.ts +17 -0
  130. package/dist/types/classes/tools/selection-tool.class.d.ts +4 -0
  131. package/dist/types/classes/tools/shape-tool.class.d.ts +37 -0
  132. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +2 -4
  133. package/dist/types/components/ui/kritzel-controls/kritzel-controls.d.ts +16 -1
  134. package/dist/types/components.d.ts +5 -5
  135. package/dist/types/configs/default-line-tool.config.d.ts +2 -0
  136. package/dist/types/configs/default-shape-tool.config.d.ts +2 -0
  137. package/dist/types/enums/shape-type.enum.d.ts +5 -0
  138. package/dist/types/helpers/geometry.helper.d.ts +31 -0
  139. package/dist/types/index.d.ts +5 -0
  140. package/dist/types/interfaces/anchor.interface.d.ts +137 -0
  141. package/dist/types/interfaces/arrow-head.interface.d.ts +26 -0
  142. package/dist/types/interfaces/engine-state.interface.d.ts +8 -0
  143. package/dist/types/interfaces/line-options.interface.d.ts +21 -0
  144. package/dist/types/interfaces/toolbar-control.interface.d.ts +36 -2
  145. package/package.json +1 -1
  146. package/dist/cjs/default-text-tool.config-zB3FPuXq.js.map +0 -1
  147. package/dist/components/p-BpXgwgnV.js.map +0 -1
  148. package/dist/components/p-CBYBurdY.js.map +0 -1
  149. package/dist/components/p-D7BLVRXX.js.map +0 -1
  150. package/dist/components/p-DbKKCHKd.js.map +0 -1
  151. package/dist/esm/default-text-tool.config-BvCgOiKA.js.map +0 -1
  152. package/dist/stencil/p-6d9756d9.entry.js +0 -10
  153. package/dist/stencil/p-6d9756d9.entry.js.map +0 -1
  154. package/dist/stencil/p-BvCgOiKA.js +0 -2
  155. package/dist/stencil/p-BvCgOiKA.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anchor.manager.js","sourceRoot":"","sources":["../../../src/classes/managers/anchor.manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { AnchorIndexEntry, AnchorLinesRenderData, AnchorVisualization, LineAnchor, SnapCandidate, SnapIndicatorRenderData, SnapTarget } from '../../interfaces/anchor.interface';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.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 { KritzelShape } from '../objects/shape.class';\r\nimport { KritzelPath } from '../objects/path.class';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelClassHelper } from '../../helpers/class.helper';\r\nimport { KritzelPoint } from '../../interfaces/point.interface';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\n\r\ntype AnchorClipInfo = {\r\n localX: number;\r\n localY: number;\r\n worldX: number;\r\n worldY: number;\r\n t?: number;\r\n};\r\n\r\ntype QuadraticPoint = { x: number; y: number };\r\n\r\ntype QuadraticSegment = {\r\n start: QuadraticPoint;\r\n control: QuadraticPoint;\r\n end: QuadraticPoint;\r\n};\r\n\r\n/**\r\n * Manages anchor connections between line endpoints and other objects.\r\n * Maintains a runtime index for efficient reverse lookups and handles\r\n * snap detection during line endpoint dragging.\r\n */\r\nexport class KritzelAnchorManager {\r\n private readonly _core: KritzelCore;\r\n\r\n /**\r\n * Runtime index mapping objectId to the lines anchored to it.\r\n * This is derived from the anchor properties on lines and rebuilt as needed.\r\n */\r\n private readonly _anchorIndex: Map<string, Set<AnchorIndexEntry>> = new Map();\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n // ============================================\r\n // Anchor CRUD Operations\r\n // ============================================\r\n\r\n /**\r\n * Sets an anchor from a line endpoint to a target object's center.\r\n * Updates both the line's anchor property and the internal index.\r\n */\r\n setAnchor(lineId: string, endpoint: 'start' | 'end', targetObjectId: string): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n // Prevent anchoring both endpoints to the same object\r\n if (endpoint === 'start' && line.endAnchor?.objectId === targetObjectId) {\r\n return;\r\n }\r\n if (endpoint === 'end' && line.startAnchor?.objectId === targetObjectId) {\r\n return;\r\n }\r\n\r\n // Remove existing anchor if any\r\n this.removeAnchor(lineId, endpoint);\r\n\r\n // Set the anchor on the line\r\n const anchor: LineAnchor = { objectId: targetObjectId };\r\n if (endpoint === 'start') {\r\n line.startAnchor = anchor;\r\n } else {\r\n line.endAnchor = anchor;\r\n }\r\n\r\n // Update the index\r\n this.addToIndex(targetObjectId, lineId, endpoint);\r\n\r\n // Snap the endpoint to the target's center\r\n this.snapEndpointToObject(line, endpoint, targetObjectId);\r\n\r\n // Persist the change\r\n this._core.store.state.objects.update(line);\r\n }\r\n\r\n /**\r\n * Removes an anchor from a line endpoint.\r\n * Updates both the line's anchor property and the internal index.\r\n */\r\n removeAnchor(lineId: string, endpoint: 'start' | 'end'): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) {\r\n return;\r\n }\r\n\r\n // Remove from index\r\n this.removeFromIndex(anchor.objectId, lineId, endpoint);\r\n\r\n // Clear the anchor on the line\r\n if (endpoint === 'start') {\r\n line.startAnchor = undefined;\r\n } else {\r\n line.endAnchor = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the anchor for a specific line endpoint.\r\n */\r\n getAnchor(lineId: string, endpoint: 'start' | 'end'): LineAnchor | null {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return null;\r\n }\r\n\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n return anchor ?? null;\r\n }\r\n\r\n // ============================================\r\n // Query Operations\r\n // ============================================\r\n\r\n /**\r\n * Gets all lines that have an endpoint anchored to the specified object.\r\n */\r\n getLinesAnchoredTo(objectId: string): AnchorIndexEntry[] {\r\n const entries = this._anchorIndex.get(objectId);\r\n return entries ? Array.from(entries) : [];\r\n }\r\n\r\n // ============================================\r\n // Position Updates\r\n // ============================================\r\n\r\n /**\r\n * Updates all line endpoints that are anchored to the specified object.\r\n * Should be called when an object moves.\r\n */\r\n updateAnchorsForObject(objectId: string): void {\r\n const entries = this.getLinesAnchoredTo(objectId);\r\n if (entries.length === 0) {\r\n return;\r\n }\r\n\r\n const targetObject = this.getObjectById(objectId);\r\n if (!targetObject) {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n const line = this.getLineById(entry.lineId);\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n this.snapEndpointToObject(line, entry.endpoint, objectId);\r\n }\r\n }\r\n\r\n /**\r\n * Snaps a line endpoint to an object's center.\r\n */\r\n private snapEndpointToObject(line: KritzelLine, endpoint: 'start' | 'end', targetObjectId: string): void {\r\n const targetObject = this.getObjectById(targetObjectId);\r\n if (!targetObject) {\r\n return;\r\n }\r\n\r\n // Get target center in world coordinates\r\n const targetCenterX = targetObject.centerX;\r\n const targetCenterY = targetObject.centerY;\r\n\r\n // Convert world coordinates to line's local coordinate system\r\n const localCoords = this.worldToLineLocal(line, targetCenterX, targetCenterY);\r\n\r\n // Update the endpoint\r\n line.updateEndpoint(endpoint, localCoords.x, localCoords.y);\r\n }\r\n\r\n /**\r\n * Converts world coordinates to a line's local coordinate system.\r\n */\r\n private worldToLineLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n // Get line center in world coordinates\r\n const cx = line.centerX;\r\n const cy = line.centerY;\r\n\r\n // Translate to center\r\n const dx = worldX - cx;\r\n const dy = worldY - cy;\r\n\r\n // Apply inverse rotation\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n const rotatedX = dx * cos - dy * sin;\r\n const rotatedY = dx * sin + dy * cos;\r\n\r\n // Calculate local coordinates relative to the unrotated bounding box top-left\r\n const relativeX = rotatedX + (line.totalWidth / 2) / line.scale;\r\n const relativeY = rotatedY + (line.totalHeight / 2) / line.scale;\r\n\r\n // Convert to internal coordinates\r\n const localX = relativeX * line.scale + line.x;\r\n const localY = relativeY * line.scale + line.y;\r\n\r\n return { x: localX, y: localY };\r\n }\r\n\r\n // ============================================\r\n // Snap Detection\r\n // ============================================\r\n\r\n /**\r\n * Finds the nearest object that can be snapped to within the snap threshold.\r\n * Returns null if no suitable snap target is found.\r\n *\r\n * @param worldX - X coordinate in world space\r\n * @param worldY - Y coordinate in world space\r\n * @param excludeLineId - ID of the line being edited (to exclude from snap targets)\r\n * @param otherEndpointAnchorId - ID of object anchored to the other endpoint (to prevent same-object anchoring)\r\n */\r\n findSnapTarget(\r\n worldX: number,\r\n worldY: number,\r\n excludeLineId: string,\r\n otherEndpointAnchorId?: string\r\n ): SnapTarget | null {\r\n let bestTarget: SnapTarget | null = null;\r\n let highestZIndex = -Infinity;\r\n\r\n const objects = this._core.store.allNonSelectionObjects;\r\n\r\n for (const object of objects) {\r\n // Skip the line being edited\r\n if (object.id === excludeLineId) {\r\n continue;\r\n }\r\n\r\n // Skip if this is the object anchored to the other endpoint\r\n if (otherEndpointAnchorId && object.id === otherEndpointAnchorId) {\r\n continue;\r\n }\r\n\r\n // Skip non-anchorable objects\r\n if (!this.isAnchorable(object)) {\r\n continue;\r\n }\r\n\r\n // Check if point is inside the object's rotated polygon\r\n const polygon = object.rotatedPolygon;\r\n const points = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: worldX, y: worldY }, points)) {\r\n // If inside, check if this object is \"above\" the current best target\r\n if (object.zIndex > highestZIndex) {\r\n highestZIndex = object.zIndex;\r\n bestTarget = {\r\n objectId: object.id,\r\n centerX: object.centerX,\r\n centerY: object.centerY,\r\n };\r\n }\r\n }\r\n }\r\n\r\n return bestTarget;\r\n }\r\n\r\n /**\r\n * Sets the current snap candidate for visual feedback.\r\n */\r\n setSnapCandidate(candidate: SnapCandidate | null): void {\r\n this._core.store.state.snapCandidate = candidate;\r\n this._core.rerender();\r\n }\r\n\r\n /**\r\n * Gets the current snap candidate.\r\n */\r\n getSnapCandidate(): SnapCandidate | null {\r\n return this._core.store.state.snapCandidate ?? null;\r\n }\r\n\r\n /**\r\n * Clears the snap candidate.\r\n */\r\n clearSnapCandidate(): void {\r\n this._core.store.state.snapCandidate = null;\r\n this._core.rerender();\r\n }\r\n\r\n // ============================================\r\n // Render Data\r\n // ============================================\r\n\r\n /**\r\n * Gets render data for anchor lines visualization.\r\n * Returns null if there's no selected line with anchors or if snap is in progress.\r\n */\r\n getAnchorLinesRenderData(): AnchorLinesRenderData | null {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup || selectionGroup.objects.length !== 1) return null;\r\n\r\n const selectedObject = selectionGroup.objects[0];\r\n if (!KritzelClassHelper.isInstanceOf<KritzelLine>(selectedObject, 'KritzelLine')) return null;\r\n\r\n const line = selectedObject as KritzelLine;\r\n\r\n\r\n\r\n const startAnchorViz = this.computeAnchorVisualization(line, 'start');\r\n const endAnchorViz = this.computeAnchorVisualization(line, 'end');\r\n\r\n if (!startAnchorViz && !endAnchorViz) return null;\r\n\r\n const scale = this._core.store.state.scale;\r\n const lineStrokeWidth = line.strokeWidth / line.scale;\r\n const indicatorStrokeWidth = `${2 / scale}`;\r\n const dashLength = Math.max(lineStrokeWidth * 2, 4 / scale);\r\n const dashArray = `${dashLength} ${dashLength}`;\r\n const indicatorRadius = 8 / scale;\r\n\r\n return {\r\n lineStrokeWidth,\r\n indicatorStrokeWidth,\r\n dashArray,\r\n indicatorRadius,\r\n startAnchorViz,\r\n endAnchorViz,\r\n };\r\n }\r\n\r\n /**\r\n * Gets render data for snap indicator visualization.\r\n * Returns null if there's no snap candidate.\r\n */\r\n getSnapIndicatorRenderData(): SnapIndicatorRenderData | null {\r\n const snapCandidate = this.getSnapCandidate();\r\n if (!snapCandidate) return null;\r\n\r\n const scale = this._core.store.state.scale;\r\n const indicatorRadius = 8 / scale;\r\n const indicatorStrokeWidth = `${2 / scale}`;\r\n const lineStrokeWidth = snapCandidate.lineStrokeWidth\r\n ? `${snapCandidate.lineStrokeWidth}`\r\n : `${4 / scale}`;\r\n const lineStrokeWidthNum = snapCandidate.lineStrokeWidth || (4 / scale);\r\n const dashLength = Math.max(lineStrokeWidthNum * 2, 4 / scale);\r\n const dashArray = `${dashLength} ${dashLength}`;\r\n const lineStroke = snapCandidate.lineStroke || '#000000';\r\n\r\n let solidLineEndX = snapCandidate.edgeX;\r\n let solidLineEndY = snapCandidate.edgeY;\r\n let arrowPoints: string | undefined;\r\n\r\n if (snapCandidate.arrowOffset && snapCandidate.edgeX !== undefined && snapCandidate.edgeY !== undefined) {\r\n const dx = snapCandidate.lineEndpointX - snapCandidate.edgeX;\r\n const dy = snapCandidate.lineEndpointY - snapCandidate.edgeY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (length > snapCandidate.arrowOffset) {\r\n solidLineEndX = snapCandidate.edgeX + (dx / length) * snapCandidate.arrowOffset;\r\n solidLineEndY = snapCandidate.edgeY + (dy / length) * snapCandidate.arrowOffset;\r\n }\r\n\r\n // Calculate arrow head points\r\n // Direction from line endpoint to edge (arrow direction)\r\n const arrowDx = snapCandidate.edgeX - snapCandidate.lineEndpointX;\r\n const arrowDy = snapCandidate.edgeY - snapCandidate.lineEndpointY;\r\n const arrowLengthTotal = Math.sqrt(arrowDx * arrowDx + arrowDy * arrowDy);\r\n\r\n if (arrowLengthTotal > 0) {\r\n const ux = arrowDx / arrowLengthTotal;\r\n const uy = arrowDy / arrowLengthTotal;\r\n // Perpendicular vector\r\n const px = -uy;\r\n const py = ux;\r\n\r\n // Arrow dimensions\r\n const arrowLength = snapCandidate.arrowOffset;\r\n const arrowWidth = arrowLength; // 1:1 ratio\r\n\r\n // Arrow tip at edge\r\n const tipX = snapCandidate.edgeX;\r\n const tipY = snapCandidate.edgeY;\r\n\r\n // Arrow base\r\n const baseX = tipX - ux * arrowLength;\r\n const baseY = tipY - uy * arrowLength;\r\n\r\n // Arrow wings\r\n const leftX = baseX + px * arrowWidth / 2;\r\n const leftY = baseY + py * arrowWidth / 2;\r\n const rightX = baseX - px * arrowWidth / 2;\r\n const rightY = baseY - py * arrowWidth / 2;\r\n\r\n arrowPoints = `${tipX},${tipY} ${leftX},${leftY} ${rightX},${rightY}`;\r\n }\r\n }\r\n return {\r\n indicatorRadius,\r\n indicatorStrokeWidth,\r\n lineStrokeWidth,\r\n dashArray,\r\n lineStroke,\r\n centerX: snapCandidate.centerX,\r\n centerY: snapCandidate.centerY,\r\n lineEndpointX: snapCandidate.lineEndpointX,\r\n lineEndpointY: snapCandidate.lineEndpointY,\r\n edgeX: snapCandidate.edgeX,\r\n edgeY: snapCandidate.edgeY,\r\n arrowOffset: snapCandidate.arrowOffset,\r\n arrowStyle: snapCandidate.arrowStyle,\r\n arrowFill: snapCandidate.arrowFill,\r\n solidLineEndX,\r\n solidLineEndY,\r\n arrowPoints,\r\n snapLinePath: (() => {\r\n if (\r\n snapCandidate.controlX !== undefined &&\r\n snapCandidate.controlY !== undefined &&\r\n snapCandidate.t !== undefined\r\n ) {\r\n const startT = snapCandidate.endpoint === 'start' ? 1 - snapCandidate.t : snapCandidate.t;\r\n\r\n // Ensure meaningful range\r\n if (startT >= 1) return undefined;\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: snapCandidate.lineEndpointX, y: snapCandidate.lineEndpointY },\r\n { x: snapCandidate.controlX, y: snapCandidate.controlY },\r\n { x: snapCandidate.centerX, y: snapCandidate.centerY },\r\n startT,\r\n 1\r\n );\r\n return `M ${segment.start.x} ${segment.start.y} Q ${segment.control.x} ${segment.control.y} ${segment.end.x} ${segment.end.y}`;\r\n }\r\n return undefined;\r\n })(),\r\n };\r\n }\r\n\r\n // ============================================\r\n // Cleanup Operations\r\n // ============================================\r\n\r\n /**\r\n * Handles cleanup when an object is deleted.\r\n * Detaches all lines that were anchored to the deleted object.\r\n */\r\n handleObjectDeleted(objectId: string): void {\r\n const entries = this.getLinesAnchoredTo(objectId);\r\n\r\n for (const entry of entries) {\r\n this.removeAnchor(entry.lineId, entry.endpoint);\r\n\r\n // Update the line to persist the change\r\n const line = this.getLineById(entry.lineId);\r\n if (line) {\r\n this._core.store.state.objects.update(line);\r\n }\r\n }\r\n\r\n // Remove the object from the index\r\n this._anchorIndex.delete(objectId);\r\n }\r\n\r\n /**\r\n * Handles cleanup when a line is deleted.\r\n * Removes all anchor index entries for the line.\r\n */\r\n handleLineDeleted(lineId: string): void {\r\n const line = this.getLineById(lineId);\r\n if (!line) {\r\n return;\r\n }\r\n\r\n if (line.startAnchor) {\r\n this.removeFromIndex(line.startAnchor.objectId, lineId, 'start');\r\n }\r\n if (line.endAnchor) {\r\n this.removeFromIndex(line.endAnchor.objectId, lineId, 'end');\r\n }\r\n }\r\n\r\n // ============================================\r\n // Index Management\r\n // ============================================\r\n\r\n /**\r\n * Rebuilds the anchor index from all lines in the object map.\r\n * Should be called after loading/deserializing objects.\r\n */\r\n rebuildIndex(): void {\r\n this._anchorIndex.clear();\r\n\r\n const objects = this._core.store.allObjects;\r\n\r\n for (const object of objects) {\r\n if (object instanceof KritzelLine) {\r\n if (object.startAnchor) {\r\n this.addToIndex(object.startAnchor.objectId, object.id, 'start');\r\n }\r\n if (object.endAnchor) {\r\n this.addToIndex(object.endAnchor.objectId, object.id, 'end');\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Adds an entry to the anchor index.\r\n */\r\n private addToIndex(objectId: string, lineId: string, endpoint: 'start' | 'end'): void {\r\n if (!this._anchorIndex.has(objectId)) {\r\n this._anchorIndex.set(objectId, new Set());\r\n }\r\n\r\n const entries = this._anchorIndex.get(objectId)!;\r\n\r\n // Check if entry already exists\r\n for (const entry of entries) {\r\n if (entry.lineId === lineId && entry.endpoint === endpoint) {\r\n return;\r\n }\r\n }\r\n\r\n entries.add({ lineId, endpoint });\r\n }\r\n\r\n /**\r\n * Removes an entry from the anchor index.\r\n */\r\n private removeFromIndex(objectId: string, lineId: string, endpoint: 'start' | 'end'): void {\r\n const entries = this._anchorIndex.get(objectId);\r\n if (!entries) {\r\n return;\r\n }\r\n\r\n for (const entry of entries) {\r\n if (entry.lineId === lineId && entry.endpoint === endpoint) {\r\n entries.delete(entry);\r\n break;\r\n }\r\n }\r\n\r\n // Clean up empty sets\r\n if (entries.size === 0) {\r\n this._anchorIndex.delete(objectId);\r\n }\r\n }\r\n\r\n // ============================================\r\n // Helper Methods\r\n // ============================================\r\n\r\n /**\r\n * Gets a line by its ID.\r\n */\r\n private getLineById(lineId: string): KritzelLine | null {\r\n const objects = this._core.store.state.objects.filter(o => o.id === lineId);\r\n if (objects.length === 0) {\r\n return null;\r\n }\r\n const object = objects[0];\r\n return object instanceof KritzelLine ? object : null;\r\n }\r\n\r\n /**\r\n * Gets an object by its ID.\r\n */\r\n private getObjectById(objectId: string): KritzelBaseObject<Element> | null {\r\n const objects = this._core.store.state.objects.filter(o => o.id === objectId);\r\n return objects.length > 0 ? objects[0] : null;\r\n }\r\n\r\n private findAnchorTarget(line: KritzelLine, endpoint: 'start' | 'end'): KritzelBaseObject<Element> | null {\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) {\r\n return null;\r\n }\r\n return this._core.store.allNonSelectionObjects.find(obj => obj.id === anchor.objectId) ?? null;\r\n }\r\n\r\n // ============================================\r\n // Visualization Helpers\r\n // ============================================\r\n\r\n /**\r\n * Computes anchor visualization data for a line with anchors.\r\n * Returns edge intersection points for rendering dashed lines from edge to center.\r\n */\r\n computeAnchorVisualization(line: KritzelLine, endpoint: 'start' | 'end'): AnchorVisualization | null {\r\n const anchor = endpoint === 'start' ? line.startAnchor : line.endAnchor;\r\n if (!anchor) return null;\r\n\r\n const targetObject = this.findAnchorTarget(line, endpoint);\r\n if (!targetObject) return null;\r\n\r\n const clipInfo = this.computeAnchorClipInfo(line, endpoint, targetObject);\r\n if (!clipInfo) return null;\r\n\r\n const centerX = targetObject.centerX;\r\n const centerY = targetObject.centerY;\r\n\r\n return {\r\n edgeX: clipInfo.worldX,\r\n edgeY: clipInfo.worldY,\r\n centerX,\r\n centerY,\r\n pathD: this.buildAnchorPath(line, endpoint, clipInfo, targetObject) ?? undefined,\r\n };\r\n }\r\n\r\n /**\r\n * Computes a clipped line path that stops at anchor edges instead of going to anchor centers.\r\n * When arrows are present on anchored ends, the line is shortened so the arrow tip appears at the edge.\r\n * Returns the SVG path 'd' attribute string, or the original path if no clipping is needed.\r\n * @param line The line object\r\n * @param offsetByViewBox If true, subtracts line.x and line.y from coordinates (for selection UI)\r\n */\r\n computeClippedLinePath(line: KritzelLine, offsetByViewBox: boolean = false): string {\r\n // Check for snap candidate first - this applies during drag operations even without anchors\r\n const snapCandidate = this.getSnapCandidate();\r\n const selectionGroup = this._core.store.selectionGroup;\r\n const hasActiveSnapCandidate = snapCandidate && selectionGroup && selectionGroup.objects.length === 1 && selectionGroup.objects[0].id === line.id;\r\n\r\n // If no anchors and no active snap candidate, return original path (with or without offset)\r\n if (!line.startAnchor && !line.endAnchor && !hasActiveSnapCandidate) {\r\n if (offsetByViewBox) {\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n return `M ${line.startX - line.x} ${line.startY - line.y} Q ${line.controlX - line.x} ${line.controlY - line.y} ${line.endX - line.x} ${line.endY - line.y}`;\r\n }\r\n return `M ${line.startX - line.x} ${line.startY - line.y} L ${line.endX - line.x} ${line.endY - line.y}`;\r\n }\r\n return line.d;\r\n }\r\n\r\n const startTarget = line.startAnchor ? this.findAnchorTarget(line, 'start') : null;\r\n const endTarget = line.endAnchor ? this.findAnchorTarget(line, 'end') : null;\r\n let startClip = startTarget ? this.computeAnchorClipInfo(line, 'start', startTarget) : null;\r\n let endClip = endTarget ? this.computeAnchorClipInfo(line, 'end', endTarget) : null;\r\n\r\n // Apply snap candidate if present and matches this line\r\n if (hasActiveSnapCandidate) {\r\n if (snapCandidate.edgeX !== undefined && snapCandidate.edgeY !== undefined) {\r\n const localEdge = this.lineWorldToLocal(line, snapCandidate.edgeX, snapCandidate.edgeY);\r\n const clipInfo: AnchorClipInfo = {\r\n worldX: snapCandidate.edgeX,\r\n worldY: snapCandidate.edgeY,\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n t: snapCandidate.t\r\n };\r\n\r\n if (snapCandidate.endpoint === 'start') {\r\n startClip = clipInfo;\r\n } else {\r\n endClip = clipInfo;\r\n }\r\n }\r\n }\r\n\r\n // Apply offset if requested (for selection UI which uses coordinates relative to 0,0)\r\n const offsetX = offsetByViewBox ? line.x : 0;\r\n const offsetY = offsetByViewBox ? line.y : 0;\r\n\r\n // Handle curved lines by splitting the quadratic at the clipped parameters\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n let startT = startClip?.t ?? 0;\r\n let endT = endClip?.t ?? 1;\r\n\r\n\r\n // Adjust for start arrow\r\n if (startClip && line.hasStartArrow) {\r\n const arrowOffset = line.getArrowSize('start');\r\n const speed = this.evaluateDerivativeSpeedAtT(line, startT);\r\n if (speed > 0) {\r\n startT += arrowOffset / speed;\r\n }\r\n }\r\n\r\n // Adjust for end arrow\r\n if (endClip && line.hasEndArrow) {\r\n const arrowOffset = line.getArrowSize('end');\r\n const speed = this.evaluateDerivativeSpeedAtT(line, endT);\r\n if (speed > 0) {\r\n endT -= arrowOffset / speed;\r\n }\r\n }\r\n\r\n // Ensure valid range\r\n if (startT < 0) startT = 0;\r\n if (endT > 1) endT = 1;\r\n\r\n // Handle overlap or invalid range\r\n if (endT <= startT) {\r\n // If the arrow adjustment caused them to cross, or they were already crossed/close\r\n // We can either effectively hide the line, or just clamp them.\r\n // If we clamp them to the midpoint, the line becomes a point.\r\n // Let's ensure a minimal gap or just set them equal.\r\n const mid = (startT + endT) / 2;\r\n startT = mid;\r\n endT = mid;\r\n }\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: line.startX, y: line.startY },\r\n { x: line.controlX, y: line.controlY },\r\n { x: line.endX, y: line.endY },\r\n startT,\r\n endT\r\n );\r\n\r\n return `M ${segment.start.x - offsetX} ${segment.start.y - offsetY} Q ${segment.control.x - offsetX} ${segment.control.y - offsetY} ${segment.end.x - offsetX} ${segment.end.y - offsetY}`;\r\n }\r\n\r\n // Straight lines fall back to linear interpolation\r\n let startX = startClip?.localX ?? line.startX;\r\n let startY = startClip?.localY ?? line.startY;\r\n let endX = endClip?.localX ?? line.endX;\r\n let endY = endClip?.localY ?? line.endY;\r\n\r\n if (startClip && line.hasStartArrow) {\r\n const arrowOffset = line.getArrowSize('start');\r\n const dx = endX - startX;\r\n const dy = endY - startY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n if (length > arrowOffset) {\r\n startX += (dx / length) * arrowOffset;\r\n startY += (dy / length) * arrowOffset;\r\n }\r\n }\r\n\r\n if (endClip && line.hasEndArrow) {\r\n const arrowOffset = line.getArrowSize('end');\r\n const dx = startX - endX;\r\n const dy = startY - endY;\r\n const length = Math.sqrt(dx * dx + dy * dy);\r\n if (length > arrowOffset) {\r\n endX += (dx / length) * arrowOffset;\r\n endY += (dy / length) * arrowOffset;\r\n }\r\n }\r\n\r\n return `M ${startX - offsetX} ${startY - offsetY} L ${endX - offsetX} ${endY - offsetY}`;\r\n }\r\n\r\n public computeAnchorClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n return this.computeCurvedClipInfo(line, endpoint, targetObject);\r\n }\r\n return this.computeStraightClipInfo(line, endpoint, targetObject);\r\n }\r\n\r\n private computeStraightClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n const reference = endpoint === 'start'\r\n ? this.lineLocalToWorld(line, line.endX, line.endY)\r\n : this.lineLocalToWorld(line, line.startX, line.startY);\r\n\r\n // Check for path object (uses stroke edge detection)\r\n const pathClipPoint = this.getPathClipPoint(targetObject, reference);\r\n if (pathClipPoint) {\r\n const localEdge = this.lineWorldToLocal(line, pathClipPoint.x, pathClipPoint.y);\r\n const totalLength = Math.sqrt(\r\n Math.pow(line.endX - line.startX, 2) +\r\n Math.pow(line.endY - line.startY, 2)\r\n );\r\n const distanceFromStart = Math.sqrt(\r\n Math.pow(localEdge.x - line.startX, 2) +\r\n Math.pow(localEdge.y - line.startY, 2)\r\n );\r\n const t = totalLength > 0 ? distanceFromStart / totalLength : endpoint === 'start' ? 0 : 1;\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: pathClipPoint.x,\r\n worldY: pathClipPoint.y,\r\n t,\r\n };\r\n }\r\n\r\n // Check for custom clip polygon (ellipse, triangle shapes)\r\n const customClipPolygon = this.getClipPolygonForObject(targetObject);\r\n\r\n let edgeIntersection: KritzelPoint | null;\r\n if (customClipPolygon) {\r\n // Use custom polygon for non-rectangular shapes\r\n edgeIntersection = KritzelGeometryHelper.getLinePointsArrayIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n customClipPolygon\r\n );\r\n } else {\r\n // Fall back to bounding box for rectangles and other objects\r\n edgeIntersection = KritzelGeometryHelper.getLinePolygonIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n targetObject.rotatedPolygon\r\n );\r\n }\r\n\r\n if (!edgeIntersection) {\r\n return null;\r\n }\r\n\r\n const localEdge = this.lineWorldToLocal(line, edgeIntersection.x, edgeIntersection.y);\r\n const totalLength = Math.sqrt(\r\n Math.pow(line.endX - line.startX, 2) +\r\n Math.pow(line.endY - line.startY, 2)\r\n );\r\n const distanceFromStart = Math.sqrt(\r\n Math.pow(localEdge.x - line.startX, 2) +\r\n Math.pow(localEdge.y - line.startY, 2)\r\n );\r\n const t = totalLength > 0 ? distanceFromStart / totalLength : endpoint === 'start' ? 0 : 1;\r\n\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: edgeIntersection.x,\r\n worldY: edgeIntersection.y,\r\n t,\r\n };\r\n }\r\n\r\n private computeCurvedClipInfo(line: KritzelLine, endpoint: 'start' | 'end', targetObject: KritzelBaseObject<Element>): AnchorClipInfo | null {\r\n // Check for path object (uses stroke edge detection via sampling)\r\n if (KritzelClassHelper.isInstanceOf<KritzelPath>(targetObject, 'KritzelPath')) {\r\n // For curved lines to paths, sample along the curve to find stroke edge\r\n const path = targetObject as KritzelPath;\r\n return this.findCurveExitPointForPath(line, endpoint, path);\r\n }\r\n\r\n // Check for custom clip polygon (ellipse, triangle shapes)\r\n const customClipPolygon = this.getClipPolygonForObject(targetObject);\r\n const polygonPoints = customClipPolygon ?? this.getPolygonPoints(targetObject.rotatedPolygon);\r\n\r\n const exitPoint = this.findCurveExitPoint(line, endpoint, polygonPoints);\r\n if (exitPoint) {\r\n return exitPoint;\r\n }\r\n\r\n const reference = endpoint === 'start'\r\n ? this.lineLocalToWorld(line, line.endX, line.endY)\r\n : this.lineLocalToWorld(line, line.startX, line.startY);\r\n\r\n let fallbackIntersection: KritzelPoint | null;\r\n if (customClipPolygon) {\r\n fallbackIntersection = KritzelGeometryHelper.getLinePointsArrayIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n customClipPolygon\r\n );\r\n } else {\r\n fallbackIntersection = KritzelGeometryHelper.getLinePolygonIntersection(\r\n reference,\r\n { x: targetObject.centerX, y: targetObject.centerY },\r\n targetObject.rotatedPolygon\r\n );\r\n }\r\n\r\n if (!fallbackIntersection) {\r\n return null;\r\n }\r\n\r\n const localEdge = this.lineWorldToLocal(line, fallbackIntersection.x, fallbackIntersection.y);\r\n const approxT = this.approximateParameterForWorldPoint(line, fallbackIntersection);\r\n return {\r\n localX: localEdge.x,\r\n localY: localEdge.y,\r\n worldX: fallbackIntersection.x,\r\n worldY: fallbackIntersection.y,\r\n t: approxT,\r\n };\r\n }\r\n\r\n private findCurveExitPoint(line: KritzelLine, endpoint: 'start' | 'end', polygonPoints: KritzelPoint[]): AnchorClipInfo | null {\r\n const steps = 64;\r\n const initialT = endpoint === 'start' ? 0 : 1;\r\n const initialSample = this.evaluateLineAtT(line, initialT);\r\n let prevInside = KritzelGeometryHelper.isPointInPolygon({ x: initialSample.worldX, y: initialSample.worldY }, polygonPoints);\r\n let prevT = initialT;\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const t = endpoint === 'start' ? i / steps : 1 - i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const inside = KritzelGeometryHelper.isPointInPolygon({ x: sample.worldX, y: sample.worldY }, polygonPoints);\r\n\r\n if (prevInside && !inside) {\r\n const refinedT = this.refineCurveExitParameter(line, polygonPoints, prevT, t);\r\n const refinedPoint = this.evaluateLineAtT(line, refinedT);\r\n return {\r\n localX: refinedPoint.localX,\r\n localY: refinedPoint.localY,\r\n worldX: refinedPoint.worldX,\r\n worldY: refinedPoint.worldY,\r\n t: refinedT,\r\n };\r\n }\r\n\r\n prevInside = inside;\r\n prevT = t;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Finds the exit point for a curved line going to a Path object.\r\n * Uses distance-to-stroke sampling instead of polygon containment.\r\n */\r\n private findCurveExitPointForPath(line: KritzelLine, endpoint: 'start' | 'end', path: KritzelPath): AnchorClipInfo | null {\r\n const steps = 64;\r\n const initialT = endpoint === 'start' ? 0 : 1;\r\n const halfStroke = path.strokeWidth / path.scale / 2;\r\n\r\n // Ensure path has computed points\r\n const pathPoints = this.getPathAdjustedPoints(path);\r\n if (pathPoints.length < 1) {\r\n return null;\r\n }\r\n\r\n // Check if starting point is inside the stroke\r\n const initialSample = this.evaluateLineAtT(line, initialT);\r\n let prevInside = this.isPointInPathStroke(initialSample.worldX, initialSample.worldY, pathPoints, halfStroke);\r\n let prevT = initialT;\r\n\r\n for (let i = 1; i <= steps; i++) {\r\n const t = endpoint === 'start' ? i / steps : 1 - i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const inside = this.isPointInPathStroke(sample.worldX, sample.worldY, pathPoints, halfStroke);\r\n\r\n if (prevInside && !inside) {\r\n // Refine using binary search\r\n const refinedT = this.refineCurveExitParameterForPath(line, pathPoints, halfStroke, prevT, t);\r\n const refinedPoint = this.evaluateLineAtT(line, refinedT);\r\n return {\r\n localX: refinedPoint.localX,\r\n localY: refinedPoint.localY,\r\n worldX: refinedPoint.worldX,\r\n worldY: refinedPoint.worldY,\r\n t: refinedT,\r\n };\r\n }\r\n\r\n prevInside = inside;\r\n prevT = t;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private refineCurveExitParameterForPath(\r\n line: KritzelLine,\r\n pathPoints: number[][],\r\n halfStroke: number,\r\n insideT: number,\r\n outsideT: number\r\n ): number {\r\n let tInside = insideT;\r\n let tOutside = outsideT;\r\n\r\n for (let i = 0; i < 8; i++) {\r\n const mid = (tInside + tOutside) / 2;\r\n const sample = this.evaluateLineAtT(line, mid);\r\n const inside = this.isPointInPathStroke(sample.worldX, sample.worldY, pathPoints, halfStroke);\r\n if (inside) {\r\n tInside = mid;\r\n } else {\r\n tOutside = mid;\r\n }\r\n }\r\n\r\n return (tInside + tOutside) / 2;\r\n }\r\n\r\n private getPathAdjustedPoints(path: KritzelPath): number[][] {\r\n // Access the path's adjusted points through its internal computation\r\n // We'll need to manually compute them since they're private\r\n return this.computePathAdjustedPoints(path);\r\n }\r\n\r\n private computePathAdjustedPoints(path: KritzelPath): number[][] {\r\n if (!path.points?.length) {\r\n return [];\r\n }\r\n\r\n const angle = path.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const xs = path.points.map(p => p[0]);\r\n const ys = path.points.map(p => p[1]);\r\n const pivot = {\r\n x: (Math.min(...xs) + Math.max(...xs)) / 2,\r\n y: (Math.min(...ys) + Math.max(...ys)) / 2,\r\n };\r\n\r\n const { x: cx, y: cy } = pivot;\r\n\r\n const rotatedPoints = path.points.map(([x, y]) => {\r\n const dx = x - cx;\r\n const dy = y - cy;\r\n return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];\r\n });\r\n\r\n return rotatedPoints.map(([px, py]) => [\r\n Math.abs(px - path.x) / path.scale + path.translateX,\r\n Math.abs(py - path.y) / path.scale + path.translateY,\r\n ]);\r\n }\r\n\r\n private isPointInPathStroke(x: number, y: number, pathPoints: number[][], halfStroke: number): boolean {\r\n if (pathPoints.length === 1) {\r\n const p = pathPoints[0];\r\n const dx = x - p[0];\r\n const dy = y - p[1];\r\n return Math.sqrt(dx * dx + dy * dy) <= halfStroke;\r\n }\r\n\r\n for (let i = 0; i < pathPoints.length - 1; i++) {\r\n const p1 = pathPoints[i];\r\n const p2 = pathPoints[i + 1];\r\n const dist = this.pointToSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);\r\n if (dist <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n private pointToSegmentDistance(px: number, py: number, x1: number, y1: number, x2: number, y2: number): number {\r\n const dx = x2 - x1;\r\n const dy = y2 - y1;\r\n const lengthSquared = dx * dx + dy * dy;\r\n\r\n if (lengthSquared === 0) {\r\n return Math.sqrt((px - x1) * (px - x1) + (py - y1) * (py - y1));\r\n }\r\n\r\n let t = ((px - x1) * dx + (py - y1) * dy) / lengthSquared;\r\n t = Math.max(0, Math.min(1, t));\r\n\r\n const nearestX = x1 + t * dx;\r\n const nearestY = y1 + t * dy;\r\n\r\n return Math.sqrt((px - nearestX) * (px - nearestX) + (py - nearestY) * (py - nearestY));\r\n }\r\n\r\n\r\n\r\n private refineCurveExitParameter(line: KritzelLine, polygonPoints: KritzelPoint[], insideT: number, outsideT: number): number {\r\n let tInside = insideT;\r\n let tOutside = outsideT;\r\n\r\n for (let i = 0; i < 8; i++) {\r\n const mid = (tInside + tOutside) / 2;\r\n const sample = this.evaluateLineAtT(line, mid);\r\n const inside = KritzelGeometryHelper.isPointInPolygon({ x: sample.worldX, y: sample.worldY }, polygonPoints);\r\n if (inside) {\r\n tInside = mid;\r\n } else {\r\n tOutside = mid;\r\n }\r\n }\r\n\r\n return (tInside + tOutside) / 2;\r\n }\r\n\r\n private approximateParameterForWorldPoint(line: KritzelLine, target: { x: number; y: number }): number {\r\n const steps = 80;\r\n let bestT = 0;\r\n let bestDistance = Infinity;\r\n\r\n for (let i = 0; i <= steps; i++) {\r\n const t = i / steps;\r\n const sample = this.evaluateLineAtT(line, t);\r\n const distance = Math.hypot(sample.worldX - target.x, sample.worldY - target.y);\r\n if (distance < bestDistance) {\r\n bestDistance = distance;\r\n bestT = t;\r\n }\r\n }\r\n\r\n return bestT;\r\n }\r\n\r\n private evaluateLineAtT(\r\n line: KritzelLine,\r\n t: number\r\n ): { t: number; localX: number; localY: number; worldX: number; worldY: number } {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n let localX: number;\r\n let localY: number;\r\n\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n const oneMinusT = 1 - clampedT;\r\n localX = oneMinusT * oneMinusT * line.startX + 2 * oneMinusT * clampedT * line.controlX + clampedT * clampedT * line.endX;\r\n localY = oneMinusT * oneMinusT * line.startY + 2 * oneMinusT * clampedT * line.controlY + clampedT * clampedT * line.endY;\r\n } else {\r\n localX = line.startX + (line.endX - line.startX) * clampedT;\r\n localY = line.startY + (line.endY - line.startY) * clampedT;\r\n }\r\n\r\n const world = this.lineLocalToWorld(line, localX, localY);\r\n return { t: clampedT, localX, localY, worldX: world.x, worldY: world.y };\r\n }\r\n\r\n private evaluateDerivativeSpeedAtT(line: KritzelLine, t: number): number {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n\r\n if (line.controlX !== undefined && line.controlY !== undefined) {\r\n // Quadratic Bezier derivative: B'(t) = 2(1-t)(P1-P0) + 2t(P2-P1)\r\n const p0x = line.startX;\r\n const p0y = line.startY;\r\n const p1x = line.controlX;\r\n const p1y = line.controlY;\r\n const p2x = line.endX;\r\n const p2y = line.endY;\r\n\r\n const dx = 2 * (1 - clampedT) * (p1x - p0x) + 2 * clampedT * (p2x - p1x);\r\n const dy = 2 * (1 - clampedT) * (p1y - p0y) + 2 * clampedT * (p2y - p1y);\r\n\r\n return Math.sqrt(dx * dx + dy * dy);\r\n } else {\r\n // Straight line speed is constant length\r\n const dx = line.endX - line.startX;\r\n const dy = line.endY - line.startY;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n }\r\n\r\n private extractQuadraticSegment(\r\n start: QuadraticPoint,\r\n control: QuadraticPoint,\r\n end: QuadraticPoint,\r\n tStart: number,\r\n tEnd: number\r\n ): QuadraticSegment {\r\n let normalizedStart = Math.max(0, Math.min(1, tStart));\r\n let normalizedEnd = Math.max(0, Math.min(1, tEnd));\r\n\r\n if (normalizedEnd < normalizedStart) {\r\n const swap = normalizedStart;\r\n normalizedStart = normalizedEnd;\r\n normalizedEnd = swap;\r\n }\r\n\r\n let segment: QuadraticSegment = { start, control, end };\r\n\r\n if (normalizedStart > 0) {\r\n const split = this.splitQuadraticSegment(segment, normalizedStart);\r\n segment = split.right;\r\n const remainingRange = 1 - normalizedStart;\r\n normalizedEnd = remainingRange > 0 ? (normalizedEnd - normalizedStart) / remainingRange : 1;\r\n }\r\n\r\n if (normalizedEnd < 1) {\r\n const split = this.splitQuadraticSegment(segment, normalizedEnd);\r\n segment = split.left;\r\n }\r\n\r\n return segment;\r\n }\r\n\r\n private splitQuadraticSegment(segment: QuadraticSegment, t: number): { left: QuadraticSegment; right: QuadraticSegment } {\r\n const clampedT = Math.max(0, Math.min(1, t));\r\n const p0 = segment.start;\r\n const p1 = segment.control;\r\n const p2 = segment.end;\r\n\r\n const p01 = this.lerpPoint(p0, p1, clampedT);\r\n const p12 = this.lerpPoint(p1, p2, clampedT);\r\n const p012 = this.lerpPoint(p01, p12, clampedT);\r\n\r\n return {\r\n left: { start: p0, control: p01, end: p012 },\r\n right: { start: p012, control: p12, end: p2 },\r\n };\r\n }\r\n\r\n private lerpPoint(a: QuadraticPoint, b: QuadraticPoint, t: number): QuadraticPoint {\r\n return {\r\n x: a.x + (b.x - a.x) * t,\r\n y: a.y + (b.y - a.y) * t,\r\n };\r\n }\r\n\r\n private buildAnchorPath(\r\n line: KritzelLine,\r\n endpoint: 'start' | 'end',\r\n clipInfo: AnchorClipInfo,\r\n targetObject: KritzelBaseObject<Element>\r\n ): string | null {\r\n if (line.controlX === undefined || line.controlY === undefined || clipInfo.t === undefined) {\r\n return `M ${clipInfo.worldX} ${clipInfo.worldY} L ${targetObject.centerX} ${targetObject.centerY}`;\r\n }\r\n\r\n const startT = endpoint === 'start' ? 0 : clipInfo.t;\r\n const endT = endpoint === 'start' ? clipInfo.t : 1;\r\n\r\n if (endT <= startT) {\r\n return `M ${clipInfo.worldX} ${clipInfo.worldY} L ${targetObject.centerX} ${targetObject.centerY}`;\r\n }\r\n\r\n const segment = this.extractQuadraticSegment(\r\n { x: line.startX, y: line.startY },\r\n { x: line.controlX, y: line.controlY },\r\n { x: line.endX, y: line.endY },\r\n startT,\r\n endT\r\n );\r\n\r\n const reverse = endpoint === 'start';\r\n return this.buildWorldQuadraticPath(line, segment, reverse);\r\n }\r\n\r\n private buildWorldQuadraticPath(line: KritzelLine, segment: QuadraticSegment, reverse: boolean = false): string {\r\n const startPoint = reverse ? segment.end : segment.start;\r\n const endPoint = reverse ? segment.start : segment.end;\r\n const controlPoint = segment.control;\r\n\r\n const startWorld = this.lineLocalToWorld(line, startPoint.x, startPoint.y);\r\n const controlWorld = this.lineLocalToWorld(line, controlPoint.x, controlPoint.y);\r\n const endWorld = this.lineLocalToWorld(line, endPoint.x, endPoint.y);\r\n\r\n return `M ${startWorld.x} ${startWorld.y} Q ${controlWorld.x} ${controlWorld.y} ${endWorld.x} ${endWorld.y}`;\r\n }\r\n\r\n private getPolygonPoints(polygon: KritzelPolygon): KritzelPoint[] {\r\n return [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n }\r\n\r\n /**\r\n * Gets the custom clip polygon for an object if it has one.\r\n * Returns null for objects that should use the default rotatedPolygon.\r\n */\r\n private getClipPolygonForObject(object: KritzelBaseObject<Element>): KritzelPoint[] | null {\r\n // Check if the object is a KritzelShape with a custom clip polygon\r\n if (KritzelClassHelper.isInstanceOf<KritzelShape>(object, 'KritzelShape')) {\r\n const shape = object as KritzelShape;\r\n return shape.getClipPolygon();\r\n }\r\n // Path objects use getPathClipPoint instead of polygon\r\n return null;\r\n }\r\n\r\n /**\r\n * Gets the clip point for a Path object (stroke edge intersection).\r\n * Returns null if the object is not a Path or no intersection found.\r\n */\r\n private getPathClipPoint(object: KritzelBaseObject<Element>, outsidePoint: KritzelPoint): KritzelPoint | null {\r\n if (KritzelClassHelper.isInstanceOf<KritzelPath>(object, 'KritzelPath')) {\r\n const path = object as KritzelPath;\r\n return path.getClipPoint(outsidePoint);\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Converts local line coordinates to world coordinates.\r\n */\r\n private lineLocalToWorld(line: KritzelLine, localX: number, localY: number): { x: number; y: number } {\r\n const px = localX - line.x;\r\n const py = localY - line.y;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(line.rotation);\r\n const sin = Math.sin(line.rotation);\r\n\r\n const rotatedX = (px - cx) * cos - (py - cy) * sin + cx;\r\n const rotatedY = (px - cx) * sin + (py - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX / line.scale + line.translateX,\r\n y: rotatedY / line.scale + line.translateY,\r\n };\r\n }\r\n\r\n /**\r\n * Converts world coordinates to line's local SVG coordinates.\r\n */\r\n private lineWorldToLocal(line: KritzelLine, worldX: number, worldY: number): { x: number; y: number } {\r\n const dx = (worldX - line.translateX) * line.scale;\r\n const dy = (worldY - line.translateY) * line.scale;\r\n\r\n const cx = line.totalWidth / 2;\r\n const cy = line.totalHeight / 2;\r\n\r\n const cos = Math.cos(-line.rotation);\r\n const sin = Math.sin(-line.rotation);\r\n\r\n const rotatedX = (dx - cx) * cos - (dy - cy) * sin + cx;\r\n const rotatedY = (dx - cx) * sin + (dy - cy) * cos + cy;\r\n\r\n return {\r\n x: rotatedX + line.x,\r\n y: rotatedY + line.y,\r\n };\r\n }\r\n\r\n /**\r\n * Checks if an object can be used as an anchor target.\r\n */\r\n private isAnchorable(object: KritzelBaseObject<Element>): boolean {\r\n // Exclude selection-related objects\r\n if (object instanceof KritzelSelectionBox || object instanceof KritzelSelectionGroup) {\r\n return false;\r\n }\r\n\r\n // Exclude line objects - lines cannot be anchored to other lines\r\n if (object instanceof KritzelLine) {\r\n return false;\r\n }\r\n\r\n // All other visible objects can be anchored to\r\n return object.isVisible;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,117 @@
1
+ import { KritzelCursorHelper } from "../../helpers/cursor.helper";
2
+ /**
3
+ * Manages cursor state and updates across the application.
4
+ * Handles cursor changes based on handle hovers, tool states, and interactions.
5
+ */
6
+ export class KritzelCursorManager {
7
+ _core;
8
+ _targetElement = null;
9
+ _shadowRoot = null;
10
+ constructor(core) {
11
+ this._core = core;
12
+ }
13
+ /**
14
+ * Sets the target element where cursor styles will be applied.
15
+ * Also sets the pointer cursor CSS variable for child components.
16
+ */
17
+ setTargetElement(element) {
18
+ // Reset cursor on old target
19
+ if (this._targetElement) {
20
+ this._targetElement.style.cursor = '';
21
+ this._targetElement.style.removeProperty('--kritzel-pointer-cursor');
22
+ }
23
+ this._targetElement = element;
24
+ // Set the pointer cursor CSS variable for child components to use
25
+ if (this._targetElement) {
26
+ this._targetElement.style.setProperty('--kritzel-pointer-cursor', KritzelCursorHelper.getPointerCursor());
27
+ }
28
+ }
29
+ /**
30
+ * Gets the current cursor target element.
31
+ */
32
+ getTargetElement() {
33
+ return this._targetElement;
34
+ }
35
+ /**
36
+ * Sets the shadow root for element detection.
37
+ */
38
+ setShadowRoot(shadowRoot) {
39
+ this._shadowRoot = shadowRoot;
40
+ }
41
+ /**
42
+ * Resets cursor to default state.
43
+ * Should be called when all pointers are released.
44
+ */
45
+ resetToDefault() {
46
+ this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };
47
+ }
48
+ /**
49
+ * Detects handle hover states using elementsFromPoint() to work with overlapped elements.
50
+ * This approach finds all elements at the pointer position instead of relying on pointerenter/pointerleave.
51
+ */
52
+ updateHoverState(ev) {
53
+ if (this._core.store.isPointerDown)
54
+ return;
55
+ if (!this._shadowRoot)
56
+ return;
57
+ const elementsAtPoint = this._shadowRoot.elementsFromPoint(ev.clientX, ev.clientY);
58
+ if (!elementsAtPoint || elementsAtPoint.length === 0)
59
+ return;
60
+ // Check for resize handle overlays (selection group)
61
+ const resizeHandleOverlay = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));
62
+ if (resizeHandleOverlay) {
63
+ const selectionGroup = this._core.store.selectionGroup;
64
+ const rotationDegrees = selectionGroup?.rotationDegrees ?? 0;
65
+ // Determine rotation offset based on handle position
66
+ const isTopLeft = resizeHandleOverlay.classList.contains('top-left');
67
+ const isBottomRight = resizeHandleOverlay.classList.contains('bottom-right');
68
+ const rotationOffset = (isTopLeft || isBottomRight) ? -45 : 45;
69
+ this._core.store.state.cursor = { icon: 'move-vertical', rotation: rotationDegrees + rotationOffset };
70
+ return;
71
+ }
72
+ // Check for rotation handle overlay
73
+ const rotationHandleOverlay = elementsAtPoint.find(el => el.classList.contains('rotation-handle-overlay'));
74
+ if (rotationHandleOverlay) {
75
+ this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };
76
+ return;
77
+ }
78
+ // Check for line handle overlays (selection line)
79
+ const lineHandleOverlay = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));
80
+ if (lineHandleOverlay) {
81
+ this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };
82
+ return;
83
+ }
84
+ // Reset cursor if not hovering any handle
85
+ this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };
86
+ }
87
+ /**
88
+ * Applies the current cursor state to the target element.
89
+ * Should be called in the render loop.
90
+ */
91
+ applyCursor() {
92
+ const state = this._core.store.state;
93
+ const isPointerDown = this._core.store.isPointerDown;
94
+ const icon = state.cursor?.icon;
95
+ const iconActive = state.cursor?.iconActive ?? icon;
96
+ const rotation = state.cursor?.rotation;
97
+ const cursor = KritzelCursorHelper.getCursor({
98
+ iconName: isPointerDown ? iconActive : icon,
99
+ rotation: rotation,
100
+ });
101
+ if (this._targetElement) {
102
+ this._targetElement.style.cursor = cursor;
103
+ }
104
+ }
105
+ /**
106
+ * Cleans up cursor state when the component is disconnected.
107
+ */
108
+ cleanup() {
109
+ if (this._targetElement) {
110
+ this._targetElement.style.cursor = '';
111
+ this._targetElement.style.removeProperty('--kritzel-pointer-cursor');
112
+ }
113
+ this._targetElement = null;
114
+ this._shadowRoot = null;
115
+ }
116
+ }
117
+ //# sourceMappingURL=cursor.manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.manager.js","sourceRoot":"","sources":["../../../src/classes/managers/cursor.manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCursorHelper } from '../../helpers/cursor.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\n\r\n/**\r\n * Manages cursor state and updates across the application.\r\n * Handles cursor changes based on handle hovers, tool states, and interactions.\r\n */\r\nexport class KritzelCursorManager {\r\n private readonly _core: KritzelCore;\r\n private _targetElement: HTMLElement | null = null;\r\n private _shadowRoot: ShadowRoot | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n /**\r\n * Sets the target element where cursor styles will be applied.\r\n * Also sets the pointer cursor CSS variable for child components.\r\n */\r\n setTargetElement(element: HTMLElement | null): void {\r\n // Reset cursor on old target\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = '';\r\n this._targetElement.style.removeProperty('--kritzel-pointer-cursor');\r\n }\r\n\r\n this._targetElement = element;\r\n\r\n // Set the pointer cursor CSS variable for child components to use\r\n if (this._targetElement) {\r\n this._targetElement.style.setProperty('--kritzel-pointer-cursor', KritzelCursorHelper.getPointerCursor());\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current cursor target element.\r\n */\r\n getTargetElement(): HTMLElement | null {\r\n return this._targetElement;\r\n }\r\n\r\n /**\r\n * Sets the shadow root for element detection.\r\n */\r\n setShadowRoot(shadowRoot: ShadowRoot): void {\r\n this._shadowRoot = shadowRoot;\r\n }\r\n\r\n /**\r\n * Resets cursor to default state.\r\n * Should be called when all pointers are released.\r\n */\r\n resetToDefault(): void {\r\n this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };\r\n }\r\n\r\n /**\r\n * Detects handle hover states using elementsFromPoint() to work with overlapped elements.\r\n * This approach finds all elements at the pointer position instead of relying on pointerenter/pointerleave.\r\n */\r\n updateHoverState(ev: PointerEvent): void {\r\n if (this._core.store.isPointerDown) return;\r\n if (!this._shadowRoot) return;\r\n\r\n const elementsAtPoint = this._shadowRoot.elementsFromPoint(ev.clientX, ev.clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return;\r\n\r\n // Check for resize handle overlays (selection group)\r\n const resizeHandleOverlay = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));\r\n if (resizeHandleOverlay) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n const rotationDegrees = selectionGroup?.rotationDegrees ?? 0;\r\n\r\n // Determine rotation offset based on handle position\r\n const isTopLeft = resizeHandleOverlay.classList.contains('top-left');\r\n const isBottomRight = resizeHandleOverlay.classList.contains('bottom-right');\r\n const rotationOffset = (isTopLeft || isBottomRight) ? -45 : 45;\r\n\r\n this._core.store.state.cursor = { icon: 'move-vertical', rotation: rotationDegrees + rotationOffset };\r\n return;\r\n }\r\n\r\n // Check for rotation handle overlay\r\n const rotationHandleOverlay = elementsAtPoint.find(el => el.classList.contains('rotation-handle-overlay'));\r\n if (rotationHandleOverlay) {\r\n this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };\r\n return;\r\n }\r\n\r\n // Check for line handle overlays (selection line)\r\n const lineHandleOverlay = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));\r\n if (lineHandleOverlay) {\r\n this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };\r\n return;\r\n }\r\n\r\n // Reset cursor if not hovering any handle\r\n this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };\r\n }\r\n\r\n /**\r\n * Applies the current cursor state to the target element.\r\n * Should be called in the render loop.\r\n */\r\n applyCursor(): void {\r\n const state = this._core.store.state;\r\n const isPointerDown = this._core.store.isPointerDown;\r\n\r\n const icon = state.cursor?.icon;\r\n const iconActive = state.cursor?.iconActive ?? icon;\r\n const rotation = state.cursor?.rotation;\r\n\r\n const cursor = KritzelCursorHelper.getCursor({\r\n iconName: isPointerDown ? iconActive : icon,\r\n rotation: rotation,\r\n });\r\n\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = cursor;\r\n }\r\n }\r\n\r\n /**\r\n * Cleans up cursor state when the component is disconnected.\r\n */\r\n cleanup(): void {\r\n if (this._targetElement) {\r\n this._targetElement.style.cursor = '';\r\n this._targetElement.style.removeProperty('--kritzel-pointer-cursor');\r\n }\r\n this._targetElement = null;\r\n this._shadowRoot = null;\r\n }\r\n}\r\n"]}
@@ -106,10 +106,10 @@ export class KritzelBaseObject {
106
106
  return this.rotation * (180 / Math.PI);
107
107
  }
108
108
  get centerX() {
109
- return this.translateX + this.totalWidth / 2;
109
+ return this.translateX + this.totalWidth / 2 / this.scale;
110
110
  }
111
111
  get centerY() {
112
- return this.translateY + this.totalHeight / 2;
112
+ return this.translateY + this.totalHeight / 2 / this.scale;
113
113
  }
114
114
  constructor() {
115
115
  this.id = this.generateId();
@@ -180,6 +180,8 @@ export class KritzelBaseObject {
180
180
  this.translateX = x;
181
181
  this.translateY = y;
182
182
  this._core.store.state.objects.update(this);
183
+ // Update any lines that are anchored to this object (after position is updated)
184
+ this._core.anchorManager.updateAnchorsForObject(this.id);
183
185
  }
184
186
  rotate(value) {
185
187
  this.rotation = value;
@@ -1 +1 @@
1
- {"version":3,"file":"base-object.class.js","sourceRoot":"","sources":["../../../src/classes/objects/base-object.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelBoundingBox } from '../../interfaces/bounding-box.interface';\r\nimport { KritzelObject } from '../../interfaces/object.interface';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelSerializable } from '../../interfaces/serializable.interface';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelClonable } from '../../interfaces/clonable.interface';\r\n\r\nexport class KritzelBaseObject<T extends Element = HTMLElement | SVGElement> implements KritzelObject<T>, KritzelSerializable, KritzelClonable<KritzelBaseObject<T>> {\r\n __class__: string = 'KritzelBaseObject';\r\n\r\n _core: KritzelCore;\r\n _elementRef: T;\r\n\r\n id: string;\r\n workspaceId: string;\r\n x: number;\r\n y: number;\r\n translateX: number;\r\n translateY: number;\r\n height: number;\r\n width: number;\r\n backgroundColor: string;\r\n borderColor: string;\r\n borderWidth: number = 0;\r\n opacity: number = 1;\r\n padding: number = 0;\r\n scale: number;\r\n resizing: boolean = false;\r\n rotation: number = 0;\r\n markedForRemoval: boolean = false;\r\n zIndex: number = 0;\r\n\r\n isVisible: boolean = true;\r\n isSelected: boolean = false;\r\n isHovered: boolean = false;\r\n isMounted: boolean = false;\r\n isEditable: boolean = false;\r\n isInteractive: boolean = false;\r\n isDebugInfoVisible: boolean = false;\r\n\r\n get totalWidth(): number {\r\n return this.width + this.padding * 2;\r\n }\r\n\r\n get totalHeight(): number {\r\n return this.height + this.padding * 2;\r\n }\r\n\r\n set elementRef(element: T) {\r\n this._elementRef = element;\r\n }\r\n\r\n get elementRef(): T {\r\n return this._elementRef;\r\n }\r\n\r\n get boundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.translateX,\r\n y: this.translateY,\r\n z: this.scale,\r\n width: this.totalWidth / this.scale,\r\n height: this.totalHeight / this.scale,\r\n };\r\n }\r\n\r\n get rotatedBoundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.minXRotated,\r\n y: this.minYRotated,\r\n z: this.scale,\r\n width: this.maxXRotated - this.minXRotated,\r\n height: this.maxYRotated - this.minYRotated,\r\n };\r\n }\r\n\r\n get rotatedPolygon(): KritzelPolygon {\r\n const cx = this.translateX + this.totalWidth / 2 / this.scale;\r\n const cy = this.translateY + this.totalHeight / 2 / this.scale;\r\n const angle = this.rotation;\r\n\r\n const adjustedWidth = this.totalWidth / this.scale;\r\n const adjustedHeight = this.totalHeight / this.scale;\r\n\r\n const corners = {\r\n topLeft: { x: this.translateX, y: this.translateY },\r\n topRight: { x: this.translateX + adjustedWidth, y: this.translateY },\r\n bottomRight: { x: this.translateX + adjustedWidth, y: this.translateY + adjustedHeight },\r\n bottomLeft: { x: this.translateX, y: this.translateY + adjustedHeight },\r\n };\r\n\r\n const rotatedCorners = Object.keys(corners).reduce((acc, key) => {\r\n const corner = corners[key];\r\n const rotatedX = Math.cos(angle) * (corner.x - cx) - Math.sin(angle) * (corner.y - cy) + cx;\r\n const rotatedY = Math.sin(angle) * (corner.x - cx) + Math.cos(angle) * (corner.y - cy) + cy;\r\n acc[key] = { x: rotatedX, y: rotatedY };\r\n return acc;\r\n }, {});\r\n\r\n return rotatedCorners as KritzelPolygon;\r\n }\r\n\r\n get minXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get minYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get maxXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get maxYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get transformationMatrix(): string {\r\n const scale = 1 / this.scale;\r\n const translateX = this.translateX;\r\n const translateY = this.translateY;\r\n\r\n return `matrix(${scale}, 0, 0, ${scale}, ${translateX}, ${translateY})`;\r\n }\r\n\r\n get rotationDegrees(): number {\r\n return this.rotation * (180 / Math.PI);\r\n }\r\n\r\n get centerX(): number {\r\n return this.translateX + this.totalWidth / 2;\r\n }\r\n\r\n get centerY(): number {\r\n return this.translateY + this.totalHeight / 2;\r\n }\r\n\r\n constructor() {\r\n this.id = this.generateId();\r\n }\r\n\r\n static create(core: KritzelCore): KritzelBaseObject<Element> {\r\n const object = new KritzelBaseObject();\r\n\r\n object._core = core;\r\n object.zIndex = core.store.currentZIndex;\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n\r\n return object;\r\n }\r\n\r\n mount(element: T): void {\r\n if (this.isMounted) {\r\n return;\r\n }\r\n\r\n this.elementRef = element;\r\n this.isMounted = true;\r\n }\r\n\r\n generateId(): string {\r\n return ObjectHelper.generateUUID();\r\n }\r\n\r\n isInViewport(): boolean {\r\n\r\n const viewportScale = this._core.store.state.scale;\r\n const scaledWidth = this.boundingBox.width * viewportScale;\r\n const scaledHeight = this.boundingBox.height * viewportScale;\r\n \r\n if(scaledWidth * scaledHeight < 0.5){\r\n return false;\r\n }\r\n\r\n\r\n const viewportBounds: KritzelBoundingBox = {\r\n x: -this._core.store.state.translateX / this._core.store.state.scale,\r\n y: -this._core.store.state.translateY / this._core.store.state.scale,\r\n z: this._core.store.state.scale,\r\n width: this._core.store.state.viewportWidth / this._core.store.state.scale,\r\n height: this._core.store.state.viewportHeight / this._core.store.state.scale,\r\n };\r\n\r\n return (\r\n this.rotatedBoundingBox.x < viewportBounds.x + viewportBounds.width &&\r\n this.rotatedBoundingBox.x + this.rotatedBoundingBox.width > viewportBounds.x &&\r\n this.rotatedBoundingBox.y < viewportBounds.y + viewportBounds.height &&\r\n this.rotatedBoundingBox.y + this.rotatedBoundingBox.height > viewportBounds.y\r\n );\r\n }\r\n\r\n centerInViewport(): void {\r\n const { viewportWidth, viewportHeight, translateX: viewportTranslateX, translateY: viewportTranslateY, scale: viewportScale } = this._core.store.state;\r\n const { x, y, width, height } = this.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n const targetCenterX = (viewportWidth / 2 - viewportTranslateX) / viewportScale;\r\n const targetCenterY = (viewportHeight / 2 - viewportTranslateY) / viewportScale;\r\n\r\n const deltaX = targetCenterX - objectCenterX;\r\n const deltaY = targetCenterY - objectCenterY;\r\n\r\n this.updatePosition(this.translateX + deltaX, this.translateY + deltaY);\r\n }\r\n\r\n update(): void {\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._core.store.state.scale;\r\n const deltaY = (startY - endY) / this._core.store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n resize(x: number, y: number, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n clone(): KritzelBaseObject<T> {\r\n const clone = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(clone, this);\r\n clone.id = this.id;\r\n return clone;\r\n }\r\n\r\n copy(): KritzelBaseObject<T> {\r\n const copiedObject: KritzelBaseObject<T> = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(copiedObject, this);\r\n copiedObject.id = this.generateId();\r\n copiedObject.isMounted = false;\r\n return copiedObject;\r\n }\r\n\r\n serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {\r\n clonedProps.element = element.cloneNode(true) as HTMLElement;\r\n }\r\n\r\n return clonedProps;\r\n }\r\n\r\n deserialize<T>(object: any): T {\r\n Object.assign(this, object);\r\n return this as unknown as T;\r\n }\r\n\r\n isClass<T extends KritzelBaseObject>(this: T, className: string): this is T {\r\n return this.__class__ === className;\r\n }\r\n\r\n edit(_event?: PointerEvent): void {\r\n // This method can be overridden by subclasses to handle edit actions.\r\n }\r\n\r\n hitTest(_x: number, _y: number): boolean {\r\n return true; // Default implementation, can be overridden by subclasses\r\n }\r\n\r\n hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const objectPolygon = this.rotatedPolygon;\r\n return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);\r\n }\r\n\r\n updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._core.store.state.objects.update(this);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"base-object.class.js","sourceRoot":"","sources":["../../../src/classes/objects/base-object.class.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAItE,MAAM,OAAO,iBAAiB;IAC5B,SAAS,GAAW,mBAAmB,CAAC;IAExC,KAAK,CAAc;IACnB,WAAW,CAAI;IAEf,EAAE,CAAS;IACX,WAAW,CAAS;IACpB,CAAC,CAAS;IACV,CAAC,CAAS;IACV,UAAU,CAAS;IACnB,UAAU,CAAS;IACnB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,eAAe,CAAS;IACxB,WAAW,CAAS;IACpB,WAAW,GAAW,CAAC,CAAC;IACxB,OAAO,GAAW,CAAC,CAAC;IACpB,OAAO,GAAW,CAAC,CAAC;IACpB,KAAK,CAAS;IACd,QAAQ,GAAY,KAAK,CAAC;IAC1B,QAAQ,GAAW,CAAC,CAAC;IACrB,gBAAgB,GAAY,KAAK,CAAC;IAClC,MAAM,GAAW,CAAC,CAAC;IAEnB,SAAS,GAAY,IAAI,CAAC;IAC1B,UAAU,GAAY,KAAK,CAAC;IAC5B,SAAS,GAAY,KAAK,CAAC;IAC3B,SAAS,GAAY,KAAK,CAAC;IAC3B,UAAU,GAAY,KAAK,CAAC;IAC5B,aAAa,GAAY,KAAK,CAAC;IAC/B,kBAAkB,GAAY,KAAK,CAAC;IAEpC,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,UAAU,CAAC,OAAU;QACvB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;IAC7B,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,WAAW;QACb,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,UAAU;YAClB,CAAC,EAAE,IAAI,CAAC,UAAU;YAClB,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;YACnC,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,WAAW;YACnB,CAAC,EAAE,IAAI,CAAC,WAAW;YACnB,CAAC,EAAE,IAAI,CAAC,KAAK;YACb,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;YAC1C,MAAM,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;SAC5C,CAAC;IACJ,CAAC;IAED,IAAI,cAAc;QAChB,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9D,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE5B,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;QAErD,MAAM,OAAO,GAAG;YACd,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE;YACnD,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE;YACpE,WAAW,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,cAAc,EAAE;YACxF,UAAU,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,cAAc,EAAE;SACxE,CAAC;QAEF,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;YAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;YAC5F,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;YACxC,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,cAAgC,CAAC;IAC1C,CAAC;IAED,IAAI,WAAW;QACb,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAErJ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QACb,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAErJ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QACb,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAErJ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,WAAW;QACb,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAErJ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,oBAAoB;QACtB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAEnC,OAAO,UAAU,KAAK,WAAW,KAAK,KAAK,UAAU,KAAK,UAAU,GAAG,CAAC;IAC1E,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAC7D,CAAC;IAED;QACE,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,IAAiB;QAC7B,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAEvC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAEzD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAU;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAED,UAAU;QACR,OAAO,YAAY,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC;IAED,YAAY;QAEV,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,aAAa,CAAC;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC;QAE7D,IAAG,WAAW,GAAG,YAAY,GAAG,GAAG,EAAC,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QAGD,MAAM,cAAc,GAAuB;YACzC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;YACpE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;YACpE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;YAC/B,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;YAC1E,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK;SAC7E,CAAC;QAEF,OAAO,CACL,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK;YACnE,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,GAAG,cAAc,CAAC,CAAC;YAC5E,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM;YACpE,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,cAAc,CAAC,CAAC,CAC9E,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACvJ,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAExD,MAAM,aAAa,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;QAErC,MAAM,aAAa,GAAG,CAAC,aAAa,GAAG,CAAC,GAAG,kBAAkB,CAAC,GAAG,aAAa,CAAC;QAC/E,MAAM,aAAa,GAAG,CAAC,cAAc,GAAG,CAAC,GAAG,kBAAkB,CAAC,GAAG,aAAa,CAAC;QAEhF,MAAM,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;QAC7C,MAAM,MAAM,GAAG,aAAa,GAAG,aAAa,CAAC;QAE7C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,GAAG,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,MAAc,EAAE,MAAc,EAAE,IAAY,EAAE,IAAY;QAC7D,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAC9D,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QAE9D,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;QAC1B,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;QAE1B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc;QACxD,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAE5C,gFAAgF;QAChF,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI;QACF,MAAM,YAAY,GAAyB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAClC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,YAAY,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,SAAS;QACP,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,GAAG,IAAW,CAAC;QAEhG,MAAM,WAAW,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAEpD,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC9F,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAgB,CAAC;QAC/D,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,WAAW,CAAI,MAAW;QACxB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5B,OAAO,IAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,CAAuC,SAAiB;QAC7D,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,CAAC,MAAqB;QACxB,sEAAsE;IACxE,CAAC;IAED,OAAO,CAAC,EAAU,EAAE,EAAU;QAC5B,OAAO,IAAI,CAAC,CAAC,0DAA0D;IACzE,CAAC;IAED,cAAc,CAAC,OAAuB;QACpC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,OAAO,qBAAqB,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC3E,CAAC;IAED,cAAc,CAAC,CAAS,EAAE,CAAS;QACjC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;CACF","sourcesContent":["import { KritzelBoundingBox } from '../../interfaces/bounding-box.interface';\r\nimport { KritzelObject } from '../../interfaces/object.interface';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelSerializable } from '../../interfaces/serializable.interface';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelClonable } from '../../interfaces/clonable.interface';\r\n\r\nexport class KritzelBaseObject<T extends Element = HTMLElement | SVGElement> implements KritzelObject<T>, KritzelSerializable, KritzelClonable<KritzelBaseObject<T>> {\r\n __class__: string = 'KritzelBaseObject';\r\n\r\n _core: KritzelCore;\r\n _elementRef: T;\r\n\r\n id: string;\r\n workspaceId: string;\r\n x: number;\r\n y: number;\r\n translateX: number;\r\n translateY: number;\r\n height: number;\r\n width: number;\r\n backgroundColor: string;\r\n borderColor: string;\r\n borderWidth: number = 0;\r\n opacity: number = 1;\r\n padding: number = 0;\r\n scale: number;\r\n resizing: boolean = false;\r\n rotation: number = 0;\r\n markedForRemoval: boolean = false;\r\n zIndex: number = 0;\r\n\r\n isVisible: boolean = true;\r\n isSelected: boolean = false;\r\n isHovered: boolean = false;\r\n isMounted: boolean = false;\r\n isEditable: boolean = false;\r\n isInteractive: boolean = false;\r\n isDebugInfoVisible: boolean = false;\r\n\r\n get totalWidth(): number {\r\n return this.width + this.padding * 2;\r\n }\r\n\r\n get totalHeight(): number {\r\n return this.height + this.padding * 2;\r\n }\r\n\r\n set elementRef(element: T) {\r\n this._elementRef = element;\r\n }\r\n\r\n get elementRef(): T {\r\n return this._elementRef;\r\n }\r\n\r\n get boundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.translateX,\r\n y: this.translateY,\r\n z: this.scale,\r\n width: this.totalWidth / this.scale,\r\n height: this.totalHeight / this.scale,\r\n };\r\n }\r\n\r\n get rotatedBoundingBox(): KritzelBoundingBox {\r\n return {\r\n x: this.minXRotated,\r\n y: this.minYRotated,\r\n z: this.scale,\r\n width: this.maxXRotated - this.minXRotated,\r\n height: this.maxYRotated - this.minYRotated,\r\n };\r\n }\r\n\r\n get rotatedPolygon(): KritzelPolygon {\r\n const cx = this.translateX + this.totalWidth / 2 / this.scale;\r\n const cy = this.translateY + this.totalHeight / 2 / this.scale;\r\n const angle = this.rotation;\r\n\r\n const adjustedWidth = this.totalWidth / this.scale;\r\n const adjustedHeight = this.totalHeight / this.scale;\r\n\r\n const corners = {\r\n topLeft: { x: this.translateX, y: this.translateY },\r\n topRight: { x: this.translateX + adjustedWidth, y: this.translateY },\r\n bottomRight: { x: this.translateX + adjustedWidth, y: this.translateY + adjustedHeight },\r\n bottomLeft: { x: this.translateX, y: this.translateY + adjustedHeight },\r\n };\r\n\r\n const rotatedCorners = Object.keys(corners).reduce((acc, key) => {\r\n const corner = corners[key];\r\n const rotatedX = Math.cos(angle) * (corner.x - cx) - Math.sin(angle) * (corner.y - cy) + cx;\r\n const rotatedY = Math.sin(angle) * (corner.x - cx) + Math.cos(angle) * (corner.y - cy) + cy;\r\n acc[key] = { x: rotatedX, y: rotatedY };\r\n return acc;\r\n }, {});\r\n\r\n return rotatedCorners as KritzelPolygon;\r\n }\r\n\r\n get minXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get minYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.min(...corners);\r\n }\r\n\r\n get maxXRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get maxYRotated(): number {\r\n const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];\r\n\r\n return Math.max(...corners);\r\n }\r\n\r\n get transformationMatrix(): string {\r\n const scale = 1 / this.scale;\r\n const translateX = this.translateX;\r\n const translateY = this.translateY;\r\n\r\n return `matrix(${scale}, 0, 0, ${scale}, ${translateX}, ${translateY})`;\r\n }\r\n\r\n get rotationDegrees(): number {\r\n return this.rotation * (180 / Math.PI);\r\n }\r\n\r\n get centerX(): number {\r\n return this.translateX + this.totalWidth / 2 / this.scale;\r\n }\r\n\r\n get centerY(): number {\r\n return this.translateY + this.totalHeight / 2 / this.scale;\r\n }\r\n\r\n constructor() {\r\n this.id = this.generateId();\r\n }\r\n\r\n static create(core: KritzelCore): KritzelBaseObject<Element> {\r\n const object = new KritzelBaseObject();\r\n\r\n object._core = core;\r\n object.zIndex = core.store.currentZIndex;\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n\r\n return object;\r\n }\r\n\r\n mount(element: T): void {\r\n if (this.isMounted) {\r\n return;\r\n }\r\n\r\n this.elementRef = element;\r\n this.isMounted = true;\r\n }\r\n\r\n generateId(): string {\r\n return ObjectHelper.generateUUID();\r\n }\r\n\r\n isInViewport(): boolean {\r\n\r\n const viewportScale = this._core.store.state.scale;\r\n const scaledWidth = this.boundingBox.width * viewportScale;\r\n const scaledHeight = this.boundingBox.height * viewportScale;\r\n \r\n if(scaledWidth * scaledHeight < 0.5){\r\n return false;\r\n }\r\n\r\n\r\n const viewportBounds: KritzelBoundingBox = {\r\n x: -this._core.store.state.translateX / this._core.store.state.scale,\r\n y: -this._core.store.state.translateY / this._core.store.state.scale,\r\n z: this._core.store.state.scale,\r\n width: this._core.store.state.viewportWidth / this._core.store.state.scale,\r\n height: this._core.store.state.viewportHeight / this._core.store.state.scale,\r\n };\r\n\r\n return (\r\n this.rotatedBoundingBox.x < viewportBounds.x + viewportBounds.width &&\r\n this.rotatedBoundingBox.x + this.rotatedBoundingBox.width > viewportBounds.x &&\r\n this.rotatedBoundingBox.y < viewportBounds.y + viewportBounds.height &&\r\n this.rotatedBoundingBox.y + this.rotatedBoundingBox.height > viewportBounds.y\r\n );\r\n }\r\n\r\n centerInViewport(): void {\r\n const { viewportWidth, viewportHeight, translateX: viewportTranslateX, translateY: viewportTranslateY, scale: viewportScale } = this._core.store.state;\r\n const { x, y, width, height } = this.rotatedBoundingBox;\r\n\r\n const objectCenterX = x + width / 2;\r\n const objectCenterY = y + height / 2;\r\n\r\n const targetCenterX = (viewportWidth / 2 - viewportTranslateX) / viewportScale;\r\n const targetCenterY = (viewportHeight / 2 - viewportTranslateY) / viewportScale;\r\n\r\n const deltaX = targetCenterX - objectCenterX;\r\n const deltaY = targetCenterY - objectCenterY;\r\n\r\n this.updatePosition(this.translateX + deltaX, this.translateY + deltaY);\r\n }\r\n\r\n update(): void {\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._core.store.state.scale;\r\n const deltaY = (startY - endY) / this._core.store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n resize(x: number, y: number, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n this.width = width;\r\n this.height = height;\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._core.store.state.objects.update(this);\r\n\r\n // Update any lines that are anchored to this object (after position is updated)\r\n this._core.anchorManager.updateAnchorsForObject(this.id);\r\n }\r\n\r\n rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n clone(): KritzelBaseObject<T> {\r\n const clone = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(clone, this);\r\n clone.id = this.id;\r\n return clone;\r\n }\r\n\r\n copy(): KritzelBaseObject<T> {\r\n const copiedObject: KritzelBaseObject<T> = Object.create(Object.getPrototypeOf(this));\r\n Object.assign(copiedObject, this);\r\n copiedObject.id = this.generateId();\r\n copiedObject.isMounted = false;\r\n return copiedObject;\r\n }\r\n\r\n serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {\r\n clonedProps.element = element.cloneNode(true) as HTMLElement;\r\n }\r\n\r\n return clonedProps;\r\n }\r\n\r\n deserialize<T>(object: any): T {\r\n Object.assign(this, object);\r\n return this as unknown as T;\r\n }\r\n\r\n isClass<T extends KritzelBaseObject>(this: T, className: string): this is T {\r\n return this.__class__ === className;\r\n }\r\n\r\n edit(_event?: PointerEvent): void {\r\n // This method can be overridden by subclasses to handle edit actions.\r\n }\r\n\r\n hitTest(_x: number, _y: number): boolean {\r\n return true; // Default implementation, can be overridden by subclasses\r\n }\r\n\r\n hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const objectPolygon = this.rotatedPolygon;\r\n return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);\r\n }\r\n\r\n updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._core.store.state.objects.update(this);\r\n }\r\n}\r\n"]}