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
@@ -1 +1 @@
1
- {"version":3,"file":"core.class.js","sourceRoot":"","sources":["../../../src/classes/core/core.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEngine } from '../../components/core/kritzel-engine/kritzel-engine';\r\nimport { KritzelContextMenu } from '../../components/ui/kritzel-context-menu/kritzel-context-menu';\r\nimport { DEFAULT_ENGINE_CONFIG } from '../../configs/default-engine-config';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelStore } from './store.class';\r\nimport { KritzelWorkspace } from './workspace.class';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { KritzelAppStateMap } from '../structures/app-state-map.structure';\r\nimport { KritzelAnchorManager } from '../managers/anchor.manager';\r\nimport { KritzelCursorManager } from '../managers/cursor.manager';\r\n\r\nexport class KritzelCore {\r\n private readonly _kritzelEngine: KritzelEngine;\r\n private readonly _store: KritzelStore;\r\n private _syncConfig?: KritzelSyncConfig;\r\n private readonly _appStateMap: KritzelAppStateMap;\r\n private readonly _anchorManager: KritzelAnchorManager;\r\n private readonly _cursorManager: KritzelCursorManager;\r\n\r\n get engine(): KritzelEngine {\r\n return this._kritzelEngine;\r\n }\r\n\r\n get store(): KritzelStore {\r\n return this._store;\r\n }\r\n\r\n get appStateMap(): KritzelAppStateMap {\r\n return this._appStateMap;\r\n }\r\n\r\n get anchorManager(): KritzelAnchorManager {\r\n return this._anchorManager;\r\n }\r\n\r\n get cursorManager(): KritzelCursorManager {\r\n return this._cursorManager;\r\n }\r\n\r\n constructor(kritzelEngine: KritzelEngine) {\r\n this._kritzelEngine = kritzelEngine;\r\n this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);\r\n this._appStateMap = new KritzelAppStateMap();\r\n this._anchorManager = new KritzelAnchorManager(this);\r\n this._cursorManager = new KritzelCursorManager(this);\r\n }\r\n\r\n setSyncConfig(config?: KritzelSyncConfig): void {\r\n this._syncConfig = config;\r\n }\r\n\r\n async initializeYjs(): Promise<void> {\r\n await this._appStateMap.initialize(this, this._syncConfig);\r\n }\r\n\r\n /**\r\n * Load all workspaces from app state map\r\n */\r\n private loadWorkspacesFromAppState(): KritzelWorkspace[] {\r\n return this._appStateMap.allWorkspaces();\r\n }\r\n\r\n /**\r\n * Save a workspace to app state map\r\n */\r\n private saveWorkspaceToAppState(workspace: KritzelWorkspace): void {\r\n if (this._appStateMap.has(workspace.id)) {\r\n this._appStateMap.update(workspace);\r\n } else {\r\n this._appStateMap.insert(workspace);\r\n }\r\n }\r\n\r\n /**\r\n * Delete a workspace from app state map\r\n */\r\n private deleteWorkspaceFromAppState(workspaceId: string): void {\r\n this._appStateMap.remove(w => w.id === workspaceId);\r\n }\r\n\r\n async initializeWorkspace(workspace?: KritzelWorkspace): Promise<void> {\r\n // Load all workspaces from app state map\r\n const workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Find most recently updated workspace or use provided/fallback\r\n const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;\r\n\r\n // Check localStorage for last active workspace\r\n const lastActiveWorkspaceId = localStorage.getItem('kritzel-active-workspace-id');\r\n const lastActiveWorkspace = lastActiveWorkspaceId ? workspaces.find(w => w.id === lastActiveWorkspaceId) : null;\r\n\r\n let activeWorkspace: KritzelWorkspace;\r\n\r\n if (workspace) {\r\n // Use provided workspace\r\n activeWorkspace = workspace;\r\n const existing = workspaces.find(w => w.id === workspace.id);\r\n if (!existing) {\r\n // New workspace, save it\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n } else if (lastActiveWorkspace) {\r\n // Use last active workspace from localStorage\r\n activeWorkspace = lastActiveWorkspace;\r\n } else if (mostRecentWorkspace) {\r\n // Use most recent workspace\r\n activeWorkspace = mostRecentWorkspace;\r\n } else {\r\n // Create fallback workspace\r\n activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n // Save active workspace ID to localStorage\r\n localStorage.setItem('kritzel-active-workspace-id', activeWorkspace.id);\r\n\r\n // Destroy old ObjectMap if switching workspaces\r\n if (this._store.state.objects && this._store.state.objects.isReady) {\r\n this._store.state.objects.destroy();\r\n }\r\n\r\n // Create new ObjectMap with its own Y.Doc for this workspace\r\n const objectsMap = new KritzelObjectMap();\r\n // Assign immediately so the UI shows an empty state while loading,\r\n // instead of showing the old workspace's objects with the new workspace's viewport\r\n this._store.state.objects = objectsMap;\r\n\r\n // Set active workspace\r\n this._store.state.activeWorkspace = activeWorkspace;\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Set viewport from workspace\r\n const viewport = activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };\r\n this._store.state.translateX = viewport.translateX ?? 0;\r\n this._store.state.translateY = viewport.translateY ?? 0;\r\n this._store.state.scale = viewport.scale ?? 1;\r\n\r\n await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);\r\n\r\n // Rebuild anchor index after loading objects\r\n this._anchorManager.rebuildIndex();\r\n\r\n this.engine.emitObjectsChange();\r\n\r\n this.rerender();\r\n }\r\n\r\n rerender() {\r\n if (this._kritzelEngine) {\r\n this._kritzelEngine.forceUpdate++;\r\n }\r\n }\r\n\r\n findObjectById(id: string): KritzelBaseObject<any> | null {\r\n for (const object of this._store.allObjects) {\r\n if (object.id === id) {\r\n return object;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getWorkspaces(): KritzelWorkspace[] {\r\n return this.loadWorkspacesFromAppState();\r\n }\r\n\r\n createWorkspace(workspace: KritzelWorkspace): void {\r\n workspace._core = this;\r\n workspace.createdAt = new Date();\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n }\r\n\r\n updateWorkspace(workspace: KritzelWorkspace): void {\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n\r\n const workspaces = this._store.state.workspaces;\r\n const index = workspaces.findIndex(w => w.id === workspace.id);\r\n\r\n if (index !== -1) {\r\n workspaces[index] = workspace;\r\n this._store.state.workspaces = workspaces;\r\n }\r\n }\r\n\r\n deleteWorkspace(workspace: KritzelWorkspace): void {\r\n // If deleting the active workspace, need to handle ObjectMap cleanup\r\n if (this._store.state.activeWorkspace?.id === workspace.id) {\r\n this._store.state.objects?.destroy();\r\n }\r\n\r\n this.deleteWorkspaceFromAppState(workspace.id);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Also delete the workspace's IndexedDB database\r\n const dbName = `kritzel-workspace-${workspace.id}`;\r\n window.indexedDB.deleteDatabase(dbName);\r\n }\r\n\r\n updateWorkspaceViewport(translateX: number, translateY: number, scale: number): void {\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n if (!activeWorkspace) {\r\n return;\r\n }\r\n\r\n activeWorkspace.viewport = { translateX, translateY, scale };\r\n activeWorkspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n addObject(object: KritzelBaseObject<any>): void {\r\n this._store.state.objects.insert(object);\r\n }\r\n\r\n removeObject(object: KritzelBaseObject<any>): void {\r\n // Handle anchor cleanup\r\n if (object instanceof KritzelLine) {\r\n // If removing a line, clean up its anchor index entries\r\n this._anchorManager.handleLineDeleted(object.id);\r\n } else {\r\n // If removing a non-line object, detach any lines anchored to it\r\n this._anchorManager.handleObjectDeleted(object.id);\r\n }\r\n\r\n object.isMounted = false;\r\n this._store.state.objects.remove(o => o.id === object.id);\r\n }\r\n\r\n updateObject<T extends KritzelBaseObject<any>>(object: T, updatedProperties: Partial<T>): void {\r\n for (const key in updatedProperties) {\r\n if (updatedProperties.hasOwnProperty(key)) {\r\n object[key] = updatedProperties[key];\r\n }\r\n }\r\n\r\n this._store.state.objects.update(object);\r\n }\r\n\r\n addSelectionGroup(selectionGroup: KritzelSelectionGroup): void {\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n this._store.state.objects.insert(selectionGroup);\r\n }\r\n\r\n removeSelectionGroup(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n this._store.state.objects.remove(object => object.id === selectionGroup.id);\r\n }\r\n }\r\n\r\n removeSelectionBox(): void {\r\n const selectionBox = this._store.selectionBox;\r\n if (selectionBox) {\r\n this._store.state.objects.remove(object => object.id === selectionBox.id);\r\n }\r\n }\r\n\r\n deselectAllObjects(): void {\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n delete() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n selectionGroup.objects.forEach(obj => this.removeObject(obj));\r\n\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n undo(): void {\r\n this._store.state.objects?.undo();\r\n }\r\n\r\n redo(): void {\r\n this._store.state.objects?.redo();\r\n }\r\n\r\n deleteObject(id: string) {\r\n const object = this.findObjectById(id);\r\n if (object) {\r\n this.removeObject(object);\r\n this.rerender();\r\n }\r\n }\r\n\r\n copy() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n // Copy each object and store them in an array, also track the ID mapping\r\n const idMapping = new Map<string, string>();\r\n const copiedObjects = selectionGroup.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .map(obj => {\r\n const copiedObj = obj.copy() as KritzelBaseObject<any>;\r\n // Map: newId -> originalId\r\n idMapping.set(copiedObj.id, obj.id);\r\n return copiedObj;\r\n });\r\n\r\n this._store.state.copiedObjects = copiedObjects;\r\n this._store.state.copiedObjectIdMapping = idMapping;\r\n }\r\n }\r\n\r\n paste(x?: number, y?: number) {\r\n const copiedObjects = this._store.state.copiedObjects;\r\n if (!copiedObjects || copiedObjects.length === 0) {\r\n return;\r\n }\r\n\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n const originalIdMapping = this._store.state.copiedObjectIdMapping;\r\n\r\n // Check if we're pasting from a different workspace\r\n const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);\r\n\r\n // Calculate the bounding box of all copied objects\r\n const minX = Math.min(...copiedObjects.map(obj => obj.translateX));\r\n const minY = Math.min(...copiedObjects.map(obj => obj.translateY));\r\n\r\n // Determine the paste position\r\n let pasteX: number;\r\n let pasteY: number;\r\n\r\n if (x !== undefined && y !== undefined) {\r\n // Explicit position provided (e.g., right-click paste)\r\n pasteX = x;\r\n pasteY = y;\r\n } else if (isDifferentWorkspace) {\r\n // Pasting to different workspace without explicit position\r\n // Keep original position; will be centered by centerInViewport() later\r\n pasteX = minX;\r\n pasteY = minY;\r\n } else {\r\n // Same workspace paste: offset by 25 pixels from original position\r\n pasteX = minX + 25 / this._store.state.scale;\r\n pasteY = minY + 25 / this._store.state.scale;\r\n }\r\n\r\n // Calculate the offset to apply to all objects\r\n const offsetX = pasteX - minX;\r\n const offsetY = pasteY - minY;\r\n\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n\r\n // Create a new selection group for the pasted objects\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n // Build a reverse mapping: originalId -> newCopiedObjectId\r\n // This is used to remap anchor references from original IDs to the copied object IDs\r\n const originalToNewIdMap = new Map<string, string>();\r\n if (originalIdMapping) {\r\n originalIdMapping.forEach((originalId, copiedId) => {\r\n originalToNewIdMap.set(originalId, copiedId);\r\n });\r\n }\r\n\r\n // First add all copied objects to the objectsMap with updated positions\r\n copiedObjects.forEach((obj, i) => {\r\n // Update workspace if pasting to a different workspace\r\n if (obj.workspaceId !== activeWorkspace.id) {\r\n obj.workspaceId = activeWorkspace.id;\r\n }\r\n\r\n // Update position\r\n obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);\r\n\r\n // Update z-index\r\n obj.zIndex = this._store.currentZIndex + i;\r\n\r\n // Add to objectsMap\r\n this.addObject(obj);\r\n\r\n // Add to selection group\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n // Update line anchors to point to the newly pasted objects\r\n // Only remap if the anchor target was also part of the copied selection\r\n copiedObjects.forEach(obj => {\r\n if (obj instanceof KritzelLine) {\r\n let updated = false;\r\n\r\n if (obj.startAnchor && originalToNewIdMap.has(obj.startAnchor.objectId)) {\r\n obj.startAnchor = { objectId: originalToNewIdMap.get(obj.startAnchor.objectId)! };\r\n updated = true;\r\n }\r\n\r\n if (obj.endAnchor && originalToNewIdMap.has(obj.endAnchor.objectId)) {\r\n obj.endAnchor = { objectId: originalToNewIdMap.get(obj.endAnchor.objectId)! };\r\n updated = true;\r\n }\r\n\r\n // If anchors were updated, rebuild the anchor index and persist the change\r\n if (updated) {\r\n this._store.state.objects.update(obj);\r\n }\r\n }\r\n });\r\n\r\n // Rebuild anchor index after all anchor updates\r\n this._anchorManager.rebuildIndex();\r\n\r\n // Mark selection group as selected\r\n selectionGroup.isSelected = true;\r\n\r\n // Set rotation for single object\r\n if (copiedObjects.length === 1) {\r\n selectionGroup.rotation = copiedObjects[0].rotation;\r\n }\r\n\r\n // Add the selection group\r\n this.addSelectionGroup(selectionGroup);\r\n\r\n // Handle cross-workspace paste: center objects in viewport\r\n if (isDifferentWorkspace) {\r\n if (x !== undefined && y !== undefined) {\r\n // Position was explicitly provided, use it\r\n selectionGroup.updatePosition(x, y);\r\n } else {\r\n // Center the selection group in the viewport\r\n selectionGroup.centerInViewport();\r\n }\r\n // Fit the viewport to show the pasted objects\r\n this.engine.viewport.centerFitInViewport(selectionGroup);\r\n }\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n // Update copiedObjects to the newly created objects for potential future pastes\r\n const newSelectionGroup = this._store.selectionGroup;\r\n if (newSelectionGroup) {\r\n // Create new copies and track the ID mapping for future pastes\r\n const newIdMapping = new Map<string, string>();\r\n const newCopiedObjects = newSelectionGroup.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .map(obj => {\r\n const copiedObj = obj.copy() as KritzelBaseObject<any>;\r\n newIdMapping.set(copiedObj.id, obj.id);\r\n return copiedObj;\r\n });\r\n\r\n this._store.state.copiedObjects = newCopiedObjects;\r\n this._store.state.copiedObjectIdMapping = newIdMapping;\r\n }\r\n\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n\r\n this.engine.emitObjectsChange();\r\n\r\n this.rerender();\r\n }\r\n\r\n bringForward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== max) {\r\n this.updateObject(obj, { zIndex: obj.zIndex + 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendBackward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== min) {\r\n this.updateObject(obj, { zIndex: obj.zIndex - 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n bringToFront(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: max });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendToBack(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: min });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n selectObjects(objects: KritzelBaseObject<any>[]) {\r\n if (objects.length === 0) {\r\n return;\r\n }\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n objects.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n if (objects.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this.rerender();\r\n }\r\n\r\n selectAllObjectsInViewport() {\r\n const viewportBounds = {\r\n x: -this._store.state.translateX / this._store.state.scale,\r\n y: -this._store.state.translateY / this._store.state.scale,\r\n z: this._store.state.scale,\r\n width: this._store.state.viewportWidth / this._store.state.scale,\r\n height: this._store.state.viewportHeight / this._store.state.scale,\r\n depth: 100,\r\n };\r\n\r\n const objectsInViewport = this._store.state.objects\r\n .query(viewportBounds)\r\n .filter(o => o.isInViewport())\r\n .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));\r\n\r\n if (objectsInViewport.length > 0) {\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n objectsInViewport.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n if (objectsInViewport.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.rerender();\r\n }\r\n }\r\n\r\n clearSelection() {\r\n this.removeSelectionGroup();\r\n\r\n this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._store.state.isSelecting = false;\r\n this._store.state.isResizeHandleSelected = false;\r\n this._store.state.isRotationHandleSelected = false;\r\n this._store.state.isLineHandleSelected = false;\r\n this._store.state.isLineHandleDragging = false;\r\n this._store.state.lineHandleType = null;\r\n\r\n this.rerender();\r\n }\r\n\r\n resetActiveText() {\r\n const activeText = this._store.activeText;\r\n if (activeText) {\r\n if (activeText.isEmpty) {\r\n this.deleteObject(activeText.id);\r\n } else {\r\n activeText.save();\r\n }\r\n }\r\n }\r\n\r\n resetActiveShape() {\r\n const activeShape = this._store.activeShape;\r\n if (activeShape) {\r\n activeShape.save();\r\n }\r\n }\r\n\r\n getObjectFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any> | null {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return null;\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);\r\n if (!elementAtPoint) return null;\r\n\r\n const selectedObject = elementAtPoint.closest(selector) as HTMLElement | null;\r\n\r\n if (selectedObject) {\r\n const foundObject = this._store.allObjects.find(object => selectedObject.id === object.id);\r\n const isHit = foundObject?.hitTest(clientX, clientY);\r\n return isHit ? foundObject : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getObjectsFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any>[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(clientX, clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n const objectIds = new Set<string>();\r\n\r\n elementsAtPoint.forEach(element => {\r\n const selectedObject = element.closest(selector) as HTMLElement | null;\r\n if (selectedObject && selectedObject.id) {\r\n objectIds.add(selectedObject.id);\r\n }\r\n });\r\n\r\n if (objectIds.size > 0) {\r\n return this._store.allObjects.filter(object => objectIds.has(object.id)).sort((a, b) => b.zIndex - a.zIndex);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Get all elements at a pointer position that match a given selector.\r\n * Uses elementsFromPoint to find overlapped elements.\r\n */\r\n getElementsAtPoint(event: PointerEvent, selector: string): Element[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n return elementsAtPoint.filter(el => el.matches(selector));\r\n }\r\n\r\n /**\r\n * Check if any element at the pointer position matches the given selector.\r\n * Useful for detecting hover states on overlapped elements.\r\n */\r\n isPointerOverElement(event: PointerEvent, selector: string): boolean {\r\n return this.getElementsAtPoint(event, selector).length > 0;\r\n }\r\n\r\n getCanvasPoint(event: PointerEvent): { x: number; y: number } {\r\n if (!this._store.state.host) {\r\n return { x: 0, y: 0 };\r\n }\r\n\r\n const hostRect = this._store.state.host.getBoundingClientRect();\r\n\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n const xWithoutTranslate = xRelativeToHost - this._store.state.translateX;\r\n const yWithoutTranslate = yRelativeToHost - this._store.state.translateY;\r\n\r\n const worldX = xWithoutTranslate / this._store.state.scale;\r\n const worldY = yWithoutTranslate / this._store.state.scale;\r\n\r\n return { x: worldX, y: worldY };\r\n }\r\n\r\n beforeWorkspaceChange() {\r\n // Cancel any pending debounced viewport updates to prevent them from\r\n // saving the old workspace's viewport to the new workspace\r\n this._kritzelEngine.viewport?.cancelPendingUpdates();\r\n\r\n // Immediately save the current workspace's viewport before switching\r\n const currentWorkspace = this._store.state.activeWorkspace;\r\n if (currentWorkspace) {\r\n this.updateWorkspaceViewport(\r\n this._store.state.translateX,\r\n this._store.state.translateY,\r\n this._store.state.scale\r\n );\r\n }\r\n\r\n this.resetActiveText();\r\n this.clearSelection();\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n\r\n displaySelectionGroupUI(object: KritzelBaseObject<any>): boolean {\r\n if (!object.isSelected) {\r\n return false;\r\n }\r\n\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n // During selection phase (no group yet), hide UI for KritzelLine objects\r\n return !(object instanceof KritzelLine);\r\n }\r\n\r\n // Show UI if selection contains more than one object\r\n if (selectionGroup.objects.length > 1) {\r\n return true;\r\n }\r\n\r\n // Hide UI if selection contains a single KritzelLine\r\n if (selectionGroup.objects.length === 1) {\r\n const selectedObject = selectionGroup.objects[0];\r\n return !(selectedObject instanceof KritzelLine);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n displaySelectionLineUI(object: KritzelBaseObject<any>): boolean {\r\n // Only show line UI on KritzelLine objects, not on selection groups\r\n if (!(object instanceof KritzelLine)) {\r\n return false;\r\n }\r\n\r\n // During selection phase (no group yet), show line UI if line is selected\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return object.isSelected;\r\n }\r\n\r\n if (!selectionGroup.isSelected) {\r\n return false;\r\n }\r\n\r\n // Show UI only if selection contains exactly one KritzelLine and it's this object\r\n if (selectionGroup.objects.length === 1) {\r\n const selectedObject = selectionGroup.objects[0];\r\n return selectedObject instanceof KritzelLine && selectedObject.id === object.id;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"core.class.js","sourceRoot":"","sources":["../../../src/classes/core/core.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEngine } from '../../components/core/kritzel-engine/kritzel-engine';\r\nimport { KritzelContextMenu } from '../../components/ui/kritzel-context-menu/kritzel-context-menu';\r\nimport { DEFAULT_ENGINE_CONFIG } from '../../configs/default-engine-config';\r\nimport { ObjectHelper } from '../../helpers/object.helper';\r\nimport { KritzelBaseObject } from '../objects/base-object.class';\r\nimport { KritzelSelectionBox } from '../objects/selection-box.class';\r\nimport { KritzelSelectionGroup } from '../objects/selection-group.class';\r\nimport { KritzelGroup } from '../objects/group.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\nimport { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelStore } from './store.class';\r\nimport { KritzelWorkspace } from './workspace.class';\r\nimport { KritzelObjectMap } from '../structures/object-map.structure';\r\nimport { KritzelSyncConfig } from '../../interfaces/sync-config.interface';\r\nimport { KritzelAppStateMap } from '../structures/app-state-map.structure';\r\nimport { KritzelAnchorManager } from '../managers/anchor.manager';\r\nimport { KritzelCursorManager } from '../managers/cursor.manager';\r\n\r\nexport class KritzelCore {\r\n private readonly _kritzelEngine: KritzelEngine;\r\n private readonly _store: KritzelStore;\r\n private _syncConfig?: KritzelSyncConfig;\r\n private readonly _appStateMap: KritzelAppStateMap;\r\n private readonly _anchorManager: KritzelAnchorManager;\r\n private readonly _cursorManager: KritzelCursorManager;\r\n\r\n get engine(): KritzelEngine {\r\n return this._kritzelEngine;\r\n }\r\n\r\n get store(): KritzelStore {\r\n return this._store;\r\n }\r\n\r\n get appStateMap(): KritzelAppStateMap {\r\n return this._appStateMap;\r\n }\r\n\r\n get anchorManager(): KritzelAnchorManager {\r\n return this._anchorManager;\r\n }\r\n\r\n get cursorManager(): KritzelCursorManager {\r\n return this._cursorManager;\r\n }\r\n\r\n constructor(kritzelEngine: KritzelEngine) {\r\n this._kritzelEngine = kritzelEngine;\r\n this._store = new KritzelStore(DEFAULT_ENGINE_CONFIG);\r\n this._appStateMap = new KritzelAppStateMap();\r\n this._anchorManager = new KritzelAnchorManager(this);\r\n this._cursorManager = new KritzelCursorManager(this);\r\n }\r\n\r\n setSyncConfig(config?: KritzelSyncConfig): void {\r\n this._syncConfig = config;\r\n }\r\n\r\n async initializeYjs(): Promise<void> {\r\n await this._appStateMap.initialize(this, this._syncConfig);\r\n }\r\n\r\n /**\r\n * Load all workspaces from app state map\r\n */\r\n private loadWorkspacesFromAppState(): KritzelWorkspace[] {\r\n return this._appStateMap.allWorkspaces();\r\n }\r\n\r\n /**\r\n * Save a workspace to app state map\r\n */\r\n private saveWorkspaceToAppState(workspace: KritzelWorkspace): void {\r\n if (this._appStateMap.has(workspace.id)) {\r\n this._appStateMap.update(workspace);\r\n } else {\r\n this._appStateMap.insert(workspace);\r\n }\r\n }\r\n\r\n /**\r\n * Delete a workspace from app state map\r\n */\r\n private deleteWorkspaceFromAppState(workspaceId: string): void {\r\n this._appStateMap.remove(w => w.id === workspaceId);\r\n }\r\n\r\n async initializeWorkspace(workspace?: KritzelWorkspace): Promise<void> {\r\n // Load all workspaces from app state map\r\n const workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Find most recently updated workspace or use provided/fallback\r\n const mostRecentWorkspace = workspaces.length > 0 ? [...workspaces].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())[0] : null;\r\n\r\n // Check localStorage for last active workspace\r\n const lastActiveWorkspaceId = localStorage.getItem('kritzel-active-workspace-id');\r\n const lastActiveWorkspace = lastActiveWorkspaceId ? workspaces.find(w => w.id === lastActiveWorkspaceId) : null;\r\n\r\n let activeWorkspace: KritzelWorkspace;\r\n\r\n if (workspace) {\r\n // Use provided workspace\r\n activeWorkspace = workspace;\r\n const existing = workspaces.find(w => w.id === workspace.id);\r\n if (!existing) {\r\n // New workspace, save it\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n } else if (lastActiveWorkspace) {\r\n // Use last active workspace from localStorage\r\n activeWorkspace = lastActiveWorkspace;\r\n } else if (mostRecentWorkspace) {\r\n // Use most recent workspace\r\n activeWorkspace = mostRecentWorkspace;\r\n } else {\r\n // Create fallback workspace\r\n activeWorkspace = new KritzelWorkspace(ObjectHelper.generateUUID(), 'New Workspace');\r\n activeWorkspace._core = this;\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n // Save active workspace ID to localStorage\r\n localStorage.setItem('kritzel-active-workspace-id', activeWorkspace.id);\r\n\r\n // Destroy old ObjectMap if switching workspaces\r\n if (this._store.state.objects && this._store.state.objects.isReady) {\r\n this._store.state.objects.destroy();\r\n }\r\n\r\n // Create new ObjectMap with its own Y.Doc for this workspace\r\n const objectsMap = new KritzelObjectMap();\r\n // Assign immediately so the UI shows an empty state while loading,\r\n // instead of showing the old workspace's objects with the new workspace's viewport\r\n this._store.state.objects = objectsMap;\r\n\r\n // Set active workspace\r\n this._store.state.activeWorkspace = activeWorkspace;\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Set viewport from workspace\r\n const viewport = activeWorkspace.viewport ?? { translateX: 0, translateY: 0, scale: 1 };\r\n this._store.state.translateX = viewport.translateX ?? 0;\r\n this._store.state.translateY = viewport.translateY ?? 0;\r\n this._store.state.scale = viewport.scale ?? 1;\r\n\r\n await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);\r\n\r\n // Rebuild anchor index after loading objects\r\n this._anchorManager.rebuildIndex();\r\n\r\n this.engine.emitObjectsChange();\r\n\r\n this.rerender();\r\n }\r\n\r\n rerender() {\r\n if (this._kritzelEngine) {\r\n this._kritzelEngine.forceUpdate++;\r\n }\r\n }\r\n\r\n findObjectById(id: string): KritzelBaseObject<any> | null {\r\n for (const object of this._store.allObjects) {\r\n if (object.id === id) {\r\n return object;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n getWorkspaces(): KritzelWorkspace[] {\r\n return this.loadWorkspacesFromAppState();\r\n }\r\n\r\n createWorkspace(workspace: KritzelWorkspace): void {\r\n workspace._core = this;\r\n workspace.createdAt = new Date();\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n }\r\n\r\n updateWorkspace(workspace: KritzelWorkspace): void {\r\n workspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(workspace);\r\n\r\n const workspaces = this._store.state.workspaces;\r\n const index = workspaces.findIndex(w => w.id === workspace.id);\r\n\r\n if (index !== -1) {\r\n workspaces[index] = workspace;\r\n this._store.state.workspaces = workspaces;\r\n }\r\n }\r\n\r\n deleteWorkspace(workspace: KritzelWorkspace): void {\r\n // If deleting the active workspace, need to handle ObjectMap cleanup\r\n if (this._store.state.activeWorkspace?.id === workspace.id) {\r\n this._store.state.objects?.destroy();\r\n }\r\n\r\n this.deleteWorkspaceFromAppState(workspace.id);\r\n this._store.state.workspaces = this.loadWorkspacesFromAppState();\r\n\r\n // Also delete the workspace's IndexedDB database\r\n const dbName = `kritzel-workspace-${workspace.id}`;\r\n window.indexedDB.deleteDatabase(dbName);\r\n }\r\n\r\n updateWorkspaceViewport(translateX: number, translateY: number, scale: number): void {\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n if (!activeWorkspace) {\r\n return;\r\n }\r\n\r\n activeWorkspace.viewport = { translateX, translateY, scale };\r\n activeWorkspace.updatedAt = new Date();\r\n this.saveWorkspaceToAppState(activeWorkspace);\r\n }\r\n\r\n addObject(object: KritzelBaseObject<any>): void {\r\n this._store.state.objects.insert(object);\r\n }\r\n\r\n removeObject(object: KritzelBaseObject<any>, preserveChildren: boolean = false): void {\r\n // Handle KritzelGroup: recursively delete all children first (unless preserveChildren is true)\r\n if (object instanceof KritzelGroup && !preserveChildren) {\r\n // Get children before removing the group\r\n const children = [...object.children];\r\n children.forEach(child => {\r\n this.removeObject(child);\r\n });\r\n }\r\n\r\n // Handle anchor cleanup\r\n if (object instanceof KritzelLine) {\r\n // If removing a line, clean up its anchor index entries\r\n this._anchorManager.handleLineDeleted(object.id);\r\n } else {\r\n // If removing a non-line object, detach any lines anchored to it\r\n this._anchorManager.handleObjectDeleted(object.id);\r\n }\r\n\r\n object.isMounted = false;\r\n this._store.state.objects.remove(o => o.id === object.id);\r\n }\r\n\r\n updateObject<T extends KritzelBaseObject<any>>(object: T, updatedProperties: Partial<T>): void {\r\n for (const key in updatedProperties) {\r\n if (updatedProperties.hasOwnProperty(key)) {\r\n object[key] = updatedProperties[key];\r\n }\r\n }\r\n\r\n this._store.state.objects.update(object);\r\n }\r\n\r\n addSelectionGroup(selectionGroup: KritzelSelectionGroup): void {\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n this._store.state.objects.insert(selectionGroup);\r\n }\r\n\r\n removeSelectionGroup(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n this._store.state.objects.remove(object => object.id === selectionGroup.id);\r\n }\r\n }\r\n\r\n removeSelectionBox(): void {\r\n const selectionBox = this._store.selectionBox;\r\n if (selectionBox) {\r\n this._store.state.objects.remove(object => object.id === selectionBox.id);\r\n }\r\n }\r\n\r\n deselectAllObjects(): void {\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n delete() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n selectionGroup.objects.forEach(obj => this.removeObject(obj));\r\n\r\n this.removeSelectionGroup();\r\n this.rerender();\r\n }\r\n\r\n undo(): void {\r\n this._store.state.objects?.undo();\r\n }\r\n\r\n redo(): void {\r\n this._store.state.objects?.redo();\r\n }\r\n\r\n deleteObject(id: string) {\r\n const object = this.findObjectById(id);\r\n if (object) {\r\n this.removeObject(object);\r\n this.rerender();\r\n }\r\n }\r\n\r\n copy() {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (selectionGroup) {\r\n // Copy each object and store them in an array, also track the ID mapping\r\n const idMapping = new Map<string, string>();\r\n const copiedObjects = selectionGroup.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .map(obj => {\r\n const copiedObj = obj.copy() as KritzelBaseObject<any>;\r\n // Map: newId -> originalId\r\n idMapping.set(copiedObj.id, obj.id);\r\n return copiedObj;\r\n });\r\n\r\n this._store.state.copiedObjects = copiedObjects;\r\n this._store.state.copiedObjectIdMapping = idMapping;\r\n }\r\n }\r\n\r\n paste(x?: number, y?: number) {\r\n const copiedObjects = this._store.state.copiedObjects;\r\n if (!copiedObjects || copiedObjects.length === 0) {\r\n return;\r\n }\r\n\r\n const activeWorkspace = this._store.state.activeWorkspace;\r\n const originalIdMapping = this._store.state.copiedObjectIdMapping;\r\n\r\n // Check if we're pasting from a different workspace\r\n const isDifferentWorkspace = copiedObjects.some(obj => obj.workspaceId !== activeWorkspace.id);\r\n\r\n // Calculate the bounding box of all copied objects\r\n const minX = Math.min(...copiedObjects.map(obj => obj.translateX));\r\n const minY = Math.min(...copiedObjects.map(obj => obj.translateY));\r\n\r\n // Determine the paste position\r\n let pasteX: number;\r\n let pasteY: number;\r\n\r\n if (x !== undefined && y !== undefined) {\r\n // Explicit position provided (e.g., right-click paste)\r\n pasteX = x;\r\n pasteY = y;\r\n } else if (isDifferentWorkspace) {\r\n // Pasting to different workspace without explicit position\r\n // Keep original position; will be centered by centerInViewport() later\r\n pasteX = minX;\r\n pasteY = minY;\r\n } else {\r\n // Same workspace paste: offset by 25 pixels from original position\r\n pasteX = minX + 25 / this._store.state.scale;\r\n pasteY = minY + 25 / this._store.state.scale;\r\n }\r\n\r\n // Calculate the offset to apply to all objects\r\n const offsetX = pasteX - minX;\r\n const offsetY = pasteY - minY;\r\n\r\n this.removeSelectionGroup();\r\n this.removeSelectionBox();\r\n\r\n // Create a new selection group for the pasted objects\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n // Build a reverse mapping: originalId -> newCopiedObjectId\r\n // This is used to remap anchor references from original IDs to the copied object IDs\r\n const originalToNewIdMap = new Map<string, string>();\r\n if (originalIdMapping) {\r\n originalIdMapping.forEach((originalId, copiedId) => {\r\n originalToNewIdMap.set(originalId, copiedId);\r\n });\r\n }\r\n\r\n // First add all copied objects to the objectsMap with updated positions\r\n copiedObjects.forEach((obj, i) => {\r\n // Update workspace if pasting to a different workspace\r\n if (obj.workspaceId !== activeWorkspace.id) {\r\n obj.workspaceId = activeWorkspace.id;\r\n }\r\n\r\n // Update position\r\n obj.updatePosition(obj.translateX + offsetX, obj.translateY + offsetY);\r\n\r\n // Update z-index\r\n obj.zIndex = this._store.currentZIndex + i;\r\n\r\n // Handle KritzelGroup: also add pending children with offset\r\n if (obj instanceof KritzelGroup) {\r\n const pendingChildren = (obj as any)._pendingChildren as KritzelBaseObject<any>[] | undefined;\r\n if (pendingChildren) {\r\n pendingChildren.forEach((child, childIndex) => {\r\n // Update workspace\r\n if (child.workspaceId !== activeWorkspace.id) {\r\n child.workspaceId = activeWorkspace.id;\r\n }\r\n\r\n // Update position with offset\r\n child.updatePosition(child.translateX + offsetX, child.translateY + offsetY);\r\n\r\n // Update z-index\r\n child.zIndex = this._store.currentZIndex + i + childIndex;\r\n\r\n // Add child to store\r\n this.addObject(child);\r\n });\r\n\r\n // Clear pending children\r\n delete (obj as any)._pendingChildren;\r\n\r\n // Finalize the group's bounding box and snapshots\r\n obj.finalize();\r\n }\r\n }\r\n\r\n // Add to objectsMap\r\n this.addObject(obj);\r\n\r\n // Add to selection group\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n // Update line anchors to point to the newly pasted objects\r\n // Only remap if the anchor target was also part of the copied selection\r\n copiedObjects.forEach(obj => {\r\n if (obj instanceof KritzelLine) {\r\n let updated = false;\r\n\r\n if (obj.startAnchor && originalToNewIdMap.has(obj.startAnchor.objectId)) {\r\n obj.startAnchor = { objectId: originalToNewIdMap.get(obj.startAnchor.objectId)! };\r\n updated = true;\r\n }\r\n\r\n if (obj.endAnchor && originalToNewIdMap.has(obj.endAnchor.objectId)) {\r\n obj.endAnchor = { objectId: originalToNewIdMap.get(obj.endAnchor.objectId)! };\r\n updated = true;\r\n }\r\n\r\n // If anchors were updated, rebuild the anchor index and persist the change\r\n if (updated) {\r\n this._store.state.objects.update(obj);\r\n }\r\n }\r\n });\r\n\r\n // Rebuild anchor index after all anchor updates\r\n this._anchorManager.rebuildIndex();\r\n\r\n // Mark selection group as selected\r\n selectionGroup.isSelected = true;\r\n\r\n // Set rotation for single object\r\n if (copiedObjects.length === 1) {\r\n selectionGroup.rotation = copiedObjects[0].rotation;\r\n }\r\n\r\n // Add the selection group\r\n this.addSelectionGroup(selectionGroup);\r\n\r\n // Handle cross-workspace paste: center objects in viewport\r\n if (isDifferentWorkspace) {\r\n if (x !== undefined && y !== undefined) {\r\n // Position was explicitly provided, use it\r\n selectionGroup.updatePosition(x, y);\r\n } else {\r\n // Center the selection group in the viewport\r\n selectionGroup.centerInViewport();\r\n }\r\n // Fit the viewport to show the pasted objects\r\n this.engine.viewport.centerFitInViewport(selectionGroup);\r\n }\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n // Update copiedObjects to the newly created objects for potential future pastes\r\n const newSelectionGroup = this._store.selectionGroup;\r\n if (newSelectionGroup) {\r\n // Create new copies and track the ID mapping for future pastes\r\n const newIdMapping = new Map<string, string>();\r\n const newCopiedObjects = newSelectionGroup.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .map(obj => {\r\n const copiedObj = obj.copy() as KritzelBaseObject<any>;\r\n newIdMapping.set(copiedObj.id, obj.id);\r\n return copiedObj;\r\n });\r\n\r\n this._store.state.copiedObjects = newCopiedObjects;\r\n this._store.state.copiedObjectIdMapping = newIdMapping;\r\n }\r\n\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n\r\n this.engine.emitObjectsChange();\r\n\r\n this.rerender();\r\n }\r\n\r\n bringForward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== max) {\r\n this.updateObject(obj, { zIndex: obj.zIndex + 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendBackward(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = allNonSelectionObjectsWithoutCurrent.length > 0 ? Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1 : 0;\r\n\r\n objects.forEach(obj => {\r\n if (obj.zIndex !== min) {\r\n this.updateObject(obj, { zIndex: obj.zIndex - 1 });\r\n }\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n bringToFront(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const max = Math.max(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) + 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: max });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n sendToBack(object?: KritzelBaseObject<any>) {\r\n const selectionGroup = this._store.selectionGroup;\r\n const objects = object ? [object] : selectionGroup?.objects || [];\r\n const allNonSelectionObjectsWithoutCurrent = this._store.allNonSelectionObjects.filter(o => objects.findIndex(obj => obj.id === o.id) === -1);\r\n const min = Math.min(...allNonSelectionObjectsWithoutCurrent.map(obj => obj.zIndex)) - 1;\r\n\r\n objects.forEach(obj => {\r\n this.updateObject(obj, { zIndex: min });\r\n });\r\n\r\n this.rerender();\r\n }\r\n\r\n /**\r\n * Groups the currently selected objects into a KritzelGroup.\r\n * Requires at least 2 objects to be selected.\r\n */\r\n group(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup || selectionGroup.objects.length < 2) {\r\n return;\r\n }\r\n\r\n // Create a group from the selected objects\r\n const group = KritzelGroup.createFromObjects(this, selectionGroup.objects);\r\n\r\n // Add the group to the object store\r\n this.addObject(group);\r\n\r\n // Remove the selection group and create a new one with just the group\r\n this.removeSelectionGroup();\r\n\r\n const newSelectionGroup = KritzelSelectionGroup.create(this);\r\n newSelectionGroup.addOrRemove(group);\r\n newSelectionGroup.isSelected = true;\r\n newSelectionGroup.rotation = group.rotation;\r\n this.addSelectionGroup(newSelectionGroup);\r\n\r\n this.engine.emitObjectsChange();\r\n this.rerender();\r\n }\r\n\r\n /**\r\n * Ungroups any KritzelGroup objects in the current selection.\r\n * Children are extracted and become top-level objects.\r\n */\r\n ungroup(): void {\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n const groups = selectionGroup.objects.filter(obj => obj instanceof KritzelGroup) as KritzelGroup[];\r\n if (groups.length === 0) {\r\n return;\r\n }\r\n\r\n // Collect all children from all groups\r\n const allChildren: KritzelBaseObject<any>[] = [];\r\n const nonGroupObjects = selectionGroup.objects.filter(obj => !(obj instanceof KritzelGroup));\r\n\r\n groups.forEach(group => {\r\n // Get children before removing the group\r\n const children = group.ungroup();\r\n allChildren.push(...children);\r\n\r\n // Remove the group from the store (but keep children)\r\n this.removeObject(group, true);\r\n });\r\n\r\n // Create a new selection group with all the ungrouped children and non-group objects\r\n this.removeSelectionGroup();\r\n\r\n const newSelectionGroup = KritzelSelectionGroup.create(this);\r\n [...allChildren, ...nonGroupObjects].forEach(child => {\r\n newSelectionGroup.addOrRemove(child);\r\n });\r\n newSelectionGroup.isSelected = true;\r\n this.addSelectionGroup(newSelectionGroup);\r\n\r\n this.engine.emitObjectsChange();\r\n this.rerender();\r\n }\r\n\r\n selectObjects(objects: KritzelBaseObject<any>[]) {\r\n if (objects.length === 0) {\r\n return;\r\n }\r\n\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n objects.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n if (objects.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this.rerender();\r\n }\r\n\r\n selectAllObjectsInViewport() {\r\n const viewportBounds = {\r\n x: -this._store.state.translateX / this._store.state.scale,\r\n y: -this._store.state.translateY / this._store.state.scale,\r\n z: this._store.state.scale,\r\n width: this._store.state.viewportWidth / this._store.state.scale,\r\n height: this._store.state.viewportHeight / this._store.state.scale,\r\n depth: 100,\r\n };\r\n\r\n const objectsInViewport = this._store.state.objects\r\n .query(viewportBounds)\r\n .filter(o => o.isInViewport())\r\n .filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox) && !(o instanceof KritzelContextMenu));\r\n\r\n if (objectsInViewport.length > 0) {\r\n const selectionGroup = KritzelSelectionGroup.create(this);\r\n\r\n objectsInViewport.forEach(obj => {\r\n obj.isSelected = false;\r\n selectionGroup.addOrRemove(obj);\r\n });\r\n\r\n selectionGroup.isSelected = true;\r\n\r\n this._store.state.isSelecting = false;\r\n\r\n if (objectsInViewport.length === 1) {\r\n selectionGroup.rotation = selectionGroup.objects[0].rotation;\r\n }\r\n\r\n this.addSelectionGroup(selectionGroup);\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n this.rerender();\r\n }\r\n }\r\n\r\n clearSelection() {\r\n this.removeSelectionGroup();\r\n\r\n this._store.state.objects.remove(o => o instanceof KritzelSelectionBox || o instanceof KritzelSelectionGroup);\r\n this._store.state.isSelecting = false;\r\n this._store.state.isResizeHandleSelected = false;\r\n this._store.state.isRotationHandleSelected = false;\r\n this._store.state.isLineHandleSelected = false;\r\n this._store.state.isLineHandleDragging = false;\r\n this._store.state.lineHandleType = null;\r\n\r\n this.rerender();\r\n }\r\n\r\n resetActiveText() {\r\n const activeText = this._store.activeText;\r\n if (activeText) {\r\n if (activeText.isEmpty) {\r\n this.deleteObject(activeText.id);\r\n } else {\r\n activeText.save();\r\n }\r\n }\r\n }\r\n\r\n resetActiveShape() {\r\n const activeShape = this._store.activeShape;\r\n if (activeShape) {\r\n activeShape.save();\r\n }\r\n }\r\n\r\n getObjectFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any> | null {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return null;\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementAtPoint = shadowRoot.elementFromPoint(clientX, clientY);\r\n if (!elementAtPoint) return null;\r\n\r\n const selectedObject = elementAtPoint.closest(selector) as HTMLElement | null;\r\n\r\n if (selectedObject) {\r\n const foundObject = this._store.allObjects.find(object => selectedObject.id === object.id);\r\n const isHit = foundObject?.hitTest(clientX, clientY);\r\n return isHit ? foundObject : null;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n getObjectsFromPointerEvent(event: PointerEvent, selector = '.object'): KritzelBaseObject<any>[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const clientX = event.clientX;\r\n const clientY = event.clientY;\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(clientX, clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n const objectIds = new Set<string>();\r\n\r\n elementsAtPoint.forEach(element => {\r\n const selectedObject = element.closest(selector) as HTMLElement | null;\r\n if (selectedObject && selectedObject.id) {\r\n objectIds.add(selectedObject.id);\r\n }\r\n });\r\n\r\n if (objectIds.size > 0) {\r\n return this._store.allObjects.filter(object => objectIds.has(object.id)).sort((a, b) => b.zIndex - a.zIndex);\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Get all elements at a pointer position that match a given selector.\r\n * Uses elementsFromPoint to find overlapped elements.\r\n */\r\n getElementsAtPoint(event: PointerEvent, selector: string): Element[] {\r\n const shadowRoot = this._store.state.host?.shadowRoot;\r\n if (!shadowRoot) return [];\r\n\r\n const elementsAtPoint = shadowRoot.elementsFromPoint(event.clientX, event.clientY);\r\n if (!elementsAtPoint || elementsAtPoint.length === 0) return [];\r\n\r\n return elementsAtPoint.filter(el => el.matches(selector));\r\n }\r\n\r\n /**\r\n * Check if any element at the pointer position matches the given selector.\r\n * Useful for detecting hover states on overlapped elements.\r\n */\r\n isPointerOverElement(event: PointerEvent, selector: string): boolean {\r\n return this.getElementsAtPoint(event, selector).length > 0;\r\n }\r\n\r\n getCanvasPoint(event: PointerEvent): { x: number; y: number } {\r\n if (!this._store.state.host) {\r\n return { x: 0, y: 0 };\r\n }\r\n\r\n const hostRect = this._store.state.host.getBoundingClientRect();\r\n\r\n const xRelativeToHost = event.clientX - hostRect.left;\r\n const yRelativeToHost = event.clientY - hostRect.top;\r\n\r\n const xWithoutTranslate = xRelativeToHost - this._store.state.translateX;\r\n const yWithoutTranslate = yRelativeToHost - this._store.state.translateY;\r\n\r\n const worldX = xWithoutTranslate / this._store.state.scale;\r\n const worldY = yWithoutTranslate / this._store.state.scale;\r\n\r\n return { x: worldX, y: worldY };\r\n }\r\n\r\n beforeWorkspaceChange() {\r\n // Cancel any pending debounced viewport updates to prevent them from\r\n // saving the old workspace's viewport to the new workspace\r\n this._kritzelEngine.viewport?.cancelPendingUpdates();\r\n\r\n // Immediately save the current workspace's viewport before switching\r\n const currentWorkspace = this._store.state.activeWorkspace;\r\n if (currentWorkspace) {\r\n this.updateWorkspaceViewport(\r\n this._store.state.translateX,\r\n this._store.state.translateY,\r\n this._store.state.scale\r\n );\r\n }\r\n\r\n this.resetActiveText();\r\n this.clearSelection();\r\n this._store.setState('activeTool', KritzelToolRegistry.getTool('selection'));\r\n }\r\n\r\n displaySelectionGroupUI(object: KritzelBaseObject<any>): boolean {\r\n if (!object.isSelected) {\r\n return false;\r\n }\r\n\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n // During selection phase (no group yet), hide UI for KritzelLine objects\r\n return !(object instanceof KritzelLine);\r\n }\r\n\r\n // Show UI if selection contains more than one object\r\n if (selectionGroup.objects.length > 1) {\r\n return true;\r\n }\r\n\r\n // Hide UI if selection contains a single KritzelLine\r\n if (selectionGroup.objects.length === 1) {\r\n const selectedObject = selectionGroup.objects[0];\r\n return !(selectedObject instanceof KritzelLine);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n displaySelectionLineUI(object: KritzelBaseObject<any>): boolean {\r\n // Only show line UI on KritzelLine objects, not on selection groups\r\n if (!(object instanceof KritzelLine)) {\r\n return false;\r\n }\r\n\r\n // During selection phase (no group yet), show line UI if line is selected\r\n const selectionGroup = this._store.selectionGroup;\r\n if (!selectionGroup) {\r\n return object.isSelected;\r\n }\r\n\r\n if (!selectionGroup.isSelected) {\r\n return false;\r\n }\r\n\r\n // Show UI only if selection contains exactly one KritzelLine and it's this object\r\n if (selectionGroup.objects.length === 1) {\r\n const selectedObject = selectionGroup.objects[0];\r\n return selectedObject instanceof KritzelLine && selectedObject.id === object.id;\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n"]}
@@ -3,6 +3,7 @@ import { KritzelLine } from "../objects/line.class";
3
3
  import { KritzelPath } from "../objects/path.class";
4
4
  import { KritzelShape } from "../objects/shape.class";
5
5
  import { KritzelSelectionGroup } from "../objects/selection-group.class";
6
+ import { KritzelGroup } from "../objects/group.class";
6
7
  import { KritzelText } from "../objects/text.class";
7
8
  import { KritzelBrushTool } from "../tools/brush-tool.class";
8
9
  import { KritzelEraserTool } from "../tools/eraser-tool.class";
@@ -52,6 +53,9 @@ export class KritzelReviver {
52
53
  case 'KritzelSelectionGroup':
53
54
  revivedObj = KritzelSelectionGroup.create(this._core).deserialize(obj);
54
55
  break;
56
+ case 'KritzelGroup':
57
+ revivedObj = KritzelGroup.create(this._core).deserialize(obj);
58
+ break;
55
59
  case 'KritzelWorkspace':
56
60
  revivedObj = KritzelWorkspace.create(this._core, obj).deserialize(obj);
57
61
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"reviver.class.js","sourceRoot":"","sources":["../../../src/classes/core/reviver.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelImage } from \"../objects/image.class\";\r\nimport { KritzelLine } from \"../objects/line.class\";\r\nimport { KritzelPath } from \"../objects/path.class\";\r\nimport { KritzelShape } from \"../objects/shape.class\";\r\nimport { KritzelSelectionGroup } from \"../objects/selection-group.class\";\r\nimport { KritzelText } from \"../objects/text.class\";\r\nimport { KritzelBrushTool } from \"../tools/brush-tool.class\";\r\nimport { KritzelEraserTool } from \"../tools/eraser-tool.class\";\r\nimport { KritzelImageTool } from \"../tools/image-tool.class\";\r\nimport { KritzelLineTool } from \"../tools/line-tool.class\";\r\nimport { KritzelSelectionTool } from \"../tools/selection-tool.class\";\r\nimport { KritzelTextTool } from \"../tools/text-tool.class\";\r\nimport { KritzelShapeTool } from \"../tools/shape-tool.class\";\r\nimport { KritzelCustomElement } from \"../objects/custom-element.class\";\r\nimport { KritzelCore } from \"./core.class\";\r\nimport { KritzelWorkspace } from \"../..\";\r\n\r\nexport class KritzelReviver {\r\n\r\n private readonly _core: KritzelCore;\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n revive<T>(obj: any): T {\r\n if (obj && typeof obj === 'object') {\r\n if (obj.__class__) {\r\n let revivedObj;\r\n\r\n switch (obj.__class__) {\r\n case 'KritzelPath':\r\n revivedObj = KritzelPath.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelLine':\r\n revivedObj = KritzelLine.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelText':\r\n revivedObj = KritzelText.create(this._core, obj.fontSize, obj.fontFamily).deserialize(obj);\r\n break;\r\n case 'KritzelShape':\r\n revivedObj = KritzelShape.create(this._core, {\r\n shapeType: obj.shapeType,\r\n fillColor: obj.fillColor,\r\n strokeColor: obj.strokeColor,\r\n strokeWidth: obj.strokeWidth,\r\n fontSize: obj.fontSize,\r\n fontFamily: obj.fontFamily,\r\n fontColor: obj.fontColor,\r\n }).deserialize(obj);\r\n break;\r\n case 'KritzelImage':\r\n revivedObj = KritzelImage.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelCustomElement':\r\n revivedObj = KritzelCustomElement.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelSelectionGroup':\r\n revivedObj = KritzelSelectionGroup.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelWorkspace':\r\n revivedObj = KritzelWorkspace.create(this._core, obj).deserialize(obj);\r\n break;\r\n case 'KritzelBrushTool':\r\n revivedObj = new KritzelBrushTool(this._core);\r\n break;\r\n case 'KritzelEraserTool':\r\n revivedObj = new KritzelEraserTool(this._core);\r\n break;\r\n case 'KritzelImageTool':\r\n revivedObj = new KritzelImageTool(this._core);\r\n break;\r\n case 'KritzelSelectionTool':\r\n revivedObj = new KritzelSelectionTool(this._core);\r\n break;\r\n case 'KritzelTextTool':\r\n revivedObj = new KritzelTextTool(this._core);\r\n break;\r\n case 'KritzelLineTool':\r\n revivedObj = new KritzelLineTool(this._core);\r\n break;\r\n case 'KritzelShapeTool':\r\n revivedObj = new KritzelShapeTool(this._core);\r\n break;\r\n\r\n default:\r\n revivedObj = obj;\r\n }\r\n return revivedObj;\r\n }\r\n\r\n const newObj = Array.isArray(obj) ? [] : {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n newObj[key] = this.revive(obj[key]);\r\n }\r\n }\r\n return newObj as T;\r\n }\r\n return obj;\r\n }\r\n\r\n}"]}
1
+ {"version":3,"file":"reviver.class.js","sourceRoot":"","sources":["../../../src/classes/core/reviver.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelImage } from \"../objects/image.class\";\r\nimport { KritzelLine } from \"../objects/line.class\";\r\nimport { KritzelPath } from \"../objects/path.class\";\r\nimport { KritzelShape } from \"../objects/shape.class\";\r\nimport { KritzelSelectionGroup } from \"../objects/selection-group.class\";\r\nimport { KritzelGroup } from \"../objects/group.class\";\r\nimport { KritzelText } from \"../objects/text.class\";\r\nimport { KritzelBrushTool } from \"../tools/brush-tool.class\";\r\nimport { KritzelEraserTool } from \"../tools/eraser-tool.class\";\r\nimport { KritzelImageTool } from \"../tools/image-tool.class\";\r\nimport { KritzelLineTool } from \"../tools/line-tool.class\";\r\nimport { KritzelSelectionTool } from \"../tools/selection-tool.class\";\r\nimport { KritzelTextTool } from \"../tools/text-tool.class\";\r\nimport { KritzelShapeTool } from \"../tools/shape-tool.class\";\r\nimport { KritzelCustomElement } from \"../objects/custom-element.class\";\r\nimport { KritzelCore } from \"./core.class\";\r\nimport { KritzelWorkspace } from \"../..\";\r\n\r\nexport class KritzelReviver {\r\n\r\n private readonly _core: KritzelCore;\r\n\r\n constructor(core: KritzelCore) {\r\n this._core = core;\r\n }\r\n\r\n revive<T>(obj: any): T {\r\n if (obj && typeof obj === 'object') {\r\n if (obj.__class__) {\r\n let revivedObj;\r\n\r\n switch (obj.__class__) {\r\n case 'KritzelPath':\r\n revivedObj = KritzelPath.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelLine':\r\n revivedObj = KritzelLine.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelText':\r\n revivedObj = KritzelText.create(this._core, obj.fontSize, obj.fontFamily).deserialize(obj);\r\n break;\r\n case 'KritzelShape':\r\n revivedObj = KritzelShape.create(this._core, {\r\n shapeType: obj.shapeType,\r\n fillColor: obj.fillColor,\r\n strokeColor: obj.strokeColor,\r\n strokeWidth: obj.strokeWidth,\r\n fontSize: obj.fontSize,\r\n fontFamily: obj.fontFamily,\r\n fontColor: obj.fontColor,\r\n }).deserialize(obj);\r\n break;\r\n case 'KritzelImage':\r\n revivedObj = KritzelImage.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelCustomElement':\r\n revivedObj = KritzelCustomElement.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelSelectionGroup':\r\n revivedObj = KritzelSelectionGroup.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelGroup':\r\n revivedObj = KritzelGroup.create(this._core).deserialize(obj);\r\n break;\r\n case 'KritzelWorkspace':\r\n revivedObj = KritzelWorkspace.create(this._core, obj).deserialize(obj);\r\n break;\r\n case 'KritzelBrushTool':\r\n revivedObj = new KritzelBrushTool(this._core);\r\n break;\r\n case 'KritzelEraserTool':\r\n revivedObj = new KritzelEraserTool(this._core);\r\n break;\r\n case 'KritzelImageTool':\r\n revivedObj = new KritzelImageTool(this._core);\r\n break;\r\n case 'KritzelSelectionTool':\r\n revivedObj = new KritzelSelectionTool(this._core);\r\n break;\r\n case 'KritzelTextTool':\r\n revivedObj = new KritzelTextTool(this._core);\r\n break;\r\n case 'KritzelLineTool':\r\n revivedObj = new KritzelLineTool(this._core);\r\n break;\r\n case 'KritzelShapeTool':\r\n revivedObj = new KritzelShapeTool(this._core);\r\n break;\r\n\r\n default:\r\n revivedObj = obj;\r\n }\r\n return revivedObj;\r\n }\r\n\r\n const newObj = Array.isArray(obj) ? [] : {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n newObj[key] = this.revive(obj[key]);\r\n }\r\n }\r\n return newObj as T;\r\n }\r\n return obj;\r\n }\r\n\r\n}"]}
@@ -33,6 +33,9 @@ export class KritzelKeyHandler extends KritzelBaseHandler {
33
33
  { key: '-', ctrl: true, condition: c => !!c.store.selectionGroup, action: c => c.sendBackward() },
34
34
  { key: '*', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.bringToFront() },
35
35
  { key: '_', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.sendToBack() },
36
+ // Grouping
37
+ { key: 'g', ctrl: true, condition: c => !!c.store.selectionGroup && c.store.selectionGroup.objects.length >= 2, action: c => c.group() },
38
+ { key: 'G', ctrl: true, shift: true, condition: c => !!c.store.selectionGroup, action: c => c.ungroup() },
36
39
  ];
37
40
  constructor(core) {
38
41
  super(core);
@@ -1 +1 @@
1
- {"version":3,"file":"key.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/key.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelShortcut } from '../../interfaces/shortcut.interface';\r\n\r\nexport class KritzelKeyHandler extends KritzelBaseHandler {\r\n\r\n private shortcuts: KritzelShortcut[] = [\r\n // General\r\n { key: 'Escape', condition: c => !!c.store.selectionGroup, action: c => c.clearSelection() },\r\n { key: 'Delete', condition: c => !!c.store.selectionGroup, action: c => c.delete() },\r\n\r\n // Undo/Redo\r\n { key: 'z', ctrl: true, action: c => c.undo() },\r\n { key: 'y', ctrl: true, action: c => c.redo() },\r\n\r\n // Tool selection\r\n { key: 's', ctrl: true, action: () => this.switchTool('selection') },\r\n { key: 'b', ctrl: true, action: () => this.switchTool('brush') },\r\n { key: 'e', ctrl: true, action: () => this.switchTool('eraser') },\r\n { key: 'i', ctrl: true, action: () => this.switchTool('image') },\r\n { key: 'x', ctrl: true, action: () => this.switchTool('text') },\r\n\r\n // Clipboard\r\n {\r\n key: 'c',\r\n ctrl: true,\r\n condition: c => !!c.store.selectionGroup,\r\n action: c => {\r\n c.copy();\r\n c.rerender();\r\n },\r\n },\r\n { key: 'v', ctrl: true, condition: c => !!c.store.state.copiedObjects && !c.store.activeText, action: c => c.paste() },\r\n\r\n // Text editing\r\n // { key: 'a', ctrl: true, condition: c => !!c.store.activeText, action: c => c.store.activeText.selectAll() },\r\n // { key: 'v', ctrl: true, condition: c => !!c.store.activeText, action: c => c.store.activeText.insertFromClipboard() },\r\n\r\n // Object layering\r\n { key: '+', ctrl: true, condition: c => !!c.store.selectionGroup, action: c => c.bringForward() },\r\n { key: '-', ctrl: true, condition: c => !!c.store.selectionGroup, action: c => c.sendBackward() },\r\n { key: '*', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.bringToFront() },\r\n { key: '_', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.sendToBack() },\r\n ];\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private switchTool(tool: string) {\r\n const toolInstance = KritzelToolRegistry.getTool(tool);\r\n this._core.store.setState('activeTool', toolInstance);\r\n this._core.deselectAllObjects();\r\n toolInstance.onActivate();\r\n }\r\n\r\n handleKeyDown(event: KeyboardEvent): void {\r\n this._core.store.state.isCtrlKeyPressed = event.ctrlKey;\r\n\r\n const shortcut = this.shortcuts.find(s => s.key === event.key && !!s.ctrl === event.ctrlKey && !!s.shift === event.shiftKey && (!s.condition || s.condition(this._core)));\r\n\r\n if (shortcut) {\r\n event.preventDefault();\r\n shortcut.action(this._core);\r\n } \r\n }\r\n\r\n handleKeyUp(event: KeyboardEvent): void {\r\n this._core.store.state.isCtrlKeyPressed = event.ctrlKey;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"key.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/key.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelToolRegistry } from '../registries/tool.registry';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelShortcut } from '../../interfaces/shortcut.interface';\r\n\r\nexport class KritzelKeyHandler extends KritzelBaseHandler {\r\n\r\n private shortcuts: KritzelShortcut[] = [\r\n // General\r\n { key: 'Escape', condition: c => !!c.store.selectionGroup, action: c => c.clearSelection() },\r\n { key: 'Delete', condition: c => !!c.store.selectionGroup, action: c => c.delete() },\r\n\r\n // Undo/Redo\r\n { key: 'z', ctrl: true, action: c => c.undo() },\r\n { key: 'y', ctrl: true, action: c => c.redo() },\r\n\r\n // Tool selection\r\n { key: 's', ctrl: true, action: () => this.switchTool('selection') },\r\n { key: 'b', ctrl: true, action: () => this.switchTool('brush') },\r\n { key: 'e', ctrl: true, action: () => this.switchTool('eraser') },\r\n { key: 'i', ctrl: true, action: () => this.switchTool('image') },\r\n { key: 'x', ctrl: true, action: () => this.switchTool('text') },\r\n\r\n // Clipboard\r\n {\r\n key: 'c',\r\n ctrl: true,\r\n condition: c => !!c.store.selectionGroup,\r\n action: c => {\r\n c.copy();\r\n c.rerender();\r\n },\r\n },\r\n { key: 'v', ctrl: true, condition: c => !!c.store.state.copiedObjects && !c.store.activeText, action: c => c.paste() },\r\n\r\n // Text editing\r\n // { key: 'a', ctrl: true, condition: c => !!c.store.activeText, action: c => c.store.activeText.selectAll() },\r\n // { key: 'v', ctrl: true, condition: c => !!c.store.activeText, action: c => c.store.activeText.insertFromClipboard() },\r\n\r\n // Object layering\r\n { key: '+', ctrl: true, condition: c => !!c.store.selectionGroup, action: c => c.bringForward() },\r\n { key: '-', ctrl: true, condition: c => !!c.store.selectionGroup, action: c => c.sendBackward() },\r\n { key: '*', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.bringToFront() },\r\n { key: '_', shift: true, condition: c => !!c.store.selectionGroup, action: c => c.sendToBack() },\r\n\r\n // Grouping\r\n { key: 'g', ctrl: true, condition: c => !!c.store.selectionGroup && c.store.selectionGroup.objects.length >= 2, action: c => c.group() },\r\n { key: 'G', ctrl: true, shift: true, condition: c => !!c.store.selectionGroup, action: c => c.ungroup() },\r\n ];\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private switchTool(tool: string) {\r\n const toolInstance = KritzelToolRegistry.getTool(tool);\r\n this._core.store.setState('activeTool', toolInstance);\r\n this._core.deselectAllObjects();\r\n toolInstance.onActivate();\r\n }\r\n\r\n handleKeyDown(event: KeyboardEvent): void {\r\n this._core.store.state.isCtrlKeyPressed = event.ctrlKey;\r\n\r\n const shortcut = this.shortcuts.find(s => s.key === event.key && !!s.ctrl === event.ctrlKey && !!s.shift === event.shiftKey && (!s.condition || s.condition(this._core)));\r\n\r\n if (shortcut) {\r\n event.preventDefault();\r\n shortcut.action(this._core);\r\n }\r\n }\r\n\r\n handleKeyUp(event: KeyboardEvent): void {\r\n this._core.store.state.isCtrlKeyPressed = event.ctrlKey;\r\n }\r\n}\r\n"]}
@@ -1,5 +1,8 @@
1
1
  import { KritzelEventHelper } from "../../helpers/event.helper";
2
2
  import { KritzelBaseHandler } from "./base.handler";
3
+ import { KritzelLine } from "../objects/line.class";
4
+ /** Threshold in screen pixels for disconnecting anchored lines during drag */
5
+ const ANCHOR_DISCONNECT_THRESHOLD = 30;
3
6
  export class KritzelMoveHandler extends KritzelBaseHandler {
4
7
  dragStartX;
5
8
  dragStartY;
@@ -7,6 +10,11 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
7
10
  startY;
8
11
  endX;
9
12
  endY;
13
+ /** Initial position when drag started (for calculating total accumulated distance) */
14
+ initialDragX = 0;
15
+ initialDragY = 0;
16
+ /** Set of line IDs that have been disconnected from anchors during this drag */
17
+ disconnectedLineIds = new Set();
10
18
  hasMoved = false;
11
19
  trackedPointerId = null;
12
20
  constructor(core) {
@@ -19,6 +27,9 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
19
27
  this.startY = 0;
20
28
  this.endX = 0;
21
29
  this.endY = 0;
30
+ this.initialDragX = 0;
31
+ this.initialDragY = 0;
32
+ this.disconnectedLineIds.clear();
22
33
  this.hasMoved = false;
23
34
  this.trackedPointerId = null;
24
35
  }
@@ -38,6 +49,9 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
38
49
  this.dragStartY = clientY;
39
50
  this.startX = this.dragStartX;
40
51
  this.startY = this.dragStartY;
52
+ this.initialDragX = clientX;
53
+ this.initialDragY = clientY;
54
+ this.disconnectedLineIds.clear();
41
55
  this.trackedPointerId = event.pointerId;
42
56
  }
43
57
  else {
@@ -63,6 +77,9 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
63
77
  this.dragStartY = y;
64
78
  this.startX = x;
65
79
  this.startY = y;
80
+ this.initialDragX = x;
81
+ this.initialDragY = y;
82
+ this.disconnectedLineIds.clear();
66
83
  this.trackedPointerId = event.pointerId;
67
84
  }
68
85
  else {
@@ -86,6 +103,8 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
86
103
  const moveDeltaY = Math.abs(clientY - this.startY);
87
104
  const moveThreshold = 5;
88
105
  if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {
106
+ // Check for anchor disconnect threshold on lines
107
+ this.checkAndDisconnectAnchors(clientX, clientY);
89
108
  selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);
90
109
  this.dragStartX = clientX;
91
110
  this.dragStartY = clientY;
@@ -111,6 +130,8 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
111
130
  const moveThreshold = 5;
112
131
  if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {
113
132
  clearTimeout(this._core.store.state.longTouchTimeout);
133
+ // Check for anchor disconnect threshold on lines
134
+ this.checkAndDisconnectAnchors(x, y);
114
135
  selectionGroup.move(x, y, this.dragStartX, this.dragStartY);
115
136
  this.dragStartX = x;
116
137
  this.dragStartY = y;
@@ -145,5 +166,47 @@ export class KritzelMoveHandler extends KritzelBaseHandler {
145
166
  }
146
167
  this.reset();
147
168
  }
169
+ /**
170
+ * Checks if the total accumulated drag distance exceeds the anchor disconnect threshold.
171
+ * If so, disconnects all anchors from any KritzelLine objects in the selection group.
172
+ * This allows anchored lines to be freely moved after dragging beyond the threshold.
173
+ */
174
+ checkAndDisconnectAnchors(currentX, currentY) {
175
+ const totalDeltaX = currentX - this.initialDragX;
176
+ const totalDeltaY = currentY - this.initialDragY;
177
+ const totalDistance = Math.sqrt(totalDeltaX * totalDeltaX + totalDeltaY * totalDeltaY);
178
+ if (totalDistance < ANCHOR_DISCONNECT_THRESHOLD) {
179
+ return;
180
+ }
181
+ const selectionGroup = this._core.store.selectionGroup;
182
+ if (!selectionGroup) {
183
+ return;
184
+ }
185
+ // Find and disconnect anchors from all anchored lines in the selection
186
+ for (const obj of selectionGroup.objects) {
187
+ // Skip if already disconnected in this drag session
188
+ if (this.disconnectedLineIds.has(obj.id)) {
189
+ continue;
190
+ }
191
+ // Check if this is a line with anchors
192
+ if (obj instanceof KritzelLine) {
193
+ const line = obj;
194
+ const hasAnchors = line.startAnchor || line.endAnchor;
195
+ if (hasAnchors) {
196
+ // Disconnect both anchors
197
+ if (line.startAnchor) {
198
+ this._core.anchorManager.removeAnchor(line.id, 'start');
199
+ }
200
+ if (line.endAnchor) {
201
+ this._core.anchorManager.removeAnchor(line.id, 'end');
202
+ }
203
+ // Mark as disconnected so we don't try again
204
+ this.disconnectedLineIds.add(line.id);
205
+ // Update the line to persist the change
206
+ this._core.store.state.objects.update(line);
207
+ }
208
+ }
209
+ }
210
+ }
148
211
  }
149
212
  //# sourceMappingURL=move.handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"move.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/move.handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IACxD,UAAU,CAAS;IACnB,UAAU,CAAS;IAEnB,MAAM,CAAS;IACf,MAAM,CAAS;IAEf,IAAI,CAAS;IACb,IAAI,CAAS;IAEb,QAAQ,GAAY,KAAK,CAAC;IAClB,gBAAgB,GAAkB,IAAI,CAAC;IAE/C,YAAY,IAAiB;QAC3B,KAAK,CAAC,IAAI,CAAC,CAAC;IACd,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,iBAAiB,CAAC,KAAmB;QACnC,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;gBACvD,IAAI,cAAc,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;oBACrL,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBACzD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;oBAEzD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;oBACzC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;oBAC1B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;oBAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC9B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAE5E,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBACrC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC7B,OAAO;gBACT,CAAC;gBAED,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;gBACvD,IAAI,cAAc,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,EAAE,CAAC;oBACrL,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAE3E,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;oBAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;oBAChB,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC/B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,KAAmB;QACnC,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;YACvD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC;gBACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;gBACzD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;gBAEzD,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;gBACpB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;gBAEpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBACnD,MAAM,aAAa,GAAG,CAAC,CAAC;gBAExB,IAAI,UAAU,GAAG,aAAa,IAAI,UAAU,GAAG,aAAa,EAAE,CAAC;oBAE7D,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAExE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;oBAC1B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;oBAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC;YAEvD,IACE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;gBAC1C,cAAc;gBACd,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB;gBAC9C,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB;gBAChD,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EACjC,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC3E,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAE3E,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC;gBACzC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBACd,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;gBAEd,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,aAAa,GAAG,CAAC,CAAC;gBAExB,IAAI,UAAU,GAAG,aAAa,IAAI,UAAU,GAAG,aAAa,EAAE,CAAC;oBAC7D,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;oBAEtD,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;oBAE5D,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;oBACpB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe,CAAC,KAAmB;QACjC,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,IAAI,CAAC,gBAAgB,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;gBAE1C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;oBACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC;gBAE1C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;oBACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;oBACtC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nexport class KritzelMoveHandler extends KritzelBaseHandler {\r\n dragStartX: number;\r\n dragStartY: number;\r\n\r\n startX: number;\r\n startY: number;\r\n\r\n endX: number;\r\n endY: number;\r\n\r\n hasMoved: boolean = false;\r\n private trackedPointerId: number | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.dragStartX = 0;\r\n this.dragStartY = 0;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.endX = 0;\r\n this.endY = 0;\r\n this.hasMoved = false;\r\n this.trackedPointerId = null;\r\n }\r\n\r\n cancelPendingDrag(): void {\r\n this._core.store.state.isDragging = false;\r\n this.reset();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isDragging = true;\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.startX = this.dragStartX;\r\n this.startY = this.dragStartY;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (this._core.store.state.pointers.size === 1) {\r\n if (this._core.store.state.isScaling) {\r\n this.trackedPointerId = null;\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.startX = x;\r\n this.startY = y;\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isDragging && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this.endX = clientX;\r\n this.endY = clientY;\r\n\r\n const moveDeltaX = Math.abs(clientX - this.startX);\r\n const moveDeltaY = Math.abs(clientY - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n\r\n selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (\r\n this._core.store.state.pointers.size === 1 &&\r\n selectionGroup &&\r\n !this._core.store.state.isResizeHandleSelected &&\r\n !this._core.store.state.isRotationHandleSelected &&\r\n !this._core.store.state.isScaling\r\n ) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isDragging = true;\r\n this.endX = x;\r\n this.endY = y;\r\n\r\n const moveDeltaX = Math.abs(x - this.startX);\r\n const moveDeltaY = Math.abs(y - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n\r\n selectionGroup.move(x, y, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n this.reset();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"move.handler.js","sourceRoot":"","sources":["../../../src/classes/handlers/move.handler.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelEventHelper } from '../../helpers/event.helper';\r\nimport { KritzelBaseHandler } from './base.handler';\r\nimport { KritzelCore } from '../core/core.class';\r\nimport { KritzelLine } from '../objects/line.class';\r\n\r\n/** Threshold in screen pixels for disconnecting anchored lines during drag */\r\nconst ANCHOR_DISCONNECT_THRESHOLD = 30;\r\n\r\nexport class KritzelMoveHandler extends KritzelBaseHandler {\r\n dragStartX: number;\r\n dragStartY: number;\r\n\r\n startX: number;\r\n startY: number;\r\n\r\n endX: number;\r\n endY: number;\r\n\r\n /** Initial position when drag started (for calculating total accumulated distance) */\r\n private initialDragX: number = 0;\r\n private initialDragY: number = 0;\r\n\r\n /** Set of line IDs that have been disconnected from anchors during this drag */\r\n private disconnectedLineIds: Set<string> = new Set();\r\n\r\n hasMoved: boolean = false;\r\n private trackedPointerId: number | null = null;\r\n\r\n constructor(core: KritzelCore) {\r\n super(core);\r\n }\r\n\r\n private reset() {\r\n this.dragStartX = 0;\r\n this.dragStartY = 0;\r\n this.startX = 0;\r\n this.startY = 0;\r\n this.endX = 0;\r\n this.endY = 0;\r\n this.initialDragX = 0;\r\n this.initialDragY = 0;\r\n this.disconnectedLineIds.clear();\r\n this.hasMoved = false;\r\n this.trackedPointerId = null;\r\n }\r\n\r\n cancelPendingDrag(): void {\r\n this._core.store.state.isDragging = false;\r\n this.reset();\r\n }\r\n\r\n handlePointerDown(event: PointerEvent) {\r\n if (event.pointerType === 'mouse') {\r\n if (KritzelEventHelper.isLeftClick(event)) {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this._core.store.state.isDragging = true;\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.startX = this.dragStartX;\r\n this.startY = this.dragStartY;\r\n this.initialDragX = clientX;\r\n this.initialDragY = clientY;\r\n this.disconnectedLineIds.clear();\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n\r\n if (this._core.store.state.pointers.size === 1) {\r\n if (this._core.store.state.isScaling) {\r\n this.trackedPointerId = null;\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (selectionGroup?.isSelected && !this._core.store.state.isResizeHandleSelected && !this._core.store.state.isRotationHandleSelected && !this._core.store.state.isLineHandleSelected) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.startX = x;\r\n this.startY = y;\r\n this.initialDragX = x;\r\n this.initialDragY = y;\r\n this.disconnectedLineIds.clear();\r\n this.trackedPointerId = event.pointerId;\r\n } else {\r\n this.trackedPointerId = null;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerMove(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (this._core.store.state.isDragging && selectionGroup) {\r\n const clientX = event.clientX - this._core.store.offsetX;\r\n const clientY = event.clientY - this._core.store.offsetY;\r\n\r\n this.endX = clientX;\r\n this.endY = clientY;\r\n\r\n const moveDeltaX = Math.abs(clientX - this.startX);\r\n const moveDeltaY = Math.abs(clientY - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n // Check for anchor disconnect threshold on lines\r\n this.checkAndDisconnectAnchors(clientX, clientY);\r\n\r\n selectionGroup.move(clientX, clientY, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = clientX;\r\n this.dragStartY = clientY;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n const activePointers = Array.from(this._core.store.state.pointers.values());\r\n const selectionGroup = this._core.store.selectionGroup;\r\n\r\n if (\r\n this._core.store.state.pointers.size === 1 &&\r\n selectionGroup &&\r\n !this._core.store.state.isResizeHandleSelected &&\r\n !this._core.store.state.isRotationHandleSelected &&\r\n !this._core.store.state.isScaling\r\n ) {\r\n const x = Math.round(activePointers[0].clientX - this._core.store.offsetX);\r\n const y = Math.round(activePointers[0].clientY - this._core.store.offsetY);\r\n\r\n this._core.store.state.isDragging = true;\r\n this.endX = x;\r\n this.endY = y;\r\n\r\n const moveDeltaX = Math.abs(x - this.startX);\r\n const moveDeltaY = Math.abs(y - this.startY);\r\n const moveThreshold = 5;\r\n\r\n if (moveDeltaX > moveThreshold || moveDeltaY > moveThreshold) {\r\n clearTimeout(this._core.store.state.longTouchTimeout);\r\n\r\n // Check for anchor disconnect threshold on lines\r\n this.checkAndDisconnectAnchors(x, y);\r\n\r\n selectionGroup.move(x, y, this.dragStartX, this.dragStartY);\r\n\r\n this.dragStartX = x;\r\n this.dragStartY = y;\r\n this.hasMoved = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n handlePointerUp(event: PointerEvent) {\r\n if (this.trackedPointerId === null || this.trackedPointerId !== event.pointerId) {\r\n return;\r\n }\r\n\r\n if (event.pointerType === 'mouse') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n if (event.pointerType === 'touch') {\r\n if (this._core.store.state.isDragging) {\r\n this._core.store.state.isDragging = false;\r\n\r\n if (this.hasMoved) {\r\n this._core.store.selectionGroup.update();\r\n this._core.engine.emitObjectsChange();\r\n this._core.store.state.hasObjectsChanged = true;\r\n }\r\n }\r\n }\r\n\r\n this.reset();\r\n }\r\n\r\n /**\r\n * Checks if the total accumulated drag distance exceeds the anchor disconnect threshold.\r\n * If so, disconnects all anchors from any KritzelLine objects in the selection group.\r\n * This allows anchored lines to be freely moved after dragging beyond the threshold.\r\n */\r\n private checkAndDisconnectAnchors(currentX: number, currentY: number): void {\r\n const totalDeltaX = currentX - this.initialDragX;\r\n const totalDeltaY = currentY - this.initialDragY;\r\n const totalDistance = Math.sqrt(totalDeltaX * totalDeltaX + totalDeltaY * totalDeltaY);\r\n\r\n if (totalDistance < ANCHOR_DISCONNECT_THRESHOLD) {\r\n return;\r\n }\r\n\r\n const selectionGroup = this._core.store.selectionGroup;\r\n if (!selectionGroup) {\r\n return;\r\n }\r\n\r\n // Find and disconnect anchors from all anchored lines in the selection\r\n for (const obj of selectionGroup.objects) {\r\n // Skip if already disconnected in this drag session\r\n if (this.disconnectedLineIds.has(obj.id)) {\r\n continue;\r\n }\r\n\r\n // Check if this is a line with anchors\r\n if (obj instanceof KritzelLine) {\r\n const line = obj;\r\n const hasAnchors = line.startAnchor || line.endAnchor;\r\n\r\n if (hasAnchors) {\r\n // Disconnect both anchors\r\n if (line.startAnchor) {\r\n this._core.anchorManager.removeAnchor(line.id, 'start');\r\n }\r\n if (line.endAnchor) {\r\n this._core.anchorManager.removeAnchor(line.id, 'end');\r\n }\r\n\r\n // Mark as disconnected so we don't try again\r\n this.disconnectedLineIds.add(line.id);\r\n\r\n // Update the line to persist the change\r\n this._core.store.state.objects.update(line);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -18,6 +18,7 @@ export class KritzelRotationHandler extends KritzelBaseHandler {
18
18
  if (KritzelEventHelper.isLeftClick(event)) {
19
19
  const selectionGroup = this._core.store.selectionGroup;
20
20
  if (selectionGroup && this._core.store.state.isRotationHandleSelected) {
21
+ selectionGroup.beginTransform();
21
22
  const clientX = event.clientX - this._core.store.offsetX;
22
23
  const clientY = event.clientY - this._core.store.offsetY;
23
24
  this._core.store.state.isRotating = true;
@@ -41,6 +42,7 @@ export class KritzelRotationHandler extends KritzelBaseHandler {
41
42
  if (activePointers.length === 1) {
42
43
  const selectionGroup = this._core.store.selectionGroup;
43
44
  if (selectionGroup && this._core.store.state.isRotationHandleSelected) {
45
+ selectionGroup.beginTransform();
44
46
  const clientX = Math.round(firstTouch.clientX - this._core.store.offsetX);
45
47
  const clientY = Math.round(firstTouch.clientY - this._core.store.offsetY);
46
48
  this._core.store.state.isRotating = true;