kritzel-stencil 0.0.167 → 0.0.169
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.
- package/dist/cjs/{default-line-tool.config-BNBO4I1t.js → default-line-tool.config-Bs88k0jE.js} +11 -2
- package/dist/cjs/default-line-tool.config-Bs88k0jE.js.map +1 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/kritzel-color_22.cjs.entry.js +1 -1
- package/dist/collection/classes/objects/selection-group.class.js +10 -0
- package/dist/collection/classes/objects/selection-group.class.js.map +1 -1
- package/dist/components/index.js +2 -2
- package/dist/components/kritzel-editor.js +1 -1
- package/dist/components/kritzel-engine.js +1 -1
- package/dist/components/{p-CIXaR1a8.js → p-f_ut_1_F.js} +11 -2
- package/dist/components/p-f_ut_1_F.js.map +1 -0
- package/dist/esm/{default-line-tool.config-DJ488kil.js → default-line-tool.config-PvsWHpO2.js} +11 -2
- package/dist/esm/default-line-tool.config-PvsWHpO2.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/kritzel-color_22.entry.js +1 -1
- package/dist/stencil/index.esm.js +1 -1
- package/dist/stencil/{p-a9f3c47e.entry.js → p-9913896b.entry.js} +2 -2
- package/dist/stencil/{p-DJ488kil.js → p-PvsWHpO2.js} +2 -2
- package/dist/stencil/p-PvsWHpO2.js.map +1 -0
- package/dist/stencil/stencil.esm.js +1 -1
- package/package.json +1 -1
- package/dist/cjs/default-line-tool.config-BNBO4I1t.js.map +0 -1
- package/dist/components/p-CIXaR1a8.js.map +0 -1
- package/dist/esm/default-line-tool.config-DJ488kil.js.map +0 -1
- package/dist/stencil/p-DJ488kil.js.map +0 -1
- /package/dist/stencil/{p-a9f3c47e.entry.js.map → p-9913896b.entry.js.map} +0 -0
package/dist/cjs/index.cjs.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var index = require('./index-Cj__YTlG.js');
|
|
4
|
-
var defaultLineTool_config = require('./default-line-tool.config-
|
|
4
|
+
var defaultLineTool_config = require('./default-line-tool.config-Bs88k0jE.js');
|
|
5
5
|
|
|
6
6
|
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
7
7
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { KritzelGeometryHelper } from "../../helpers/geometry.helper";
|
|
1
2
|
import { KritzelBaseObject } from "./base-object.class";
|
|
2
3
|
export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
3
4
|
__class__ = 'KritzelSelectionGroup';
|
|
@@ -302,6 +303,15 @@ export class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
302
303
|
return objCenterY - groupCenterY;
|
|
303
304
|
}
|
|
304
305
|
hitTest(x, y) {
|
|
306
|
+
const containsOnlyLines = this.objects.every(obj => obj.__class__ === 'KritzelLine');
|
|
307
|
+
if (containsOnlyLines) {
|
|
308
|
+
return this.objects.some(obj => obj.hitTest(x, y));
|
|
309
|
+
}
|
|
310
|
+
const polygon = this.rotatedPolygon;
|
|
311
|
+
const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
|
|
312
|
+
if (KritzelGeometryHelper.isPointInPolygon({ x, y }, polyPoints)) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
305
315
|
return this.objects.some(obj => obj.hitTest(x, y));
|
|
306
316
|
}
|
|
307
317
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-group.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelBaseObject } from './base-object.class';\r\n\r\ninterface UnchangedObjectSnapshot {\r\n id: string;\r\n translateX: number;\r\n translateY: number;\r\n rotation: number;\r\n width: number;\r\n height: number;\r\n totalWidth: number;\r\n totalHeight: number;\r\n scale: number;\r\n}\r\n\r\nexport class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelSelectionGroup';\r\n\r\n // Store only object IDs instead of full objects\r\n objectIds: string[] = [];\r\n\r\n // Store snapshots of object state for transformations (rotation, resize)\r\n unchangedObjectSnapshots: Map<string, UnchangedObjectSnapshot> = new Map();\r\n snapshotRotation: number = 0;\r\n\r\n minX: number;\r\n maxX: number;\r\n\r\n minY: number;\r\n maxY: number;\r\n\r\n // Getter to retrieve actual objects from the store by their IDs\r\n get objects(): KritzelBaseObject<any>[] {\r\n return this.objectIds\r\n .map(id => {\r\n const found = this._core.store.state.objects.filter(obj => obj.id === id);\r\n return found.length > 0 ? found[0] : null;\r\n })\r\n .filter(obj => obj !== null) as KritzelBaseObject<any>[];\r\n }\r\n\r\n get length(): number {\r\n return this.objectIds.length;\r\n }\r\n\r\n static override create(core: KritzelCore): KritzelSelectionGroup {\r\n const object = new KritzelSelectionGroup();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.scale = core.store.state.scale;\r\n object.zIndex = 99999;\r\n\r\n return object;\r\n }\r\n\r\n addOrRemove(object: KritzelBaseObject<any>) {\r\n const index = this.objectIds.findIndex(id => id === object.id);\r\n if (index === -1) {\r\n this.objectIds.push(object.id);\r\n } else {\r\n this.objectIds.splice(index, 1);\r\n }\r\n\r\n this.captureUnchangedSnapshots();\r\n this.refreshObjectDimensions();\r\n }\r\n\r\n deselectAllChildren() {\r\n this.objects.forEach(obj => (obj.isSelected = false));\r\n }\r\n\r\n updateWorkspaceId(workspaceId: string) {\r\n this.workspaceId = workspaceId;\r\n this.objects.forEach(obj => (obj.workspaceId = workspaceId));\r\n }\r\n\r\n updateZIndices(startZIndex: number) {\r\n this.objects.forEach((obj, i) => {\r\n obj.zIndex = startZIndex + i;\r\n });\r\n }\r\n\r\n updatePosition(x: number, y: number) {\r\n this.objects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.updatePosition(x + deltaX, y + deltaY);\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n const deltaX = snapshot.translateX - this.translateX;\r\n const deltaY = snapshot.translateY - this.translateY;\r\n snapshot.translateX = x + deltaX;\r\n snapshot.translateY = y + deltaY;\r\n });\r\n\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n /**\r\n * Capture snapshots of current object states for undo/redo operations\r\n */\r\n private captureUnchangedSnapshots(): void {\r\n this.unchangedObjectSnapshots.clear();\r\n this.snapshotRotation = this.rotation;\r\n this.objects.forEach(obj => {\r\n this.unchangedObjectSnapshots.set(obj.id, {\r\n id: obj.id,\r\n translateX: obj.translateX,\r\n translateY: obj.translateY,\r\n rotation: obj.rotation,\r\n width: obj.width,\r\n height: obj.height,\r\n totalWidth: obj.totalWidth,\r\n totalHeight: obj.totalHeight,\r\n scale: obj.scale,\r\n });\r\n });\r\n }\r\n\r\n override serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, unchangedObjectSnapshots, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {\r\n clonedProps.element = element.cloneNode(true) as HTMLElement;\r\n }\r\n\r\n // Convert Map to plain object for serialization\r\n clonedProps.unchangedObjectSnapshots = Object.fromEntries(this.unchangedObjectSnapshots);\r\n\r\n return clonedProps;\r\n }\r\n\r\n override deserialize<T>(object: any): T {\r\n // First, deserialize all base properties using parent's deserialize\r\n super.deserialize(object);\r\n\r\n // Restore the Map from serialized object\r\n if (object.unchangedObjectSnapshots) {\r\n this.unchangedObjectSnapshots = new Map(Object.entries(object.unchangedObjectSnapshots));\r\n }\r\n\r\n return this as unknown as T;\r\n }\r\n\r\n override update(): void {\r\n // Only update the selection group itself\r\n // Child objects are already updated during move/resize/rotate operations\r\n // Updating them again here would create redundant y.js updates\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._core.store.state.scale;\r\n const deltaY = (startY - endY) / this._core.store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(obj => {\r\n obj.move(startX, startY, endX, endY);\r\n\r\n // Update any lines that are anchored to this object\r\n this._core.anchorManager.updateAnchorsForObject(obj.id);\r\n });\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n snapshot.translateX += deltaX;\r\n snapshot.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n // Calculate old center\r\n const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n // Calculate new center\r\n const newTotalWidth = width + this.padding * 2;\r\n const newTotalHeight = height + this.padding * 2;\r\n const newCenterX = x + newTotalWidth / 2 / this.scale;\r\n const newCenterY = y + newTotalHeight / 2 / this.scale;\r\n\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this.objects.forEach(child => {\r\n // Calculate child center\r\n const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;\r\n const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;\r\n\r\n // Vector from old group center to child center\r\n const dx = childCenterX - oldCenterX;\r\n const dy = childCenterY - oldCenterY;\r\n\r\n // Rotate to local space (align with group axes)\r\n const localX = dx * cos - dy * sin;\r\n const localY = dx * sin + dy * cos;\r\n\r\n // Scale in local space\r\n const scaledLocalX = localX * widthScaleFactor;\r\n const scaledLocalY = localY * heightScaleFactor;\r\n\r\n // Rotate back to world space\r\n const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;\r\n const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;\r\n\r\n // New child center\r\n const newChildCenterX = newCenterX + rotatedX;\r\n const newChildCenterY = newCenterY + rotatedY;\r\n\r\n // New child top-left\r\n // Calculate relative rotation\r\n const relativeRotation = child.rotation - rotation;\r\n const cosRel = Math.cos(relativeRotation);\r\n const sinRel = Math.sin(relativeRotation);\r\n\r\n // Project the group's scale factors onto the child's local axes\r\n // We use absolute values because scaling is magnitude-based\r\n // If the child is aligned (0 deg), cos=1, sin=0 -> scales match\r\n // If the child is 90 deg, cos=0, sin=1 -> scales swap\r\n const newChildWidthScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2)\r\n );\r\n const newChildHeightScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2)\r\n );\r\n\r\n const updatedWidth = child.width * newChildWidthScale;\r\n const updatedHeight = child.height * newChildHeightScale;\r\n const updatedTotalWidth = updatedWidth + child.padding * 2;\r\n const updatedTotalHeight = updatedHeight + child.padding * 2;\r\n\r\n const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;\r\n const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n // Update any lines that are anchored to this child object\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n\r\n // Refresh dimensions and update the SelectionGroup to propagate changes to other tabs\r\n this.refreshObjectDimensions();\r\n this.captureUnchangedSnapshots();\r\n this._core.store.state.objects.update(this);\r\n });\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value - this.snapshotRotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n // Update the SelectionGroup itself to propagate rotation to other tabs\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(child => {\r\n const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);\r\n if (!unchangedSnapshot) return;\r\n\r\n const offsetX = this.getOffsetXToCenterFromSnapshot(unchangedSnapshot);\r\n const offsetY = this.getOffsetYToCenterFromSnapshot(unchangedSnapshot);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.objects.length === 1 ? value : unchangedSnapshot.rotation + angle);\r\n });\r\n });\r\n }\r\n\r\n override copy(): KritzelBaseObject<HTMLElement> {\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n\r\n this.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .forEach(obj => {\r\n const copiedObject = obj.copy() as KritzelBaseObject<any>;\r\n selectionGroup.addOrRemove(copiedObject);\r\n });\r\n\r\n selectionGroup.captureUnchangedSnapshots();\r\n\r\n if (this.objects.length === 1) {\r\n selectionGroup.rotation = this.objects[0].rotation;\r\n }\r\n\r\n return selectionGroup;\r\n }\r\n\r\n refreshObjectDimensions() {\r\n if (this.objects.length === 1) {\r\n const obj = this.objects[0];\r\n this.minX = obj.boundingBox.x / this.scale;\r\n this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;\r\n this.minY = obj.boundingBox.y / this.scale;\r\n this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;\r\n\r\n this.translateX = (this.minX - this.padding) * this.scale;\r\n this.translateY = (this.minY - this.padding) * this.scale;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n } else {\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n this.objects.forEach(obj => {\r\n const polygon = obj.rotatedPolygon;\r\n const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n corners.forEach(corner => {\r\n // Rotate corner into local space (aligned with group rotation)\r\n const rx = corner.x * cos - corner.y * sin;\r\n const ry = corner.x * sin + corner.y * cos;\r\n\r\n if (rx < minX) minX = rx;\r\n if (rx > maxX) maxX = rx;\r\n if (ry < minY) minY = ry;\r\n if (ry > maxY) maxY = ry;\r\n });\r\n });\r\n\r\n // Dimensions in world units (unrotated)\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxY - minY;\r\n\r\n this.width = (worldWidth - this.padding) * this.scale;\r\n this.height = (worldHeight - this.padding) * this.scale;\r\n\r\n // Center of the box in rotated space\r\n const cRx = (minX + maxX) / 2;\r\n const cRy = (minY + maxY) / 2;\r\n\r\n // Rotate center back to world space\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n const cx = cRx * cosR - cRy * sinR;\r\n const cy = cRx * sinR + cRy * cosR;\r\n\r\n this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;\r\n this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;\r\n }\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private getOffsetXToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterX = snapshot.translateX + snapshot.totalWidth / snapshot.scale / 2;\r\n const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;\r\n return objCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterY = snapshot.translateY + snapshot.totalHeight / snapshot.scale / 2;\r\n const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;\r\n return objCenterY - groupCenterY;\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"selection-group.class.js","sourceRoot":"","sources":["../../../src/classes/objects/selection-group.class.ts"],"names":[],"mappings":"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","sourcesContent":["import { KritzelCore } from '../core/core.class';\r\nimport { KritzelGeometryHelper } from '../../helpers/geometry.helper';\r\nimport { KritzelBaseObject } from './base-object.class';\r\n\r\ninterface UnchangedObjectSnapshot {\r\n id: string;\r\n translateX: number;\r\n translateY: number;\r\n rotation: number;\r\n width: number;\r\n height: number;\r\n totalWidth: number;\r\n totalHeight: number;\r\n scale: number;\r\n}\r\n\r\nexport class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement> {\r\n override __class__: string = 'KritzelSelectionGroup';\r\n\r\n // Store only object IDs instead of full objects\r\n objectIds: string[] = [];\r\n\r\n // Store snapshots of object state for transformations (rotation, resize)\r\n unchangedObjectSnapshots: Map<string, UnchangedObjectSnapshot> = new Map();\r\n snapshotRotation: number = 0;\r\n\r\n minX: number;\r\n maxX: number;\r\n\r\n minY: number;\r\n maxY: number;\r\n\r\n // Getter to retrieve actual objects from the store by their IDs\r\n get objects(): KritzelBaseObject<any>[] {\r\n return this.objectIds\r\n .map(id => {\r\n const found = this._core.store.state.objects.filter(obj => obj.id === id);\r\n return found.length > 0 ? found[0] : null;\r\n })\r\n .filter(obj => obj !== null) as KritzelBaseObject<any>[];\r\n }\r\n\r\n get length(): number {\r\n return this.objectIds.length;\r\n }\r\n\r\n static override create(core: KritzelCore): KritzelSelectionGroup {\r\n const object = new KritzelSelectionGroup();\r\n\r\n object._core = core;\r\n object.id = object.generateId();\r\n object.workspaceId = core.store.state.activeWorkspace.id;\r\n object.scale = core.store.state.scale;\r\n object.zIndex = 99999;\r\n\r\n return object;\r\n }\r\n\r\n addOrRemove(object: KritzelBaseObject<any>) {\r\n const index = this.objectIds.findIndex(id => id === object.id);\r\n if (index === -1) {\r\n this.objectIds.push(object.id);\r\n } else {\r\n this.objectIds.splice(index, 1);\r\n }\r\n\r\n this.captureUnchangedSnapshots();\r\n this.refreshObjectDimensions();\r\n }\r\n\r\n deselectAllChildren() {\r\n this.objects.forEach(obj => (obj.isSelected = false));\r\n }\r\n\r\n updateWorkspaceId(workspaceId: string) {\r\n this.workspaceId = workspaceId;\r\n this.objects.forEach(obj => (obj.workspaceId = workspaceId));\r\n }\r\n\r\n updateZIndices(startZIndex: number) {\r\n this.objects.forEach((obj, i) => {\r\n obj.zIndex = startZIndex + i;\r\n });\r\n }\r\n\r\n updatePosition(x: number, y: number) {\r\n this.objects.forEach(obj => {\r\n const deltaX = obj.translateX - this.translateX;\r\n const deltaY = obj.translateY - this.translateY;\r\n obj.updatePosition(x + deltaX, y + deltaY);\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n const deltaX = snapshot.translateX - this.translateX;\r\n const deltaY = snapshot.translateY - this.translateY;\r\n snapshot.translateX = x + deltaX;\r\n snapshot.translateY = y + deltaY;\r\n });\r\n\r\n this.translateX = x;\r\n this.translateY = y;\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n /**\r\n * Capture snapshots of current object states for undo/redo operations\r\n */\r\n private captureUnchangedSnapshots(): void {\r\n this.unchangedObjectSnapshots.clear();\r\n this.snapshotRotation = this.rotation;\r\n this.objects.forEach(obj => {\r\n this.unchangedObjectSnapshots.set(obj.id, {\r\n id: obj.id,\r\n translateX: obj.translateX,\r\n translateY: obj.translateY,\r\n rotation: obj.rotation,\r\n width: obj.width,\r\n height: obj.height,\r\n totalWidth: obj.totalWidth,\r\n totalHeight: obj.totalHeight,\r\n scale: obj.scale,\r\n });\r\n });\r\n }\r\n\r\n override serialize() {\r\n const { _core, _elementRef, element, totalWidth, totalHeight, unchangedObjectSnapshots, ...remainingProps } = this as any;\r\n\r\n const clonedProps = structuredClone(remainingProps);\r\n\r\n if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {\r\n clonedProps.element = element.cloneNode(true) as HTMLElement;\r\n }\r\n\r\n // Convert Map to plain object for serialization\r\n clonedProps.unchangedObjectSnapshots = Object.fromEntries(this.unchangedObjectSnapshots);\r\n\r\n return clonedProps;\r\n }\r\n\r\n override deserialize<T>(object: any): T {\r\n // First, deserialize all base properties using parent's deserialize\r\n super.deserialize(object);\r\n\r\n // Restore the Map from serialized object\r\n if (object.unchangedObjectSnapshots) {\r\n this.unchangedObjectSnapshots = new Map(Object.entries(object.unchangedObjectSnapshots));\r\n }\r\n\r\n return this as unknown as T;\r\n }\r\n\r\n override update(): void {\r\n // Only update the selection group itself\r\n // Child objects are already updated during move/resize/rotate operations\r\n // Updating them again here would create redundant y.js updates\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n override move(startX: number, startY: number, endX: number, endY: number): void {\r\n const deltaX = (startX - endX) / this._core.store.state.scale;\r\n const deltaY = (startY - endY) / this._core.store.state.scale;\r\n\r\n this.translateX += deltaX;\r\n this.translateY += deltaY;\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(obj => {\r\n obj.move(startX, startY, endX, endY);\r\n\r\n // Update any lines that are anchored to this object\r\n this._core.anchorManager.updateAnchorsForObject(obj.id);\r\n });\r\n });\r\n\r\n // Update snapshots\r\n this.unchangedObjectSnapshots.forEach(snapshot => {\r\n snapshot.translateX += deltaX;\r\n snapshot.translateY += deltaY;\r\n });\r\n }\r\n\r\n override resize(x: number, y: number, width: number, height: number): void {\r\n const widthScaleFactor = width / this.width;\r\n const heightScaleFactor = height / this.height;\r\n\r\n // Calculate old center\r\n const oldCenterX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const oldCenterY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n // Calculate new center\r\n const newTotalWidth = width + this.padding * 2;\r\n const newTotalHeight = height + this.padding * 2;\r\n const newCenterX = x + newTotalWidth / 2 / this.scale;\r\n const newCenterY = y + newTotalHeight / 2 / this.scale;\r\n\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n this.objects.forEach(child => {\r\n // Calculate child center\r\n const childCenterX = child.translateX + child.totalWidth / 2 / child.scale;\r\n const childCenterY = child.translateY + child.totalHeight / 2 / child.scale;\r\n\r\n // Vector from old group center to child center\r\n const dx = childCenterX - oldCenterX;\r\n const dy = childCenterY - oldCenterY;\r\n\r\n // Rotate to local space (align with group axes)\r\n const localX = dx * cos - dy * sin;\r\n const localY = dx * sin + dy * cos;\r\n\r\n // Scale in local space\r\n const scaledLocalX = localX * widthScaleFactor;\r\n const scaledLocalY = localY * heightScaleFactor;\r\n\r\n // Rotate back to world space\r\n const rotatedX = scaledLocalX * cosR - scaledLocalY * sinR;\r\n const rotatedY = scaledLocalX * sinR + scaledLocalY * cosR;\r\n\r\n // New child center\r\n const newChildCenterX = newCenterX + rotatedX;\r\n const newChildCenterY = newCenterY + rotatedY;\r\n\r\n // New child top-left\r\n // Calculate relative rotation\r\n const relativeRotation = child.rotation - rotation;\r\n const cosRel = Math.cos(relativeRotation);\r\n const sinRel = Math.sin(relativeRotation);\r\n\r\n // Project the group's scale factors onto the child's local axes\r\n // We use absolute values because scaling is magnitude-based\r\n // If the child is aligned (0 deg), cos=1, sin=0 -> scales match\r\n // If the child is 90 deg, cos=0, sin=1 -> scales swap\r\n const newChildWidthScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * cosRel, 2) + Math.pow(heightScaleFactor * sinRel, 2)\r\n );\r\n const newChildHeightScale = Math.sqrt(\r\n Math.pow(widthScaleFactor * sinRel, 2) + Math.pow(heightScaleFactor * cosRel, 2)\r\n );\r\n\r\n const updatedWidth = child.width * newChildWidthScale;\r\n const updatedHeight = child.height * newChildHeightScale;\r\n const updatedTotalWidth = updatedWidth + child.padding * 2;\r\n const updatedTotalHeight = updatedHeight + child.padding * 2;\r\n\r\n const updatedX = newChildCenterX - updatedTotalWidth / 2 / child.scale;\r\n const updatedY = newChildCenterY - updatedTotalHeight / 2 / child.scale;\r\n\r\n child.resize(updatedX, updatedY, updatedWidth, updatedHeight);\r\n\r\n // Update any lines that are anchored to this child object\r\n this._core.anchorManager.updateAnchorsForObject(child.id);\r\n });\r\n\r\n // Refresh dimensions and update the SelectionGroup to propagate changes to other tabs\r\n this.refreshObjectDimensions();\r\n this.captureUnchangedSnapshots();\r\n this._core.store.state.objects.update(this);\r\n });\r\n }\r\n\r\n override rotate(value: number): void {\r\n this.rotation = value;\r\n\r\n const centerX = this.translateX + this.totalWidth / 2 / this.scale;\r\n const centerY = this.translateY + this.totalHeight / 2 / this.scale;\r\n\r\n const angle = value - this.snapshotRotation;\r\n const cos = Math.cos(angle);\r\n const sin = Math.sin(angle);\r\n\r\n this._core.store.state.objects.transaction(() => {\r\n // Update the SelectionGroup itself to propagate rotation to other tabs\r\n this._core.store.state.objects.update(this);\r\n\r\n this.objects.forEach(child => {\r\n const unchangedSnapshot = this.unchangedObjectSnapshots.get(child.id);\r\n if (!unchangedSnapshot) return;\r\n\r\n const offsetX = this.getOffsetXToCenterFromSnapshot(unchangedSnapshot);\r\n const offsetY = this.getOffsetYToCenterFromSnapshot(unchangedSnapshot);\r\n\r\n const rotatedX = cos * offsetX - sin * offsetY;\r\n const rotatedY = sin * offsetX + cos * offsetY;\r\n\r\n child.translateX = centerX + rotatedX - child.totalWidth / 2 / child.scale;\r\n child.translateY = centerY + rotatedY - child.totalHeight / 2 / child.scale;\r\n\r\n child.rotate(this.objects.length === 1 ? value : unchangedSnapshot.rotation + angle);\r\n });\r\n });\r\n }\r\n\r\n override copy(): KritzelBaseObject<HTMLElement> {\r\n const selectionGroup = KritzelSelectionGroup.create(this._core);\r\n\r\n this.objects\r\n .sort((a, b) => a.zIndex - b.zIndex)\r\n .forEach(obj => {\r\n const copiedObject = obj.copy() as KritzelBaseObject<any>;\r\n selectionGroup.addOrRemove(copiedObject);\r\n });\r\n\r\n selectionGroup.captureUnchangedSnapshots();\r\n\r\n if (this.objects.length === 1) {\r\n selectionGroup.rotation = this.objects[0].rotation;\r\n }\r\n\r\n return selectionGroup;\r\n }\r\n\r\n refreshObjectDimensions() {\r\n if (this.objects.length === 1) {\r\n const obj = this.objects[0];\r\n this.minX = obj.boundingBox.x / this.scale;\r\n this.maxX = obj.boundingBox.x / this.scale + obj.boundingBox.width;\r\n this.minY = obj.boundingBox.y / this.scale;\r\n this.maxY = obj.boundingBox.y / this.scale + obj.boundingBox.height;\r\n\r\n this.translateX = (this.minX - this.padding) * this.scale;\r\n this.translateY = (this.minY - this.padding) * this.scale;\r\n\r\n this.width = (this.maxX - this.minX - this.padding) * this.scale;\r\n this.height = (this.maxY - this.minY - this.padding) * this.scale;\r\n } else {\r\n const rotation = this.rotation;\r\n const cos = Math.cos(-rotation);\r\n const sin = Math.sin(-rotation);\r\n\r\n let minX = Infinity;\r\n let maxX = -Infinity;\r\n let minY = Infinity;\r\n let maxY = -Infinity;\r\n\r\n this.objects.forEach(obj => {\r\n const polygon = obj.rotatedPolygon;\r\n const corners = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n\r\n corners.forEach(corner => {\r\n // Rotate corner into local space (aligned with group rotation)\r\n const rx = corner.x * cos - corner.y * sin;\r\n const ry = corner.x * sin + corner.y * cos;\r\n\r\n if (rx < minX) minX = rx;\r\n if (rx > maxX) maxX = rx;\r\n if (ry < minY) minY = ry;\r\n if (ry > maxY) maxY = ry;\r\n });\r\n });\r\n\r\n // Dimensions in world units (unrotated)\r\n const worldWidth = maxX - minX;\r\n const worldHeight = maxY - minY;\r\n\r\n this.width = (worldWidth - this.padding) * this.scale;\r\n this.height = (worldHeight - this.padding) * this.scale;\r\n\r\n // Center of the box in rotated space\r\n const cRx = (minX + maxX) / 2;\r\n const cRy = (minY + maxY) / 2;\r\n\r\n // Rotate center back to world space\r\n const cosR = Math.cos(rotation);\r\n const sinR = Math.sin(rotation);\r\n\r\n const cx = cRx * cosR - cRy * sinR;\r\n const cy = cRx * sinR + cRy * cosR;\r\n\r\n this.translateX = cx - (this.width / this.scale + 2 * this.padding) / 2;\r\n this.translateY = cy - (this.height / this.scale + 2 * this.padding) / 2;\r\n }\r\n\r\n this._core.store.state.objects.update(this);\r\n }\r\n\r\n private getOffsetXToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterX = snapshot.translateX + snapshot.totalWidth / snapshot.scale / 2;\r\n const groupCenterX = this.translateX + this.totalWidth / this.scale / 2;\r\n return objCenterX - groupCenterX;\r\n }\r\n\r\n private getOffsetYToCenterFromSnapshot(snapshot: UnchangedObjectSnapshot): number {\r\n const objCenterY = snapshot.translateY + snapshot.totalHeight / snapshot.scale / 2;\r\n const groupCenterY = this.translateY + this.totalHeight / this.scale / 2;\r\n return objCenterY - groupCenterY;\r\n }\r\n\r\n override hitTest(x: number, y: number): boolean {\r\n const containsOnlyLines = this.objects.every(obj => obj.__class__ === 'KritzelLine');\r\n if (containsOnlyLines) {\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n\r\n const polygon = this.rotatedPolygon;\r\n const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];\r\n if (KritzelGeometryHelper.isPointInPolygon({ x, y }, polyPoints)) {\r\n return true;\r\n }\r\n\r\n return this.objects.some(obj => obj.hitTest(x, y));\r\n }\r\n}\r\n"]}
|
package/dist/components/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { g as getAssetPath, r as render, s as setAssetPath, a as setNonce, b as setPlatformOptions } from './p-CwkUrTy1.js';
|
|
2
2
|
export { b as KritzelBrushTool, a as KritzelPath, K as KritzelText, c as KritzelTextTool } from './p-Bwv1dxAB.js';
|
|
3
|
-
import { w as writeVarUint, a as writeVarUint8Array, t as toUint8Array, r as readVarUint, b as readVarUint8Array, e as encodeStateAsUpdate, c as applyUpdate, d as encodeStateVector, f as createEncoder, g as createDecoder, s as setIfUndefined, h as create, i as fromBase64, v as varStorage, j as toBase64, o as onChange, k as createUint8ArrayFromArrayBuffer, l as offChange, m as readVarString, O as Observable, n as floor, p as getUnixTime, q as equalityDeep, u as writeVarString, x as map, y as ObservableV2, z as length, A as isNode, B as min, C as pow, H as HocuspocusProvider, D as HocuspocusProviderWebsocket } from './p-
|
|
4
|
-
export { M as IndexedDBSyncProvider, P as KritzelAnchorManager, N as KritzelAppStateMap, J as KritzelCursorHelper, G as KritzelEraserTool, K as KritzelImage, I as KritzelImageTool, E as KritzelLine, F as KritzelLineTool, L as KritzelSelectionTool } from './p-
|
|
3
|
+
import { w as writeVarUint, a as writeVarUint8Array, t as toUint8Array, r as readVarUint, b as readVarUint8Array, e as encodeStateAsUpdate, c as applyUpdate, d as encodeStateVector, f as createEncoder, g as createDecoder, s as setIfUndefined, h as create, i as fromBase64, v as varStorage, j as toBase64, o as onChange, k as createUint8ArrayFromArrayBuffer, l as offChange, m as readVarString, O as Observable, n as floor, p as getUnixTime, q as equalityDeep, u as writeVarString, x as map, y as ObservableV2, z as length, A as isNode, B as min, C as pow, H as HocuspocusProvider, D as HocuspocusProviderWebsocket } from './p-f_ut_1_F.js';
|
|
4
|
+
export { M as IndexedDBSyncProvider, P as KritzelAnchorManager, N as KritzelAppStateMap, J as KritzelCursorHelper, G as KritzelEraserTool, K as KritzelImage, I as KritzelImageTool, E as KritzelLine, F as KritzelLineTool, L as KritzelSelectionTool } from './p-f_ut_1_F.js';
|
|
5
5
|
export { K as KritzelWorkspace } from './p-n789Y3S-.js';
|
|
6
6
|
export { D as DEFAULT_BRUSH_CONFIG, b as DEFAULT_LINE_TOOL_CONFIG, a as DEFAULT_TEXT_CONFIG, KritzelEditor, defineCustomElement as defineCustomElementKritzelEditor } from './kritzel-editor.js';
|
|
7
7
|
export { KritzelBrushStyle, defineCustomElement as defineCustomElementKritzelBrushStyle } from './kritzel-brush-style.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { p as proxyCustomElement, H, c as createEvent, h, d as Host } from './p-CwkUrTy1.js';
|
|
2
2
|
import { K as KritzelIconRegistry, d as defineCustomElement$a } from './p-Cv4BGNPb.js';
|
|
3
|
-
import { S as ShapeType, Q as ABSOLUTE_SCALE_MAX, R as ABSOLUTE_SCALE_MIN, L as KritzelSelectionTool, F as KritzelLineTool, G as KritzelEraserTool, T as KritzelShapeTool, I as KritzelImageTool, U as defineCustomElement$e } from './p-
|
|
3
|
+
import { S as ShapeType, Q as ABSOLUTE_SCALE_MAX, R as ABSOLUTE_SCALE_MIN, L as KritzelSelectionTool, F as KritzelLineTool, G as KritzelEraserTool, T as KritzelShapeTool, I as KritzelImageTool, U as defineCustomElement$e } from './p-f_ut_1_F.js';
|
|
4
4
|
import { b as KritzelBrushTool, c as KritzelTextTool, d as KritzelKeyboardHelper } from './p-Bwv1dxAB.js';
|
|
5
5
|
import { K as KritzelWorkspace } from './p-n789Y3S-.js';
|
|
6
6
|
import { K as KritzelDevicesHelper } from './p-l10It7Nm.js';
|
|
@@ -931,6 +931,15 @@ class KritzelSelectionGroup extends KritzelBaseObject {
|
|
|
931
931
|
return objCenterY - groupCenterY;
|
|
932
932
|
}
|
|
933
933
|
hitTest(x, y) {
|
|
934
|
+
const containsOnlyLines = this.objects.every(obj => obj.__class__ === 'KritzelLine');
|
|
935
|
+
if (containsOnlyLines) {
|
|
936
|
+
return this.objects.some(obj => obj.hitTest(x, y));
|
|
937
|
+
}
|
|
938
|
+
const polygon = this.rotatedPolygon;
|
|
939
|
+
const polyPoints = [polygon.topLeft, polygon.topRight, polygon.bottomRight, polygon.bottomLeft];
|
|
940
|
+
if (KritzelGeometryHelper.isPointInPolygon({ x, y }, polyPoints)) {
|
|
941
|
+
return true;
|
|
942
|
+
}
|
|
934
943
|
return this.objects.some(obj => obj.hitTest(x, y));
|
|
935
944
|
}
|
|
936
945
|
}
|
|
@@ -38981,6 +38990,6 @@ function defineCustomElement() {
|
|
|
38981
38990
|
}
|
|
38982
38991
|
|
|
38983
38992
|
export { isNode as A, min$2 as B, pow as C, HocuspocusProviderWebsocket as D, KritzelLine as E, KritzelLineTool as F, KritzelEraserTool as G, HocuspocusProvider as H, KritzelImageTool as I, KritzelCursorHelper as J, KritzelImage as K, KritzelSelectionTool as L, IndexedDBSyncProvider as M, KritzelAppStateMap as N, Observable$1 as O, KritzelAnchorManager as P, ABSOLUTE_SCALE_MAX as Q, ABSOLUTE_SCALE_MIN as R, ShapeType as S, KritzelShapeTool as T, defineCustomElement as U, KritzelEngine as V, writeVarUint8Array$2 as a, readVarUint8Array$2 as b, applyUpdate as c, encodeStateVector as d, encodeStateAsUpdate as e, createEncoder$1 as f, createDecoder$1 as g, create$8 as h, fromBase64 as i, toBase64 as j, createUint8ArrayFromArrayBuffer as k, offChange as l, readVarString$2 as m, floor$2 as n, onChange as o, getUnixTime$1 as p, equalityDeep$1 as q, readVarUint$2 as r, setIfUndefined$1 as s, toUint8Array$1 as t, writeVarString$2 as u, varStorage as v, writeVarUint$2 as w, map as x, ObservableV2 as y, length$3 as z };
|
|
38984
|
-
//# sourceMappingURL=p-
|
|
38993
|
+
//# sourceMappingURL=p-f_ut_1_F.js.map
|
|
38985
38994
|
|
|
38986
|
-
//# sourceMappingURL=p-
|
|
38995
|
+
//# sourceMappingURL=p-f_ut_1_F.js.map
|