kritzel-stencil 0.0.169 → 0.0.170

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 (100) hide show
  1. package/dist/cjs/{default-line-tool.config-Bs88k0jE.js → default-line-tool.config-JuTDR6PF.js} +514 -13
  2. package/dist/cjs/default-line-tool.config-JuTDR6PF.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +2 -1
  4. package/dist/cjs/index.cjs.js.map +1 -1
  5. package/dist/cjs/kritzel-color_22.cjs.entry.js +120 -6
  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 +89 -1
  9. package/dist/collection/classes/core/core.class.js.map +1 -1
  10. package/dist/collection/classes/core/reviver.class.js +4 -0
  11. package/dist/collection/classes/core/reviver.class.js.map +1 -1
  12. package/dist/collection/classes/handlers/key.handler.js +3 -0
  13. package/dist/collection/classes/handlers/key.handler.js.map +1 -1
  14. package/dist/collection/classes/handlers/move.handler.js +63 -0
  15. package/dist/collection/classes/handlers/move.handler.js.map +1 -1
  16. package/dist/collection/classes/handlers/rotation.handler.js +2 -0
  17. package/dist/collection/classes/handlers/rotation.handler.js.map +1 -1
  18. package/dist/collection/classes/handlers/selection.handler.js +23 -5
  19. package/dist/collection/classes/handlers/selection.handler.js.map +1 -1
  20. package/dist/collection/classes/objects/group.class.js +394 -0
  21. package/dist/collection/classes/objects/group.class.js.map +1 -0
  22. package/dist/collection/classes/objects/line.class.js +2 -1
  23. package/dist/collection/classes/objects/line.class.js.map +1 -1
  24. package/dist/collection/classes/objects/selection-group.class.js +19 -3
  25. package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
  26. package/dist/collection/classes/registries/icon-registry.class.js +2 -0
  27. package/dist/collection/classes/registries/icon-registry.class.js.map +1 -1
  28. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +17 -2
  29. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js.map +1 -1
  30. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +43 -3
  31. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js.map +1 -1
  32. package/dist/collection/helpers/event.helper.js +10 -2
  33. package/dist/collection/helpers/event.helper.js.map +1 -1
  34. package/dist/collection/index.js +1 -0
  35. package/dist/collection/index.js.map +1 -1
  36. package/dist/components/index.js +3 -3
  37. package/dist/components/kritzel-brush-style.js +1 -1
  38. package/dist/components/kritzel-context-menu.js +1 -1
  39. package/dist/components/kritzel-control-brush-config.js +1 -1
  40. package/dist/components/kritzel-control-text-config.js +1 -1
  41. package/dist/components/kritzel-controls.js +1 -1
  42. package/dist/components/kritzel-editor.js +27 -12
  43. package/dist/components/kritzel-editor.js.map +1 -1
  44. package/dist/components/kritzel-engine.js +1 -1
  45. package/dist/components/kritzel-icon.js +1 -1
  46. package/dist/components/kritzel-menu-item.js +1 -1
  47. package/dist/components/kritzel-menu.js +1 -1
  48. package/dist/components/kritzel-split-button.js +1 -1
  49. package/dist/components/kritzel-utility-panel.js +1 -1
  50. package/dist/components/kritzel-workspace-manager.js +1 -1
  51. package/dist/components/{p-f_ut_1_F.js → p-9Sbn9-7-.js} +610 -19
  52. package/dist/components/p-9Sbn9-7-.js.map +1 -0
  53. package/dist/components/{p-Bwv1dxAB.js → p-BUsg2vtg.js} +12 -4
  54. package/dist/components/{p-Bwv1dxAB.js.map → p-BUsg2vtg.js.map} +1 -1
  55. package/dist/components/{p-BoazmhlG.js → p-C6-tSCMR.js} +3 -3
  56. package/dist/components/{p-BoazmhlG.js.map → p-C6-tSCMR.js.map} +1 -1
  57. package/dist/components/{p-Cv4BGNPb.js → p-CIts5Uma.js} +4 -2
  58. package/dist/components/p-CIts5Uma.js.map +1 -0
  59. package/dist/components/{p-BSBMBjhq.js → p-CQd5oYXp.js} +3 -3
  60. package/dist/components/{p-BSBMBjhq.js.map → p-CQd5oYXp.js.map} +1 -1
  61. package/dist/components/{p-D8L0t-Ro.js → p-Co5HWjr6.js} +3 -3
  62. package/dist/components/{p-D8L0t-Ro.js.map → p-Co5HWjr6.js.map} +1 -1
  63. package/dist/components/{p-5OECjGHq.js → p-DG7VXGxX.js} +3 -3
  64. package/dist/components/{p-5OECjGHq.js.map → p-DG7VXGxX.js.map} +1 -1
  65. package/dist/components/{p-D1YAsWrL.js → p-D_uh1RUI.js} +3 -3
  66. package/dist/components/{p-D1YAsWrL.js.map → p-D_uh1RUI.js.map} +1 -1
  67. package/dist/components/{p-xcQV8l_c.js → p-cv2RCdI1.js} +7 -7
  68. package/dist/components/{p-xcQV8l_c.js.map → p-cv2RCdI1.js.map} +1 -1
  69. package/dist/components/{p-BmdYFhLx.js → p-nZdy-Ii5.js} +4 -4
  70. package/dist/components/{p-BmdYFhLx.js.map → p-nZdy-Ii5.js.map} +1 -1
  71. package/dist/components/{p-CiM-IPaD.js → p-y25EBKEA.js} +5 -5
  72. package/dist/components/{p-CiM-IPaD.js.map → p-y25EBKEA.js.map} +1 -1
  73. package/dist/esm/{default-line-tool.config-PvsWHpO2.js → default-line-tool.config-CuBm2vpW.js} +514 -14
  74. package/dist/esm/default-line-tool.config-CuBm2vpW.js.map +1 -0
  75. package/dist/esm/index.js +2 -2
  76. package/dist/esm/kritzel-color_22.entry.js +120 -6
  77. package/dist/esm/loader.js +1 -1
  78. package/dist/esm/stencil.js +1 -1
  79. package/dist/stencil/index.esm.js +1 -1
  80. package/dist/stencil/p-CuBm2vpW.js +2 -0
  81. package/dist/stencil/p-CuBm2vpW.js.map +1 -0
  82. package/dist/stencil/p-c9201236.entry.js +10 -0
  83. package/dist/stencil/p-c9201236.entry.js.map +1 -0
  84. package/dist/stencil/stencil.esm.js +1 -1
  85. package/dist/types/classes/core/core.class.d.ts +11 -1
  86. package/dist/types/classes/handlers/move.handler.d.ts +11 -0
  87. package/dist/types/classes/objects/group.class.d.ts +97 -0
  88. package/dist/types/classes/objects/selection-group.class.d.ts +5 -0
  89. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +2 -0
  90. package/dist/types/components.d.ts +4 -2
  91. package/dist/types/index.d.ts +1 -0
  92. package/package.json +1 -1
  93. package/dist/cjs/default-line-tool.config-Bs88k0jE.js.map +0 -1
  94. package/dist/components/p-Cv4BGNPb.js.map +0 -1
  95. package/dist/components/p-f_ut_1_F.js.map +0 -1
  96. package/dist/esm/default-line-tool.config-PvsWHpO2.js.map +0 -1
  97. package/dist/stencil/p-9913896b.entry.js +0 -10
  98. package/dist/stencil/p-9913896b.entry.js.map +0 -1
  99. package/dist/stencil/p-PvsWHpO2.js +0 -2
  100. package/dist/stencil/p-PvsWHpO2.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/group.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\n\r\n/**\r\n * KritzelGroup represents a permanent grouping of objects that act as a single unit.\r\n * \r\n * Unlike KritzelSelectionGroup (which is ephemeral and used for temporary multi-selection),\r\n * KritzelGroup is persisted and saved with the workspace. Grouped objects move, resize,\r\n * rotate, copy, and delete together as one unit.\r\n * \r\n * Key features:\r\n * - Supports nested groups (groups can contain other groups)\r\n * - Clicking any child selects the entire group\r\n * - Can be ungrouped to restore children to top-level objects\r\n */\r\nexport class KritzelGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelGroup';\r\n\r\n /**\r\n * IDs of child objects within this group.\r\n * Children can be any KritzelBaseObject, including other KritzelGroups for nesting.\r\n */\r\n childIds: string[] = [];\r\n\r\n /**\r\n * Snapshots of child states for transformation operations (resize, rotate).\r\n * Similar pattern to KritzelSelectionGroup.\r\n */\r\n private unchangedChildSnapshots: Map<string, ChildSnapshot> = new Map();\r\n private snapshotRotation: number = 0;\r\n\r\n private snapshotTranslateX: number = 0;\r\n private snapshotTranslateY: number = 0;\r\n private snapshotTotalWidth: number = 0;\r\n private snapshotTotalHeight: number = 0;\r\n private snapshotScale: number = 1;\r\n\r\n /**\r\n * Retrieves the actual child objects from the store by their IDs.\r\n */\r\n get children(): KritzelBaseObject<any>[] {\r\n return this.childIds\r\n .map(id => {\r\n const found = this._core.store.state.objects.filter(obj => obj.id === id);\r\n return found.length > 0 ? found[0] : null;\r\n })\r\n .filter((obj): obj is KritzelBaseObject<any> => obj !== null);\r\n }\r\n\r\n /**\r\n * Returns the number of children in this group.\r\n */\r\n get length(): number {\r\n return this.childIds.length;\r\n }\r\n\r\n /**\r\n * Creates a new empty KritzelGroup.\r\n */\r\n static override create(core: KritzelCore): KritzelGroup {\r\n const group = new KritzelGroup();\r\n\r\n group._core = core;\r\n group.id = group.generateId();\r\n group.workspaceId = core.store.state.activeWorkspace.id;\r\n group.scale = core.store.state.scale;\r\n group.zIndex = core.store.currentZIndex;\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Creates a KritzelGroup from an array of objects.\r\n * The objects are added as children and their bounding box is calculated.\r\n */\r\n static createFromObjects(core: KritzelCore, objects: KritzelBaseObject<any>[]): KritzelGroup {\r\n const group = KritzelGroup.create(core);\r\n\r\n // Add all objects as children\r\n objects.forEach(obj => {\r\n group.childIds.push(obj.id);\r\n });\r\n\r\n // Calculate bounding box from children\r\n group.refreshBoundingBox();\r\n group.captureChildSnapshots();\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Finds the parent KritzelGroup that contains the given object as a child.\r\n * Returns null if the object is not a child of any group.\r\n */\r\n static findParentGroup(core: KritzelCore, objectId: string): KritzelGroup | null {\r\n const allGroups = core.store.state.objects\r\n .filter(obj => obj.__class__ === 'KritzelGroup') as KritzelGroup[];\r\n\r\n for (const group of allGroups) {\r\n if (group.childIds.includes(objectId)) {\r\n return group;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Adds a child object to this group.\r\n */\r\n addChild(object: KritzelBaseObject<any>): void {\r\n if (!this.childIds.includes(object.id)) {\r\n this.childIds.push(object.id);\r\n this.refreshBoundingBox();\r\n this.captureChildSnapshots();\r\n }\r\n }\r\n\r\n /**\r\n * Removes a child object from this group.\r\n */\r\n removeChild(objectId: string): void {\r\n const index = this.childIds.indexOf(objectId);\r\n if (index !== -1) {\r\n this.childIds.splice(index, 1);\r\n this.refreshBoundingBox();\r\n this.captureChildSnapshots();\r\n }\r\n }\r\n\r\n /**\r\n * Ungroups this group, returning all children to top-level objects.\r\n * The group itself should be removed after calling this.\r\n */\r\n ungroup(): KritzelBaseObject<any>[] {\r\n return this.children;\r\n }\r\n\r\n /**\r\n * Finalizes the group after children have been positioned (e.g., after paste).\r\n * Refreshes the bounding box and captures child snapshots.\r\n */\r\n finalize(): void {\r\n this.refreshBoundingBox();\r\n this.captureChildSnapshots();\r\n }\r\n\r\n /**\r\n * Recalculates the group's bounding box based on its children.\r\n */\r\n refreshBoundingBox(): void {\r\n if (this.children.length === 0) {\r\n this.width = 0;\r\n this.height = 0;\r\n this.translateX = 0;\r\n this.translateY = 0;\r\n return;\r\n }\r\n\r\n if (this.children.length === 1) {\r\n // Single child: inherit its bounding box\r\n const child = this.children[0];\r\n this.translateX = child.boundingBox.x;\r\n this.translateY = child.boundingBox.y;\r\n this.width = child.boundingBox.width * this.scale;\r\n this.height = child.boundingBox.height * this.scale;\r\n return;\r\n }\r\n\r\n // Multiple children: calculate encompassing bounding box\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n this.children.forEach(child => {\r\n const polygon = child.rotatedPolygon;\r\n const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n corners.forEach(corner => {\r\n // Rotate corner into local space (aligned with group rotation)\r\n const rx = corner.x * cos - corner.y * sin;\r\n const ry = corner.x * sin + corner.y * cos;\r\n\r\n if (rx < minX) minX = rx;\r\n if (rx > maxX) maxX = rx;\r\n if (ry < minY) minY = ry;\r\n if (ry > maxY) maxY = ry;\r\n });\r\n });\r\n\r\n // Dimensions in world units (unrotated)\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxY - minY;\r\n\r\n this.width = (worldWidth - this.padding) * this.scale;\r\n this.height = (worldHeight - this.padding) * this.scale;\r\n\r\n // Center of the box in rotated space\r\n const cRx = (minX + maxX) / 2;\r\n const cRy = (minY + maxY) / 2;\r\n\r\n // Rotate center back to world space\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n const cx = cRx * cosR - cRy * sinR;\r\n const cy = cRx * sinR + cRy * cosR;\r\n\r\n this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;\r\n this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;\r\n }\r\n\r\n /**\r\n * Captures snapshots of child states for transformation operations.\r\n */\r\n private captureChildSnapshots(): void {\r\n this.unchangedChildSnapshots.clear();\r\n this.snapshotRotation = this.rotation;\r\n\r\n this.snapshotTranslateX = this.translateX;\r\n this.snapshotTranslateY = this.translateY;\r\n this.snapshotTotalWidth = this.totalWidth;\r\n this.snapshotTotalHeight = this.totalHeight;\r\n this.snapshotScale = this.scale || 1;\r\n\r\n this.children.forEach(child => {\r\n this.unchangedChildSnapshots.set(child.id, {\r\n id: child.id,\r\n translateX: child.translateX,\r\n translateY: child.translateY,\r\n rotation: child.rotation,\r\n width: child.width,\r\n height: child.height,\r\n totalWidth: child.totalWidth,\r\n totalHeight: child.totalHeight,\r\n scale: child.scale,\r\n });\r\n });\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // TRANSFORMATION METHODS\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n override 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.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.children.forEach(child => {\r\n child.move(startX, startY, endX, endY);\r\n\r\n // Update any lines anchored to this child\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedChildSnapshots.forEach(snapshot => {\r\n snapshot.translateX += deltaX;\r\n snapshot.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n // Calculate old center\r\n const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n // Calculate new center\r\n const newTotalWidth = width + this.padding * 2;\r\n const newTotalHeight = height + this.padding * 2;\r\n const newCenterX = x + newTotalWidth / 2 / this.scale;\r\n const newCenterY = y + newTotalHeight / 2 / this.scale;\r\n\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this.children.forEach(child => {\r\n // Calculate child center\r\n const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;\r\n const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;\r\n\r\n // Vector from old group center to child center\r\n const dx = childCenterX - oldCenterX;\r\n const dy = childCenterY - oldCenterY;\r\n\r\n // Rotate to local space\r\n const localX = dx * cos - dy * sin;\r\n const localY = dx * sin + dy * cos;\r\n\r\n // Scale in local space\r\n const scaledLocalX = localX * widthScaleFactor;\r\n const scaledLocalY = localY * heightScaleFactor;\r\n\r\n // Rotate back to world space\r\n const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;\r\n const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;\r\n\r\n // New child center\r\n const newChildCenterX = newCenterX + rotatedX;\r\n const newChildCenterY = newCenterY + rotatedY;\r\n\r\n // Calculate relative rotation for scaling\r\n const relativeRotation = child.rotation - rotation;\r\n const cosRel = Math.cos(relativeRotation);\r\n const sinRel = Math.sin(relativeRotation);\r\n\r\n const newChildWidthScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2)\r\n );\r\n const newChildHeightScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2)\r\n );\r\n\r\n const updatedWidth = child.width * newChildWidthScale;\r\n const updatedHeight = child.height * newChildHeightScale;\r\n const updatedTotalWidth = updatedWidth + child.padding * 2;\r\n const updatedTotalHeight = updatedHeight + child.padding * 2;\r\n\r\n const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;\r\n const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n // Update anchored lines\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n\r\n this.refreshBoundingBox();\r\n this.captureChildSnapshots();\r\n this._core.store.state.objects.update(this);\r\n });\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value - this.snapshotRotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.children.forEach(child => {\r\n const unchangedSnapshot = this.unchangedChildSnapshots.get(child.id);\r\n if (!unchangedSnapshot) return;\r\n\r\n const offsetX = this.getOffsetXToCenterFromSnapshot(unchangedSnapshot);\r\n const offsetY = this.getOffsetYToCenterFromSnapshot(unchangedSnapshot);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.children.length === 1 ? value : unchangedSnapshot.rotation + angle);\r\n });\r\n });\r\n }\r\n\r\n private getOffsetXToCenterFromSnapshot(snapshot: ChildSnapshot): number {\r\n const childCenterX = snapshot.translateX + snapshot.totalWidth / snapshot.scale / 2;\r\n const groupScale = this.snapshotScale || this.scale || 1;\r\n const groupCenterX = this.snapshotTranslateX + this.snapshotTotalWidth / groupScale / 2;\r\n return childCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenterFromSnapshot(snapshot: ChildSnapshot): number {\r\n const childCenterY = snapshot.translateY + snapshot.totalHeight / snapshot.scale / 2;\r\n const groupScale = this.snapshotScale || this.scale || 1;\r\n const groupCenterY = this.snapshotTranslateY + this.snapshotTotalHeight / groupScale / 2;\r\n return childCenterY - groupCenterY;\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // HIT TESTING\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n // Check if point is inside any child\r\n return this.children.some(child => child.hitTest(x, y));\r\n }\r\n\r\n override hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n // Check if polygon intersects with any child\r\n return this.children.some(child => child.hitTestPolygon(polygon));\r\n }\r\n\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n // COPY & SERIALIZATION\r\n // ─────────────────────────────────────────────────────────────────────────────\r\n\r\n override copy(): KritzelGroup {\r\n const copiedGroup = KritzelGroup.create(this._core);\r\n\r\n // Deep copy all children but DON'T add to store yet\r\n // Store the copied children temporarily for paste() to handle\r\n const copiedChildren: KritzelBaseObject<any>[] = [];\r\n\r\n this.children\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .forEach(child => {\r\n const copiedChild = child.copy() as KritzelBaseObject<any>;\r\n copiedChildren.push(copiedChild);\r\n copiedGroup.childIds.push(copiedChild.id);\r\n });\r\n\r\n // Store copied children on the group for paste() to access\r\n (copiedGroup as any)._pendingChildren = copiedChildren;\r\n\r\n // Copy group properties\r\n copiedGroup.rotation = this.rotation;\r\n copiedGroup.translateX = this.translateX;\r\n copiedGroup.translateY = this.translateY;\r\n copiedGroup.width = this.width;\r\n copiedGroup.height = this.height;\r\n\r\n return copiedGroup;\r\n }\r\n\r\n override serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, unchangedChildSnapshots, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n // Convert Map to plain object for serialization\r\n clonedProps.unchangedChildSnapshots = Object.fromEntries(this.unchangedChildSnapshots);\r\n\r\n return clonedProps;\r\n }\r\n\r\n override deserialize<T>(object: any): T {\r\n super.deserialize(object);\r\n\r\n // Restore the Map from serialized object\r\n if (object.unchangedChildSnapshots) {\r\n this.unchangedChildSnapshots = new Map(Object.entries(object.unchangedChildSnapshots));\r\n }\r\n\r\n return this as unknown as T;\r\n }\r\n\r\n override update(): void {\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n /**\r\n * Updates the workspace ID for this group and all its children.\r\n */\r\n updateWorkspaceId(workspaceId: string): void {\r\n this.workspaceId = workspaceId;\r\n this.children.forEach(child => {\r\n child.workspaceId = workspaceId;\r\n // Recursively update nested groups\r\n if (child instanceof KritzelGroup) {\r\n child.updateWorkspaceId(workspaceId);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Snapshot of a child object's state for transformation operations.\r\n */\r\ninterface ChildSnapshot {\r\n id: string;\r\n translateX: number;\r\n translateY: number;\r\n rotation: number;\r\n width: number;\r\n height: number;\r\n totalWidth: number;\r\n totalHeight: number;\r\n scale: number;\r\n}\r\n"]}
@@ -130,7 +130,8 @@ export class KritzelLine extends KritzelBaseObject {
130
130
  this._core.store.state.objects.update(this);
131
131
  }
132
132
  hitTest(x, y) {
133
- const strokeWidth = Math.max(this.strokeWidth, 10);
133
+ const minHitThreshold = 20;
134
+ const strokeWidth = Math.max(this.strokeWidth, minHitThreshold);
134
135
  const halfStroke = strokeWidth / this.scale / 2;
135
136
  if (this._adjustedPoints === null) {
136
137
  this._adjustedPoints = this.computeAdjustedPoints();
@@ -1 +1 @@
1
- {"version":3,"file":"line.class.js","sourceRoot":"","sources":["../../../src/classes/objects/line.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelLineOptions } from '../../interfaces/line-options.interface';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelPoint } from '../../interfaces/point.interface';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { LineAnchor } from '../../interfaces/anchor.interface';\r\nimport { ArrowHeadStyle, LineArrowConfig } from '../../interfaces/arrow-head.interface';\r\n\r\nexport class KritzelLine extends KritzelBaseObject<SVGElement> {\r\n override __class__: string = 'KritzelLine';\r\n\r\n startX: number;\r\n startY: number;\r\n endX: number;\r\n endY: number;\r\n controlX?: number;\r\n controlY?: number;\r\n stroke: string;\r\n strokeWidth: number;\r\n scale: number = 1;\r\n options: KritzelLineOptions | undefined;\r\n\r\n /** Anchor connection for the start point of the line */\r\n startAnchor?: LineAnchor;\r\n /** Anchor connection for the end point of the line */\r\n endAnchor?: LineAnchor;\r\n /** Arrow head configuration for start and end of line */\r\n arrows?: LineArrowConfig;\r\n\r\n isVisible: boolean = true;\r\n isDebugInfoVisible: boolean = true;\r\n isCompleted: boolean = false;\r\n\r\n private _adjustedPoints?: number[][] = null;\r\n\r\n get d(): string {\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n return `M ${this.startX} ${this.startY} Q ${this.controlX} ${this.controlY} ${this.endX} ${this.endY}`;\r\n }\r\n return `M ${this.startX} ${this.startY} L ${this.endX} ${this.endY}`;\r\n }\r\n\r\n get viewBox(): string {\r\n return `${this.x} ${this.y} ${this.width} ${this.height}`;\r\n }\r\n\r\n constructor(config?: KritzelLineOptions) {\r\n super();\r\n this.options = config;\r\n this.startX = config?.startX ?? 0;\r\n this.startY = config?.startY ?? 0;\r\n this.endX = config?.endX ?? 0;\r\n this.endY = config?.endY ?? 0;\r\n this.controlX = config?.controlX;\r\n this.controlY = config?.controlY;\r\n this.translateX = config?.translateX ?? 0;\r\n this.translateY = config?.translateY ?? 0;\r\n this.scale = config?.scale ?? 1;\r\n this.strokeWidth = config?.strokeWidth ?? 4;\r\n this.stroke = config?.stroke ?? '#000000';\r\n this.startAnchor = config?.startAnchor;\r\n this.endAnchor = config?.endAnchor;\r\n this.arrows = config?.arrows;\r\n this.updateDimensions();\r\n }\r\n\r\n static override create(core: KritzelCore, options?: KritzelLineOptions): KritzelLine {\r\n const object = new KritzelLine();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.options = options;\r\n object.startX = options?.startX ?? 0;\r\n object.startY = options?.startY ?? 0;\r\n object.endX = options?.endX ?? 0;\r\n object.endY = options?.endY ?? 0;\r\n object.controlX = options?.controlX;\r\n object.controlY = options?.controlY;\r\n object.translateX = options?.translateX ?? 0;\r\n object.translateY = options?.translateY ?? 0;\r\n object.scale = options?.scale ?? 1;\r\n object.strokeWidth = options?.strokeWidth ?? 4;\r\n object.stroke = options?.stroke ?? '#000000';\r\n object.startAnchor = options?.startAnchor;\r\n object.endAnchor = options?.endAnchor;\r\n object.arrows = options?.arrows;\r\n object.zIndex = core.store.currentZIndex;\r\n object.updateDimensions();\r\n\r\n return object;\r\n }\r\n\r\n override resize(x: number | null, y: number | null, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n const scaleX = width / this.width;\r\n const scaleY = height / this.height;\r\n\r\n // Scale the line endpoints\r\n this.startX = this.startX * scaleX;\r\n this.startY = this.startY * scaleY;\r\n this.endX = this.endX * scaleX;\r\n this.endY = this.endY * scaleY;\r\n\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n this.controlX = this.controlX * scaleX;\r\n this.controlY = this.controlY * scaleY;\r\n }\r\n\r\n // Recalculate dimensions from scaled endpoints\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n this.width = maxX - minX;\r\n this.height = maxY - minY;\r\n this.x = minX;\r\n this.y = minY;\r\n\r\n // Set the new position\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n\r\n // Update anchors after the line is updated\r\n this._core.anchorManager.updateAnchorsForObject(this.id);\r\n\r\n if (this.startAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.startAnchor.objectId);\r\n }\r\n if (this.endAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);\r\n }\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override 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 // If the line is anchored, we need to ensure the anchored endpoints stay at the target\r\n if (this.startAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.startAnchor.objectId);\r\n }\r\n if (this.endAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);\r\n }\r\n\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const strokeWidth = Math.max(this.strokeWidth, 10);\r\n const halfStroke = strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n // For curved lines, use distance to the Bezier curve\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n const distance = this.pointToBezierDistance(x, y);\r\n return distance <= halfStroke;\r\n }\r\n\r\n // For straight lines, use distance to line segment\r\n const p1 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n\r\n const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);\r\n return distance <= halfStroke;\r\n }\r\n\r\n override hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const halfStroke = this.strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n const polyPoints: KritzelPoint[] = [\r\n { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },\r\n { x: polygon.bottomRight.x, y: polygon.bottomRight.y },\r\n { x: polygon.topRight.x, y: polygon.topRight.y },\r\n { x: polygon.topLeft.x, y: polygon.topLeft.y },\r\n ];\r\n\r\n // Check if any endpoint is inside the polygon\r\n for (const [px, py] of this._adjustedPoints) {\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {\r\n return true;\r\n }\r\n }\r\n\r\n // Check if any polygon vertex is on the line/curve\r\n for (const pt of polyPoints) {\r\n if (this.hitTest(pt.x, pt.y)) {\r\n return true;\r\n }\r\n }\r\n\r\n // For curved lines, sample points along the curve and check if any are inside the polygon\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n const p0 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n const controlAdjusted = this.computeAdjustedControlPoint();\r\n\r\n const samples = 20;\r\n for (let i = 1; i < samples; i++) {\r\n const t = i / samples;\r\n const oneMinusT = 1 - t;\r\n\r\n const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];\r\n const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];\r\n\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: bx, y: by }, polyPoints)) {\r\n return true;\r\n }\r\n\r\n // Also check if curve point is within stroke distance of polygon edges\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n const d = this.pointToLineSegmentDistance(bx, by, q1.x, q1.y, q2.x, q2.y);\r\n if (d <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // For straight lines, check if line intersects any polygon edge\r\n const p1 = { x: this._adjustedPoints[0][0], y: this._adjustedPoints[0][1] };\r\n const p2 = { x: this._adjustedPoints[1][0], y: this._adjustedPoints[1][1] };\r\n\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n\r\n if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {\r\n return true;\r\n }\r\n\r\n // Check distance from polygon edges to line segment\r\n const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1.x, p1.y, p2.x, p2.y);\r\n const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1.x, p1.y, p2.x, p2.y);\r\n const d3 = this.pointToLineSegmentDistance(p1.x, p1.y, q1.x, q1.y, q2.x, q2.y);\r\n const d4 = this.pointToLineSegmentDistance(p2.x, p2.y, q1.x, q1.y, q2.x, q2.y);\r\n\r\n const minD = Math.min(d1, d2, d3, d4);\r\n if (minD <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n override updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._adjustedPoints = null;\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n /**\r\n * Updates a specific endpoint of the line (start or end).\r\n * The coordinates are in viewBox-local space (relative to x, y origin).\r\n * This method recalculates the bounding box dimensions.\r\n *\r\n * @param handleType - Which endpoint to update: 'start' or 'end'\r\n * @param newX - New X coordinate in viewBox-local space\r\n * @param newY - New Y coordinate in viewBox-local space\r\n */\r\n updateEndpoint(handleType: 'start' | 'end', newX: number, newY: number): void {\r\n // Update the appropriate endpoint\r\n if (handleType === 'start') {\r\n this.startX = newX;\r\n this.startY = newY;\r\n } else {\r\n this.endX = newX;\r\n this.endY = newY;\r\n }\r\n\r\n const oldWidth = this.width;\r\n const oldHeight = this.height;\r\n\r\n // Recalculate the bounding box (viewBox dimensions)\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n // Calculate the change in origin (in local coordinates)\r\n const deltaX = minX - this.x;\r\n const deltaY = minY - this.y;\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n const deltaWidth = newWidth - oldWidth;\r\n const deltaHeight = newHeight - oldHeight;\r\n\r\n const deltaCx = deltaWidth / 2;\r\n const deltaCy = deltaHeight / 2;\r\n\r\n // Update viewBox dimensions\r\n this.x = minX;\r\n this.y = minY;\r\n this.width = newWidth;\r\n this.height = newHeight;\r\n\r\n // Rotate the delta to world coordinates before applying to translate\r\n const cos = Math.cos(this.rotation);\r\n const sin = Math.sin(this.rotation);\r\n\r\n // We need to compensate for:\r\n // 1. The shift of the top-left corner (deltaX, deltaY)\r\n // 2. The shift of the center point (deltaCx, deltaCy) which affects rotation pivot\r\n // Formula: DeltaT = R(DeltaPos + DeltaCenter) - DeltaCenter\r\n\r\n const vx = deltaX + deltaCx;\r\n const vy = deltaY + deltaCy;\r\n\r\n const rotatedVx = vx * cos - vy * sin;\r\n const rotatedVy = vx * sin + vy * cos;\r\n\r\n const correctionX = rotatedVx - deltaCx;\r\n const correctionY = rotatedVy - deltaCy;\r\n\r\n // Adjust translateX/Y to compensate for the origin shift\r\n // so the line stays visually in the same position\r\n this.translateX += correctionX / this.scale;\r\n this.translateY += correctionY / this.scale;\r\n\r\n // Clear cached adjusted points\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n updateControlPoint(newX: number | undefined, newY: number | undefined): void {\r\n this.controlX = newX;\r\n this.controlY = newY;\r\n\r\n const oldWidth = this.width;\r\n const oldHeight = this.height;\r\n\r\n // Recalculate the bounding box (viewBox dimensions)\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n // Calculate the change in origin (in local coordinates)\r\n const deltaX = minX - this.x;\r\n const deltaY = minY - this.y;\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n const deltaWidth = newWidth - oldWidth;\r\n const deltaHeight = newHeight - oldHeight;\r\n\r\n const deltaCx = deltaWidth / 2;\r\n const deltaCy = deltaHeight / 2;\r\n\r\n // Update viewBox dimensions\r\n this.x = minX;\r\n this.y = minY;\r\n this.width = newWidth;\r\n this.height = newHeight;\r\n\r\n // Rotate the delta to world coordinates before applying to translate\r\n const cos = Math.cos(this.rotation);\r\n const sin = Math.sin(this.rotation);\r\n\r\n // We need to compensate for:\r\n // 1. The shift of the top-left corner (deltaX, deltaY)\r\n // 2. The shift of the center point (deltaCx, deltaCy) which affects rotation pivot\r\n // Formula: DeltaT = R(DeltaPos + DeltaCenter) - DeltaCenter\r\n\r\n const vx = deltaX + deltaCx;\r\n const vy = deltaY + deltaCy;\r\n\r\n const rotatedVx = vx * cos - vy * sin;\r\n const rotatedVy = vx * sin + vy * cos;\r\n\r\n const correctionX = rotatedVx - deltaCx;\r\n const correctionY = rotatedVy - deltaCy;\r\n\r\n // Adjust translateX/Y to compensate for the origin shift\r\n // so the line stays visually in the same position\r\n this.translateX += correctionX / this.scale;\r\n this.translateY += correctionY / this.scale;\r\n\r\n // Clear cached adjusted points\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private computeAdjustedPoints(): number[][] {\r\n const points = [\r\n [this.startX, this.startY],\r\n [this.endX, this.endY],\r\n ];\r\n\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const xs = points.map(p => p[0]);\r\n const ys = 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 = 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]) => [(px - this.x) / this.scale + this.translateX, (py - this.y) / this.scale + this.translateY]);\r\n }\r\n\r\n private pointToLineSegmentDistance(x: number, y: number, x1: number, y1: number, x2: number, y2: number): number {\r\n const A = x - x1;\r\n const B = y - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = x - xx;\r\n const dy = y - yy;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n /**\r\n * Calculates the minimum distance from a point to a quadratic Bezier curve.\r\n * Uses sampling along the curve to find the closest point.\r\n */\r\n private pointToBezierDistance(x: number, y: number): number {\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n const p0 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n\r\n // Calculate the adjusted control point\r\n const controlAdjusted = this.computeAdjustedControlPoint();\r\n\r\n let minDistance = Infinity;\r\n const samples = 20; // Number of samples along the curve\r\n\r\n for (let i = 0; i <= samples; i++) {\r\n const t = i / samples;\r\n const oneMinusT = 1 - t;\r\n\r\n // Quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂\r\n const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];\r\n const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];\r\n\r\n const dx = x - bx;\r\n const dy = y - by;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance < minDistance) {\r\n minDistance = distance;\r\n }\r\n }\r\n\r\n return minDistance;\r\n }\r\n\r\n /**\r\n * Computes the adjusted control point in world coordinates, accounting for rotation and translation.\r\n */\r\n private computeAdjustedControlPoint(): number[] {\r\n if (this.controlX === undefined || this.controlY === undefined) {\r\n // Return midpoint if no control point\r\n return [(this.startX + this.endX) / 2, (this.startY + this.endY) / 2];\r\n }\r\n\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n // Calculate pivot (center of bounding box for endpoints)\r\n const xs = [this.startX, this.endX];\r\n const ys = [this.startY, this.endY];\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 // Rotate control point around pivot\r\n const dx = this.controlX - cx;\r\n const dy = this.controlY - cy;\r\n const rotatedX = cx + dx * cos - dy * sin;\r\n const rotatedY = cy + dx * sin + dy * cos;\r\n\r\n // Transform to world coordinates\r\n return [(rotatedX - this.x) / this.scale + this.translateX, (rotatedY - this.y) / this.scale + this.translateY];\r\n }\r\n\r\n override get rotatedPolygon(): KritzelPolygon {\r\n const padding = this.padding;\r\n\r\n // Use the bounding box which accounts for curve extrema\r\n const { minX, minY, maxX, maxY } = KritzelLine.calculateBoundingBox(\r\n this.startX,\r\n this.startY,\r\n this.endX,\r\n this.endY,\r\n this.controlX,\r\n this.controlY,\r\n this.strokeWidth,\r\n );\r\n\r\n // Convert to local coordinates (relative to this.x, this.y)\r\n const localMinX = minX - this.x + padding;\r\n const localMinY = minY - this.y + padding;\r\n const localMaxX = maxX - this.x + padding;\r\n const localMaxY = maxY - this.y + padding;\r\n\r\n const c1 = { x: localMinX, y: localMinY }; // top-left\r\n const c2 = { x: localMaxX, y: localMinY }; // top-right\r\n const c3 = { x: localMaxX, y: localMaxY }; // bottom-right\r\n const c4 = { x: localMinX, y: localMaxY }; // bottom-left\r\n\r\n const cx = this.totalWidth / 2;\r\n const cy = this.totalHeight / 2;\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const transform = (p: { x: number; y: number }) => {\r\n const rx = (p.x - cx) * cos - (p.y - cy) * sin + cx;\r\n const ry = (p.x - cx) * sin + (p.y - cy) * cos + cy;\r\n return {\r\n x: rx / this.scale + this.translateX,\r\n y: ry / this.scale + this.translateY,\r\n };\r\n };\r\n\r\n return {\r\n topLeft: transform(c1),\r\n topRight: transform(c2),\r\n bottomRight: transform(c3),\r\n bottomLeft: transform(c4),\r\n };\r\n }\r\n\r\n /**\r\n * Calculates the tight bounding box for a quadratic Bezier curve or straight line.\r\n * For curves, it finds the extrema points where the derivative equals zero.\r\n */\r\n static calculateBoundingBox(\r\n startX: number,\r\n startY: number,\r\n endX: number,\r\n endY: number,\r\n controlX: number | undefined,\r\n controlY: number | undefined,\r\n strokeWidth: number,\r\n ): { minX: number; minY: number; maxX: number; maxY: number } {\r\n let minX = Math.min(startX, endX);\r\n let minY = Math.min(startY, endY);\r\n let maxX = Math.max(startX, endX);\r\n let maxY = Math.max(startY, endY);\r\n\r\n if (controlX !== undefined && controlY !== undefined) {\r\n // For a quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂\r\n // Derivative: B'(t) = 2(1-t)(P₁-P₀) + 2t(P₂-P₁) = 0\r\n // Solving for t: t = (P₀ - P₁) / (P₀ - 2P₁ + P₂)\r\n\r\n // Find extrema for X\r\n const aX = startX - 2 * controlX + endX;\r\n if (aX !== 0) {\r\n const tX = (startX - controlX) / aX;\r\n if (tX > 0 && tX < 1) {\r\n const extremaX = (1 - tX) * (1 - tX) * startX + 2 * (1 - tX) * tX * controlX + tX * tX * endX;\r\n minX = Math.min(minX, extremaX);\r\n maxX = Math.max(maxX, extremaX);\r\n }\r\n }\r\n\r\n // Find extrema for Y\r\n const aY = startY - 2 * controlY + endY;\r\n if (aY !== 0) {\r\n const tY = (startY - controlY) / aY;\r\n if (tY > 0 && tY < 1) {\r\n const extremaY = (1 - tY) * (1 - tY) * startY + 2 * (1 - tY) * tY * controlY + tY * tY * endY;\r\n minY = Math.min(minY, extremaY);\r\n maxY = Math.max(maxY, extremaY);\r\n }\r\n }\r\n }\r\n\r\n const halfStroke = strokeWidth / 2;\r\n return {\r\n minX: minX - halfStroke,\r\n minY: minY - halfStroke,\r\n maxX: maxX + halfStroke,\r\n maxY: maxY + halfStroke,\r\n };\r\n }\r\n\r\n calculateBoundingBox(): { minX: number; minY: number; maxX: number; maxY: number } {\r\n return KritzelLine.calculateBoundingBox(\r\n this.startX,\r\n this.startY,\r\n this.endX,\r\n this.endY,\r\n this.controlX,\r\n this.controlY,\r\n this.strokeWidth,\r\n );\r\n }\r\n\r\n private updateDimensions(): void {\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n this.width = maxX - minX;\r\n this.height = maxY - minY;\r\n\r\n this.x = minX;\r\n this.y = minY;\r\n\r\n this.translateX = (this.x + this.translateX) / this.scale;\r\n this.translateY = (this.y + this.translateY) / this.scale;\r\n }\r\n\r\n /** Get unique marker ID for SVG defs at the start of the line */\r\n get startMarkerId(): string {\r\n return `arrow-start-${this.id}`;\r\n }\r\n\r\n /** Get unique marker ID for SVG defs at the end of the line */\r\n get endMarkerId(): string {\r\n return `arrow-end-${this.id}`;\r\n }\r\n\r\n /** Get the arrow size for start or end, defaulting to strokeWidth * 3 */\r\n getArrowSize(end: 'start' | 'end'): number {\r\n const config = end === 'start' ? this.arrows?.start : this.arrows?.end;\r\n return config?.size ?? this.strokeWidth * 3;\r\n }\r\n\r\n /** Get the arrow fill color for start or end, defaulting to stroke color */\r\n getArrowFill(end: 'start' | 'end'): string {\r\n const config = end === 'start' ? this.arrows?.start : this.arrows?.end;\r\n return config?.fill ?? this.stroke;\r\n }\r\n\r\n /**\r\n * Generate SVG path data for an arrow head based on the given style.\r\n * The path is designed to fit in a 10x10 viewBox with the tip at (10, 5).\r\n * @param style The arrow head style\r\n * @returns SVG path data string\r\n */\r\n getArrowPath(style: ArrowHeadStyle = 'triangle'): string {\r\n switch (style) {\r\n case 'triangle':\r\n return 'M 0 0 L 10 5 L 0 10 z';\r\n case 'open':\r\n return 'M 0 0 L 10 5 L 0 10';\r\n case 'diamond':\r\n return 'M 0 5 L 5 0 L 10 5 L 5 10 z';\r\n case 'circle':\r\n return 'M 5,0 A 5,5 0 1,1 5,10 A 5,5 0 1,1 5,0';\r\n default:\r\n return 'M 0 0 L 10 5 L 0 10 z';\r\n }\r\n }\r\n\r\n /** Check if start arrow is enabled */\r\n get hasStartArrow(): boolean {\r\n return this.arrows?.start?.enabled === true;\r\n }\r\n\r\n /** Check if end arrow is enabled */\r\n get hasEndArrow(): boolean {\r\n return this.arrows?.end?.enabled === true;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"line.class.js","sourceRoot":"","sources":["../../../src/classes/objects/line.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelLineOptions } from '../../interfaces/line-options.interface';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nimport { KritzelPolygon } from '../../interfaces/polygon.interface';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelPoint } from '../../interfaces/point.interface';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { LineAnchor } from '../../interfaces/anchor.interface';\r\nimport { ArrowHeadStyle, LineArrowConfig } from '../../interfaces/arrow-head.interface';\r\n\r\nexport class KritzelLine extends KritzelBaseObject<SVGElement> {\r\n override __class__: string = 'KritzelLine';\r\n\r\n startX: number;\r\n startY: number;\r\n endX: number;\r\n endY: number;\r\n controlX?: number;\r\n controlY?: number;\r\n stroke: string;\r\n strokeWidth: number;\r\n scale: number = 1;\r\n options: KritzelLineOptions | undefined;\r\n\r\n /** Anchor connection for the start point of the line */\r\n startAnchor?: LineAnchor;\r\n /** Anchor connection for the end point of the line */\r\n endAnchor?: LineAnchor;\r\n /** Arrow head configuration for start and end of line */\r\n arrows?: LineArrowConfig;\r\n\r\n isVisible: boolean = true;\r\n isDebugInfoVisible: boolean = true;\r\n isCompleted: boolean = false;\r\n\r\n private _adjustedPoints?: number[][] = null;\r\n\r\n get d(): string {\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n return `M ${this.startX} ${this.startY} Q ${this.controlX} ${this.controlY} ${this.endX} ${this.endY}`;\r\n }\r\n return `M ${this.startX} ${this.startY} L ${this.endX} ${this.endY}`;\r\n }\r\n\r\n get viewBox(): string {\r\n return `${this.x} ${this.y} ${this.width} ${this.height}`;\r\n }\r\n\r\n constructor(config?: KritzelLineOptions) {\r\n super();\r\n this.options = config;\r\n this.startX = config?.startX ?? 0;\r\n this.startY = config?.startY ?? 0;\r\n this.endX = config?.endX ?? 0;\r\n this.endY = config?.endY ?? 0;\r\n this.controlX = config?.controlX;\r\n this.controlY = config?.controlY;\r\n this.translateX = config?.translateX ?? 0;\r\n this.translateY = config?.translateY ?? 0;\r\n this.scale = config?.scale ?? 1;\r\n this.strokeWidth = config?.strokeWidth ?? 4;\r\n this.stroke = config?.stroke ?? '#000000';\r\n this.startAnchor = config?.startAnchor;\r\n this.endAnchor = config?.endAnchor;\r\n this.arrows = config?.arrows;\r\n this.updateDimensions();\r\n }\r\n\r\n static override create(core: KritzelCore, options?: KritzelLineOptions): KritzelLine {\r\n const object = new KritzelLine();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.options = options;\r\n object.startX = options?.startX ?? 0;\r\n object.startY = options?.startY ?? 0;\r\n object.endX = options?.endX ?? 0;\r\n object.endY = options?.endY ?? 0;\r\n object.controlX = options?.controlX;\r\n object.controlY = options?.controlY;\r\n object.translateX = options?.translateX ?? 0;\r\n object.translateY = options?.translateY ?? 0;\r\n object.scale = options?.scale ?? 1;\r\n object.strokeWidth = options?.strokeWidth ?? 4;\r\n object.stroke = options?.stroke ?? '#000000';\r\n object.startAnchor = options?.startAnchor;\r\n object.endAnchor = options?.endAnchor;\r\n object.arrows = options?.arrows;\r\n object.zIndex = core.store.currentZIndex;\r\n object.updateDimensions();\r\n\r\n return object;\r\n }\r\n\r\n override resize(x: number | null, y: number | null, width: number, height: number): void {\r\n if (width <= 1 || height <= 1) {\r\n return;\r\n }\r\n\r\n const scaleX = width / this.width;\r\n const scaleY = height / this.height;\r\n\r\n // Scale the line endpoints\r\n this.startX = this.startX * scaleX;\r\n this.startY = this.startY * scaleY;\r\n this.endX = this.endX * scaleX;\r\n this.endY = this.endY * scaleY;\r\n\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n this.controlX = this.controlX * scaleX;\r\n this.controlY = this.controlY * scaleY;\r\n }\r\n\r\n // Recalculate dimensions from scaled endpoints\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n this.width = maxX - minX;\r\n this.height = maxY - minY;\r\n this.x = minX;\r\n this.y = minY;\r\n\r\n // Set the new position\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n\r\n // Update anchors after the line is updated\r\n this._core.anchorManager.updateAnchorsForObject(this.id);\r\n\r\n if (this.startAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.startAnchor.objectId);\r\n }\r\n if (this.endAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);\r\n }\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override 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 // If the line is anchored, we need to ensure the anchored endpoints stay at the target\r\n if (this.startAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.startAnchor.objectId);\r\n }\r\n if (this.endAnchor) {\r\n this._core.anchorManager.updateAnchorsForObject(this.endAnchor.objectId);\r\n }\r\n\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const minHitThreshold = 20;\r\n const strokeWidth = Math.max(this.strokeWidth, minHitThreshold);\r\n const halfStroke = strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n // For curved lines, use distance to the Bezier curve\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n const distance = this.pointToBezierDistance(x, y);\r\n return distance <= halfStroke;\r\n }\r\n\r\n // For straight lines, use distance to line segment\r\n const p1 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n\r\n const distance = this.pointToLineSegmentDistance(x, y, p1[0], p1[1], p2[0], p2[1]);\r\n return distance <= halfStroke;\r\n }\r\n\r\n override hitTestPolygon(polygon: KritzelPolygon): boolean {\r\n const halfStroke = this.strokeWidth / this.scale / 2;\r\n\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n const polyPoints: KritzelPoint[] = [\r\n { x: polygon.bottomLeft.x, y: polygon.bottomLeft.y },\r\n { x: polygon.bottomRight.x, y: polygon.bottomRight.y },\r\n { x: polygon.topRight.x, y: polygon.topRight.y },\r\n { x: polygon.topLeft.x, y: polygon.topLeft.y },\r\n ];\r\n\r\n // Check if any endpoint is inside the polygon\r\n for (const [px, py] of this._adjustedPoints) {\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: px, y: py }, polyPoints)) {\r\n return true;\r\n }\r\n }\r\n\r\n // Check if any polygon vertex is on the line/curve\r\n for (const pt of polyPoints) {\r\n if (this.hitTest(pt.x, pt.y)) {\r\n return true;\r\n }\r\n }\r\n\r\n // For curved lines, sample points along the curve and check if any are inside the polygon\r\n if (this.controlX !== undefined && this.controlY !== undefined) {\r\n const p0 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n const controlAdjusted = this.computeAdjustedControlPoint();\r\n\r\n const samples = 20;\r\n for (let i = 1; i < samples; i++) {\r\n const t = i / samples;\r\n const oneMinusT = 1 - t;\r\n\r\n const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];\r\n const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];\r\n\r\n if (KritzelGeometryHelper.isPointInPolygon({ x: bx, y: by }, polyPoints)) {\r\n return true;\r\n }\r\n\r\n // Also check if curve point is within stroke distance of polygon edges\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n const d = this.pointToLineSegmentDistance(bx, by, q1.x, q1.y, q2.x, q2.y);\r\n if (d <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n // For straight lines, check if line intersects any polygon edge\r\n const p1 = { x: this._adjustedPoints[0][0], y: this._adjustedPoints[0][1] };\r\n const p2 = { x: this._adjustedPoints[1][0], y: this._adjustedPoints[1][1] };\r\n\r\n for (let j = 0; j < polyPoints.length; j++) {\r\n const q1 = polyPoints[j];\r\n const q2 = polyPoints[(j + 1) % polyPoints.length];\r\n\r\n if (KritzelGeometryHelper.intersectLines(p1, p2, q1, q2)) {\r\n return true;\r\n }\r\n\r\n // Check distance from polygon edges to line segment\r\n const d1 = this.pointToLineSegmentDistance(q1.x, q1.y, p1.x, p1.y, p2.x, p2.y);\r\n const d2 = this.pointToLineSegmentDistance(q2.x, q2.y, p1.x, p1.y, p2.x, p2.y);\r\n const d3 = this.pointToLineSegmentDistance(p1.x, p1.y, q1.x, q1.y, q2.x, q2.y);\r\n const d4 = this.pointToLineSegmentDistance(p2.x, p2.y, q1.x, q1.y, q2.x, q2.y);\r\n\r\n const minD = Math.min(d1, d2, d3, d4);\r\n if (minD <= halfStroke) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n override updatePosition(x: number, y: number): void {\r\n this.translateX = x;\r\n this.translateY = y;\r\n this._adjustedPoints = null;\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n /**\r\n * Updates a specific endpoint of the line (start or end).\r\n * The coordinates are in viewBox-local space (relative to x, y origin).\r\n * This method recalculates the bounding box dimensions.\r\n *\r\n * @param handleType - Which endpoint to update: 'start' or 'end'\r\n * @param newX - New X coordinate in viewBox-local space\r\n * @param newY - New Y coordinate in viewBox-local space\r\n */\r\n updateEndpoint(handleType: 'start' | 'end', newX: number, newY: number): void {\r\n // Update the appropriate endpoint\r\n if (handleType === 'start') {\r\n this.startX = newX;\r\n this.startY = newY;\r\n } else {\r\n this.endX = newX;\r\n this.endY = newY;\r\n }\r\n\r\n const oldWidth = this.width;\r\n const oldHeight = this.height;\r\n\r\n // Recalculate the bounding box (viewBox dimensions)\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n // Calculate the change in origin (in local coordinates)\r\n const deltaX = minX - this.x;\r\n const deltaY = minY - this.y;\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n const deltaWidth = newWidth - oldWidth;\r\n const deltaHeight = newHeight - oldHeight;\r\n\r\n const deltaCx = deltaWidth / 2;\r\n const deltaCy = deltaHeight / 2;\r\n\r\n // Update viewBox dimensions\r\n this.x = minX;\r\n this.y = minY;\r\n this.width = newWidth;\r\n this.height = newHeight;\r\n\r\n // Rotate the delta to world coordinates before applying to translate\r\n const cos = Math.cos(this.rotation);\r\n const sin = Math.sin(this.rotation);\r\n\r\n // We need to compensate for:\r\n // 1. The shift of the top-left corner (deltaX, deltaY)\r\n // 2. The shift of the center point (deltaCx, deltaCy) which affects rotation pivot\r\n // Formula: DeltaT = R(DeltaPos + DeltaCenter) - DeltaCenter\r\n\r\n const vx = deltaX + deltaCx;\r\n const vy = deltaY + deltaCy;\r\n\r\n const rotatedVx = vx * cos - vy * sin;\r\n const rotatedVy = vx * sin + vy * cos;\r\n\r\n const correctionX = rotatedVx - deltaCx;\r\n const correctionY = rotatedVy - deltaCy;\r\n\r\n // Adjust translateX/Y to compensate for the origin shift\r\n // so the line stays visually in the same position\r\n this.translateX += correctionX / this.scale;\r\n this.translateY += correctionY / this.scale;\r\n\r\n // Clear cached adjusted points\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n updateControlPoint(newX: number | undefined, newY: number | undefined): void {\r\n this.controlX = newX;\r\n this.controlY = newY;\r\n\r\n const oldWidth = this.width;\r\n const oldHeight = this.height;\r\n\r\n // Recalculate the bounding box (viewBox dimensions)\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n // Calculate the change in origin (in local coordinates)\r\n const deltaX = minX - this.x;\r\n const deltaY = minY - this.y;\r\n\r\n const newWidth = maxX - minX;\r\n const newHeight = maxY - minY;\r\n\r\n const deltaWidth = newWidth - oldWidth;\r\n const deltaHeight = newHeight - oldHeight;\r\n\r\n const deltaCx = deltaWidth / 2;\r\n const deltaCy = deltaHeight / 2;\r\n\r\n // Update viewBox dimensions\r\n this.x = minX;\r\n this.y = minY;\r\n this.width = newWidth;\r\n this.height = newHeight;\r\n\r\n // Rotate the delta to world coordinates before applying to translate\r\n const cos = Math.cos(this.rotation);\r\n const sin = Math.sin(this.rotation);\r\n\r\n // We need to compensate for:\r\n // 1. The shift of the top-left corner (deltaX, deltaY)\r\n // 2. The shift of the center point (deltaCx, deltaCy) which affects rotation pivot\r\n // Formula: DeltaT = R(DeltaPos + DeltaCenter) - DeltaCenter\r\n\r\n const vx = deltaX + deltaCx;\r\n const vy = deltaY + deltaCy;\r\n\r\n const rotatedVx = vx * cos - vy * sin;\r\n const rotatedVy = vx * sin + vy * cos;\r\n\r\n const correctionX = rotatedVx - deltaCx;\r\n const correctionY = rotatedVy - deltaCy;\r\n\r\n // Adjust translateX/Y to compensate for the origin shift\r\n // so the line stays visually in the same position\r\n this.translateX += correctionX / this.scale;\r\n this.translateY += correctionY / this.scale;\r\n\r\n // Clear cached adjusted points\r\n this._adjustedPoints = null;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private computeAdjustedPoints(): number[][] {\r\n const points = [\r\n [this.startX, this.startY],\r\n [this.endX, this.endY],\r\n ];\r\n\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const xs = points.map(p => p[0]);\r\n const ys = 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 = 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]) => [(px - this.x) / this.scale + this.translateX, (py - this.y) / this.scale + this.translateY]);\r\n }\r\n\r\n private pointToLineSegmentDistance(x: number, y: number, x1: number, y1: number, x2: number, y2: number): number {\r\n const A = x - x1;\r\n const B = y - y1;\r\n const C = x2 - x1;\r\n const D = y2 - y1;\r\n\r\n const dot = A * C + B * D;\r\n const len_sq = C * C + D * D;\r\n let param = -1;\r\n if (len_sq !== 0) {\r\n param = dot / len_sq;\r\n }\r\n\r\n let xx, yy;\r\n\r\n if (param < 0) {\r\n xx = x1;\r\n yy = y1;\r\n } else if (param > 1) {\r\n xx = x2;\r\n yy = y2;\r\n } else {\r\n xx = x1 + param * C;\r\n yy = y1 + param * D;\r\n }\r\n\r\n const dx = x - xx;\r\n const dy = y - yy;\r\n return Math.sqrt(dx * dx + dy * dy);\r\n }\r\n\r\n /**\r\n * Calculates the minimum distance from a point to a quadratic Bezier curve.\r\n * Uses sampling along the curve to find the closest point.\r\n */\r\n private pointToBezierDistance(x: number, y: number): number {\r\n if (this._adjustedPoints === null) {\r\n this._adjustedPoints = this.computeAdjustedPoints();\r\n }\r\n\r\n const p0 = this._adjustedPoints[0];\r\n const p2 = this._adjustedPoints[1];\r\n\r\n // Calculate the adjusted control point\r\n const controlAdjusted = this.computeAdjustedControlPoint();\r\n\r\n let minDistance = Infinity;\r\n const samples = 20; // Number of samples along the curve\r\n\r\n for (let i = 0; i <= samples; i++) {\r\n const t = i / samples;\r\n const oneMinusT = 1 - t;\r\n\r\n // Quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂\r\n const bx = oneMinusT * oneMinusT * p0[0] + 2 * oneMinusT * t * controlAdjusted[0] + t * t * p2[0];\r\n const by = oneMinusT * oneMinusT * p0[1] + 2 * oneMinusT * t * controlAdjusted[1] + t * t * p2[1];\r\n\r\n const dx = x - bx;\r\n const dy = y - by;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n if (distance < minDistance) {\r\n minDistance = distance;\r\n }\r\n }\r\n\r\n return minDistance;\r\n }\r\n\r\n /**\r\n * Computes the adjusted control point in world coordinates, accounting for rotation and translation.\r\n */\r\n private computeAdjustedControlPoint(): number[] {\r\n if (this.controlX === undefined || this.controlY === undefined) {\r\n // Return midpoint if no control point\r\n return [(this.startX + this.endX) / 2, (this.startY + this.endY) / 2];\r\n }\r\n\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n // Calculate pivot (center of bounding box for endpoints)\r\n const xs = [this.startX, this.endX];\r\n const ys = [this.startY, this.endY];\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 // Rotate control point around pivot\r\n const dx = this.controlX - cx;\r\n const dy = this.controlY - cy;\r\n const rotatedX = cx + dx * cos - dy * sin;\r\n const rotatedY = cy + dx * sin + dy * cos;\r\n\r\n // Transform to world coordinates\r\n return [(rotatedX - this.x) / this.scale + this.translateX, (rotatedY - this.y) / this.scale + this.translateY];\r\n }\r\n\r\n override get rotatedPolygon(): KritzelPolygon {\r\n const padding = this.padding;\r\n\r\n // Use the bounding box which accounts for curve extrema\r\n const { minX, minY, maxX, maxY } = KritzelLine.calculateBoundingBox(\r\n this.startX,\r\n this.startY,\r\n this.endX,\r\n this.endY,\r\n this.controlX,\r\n this.controlY,\r\n this.strokeWidth,\r\n );\r\n\r\n // Convert to local coordinates (relative to this.x, this.y)\r\n const localMinX = minX - this.x + padding;\r\n const localMinY = minY - this.y + padding;\r\n const localMaxX = maxX - this.x + padding;\r\n const localMaxY = maxY - this.y + padding;\r\n\r\n const c1 = { x: localMinX, y: localMinY }; // top-left\r\n const c2 = { x: localMaxX, y: localMinY }; // top-right\r\n const c3 = { x: localMaxX, y: localMaxY }; // bottom-right\r\n const c4 = { x: localMinX, y: localMaxY }; // bottom-left\r\n\r\n const cx = this.totalWidth / 2;\r\n const cy = this.totalHeight / 2;\r\n const angle = this.rotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n const transform = (p: { x: number; y: number }) => {\r\n const rx = (p.x - cx) * cos - (p.y - cy) * sin + cx;\r\n const ry = (p.x - cx) * sin + (p.y - cy) * cos + cy;\r\n return {\r\n x: rx / this.scale + this.translateX,\r\n y: ry / this.scale + this.translateY,\r\n };\r\n };\r\n\r\n return {\r\n topLeft: transform(c1),\r\n topRight: transform(c2),\r\n bottomRight: transform(c3),\r\n bottomLeft: transform(c4),\r\n };\r\n }\r\n\r\n /**\r\n * Calculates the tight bounding box for a quadratic Bezier curve or straight line.\r\n * For curves, it finds the extrema points where the derivative equals zero.\r\n */\r\n static calculateBoundingBox(\r\n startX: number,\r\n startY: number,\r\n endX: number,\r\n endY: number,\r\n controlX: number | undefined,\r\n controlY: number | undefined,\r\n strokeWidth: number,\r\n ): { minX: number; minY: number; maxX: number; maxY: number } {\r\n let minX = Math.min(startX, endX);\r\n let minY = Math.min(startY, endY);\r\n let maxX = Math.max(startX, endX);\r\n let maxY = Math.max(startY, endY);\r\n\r\n if (controlX !== undefined && controlY !== undefined) {\r\n // For a quadratic Bezier: B(t) = (1-t)²P₀ + 2(1-t)tP₁ + t²P₂\r\n // Derivative: B'(t) = 2(1-t)(P₁-P₀) + 2t(P₂-P₁) = 0\r\n // Solving for t: t = (P₀ - P₁) / (P₀ - 2P₁ + P₂)\r\n\r\n // Find extrema for X\r\n const aX = startX - 2 * controlX + endX;\r\n if (aX !== 0) {\r\n const tX = (startX - controlX) / aX;\r\n if (tX > 0 && tX < 1) {\r\n const extremaX = (1 - tX) * (1 - tX) * startX + 2 * (1 - tX) * tX * controlX + tX * tX * endX;\r\n minX = Math.min(minX, extremaX);\r\n maxX = Math.max(maxX, extremaX);\r\n }\r\n }\r\n\r\n // Find extrema for Y\r\n const aY = startY - 2 * controlY + endY;\r\n if (aY !== 0) {\r\n const tY = (startY - controlY) / aY;\r\n if (tY > 0 && tY < 1) {\r\n const extremaY = (1 - tY) * (1 - tY) * startY + 2 * (1 - tY) * tY * controlY + tY * tY * endY;\r\n minY = Math.min(minY, extremaY);\r\n maxY = Math.max(maxY, extremaY);\r\n }\r\n }\r\n }\r\n\r\n const halfStroke = strokeWidth / 2;\r\n return {\r\n minX: minX - halfStroke,\r\n minY: minY - halfStroke,\r\n maxX: maxX + halfStroke,\r\n maxY: maxY + halfStroke,\r\n };\r\n }\r\n\r\n calculateBoundingBox(): { minX: number; minY: number; maxX: number; maxY: number } {\r\n return KritzelLine.calculateBoundingBox(\r\n this.startX,\r\n this.startY,\r\n this.endX,\r\n this.endY,\r\n this.controlX,\r\n this.controlY,\r\n this.strokeWidth,\r\n );\r\n }\r\n\r\n private updateDimensions(): void {\r\n const { minX, minY, maxX, maxY } = this.calculateBoundingBox();\r\n\r\n this.width = maxX - minX;\r\n this.height = maxY - minY;\r\n\r\n this.x = minX;\r\n this.y = minY;\r\n\r\n this.translateX = (this.x + this.translateX) / this.scale;\r\n this.translateY = (this.y + this.translateY) / this.scale;\r\n }\r\n\r\n /** Get unique marker ID for SVG defs at the start of the line */\r\n get startMarkerId(): string {\r\n return `arrow-start-${this.id}`;\r\n }\r\n\r\n /** Get unique marker ID for SVG defs at the end of the line */\r\n get endMarkerId(): string {\r\n return `arrow-end-${this.id}`;\r\n }\r\n\r\n /** Get the arrow size for start or end, defaulting to strokeWidth * 3 */\r\n getArrowSize(end: 'start' | 'end'): number {\r\n const config = end === 'start' ? this.arrows?.start : this.arrows?.end;\r\n return config?.size ?? this.strokeWidth * 3;\r\n }\r\n\r\n /** Get the arrow fill color for start or end, defaulting to stroke color */\r\n getArrowFill(end: 'start' | 'end'): string {\r\n const config = end === 'start' ? this.arrows?.start : this.arrows?.end;\r\n return config?.fill ?? this.stroke;\r\n }\r\n\r\n /**\r\n * Generate SVG path data for an arrow head based on the given style.\r\n * The path is designed to fit in a 10x10 viewBox with the tip at (10, 5).\r\n * @param style The arrow head style\r\n * @returns SVG path data string\r\n */\r\n getArrowPath(style: ArrowHeadStyle = 'triangle'): string {\r\n switch (style) {\r\n case 'triangle':\r\n return 'M 0 0 L 10 5 L 0 10 z';\r\n case 'open':\r\n return 'M 0 0 L 10 5 L 0 10';\r\n case 'diamond':\r\n return 'M 0 5 L 5 0 L 10 5 L 5 10 z';\r\n case 'circle':\r\n return 'M 5,0 A 5,5 0 1,1 5,10 A 5,5 0 1,1 5,0';\r\n default:\r\n return 'M 0 0 L 10 5 L 0 10 z';\r\n }\r\n }\r\n\r\n /** Check if start arrow is enabled */\r\n get hasStartArrow(): boolean {\r\n return this.arrows?.start?.enabled === true;\r\n }\r\n\r\n /** Check if end arrow is enabled */\r\n get hasEndArrow(): boolean {\r\n return this.arrows?.end?.enabled === true;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,6 @@
1
1
  import { KritzelGeometryHelper } from "../../helpers/geometry.helper";
2
2
  import { KritzelBaseObject } from "./base-object.class";
3
+ import { KritzelGroup } from "./group.class";
3
4
  export class KritzelSelectionGroup extends KritzelBaseObject {
4
5
  __class__ = 'KritzelSelectionGroup';
5
6
  // Store only object IDs instead of full objects
@@ -43,6 +44,21 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
43
44
  this.captureUnchangedSnapshots();
44
45
  this.refreshObjectDimensions();
45
46
  }
47
+ /**
48
+ * Prepares the selection group and its children for a transform interaction (rotate/resize).
49
+ * Ensures snapshot state is aligned with the current visual state.
50
+ */
51
+ beginTransform() {
52
+ // Keep the selection group's bounding box current before snapshotting.
53
+ this.refreshObjectDimensions();
54
+ this.captureUnchangedSnapshots();
55
+ // Groups need their own child snapshots aligned with the current transform.
56
+ this.objects.forEach(obj => {
57
+ if (obj instanceof KritzelGroup) {
58
+ obj.finalize();
59
+ }
60
+ });
61
+ }
46
62
  deselectAllChildren() {
47
63
  this.objects.forEach(obj => (obj.isSelected = false));
48
64
  }
@@ -303,9 +319,9 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
303
319
  return objCenterY - groupCenterY;
304
320
  }
305
321
  hitTest(x, y) {
306
- const containsOnlyLines = this.objects.every(obj => obj.__class__ === 'KritzelLine');
307
- if (containsOnlyLines) {
308
- return this.objects.some(obj => obj.hitTest(x, y));
322
+ const isSingleLine = this.objects.length === 1 && this.objects[0].__class__ === 'KritzelLine';
323
+ if (isSingleLine) {
324
+ return this.objects[0].hitTest(x, y);
309
325
  }
310
326
  const polygon = this.rotatedPolygon;
311
327
  const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
@@ -1 +1 @@
1
- {"version":3,"file":"selection-group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-group.class.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAcxD,MAAM,OAAO,qBAAsB,SAAQ,iBAA8B;IAC9D,SAAS,GAAW,uBAAuB,CAAC;IAErD,gDAAgD;IAChD,SAAS,GAAa,EAAE,CAAC;IAEzB,yEAAyE;IACzE,wBAAwB,GAAyC,IAAI,GAAG,EAAE,CAAC;IAC3E,gBAAgB,GAAW,CAAC,CAAC;IAE7B,IAAI,CAAS;IACb,IAAI,CAAS;IAEb,IAAI,CAAS;IACb,IAAI,CAAS;IAEb,gEAAgE;IAChE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,SAAS;aAClB,GAAG,CAAC,EAAE,CAAC,EAAE;YACR,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1E,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5C,CAAC,CAAC;aACD,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,IAAI,CAA6B,CAAC;IAC7D,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED,MAAM,CAAU,MAAM,CAAC,IAAiB;QACtC,MAAM,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QAE3C,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;QAChC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QACzD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QAEtB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,WAAW,CAAC,MAA8B;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QAC/D,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,iBAAiB,CAAC,WAAmB;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC9B,GAAG,CAAC,MAAM,GAAG,WAAW,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,CAAS,EAAE,CAAS;QACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAChD,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAChD,GAAG,CAAC,cAAc,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YACrD,QAAQ,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;YACjC,QAAQ,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,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;IAC9C,CAAC;IAED;;OAEG;IACK,yBAAyB;QAC/B,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACzB,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE;gBACxC,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,KAAK,EAAE,GAAG,CAAC,KAAK;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEQ,SAAS;QAChB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,wBAAwB,EAAE,GAAG,cAAc,EAAE,GAAG,IAAW,CAAC;QAE1H,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,gDAAgD;QAChD,WAAW,CAAC,wBAAwB,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAEzF,OAAO,WAAW,CAAC;IACrB,CAAC;IAEQ,WAAW,CAAI,MAAW;QACjC,oEAAoE;QACpE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,yCAAyC;QACzC,IAAI,MAAM,CAAC,wBAAwB,EAAE,CAAC;YACpC,IAAI,CAAC,wBAAwB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,IAAoB,CAAC;IAC9B,CAAC;IAEQ,MAAM;QACb,yCAAyC;QACzC,yEAAyE;QACzE,+DAA+D;QAC/D,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEQ,IAAI,CAAC,MAAc,EAAE,MAAc,EAAE,IAAY,EAAE,IAAY;QACtE,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,WAAW,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACzB,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAErC,oDAAoD;gBACpD,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,mBAAmB;QACnB,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;YAC/C,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC;YAC9B,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC;IAEQ,MAAM,CAAC,CAAS,EAAE,CAAS,EAAE,KAAa,EAAE,MAAc;QACjE,MAAM,gBAAgB,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5C,MAAM,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE/C,uBAAuB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACtE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvE,uBAAuB;QACvB,MAAM,aAAa,GAAG,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACtD,MAAM,UAAU,GAAG,CAAC,GAAG,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEhC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC3B,yBAAyB;gBACzB,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC3E,MAAM,YAAY,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAE5E,+CAA+C;gBAC/C,MAAM,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC;gBACrC,MAAM,EAAE,GAAG,YAAY,GAAG,UAAU,CAAC;gBAErC,gDAAgD;gBAChD,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBACnC,MAAM,MAAM,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC;gBAEnC,uBAAuB;gBACvB,MAAM,YAAY,GAAG,MAAM,GAAG,gBAAgB,CAAC;gBAC/C,MAAM,YAAY,GAAG,MAAM,GAAG,iBAAiB,CAAC;gBAEhD,6BAA6B;gBAC7B,MAAM,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;gBAC3D,MAAM,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,YAAY,GAAG,IAAI,CAAC;gBAE3D,mBAAmB;gBACnB,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;gBAC9C,MAAM,eAAe,GAAG,UAAU,GAAG,QAAQ,CAAC;gBAE9C,qBAAqB;gBACrB,8BAA8B;gBAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACnD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAE1C,gEAAgE;gBAChE,4DAA4D;gBAC5D,gEAAgE;gBAChE,sDAAsD;gBACtD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAClC,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,EAAE,CAAC,CAAC,CACjF,CAAC;gBACF,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CACnC,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,EAAE,CAAC,CAAC,CACjF,CAAC;gBAEF,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,GAAG,kBAAkB,CAAC;gBACtD,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,GAAG,mBAAmB,CAAC;gBACzD,MAAM,iBAAiB,GAAG,YAAY,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;gBAC3D,MAAM,kBAAkB,GAAG,aAAa,GAAG,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;gBAE7D,MAAM,QAAQ,GAAG,eAAe,GAAG,iBAAiB,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBACvE,MAAM,QAAQ,GAAG,eAAe,GAAG,kBAAkB,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAExE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;gBAE9D,0DAA0D;gBAC1D,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC5D,CAAC,CAAC,CAAC;YAEH,sFAAsF;YACtF,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEpE,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE5B,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE;YAC9C,uEAAuE;YACvE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAE5C,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC3B,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACtE,IAAI,CAAC,iBAAiB;oBAAE,OAAO;gBAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,CAAC;gBACvE,MAAM,OAAO,GAAG,IAAI,CAAC,8BAA8B,CAAC,iBAAiB,CAAC,CAAC;gBAEvE,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;gBAC/C,MAAM,QAAQ,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC;gBAE/C,KAAK,CAAC,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC3E,KAAK,CAAC,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;gBAE5E,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEQ,IAAI;QACX,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhE,IAAI,CAAC,OAAO;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;aACnC,OAAO,CAAC,GAAG,CAAC,EAAE;YACb,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAA4B,CAAC;YAC1D,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEL,cAAc,CAAC,yBAAyB,EAAE,CAAC;QAE3C,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,cAAc,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrD,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,uBAAuB;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC;YACnE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3C,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC;YAEpE,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAC1D,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAE1D,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACjE,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;YACrB,IAAI,IAAI,GAAG,QAAQ,CAAC;YACpB,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC;YAErB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBACzB,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC;gBACnC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;gBAE7F,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBACvB,+DAA+D;oBAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;oBAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC;oBAE3C,IAAI,EAAE,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAE,CAAC;oBACzB,IAAI,EAAE,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAE,CAAC;oBACzB,IAAI,EAAE,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAE,CAAC;oBACzB,IAAI,EAAE,GAAG,IAAI;wBAAE,IAAI,GAAG,EAAE,CAAC;gBAC3B,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,wCAAwC;YACxC,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;YAC/B,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;YAEhC,IAAI,CAAC,KAAK,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;YAExD,qCAAqC;YACrC,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9B,oCAAoC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEhC,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;YACnC,MAAM,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;YAEnC,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACxE,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAEO,8BAA8B,CAAC,QAAiC;QACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QAClF,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACxE,OAAO,UAAU,GAAG,YAAY,CAAC;IACnC,CAAC;IAEO,8BAA8B,CAAC,QAAiC;QACtE,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACzE,OAAO,UAAU,GAAG,YAAY,CAAC;IACnC,CAAC;IAEQ,OAAO,CAAC,CAAS,EAAE,CAAS;QACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,KAAK,aAAa,CAAC,CAAC;QACrF,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC;QACpC,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAChG,IAAI,qBAAqB,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;CACF","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelBaseObject } from './base-object.class';\r\n\r\ninterface UnchangedObjectSnapshot {\r\n id: string;\r\n translateX: number;\r\n translateY: number;\r\n rotation: number;\r\n width: number;\r\n height: number;\r\n totalWidth: number;\r\n totalHeight: number;\r\n scale: number;\r\n}\r\n\r\nexport class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelSelectionGroup';\r\n\r\n // Store only object IDs instead of full objects\r\n objectIds: string[] = [];\r\n\r\n // Store snapshots of object state for transformations (rotation, resize)\r\n unchangedObjectSnapshots: Map<string, UnchangedObjectSnapshot> = new Map();\r\n snapshotRotation: number = 0;\r\n\r\n minX: number;\r\n maxX: number;\r\n\r\n minY: number;\r\n maxY: number;\r\n\r\n // Getter to retrieve actual objects from the store by their IDs\r\n get objects(): KritzelBaseObject<any>[] {\r\n return this.objectIds\r\n .map(id => {\r\n const found = this._core.store.state.objects.filter(obj => obj.id === id);\r\n return found.length > 0 ? found[0] : null;\r\n })\r\n .filter(obj => obj !== null) as KritzelBaseObject<any>[];\r\n }\r\n\r\n get length(): number {\r\n return this.objectIds.length;\r\n }\r\n\r\n static override create(core: KritzelCore): KritzelSelectionGroup {\r\n const object = new KritzelSelectionGroup();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.scale = core.store.state.scale;\r\n object.zIndex = 99999;\r\n\r\n return object;\r\n }\r\n\r\n addOrRemove(object: KritzelBaseObject<any>) {\r\n const index = this.objectIds.findIndex(id => id === object.id);\r\n if (index === -1) {\r\n this.objectIds.push(object.id);\r\n } else {\r\n this.objectIds.splice(index, 1);\r\n }\r\n\r\n this.captureUnchangedSnapshots();\r\n this.refreshObjectDimensions();\r\n }\r\n\r\n deselectAllChildren() {\r\n this.objects.forEach(obj => (obj.isSelected = false));\r\n }\r\n\r\n updateWorkspaceId(workspaceId: string) {\r\n this.workspaceId = workspaceId;\r\n this.objects.forEach(obj => (obj.workspaceId = workspaceId));\r\n }\r\n\r\n updateZIndices(startZIndex: number) {\r\n this.objects.forEach((obj, i) => {\r\n obj.zIndex = startZIndex + i;\r\n });\r\n }\r\n\r\n updatePosition(x: number, y: number) {\r\n this.objects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.updatePosition(x + deltaX, y + deltaY);\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n const deltaX = snapshot.translateX - this.translateX;\r\n const deltaY = snapshot.translateY - this.translateY;\r\n snapshot.translateX = x + deltaX;\r\n snapshot.translateY = y + deltaY;\r\n });\r\n\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 /**\r\n * Capture snapshots of current object states for undo/redo operations\r\n */\r\n private captureUnchangedSnapshots(): void {\r\n this.unchangedObjectSnapshots.clear();\r\n this.snapshotRotation = this.rotation;\r\n this.objects.forEach(obj => {\r\n this.unchangedObjectSnapshots.set(obj.id, {\r\n id: obj.id,\r\n translateX: obj.translateX,\r\n translateY: obj.translateY,\r\n rotation: obj.rotation,\r\n width: obj.width,\r\n height: obj.height,\r\n totalWidth: obj.totalWidth,\r\n totalHeight: obj.totalHeight,\r\n scale: obj.scale,\r\n });\r\n });\r\n }\r\n\r\n override serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, unchangedObjectSnapshots, ...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 // Convert Map to plain object for serialization\r\n clonedProps.unchangedObjectSnapshots = Object.fromEntries(this.unchangedObjectSnapshots);\r\n\r\n return clonedProps;\r\n }\r\n\r\n override deserialize<T>(object: any): T {\r\n // First, deserialize all base properties using parent's deserialize\r\n super.deserialize(object);\r\n\r\n // Restore the Map from serialized object\r\n if (object.unchangedObjectSnapshots) {\r\n this.unchangedObjectSnapshots = new Map(Object.entries(object.unchangedObjectSnapshots));\r\n }\r\n\r\n return this as unknown as T;\r\n }\r\n\r\n override update(): void {\r\n // Only update the selection group itself\r\n // Child objects are already updated during move/resize/rotate operations\r\n // Updating them again here would create redundant y.js updates\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override 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.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(obj => {\r\n obj.move(startX, startY, endX, endY);\r\n\r\n // Update any lines that are anchored to this object\r\n this._core.anchorManager.updateAnchorsForObject(obj.id);\r\n });\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n snapshot.translateX += deltaX;\r\n snapshot.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n // Calculate old center\r\n const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n // Calculate new center\r\n const newTotalWidth = width + this.padding * 2;\r\n const newTotalHeight = height + this.padding * 2;\r\n const newCenterX = x + newTotalWidth / 2 / this.scale;\r\n const newCenterY = y + newTotalHeight / 2 / this.scale;\r\n\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this.objects.forEach(child => {\r\n // Calculate child center\r\n const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;\r\n const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;\r\n\r\n // Vector from old group center to child center\r\n const dx = childCenterX - oldCenterX;\r\n const dy = childCenterY - oldCenterY;\r\n\r\n // Rotate to local space (align with group axes)\r\n const localX = dx * cos - dy * sin;\r\n const localY = dx * sin + dy * cos;\r\n\r\n // Scale in local space\r\n const scaledLocalX = localX * widthScaleFactor;\r\n const scaledLocalY = localY * heightScaleFactor;\r\n\r\n // Rotate back to world space\r\n const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;\r\n const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;\r\n\r\n // New child center\r\n const newChildCenterX = newCenterX + rotatedX;\r\n const newChildCenterY = newCenterY + rotatedY;\r\n\r\n // New child top-left\r\n // Calculate relative rotation\r\n const relativeRotation = child.rotation - rotation;\r\n const cosRel = Math.cos(relativeRotation);\r\n const sinRel = Math.sin(relativeRotation);\r\n\r\n // Project the group's scale factors onto the child's local axes\r\n // We use absolute values because scaling is magnitude-based\r\n // If the child is aligned (0 deg), cos=1, sin=0 -> scales match\r\n // If the child is 90 deg, cos=0, sin=1 -> scales swap\r\n const newChildWidthScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2)\r\n );\r\n const newChildHeightScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2)\r\n );\r\n\r\n const updatedWidth = child.width * newChildWidthScale;\r\n const updatedHeight = child.height * newChildHeightScale;\r\n const updatedTotalWidth = updatedWidth + child.padding * 2;\r\n const updatedTotalHeight = updatedHeight + child.padding * 2;\r\n\r\n const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;\r\n const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n // Update any lines that are anchored to this child object\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n\r\n // Refresh dimensions and update the SelectionGroup to propagate changes to other tabs\r\n this.refreshObjectDimensions();\r\n this.captureUnchangedSnapshots();\r\n this._core.store.state.objects.update(this);\r\n });\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value - this.snapshotRotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n // Update the SelectionGroup itself to propagate rotation to other tabs\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(child => {\r\n const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);\r\n if (!unchangedSnapshot) return;\r\n\r\n const offsetX = this.getOffsetXToCenterFromSnapshot(unchangedSnapshot);\r\n const offsetY = this.getOffsetYToCenterFromSnapshot(unchangedSnapshot);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.objects.length === 1 ? value : unchangedSnapshot.rotation + angle);\r\n });\r\n });\r\n }\r\n\r\n override copy(): KritzelBaseObject<HTMLElement> {\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n\r\n this.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .forEach(obj => {\r\n const copiedObject = obj.copy() as KritzelBaseObject<any>;\r\n selectionGroup.addOrRemove(copiedObject);\r\n });\r\n\r\n selectionGroup.captureUnchangedSnapshots();\r\n\r\n if (this.objects.length === 1) {\r\n selectionGroup.rotation = this.objects[0].rotation;\r\n }\r\n\r\n return selectionGroup;\r\n }\r\n\r\n refreshObjectDimensions() {\r\n if (this.objects.length === 1) {\r\n const obj = this.objects[0];\r\n this.minX = obj.boundingBox.x / this.scale;\r\n this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;\r\n this.minY = obj.boundingBox.y / this.scale;\r\n this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;\r\n\r\n this.translateX = (this.minX - this.padding) * this.scale;\r\n this.translateY = (this.minY - this.padding) * this.scale;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n } else {\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n this.objects.forEach(obj => {\r\n const polygon = obj.rotatedPolygon;\r\n const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n corners.forEach(corner => {\r\n // Rotate corner into local space (aligned with group rotation)\r\n const rx = corner.x * cos - corner.y * sin;\r\n const ry = corner.x * sin + corner.y * cos;\r\n\r\n if (rx < minX) minX = rx;\r\n if (rx > maxX) maxX = rx;\r\n if (ry < minY) minY = ry;\r\n if (ry > maxY) maxY = ry;\r\n });\r\n });\r\n\r\n // Dimensions in world units (unrotated)\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxY - minY;\r\n\r\n this.width = (worldWidth - this.padding) * this.scale;\r\n this.height = (worldHeight - this.padding) * this.scale;\r\n\r\n // Center of the box in rotated space\r\n const cRx = (minX + maxX) / 2;\r\n const cRy = (minY + maxY) / 2;\r\n\r\n // Rotate center back to world space\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n const cx = cRx * cosR - cRy * sinR;\r\n const cy = cRx * sinR + cRy * cosR;\r\n\r\n this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;\r\n this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;\r\n }\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private getOffsetXToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterX = snapshot.translateX + snapshot.totalWidth / snapshot.scale / 2;\r\n const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;\r\n return objCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterY = snapshot.translateY + snapshot.totalHeight / snapshot.scale / 2;\r\n const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;\r\n return objCenterY - groupCenterY;\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const containsOnlyLines = this.objects.every(obj => obj.__class__ === 'KritzelLine');\r\n if (containsOnlyLines) {\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n\r\n const polygon = this.rotatedPolygon;\r\n const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n if (KritzelGeometryHelper.isPointInPolygon({ x, y }, polyPoints)) {\r\n return true;\r\n }\r\n\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"selection-group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-group.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelBaseObject } from './base-object.class';\r\nimport { KritzelGroup } from './group.class';\r\n\r\ninterface UnchangedObjectSnapshot {\r\n id: string;\r\n translateX: number;\r\n translateY: number;\r\n rotation: number;\r\n width: number;\r\n height: number;\r\n totalWidth: number;\r\n totalHeight: number;\r\n scale: number;\r\n}\r\n\r\nexport class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelSelectionGroup';\r\n\r\n // Store only object IDs instead of full objects\r\n objectIds: string[] = [];\r\n\r\n // Store snapshots of object state for transformations (rotation, resize)\r\n unchangedObjectSnapshots: Map<string, UnchangedObjectSnapshot> = new Map();\r\n snapshotRotation: number = 0;\r\n\r\n minX: number;\r\n maxX: number;\r\n\r\n minY: number;\r\n maxY: number;\r\n\r\n // Getter to retrieve actual objects from the store by their IDs\r\n get objects(): KritzelBaseObject<any>[] {\r\n return this.objectIds\r\n .map(id => {\r\n const found = this._core.store.state.objects.filter(obj => obj.id === id);\r\n return found.length > 0 ? found[0] : null;\r\n })\r\n .filter(obj => obj !== null) as KritzelBaseObject<any>[];\r\n }\r\n\r\n get length(): number {\r\n return this.objectIds.length;\r\n }\r\n\r\n static override create(core: KritzelCore): KritzelSelectionGroup {\r\n const object = new KritzelSelectionGroup();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.scale = core.store.state.scale;\r\n object.zIndex = 99999;\r\n\r\n return object;\r\n }\r\n\r\n addOrRemove(object: KritzelBaseObject<any>) {\r\n const index = this.objectIds.findIndex(id => id === object.id);\r\n if (index === -1) {\r\n this.objectIds.push(object.id);\r\n } else {\r\n this.objectIds.splice(index, 1);\r\n }\r\n\r\n this.captureUnchangedSnapshots();\r\n this.refreshObjectDimensions();\r\n }\r\n\r\n /**\r\n * Prepares the selection group and its children for a transform interaction (rotate/resize).\r\n * Ensures snapshot state is aligned with the current visual state.\r\n */\r\n beginTransform(): void {\r\n // Keep the selection group's bounding box current before snapshotting.\r\n this.refreshObjectDimensions();\r\n this.captureUnchangedSnapshots();\r\n\r\n // Groups need their own child snapshots aligned with the current transform.\r\n this.objects.forEach(obj => {\r\n if (obj instanceof KritzelGroup) {\r\n obj.finalize();\r\n }\r\n });\r\n }\r\n\r\n deselectAllChildren() {\r\n this.objects.forEach(obj => (obj.isSelected = false));\r\n }\r\n\r\n updateWorkspaceId(workspaceId: string) {\r\n this.workspaceId = workspaceId;\r\n this.objects.forEach(obj => (obj.workspaceId = workspaceId));\r\n }\r\n\r\n updateZIndices(startZIndex: number) {\r\n this.objects.forEach((obj, i) => {\r\n obj.zIndex = startZIndex + i;\r\n });\r\n }\r\n\r\n updatePosition(x: number, y: number) {\r\n this.objects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.updatePosition(x + deltaX, y + deltaY);\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n const deltaX = snapshot.translateX - this.translateX;\r\n const deltaY = snapshot.translateY - this.translateY;\r\n snapshot.translateX = x + deltaX;\r\n snapshot.translateY = y + deltaY;\r\n });\r\n\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 /**\r\n * Capture snapshots of current object states for undo/redo operations\r\n */\r\n private captureUnchangedSnapshots(): void {\r\n this.unchangedObjectSnapshots.clear();\r\n this.snapshotRotation = this.rotation;\r\n this.objects.forEach(obj => {\r\n this.unchangedObjectSnapshots.set(obj.id, {\r\n id: obj.id,\r\n translateX: obj.translateX,\r\n translateY: obj.translateY,\r\n rotation: obj.rotation,\r\n width: obj.width,\r\n height: obj.height,\r\n totalWidth: obj.totalWidth,\r\n totalHeight: obj.totalHeight,\r\n scale: obj.scale,\r\n });\r\n });\r\n }\r\n\r\n override serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, unchangedObjectSnapshots, ...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 // Convert Map to plain object for serialization\r\n clonedProps.unchangedObjectSnapshots = Object.fromEntries(this.unchangedObjectSnapshots);\r\n\r\n return clonedProps;\r\n }\r\n\r\n override deserialize<T>(object: any): T {\r\n // First, deserialize all base properties using parent's deserialize\r\n super.deserialize(object);\r\n\r\n // Restore the Map from serialized object\r\n if (object.unchangedObjectSnapshots) {\r\n this.unchangedObjectSnapshots = new Map(Object.entries(object.unchangedObjectSnapshots));\r\n }\r\n\r\n return this as unknown as T;\r\n }\r\n\r\n override update(): void {\r\n // Only update the selection group itself\r\n // Child objects are already updated during move/resize/rotate operations\r\n // Updating them again here would create redundant y.js updates\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override 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.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(obj => {\r\n obj.move(startX, startY, endX, endY);\r\n\r\n // Update any lines that are anchored to this object\r\n this._core.anchorManager.updateAnchorsForObject(obj.id);\r\n });\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n snapshot.translateX += deltaX;\r\n snapshot.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n // Calculate old center\r\n const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n // Calculate new center\r\n const newTotalWidth = width + this.padding * 2;\r\n const newTotalHeight = height + this.padding * 2;\r\n const newCenterX = x + newTotalWidth / 2 / this.scale;\r\n const newCenterY = y + newTotalHeight / 2 / this.scale;\r\n\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this.objects.forEach(child => {\r\n // Calculate child center\r\n const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;\r\n const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;\r\n\r\n // Vector from old group center to child center\r\n const dx = childCenterX - oldCenterX;\r\n const dy = childCenterY - oldCenterY;\r\n\r\n // Rotate to local space (align with group axes)\r\n const localX = dx * cos - dy * sin;\r\n const localY = dx * sin + dy * cos;\r\n\r\n // Scale in local space\r\n const scaledLocalX = localX * widthScaleFactor;\r\n const scaledLocalY = localY * heightScaleFactor;\r\n\r\n // Rotate back to world space\r\n const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;\r\n const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;\r\n\r\n // New child center\r\n const newChildCenterX = newCenterX + rotatedX;\r\n const newChildCenterY = newCenterY + rotatedY;\r\n\r\n // New child top-left\r\n // Calculate relative rotation\r\n const relativeRotation = child.rotation - rotation;\r\n const cosRel = Math.cos(relativeRotation);\r\n const sinRel = Math.sin(relativeRotation);\r\n\r\n // Project the group's scale factors onto the child's local axes\r\n // We use absolute values because scaling is magnitude-based\r\n // If the child is aligned (0 deg), cos=1, sin=0 -> scales match\r\n // If the child is 90 deg, cos=0, sin=1 -> scales swap\r\n const newChildWidthScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2)\r\n );\r\n const newChildHeightScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2)\r\n );\r\n\r\n const updatedWidth = child.width * newChildWidthScale;\r\n const updatedHeight = child.height * newChildHeightScale;\r\n const updatedTotalWidth = updatedWidth + child.padding * 2;\r\n const updatedTotalHeight = updatedHeight + child.padding * 2;\r\n\r\n const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;\r\n const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n // Update any lines that are anchored to this child object\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n\r\n // Refresh dimensions and update the SelectionGroup to propagate changes to other tabs\r\n this.refreshObjectDimensions();\r\n this.captureUnchangedSnapshots();\r\n this._core.store.state.objects.update(this);\r\n });\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value - this.snapshotRotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n // Update the SelectionGroup itself to propagate rotation to other tabs\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(child => {\r\n const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);\r\n if (!unchangedSnapshot) return;\r\n\r\n const offsetX = this.getOffsetXToCenterFromSnapshot(unchangedSnapshot);\r\n const offsetY = this.getOffsetYToCenterFromSnapshot(unchangedSnapshot);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.objects.length === 1 ? value : unchangedSnapshot.rotation + angle);\r\n });\r\n });\r\n }\r\n\r\n override copy(): KritzelBaseObject<HTMLElement> {\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n\r\n this.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .forEach(obj => {\r\n const copiedObject = obj.copy() as KritzelBaseObject<any>;\r\n selectionGroup.addOrRemove(copiedObject);\r\n });\r\n\r\n selectionGroup.captureUnchangedSnapshots();\r\n\r\n if (this.objects.length === 1) {\r\n selectionGroup.rotation = this.objects[0].rotation;\r\n }\r\n\r\n return selectionGroup;\r\n }\r\n\r\n refreshObjectDimensions() {\r\n if (this.objects.length === 1) {\r\n const obj = this.objects[0];\r\n this.minX = obj.boundingBox.x / this.scale;\r\n this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;\r\n this.minY = obj.boundingBox.y / this.scale;\r\n this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;\r\n\r\n this.translateX = (this.minX - this.padding) * this.scale;\r\n this.translateY = (this.minY - this.padding) * this.scale;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n } else {\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n this.objects.forEach(obj => {\r\n const polygon = obj.rotatedPolygon;\r\n const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n corners.forEach(corner => {\r\n // Rotate corner into local space (aligned with group rotation)\r\n const rx = corner.x * cos - corner.y * sin;\r\n const ry = corner.x * sin + corner.y * cos;\r\n\r\n if (rx < minX) minX = rx;\r\n if (rx > maxX) maxX = rx;\r\n if (ry < minY) minY = ry;\r\n if (ry > maxY) maxY = ry;\r\n });\r\n });\r\n\r\n // Dimensions in world units (unrotated)\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxY - minY;\r\n\r\n this.width = (worldWidth - this.padding) * this.scale;\r\n this.height = (worldHeight - this.padding) * this.scale;\r\n\r\n // Center of the box in rotated space\r\n const cRx = (minX + maxX) / 2;\r\n const cRy = (minY + maxY) / 2;\r\n\r\n // Rotate center back to world space\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n const cx = cRx * cosR - cRy * sinR;\r\n const cy = cRx * sinR + cRy * cosR;\r\n\r\n this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;\r\n this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;\r\n }\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private getOffsetXToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterX = snapshot.translateX + snapshot.totalWidth / snapshot.scale / 2;\r\n const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;\r\n return objCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterY = snapshot.translateY + snapshot.totalHeight / snapshot.scale / 2;\r\n const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;\r\n return objCenterY - groupCenterY;\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const isSingleLine = this.objects.length === 1 && this.objects[0].__class__ === 'KritzelLine';\r\n if (isSingleLine) {\r\n return this.objects[0].hitTest(x, y);\r\n }\r\n\r\n const polygon = this.rotatedPolygon;\r\n const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n if (KritzelGeometryHelper.isPointInPolygon({ x, y }, polyPoints)) {\r\n return true;\r\n }\r\n\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n}\r\n"]}
@@ -48,6 +48,8 @@ KritzelIconRegistry.registerIcons({
48
48
  'ellipsis-vertical': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-ellipsis-vertical-icon lucide-ellipsis-vertical"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>',
49
49
  'x': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-x-icon lucide-x"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>',
50
50
  'check': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-check-icon lucide-check"><path d="M20 6 9 17l-5-5"/></svg>',
51
+ 'group': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-group-icon lucide-group"><path d="M3 7V5c0-1.1.9-2 2-2h2"/><path d="M17 3h2c1.1 0 2 .9 2 2v2"/><path d="M21 17v2c0 1.1-.9 2-2 2h-2"/><path d="M7 21H5c-1.1 0-2-.9-2-2v-2"/><rect width="7" height="5" x="7" y="7" rx="1"/><rect width="7" height="5" x="10" y="12" rx="1"/></svg>',
52
+ 'ungroup': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-ungroup-icon lucide-ungroup"><rect width="8" height="6" x="5" y="4" rx="1"/><rect width="8" height="6" x="11" y="14" rx="1"/></svg>',
51
53
  'move-vertical': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-move-vertical-icon lucide-move-vertical" version="1.1" id="svg3"> <defs id="defs3" /> <path d="M12 2v20" id="path1" /> <path style="fill:#ffffff;stroke-width:2.5;stroke-dasharray:none;stroke-linejoin:round;paint-order:stroke fill markers" d="m 11.735575,22.661865 c -0.09259,-0.02798 -0.204674,-0.07661 -0.249076,-0.108068 -0.04441,-0.03147 -1.167275,-0.979853 -2.4952713,-2.10755 -1.8557024,-1.57581 -2.4300904,-2.079639 -2.4817336,-2.17687 -0.086514,-0.162885 -0.089504,-0.422449 -0.00664,-0.576334 0.1483053,-0.275409 0.437667,-0.436207 0.7830634,-0.435147 0.3692925,0.0011 0.3517326,-0.01122 2.168748,1.525599 L 11.12348,20.194964 V 11.999996 3.8050256 L 9.4546663,5.2164943 C 7.6376509,6.7533118 7.6552109,6.7409594 7.2859184,6.7420935 6.6681409,6.7439906 6.253658,6.1955854 6.5159903,5.723396 6.5738626,5.6192278 7.1368766,5.1267427 9.0629381,3.4955044 11.738128,1.2298067 11.640395,1.3026868 12.00355,1.3026868 c 0.363154,0 0.265421,-0.07288 2.940611,2.1928176 1.926062,1.6312383 2.489076,2.1237234 2.546948,2.2278916 0.262332,0.4721894 -0.15215,1.0205946 -0.769928,1.0186975 -0.369293,-0.00114 -0.351733,0.011218 -2.168748,-1.5255992 L 12.88362,3.8050256 v 8.1949704 8.194968 l 1.668813,-1.411469 c 1.817015,-1.536817 1.799455,-1.524464 2.168748,-1.525599 0.617772,-0.0019 1.032269,0.546521 0.769928,1.018687 -0.103474,0.18623 -4.919006,4.273935 -5.130582,4.355136 -0.20796,0.07981 -0.425829,0.09033 -0.624952,0.03014 z" id="path4" /> </svg>',
52
54
  'hand': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-icon lucide-hand" version="1.1" id="svg4"> <defs id="defs4" /> <path d="M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2" id="path1" /> <path d="M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2" id="path2" /> <path d="M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8" id="path3" /> <path d="M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15" id="path4" /> <path style="fill:#ffffff;stroke-width:0.0423032" d="M 11.478261,21.222477 C 9.6854059,21.139331 8.3341788,20.647346 7.1297169,19.639159 6.9698298,19.505327 5.949644,18.508708 4.8626374,17.42445 3.0780314,15.644357 2.8775851,15.435367 2.7968392,15.270602 2.5896561,14.847836 2.616354,14.436649 2.8771894,14.033085 c 0.136522,-0.211226 0.3837159,-0.398688 0.6367632,-0.482897 0.1529977,-0.05091 0.2326803,-0.05992 0.4470908,-0.05054 0.2250407,0.0098 0.2876577,0.02439 0.4554568,0.105827 0.1747854,0.08483 0.2933718,0.192702 1.1675186,1.062064 0.7182021,0.714271 1.0062041,0.982633 1.0998825,1.024878 0.1680197,0.07577 0.4756439,0.07817 0.6368269,0.005 0.1370772,-0.06226 0.2976691,-0.220818 0.3691296,-0.364463 0.072561,-0.145855 0.071573,-0.543545 -0.00169,-0.681911 -0.028747,-0.05429 -0.2476439,-0.296131 -0.4864385,-0.537426 l -0.4341716,-0.438718 0.00753,-3.989014 0.00753,-3.9890137 0.089246,-0.1883791 c 0.244787,-0.516692 0.7711718,-0.809716 1.3059705,-0.7269981 0.3973687,0.061462 0.7569953,0.3284904 0.9363122,0.6952277 l 0.093853,0.1919473 0.014101,2.4958872 0.014101,2.4958877 0.067385,0.149123 c 0.1186861,0.262654 0.4140438,0.457222 0.6940724,0.457222 0.2764172,0 0.5690532,-0.187563 0.6965992,-0.446482 l 0.06486,-0.131661 0.0141,-3.4970626 0.0141,-3.4970623 0.08982,-0.1896121 C 11.096301,3.0422103 11.506844,2.7755634 12,2.7755634 c 0.493156,0 0.903699,0.2666469 1.122868,0.7293016 l 0.08982,0.1896121 0.0141,3.2432432 c 0.01405,3.2315947 0.01432,3.2437077 0.07397,3.3726737 0.124721,0.269649 0.355908,0.424566 0.661411,0.443206 0.237954,0.01452 0.429018,-0.0627 0.591626,-0.239109 0.223655,-0.242637 0.208338,-0.06565 0.224113,-2.5896966 l 0.0141,-2.2561693 0.09385,-0.1919473 c 0.179317,-0.3667373 0.538944,-0.6337662 0.936313,-0.6952277 0.609359,-0.09425 1.208067,0.3054956 1.370981,0.9153772 0.03013,0.1127929 0.03773,0.6662436 0.038,2.7657391 3.74e-4,2.9328416 -0.008,2.8034316 0.197044,3.0364016 0.234927,0.266892 0.603828,0.337117 0.920407,0.175213 0.181933,-0.09304 0.329759,-0.261686 0.376309,-0.4293 0.01848,-0.06654 0.02929,-0.683932 0.0295,-1.684364 1.78e-4,-0.8783075 0.01239,-1.6530128 0.02751,-1.745346 0.08579,-0.5238478 0.505382,-0.9420803 1.039546,-1.0361716 0.607538,-0.1070155 1.25615,0.3485846 1.385876,0.973471 0.02211,0.1064847 0.02843,1.1397236 0.02169,3.5455556 -0.0093,3.324725 -0.01078,3.403075 -0.07062,3.770606 -0.126399,0.776213 -0.328814,1.41352 -0.669031,2.106456 -0.36657,0.746612 -0.72118,1.250303 -1.297841,1.843464 -1.185731,1.21966 -2.604527,1.933174 -4.300822,2.162889 -0.38234,0.05178 -2.604621,0.0785 -3.412456,0.04104 z" id="path16" /> </svg>',
53
55
  'hand-grab': '<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-hand-grab-icon lucide-hand-grab" version="1.1" id="svg5"> <defs id="defs5" /> <path d="M18 11.5V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v1.4" id="path1" /> <path d="M14 10V8a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2" id="path2" /> <path d="M10 9.9V9a2 2 0 0 0-2-2a2 2 0 0 0-2 2v5" id="path3" /> <path d="M6 14a2 2 0 0 0-2-2a2 2 0 0 0-2 2" id="path4" /> <path d="M18 11a2 2 0 1 1 4 0v3a8 8 0 0 1-8 8h-4a8 8 0 0 1-8-8 2 2 0 1 1 4 0" id="path5" /> <path style="fill:#ffffff;stroke-width:0.0423032" d="M 9.5887192,21.221364 C 8.0526856,21.128375 6.6533474,20.587008 5.4571093,19.622953 5.3019976,19.497947 5.0101058,19.225967 4.8084606,19.018552 4.2300382,18.423579 3.8474097,17.879011 3.4960953,17.150756 3.1017715,16.333345 2.9014937,15.633198 2.8052391,14.735605 c -0.097577,-0.909922 -0.019834,-1.263323 0.3569794,-1.622742 0.753018,-0.718257 1.9463784,-0.256949 2.0619296,0.797066 0.037839,0.345154 0.089701,0.477674 0.2472582,0.631806 0.2464521,0.241095 0.5958008,0.287445 0.9036474,0.119894 0.1478567,-0.08047 0.2303871,-0.16866 0.3266699,-0.349056 0.050118,-0.0939 0.05337,-0.2326 0.066784,-2.848413 L 6.7826087,8.7144536 6.8458627,8.559342 C 6.9736603,8.2459558 7.2463773,7.9734987 7.5581669,7.8477164 c 0.1253804,-0.050581 0.2118709,-0.062705 0.4512338,-0.063254 0.275392,-6.312e-4 0.3094658,0.00564 0.4867271,0.089609 0.264676,0.1253746 0.4771417,0.334346 0.6070085,0.5970252 l 0.1048543,0.212087 0.017338,0.7488899 c 0.019395,0.8377165 0.026343,0.8713745 0.2242006,1.0860245 0.1591067,0.172611 0.3522021,0.249908 0.5883018,0.235502 0.305503,-0.01864 0.53669,-0.173557 0.661411,-0.443206 0.05734,-0.123963 0.0605,-0.181852 0.07486,-1.3703236 0.01626,-1.3456629 0.0141,-1.3267758 0.182667,-1.5938092 0.257891,-0.4085268 0.77099,-0.6442307 1.228943,-0.5645435 0.471012,0.08196 0.850379,0.4102836 0.989676,0.8565175 0.04663,0.149383 0.0514,0.2860903 0.0514,1.4721724 0,0.8344844 0.01108,1.3591794 0.03064,1.4503554 0.04109,0.191585 0.179844,0.390224 0.342505,0.490321 0.27721,0.170587 0.693425,0.126085 0.92529,-0.09893 0.228986,-0.222224 0.234357,-0.25046 0.251582,-1.3227071 l 0.0152,-0.9463484 0.104855,-0.2120434 c 0.129872,-0.2626357 0.342372,-0.471626 0.607008,-0.5969817 0.177262,-0.083967 0.211335,-0.09024 0.486727,-0.089609 0.239363,5.486e-4 0.325854,0.012673 0.451234,0.063254 0.31179,0.1257823 0.584507,0.3982394 0.712304,0.7116256 0.0621,0.1522783 0.06351,0.1824139 0.07736,1.649824 0.01408,1.492435 0.0142,1.494914 0.07947,1.627432 0.0771,0.156535 0.2216,0.291061 0.395058,0.367789 0.09695,0.04289 0.169789,0.05275 0.325757,0.04411 0.230544,-0.01277 0.363779,-0.06826 0.506411,-0.21089 0.177062,-0.177061 0.198302,-0.25307 0.219359,-0.784959 0.02002,-0.505773 0.05012,-0.6549 0.175297,-0.868492 0.498409,-0.850471 1.728484,-0.8041941 2.173478,0.08177 0.131751,0.262312 0.134447,0.313526 0.122615,2.328965 -0.0104,1.771638 -0.01517,1.923481 -0.0714,2.273746 -0.123689,0.770512 -0.327108,1.411813 -0.668163,2.106456 -0.36657,0.746612 -0.72118,1.250303 -1.297841,1.843464 -1.180268,1.214041 -2.600612,1.930754 -4.287083,2.163284 -0.28697,0.03957 -0.685446,0.04782 -2.636536,0.05459 -1.26416,0.0044 -2.4698005,-0.0024 -2.6792012,-0.01507 z" id="path6" /> </svg>',