@flowscape-ui/core-sdk 1.0.0 → 1.0.2
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/README.md +130 -70
- package/dist/index.cjs +1 -7347
- package/dist/index.js +1 -7314
- package/package.json +1 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/nodes/BaseNode.ts","../src/nodes/ShapeNode.ts","../src/utils/EventBus.ts","../src/nodes/TextNode.ts","../src/nodes/ImageNode.ts","../src/nodes/CircleNode.ts","../src/nodes/EllipseNode.ts","../src/nodes/ArcNode.ts","../src/nodes/ArrowNode.ts","../src/nodes/RegularPolygonNode.ts","../src/nodes/StarNode.ts","../src/nodes/RingNode.ts","../src/nodes/GroupNode.ts","../src/managers/NodeManager.ts","../src/managers/CameraManager.ts","../src/utils/ThrottleHelper.ts","../src/managers/LODManager.ts","../src/managers/VirtualizationManager.ts","../src/plugins/Plugins.ts","../src/plugins/Plugin.ts","../src/core/CoreEngine.ts","../src/plugins/LogoPlugin.ts","../src/plugins/CameraHotkeysPlugin.ts","../src/utils/MultiGroupController.ts","../src/utils/OverlayAnchors.ts","../src/utils/RotateHandleFactory.ts","../src/utils/RotateHandlesController.ts","../src/utils/OverlayFrameManager.ts","../src/utils/DebounceHelper.ts","../src/plugins/SelectionPlugin.ts","../src/plugins/GridPlugin.ts","../src/plugins/RulerPlugin.ts","../src/plugins/RulerGuidesPlugin.ts","../src/plugins/RulerHighlightPlugin.ts","../src/plugins/RulerManagerPlugin.ts","../src/plugins/AreaSelectionPlugin.ts","../src/plugins/NodeHotkeysPlugin.ts"],"names":["Konva","tr","tr2","threshold","startX","startY","prevNodeDraggable","prevStageDraggable","onMove","onUp","cur","stage","layer","pointer","tl","br","bl","world","cls","scale","guideLine","pos","rawCoord","worldCoord"],"mappings":"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","file":"index.js","sourcesContent":["import Konva from 'konva';\n\nexport interface BaseNodeOptions {\n id?: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n}\n\nexport abstract class BaseNode<T extends Konva.Node = Konva.Node> {\n protected konvaNode: T;\n public readonly id: string;\n\n constructor(node: T, options: BaseNodeOptions = {}) {\n this.konvaNode = node;\n this.id = options.id ?? `node_${String(Date.now())}_${String(Math.random())}`;\n if (options.x) this.konvaNode.x(options.x);\n if (options.y) this.konvaNode.y(options.y);\n if (options.width) this.konvaNode.width(options.width);\n if (options.height) this.konvaNode.height(options.height);\n }\n\n public getNode(): T {\n return this.konvaNode;\n }\n\n public setPosition({ x, y }: { x: number; y: number }) {\n this.konvaNode.position({ x, y });\n }\n\n public getPosition() {\n return this.konvaNode.position();\n }\n\n public remove() {\n this.konvaNode.destroy();\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface ShapeNodeOptions extends BaseNodeOptions {\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n cornerRadius?: number | number[];\n}\n\nexport class ShapeNode extends BaseNode<Konva.Rect> {\n constructor(options: ShapeNodeOptions) {\n const shape = new Konva.Rect({\n x: options.x ?? 0,\n y: options.y ?? 0,\n width: options.width ?? 100,\n height: options.height ?? 100,\n fill: options.fill ?? 'lightgray',\n stroke: options.stroke ?? 'black',\n strokeWidth: options.strokeWidth ?? 1,\n cornerRadius: options.cornerRadius ?? 0,\n draggable: true,\n });\n super(shape, options);\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n\n public setCornerRadius(radius: number | number[]): this {\n this.konvaNode.cornerRadius(radius);\n return this;\n }\n\n public setSize({ width, height }: { width: number; height: number }): this {\n this.konvaNode.size({ width, height });\n return this;\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public getCornerRadius(): number {\n return this.konvaNode.cornerRadius() as number;\n }\n}\n","// Universal listener type for a set of arguments\ntype Listener<TArgs extends unknown[]> = (...args: TArgs) => void;\n\nexport class EventBus<\n TEvents extends { [K in keyof TEvents]: unknown[] } = Record<string, unknown[]>,\n> {\n private _listeners: Map<keyof TEvents & string, Listener<TEvents[keyof TEvents & string]>[]>;\n\n constructor() {\n this._listeners = new Map();\n }\n\n // Access to internal listener map (debug/inspection)\n public get listeners(): Map<string, Listener<TEvents[keyof TEvents & string]>[]> {\n return this._listeners as unknown as Map<string, Listener<TEvents[keyof TEvents & string]>[]>;\n }\n\n public on<K extends keyof TEvents & string>(event: K, callback: Listener<TEvents[K]>): void {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, []);\n }\n (this._listeners.get(event) as Listener<TEvents[K]>[]).push(callback);\n }\n\n public off<K extends keyof TEvents & string>(event: K, callback: Listener<TEvents[K]>): void {\n const handlers = this._listeners.get(event);\n if (handlers) {\n this._listeners.set(\n event,\n handlers.filter((cb) => cb !== (callback as unknown)),\n );\n }\n }\n\n public once<K extends keyof TEvents & string>(event: K, callback: Listener<TEvents[K]>): void {\n const wrapper: Listener<TEvents[K]> = ((...args: TEvents[K]) => {\n this.off(event, wrapper);\n callback(...args);\n }) as Listener<TEvents[K]>;\n this.on(event, wrapper);\n }\n\n public emit<K extends keyof TEvents & string>(event: K, ...args: TEvents[K]): void {\n const handlers = this._listeners.get(event) as Listener<TEvents[K]>[] | undefined;\n if (handlers) {\n // Clone array in case of modifications during iteration\n [...handlers].forEach((cb) => {\n cb(...args);\n });\n }\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface TextNodeOptions extends BaseNodeOptions {\n text?: string;\n fontSize?: number;\n fontFamily?: string;\n fontStyle?: string;\n fill?: string;\n align?: 'left' | 'center' | 'right';\n padding?: number;\n}\n\nexport class TextNode extends BaseNode<Konva.Text> {\n constructor(options: TextNodeOptions = {}) {\n const node = new Konva.Text({\n x: options.x ?? 0,\n y: options.y ?? 0,\n ...(options.width ? { width: options.width } : {}),\n ...(options.height ? { height: options.height } : {}),\n text: options.text ?? 'Text',\n fontSize: options.fontSize ?? 16,\n fontFamily: options.fontFamily ?? 'Inter, Arial, sans-serif',\n fontStyle: options.fontStyle ?? 'normal',\n fill: options.fill ?? '#ffffff',\n align: options.align ?? 'left',\n padding: options.padding ?? 0,\n });\n super(node, options);\n }\n\n public getText(): string {\n return this.konvaNode.text();\n }\n\n public getFontSize(): number {\n return this.konvaNode.fontSize();\n }\n\n public getFontFamily(): string {\n return this.konvaNode.fontFamily();\n }\n\n public getFontStyle(): string {\n return this.konvaNode.fontStyle();\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getAlign(): 'left' | 'center' | 'right' {\n return this.konvaNode.align() as 'left' | 'center' | 'right';\n }\n\n public getPadding(): number {\n return this.konvaNode.padding();\n }\n\n public getSize(): { width: number; height: number } {\n return this.konvaNode.size();\n }\n\n public setText(text: string): this {\n this.konvaNode.text(text);\n return this;\n }\n\n public setFontSize(size: number): this {\n this.konvaNode.fontSize(size);\n return this;\n }\n\n public setFontFamily(family: string): this {\n this.konvaNode.fontFamily(family);\n return this;\n }\n\n public setFontStyle(style: string): this {\n this.konvaNode.fontStyle(style);\n return this;\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setAlign(align: 'left' | 'center' | 'right'): this {\n this.konvaNode.align(align);\n return this;\n }\n\n public setPadding(padding: number): this {\n this.konvaNode.padding(padding);\n return this;\n }\n\n public setSize({ width, height }: { width: number; height: number }): this {\n this.konvaNode.size({ width, height });\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport type ImageSource = HTMLImageElement;\n\nexport interface ImageNodeOptions extends BaseNodeOptions {\n image?: ImageSource;\n src?: string; // if src is provided, it will be loaded async and set to node\n width?: number;\n height?: number;\n}\n\nexport class ImageNode extends BaseNode<Konva.Image> {\n constructor(options: ImageNodeOptions = {}) {\n const node = new Konva.Image({} as Konva.ImageConfig);\n node.x(options.x ?? 0);\n node.y(options.y ?? 0);\n node.width(options.width ?? 150);\n node.height(options.height ?? 150);\n node.image(options.image ?? null);\n super(node, options);\n\n // If src is provided, it will be loaded async and set to node\n if (!options.image && options.src) {\n void this.setSrc(options.src);\n }\n }\n\n public getSize(): { width: number; height: number } {\n return this.konvaNode.size();\n }\n\n // ===== Async helpers =====\n /**\n * Async loads image from URL and sets it to Konva.Image.\n * Returns this for chaining.\n */\n public async setSrc(\n url: string,\n crossOrigin: '' | 'anonymous' | 'use-credentials' | undefined = 'anonymous',\n ) {\n const img = await this._loadHTMLImage(url, crossOrigin);\n this.konvaNode.image(img);\n\n // If sizes are not set, Konva will use natural sizes from image\n // Request layer to redraw if it is already added\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n\n /**\n * Set already loaded image source (HTMLImageElement)\n */\n public setImage(image: ImageSource): this {\n this.konvaNode.image(image);\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n\n public setSize({ width, height }: { width: number; height: number }): this {\n this.konvaNode.size({ width, height });\n return this;\n }\n\n // ===== Static helpers =====\n private _loadHTMLImage(\n url: string,\n crossOrigin: '' | 'anonymous' | 'use-credentials' | undefined = 'anonymous',\n ) {\n return new Promise<HTMLImageElement>((resolve, reject) => {\n const ImgCtor =\n (globalThis as unknown as { Image?: new () => HTMLImageElement }).Image ?? null;\n if (!ImgCtor) {\n reject(new Error('Image constructor is not available in current environment'));\n return;\n }\n const img = new ImgCtor();\n // Setup crossOrigin with type safety\n const co: '' | 'anonymous' | 'use-credentials' = crossOrigin;\n img.crossOrigin = co;\n img.onload = () => {\n resolve(img);\n };\n img.onerror = () => {\n reject(new Error(`Failed to load image: ${url}`));\n };\n img.src = url;\n });\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface CircleNodeOptions extends BaseNodeOptions {\n radius?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class CircleNode extends BaseNode<Konva.Circle> {\n constructor(options: CircleNodeOptions = {}) {\n const circle = new Konva.Circle({} as Konva.CircleConfig);\n circle.x(options.x ?? 0);\n circle.y(options.y ?? 0);\n circle.radius(options.radius ?? 0);\n circle.fill(options.fill ?? 'black');\n circle.stroke(options.stroke ?? 'black');\n circle.strokeWidth(options.strokeWidth ?? 0);\n circle.draggable(true);\n\n super(circle, options);\n }\n\n public getRadius(): number {\n return this.konvaNode.radius();\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public setRadius(radius: number): this {\n this.konvaNode.radius(radius);\n return this;\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface EllipseNodeOptions extends BaseNodeOptions {\n radiusX?: number;\n radiusY?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class EllipseNode extends BaseNode<Konva.Ellipse> {\n constructor(options: EllipseNodeOptions = {}) {\n const ellipse = new Konva.Ellipse({} as Konva.EllipseConfig);\n ellipse.x(options.x ?? 0);\n ellipse.y(options.y ?? 0);\n ellipse.radiusX(options.radiusX ?? 0);\n ellipse.radiusY(options.radiusY ?? 0);\n ellipse.fill(options.fill ?? 'black');\n ellipse.stroke(options.stroke ?? 'black');\n ellipse.strokeWidth(options.strokeWidth ?? 0);\n\n super(ellipse, options);\n }\n\n public getRadiusX(): number {\n return this.konvaNode.radiusX();\n }\n\n public getRadiusY(): number {\n return this.konvaNode.radiusY();\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public setRadiusX(value: number): this {\n this.konvaNode.radiusX(value);\n return this;\n }\n\n public setRadiusY(value: number): this {\n this.konvaNode.radiusY(value);\n return this;\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface ArcNodeOptions extends BaseNodeOptions {\n innerRadius?: number;\n outerRadius?: number;\n angle?: number; // degrees\n rotation?: number; // degrees (start angle by rotation)\n clockwise?: boolean;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class ArcNode extends BaseNode<Konva.Arc> {\n constructor(options: ArcNodeOptions = {}) {\n const arc = new Konva.Arc({} as Konva.ArcConfig);\n arc.x(options.x ?? 0);\n arc.y(options.y ?? 0);\n arc.innerRadius(options.innerRadius ?? 0);\n arc.outerRadius(options.outerRadius ?? 0);\n arc.angle(options.angle ?? 0);\n arc.rotation(options.rotation ?? 0);\n if (options.clockwise !== undefined) arc.clockwise(options.clockwise);\n arc.fill(options.fill ?? 'black');\n arc.stroke(options.stroke ?? 'black');\n arc.strokeWidth(options.strokeWidth ?? 0);\n\n super(arc, options);\n }\n\n public getInnerRadius(): number {\n return this.konvaNode.innerRadius();\n }\n public getOuterRadius(): number {\n return this.konvaNode.outerRadius();\n }\n public getAngle(): number {\n return this.konvaNode.angle();\n }\n public isClockwise(): boolean {\n return this.konvaNode.clockwise();\n }\n\n public setInnerRadius(v: number): this {\n this.konvaNode.innerRadius(v);\n return this;\n }\n public setOuterRadius(v: number): this {\n this.konvaNode.outerRadius(v);\n return this;\n }\n public setAngle(v: number): this {\n this.konvaNode.angle(v);\n return this;\n }\n public setRotationDeg(v: number): this {\n this.konvaNode.rotation(v);\n return this;\n }\n public setClockwise(v: boolean): this {\n this.konvaNode.clockwise(v);\n return this;\n }\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface ArrowNodeOptions extends BaseNodeOptions {\n points?: number[]; // [x1, y1, x2, y2, ...]\n tension?: number;\n pointerLength?: number;\n pointerWidth?: number;\n pointerAtBeginning?: boolean;\n pointerAtEnding?: boolean;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class ArrowNode extends BaseNode<Konva.Arrow> {\n constructor(options: ArrowNodeOptions = {}) {\n const arrow = new Konva.Arrow({} as Konva.ArrowConfig);\n arrow.x(options.x ?? 0);\n arrow.y(options.y ?? 0);\n arrow.points(options.points ?? []);\n if (options.tension) arrow.tension(options.tension);\n if (options.pointerLength) arrow.pointerLength(options.pointerLength);\n if (options.pointerWidth) arrow.pointerWidth(options.pointerWidth);\n if (options.pointerAtBeginning) arrow.pointerAtBeginning(options.pointerAtBeginning);\n if (options.pointerAtEnding) arrow.pointerAtEnding(options.pointerAtEnding);\n arrow.fill(options.fill ?? 'black');\n arrow.stroke(options.stroke ?? 'black');\n arrow.strokeWidth(options.strokeWidth ?? 0);\n\n super(arrow, options);\n }\n\n public getPoints(): number[] {\n return this.konvaNode.points();\n }\n public getTension(): number {\n return this.konvaNode.tension();\n }\n public getPointerLength(): number {\n return this.konvaNode.pointerLength();\n }\n public getPointerWidth(): number {\n return this.konvaNode.pointerWidth();\n }\n public getPointerAtBeginning(): boolean {\n return this.konvaNode.pointerAtBeginning();\n }\n public getPointerAtEnding(): boolean {\n return this.konvaNode.pointerAtEnding();\n }\n\n public setPoints(v: number[]): this {\n this.konvaNode.points(v);\n return this;\n }\n public setTension(v: number): this {\n this.konvaNode.tension(v);\n return this;\n }\n public setPointerLength(v: number): this {\n this.konvaNode.pointerLength(v);\n return this;\n }\n public setPointerWidth(v: number): this {\n this.konvaNode.pointerWidth(v);\n return this;\n }\n public setPointerAtBeginning(v: boolean): this {\n this.konvaNode.pointerAtBeginning(v);\n return this;\n }\n public setPointerAtEnding(v: boolean): this {\n this.konvaNode.pointerAtEnding(v);\n return this;\n }\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface RegularPolygonNodeOptions extends BaseNodeOptions {\n sides?: number;\n radius?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class RegularPolygonNode extends BaseNode<Konva.RegularPolygon> {\n constructor(options: RegularPolygonNodeOptions = {}) {\n const poly = new Konva.RegularPolygon({} as Konva.RegularPolygonConfig);\n poly.x(options.x ?? 0);\n poly.y(options.y ?? 0);\n poly.sides(options.sides ?? 3);\n poly.radius(options.radius ?? 60);\n poly.fill(options.fill ?? 'black');\n poly.stroke(options.stroke ?? 'black');\n poly.strokeWidth(options.strokeWidth ?? 0);\n\n super(poly, options);\n }\n\n public getSides(): number {\n return this.konvaNode.sides();\n }\n public getRadius(): number {\n return this.konvaNode.radius();\n }\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public setSides(v: number): this {\n this.konvaNode.sides(v);\n return this;\n }\n public setRadius(v: number): this {\n this.konvaNode.radius(v);\n return this;\n }\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface StarNodeOptions extends BaseNodeOptions {\n numPoints?: number; // points count\n innerRadius?: number;\n outerRadius?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class StarNode extends BaseNode<Konva.Star> {\n constructor(options: StarNodeOptions = {}) {\n const star = new Konva.Star({} as Konva.StarConfig);\n star.x(options.x ?? 0);\n star.y(options.y ?? 0);\n star.numPoints(options.numPoints ?? 5);\n star.innerRadius(options.innerRadius ?? 20);\n star.outerRadius(options.outerRadius ?? 40);\n star.fill(options.fill ?? 'black');\n star.stroke(options.stroke ?? 'black');\n star.strokeWidth(options.strokeWidth ?? 0);\n\n super(star, options);\n }\n\n public getNumPoints(): number {\n return this.konvaNode.numPoints();\n }\n\n public getInnerRadius(): number {\n return this.konvaNode.innerRadius();\n }\n\n public getOuterRadius(): number {\n return this.konvaNode.outerRadius();\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public setNumPoints(v: number): this {\n this.konvaNode.numPoints(v);\n return this;\n }\n\n public setInnerRadius(v: number): this {\n this.konvaNode.innerRadius(v);\n return this;\n }\n\n public setOuterRadius(v: number): this {\n this.konvaNode.outerRadius(v);\n return this;\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface RingNodeOptions extends BaseNodeOptions {\n innerRadius?: number;\n outerRadius?: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n}\n\nexport class RingNode extends BaseNode<Konva.Ring> {\n constructor(options: RingNodeOptions = {}) {\n const ring = new Konva.Ring({} as Konva.RingConfig);\n ring.x(options.x ?? 0);\n ring.y(options.y ?? 0);\n ring.innerRadius(options.innerRadius ?? 20);\n ring.outerRadius(options.outerRadius ?? 40);\n ring.fill(options.fill ?? 'black');\n ring.stroke(options.stroke ?? 'black');\n ring.strokeWidth(options.strokeWidth ?? 0);\n\n super(ring, options);\n }\n\n public getInnerRadius(): number {\n return this.konvaNode.innerRadius();\n }\n\n public getOuterRadius(): number {\n return this.konvaNode.outerRadius();\n }\n\n public getFill(): string | undefined {\n return this.konvaNode.fill() as string | undefined;\n }\n\n public getStroke(): string | undefined {\n return this.konvaNode.stroke() as string | undefined;\n }\n\n public getStrokeWidth(): number {\n return this.konvaNode.strokeWidth();\n }\n\n public setInnerRadius(v: number): this {\n this.konvaNode.innerRadius(v);\n return this;\n }\n\n public setOuterRadius(v: number): this {\n this.konvaNode.outerRadius(v);\n return this;\n }\n\n public setFill(color: string): this {\n this.konvaNode.fill(color);\n return this;\n }\n\n public setStroke(color: string): this {\n this.konvaNode.stroke(color);\n return this;\n }\n\n public setStrokeWidth(width: number): this {\n this.konvaNode.strokeWidth(width);\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { BaseNode, type BaseNodeOptions } from './BaseNode';\n\nexport interface GroupNodeOptions extends BaseNodeOptions {\n draggable?: boolean;\n listening?: boolean;\n clip?: { x: number; y: number; width: number; height: number };\n}\n\nexport class GroupNode extends BaseNode<Konva.Group> {\n constructor(options: GroupNodeOptions = {}) {\n const group = new Konva.Group({} as Konva.GroupConfig);\n group.x(options.x ?? 0);\n group.y(options.y ?? 0);\n group.draggable(options.draggable ?? true);\n if (options.listening !== undefined) group.listening(options.listening);\n if (options.clip) group.clip(options.clip);\n\n super(group, options);\n }\n\n public addChild(child: Konva.Node | BaseNode): this {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const raw: Konva.Node = (child as BaseNode).getNode\n ? ((child as BaseNode).getNode() as unknown as Konva.Node)\n : (child as Konva.Node);\n // Group.add ожидает Group | Shape, приведём тип к совместимому юниону\n this.konvaNode.add(raw as unknown as Konva.Group | Konva.Shape);\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n\n public removeChild(child: Konva.Node | BaseNode): this {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const raw: Konva.Node = (child as BaseNode).getNode\n ? (child as BaseNode).getNode()\n : (child as Konva.Node);\n raw.remove();\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n\n public removeAllChildren(): this {\n this.konvaNode.removeChildren();\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n\n public getChildren(): Konva.Node[] {\n return this.konvaNode.getChildren() as unknown as Konva.Node[];\n }\n\n public findByName(name: string): Konva.Node[] {\n return this.konvaNode.find(`.${name}`) as unknown as Konva.Node[];\n }\n\n public setDraggable(v: boolean): this {\n this.konvaNode.draggable(v);\n return this;\n }\n public isDraggable(): boolean {\n return this.konvaNode.draggable();\n }\n\n public setListening(v: boolean): this {\n this.konvaNode.listening(v);\n return this;\n }\n public isListening(): boolean {\n return this.konvaNode.listening();\n }\n\n public setClip(rect: { x: number; y: number; width: number; height: number }): this {\n this.konvaNode.clip(rect);\n this.konvaNode.getLayer()?.batchDraw();\n return this;\n }\n}\n","import Konva from 'konva';\n\nimport { ShapeNode, type ShapeNodeOptions } from '../nodes/ShapeNode';\nimport { BaseNode } from '../nodes/BaseNode';\nimport { EventBus } from '../utils/EventBus';\nimport type { CoreEvents } from '../types/core.events.interface';\nimport { TextNode, type TextNodeOptions } from '../nodes/TextNode';\nimport { ImageNode, type ImageNodeOptions } from '../nodes/ImageNode';\nimport { CircleNode, type CircleNodeOptions } from '../nodes/CircleNode';\nimport { EllipseNode, type EllipseNodeOptions } from '../nodes/EllipseNode';\nimport { ArcNode, type ArcNodeOptions } from '../nodes/ArcNode';\nimport { ArrowNode, type ArrowNodeOptions } from '../nodes/ArrowNode';\nimport { RegularPolygonNode, type RegularPolygonNodeOptions } from '../nodes/RegularPolygonNode';\nimport { StarNode, type StarNodeOptions } from '../nodes/StarNode';\nimport { RingNode, type RingNodeOptions } from '../nodes/RingNode';\nimport { GroupNode, type GroupNodeOptions } from '../nodes/GroupNode';\n\nexport class NodeManager {\n private _layer: Konva.Layer;\n private _world: Konva.Group;\n private _nodes = new Map<string, BaseNode>();\n private _stage: Konva.Stage;\n private _eventBus: EventBus<CoreEvents>;\n\n // Cache for optimization\n private _batchDrawScheduled = false;\n private _listCache: BaseNode[] | null = null;\n private _listCacheInvalidated = true;\n\n constructor(stage: Konva.Stage, eventBus: EventBus<CoreEvents>) {\n this._layer = new Konva.Layer();\n this._world = new Konva.Group();\n this._layer.add(this._world);\n this._stage = stage;\n this._stage.add(this._layer);\n this._eventBus = eventBus;\n }\n\n public get layer(): Konva.Layer {\n return this._layer;\n }\n\n public get world(): Konva.Group {\n return this._world;\n }\n\n public get stage(): Konva.Stage {\n return this._stage;\n }\n\n public get eventBus(): EventBus<CoreEvents> {\n return this._eventBus;\n }\n public addShape(options: ShapeNodeOptions): ShapeNode {\n const shape = new ShapeNode(options);\n this._world.add(shape.getNode());\n this._nodes.set(shape.id, shape);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', shape);\n this._scheduleBatchDraw();\n return shape;\n }\n\n public addText(options: TextNodeOptions): TextNode {\n const text = new TextNode(options);\n this._world.add(text.getNode());\n this._nodes.set(text.id, text);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', text);\n this._scheduleBatchDraw();\n return text;\n }\n\n public addImage(options: ImageNodeOptions): ImageNode {\n const image = new ImageNode(options);\n this._world.add(image.getNode());\n this._nodes.set(image.id, image);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', image);\n this._scheduleBatchDraw();\n return image;\n }\n\n public addCircle(options: CircleNodeOptions): CircleNode {\n const circle = new CircleNode(options);\n this._world.add(circle.getNode());\n this._nodes.set(circle.id, circle);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', circle);\n this._scheduleBatchDraw();\n return circle;\n }\n\n public addEllipse(options: EllipseNodeOptions): EllipseNode {\n const ellipse = new EllipseNode(options);\n this._world.add(ellipse.getNode());\n this._nodes.set(ellipse.id, ellipse);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', ellipse);\n this._scheduleBatchDraw();\n return ellipse;\n }\n\n public addArc(options: ArcNodeOptions): ArcNode {\n const arc = new ArcNode(options);\n this._world.add(arc.getNode());\n this._nodes.set(arc.id, arc);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', arc);\n this._scheduleBatchDraw();\n return arc;\n }\n\n public addStar(options: StarNodeOptions): StarNode {\n const star = new StarNode(options);\n this._world.add(star.getNode());\n this._nodes.set(star.id, star);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', star);\n this._scheduleBatchDraw();\n return star;\n }\n\n public addArrow(options: ArrowNodeOptions): ArrowNode {\n const arrow = new ArrowNode(options);\n this._world.add(arrow.getNode());\n this._nodes.set(arrow.id, arrow);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', arrow);\n this._scheduleBatchDraw();\n return arrow;\n }\n\n public addRing(options: RingNodeOptions): RingNode {\n const ring = new RingNode(options);\n this._world.add(ring.getNode());\n this._nodes.set(ring.id, ring);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', ring);\n this._scheduleBatchDraw();\n return ring;\n }\n\n public addRegularPolygon(options: RegularPolygonNodeOptions): RegularPolygonNode {\n const poly = new RegularPolygonNode(options);\n this._world.add(poly.getNode());\n this._nodes.set(poly.id, poly);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', poly);\n this._scheduleBatchDraw();\n return poly;\n }\n\n public addGroup(options: GroupNodeOptions): GroupNode {\n const group = new GroupNode(options);\n this._world.add(group.getNode());\n this._nodes.set(group.id, group);\n this._listCacheInvalidated = true;\n this._eventBus.emit('node:created', group);\n this._scheduleBatchDraw();\n return group;\n }\n\n public remove(node: BaseNode) {\n this._eventBus.emit('node:removed', node);\n node.remove();\n this._nodes.delete(node.id);\n this._listCacheInvalidated = true;\n this._scheduleBatchDraw();\n }\n\n public findById(id: string): BaseNode | undefined {\n return this._nodes.get(id);\n }\n\n public list(): BaseNode[] {\n // CRITICAL OPTIMIZATION: cache result\n if (this._listCacheInvalidated || !this._listCache) {\n this._listCache = Array.from(this._nodes.values());\n this._listCacheInvalidated = false;\n }\n return this._listCache;\n }\n\n /**\n * Deferred redraw (throttling)\n * CRITICAL OPTIMIZATION: group multiple node additions\n */\n private _scheduleBatchDraw() {\n if (this._batchDrawScheduled) return;\n\n this._batchDrawScheduled = true;\n const raf = globalThis.requestAnimationFrame;\n raf(() => {\n this._batchDrawScheduled = false;\n this._layer.batchDraw();\n });\n }\n}\n","import Konva from 'konva';\n\nimport { EventBus } from '../utils/EventBus';\nimport type { CoreEvents } from '../types/core.events.interface';\n\nexport interface CameraManagerOptions {\n stage: Konva.Stage;\n eventBus: EventBus<CoreEvents>;\n target?: Konva.Node;\n initialScale?: number;\n minScale?: number;\n maxScale?: number;\n draggable?: boolean;\n zoomStep?: number;\n panStep?: number;\n}\n\nexport class CameraManager {\n private _stage: Konva.Stage;\n private _eventBus: EventBus<CoreEvents>;\n private _target: Konva.Node;\n private _scale: number;\n private _minScale: number;\n private _maxScale: number;\n private _zoomStep: number;\n private _panStep: number;\n\n // Cache for optimization\n private _wheelScheduled = false;\n private _pendingWheelEvent: WheelEvent | null = null;\n\n constructor(options: CameraManagerOptions) {\n this._stage = options.stage;\n this._eventBus = options.eventBus;\n this._target = options.target ?? options.stage;\n this._scale = options.initialScale ?? 1;\n this._minScale = options.minScale ?? 0.1;\n this._maxScale = options.maxScale ?? 5;\n this._zoomStep = options.zoomStep ?? 1.05;\n this._panStep = options.panStep ?? 40;\n this._initWheelZoom();\n }\n\n private _initWheelZoom() {\n this._stage.on('wheel', (e) => {\n e.evt.preventDefault();\n\n // Optimization: throttling for wheel events\n this._pendingWheelEvent = e.evt;\n\n if (this._wheelScheduled) return;\n\n this._wheelScheduled = true;\n const raf = globalThis.requestAnimationFrame;\n raf(() => {\n this._wheelScheduled = false;\n if (!this._pendingWheelEvent) return;\n\n this._handleWheel(this._pendingWheelEvent);\n this._pendingWheelEvent = null;\n });\n });\n }\n\n private _handleWheel(evt: WheelEvent) {\n const oldScale = this._target.scaleX() || 1;\n const pointer = this._stage.getPointerPosition();\n if (!pointer) return;\n const scaleBy = this._zoomStep;\n const direction = evt.deltaY > 0 ? -1 : 1;\n let newScale = direction > 0 ? oldScale * scaleBy : oldScale / scaleBy;\n newScale = Math.max(this._minScale, Math.min(this._maxScale, newScale));\n const mousePointTo = {\n x: (pointer.x - this._target.x()) / oldScale,\n y: (pointer.y - this._target.y()) / oldScale,\n };\n this._target.scale({ x: newScale, y: newScale });\n const newPos = {\n x: pointer.x - mousePointTo.x * newScale,\n y: pointer.y - mousePointTo.y * newScale,\n };\n this._target.position(newPos);\n this._stage.batchDraw();\n this._scale = newScale;\n this._eventBus.emit('camera:zoom', { scale: this._scale, position: newPos });\n }\n\n public get zoomStep(): number {\n return this._zoomStep;\n }\n\n public get panStep(): number {\n return this._panStep;\n }\n\n public setZoom(zoom: number) {\n this._scale = Math.max(this._minScale, Math.min(this._maxScale, zoom));\n this._target.scale({ x: this._scale, y: this._scale });\n this._stage.batchDraw();\n this._eventBus.emit('camera:setZoom', { scale: this._scale });\n }\n\n public zoomIn(step?: number) {\n if (step === undefined) {\n this.setZoom(this._scale * this._zoomStep);\n } else {\n this.setZoom(this._scale + step);\n }\n }\n\n public zoomOut(step?: number) {\n if (step === undefined) {\n this.setZoom(this._scale / this._zoomStep);\n } else {\n this.setZoom(this._scale - step);\n }\n }\n\n public reset() {\n this.setZoom(1);\n this._target.position({ x: 0, y: 0 });\n this._stage.batchDraw();\n this._eventBus.emit('camera:reset');\n }\n\n public setDraggable(enabled: boolean) {\n this._stage.draggable(enabled);\n }\n\n public setZoomStep(step: number) {\n if (step && step > 0) {\n this._zoomStep = step;\n this._eventBus.emit('camera:zoomStep', { zoomStep: step });\n }\n }\n\n public setPanStep(step: number) {\n if (typeof step === 'number' && isFinite(step)) {\n this._panStep = step;\n this._eventBus.emit('camera:panStep', { panStep: step });\n }\n }\n}\n","/**\n * ThrottleHelper - utility for throttling (limiting the frequency of calls)\n *\n * Used to limit the frequency of operation execution to a certain number of times per second.\n * For example, to limit UI updates to 60 FPS (16ms) or 30 FPS (32ms).\n *\n * @example\n * ```typescript\n * private _throttle = new ThrottleHelper(16); // 60 FPS\n *\n * onMouseMove() {\n * if (!this._throttle.shouldExecute()) return;\n * // Execute expensive operation\n * }\n * ```\n */\nexport class ThrottleHelper {\n private _lastTime = 0;\n private _throttle: number;\n\n /**\n * @param throttleMs - minimum interval between calls in milliseconds\n */\n constructor(throttleMs = 16) {\n this._throttle = throttleMs;\n }\n\n /**\n * Checks if the operation can be executed\n * @returns true if enough time has passed since the last call\n */\n public shouldExecute(): boolean {\n const now = Date.now();\n if (now - this._lastTime < this._throttle) {\n return false;\n }\n this._lastTime = now;\n return true;\n }\n\n /**\n * Resets the timer (the next call will be executed immediately)\n */\n public reset(): void {\n this._lastTime = 0;\n }\n\n /**\n * Changes the throttling interval\n */\n public setThrottle(throttleMs: number): void {\n this._throttle = throttleMs;\n }\n\n /**\n * Returns the current throttling interval\n */\n public getThrottle(): number {\n return this._throttle;\n }\n}\n","import Konva from 'konva';\n\nimport type { BaseNode } from '../nodes/BaseNode';\n\ninterface LODLevel {\n minScale: number;\n maxScale: number;\n simplify: boolean;\n disableStroke?: boolean;\n disableShadow?: boolean;\n disablePerfectDraw?: boolean;\n}\n\nexport interface LODOptions {\n enabled?: boolean;\n levels?: LODLevel[];\n}\n\ninterface KonvaNodeWithLOD extends Konva.Node {\n stroke?: () => string | undefined;\n strokeEnabled: (enabled?: boolean) => boolean | this;\n shadowEnabled: (enabled?: boolean) => boolean | this;\n perfectDrawEnabled?: (enabled?: boolean) => boolean | this;\n _originalLOD?: {\n stroke?: string | undefined;\n strokeEnabled: boolean;\n shadow: boolean;\n perfectDraw?: boolean | undefined;\n };\n}\n\n/**\n * LODManager - manager for level of detail\n *\n * This is an ADDITIONAL optimization on top of Konva framework.\n * Konva does not provide automatic LOD, so this implementation is necessary.\n *\n * When far away (small scale), it simplifies node rendering:\n * - Disables stroke via strokeEnabled(false)\n * - Disables shadow via shadowEnabled(false)\n * - Disables perfect draw via perfectDrawEnabled(false)\n *\n * All methods use built-in Konva API, recommended in the official documentation:\n * https://konvajs.org/docs/performance/All_Performance_Tips.html\n *\n * Performance boost: 20-30% when many nodes are rendered at small scales.\n */\nexport class LODManager {\n private _enabled: boolean;\n private _levels: LODLevel[];\n private _currentScale = 1;\n private _appliedNodes = new Map<string, LODLevel>();\n\n constructor(options: LODOptions = {}) {\n this._enabled = options.enabled ?? true;\n\n this._levels = options.levels ?? [\n {\n minScale: 0,\n maxScale: 0.1,\n simplify: true,\n disableStroke: true,\n disableShadow: true,\n disablePerfectDraw: true,\n },\n {\n minScale: 0.1,\n maxScale: 0.3,\n simplify: true,\n disableShadow: true,\n disablePerfectDraw: true,\n },\n {\n minScale: 0.3,\n maxScale: Infinity,\n simplify: false,\n },\n ];\n }\n\n /**\n * Level of detail for current scale\n */\n private _getLODLevel(scale: number): LODLevel | null {\n if (!this._enabled) return null;\n\n const level = this._levels.find((l) => scale >= l.minScale && scale < l.maxScale);\n\n return level ?? null;\n }\n\n /**\n * Apply LOD to node based on current scale\n */\n public applyLOD(node: BaseNode, scale: number): void {\n if (!this._enabled) return;\n\n this._currentScale = scale;\n const level = this._getLODLevel(scale);\n\n if (!level?.simplify) {\n // Full detail - restore original settings\n this._restoreNode(node);\n return;\n }\n\n // Apply simplifications\n const konvaNode = node.getNode() as KonvaNodeWithLOD;\n const previousLevel = this._appliedNodes.get(node.id);\n\n // Apply only if level changed\n if (previousLevel === level) return;\n\n // Save original values on first application\n if (!previousLevel) {\n konvaNode._originalLOD = {\n stroke: konvaNode.stroke?.(),\n strokeEnabled: konvaNode.strokeEnabled() as boolean,\n shadow: konvaNode.shadowEnabled() as boolean,\n perfectDraw: konvaNode.perfectDrawEnabled?.() as boolean | undefined,\n };\n }\n\n if (level.disableStroke) {\n konvaNode.strokeEnabled(false);\n }\n\n if (level.disableShadow) {\n konvaNode.shadowEnabled(false);\n }\n\n if (level.disablePerfectDraw && konvaNode.perfectDrawEnabled) {\n konvaNode.perfectDrawEnabled(false);\n }\n\n this._appliedNodes.set(node.id, level);\n }\n\n /**\n * Restore original settings for node\n */\n\n private _restoreNode(node: BaseNode): void {\n const konvaNode = node.getNode() as KonvaNodeWithLOD;\n const original = konvaNode._originalLOD;\n\n if (!original) return;\n\n konvaNode.strokeEnabled(original.strokeEnabled);\n konvaNode.shadowEnabled(original.shadow);\n\n if (original.perfectDraw !== undefined && konvaNode.perfectDrawEnabled) {\n konvaNode.perfectDrawEnabled(original.perfectDraw);\n }\n\n this._appliedNodes.delete(node.id);\n delete konvaNode._originalLOD;\n }\n\n /**\n * Apply LOD to all nodes\n */\n public applyToAll(nodes: BaseNode[], scale: number): void {\n if (!this._enabled) return;\n\n for (const node of nodes) {\n this.applyLOD(node, scale);\n }\n }\n\n /**\n * Restore all nodes to full detail\n */\n public restoreAll(nodes: BaseNode[]): void {\n for (const node of nodes) {\n this._restoreNode(node);\n }\n this._appliedNodes.clear();\n }\n\n /**\n * Enable LOD\n */\n public enable(): void {\n this._enabled = true;\n }\n\n /**\n * Disable LOD and restore all nodes\n */\n public disable(nodes: BaseNode[]): void {\n this._enabled = false;\n this.restoreAll(nodes);\n }\n\n /**\n * Check if LOD is enabled\n */\n public get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Get current scale\n */\n public get currentScale(): number {\n return this._currentScale;\n }\n\n /**\n * Get LOD stats\n */\n public getStats(): {\n enabled: boolean;\n currentScale: number;\n appliedNodes: number;\n currentLevel: LODLevel | null;\n } {\n return {\n enabled: this._enabled,\n currentScale: this._currentScale,\n appliedNodes: this._appliedNodes.size,\n currentLevel: this._getLODLevel(this._currentScale),\n };\n }\n\n /**\n * Set custom LOD levels\n */\n public setLevels(levels: LODLevel[]): void {\n this._levels = levels;\n }\n}\n","import Konva from 'konva';\n\nimport type { BaseNode } from '../nodes/BaseNode';\nimport { ThrottleHelper } from '../utils/ThrottleHelper';\n\nimport type { NodeManager } from './NodeManager';\nimport { LODManager, type LODOptions } from './LODManager';\n\nexport interface VirtualizationStats {\n total: number;\n visible: number;\n hidden: number;\n cullingRate: number; // percentage of hidden nodes\n}\n\nexport interface VirtualizationOptions {\n enabled?: boolean;\n bufferZone?: number; // pixels outside viewport for smoothness\n throttleMs?: number; // delay between updates (ms)\n lod?: LODOptions; // Level of Detail settings\n}\n\n/**\n * VirtualizationManager - manages node visibility for performance optimization\n *\n * IMPORTANT: This is an ADDITIONAL optimization on top of Konva framework.\n * Konva does not provide automatic viewport virtualization, so this implementation is necessary.\n *\n * Main idea: render only nodes that are within the viewport (visible area).\n * This provides a significant performance boost when dealing with many nodes.\n *\n * Optimizations (uses built-in Konva APIs):\n * 1. visible: false - node is not rendered (Konva recommendation)\n * 2. listening: false - node does not handle events (Konva recommendation)\n * 3. Buffer zone - render slightly more than viewport for smoothness\n * 4. Throttling - limits update frequency\n * 5. getClientRect() - Konva automatically caches results internally\n *\n * Konva documentation: https://konvajs.org/docs/performance/All_Performance_Tips.html\n */\nexport class VirtualizationManager {\n private _enabled: boolean;\n private _bufferZone: number;\n private _throttle: ThrottleHelper;\n\n private _viewport: {\n x: number;\n y: number;\n width: number;\n height: number;\n } = { x: 0, y: 0, width: 0, height: 0 };\n\n private _visibleNodes = new Set<string>();\n private _hiddenNodes = new Set<string>();\n\n private _updateScheduled = false;\n\n // LOD Manager for additional optimization\n private _lod: LODManager | null = null;\n\n constructor(\n private _stage: Konva.Stage,\n private _world: Konva.Group,\n private _nodeManager: NodeManager,\n options: VirtualizationOptions = {},\n ) {\n this._enabled = options.enabled ?? true;\n this._bufferZone = options.bufferZone ?? 200;\n this._throttle = new ThrottleHelper(options.throttleMs ?? 16); // ~60 FPS\n\n // Initialize LOD if enabled\n if (options.lod) {\n this._lod = new LODManager(options.lod);\n }\n\n this._updateViewport();\n this._setupListeners();\n\n // Initial update\n if (this._enabled) {\n this.updateVisibility();\n }\n }\n\n /**\n * Updates viewport based on current position and scale of world\n */\n private _updateViewport(): void {\n const scale = this._world.scaleX();\n const position = this._world.position();\n\n // Calculate viewport in world coordinates\n // Consider that world may be transformed (position + scale)\n this._viewport = {\n x: -position.x / scale - this._bufferZone,\n y: -position.y / scale - this._bufferZone,\n width: this._stage.width() / scale + this._bufferZone * 2,\n height: this._stage.height() / scale + this._bufferZone * 2,\n };\n }\n\n /**\n * Gets node bounding box in world coordinates (relative to world)\n *\n * OPTIMIZATION: Konva automatically caches getClientRect() results internally,\n * so additional TTL-cache is not needed. Konva invalidates its cache on transformations,\n * which is more reliable than our TTL-approach.\n */\n private _getNodeBBox(node: BaseNode): {\n x: number;\n y: number;\n width: number;\n height: number;\n } {\n const konvaNode = node.getNode();\n\n // Konva automatically caches getClientRect() and invalidates on transformations\n const clientRect = konvaNode.getClientRect({ relativeTo: this._world });\n\n return {\n x: clientRect.x,\n y: clientRect.y,\n width: clientRect.width,\n height: clientRect.height,\n };\n }\n\n /**\n * Checks if node is within viewport\n */\n private _isNodeVisible(node: BaseNode): boolean {\n const box = this._getNodeBBox(node);\n\n // Check intersection with viewport\n return !(\n box.x + box.width < this._viewport.x ||\n box.x > this._viewport.x + this._viewport.width ||\n box.y + box.height < this._viewport.y ||\n box.y > this._viewport.y + this._viewport.height\n );\n }\n\n /**\n * Updates visibility of all nodes\n */\n public updateVisibility(): void {\n if (!this._enabled) return;\n\n // Throttling - do not update too often\n if (!this._throttle.shouldExecute()) {\n return;\n }\n\n const nodes = this._nodeManager.list();\n const newVisibleNodes = new Set<string>();\n let changesCount = 0;\n\n for (const node of nodes) {\n const isVisible = this._isNodeVisible(node);\n const konvaNode = node.getNode();\n\n if (isVisible) {\n newVisibleNodes.add(node.id);\n\n // Show node if it was hidden\n if (this._hiddenNodes.has(node.id)) {\n konvaNode.visible(true);\n konvaNode.listening(true);\n this._hiddenNodes.delete(node.id);\n changesCount++;\n }\n } else {\n // Hide node if it was visible\n if (!this._hiddenNodes.has(node.id)) {\n konvaNode.visible(false);\n konvaNode.listening(false);\n this._hiddenNodes.add(node.id);\n changesCount++;\n }\n }\n }\n\n this._visibleNodes = newVisibleNodes;\n\n // OPTIMIZATION: Apply LOD only to CHANGED nodes\n if (this._lod?.enabled && changesCount > 0) {\n const scale = this._world.scaleX();\n\n // Apply LOD only to newly visible nodes\n for (const node of nodes) {\n if (newVisibleNodes.has(node.id)) {\n this._lod.applyLOD(node, scale);\n }\n }\n }\n\n // Redraw only if changes occurred\n if (changesCount > 0) {\n this._nodeManager.layer.batchDraw();\n }\n }\n\n /**\n * Sets up event listeners\n */\n private _setupListeners(): void {\n this._world.on('xChange yChange scaleXChange scaleYChange', () => {\n // OPTIMIZATION: DO NOT clear cache on panning/zooming!\n // BBox in world coordinates does not change during world transformation\n // Cache remains valid!\n this._scheduleUpdate();\n });\n\n // Update on stage resize\n // Konva does not provide a standard resize event, so we use window.resize\n if (typeof globalThis.window !== 'undefined') {\n globalThis.window.addEventListener('resize', () => {\n this._updateViewport();\n this._scheduleUpdate();\n });\n }\n this._nodeManager.eventBus.on('node:removed', (node: BaseNode) => {\n this._visibleNodes.delete(node.id);\n this._hiddenNodes.delete(node.id);\n });\n }\n\n /**\n * Schedules update for the next frame\n */\n private _scheduleUpdate(): void {\n if (this._updateScheduled) return;\n\n this._updateScheduled = true;\n\n globalThis.requestAnimationFrame(() => {\n this._updateViewport();\n this.updateVisibility();\n this._updateScheduled = false;\n });\n }\n\n /**\n * Enables virtualization\n */\n public enable(): void {\n if (this._enabled) return;\n\n this._enabled = true;\n this.updateVisibility();\n }\n\n /**\n * Disables virtualization (shows all nodes)\n */\n public disable(): void {\n if (!this._enabled) return;\n\n this._enabled = false;\n\n // Show all hidden nodes\n for (const nodeId of this._hiddenNodes) {\n const node = this._nodeManager.findById(nodeId);\n if (node) {\n const konvaNode = node.getNode();\n konvaNode.visible(true);\n konvaNode.listening(true);\n }\n }\n\n this._hiddenNodes.clear();\n this._visibleNodes.clear();\n this._nodeManager.layer.batchDraw();\n }\n\n /**\n * Returns virtualization statistics\n */\n public getStats(): VirtualizationStats {\n const total = this._nodeManager.list().length;\n const visible = this._visibleNodes.size;\n const hidden = this._hiddenNodes.size;\n\n return {\n total,\n visible,\n hidden,\n cullingRate: total > 0 ? (hidden / total) * 100 : 0,\n };\n }\n\n /**\n * Sets buffer zone size\n */\n public setBufferZone(pixels: number): void {\n this._bufferZone = pixels;\n this._updateViewport();\n this._scheduleUpdate();\n }\n\n /**\n * Sets throttle for updates\n */\n public setThrottle(ms: number): void {\n this._throttle = new ThrottleHelper(ms);\n }\n\n /**\n * Checks if virtualization is enabled\n */\n public get enabled(): boolean {\n return this._enabled;\n }\n\n /**\n * Returns current viewport\n */\n public get viewport(): {\n x: number;\n y: number;\n width: number;\n height: number;\n } {\n return { ...this._viewport };\n }\n\n /**\n * Forcefully updates visibility (ignores throttle)\n */\n public forceUpdate(): void {\n this._throttle.reset();\n this._updateViewport();\n this.updateVisibility();\n }\n\n /**\n * Returns LOD Manager (if enabled)\n */\n public get lod(): LODManager | null {\n return this._lod;\n }\n\n /**\n * Destroys manager and releases resources\n */\n public destroy(): void {\n this.disable();\n this._visibleNodes.clear();\n this._hiddenNodes.clear();\n\n // Clear LOD\n if (this._lod) {\n const nodes = this._nodeManager.list();\n this._lod.restoreAll(nodes);\n }\n }\n}\n","import type { CoreEngine } from '../core/CoreEngine';\n\nimport type { Plugin } from './Plugin';\n\nexport class Plugins {\n private _core: CoreEngine;\n private _items: Plugin[] = [];\n\n constructor(core: CoreEngine, initial: Plugin[] = []) {\n this._core = core;\n if (initial.length) this.addPlugins(initial);\n }\n\n public addPlugins(plugins: Plugin[]): Plugin[] {\n const added: Plugin[] = [];\n for (const plugin of plugins) {\n if (this._items.includes(plugin)) continue;\n this._items.push(plugin);\n plugin.attach(this._core);\n added.push(plugin);\n // Emit plugin:added event\n this._core.eventBus.emit('plugin:added', plugin.constructor.name);\n }\n return added;\n }\n\n public removePlugins(plugins: Plugin[]): Plugin[] {\n const removed: Plugin[] = [];\n for (const plugin of plugins) {\n const idx = this._items.indexOf(plugin);\n if (idx === -1) continue;\n plugin.detach(this._core);\n this._items.splice(idx, 1);\n removed.push(plugin);\n // Emit plugin:removed event\n this._core.eventBus.emit('plugin:removed', plugin.constructor.name);\n }\n return removed;\n }\n\n public removeAllPlugins(): Plugin[] {\n const removed = [...this._items];\n for (const plugin of removed) plugin.detach(this._core);\n this._items = [];\n // Emit plugin:removed for each removed plugin\n for (const plugin of removed) {\n this._core.eventBus.emit('plugin:removed', plugin.constructor.name);\n }\n return removed;\n }\n\n public list(): Plugin[] {\n return [...this._items];\n }\n\n public get(name: string): Plugin | undefined {\n return this._items.find((p) => p.constructor.name === name);\n }\n}\n","import type { CoreEngine } from '../core/CoreEngine';\n\nexport abstract class Plugin {\n protected abstract onAttach(core: CoreEngine): void;\n protected abstract onDetach(core: CoreEngine): void;\n\n public attach(core: CoreEngine): void {\n this.onAttach(core);\n }\n\n public detach(core: CoreEngine): void {\n this.onDetach(core);\n }\n}\n","import Konva from 'konva';\n\nimport { NodeManager } from '../managers/NodeManager';\nimport { EventBus } from '../utils/EventBus';\nimport { CameraManager } from '../managers/CameraManager';\nimport { VirtualizationManager } from '../managers/VirtualizationManager';\nimport { Plugins } from '../plugins/Plugins';\nimport { Plugin } from '../plugins/Plugin';\nimport type { CoreEvents } from '../types/core.events.interface';\n\nexport interface CoreEngineOptions {\n container: HTMLDivElement;\n width?: number;\n height?: number;\n autoResize?: boolean;\n backgroundColor?: string;\n draggable?: boolean;\n plugins?: Plugin[];\n minScale?: number;\n maxScale?: number;\n virtualization?: {\n enabled?: boolean;\n bufferZone?: number;\n throttleMs?: number;\n };\n}\n\nexport class CoreEngine {\n private _stage: Konva.Stage;\n private _eventBus: EventBus<CoreEvents>;\n private _initialWidth: number;\n private _initialHeight: number;\n private _autoResize: boolean;\n private _backgroundColor: string;\n private _draggable: boolean;\n private _minScale: number;\n private _maxScale: number;\n private _gridLayer: Konva.Layer;\n\n public readonly container: HTMLDivElement;\n public readonly nodes: NodeManager;\n public readonly camera: CameraManager;\n public readonly virtualization: VirtualizationManager;\n public readonly plugins: Plugins;\n\n constructor(options: CoreEngineOptions) {\n this.container = options.container;\n this._initialWidth = options.width ?? 800;\n this._initialHeight = options.height ?? 800;\n this._autoResize = options.autoResize ?? true;\n this._backgroundColor = options.backgroundColor ?? '#1e1e1e';\n this._draggable = options.draggable ?? true;\n this._minScale = options.minScale ?? 0.1;\n this._maxScale = options.maxScale ?? 500;\n this._stage = new Konva.Stage({\n container: this.container,\n width: this._autoResize ? this.container.offsetWidth : this._initialWidth,\n height: this._autoResize ? this.container.offsetHeight : this._initialHeight,\n draggable: false,\n });\n if (!this._autoResize) {\n this.container.style.width = `${String(this._initialWidth)}px`;\n this.container.style.height = `${String(this._initialHeight)}px`;\n }\n this.container.style.background = this._backgroundColor;\n this._eventBus = new EventBus<CoreEvents>();\n // Layer for grid (not transformed by camera)\n this._gridLayer = new Konva.Layer({ listening: false });\n this._stage.add(this._gridLayer);\n\n this.nodes = new NodeManager(this._stage, this._eventBus);\n this.camera = new CameraManager({\n stage: this._stage,\n target: this.nodes.world,\n eventBus: this._eventBus,\n initialScale: 1,\n draggable: false,\n minScale: this._minScale,\n maxScale: this._maxScale,\n });\n this.virtualization = new VirtualizationManager(\n this._stage,\n this.nodes.world,\n this.nodes,\n options.virtualization,\n );\n this.plugins = new Plugins(this, options.plugins ?? []);\n }\n\n public get eventBus(): EventBus<CoreEvents> {\n return this._eventBus;\n }\n\n public get stage(): Konva.Stage {\n return this._stage;\n }\n\n public get gridLayer(): Konva.Layer {\n return this._gridLayer;\n }\n\n public get draggable(): boolean {\n return this._draggable;\n }\n\n public get autoResize(): boolean {\n return this._autoResize;\n }\n\n public get backgroundColor(): string {\n return this._backgroundColor;\n }\n\n public get initialWidth(): number {\n return this._initialWidth;\n }\n\n public get initialHeight(): number {\n return this._initialHeight;\n }\n\n public get minScale(): number {\n return this._minScale;\n }\n\n public get maxScale(): number {\n return this._maxScale;\n }\n\n public setSize({ width, height }: { width: number; height: number }) {\n this._stage.size({ width, height });\n // Notify plugins that rely on stage resize events\n this._stage.fire('resize');\n // Emit typed event for external subscribers\n this._eventBus.emit('stage:resized', { width, height });\n }\n\n public setBackgroundColor(color: string) {\n this.container.style.background = color;\n }\n\n public setDraggable(draggable: boolean) {\n this._stage.draggable(draggable);\n this._draggable = draggable;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\n\nexport interface LogoOptions {\n src: string;\n width: number;\n height: number;\n opacity?: number;\n}\n\nexport class LogoPlugin extends Plugin {\n private _core?: CoreEngine;\n private _layer?: Konva.Layer;\n private _image?: Konva.Image;\n private _src: string;\n private _width: number;\n private _height: number;\n private _opacity: number;\n\n constructor(options: LogoOptions) {\n super();\n this._src = options.src;\n this._width = options.width;\n this._height = options.height;\n this._opacity = options.opacity ?? 1;\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n this._layer = new Konva.Layer({ name: 'logo-layer', listening: false });\n this._core.stage.add(this._layer);\n\n this._image = new Konva.Image({\n image: undefined,\n width: this._width,\n height: this._height,\n name: 'logo-background',\n listening: false,\n opacity: this._opacity,\n });\n\n this._layer.add(this._image);\n this.setSource(this._src);\n\n // Namespace `.logo` for easy removal of all handlers\n // Monitor stage property changes to react to any panning/zooming source\n const stage = this._core.stage;\n stage.on('resize.logo', () => {\n this._layout();\n });\n stage.on('xChange.logo yChange.logo scaleXChange.logo scaleYChange.logo', () => {\n this._layout();\n });\n\n this._layout();\n this._core.stage.batchDraw();\n }\n\n protected onDetach(core: CoreEngine): void {\n core.stage.off('.logo');\n if (this._image) this._image.destroy();\n if (this._layer) this._layer.destroy();\n }\n\n public setOpacity(opacity: number): void {\n this._opacity = opacity;\n if (this._image && this._core) {\n this._image.opacity(opacity);\n this._core.stage.batchDraw();\n }\n }\n\n public setSize({ width, height }: { width: number; height: number }): void {\n this._width = width;\n this._height = height;\n this._layout();\n if (this._core) this._core.stage.batchDraw();\n }\n\n public setSource(src: string): void {\n this._src = src;\n this._loadImageFromString(src);\n }\n\n private _setImage(source: CanvasImageSource): void {\n if (!this._image) return;\n this._image.image(source);\n this._layout();\n if (this._core) this._core.stage.batchDraw();\n }\n\n private _loadImageFromString(src: string): void {\n Konva.Image.fromURL(src, (imgNode) => {\n const source = imgNode.image();\n if (source) {\n this._setImage(source);\n }\n });\n }\n\n private _layout(): void {\n if (!this._core || !this._image) return;\n const stage = this._core.stage;\n const stageWidth = stage.width();\n const stageHeight = stage.height();\n const scale = stage.scaleX();\n const stagePos = stage.position();\n\n const screenCenter = { x: Math.floor(stageWidth / 2), y: Math.floor(stageHeight / 2) };\n\n this._image.scale({ x: 1 / scale, y: 1 / scale });\n\n const imageWidth = this._width;\n const imageHeight = this._height;\n this._image.size({ width: imageWidth, height: imageHeight });\n this._image.offset({ x: imageWidth / 2, y: imageHeight / 2 });\n\n const worldX = (screenCenter.x - stagePos.x) / scale;\n const worldY = (screenCenter.y - stagePos.y) / scale;\n this._image.position({ x: worldX, y: worldY });\n this._image.opacity(this._opacity);\n\n if (this._layer) this._layer.moveToBottom();\n }\n}\n","import type Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\n\nexport interface CameraHotkeysOptions {\n target?: Window | Document | HTMLElement | EventTarget;\n zoomStep?: number; // multiplier for zoom (e.g., 1.1)\n panStep?: number; // pixels for arrows\n ignoreEditableTargets?: boolean;\n enableArrows?: boolean;\n enablePanning?: boolean;\n allowMiddleButtonPan?: boolean;\n allowRightButtonPan?: boolean;\n disableContextMenu?: boolean;\n}\n\nexport class CameraHotkeysPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<Omit<CameraHotkeysOptions, 'target'>> & { target: EventTarget };\n\n private _attached = false;\n private _panning = false;\n private _last: { x: number; y: number } | null = null;\n private _prevCursor: string | null = null;\n private _prevStageDraggable?: boolean;\n\n constructor(options: CameraHotkeysOptions = {}) {\n super();\n const {\n target = globalThis as unknown as EventTarget,\n zoomStep = 1.1,\n panStep = 40,\n ignoreEditableTargets = true,\n enableArrows = true,\n enablePanning = true,\n allowMiddleButtonPan = true,\n allowRightButtonPan = true,\n disableContextMenu = true,\n } = options;\n\n this._options = {\n target,\n zoomStep,\n panStep,\n ignoreEditableTargets,\n enableArrows,\n enablePanning,\n allowMiddleButtonPan,\n allowRightButtonPan,\n disableContextMenu,\n };\n }\n\n public setOptions(patch: Partial<CameraHotkeysOptions>): void {\n const prevDisableCtx = this._options.disableContextMenu;\n this._options = { ...this._options, ...patch } as typeof this._options;\n\n if (this._attached && this._core) {\n // Synchronization of zoom/pan steps\n if (typeof patch.zoomStep === 'number') {\n this._core.camera.setZoomStep(this._options.zoomStep);\n }\n if (typeof patch.panStep === 'number') {\n this._core.camera.setPanStep(this._options.panStep);\n }\n\n // Context menu toggle on the fly\n if (\n typeof patch.disableContextMenu === 'boolean' &&\n patch.disableContextMenu !== prevDisableCtx\n ) {\n const container = this._core.stage.container();\n if (this._options.disableContextMenu) {\n container.addEventListener('contextmenu', this._onContextMenuDOM as EventListener);\n } else {\n container.removeEventListener('contextmenu', this._onContextMenuDOM as EventListener);\n }\n }\n }\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n const stage: Konva.Stage = this._core.stage;\n\n if (typeof this._options.zoomStep === 'number') {\n this._core.camera.setZoomStep(this._options.zoomStep);\n }\n if (typeof this._options.panStep === 'number') {\n this._core.camera.setPanStep(this._options.panStep);\n }\n\n // Disable standard scene dragging with left mouse button, save previous state\n this._prevStageDraggable = stage.draggable();\n stage.draggable(false);\n\n // DOM keydown remains on target, since Konva does not generate key events\n const t = this._options.target as EventTarget & {\n addEventListener: (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: unknown,\n ) => void;\n };\n t.addEventListener('keydown', this._handleKeyDown as EventListener);\n\n // Konva mouse events with namespace .cameraHotkeys\n if (this._options.enablePanning) {\n stage.on('mousedown.cameraHotkeys', this._onMouseDownKonva);\n stage.on('mousemove.cameraHotkeys', this._onMouseMoveKonva);\n stage.on('mouseup.cameraHotkeys', this._onMouseUpKonva);\n stage.on('mouseleave.cameraHotkeys', this._onMouseLeaveKonva);\n if (this._options.disableContextMenu) {\n // Prevent context menu on container\n stage.container().addEventListener('contextmenu', this._onContextMenuDOM as EventListener);\n }\n }\n\n // Wheel: intercept on DOM level to prevent zooming when Shift is pressed\n stage.container().addEventListener(\n 'wheel',\n this._onWheelDOM as EventListener,\n {\n passive: false as unknown as boolean,\n capture: true as unknown as boolean,\n } as AddEventListenerOptions,\n );\n\n // Konva reserve protection: suppress wheel when ctrl is not pressed\n stage.on('wheel.cameraHotkeysGuard', (e: Konva.KonvaEventObject<WheelEvent>) => {\n if (!e.evt.ctrlKey) {\n e.evt.preventDefault();\n e.cancelBubble = true;\n }\n });\n\n this._attached = true;\n }\n\n protected onDetach(core: CoreEngine): void {\n if (!this._attached) return;\n\n const t = this._options.target as EventTarget & {\n removeEventListener: (\n type: string,\n listener: EventListenerOrEventListenerObject,\n options?: unknown,\n ) => void;\n };\n t.removeEventListener('keydown', this._handleKeyDown as EventListener);\n\n const stage = core.stage;\n stage.off('.cameraHotkeys');\n stage.off('.cameraHotkeysGuard');\n // снять DOM wheel/ctxmenu\n stage.container().removeEventListener('wheel', this._onWheelDOM as EventListener);\n if (this._options.enablePanning) {\n stage.container().removeEventListener('contextmenu', this._onContextMenuDOM as EventListener);\n }\n\n // Restore previous draggable state\n if (this._prevStageDraggable !== undefined) {\n stage.draggable(this._prevStageDraggable);\n }\n\n this._attached = false;\n this._last = null;\n this._prevCursor = null;\n }\n\n // ===================== Handlers (DOM wheel) =====================\n private _onWheelDOM = (e: WheelEvent) => {\n if (!this._core) return;\n\n // Zoom only when Ctrl is pressed. Meta is not considered.\n const isCtrlZoom = e.ctrlKey;\n if (isCtrlZoom) return;\n\n // Otherwise, pan according to rules and fully suppress the event\n e.preventDefault();\n // Stop event bubbling and immediate processing by other listeners (including Konva)\n e.stopPropagation();\n (e as unknown as { stopImmediatePropagation?: () => void }).stopImmediatePropagation?.();\n\n const { deltaX, deltaY, shiftKey } = e;\n\n if (this._isTouchpadWheel(e)) {\n // Touchpad: free panning\n if (shiftKey) {\n // With Shift held down, we use the dominant component (horizontal or vertical)\n // and project it onto the X axis (movement only along X). This allows swiping\n // both left/right and up/down for X movement.\n const primary = Math.abs(deltaX) >= Math.abs(deltaY) ? deltaX : deltaY;\n const dx = -primary;\n this._pan(dx, 0);\n } else {\n // Without Shift, free panning along both axes\n const dx = -deltaX;\n const dy = -deltaY;\n this._pan(dx, dy);\n }\n return;\n }\n\n // Mouse: without Shift — Y axis; with Shift — X axis (up => left, down => right)\n if (shiftKey) {\n const dx = deltaY < 0 ? -Math.abs(deltaY) : Math.abs(deltaY);\n this._pan(dx, 0);\n } else {\n const dy = -deltaY;\n this._pan(0, dy);\n }\n };\n\n // ===================== Handlers (Konva) =====================\n private _onMouseDownKonva = (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core || !this._options.enablePanning) return;\n const btn = e.evt.button;\n // Allow panning only for middle (1) and right (2) buttons. Left button is ignored.\n const allow =\n (this._options.allowMiddleButtonPan && btn === 1) ||\n (this._options.allowRightButtonPan && btn === 2);\n if (!allow) return;\n\n this._panning = true;\n const p = this._core.stage.getPointerPosition();\n if (p) this._last = { x: p.x, y: p.y };\n\n const container = this._core.stage.container();\n this._prevCursor = container.style.cursor || null;\n container.style.cursor = 'grabbing';\n\n e.evt.preventDefault();\n };\n\n private _onMouseMoveKonva = (_e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core || !this._options.enablePanning) return;\n if (!this._panning || !this._last) return;\n const p = this._core.stage.getPointerPosition();\n if (!p) return;\n const dx = p.x - this._last.x;\n const dy = p.y - this._last.y;\n this._pan(dx, dy);\n this._last = { x: p.x, y: p.y };\n };\n\n private _onMouseUpKonva = (_e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._options.enablePanning) return;\n this._panning = false;\n this._last = null;\n if (!this._core) return;\n const container = this._core.stage.container();\n if (this._prevCursor !== null) {\n container.style.cursor = this._prevCursor;\n this._prevCursor = null;\n } else {\n container.style.removeProperty('cursor');\n }\n };\n\n private _onMouseLeaveKonva = (_e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._options.enablePanning) return;\n this._panning = false;\n this._last = null;\n if (!this._core) return;\n const container = this._core.stage.container();\n if (this._prevCursor !== null) {\n container.style.cursor = this._prevCursor;\n this._prevCursor = null;\n } else {\n container.style.removeProperty('cursor');\n }\n };\n\n private _onContextMenuDOM = (e: MouseEvent) => {\n if (this._options.disableContextMenu) e.preventDefault();\n };\n\n // ===================== Handlers (DOM keydown) =====================\n private _handleKeyDown = (e: KeyboardEvent) => {\n if (this._options.ignoreEditableTargets && this._isEditableTarget(e.target)) return;\n if (!this._core) return;\n\n // +/- zoom through CameraManager (using zoomStep from camera)\n const isPlus = e.code === 'Equal' || e.code === 'NumpadAdd';\n const isMinus = e.code === 'Minus' || e.code === 'NumpadSubtract';\n if (isPlus || isMinus) {\n e.preventDefault();\n if (isPlus) this._core.camera.zoomIn();\n else this._core.camera.zoomOut();\n return;\n }\n\n // Arrows — panning by fixed step\n if (this._options.enableArrows) {\n const step = this._core.camera.panStep;\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n this._pan(step, 0);\n return;\n case 'ArrowRight':\n e.preventDefault();\n this._pan(-step, 0);\n return;\n case 'ArrowUp':\n e.preventDefault();\n this._pan(0, step);\n return;\n case 'ArrowDown':\n e.preventDefault();\n this._pan(0, -step);\n return;\n }\n }\n };\n\n // ===================== Utils =====================\n private _isEditableTarget(el: EventTarget | null): boolean {\n const t = el as HTMLElement | null;\n if (!t) return false;\n const tag = t.tagName;\n return t.isContentEditable || tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n }\n\n private _isTouchpadWheel(e: WheelEvent): boolean {\n // Simple heuristics: pixel mode (deltaMode === 0) and presence of horizontal delta\n // or small deltaY values indicate touchpad\n const isPixel = e.deltaMode === 0;\n return isPixel && (Math.abs(e.deltaX) > 0 || Math.abs(e.deltaY) < 50);\n }\n\n private _pan(dx: number, dy: number) {\n if (!this._core) return;\n // Pan the world, not the stage, to keep grid and content in the same coordinate system\n const world = this._core.nodes.world;\n const newX = world.x() + dx;\n const newY = world.y() + dy;\n world.position({ x: newX, y: newY });\n // Emit camera pan event\n this._core.eventBus.emit('camera:pan', { dx, dy, position: { x: newX, y: newY } });\n this._core.stage.batchDraw();\n }\n}\n","import Konva from 'konva';\n\nimport type { BaseNode } from '../nodes/BaseNode';\n\nexport interface MultiGroupControllerDeps {\n ensureTempMulti: (nodes: BaseNode[]) => void;\n destroyTempMulti: () => void;\n commitTempMultiToGroup: () => void;\n isActive: () => boolean;\n forceUpdate: () => void;\n onWorldChanged?: () => void;\n // true, если target принадлежит временной группе в текущем состоянии\n isInsideTempByTarget?: (target: Konva.Node) => boolean;\n}\n\n/**\n * MultiGroupController — thin controller encapsulating work with temporary multi-group.\n * Actual logic lives in passed dependencies (SelectionPlugin),\n * thanks to which we don't duplicate code for frames/overlays and behavior.\n */\nexport class MultiGroupController {\n private deps: MultiGroupControllerDeps;\n\n constructor(deps: MultiGroupControllerDeps) {\n this.deps = deps;\n }\n\n public ensure(nodes: BaseNode[]) {\n this.deps.ensureTempMulti(nodes);\n }\n\n public destroy() {\n this.deps.destroyTempMulti();\n }\n\n public commitToPermanentGroup() {\n this.deps.commitTempMultiToGroup();\n }\n\n public isActive(): boolean {\n return this.deps.isActive();\n }\n\n public forceUpdateOverlays() {\n this.deps.forceUpdate();\n }\n\n public onWorldChanged() {\n if (this.deps.onWorldChanged) this.deps.onWorldChanged();\n else this.deps.forceUpdate();\n }\n\n public isInsideTempByTarget(target: Konva.Node): boolean {\n if (this.deps.isInsideTempByTarget) return this.deps.isInsideTempByTarget(target);\n return false;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\n/**\n * Stretches side anchors (top/right/bottom/left) to the full side of the node and hides them visually,\n * leaving hit-area. Takes real geometry into account when rotating (as in SelectionPlugin).\n */\nexport function restyleSideAnchorsForTr(\n core: CoreEngine | undefined,\n tr: Konva.Transformer | null,\n node: Konva.Node | null,\n thicknessPx = 6,\n): void {\n if (!core || !tr || !node) return;\n\n const bbox = node.getClientRect({ skipShadow: true, skipStroke: false });\n const localRect = node.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: true });\n const abs = node.getAbsoluteScale();\n const absX = Math.abs(abs.x) || 1;\n const absY = Math.abs(abs.y) || 1;\n const sideLenW = localRect.width * absX; // верх/низ в экранных координатах\n const sideLenH = localRect.height * absY; // лево/право в экранных координатах\n const rotDeg = (() => {\n const d = node.getAbsoluteTransform().decompose();\n return typeof d.rotation === 'number' ? d.rotation : 0;\n })();\n const isRotated = Math.abs(((rotDeg % 180) + 180) % 180) > 0.5;\n\n const aTop = tr.findOne<Konva.Rect>('.top-center');\n const aRight = tr.findOne<Konva.Rect>('.middle-right');\n const aBottom = tr.findOne<Konva.Rect>('.bottom-center');\n const aLeft = tr.findOne<Konva.Rect>('.middle-left');\n\n if (aTop) {\n const width = isRotated ? sideLenW : bbox.width;\n const height = thicknessPx;\n aTop.setAttrs({ opacity: 0, width, height, offsetX: width / 2, offsetY: 0 });\n }\n if (aBottom) {\n const width = isRotated ? sideLenW : bbox.width;\n const height = thicknessPx;\n aBottom.setAttrs({ opacity: 0, width, height, offsetX: width / 2, offsetY: height });\n }\n if (aLeft) {\n const width = thicknessPx;\n const height = isRotated ? sideLenH : bbox.height;\n aLeft.setAttrs({ opacity: 0, width, height, offsetX: 0, offsetY: height / 2 });\n }\n if (aRight) {\n const width = thicknessPx;\n const height = isRotated ? sideLenH : bbox.height;\n aRight.setAttrs({ opacity: 0, width, height, offsetX: width, offsetY: height / 2 });\n }\n}\n","import Konva from 'konva';\n\n/**\n * Unified factory for rotation handles of the frame.\n * Parameters correspond to those implemented in SelectionPlugin.\n */\nexport function makeRotateHandle(name: string): Konva.Circle {\n return new Konva.Circle({\n name,\n radius: 4,\n width: 25,\n height: 25,\n fill: '#ffffff',\n stroke: '#2b83ff',\n strokeWidth: 1.5,\n // Make the handler invisible visually, but keep interactivity\n opacity: 0,\n // Increase cursor hit area to make it easier to hit\n hitStrokeWidth: 16,\n draggable: true,\n dragOnTop: true,\n listening: true,\n cursor: 'pointer',\n });\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { restyleSideAnchorsForTr } from './OverlayAnchors';\nimport { makeRotateHandle } from './RotateHandleFactory';\n\nexport interface RotateHandlesControllerOpts {\n core: CoreEngine;\n getNode: () => Konva.Node | null;\n getTransformer: () => Konva.Transformer | null;\n onUpdate?: () => void;\n}\n\nexport class RotateHandlesController {\n private core: CoreEngine;\n private getNode: () => Konva.Node | null;\n private getTransformer: () => Konva.Transformer | null;\n private onUpdate?: () => void;\n\n private group: Konva.Group | null = null;\n private handles: {\n tl: Konva.Circle | null;\n tr: Konva.Circle | null;\n br: Konva.Circle | null;\n bl: Konva.Circle | null;\n } = {\n tl: null,\n tr: null,\n br: null,\n bl: null,\n };\n private dragState: { base: number; start: number } | null = null;\n private centerAbsStart: Konva.Vector2d | null = null;\n\n constructor(opts: RotateHandlesControllerOpts) {\n this.core = opts.core;\n this.getNode = opts.getNode;\n this.getTransformer = opts.getTransformer;\n if (opts.onUpdate) {\n this.onUpdate = opts.onUpdate;\n }\n }\n\n public attach(): void {\n const node = this.getNode();\n if (!node) return;\n const layer = this.core.nodes.layer;\n this.detach();\n const group = new Konva.Group({ name: 'rotate-handles-group', listening: true });\n layer.add(group);\n this.group = group;\n\n const tl = makeRotateHandle('rotate-tl');\n const tr = makeRotateHandle('rotate-tr');\n const br = makeRotateHandle('rotate-br');\n const bl = makeRotateHandle('rotate-bl');\n group.add(tl);\n group.add(tr);\n group.add(br);\n group.add(bl);\n this.handles = { tl, tr, br, bl };\n\n const bindRotate = (h: Konva.Circle) => {\n // Cursor: pointer on hover\n h.on('mouseenter.rotate', () => {\n this.core.stage.container().style.cursor = 'pointer';\n });\n h.on('mouseleave.rotate', () => {\n // Return cursor to default\n this.core.stage.container().style.cursor = 'default';\n });\n h.on('dragstart.rotate', () => {\n const n = this.getNode();\n if (!n) return;\n const dec = n.getAbsoluteTransform().decompose();\n this.centerAbsStart = this.getNodeCenterAbs(n);\n const p = this.core.stage.getPointerPosition() ?? h.getAbsolutePosition();\n const start =\n (Math.atan2(p.y - this.centerAbsStart.y, p.x - this.centerAbsStart.x) * 180) / Math.PI;\n this.dragState = { base: dec.rotation || 0, start };\n this.core.stage.draggable(false);\n this.core.stage.container().style.cursor = 'grabbing';\n // гарантируем правильный z-порядок: рамка сверху, кружки ниже\n this.getTransformer()?.moveToTop();\n this.placeBelowTransformer();\n });\n h.on('dragmove.rotate', (e: Konva.KonvaEventObject<DragEvent>) => {\n const n = this.getNode();\n if (!n || !this.dragState) return;\n const centerRef = this.centerAbsStart ?? this.getNodeCenterAbs(n);\n const pointer = this.core.stage.getPointerPosition() ?? h.getAbsolutePosition();\n const curr = (Math.atan2(pointer.y - centerRef.y, pointer.x - centerRef.x) * 180) / Math.PI;\n let rot = this.dragState.base + (curr - this.dragState.start);\n // Shift snaps через Transformer\n const tr = this.getTransformer();\n if (e.evt.shiftKey && tr) {\n const norm = (deg: number) => {\n let x = deg % 360;\n if (x < 0) x += 360;\n return x;\n };\n const angDiff = (a: number, b: number) => {\n let d = norm(a - b + 180) - 180;\n return d;\n };\n const snaps = Array.isArray(tr.rotationSnaps())\n ? tr.rotationSnaps().map((v) => norm(v))\n : undefined;\n let tol = typeof tr.rotationSnapTolerance === 'function' ? tr.rotationSnapTolerance() : 5;\n if (snaps?.length) {\n const rotN = norm(rot);\n let best = rot;\n let bestDiff = Infinity;\n for (const a of snaps) {\n const d = Math.abs(angDiff(rotN, a));\n if (d < bestDiff && d <= tol) {\n best = a;\n bestDiff = d;\n }\n }\n if (bestDiff !== Infinity) rot = best;\n }\n }\n n.rotation(rot);\n if (this.centerAbsStart) {\n const centerAfter = this.getNodeCenterAbs(n);\n const dxAbs = this.centerAbsStart.x - centerAfter.x;\n const dyAbs = this.centerAbsStart.y - centerAfter.y;\n const parent = n.getParent();\n if (parent) {\n const inv = parent.getAbsoluteTransform().copy().invert();\n const from = inv.point({ x: centerAfter.x, y: centerAfter.y });\n const to = inv.point({ x: centerAfter.x + dxAbs, y: centerAfter.y + dyAbs });\n const nx = n.x() + (to.x - from.x);\n const ny = n.y() + (to.y - from.y);\n n.position({ x: nx, y: ny });\n }\n }\n const tr2 = this.getTransformer();\n tr2?.forceUpdate();\n if (tr2) restyleSideAnchorsForTr(this.core, tr2, n);\n this.updatePosition();\n // keep below Transformer while moving\n this.placeBelowTransformer();\n this.core.nodes.layer.batchDraw();\n // Notify OverlayFrameManager to update the label below\n if (this.onUpdate) this.onUpdate();\n });\n h.on('dragend.rotate', () => {\n this.dragState = null;\n this.centerAbsStart = null;\n // IMPORTANT: DO NOT enable stage.draggable(true), so that LMB does not pan\n this.core.stage.draggable(false);\n this.updatePosition();\n this.placeBelowTransformer();\n this.core.stage.container().style.cursor = 'pointer';\n if (this.onUpdate) this.onUpdate();\n });\n };\n\n bindRotate(tl);\n bindRotate(tr);\n bindRotate(br);\n bindRotate(bl);\n // initial layout: circles below transformer\n this.updatePosition();\n this.placeBelowTransformer();\n }\n\n public detach(): void {\n if (this.group) {\n this.group.destroy();\n this.group = null;\n }\n this.handles = { tl: null, tr: null, br: null, bl: null };\n this.dragState = null;\n this.centerAbsStart = null;\n }\n\n public moveToTop(): void {\n // compatibility: do not raise above the frame, but only place below it\n this.placeBelowTransformer();\n }\n\n public updatePosition(): void {\n const n = this.getNode();\n if (!n || !this.group) return;\n const local = n.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: false });\n const width = local.width;\n const height = local.height;\n if (width <= 0 || height <= 0) return;\n const tr = n.getAbsoluteTransform().copy();\n const mapAbs = (pt: { x: number; y: number }) => tr.point(pt);\n const offset = 12;\n const centerAbs = mapAbs({ x: local.x + width / 2, y: local.y + height / 2 });\n const c0 = mapAbs({ x: local.x, y: local.y });\n const c1 = mapAbs({ x: local.x + width, y: local.y });\n const c2 = mapAbs({ x: local.x + width, y: local.y + height });\n const c3 = mapAbs({ x: local.x, y: local.y + height });\n const dir = (c: { x: number; y: number }) => {\n const vx = c.x - centerAbs.x;\n const vy = c.y - centerAbs.y;\n const len = Math.hypot(vx, vy) || 1;\n return { x: vx / len, y: vy / len };\n };\n const d0 = dir(c0),\n d1 = dir(c1),\n d2 = dir(c2),\n d3 = dir(c3);\n const p0 = { x: c0.x + d0.x * offset, y: c0.y + d0.y * offset };\n const p1 = { x: c1.x + d1.x * offset, y: c1.y + d1.y * offset };\n const p2 = { x: c2.x + d2.x * offset, y: c2.y + d2.y * offset };\n const p3 = { x: c3.x + d3.x * offset, y: c3.y + d3.y * offset };\n if (this.handles.tl) this.handles.tl.absolutePosition(p0);\n if (this.handles.tr) this.handles.tr.absolutePosition(p1);\n if (this.handles.br) this.handles.br.absolutePosition(p2);\n if (this.handles.bl) this.handles.bl.absolutePosition(p3);\n this.placeBelowTransformer();\n }\n\n private placeBelowTransformer(): void {\n if (!this.group) return;\n const tr = this.getTransformer();\n const layer = this.core.nodes.layer;\n if (tr && tr.getLayer() === layer) {\n // Fix: use moveDown() instead of zIndex(value)\n const trIndex = tr.zIndex();\n const groupIndex = this.group.zIndex();\n\n // Move the group so that it is below the transformer\n if (groupIndex >= trIndex) {\n const diff = groupIndex - trIndex + 1;\n for (let i = 0; i < diff && this.group.zIndex() > 0; i++) {\n this.group.moveDown();\n }\n }\n } else {\n this.group.moveToBottom();\n }\n }\n\n private getNodeCenterAbs(node: Konva.Node): Konva.Vector2d {\n const tr = node.getAbsoluteTransform().copy();\n const local = node.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: false });\n const cx = local.x + local.width / 2;\n const cy = local.y + local.height / 2;\n return tr.point({ x: cx, y: cy });\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { restyleSideAnchorsForTr } from './OverlayAnchors';\nimport { RotateHandlesController } from './RotateHandlesController';\n\ninterface AttachOptions {\n keepRatioCornerOnlyShift?: () => boolean;\n}\n\n/**\n * OverlayFrameManager\n * Unified manager for Transformer + size label + hit-rect + rotation handles\n * for any Konva node/group. Used both for regular selection and temporary group.\n */\nexport class OverlayFrameManager {\n private core: CoreEngine;\n private tr: Konva.Transformer | null = null;\n private sizeLabel: Konva.Label | null = null;\n private rotateGroup: Konva.Group | null = null;\n private rotateCtrl: RotateHandlesController | null = null;\n private keepRatioPredicate: (() => boolean) | null = null;\n private boundNode: Konva.Node | null = null;\n private hitRect: Konva.Rect | null = null;\n // Saved position of opposite corner at start of transformation (for fixing origin)\n private transformOppositeCorner: { x: number; y: number } | null = null;\n // Visibility state during drag\n private trWasVisibleBeforeDrag = false;\n private labelWasVisibleBeforeDrag = false;\n private rotateWasVisibleBeforeDrag = false;\n private rotateCtrlWasAttachedBeforeDrag = false;\n\n constructor(core: CoreEngine) {\n this.core = core;\n }\n\n public attach(node: Konva.Node, options?: AttachOptions) {\n this.detach();\n this.boundNode = node;\n this.keepRatioPredicate = options?.keepRatioCornerOnlyShift ?? null;\n\n const layer = this.core.nodes.layer;\n\n // Transformer\n const tr = new Konva.Transformer({\n rotateEnabled: false,\n keepRatio: false,\n rotationSnapTolerance: 15,\n rotationSnaps: [\n 0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285,\n 300, 315, 330, 345, 360,\n ],\n enabledAnchors: [\n 'top-left',\n 'top-center',\n 'top-right',\n 'middle-left',\n 'middle-right',\n 'bottom-left',\n 'bottom-center',\n 'bottom-right',\n ],\n borderEnabled: true,\n borderStroke: '#2b83ff',\n borderStrokeWidth: 1.5,\n name: 'overlay-transformer',\n });\n layer.add(tr);\n tr.nodes([node]);\n // Global size constraint: prevent collapsing to 0\n tr.boundBoxFunc((_, newBox) => {\n const MIN = 1; // px\n const w = Math.max(MIN, Math.abs(newBox.width));\n const h = Math.max(MIN, Math.abs(newBox.height));\n return { ...newBox, width: w, height: h };\n });\n this.tr = tr;\n\n // Side anchors in a unified style\n restyleSideAnchorsForTr(this.core, tr, node);\n\n // Dynamic keepRatio by Shift for corner anchors\n const updateKeepRatio = () => {\n const active = typeof tr.getActiveAnchor === 'function' ? tr.getActiveAnchor() : '';\n const isCorner =\n active === 'top-left' ||\n active === 'top-right' ||\n active === 'bottom-left' ||\n active === 'bottom-right';\n const pressed = this.keepRatioPredicate ? this.keepRatioPredicate() : false;\n tr.keepRatio(isCorner && pressed);\n };\n tr.on('transformstart.overlayKeepRatio', () => {\n updateKeepRatio();\n\n // Save absolute position of opposite corner for fixing origin\n // ONLY for corner anchors\n const activeAnchor = typeof tr.getActiveAnchor === 'function' ? tr.getActiveAnchor() : '';\n const isCornerAnchor =\n activeAnchor === 'top-left' ||\n activeAnchor === 'top-right' ||\n activeAnchor === 'bottom-left' ||\n activeAnchor === 'bottom-right';\n\n if (isCornerAnchor) {\n // For groups use clientRect, for single nodes — width/height\n const isGroup = node instanceof Konva.Group;\n let width: number;\n let height: number;\n let localX = 0;\n let localY = 0;\n\n if (isGroup) {\n const clientRect = node.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: false,\n });\n width = clientRect.width;\n height = clientRect.height;\n localX = clientRect.x;\n localY = clientRect.y;\n } else {\n width = node.width();\n height = node.height();\n }\n\n const absTransform = node.getAbsoluteTransform();\n\n // Determine local coordinates of opposite corner\n let oppositeX = 0;\n let oppositeY = 0;\n\n if (activeAnchor === 'top-left') {\n oppositeX = localX + width;\n oppositeY = localY + height;\n } else if (activeAnchor === 'top-right') {\n oppositeX = localX;\n oppositeY = localY + height;\n } else if (activeAnchor === 'bottom-right') {\n oppositeX = localX;\n oppositeY = localY;\n } else {\n oppositeX = localX + width;\n oppositeY = localY;\n }\n\n // Convert to absolute coordinates\n this.transformOppositeCorner = absTransform.point({ x: oppositeX, y: oppositeY });\n } else {\n // For side anchors do not fix angle\n this.transformOppositeCorner = null;\n }\n });\n tr.on('transform.overlayKeepRatio', updateKeepRatio);\n\n // Update custom side anchors and rotation handles during transformation\n const onTransform = () => {\n if (!this.boundNode) return;\n\n // Correct node position to keep opposite corner in place\n if (this.transformOppositeCorner) {\n const activeAnchor = typeof tr.getActiveAnchor === 'function' ? tr.getActiveAnchor() : '';\n const absTransform = this.boundNode.getAbsoluteTransform();\n\n // For groups use clientRect, for single nodes — width/height\n const isGroup = this.boundNode instanceof Konva.Group;\n let width: number;\n let height: number;\n let localX = 0;\n let localY = 0;\n\n if (isGroup) {\n const clientRect = this.boundNode.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: false,\n });\n width = clientRect.width;\n height = clientRect.height;\n localX = clientRect.x;\n localY = clientRect.y;\n } else {\n width = this.boundNode.width();\n height = this.boundNode.height();\n }\n\n // Determine local coordinates of opposite corner\n let oppositeX = 0;\n let oppositeY = 0;\n\n if (activeAnchor === 'top-left') {\n oppositeX = localX + width;\n oppositeY = localY + height;\n } else if (activeAnchor === 'top-right') {\n oppositeX = localX;\n oppositeY = localY + height;\n } else if (activeAnchor === 'bottom-right') {\n oppositeX = localX;\n oppositeY = localY;\n } else if (activeAnchor === 'bottom-left') {\n oppositeX = localX + width;\n oppositeY = localY;\n }\n\n // Current absolute position of opposite corner\n const currentOpposite = absTransform.point({ x: oppositeX, y: oppositeY });\n\n // Calculate offset\n const dx = this.transformOppositeCorner.x - currentOpposite.x;\n const dy = this.transformOppositeCorner.y - currentOpposite.y;\n\n // Correct node position in local coordinates of parent\n const parent = this.boundNode.getParent();\n if (parent && (Math.abs(dx) > 0.01 || Math.abs(dy) > 0.01)) {\n const parentInv = parent.getAbsoluteTransform().copy().invert();\n const currentPosAbs = this.boundNode.getAbsolutePosition();\n const newPosAbs = { x: currentPosAbs.x + dx, y: currentPosAbs.y + dy };\n const newPosLocal = parentInv.point(newPosAbs);\n this.boundNode.position(newPosLocal);\n }\n }\n\n this.tr?.forceUpdate();\n restyleSideAnchorsForTr(this.core, this.tr, this.boundNode);\n this.rotateCtrl?.updatePosition();\n // Keep Transformer above rotation handles\n this.tr?.moveToTop();\n layer.batchDraw();\n };\n tr.on('transform.overlayFrameTransform', onTransform);\n tr.on('transformend.overlayFrameTransform', () => {\n // Reset saved opposite corner after transformation\n this.transformOppositeCorner = null;\n onTransform();\n });\n\n // Size label\n this.ensureSizeLabel();\n this.updateSizeLabel();\n\n // Hit-rect\n this.updateHitRect();\n\n // Rotate handles (through common controller)\n if (this.rotateCtrl) {\n this.rotateCtrl.detach();\n this.rotateCtrl = null;\n }\n this.rotateCtrl = new RotateHandlesController({\n core: this.core,\n getNode: () => this.boundNode,\n getTransformer: () => this.tr,\n onUpdate: () => {\n // Update position of label below on rotation (like on zoom)\n this.forceUpdate();\n this.core.nodes.layer.batchDraw();\n },\n });\n this.rotateCtrl.attach();\n // Position handles immediately and guarantee that the frame is above them\n this.rotateCtrl.updatePosition();\n this.tr.moveToTop();\n\n layer.batchDraw();\n }\n\n public detach() {\n // remove transformer and overlays\n if (this.tr) {\n this.tr.off('.overlayKeepRatio');\n this.tr.off('.overlayFrameTransform');\n this.tr.destroy();\n this.tr = null;\n }\n this.transformOppositeCorner = null;\n if (this.sizeLabel) {\n this.sizeLabel.destroy();\n this.sizeLabel = null;\n }\n if (this.hitRect) {\n this.hitRect.destroy();\n this.hitRect = null;\n }\n if (this.rotateGroup) {\n this.rotateGroup.destroy();\n this.rotateGroup = null;\n }\n // rotate controller\n if (this.rotateCtrl) {\n this.rotateCtrl.detach();\n this.rotateCtrl = null;\n }\n }\n\n public forceUpdate() {\n if (!this.boundNode) return;\n this.tr?.forceUpdate();\n restyleSideAnchorsForTr(this.core, this.tr, this.boundNode);\n this.rotateCtrl?.updatePosition();\n // Держим Transformer выше ротационных хендлеров\n this.tr?.moveToTop();\n this.updateSizeLabel();\n this.updateHitRect();\n }\n\n public onWorldChanged() {\n this.forceUpdate();\n }\n // ===== Drag visibility control =====\n public hideOverlaysForDrag() {\n if (this.tr) {\n this.trWasVisibleBeforeDrag = this.tr.visible();\n this.tr.visible(false);\n } else {\n this.trWasVisibleBeforeDrag = false;\n }\n if (this.sizeLabel) {\n this.labelWasVisibleBeforeDrag = this.sizeLabel.visible();\n this.sizeLabel.visible(false);\n } else {\n this.labelWasVisibleBeforeDrag = false;\n }\n if (this.rotateGroup) {\n this.rotateWasVisibleBeforeDrag = this.rotateGroup.visible();\n this.rotateGroup.visible(false);\n } else {\n this.rotateWasVisibleBeforeDrag = false;\n }\n // Hide rotation handles of the controller (if any): through detach\n if (this.rotateCtrl) {\n this.rotateCtrlWasAttachedBeforeDrag = true;\n this.rotateCtrl.detach();\n } else {\n this.rotateCtrlWasAttachedBeforeDrag = false;\n }\n }\n\n public restoreOverlaysAfterDrag() {\n if (this.tr && this.trWasVisibleBeforeDrag) this.tr.visible(true);\n if (this.sizeLabel && this.labelWasVisibleBeforeDrag) this.sizeLabel.visible(true);\n if (this.rotateGroup && this.rotateWasVisibleBeforeDrag) this.rotateGroup.visible(true);\n // Restore rotation handles of the controller through re-attach\n if (this.rotateCtrl && this.rotateCtrlWasAttachedBeforeDrag) {\n this.rotateCtrl.attach();\n this.rotateCtrl.updatePosition();\n this.tr?.moveToTop();\n }\n this.trWasVisibleBeforeDrag = false;\n this.labelWasVisibleBeforeDrag = false;\n this.rotateWasVisibleBeforeDrag = false;\n this.rotateCtrlWasAttachedBeforeDrag = false;\n this.forceUpdate();\n }\n\n // ===== Overlays: Size Label =====\n private ensureSizeLabel() {\n const layer = this.core.nodes.layer;\n if (this.sizeLabel) this.sizeLabel.destroy();\n const label = new Konva.Label({ listening: false, opacity: 0.95 });\n const tag = new Konva.Tag({ fill: '#2b83ff', cornerRadius: 4, lineJoin: 'round' });\n const text = new Konva.Text({\n text: '',\n fontFamily: 'Inter, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell',\n fontSize: 12,\n fill: '#ffffff',\n padding: 6,\n align: 'center',\n });\n label.add(tag);\n label.add(text);\n layer.add(label);\n this.sizeLabel = label;\n }\n\n private updateSizeLabel() {\n if (!this.boundNode || !this.sizeLabel) return;\n const world = this.core.nodes.world;\n const bbox = this.boundNode.getClientRect({ skipShadow: true, skipStroke: true });\n const logicalW = bbox.width / Math.max(1e-6, world.scaleX());\n const logicalH = bbox.height / Math.max(1e-6, world.scaleY());\n const w = Math.max(0, Math.round(logicalW));\n const h = Math.max(0, Math.round(logicalH));\n const text = this.sizeLabel.getText();\n text.text(String(w) + ' × ' + String(h));\n const offset = 8;\n const bottomX = bbox.x + bbox.width / 2;\n const bottomY = bbox.y + bbox.height + offset;\n const rect = this.sizeLabel.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const labelW = rect.width;\n this.sizeLabel.setAttrs({ x: bottomX - labelW / 2, y: bottomY });\n this.sizeLabel.moveToTop();\n }\n\n // ===== Overlays: Hit Rect =====\n private updateHitRect() {\n if (!this.boundNode) return;\n const layer = this.core.nodes.layer;\n const local = this.boundNode.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const topLeft = { x: local.x, y: local.y };\n const w = local.width;\n const h = local.height;\n if (!this.hitRect) {\n const rect = new Konva.Rect({\n name: 'overlay-hit',\n x: topLeft.x,\n y: topLeft.y,\n width: w,\n height: h,\n fill: 'rgba(0,0,0,0.001)',\n listening: true,\n perfectDrawEnabled: false,\n });\n rect.on('mousedown.overlayHit', (ev: Konva.KonvaEventObject<MouseEvent>) => {\n if (ev.evt.button !== 0) return;\n ev.cancelBubble = true;\n const anyGrp = this.boundNode as unknown as { startDrag?: () => void };\n if (typeof anyGrp.startDrag === 'function') anyGrp.startDrag();\n });\n if (this.boundNode instanceof Konva.Container) {\n this.boundNode.add(rect);\n rect.moveToBottom();\n this.hitRect = rect;\n layer.batchDraw();\n } else {\n rect.destroy();\n }\n return;\n }\n this.hitRect.position(topLeft);\n this.hitRect.size({ width: w, height: h });\n this.hitRect.moveToBottom();\n }\n}\n","/**\n * DebounceHelper - utility for debouncing (delayed execution)\n *\n * Used to group multiple calls into one through requestAnimationFrame.\n * Useful for optimizing UI updates - instead of updating on every event,\n * we update once in the next frame.\n *\n * @example\n * ```typescript\n * private _debounce = new DebounceHelper();\n *\n * onTransform() {\n * this._debounce.schedule(() => {\n * this._updateUI();\n * });\n * }\n * ```\n */\nexport class DebounceHelper {\n private _scheduled = false;\n\n /**\n * Schedules execution of callback in the next frame\n * If already scheduled - ignores repeated calls\n *\n * @param callback - function to execute\n */\n public schedule(callback: () => void): void {\n if (this._scheduled) return;\n\n this._scheduled = true;\n\n globalThis.requestAnimationFrame(() => {\n this._scheduled = false;\n callback();\n });\n }\n\n /**\n * Checks if execution is scheduled\n */\n public isScheduled(): boolean {\n return this._scheduled;\n }\n\n /**\n * Cancels scheduled execution\n * Note: does not cancel already scheduled requestAnimationFrame,\n * but prevents callback execution\n */\n public cancel(): void {\n this._scheduled = false;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\nimport type { BaseNode } from '../nodes/BaseNode';\nimport { MultiGroupController } from '../utils/MultiGroupController';\nimport { restyleSideAnchorsForTr as restyleSideAnchorsUtil } from '../utils/OverlayAnchors';\nimport { makeRotateHandle } from '../utils/RotateHandleFactory';\nimport { OverlayFrameManager } from '../utils/OverlayFrameManager';\nimport { ThrottleHelper } from '../utils/ThrottleHelper';\nimport { DebounceHelper } from '../utils/DebounceHelper';\n\nimport { Plugin } from './Plugin';\n\n// Konva node with draggable() getter/setter support\ntype DraggableNode = Konva.Node & { draggable(value?: boolean): boolean };\n\nexport interface SelectionPluginOptions {\n // Allow dragging of selected node\n dragEnabled?: boolean;\n // Add visual Transformer for selected node\n enableTransformer?: boolean;\n // Deselect on empty area click\n deselectOnEmptyClick?: boolean;\n // Custom check if specific Konva.Node can be selected\n selectablePredicate?: (node: Konva.Node) => boolean;\n // Auto-pan world when dragging near screen edges\n autoPanEnabled?: boolean;\n // Edge zone width (px)\n autoPanEdgePx?: number;\n // Max auto-pan speed in px/frame\n autoPanMaxSpeedPx?: number;\n}\n\n/**\n * Universal selection and dragging plugin for nodes compatible with BaseNode.\n *\n * Default behavior:\n * - Click on node in NodeManager layer selects the node\n * - Selected node becomes draggable (dragEnabled)\n * - Click on empty area deselects (deselectOnEmptyClick)\n * - Optionally enable Konva.Transformer (enableTransformer)\n */\nexport class SelectionPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<SelectionPluginOptions>;\n\n private _selected: BaseNode | null = null;\n private _prevDraggable: boolean | null = null;\n private _transformer: Konva.Transformer | null = null;\n private _transformerWasVisibleBeforeDrag = false;\n private _cornerHandlesWereVisibleBeforeDrag = false;\n private _sizeLabelWasVisibleBeforeDrag = false;\n // Visibility state for rotation handles during drag\n private _rotateHandlesWereVisibleBeforeDrag = false;\n // Group and references to corner handles for rounding\n private _cornerHandlesGroup: Konva.Group | null = null;\n private _cornerHandles: {\n tl: Konva.Circle | null;\n tr: Konva.Circle | null;\n br: Konva.Circle | null;\n bl: Konva.Circle | null;\n } = { tl: null, tr: null, br: null, bl: null };\n // Flag to suppress corner-radius handles during transformation\n private _cornerHandlesSuppressed = false;\n // Saved opposite corner position at transformation start (to fix origin)\n private _transformOppositeCorner: { x: number; y: number } | null = null;\n // Label with selected node dimensions (width × height)\n private _sizeLabel: Konva.Label | null = null;\n // Label for displaying radius on hover/drag of corner handles\n private _radiusLabel: Konva.Label | null = null;\n // Group and references to rotation corner handles\n private _rotateHandlesGroup: Konva.Group | null = null;\n private _rotateHandles: {\n tl: Konva.Circle | null;\n tr: Konva.Circle | null;\n br: Konva.Circle | null;\n bl: Konva.Circle | null;\n } = { tl: null, tr: null, br: null, bl: null };\n private _rotateDragState: { base: number; start: number } | null = null;\n // Absolute center at rotation start — for position compensation\n private _rotateCenterAbsStart: { x: number; y: number } | null = null;\n // Saved stage.draggable() state before rotation starts\n private _prevStageDraggableBeforeRotate: boolean | null = null;\n\n // RAF-id for coalescing overlay sync during world zoom/pan\n private _worldSyncRafId: number | null = null;\n // Reference to camera event handler for on/off\n private _onCameraZoomEvent: (() => void) | null = null;\n\n // Minimal hover frame (blue border on hover)\n private _hoverTr: Konva.Transformer | null = null;\n private _isPointerDown = false;\n\n // Auto-pan world when dragging near screen edges\n private _autoPanRafId: number | null = null;\n private _autoPanActive = false;\n private _autoPanEdgePx: number; // edge zone width (px)\n private _autoPanMaxSpeedPx: number; // max auto-pan speed in px/frame\n private _draggingNode: Konva.Node | null = null; // current node being dragged\n\n // --- Proportional resize with Shift for corner handles ---\n private _ratioKeyPressed = false;\n private _onGlobalKeyDown: ((e: KeyboardEvent) => void) | null = null;\n private _onGlobalKeyUp: ((e: KeyboardEvent) => void) | null = null;\n\n // Temporary multi-group (Shift+Click)\n private _tempMultiSet = new Set<BaseNode>();\n private _tempMultiGroup: Konva.Group | null = null;\n private _tempMultiTr: Konva.Transformer | null = null;\n private _tempOverlay: OverlayFrameManager | null = null;\n private _tempRotateHandlesGroup: Konva.Group | null = null;\n private _tempRotateHandles: {\n tl: Konva.Circle | null;\n tr: Konva.Circle | null;\n br: Konva.Circle | null;\n bl: Konva.Circle | null;\n } = { tl: null, tr: null, br: null, bl: null };\n private _tempPlacement = new Map<\n Konva.Node,\n {\n parent: Konva.Container;\n indexInParent: number; // FIX: save position in children array\n abs: { x: number; y: number };\n prevDraggable: boolean | null;\n }\n >();\n\n public getMultiGroupController(): MultiGroupController {\n if (!this._core) throw new Error('Core is not attached');\n this._multiCtrl ??= new MultiGroupController({\n ensureTempMulti: (nodes) => {\n this._ensureTempMulti(nodes);\n },\n destroyTempMulti: () => {\n this._destroyTempMulti();\n },\n commitTempMultiToGroup: () => {\n this._commitTempMultiToGroup();\n },\n isActive: () => !!this._tempMultiGroup || this._tempMultiSet.size > 0,\n forceUpdate: () => {\n this._tempOverlay?.forceUpdate();\n },\n onWorldChanged: () => {\n this._tempOverlay?.onWorldChanged();\n },\n isInsideTempByTarget: (target) => {\n if (!this._tempMultiGroup) return false;\n if (target === this._tempMultiGroup) return true;\n return (\n target.isAncestorOf(this._tempMultiGroup) || this._tempMultiGroup.isAncestorOf(target)\n );\n },\n });\n return this._multiCtrl;\n }\n private _tempMultiSizeLabel: Konva.Label | null = null;\n private _tempMultiHitRect: Konva.Rect | null = null;\n private _multiCtrl: MultiGroupController | null = null;\n\n private _startAutoPanLoop() {\n if (!this._core) return;\n if (this._autoPanRafId != null) return;\n this._autoPanActive = true;\n const world = this._core.nodes.world;\n const stage = this._core.stage;\n const tick = () => {\n this._autoPanRafId = null;\n if (!this._core || !this._autoPanActive) return;\n const ptr = stage.getPointerPosition();\n if (ptr) {\n const w = stage.width();\n const h = stage.height();\n const edge = this._autoPanEdgePx;\n let vx = 0;\n let vy = 0;\n const leftPress = Math.max(0, edge - ptr.x);\n const rightPress = Math.max(0, ptr.x - (w - edge));\n const topPress = Math.max(0, edge - ptr.y);\n const bottomPress = Math.max(0, ptr.y - (h - edge));\n const norm = (p: number) => Math.min(1, p / edge);\n vx = this._autoPanMaxSpeedPx * (norm(rightPress) - norm(leftPress));\n vy = this._autoPanMaxSpeedPx * (norm(bottomPress) - norm(topPress));\n if (vx !== 0 || vy !== 0) {\n // Shift world to \"pull\" field under cursor (in screen pixels)\n world.x(world.x() - vx);\n world.y(world.y() - vy);\n // Compensation for dragged node: keep under cursor\n if (this._draggingNode && typeof this._draggingNode.setAbsolutePosition === 'function') {\n const abs = this._draggingNode.getAbsolutePosition();\n this._draggingNode.setAbsolutePosition({ x: abs.x + vx, y: abs.y + vy });\n this._transformer?.forceUpdate();\n }\n this._core.nodes.layer.batchDraw();\n }\n }\n this._autoPanRafId = globalThis.requestAnimationFrame(tick);\n };\n this._autoPanRafId = globalThis.requestAnimationFrame(tick);\n }\n\n private _stopAutoPanLoop() {\n this._autoPanActive = false;\n if (this._autoPanRafId != null) {\n globalThis.cancelAnimationFrame(this._autoPanRafId);\n this._autoPanRafId = null;\n }\n }\n\n /**\n * Deferred redraw (throttling)\n * Groups multiple batchDraw calls into one\n */\n private _scheduleBatchDraw() {\n if (this._batchDrawScheduled) return;\n\n this._batchDrawScheduled = true;\n const raf = globalThis.requestAnimationFrame;\n raf(() => {\n this._batchDrawScheduled = false;\n this._core?.stage.batchDraw();\n });\n }\n\n // Child node editing mode inside group: storing parent group state\n private _parentGroupDuringChildEdit: Konva.Group | null = null;\n private _parentGroupPrevDraggable: boolean | null = null;\n\n // Cache for optimization\n private _dragMoveScheduled = false;\n private _batchDrawScheduled = false;\n\n // OPTIMIZATION: Throttling for mousemove\n private _hoverThrottle = new ThrottleHelper(16); // 60 FPS\n\n // OPTIMIZATION: Debouncing for UI updates (size label, rotate handles, etc.)\n private _uiUpdateDebounce = new DebounceHelper();\n\n constructor(options: SelectionPluginOptions = {}) {\n super();\n const {\n dragEnabled = true,\n enableTransformer = true,\n deselectOnEmptyClick = true,\n selectablePredicate,\n } = options;\n\n this._options = {\n dragEnabled,\n enableTransformer,\n deselectOnEmptyClick,\n selectablePredicate: selectablePredicate ?? (() => true),\n autoPanEnabled: options.autoPanEnabled ?? true,\n autoPanEdgePx: options.autoPanEdgePx ?? 40,\n autoPanMaxSpeedPx: options.autoPanMaxSpeedPx ?? 24,\n };\n\n // Initialize auto-pan private fields from options\n this._autoPanEdgePx = this._options.autoPanEdgePx;\n this._autoPanMaxSpeedPx = this._options.autoPanMaxSpeedPx;\n }\n\n public setOptions(patch: Partial<SelectionPluginOptions>) {\n this._options = { ...this._options, ...patch } as typeof this._options;\n // Update Transformer for new options state\n if (this._core) this._refreshTransformer();\n // Apply new auto-pan values to private fields if provided\n if (typeof patch.autoPanEdgePx === 'number') this._autoPanEdgePx = patch.autoPanEdgePx;\n if (typeof patch.autoPanMaxSpeedPx === 'number')\n this._autoPanMaxSpeedPx = patch.autoPanMaxSpeedPx;\n // If auto-pan was disabled — stop the loop\n if (patch.autoPanEnabled === false) this._stopAutoPanLoop();\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n // Initialize temporary multi-group controller proxying private methods\n this._multiCtrl = new MultiGroupController({\n ensureTempMulti: (nodes) => {\n this._ensureTempMulti(nodes);\n },\n destroyTempMulti: () => {\n this._destroyTempMulti();\n },\n commitTempMultiToGroup: () => {\n this._commitTempMultiToGroup();\n },\n isActive: () => !!this._tempMultiGroup,\n isInsideTempByTarget: (target: Konva.Node) => {\n if (!this._tempMultiGroup) return false;\n let cur: Konva.Node | null = target;\n while (cur) {\n if (cur === this._tempMultiGroup) return true;\n cur = cur.getParent();\n }\n return false;\n },\n forceUpdate: () => {\n this._tempMultiTr?.forceUpdate();\n this._updateTempMultiSizeLabel();\n this._updateTempMultiHitRect();\n this._updateTempRotateHandlesPosition();\n this._scheduleBatchDraw();\n },\n onWorldChanged: () => {\n // Coalesce as in main world handler\n this._tempMultiTr?.forceUpdate();\n this._updateTempMultiSizeLabel();\n this._updateTempMultiHitRect();\n this._updateTempRotateHandlesPosition();\n this._scheduleBatchDraw();\n this._destroyHoverTr();\n },\n });\n\n // Attach handlers to stage (namespace .selection)\n const stage = core.stage;\n stage.on('mousedown.selection', this._onMouseDown);\n\n stage.on('click.selection', (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core) return;\n const stage = this._core.stage;\n const layer = this._core.nodes.layer;\n\n // Left mouse button only\n if (e.evt.button !== 0) return;\n\n if (e.target === stage || e.target.getLayer() !== layer) {\n if (this._options.deselectOnEmptyClick) {\n this._destroyTempMulti();\n this._clearSelection();\n }\n return;\n }\n\n // Normal node selection (for group — group will be selected)\n const target = e.target;\n if (!this._options.selectablePredicate(target)) return;\n\n // Shift+Click or Ctrl+Click: create temporary group (multi-selection)\n if (e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey) {\n const base = this._findBaseNodeByTarget(target);\n if (!base) return;\n\n // If node is in a group, ignore (group protection)\n const nodeKonva = base.getNode();\n const parent = nodeKonva.getParent();\n if (parent && parent instanceof Konva.Group && parent !== this._core.nodes.world) {\n // Node in group - don't add to multi-selection\n return;\n }\n\n if (this._tempMultiSet.size === 0 && this._selected && this._selected !== base) {\n // Move current selected node to set and remove its single overlays\n this._tempMultiSet.add(this._selected);\n if (this._transformer) {\n this._transformer.destroy();\n this._transformer = null;\n }\n this._destroyCornerRadiusHandles();\n this._destroyRotateHandles();\n this._destroySizeLabel();\n this._selected = null;\n }\n\n if (Array.from(this._tempMultiSet).includes(base)) this._tempMultiSet.delete(base);\n else this._tempMultiSet.add(base);\n\n if (this._tempMultiSet.size === 0) {\n this._destroyTempMulti();\n this._clearSelection();\n return;\n }\n if (this._tempMultiSet.size === 1) {\n const iter = this._tempMultiSet.values();\n const step = iter.next();\n const only = step.done ? null : step.value;\n if (!only) return;\n this._destroyTempMulti();\n this._select(only);\n this._scheduleBatchDraw();\n return;\n }\n this._ensureTempMulti(Array.from(this._tempMultiSet));\n this._scheduleBatchDraw();\n return;\n }\n\n const baseNode = this._findBaseNodeByTarget(target);\n if (!baseNode) return;\n\n // Normal click — destroy temporary group and select single node\n this._destroyTempMulti();\n this._select(baseNode);\n this._scheduleBatchDraw();\n });\n\n // Double click: \"drill down\" one level in group hierarchy\n stage.on('dblclick.selection', (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core) return;\n const layer = this._core.nodes.layer;\n if (e.target === stage || e.target.getLayer() !== layer) return;\n\n if (e.evt.button !== 0) return;\n\n if (!this._selected) return;\n\n const selectedNode = this._selected.getNode();\n if (\n selectedNode instanceof Konva.Group &&\n typeof selectedNode.isAncestorOf === 'function' &&\n selectedNode.isAncestorOf(e.target)\n ) {\n e.cancelBubble = true;\n\n // Find closest registered group between selectedNode and target\n // If no group - select the node itself\n let nextLevel: BaseNode | null = null;\n\n for (const n of this._core.nodes.list()) {\n const node = n.getNode() as unknown as Konva.Node;\n\n // Check that node is descendant of selectedNode\n if (\n typeof selectedNode.isAncestorOf === 'function' &&\n selectedNode.isAncestorOf(node) &&\n node !== selectedNode\n ) {\n // Check that node is ancestor of target (but not equal to target if not a group)\n if (typeof node.isAncestorOf === 'function' && node.isAncestorOf(e.target)) {\n // Check that this is the closest ancestor (no intermediate registered nodes)\n let isClosest = true;\n for (const other of this._core.nodes.list()) {\n if (other === n) continue;\n const otherNode = other.getNode() as unknown as Konva.Node;\n if (\n typeof selectedNode.isAncestorOf === 'function' &&\n selectedNode.isAncestorOf(otherNode) &&\n typeof node.isAncestorOf === 'function' &&\n node.isAncestorOf(otherNode) &&\n typeof otherNode.isAncestorOf === 'function' &&\n otherNode.isAncestorOf(e.target)\n ) {\n isClosest = false;\n break;\n }\n }\n if (isClosest) {\n nextLevel = n;\n break;\n }\n }\n }\n }\n\n // If no intermediate group found, search for target node itself\n nextLevel ??= this._core.nodes.list().find((n) => n.getNode() === e.target) ?? null;\n\n if (nextLevel) {\n this._select(nextLevel);\n const node = nextLevel.getNode();\n // Enable dragging for selected node\n if (typeof node.draggable === 'function') node.draggable(true);\n // Temporarily disable dragging for parent group\n if (selectedNode instanceof Konva.Group) {\n this._parentGroupDuringChildEdit = selectedNode;\n this._parentGroupPrevDraggable =\n typeof selectedNode.draggable === 'function' ? selectedNode.draggable() : null;\n if (typeof selectedNode.draggable === 'function') selectedNode.draggable(false);\n }\n this._core.stage.batchDraw();\n }\n }\n });\n\n // React to node removal — deselect if selected node was removed\n core.eventBus.on('node:removed', this._onNodeRemoved);\n\n stage.on('mousemove.hover', this._onHoverMoveThrottled);\n stage.on('mouseleave.hover', this._onHoverLeave);\n stage.on('mousedown.hover', this._onHoverDown);\n stage.on('mouseup.hover', this._onHoverUp);\n stage.on('touchstart.hover', this._onHoverDown);\n stage.on('touchend.hover', this._onHoverUp);\n // Hide overlay during drag too\n this._core.nodes.layer.on('dragstart.hover', () => {\n this._destroyHoverTr();\n });\n this._core.nodes.layer.on('dragmove.hover', () => {\n this._destroyHoverTr();\n });\n\n // Auto-pan: start on first drag, even if node wasn't selected yet\n const layer = this._core.nodes.layer;\n layer.on('dragstart.selectionAutoPan', (e: Konva.KonvaEventObject<DragEvent>) => {\n if (!this._options.autoPanEnabled) return;\n const target = e.target as Konva.Node;\n // Consider custom selectability filter to avoid reacting to service nodes\n if (!this._options.selectablePredicate(target)) return;\n this._draggingNode = target;\n this._startAutoPanLoop();\n });\n layer.on('dragend.selectionAutoPan', () => {\n this._draggingNode = null;\n this._stopAutoPanLoop();\n });\n\n // When camera pans via world movement, need to sync all overlays\n const world = this._core.nodes.world;\n const syncOverlaysOnWorldChange = () => {\n if (!this._core) return;\n // Coalesce multiple events (scale, x, y) into one update per frame\n if (this._worldSyncRafId != null) return;\n this._worldSyncRafId = globalThis.requestAnimationFrame(() => {\n this._worldSyncRafId = null;\n if (!this._core) return;\n if (\n this._transformer ||\n this._cornerHandlesGroup ||\n this._rotateHandlesGroup ||\n this._sizeLabel ||\n this._tempMultiGroup\n ) {\n // Recalculate attachment and all custom overlays in screen coordinates\n this._transformer?.forceUpdate();\n this._hoverTr?.forceUpdate();\n this._restyleSideAnchors();\n this._updateCornerRadiusHandlesPosition();\n this._updateRotateHandlesPosition();\n this._updateSizeLabel();\n // Update corner radius handles visibility based on zoom\n this._updateCornerRadiusHandlesVisibility();\n this._tempOverlay?.forceUpdate();\n // OPTIMIZATION: use scheduleBatchDraw instead of direct call\n this._scheduleBatchDraw();\n }\n // Remove hover overlay until next mousemove to avoid flickering\n this._destroyHoverTr();\n });\n };\n world.on(\n 'xChange.selectionCamera yChange.selectionCamera scaleXChange.selectionCamera scaleYChange.selectionCamera',\n syncOverlaysOnWorldChange,\n );\n // Listen to camera events for zoom (CameraManager)\n this._onCameraZoomEvent = () => {\n syncOverlaysOnWorldChange();\n };\n core.eventBus.on('camera:zoom', this._onCameraZoomEvent as unknown as (p: unknown) => void);\n core.eventBus.on('camera:setZoom', this._onCameraZoomEvent as unknown as (p: unknown) => void);\n core.eventBus.on('camera:reset', this._onCameraZoomEvent as unknown as () => void);\n\n // Global listeners for Shift (proportional resize only for corner anchors)\n this._onGlobalKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Shift') this._ratioKeyPressed = true;\n const ctrl = e.ctrlKey || e.metaKey;\n // Ctrl+G — commit temporary group to permanent (by key code, layout-independent)\n if (ctrl && !e.shiftKey && e.code === 'KeyG') {\n e.preventDefault();\n this._commitTempMultiToGroup();\n }\n // Ctrl+Shift+G — ungroup selected permanent group (by key code)\n if (ctrl && e.shiftKey && e.code === 'KeyG') {\n e.preventDefault();\n this._tryUngroupSelectedGroup();\n }\n };\n this._onGlobalKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Shift') this._ratioKeyPressed = false;\n };\n globalThis.addEventListener('keydown', this._onGlobalKeyDown);\n globalThis.addEventListener('keyup', this._onGlobalKeyUp);\n }\n\n protected onDetach(core: CoreEngine): void {\n // Deselect and clean states\n this._destroyTempMulti();\n this._clearSelection();\n\n // Unsubscribe\n core.stage.off('.selection');\n core.stage.off('.hover');\n this._core?.nodes.layer.off('.hover');\n // Remove world listeners and cancel pending RAF\n this._core?.nodes.world.off('.selectionCamera');\n // Remove layer-level auto-pan handlers\n this._core?.nodes.layer.off('.selectionAutoPan');\n // Cancel pending RAF if any\n if (this._worldSyncRafId != null) {\n globalThis.cancelAnimationFrame(this._worldSyncRafId);\n this._worldSyncRafId = null;\n }\n // Remove camera event listeners\n if (this._onCameraZoomEvent) {\n core.eventBus.off('camera:zoom', this._onCameraZoomEvent as unknown as (p: unknown) => void);\n core.eventBus.off(\n 'camera:setZoom',\n this._onCameraZoomEvent as unknown as (p: unknown) => void,\n );\n core.eventBus.off('camera:reset', this._onCameraZoomEvent as unknown as () => void);\n this._onCameraZoomEvent = null;\n }\n core.eventBus.off('node:removed', this._onNodeRemoved);\n\n // Remove hover overlay\n this._destroyHoverTr();\n\n // Remove global key listeners\n if (this._onGlobalKeyDown) globalThis.removeEventListener('keydown', this._onGlobalKeyDown);\n if (this._onGlobalKeyUp) globalThis.removeEventListener('keyup', this._onGlobalKeyUp);\n this._onGlobalKeyDown = null;\n this._onGlobalKeyUp = null;\n }\n\n // ===================== Selection logic =====================\n private _onMouseDown = (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core) return;\n // Left mouse button only\n if (e.evt.button !== 0) return;\n\n const stage = this._core.stage;\n const layer = this._core.nodes.layer;\n\n // Click on empty area\n if (e.target === stage || e.target.getLayer() !== layer) {\n let insideHandled = false;\n if (this._selected) {\n const pos = stage.getPointerPosition();\n if (pos) {\n const selKonva = this._selected.getNode() as unknown as Konva.Node;\n const bbox = selKonva.getClientRect({ skipShadow: true, skipStroke: false });\n const inside =\n pos.x >= bbox.x &&\n pos.x <= bbox.x + bbox.width &&\n pos.y >= bbox.y &&\n pos.y <= bbox.y + bbox.height;\n if (inside) {\n insideHandled = true;\n if (typeof selKonva.startDrag === 'function') {\n const dnode = selKonva as DraggableNode;\n const threshold = 3;\n const startX = e.evt.clientX;\n const startY = e.evt.clientY;\n const prevNodeDraggable =\n typeof dnode.draggable === 'function' ? dnode.draggable() : false;\n const prevStageDraggable = stage.draggable();\n let dragStarted = false;\n\n const onMove = (ev: Konva.KonvaEventObject<MouseEvent>) => {\n const dx = Math.abs(ev.evt.clientX - startX);\n const dy = Math.abs(ev.evt.clientY - startY);\n if (!dragStarted && (dx > threshold || dy > threshold)) {\n dragStarted = true;\n if (typeof dnode.draggable === 'function' && !prevNodeDraggable)\n dnode.draggable(true);\n selKonva.on('dragstart.selection-once-bbox', () => {\n stage.draggable(false);\n });\n selKonva.on('dragend.selection-once-bbox', () => {\n stage.draggable(prevStageDraggable);\n if (typeof dnode.draggable === 'function') {\n dnode.draggable(this._options.dragEnabled ? true : prevNodeDraggable);\n }\n // Restore frame after drag\n if (this._selected) {\n this._refreshTransformer();\n this._core?.nodes.layer.batchDraw();\n }\n selKonva.off('.selection-once-bbox');\n });\n selKonva.startDrag();\n e.cancelBubble = true;\n }\n };\n const onUp = () => {\n // If drag didn't start — it's a click: only then deselect\n if (!dragStarted && this._options.deselectOnEmptyClick) this._clearSelection();\n stage.off('mousemove.selection-once-bbox');\n stage.off('mouseup.selection-once-bbox');\n };\n stage.on('mousemove.selection-once-bbox', onMove);\n stage.on('mouseup.selection-once-bbox', onUp);\n }\n }\n }\n }\n // If click came OUTSIDE bbox — deselect immediately\n if (!insideHandled) {\n if (this._options.deselectOnEmptyClick) this._clearSelection();\n }\n return;\n }\n\n const target = e.target;\n if (!this._options.selectablePredicate(target)) return;\n\n // Basic search (usually group)\n let baseNode = this._findBaseNodeByTarget(target);\n if (!baseNode) return;\n\n // If there's selection and click came inside already selected node — drag it\n if (this._selected) {\n const selKonva = this._selected.getNode() as unknown as Konva.Node;\n const isAncestor = (a: Konva.Node, b: Konva.Node): boolean => {\n let cur: Konva.Node | null = b;\n while (cur) {\n if (cur === a) return true;\n cur = cur.getParent();\n }\n return false;\n };\n if (isAncestor(selKonva, target)) {\n baseNode = this._selected;\n }\n // Otherwise — remains group (baseNode found above)\n }\n\n // Start dragging immediately, without visual selection until drag ends\n const konvaNode = baseNode.getNode();\n\n // Threshold for \"intentional\" movement to not interfere with dblclick\n const threshold = 3;\n const startX = e.evt.clientX;\n const startY = e.evt.clientY;\n let startedByMove = false;\n\n const onMove = (ev: Konva.KonvaEventObject<MouseEvent>) => {\n if (startedByMove) return;\n const dx = Math.abs(ev.evt.clientX - startX);\n const dy = Math.abs(ev.evt.clientY - startY);\n if (dx > threshold || dy > threshold) {\n startedByMove = true;\n if (typeof konvaNode.startDrag === 'function') {\n konvaNode.startDrag();\n }\n this._core?.stage.off('mousemove.selection-once');\n this._core?.stage.off('mouseup.selection-once');\n }\n };\n\n const onUp = () => {\n this._core?.stage.off('mousemove.selection-once');\n this._core?.stage.off('mouseup.selection-once');\n };\n\n this._core.stage.on('mousemove.selection-once', onMove);\n this._core.stage.on('mouseup.selection-once', onUp);\n\n // If already dragging — do nothing\n if (typeof konvaNode.isDragging === 'function' && konvaNode.isDragging()) {\n return;\n }\n\n const hasDraggable = typeof konvaNode.draggable === 'function';\n const prevNodeDraggable = hasDraggable ? konvaNode.draggable() : false;\n const prevStageDraggable = stage.draggable();\n\n // Make node draggable during drag\n if (hasDraggable) {\n konvaNode.draggable(true);\n }\n\n // Disable stage pan on drag start\n konvaNode.on('dragstart.selection-once', () => {\n stage.draggable(false);\n });\n\n // On drag end: restore stage/node state and select node\n konvaNode.on('dragend.selection-once', () => {\n stage.draggable(prevStageDraggable);\n if (hasDraggable) {\n if (this._options.dragEnabled) {\n konvaNode.draggable(true);\n } else {\n konvaNode.draggable(prevNodeDraggable);\n }\n }\n // After drag completion — restore visual selection\n this._select(baseNode);\n });\n };\n\n private _select(node: BaseNode) {\n if (!this._core) return;\n const core = this._core;\n\n // Clear previous selection\n this._clearSelection();\n\n // Save and enable draggable for the selected node (if enabled)\n const konvaNode = node.getNode();\n this._prevDraggable = konvaNode.draggable();\n if (this._options.dragEnabled && typeof konvaNode.draggable === 'function') {\n konvaNode.draggable(true);\n }\n\n // Visual transformer (optional)\n this._selected = node;\n this._refreshTransformer();\n\n // Emit selection event\n core.eventBus.emit('node:selected', node);\n\n // Dragging is handled by Konva Node when draggable(true)\n // Hide/show the frame and corner-radius handles during drag\n konvaNode.on('dragstart.selection', () => {\n // Remember active node for offset compensation during auto-pan\n this._draggingNode = konvaNode;\n if (this._transformer) {\n this._transformerWasVisibleBeforeDrag = this._transformer.visible();\n this._transformer.visible(false);\n }\n if (this._cornerHandlesGroup) {\n this._cornerHandlesWereVisibleBeforeDrag = this._cornerHandlesGroup.visible();\n this._cornerHandlesGroup.visible(false);\n }\n if (this._rotateHandlesGroup) {\n this._rotateHandlesWereVisibleBeforeDrag = this._rotateHandlesGroup.visible();\n this._rotateHandlesGroup.visible(false);\n }\n if (this._sizeLabel) {\n this._sizeLabelWasVisibleBeforeDrag = this._sizeLabel.visible();\n this._sizeLabel.visible(false);\n }\n this._core?.stage.batchDraw();\n // Start auto-pan during dragging\n this._startAutoPanLoop();\n });\n konvaNode.on('dragmove.selection', () => {\n // Optimization: throttling for dragmove\n if (this._dragMoveScheduled) return;\n\n this._dragMoveScheduled = true;\n const raf = globalThis.requestAnimationFrame;\n raf(() => {\n this._dragMoveScheduled = false;\n this._scheduleBatchDraw();\n });\n });\n\n // Emit changes after drag completion\n konvaNode.on('dragend.selection', () => {\n const changes: {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n } = {};\n if (typeof (konvaNode as unknown as { x?: () => number }).x === 'function')\n changes.x = (konvaNode as unknown as { x: () => number }).x();\n if (typeof (konvaNode as unknown as { y?: () => number }).y === 'function')\n changes.y = (konvaNode as unknown as { y: () => number }).y();\n if (typeof (konvaNode as unknown as { width?: () => number }).width === 'function')\n changes.width = (konvaNode as unknown as { width: () => number }).width();\n if (typeof (konvaNode as unknown as { height?: () => number }).height === 'function')\n changes.height = (konvaNode as unknown as { height: () => number }).height();\n if (typeof (konvaNode as unknown as { rotation?: () => number }).rotation === 'function')\n changes.rotation = (konvaNode as unknown as { rotation: () => number }).rotation();\n if (typeof (konvaNode as unknown as { scaleX?: () => number }).scaleX === 'function')\n changes.scaleX = (konvaNode as unknown as { scaleX: () => number }).scaleX();\n if (typeof (konvaNode as unknown as { scaleY?: () => number }).scaleY === 'function')\n changes.scaleY = (konvaNode as unknown as { scaleY: () => number }).scaleY();\n core.eventBus.emit('node:transformed', node, changes);\n });\n\n // Emit changes after transformation completion (resize/rotate/scale)\n konvaNode.on('transformend.selection', () => {\n const changes: {\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n rotation?: number;\n scaleX?: number;\n scaleY?: number;\n } = {};\n if (typeof (konvaNode as unknown as { x?: () => number }).x === 'function')\n changes.x = (konvaNode as unknown as { x: () => number }).x();\n if (typeof (konvaNode as unknown as { y?: () => number }).y === 'function')\n changes.y = (konvaNode as unknown as { y: () => number }).y();\n if (typeof (konvaNode as unknown as { width?: () => number }).width === 'function')\n changes.width = (konvaNode as unknown as { width: () => number }).width();\n if (typeof (konvaNode as unknown as { height?: () => number }).height === 'function')\n changes.height = (konvaNode as unknown as { height: () => number }).height();\n if (typeof (konvaNode as unknown as { rotation?: () => number }).rotation === 'function')\n changes.rotation = (konvaNode as unknown as { rotation: () => number }).rotation();\n if (typeof (konvaNode as unknown as { scaleX?: () => number }).scaleX === 'function')\n changes.scaleX = (konvaNode as unknown as { scaleX: () => number }).scaleX();\n if (typeof (konvaNode as unknown as { scaleY?: () => number }).scaleY === 'function')\n changes.scaleY = (konvaNode as unknown as { scaleY: () => number }).scaleY();\n this._core?.eventBus.emit('node:transformed', node, changes);\n });\n konvaNode.on('dragend.selection', () => {\n // Reset active node reference\n this._draggingNode = null;\n if (this._transformer) {\n if (this._transformerWasVisibleBeforeDrag) {\n this._transformer.visible(true);\n }\n this._transformerWasVisibleBeforeDrag = false;\n }\n if (this._cornerHandlesGroup) {\n if (this._cornerHandlesWereVisibleBeforeDrag) {\n this._cornerHandlesGroup.visible(true);\n }\n this._cornerHandlesWereVisibleBeforeDrag = false;\n }\n if (this._rotateHandlesGroup) {\n if (this._rotateHandlesWereVisibleBeforeDrag) {\n this._rotateHandlesGroup.visible(true);\n }\n this._rotateHandlesWereVisibleBeforeDrag = false;\n }\n if (this._sizeLabel) {\n if (this._sizeLabelWasVisibleBeforeDrag) {\n this._sizeLabel.visible(true);\n }\n this._sizeLabelWasVisibleBeforeDrag = false;\n }\n // Stop auto-pan\n this._stopAutoPanLoop();\n this._select(node);\n this._core?.stage.batchDraw();\n });\n\n // >>> ADD: stage panning with middle/right button if node is already selected\n konvaNode.on('mousedown.selection', (e: Konva.KonvaEventObject<MouseEvent>) => {\n const btn = e.evt.button;\n if (btn === 1 || btn === 2) {\n const hasDraggable = typeof konvaNode.draggable === 'function';\n if (hasDraggable) konvaNode.draggable(false);\n }\n });\n }\n\n private _clearSelection() {\n if (!this._selected) return;\n\n const selectedNode = this._selected;\n const node = this._selected.getNode();\n\n // Restore previous draggable state\n if (typeof node.draggable === 'function' && this._prevDraggable !== null) {\n node.draggable(this._prevDraggable);\n }\n this._prevDraggable = null;\n\n // Restore draggable state of parent group if we were in child node edit mode\n if (this._parentGroupDuringChildEdit) {\n const grp = this._parentGroupDuringChildEdit;\n if (typeof grp.draggable === 'function' && this._parentGroupPrevDraggable !== null) {\n grp.draggable(this._parentGroupPrevDraggable);\n }\n this._parentGroupDuringChildEdit = null;\n this._parentGroupPrevDraggable = null;\n }\n\n // Remove drag listeners with namespace\n node.off('.selection');\n node.off('.selection-once');\n\n // Remove custom radius handles\n this._destroyCornerRadiusHandles();\n // Remove rotation handles\n this._destroyRotateHandles();\n\n // Remove size label\n this._destroySizeLabel();\n\n // Remove transformer if exists\n if (this._transformer) {\n this._transformer.destroy();\n this._transformer = null;\n }\n\n this._selected = null;\n\n // Emit deselection events\n if (this._core) {\n this._core.eventBus.emit('node:deselected', selectedNode);\n this._core.eventBus.emit('selection:cleared');\n }\n\n this._core?.stage.batchDraw();\n }\n\n // ===== Helpers: temporary multi-group =====\n private _ensureTempMulti(nodes: BaseNode[]) {\n if (!this._core) return;\n const world = this._core.nodes.world;\n // Fill set for correct size check on commit (important for lasso)\n this._tempMultiSet.clear();\n for (const b of nodes) this._tempMultiSet.add(b);\n\n if (!this._tempMultiGroup) {\n const grp = new Konva.Group({ name: 'temp-multi-group' });\n world.add(grp);\n this._tempMultiGroup = grp;\n this._tempPlacement.clear();\n for (const b of nodes) {\n const kn = b.getNode() as unknown as Konva.Node;\n const parent = kn.getParent();\n if (!parent) continue;\n // FIX: save position in parent's children array\n const indexInParent = kn.zIndex();\n const abs = kn.getAbsolutePosition();\n const prevDraggable =\n typeof (kn as unknown as { draggable?: (v?: boolean) => boolean }).draggable ===\n 'function'\n ? (kn as unknown as { draggable: (v?: boolean) => boolean }).draggable()\n : null;\n this._tempPlacement.set(kn, { parent, indexInParent, abs, prevDraggable });\n grp.add(kn as unknown as Konva.Group | Konva.Shape);\n kn.setAbsolutePosition(abs);\n if (\n typeof (kn as unknown as { draggable?: (v: boolean) => boolean }).draggable === 'function'\n )\n (kn as unknown as { draggable: (v: boolean) => boolean }).draggable(false);\n // Block drag on children and redirect to group\n kn.off('.tempMultiChild');\n kn.on('dragstart.tempMultiChild', (ev: Konva.KonvaEventObject<DragEvent>) => {\n ev.cancelBubble = true;\n const anyKn = kn as unknown as { stopDrag?: () => void };\n if (typeof anyKn.stopDrag === 'function') anyKn.stopDrag();\n });\n kn.on('mousedown.tempMultiChild', (ev: Konva.KonvaEventObject<MouseEvent>) => {\n if (ev.evt.button !== 0) return;\n ev.cancelBubble = true;\n const anyGrp = grp as unknown as { startDrag?: () => void };\n if (typeof anyGrp.startDrag === 'function') anyGrp.startDrag();\n });\n }\n // Unified overlay manager for temporary group\n this._tempOverlay ??= new OverlayFrameManager(this._core);\n this._tempOverlay.attach(grp, { keepRatioCornerOnlyShift: () => this._ratioKeyPressed });\n // Behavior like a regular group: drag group, without scene panning\n const stage = this._core.stage;\n const prevStageDraggable = stage.draggable();\n grp.draggable(true);\n const forceUpdate = () => {\n this._tempOverlay?.forceUpdate();\n this._scheduleBatchDraw();\n };\n grp.on('dragstart.tempMulti', () => {\n stage.draggable(false);\n this._draggingNode = grp;\n this._startAutoPanLoop();\n // Hide frame/label/handles of temporary group during dragging\n this._tempOverlay?.hideOverlaysForDrag();\n forceUpdate();\n });\n grp.on('dragmove.tempMulti', forceUpdate);\n grp.on('transform.tempMulti', forceUpdate);\n grp.on('dragend.tempMulti', () => {\n stage.draggable(prevStageDraggable);\n this._draggingNode = null;\n this._stopAutoPanLoop();\n // Restore frame/label/handles after dragging\n this._tempOverlay?.restoreOverlaysAfterDrag();\n forceUpdate();\n });\n\n // Event: temporary multi-selection created\n this._core.eventBus.emit('selection:multi:created', nodes);\n return;\n }\n // Update composition\n const curr = [...this._tempMultiGroup.getChildren()];\n const want = nodes.map((b) => b.getNode() as unknown as Konva.Node);\n const same = curr.length === want.length && want.every((n) => curr.includes(n as Konva.Group));\n if (same) return;\n this._destroyTempMulti();\n this._ensureTempMulti(nodes);\n }\n\n private _destroyTempMulti() {\n if (!this._core) return;\n if (!this._tempMultiGroup && this._tempMultiSet.size === 0) return;\n // Detach unified overlay manager (removes transformer/label/rotate/hit)\n if (this._tempOverlay) {\n this._tempOverlay.detach();\n this._tempOverlay = null;\n }\n if (this._tempMultiGroup) {\n this._tempMultiGroup.off('.tempMulti');\n const children = [...this._tempMultiGroup.getChildren()];\n for (const kn of children) {\n // Remove child intercepts\n kn.off('.tempMultiChild');\n const info = this._tempPlacement.get(kn);\n // Store child's absolute transform (position/scale/rotation)\n const absBefore = kn.getAbsoluteTransform().copy();\n // Destination parent: saved one or world\n const dstParent = info?.parent ?? this._core.nodes.world;\n // Move to destination parent\n kn.moveTo(dstParent);\n // Compute local transform equivalent to the previous absolute transform\n const parentAbs = dstParent.getAbsoluteTransform().copy();\n parentAbs.invert();\n const local = parentAbs.multiply(absBefore);\n const d = local.decompose();\n // Apply local x/y/rotation/scale to preserve the visual result\n if (\n typeof (kn as unknown as { position?: (p: Konva.Vector2d) => void }).position ===\n 'function'\n ) {\n (kn as unknown as { position: (p: Konva.Vector2d) => void }).position({ x: d.x, y: d.y });\n } else {\n kn.setAbsolutePosition({ x: d.x, y: d.y });\n }\n if (typeof (kn as unknown as { rotation?: (r: number) => void }).rotation === 'function') {\n (kn as unknown as { rotation: (r: number) => void }).rotation(d.rotation);\n }\n if (\n typeof (kn as unknown as { scale?: (p: Konva.Vector2d) => void }).scale === 'function'\n ) {\n (kn as unknown as { scale: (p: Konva.Vector2d) => void }).scale({\n x: d.scaleX,\n y: d.scaleY,\n });\n }\n // Restore order and draggable\n if (info) {\n // FIX: restore position via moveUp/moveDown\n const currentIndex = kn.zIndex();\n const targetIndex = info.indexInParent;\n\n if (currentIndex !== targetIndex) {\n const diff = targetIndex - currentIndex;\n if (diff > 0) {\n // Need to move up\n for (let i = 0; i < diff && kn.zIndex() < info.parent.children.length - 1; i++) {\n kn.moveUp();\n }\n } else if (diff < 0) {\n // Need to move down\n for (let i = 0; i < Math.abs(diff) && kn.zIndex() > 0; i++) {\n kn.moveDown();\n }\n }\n }\n\n if (\n typeof (kn as unknown as { draggable?: (v: boolean) => boolean }).draggable ===\n 'function' &&\n info.prevDraggable !== null\n ) {\n (kn as unknown as { draggable: (v: boolean) => boolean }).draggable(info.prevDraggable);\n }\n }\n }\n this._tempMultiGroup.destroy();\n this._tempMultiGroup = null;\n }\n this._tempPlacement.clear();\n this._tempMultiSet.clear();\n\n // Event: temporary multi-selection destroyed\n this._core.eventBus.emit('selection:multi:destroyed');\n }\n\n private _updateTempRotateHandlesPosition() {\n if (!this._core || !this._tempMultiGroup || !this._tempRotateHandlesGroup) return;\n const grp = this._tempMultiGroup;\n const local = grp.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: false });\n const width = local.width;\n const height = local.height;\n if (width <= 0 || height <= 0) return;\n const tr = grp.getAbsoluteTransform().copy();\n const mapAbs = (pt: { x: number; y: number }) => tr.point(pt);\n const offset = 12;\n const centerAbs = mapAbs({ x: local.x + width / 2, y: local.y + height / 2 });\n const c0 = mapAbs({ x: local.x, y: local.y });\n const c1 = mapAbs({ x: local.x + width, y: local.y });\n const c2 = mapAbs({ x: local.x + width, y: local.y + height });\n const c3 = mapAbs({ x: local.x, y: local.y + height });\n const dir = (c: { x: number; y: number }) => {\n const vx = c.x - centerAbs.x;\n const vy = c.y - centerAbs.y;\n const len = Math.hypot(vx, vy) || 1;\n return { x: vx / len, y: vy / len };\n };\n const d0 = dir(c0),\n d1 = dir(c1),\n d2 = dir(c2),\n d3 = dir(c3);\n const p0 = { x: c0.x + d0.x * offset, y: c0.y + d0.y * offset };\n const p1 = { x: c1.x + d1.x * offset, y: c1.y + d1.y * offset };\n const p2 = { x: c2.x + d2.x * offset, y: c2.y + d2.y * offset };\n const p3 = { x: c3.x + d3.x * offset, y: c3.y + d3.y * offset };\n if (this._tempRotateHandles.tl) this._tempRotateHandles.tl.absolutePosition(p0);\n if (this._tempRotateHandles.tr) this._tempRotateHandles.tr.absolutePosition(p1);\n if (this._tempRotateHandles.br) this._tempRotateHandles.br.absolutePosition(p2);\n if (this._tempRotateHandles.bl) this._tempRotateHandles.bl.absolutePosition(p3);\n this._tempRotateHandlesGroup.moveToTop();\n }\n\n private _updateTempMultiSizeLabel() {\n if (!this._core || !this._tempMultiGroup || !this._tempMultiSizeLabel) return;\n const world = this._core.nodes.world;\n // Visual bbox WITHOUT stroke (and thus without selection frame)\n const bbox = this._tempMultiGroup.getClientRect({ skipShadow: true, skipStroke: true });\n const logicalW = bbox.width / Math.max(1e-6, world.scaleX());\n const logicalH = bbox.height / Math.max(1e-6, world.scaleY());\n const w = Math.max(0, Math.round(logicalW));\n const h = Math.max(0, Math.round(logicalH));\n const text = this._tempMultiSizeLabel.getText();\n text.text(String(w) + ' × ' + String(h));\n const offset = 8;\n const bottomX = bbox.x + bbox.width / 2;\n const bottomY = bbox.y + bbox.height + offset;\n const labelRect = this._tempMultiSizeLabel.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const labelW = labelRect.width;\n this._tempMultiSizeLabel.setAttrs({ x: bottomX - labelW / 2, y: bottomY });\n this._tempMultiSizeLabel.moveToTop();\n }\n\n // Update/create an invisible hit zone matching the group's bbox (for dragging in empty areas)\n private _updateTempMultiHitRect() {\n if (!this._core || !this._tempMultiGroup) return;\n const layer = this._core.nodes.layer;\n // Group's local bbox (no transform) so the rect aligns correctly at any rotation/scale\n const local = this._tempMultiGroup.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const topLeft = { x: local.x, y: local.y };\n const w = local.width;\n const h = local.height;\n if (!this._tempMultiHitRect) {\n const rect = new Konva.Rect({\n name: 'temp-multi-hit',\n x: topLeft.x,\n y: topLeft.y,\n width: w,\n height: h,\n fill: 'rgba(0,0,0,0.001)', // almost invisible but participates in hit-test\n listening: true,\n perfectDrawEnabled: false,\n });\n // Allow group drag on mousedown in empty area\n rect.on('mousedown.tempMultiHit', (ev: Konva.KonvaEventObject<MouseEvent>) => {\n if (ev.evt.button !== 0) return;\n ev.cancelBubble = true;\n const anyGrp = this._tempMultiGroup as unknown as { startDrag?: () => void };\n if (typeof anyGrp.startDrag === 'function') anyGrp.startDrag();\n });\n // Add to the group and keep at the back\n this._tempMultiGroup.add(rect);\n rect.moveToBottom();\n this._tempMultiHitRect = rect;\n layer.batchDraw();\n return;\n }\n // Update geometry of the existing rectangle\n this._tempMultiHitRect.position(topLeft);\n this._tempMultiHitRect.size({ width: w, height: h });\n this._tempMultiHitRect.moveToBottom();\n }\n\n private _commitTempMultiToGroup() {\n if (!this._core) return;\n if (!this._tempMultiGroup || this._tempMultiSet.size < 2) return;\n const nm = this._core.nodes;\n const pos = this._tempMultiGroup.getAbsolutePosition();\n const newGroup = nm.addGroup({ x: pos.x, y: pos.y, draggable: true });\n const g = newGroup.getNode();\n const children = [...this._tempMultiGroup.getChildren()];\n const groupedBaseNodes: BaseNode[] = [];\n\n // FIX: Sort nodes by their current z-index in the world BEFORE adding to the group\n // This preserves their relative render order\n const sortedChildren = children.sort((a, b) => {\n return a.zIndex() - b.zIndex();\n });\n\n // Find the maximum z-index to position the group itself in the world\n const maxZIndex = Math.max(...sortedChildren.map((kn) => kn.zIndex()));\n\n for (const kn of sortedChildren) {\n // Remove temporary group intercepts from children\n kn.off('.tempMultiChild');\n const abs = kn.getAbsolutePosition();\n g.add(kn as unknown as Konva.Group | Konva.Shape);\n kn.setAbsolutePosition(abs);\n\n // FIX: Do NOT set z-index on children!\n // Konva will automatically set order when added to the group\n // Add order (sortedChildren) = render order\n\n if (\n typeof (kn as unknown as { draggable?: (v: boolean) => boolean }).draggable === 'function'\n )\n (kn as unknown as { draggable: (v: boolean) => boolean }).draggable(false);\n\n // Collect BaseNodes corresponding to the Konva nodes\n const base = this._core.nodes\n .list()\n .find((b) => b.getNode() === (kn as unknown as Konva.Node));\n if (base) groupedBaseNodes.push(base);\n }\n\n // FIX: Position the group itself in the world with the correct z-index\n // Use moveUp/moveDown instead of setting zIndex(value) directly\n const world = this._core.nodes.world;\n const currentGroupIndex = g.zIndex();\n const targetIndex = maxZIndex;\n\n // Move the group to the maximum children's z-index position\n if (currentGroupIndex < targetIndex) {\n const diff = targetIndex - currentGroupIndex;\n for (let i = 0; i < diff && g.zIndex() < world.children.length - 1; i++) {\n g.moveUp();\n }\n }\n\n if (this._tempMultiTr) {\n this._tempMultiTr.destroy();\n this._tempMultiTr = null;\n }\n // Detach the unified overlay manager for the temporary group to prevent UI elements from remaining\n if (this._tempOverlay) {\n this._tempOverlay.detach();\n this._tempOverlay = null;\n }\n // Remove .tempMulti handlers from the temporary group before destruction\n this._tempMultiGroup.off('.tempMulti');\n this._tempMultiGroup.destroy();\n this._tempMultiGroup = null;\n this._tempPlacement.clear();\n this._tempMultiSet.clear();\n // Explicitly enable draggable for the created group (in case downstream logic changes options)\n if (typeof g.draggable === 'function') g.draggable(true);\n\n // Event: group created\n this._core.eventBus.emit('group:created', newGroup, groupedBaseNodes);\n this._select(newGroup);\n this._core.stage.batchDraw();\n }\n\n private _tryUngroupSelectedGroup() {\n if (!this._core) return;\n if (!this._selected) return;\n const node = this._selected.getNode();\n if (!(node instanceof Konva.Group)) return;\n const children = [...node.getChildren()];\n const world = this._core.nodes.world;\n\n for (const kn of children) {\n // Save the full absolute transform of the child (position + scale + rotation)\n const absBefore = kn.getAbsoluteTransform().copy();\n\n // Move to world\n world.add(kn as unknown as Konva.Group | Konva.Shape);\n\n // Calculate local transform equivalent to the previous absolute transform\n const worldAbs = world.getAbsoluteTransform().copy();\n worldAbs.invert();\n const local = worldAbs.multiply(absBefore);\n const d = local.decompose();\n\n // Apply local x/y/rotation/scale to preserve the visual result\n if (\n typeof (kn as unknown as { position?: (p: Konva.Vector2d) => void }).position === 'function'\n ) {\n (kn as unknown as { position: (p: Konva.Vector2d) => void }).position({ x: d.x, y: d.y });\n } else {\n kn.setAbsolutePosition({ x: d.x, y: d.y });\n }\n if (typeof (kn as unknown as { rotation?: (r: number) => void }).rotation === 'function') {\n (kn as unknown as { rotation: (r: number) => void }).rotation(d.rotation);\n }\n if (typeof (kn as unknown as { scale?: (p: Konva.Vector2d) => void }).scale === 'function') {\n (kn as unknown as { scale: (p: Konva.Vector2d) => void }).scale({\n x: d.scaleX,\n y: d.scaleY,\n });\n }\n\n // Enable draggable for ungrouped nodes\n if (\n typeof (kn as unknown as { draggable?: (v: boolean) => boolean }).draggable === 'function'\n ) {\n (kn as unknown as { draggable: (v: boolean) => boolean }).draggable(true);\n }\n }\n\n const sel = this._selected;\n this._selected = null;\n this._transformer?.destroy();\n this._transformer = null;\n // Remove size label of the group on ungrouping\n this._destroySizeLabel();\n this._core.nodes.remove(sel);\n this._core.stage.batchDraw();\n }\n\n // ===================== Hover (minimal) =====================\n private _ensureHoverTr(): Konva.Transformer {\n if (!this._core) throw new Error('Core is not attached');\n if (this._hoverTr?.getParent()) return this._hoverTr;\n const tr = new Konva.Transformer({\n rotateEnabled: false,\n enabledAnchors: [],\n rotationSnaps: [\n 0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285,\n 300, 315, 330, 345, 360,\n ],\n borderEnabled: true,\n borderStroke: '#2b83ff',\n borderStrokeWidth: 1.5,\n listening: false,\n name: 'hover-transformer',\n });\n this._core.nodes.layer.add(tr);\n this._hoverTr = tr;\n return tr;\n }\n\n private _destroyHoverTr() {\n if (this._hoverTr) {\n this._hoverTr.destroy();\n this._hoverTr = null;\n }\n }\n\n // OPTIMIZATION: Throttled version of _onHoverMove\n private _onHoverMoveThrottled = (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._hoverThrottle.shouldExecute()) return;\n this._onHoverMove(e);\n };\n\n private _onHoverMove = (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core) return;\n const stage = this._core.stage;\n const layer = this._core.nodes.layer;\n const target = e.target;\n // If there's a temporary group (ours or area-temp-group) and pointer is inside it — suppress hover\n const isInsideTemp = (() => {\n const hasTemp = !!this._tempMultiGroup;\n if (!hasTemp) {\n // Check if inside area-temp-group\n let cur: Konva.Node | null = target;\n while (cur) {\n if (cur instanceof Konva.Group && typeof cur.name === 'function') {\n const nm = cur.name();\n if (\n typeof nm === 'string' &&\n (nm.includes('temp-multi-group') || nm.includes('area-temp-group'))\n )\n return true;\n }\n cur = cur.getParent();\n }\n return false;\n }\n let cur: Konva.Node | null = target;\n while (cur) {\n if (cur === this._tempMultiGroup) return true;\n cur = cur.getParent();\n }\n return false;\n })();\n if (isInsideTemp) {\n this._destroyHoverTr();\n return;\n }\n // If mouse button is pressed — do not show hover\n const buttons = typeof e.evt.buttons === 'number' ? e.evt.buttons : 0;\n if (this._isPointerDown || buttons & 1) {\n this._destroyHoverTr();\n return;\n }\n // If hover is outside the working layer — hide\n if (target === stage || target.getLayer() !== layer) {\n this._destroyHoverTr();\n return;\n }\n // Find the \"owner\":\n // - by default, the nearest registered group;\n // - if none, the nearest registered ancestor (including the target itself);\n // - HOWEVER: if there is a selected node in this same group and hover over another node from the group — highlight this node specifically.\n const registeredArr = this._core.nodes.list().map((n) => n.getNode() as unknown as Konva.Node);\n const registered = new Set<Konva.Node>(registeredArr);\n\n const findNearestRegistered = (start: Konva.Node): Konva.Node | null => {\n let cur: Konva.Node | null = start;\n while (cur) {\n if (registered.has(cur)) return cur;\n cur = cur.getParent();\n }\n return null;\n };\n\n const findNearestRegisteredGroup = (start: Konva.Node): Konva.Node | null => {\n let cur: Konva.Node | null = start;\n let lastGroup: Konva.Node | null = null;\n // Find the highest (outermost) registered group\n while (cur) {\n if (registered.has(cur) && cur instanceof Konva.Group) {\n lastGroup = cur;\n }\n cur = cur.getParent();\n }\n return lastGroup;\n };\n\n const targetOwnerGroup = findNearestRegisteredGroup(target);\n const targetOwnerNode = findNearestRegistered(target);\n\n const ctrlPressed = e.evt.ctrlKey;\n // With Ctrl pressed — always highlight the leaf node (if it is registered)\n let owner: Konva.Node | null = ctrlPressed\n ? (targetOwnerNode ?? targetOwnerGroup)\n : (targetOwnerGroup ?? targetOwnerNode);\n\n // Special rule (without Ctrl): if a NODE (not a group) is selected inside a group and hover over another node from the group — highlight this node specifically\n if (\n !ctrlPressed &&\n this._selected &&\n targetOwnerNode &&\n !(this._selected.getNode() instanceof Konva.Group)\n ) {\n const selectedNode = this._selected.getNode() as unknown as Konva.Node;\n const inSameGroup = (nodeA: Konva.Node, nodeB: Konva.Node, group: Konva.Node | null) => {\n if (!group) return false;\n const isDesc = (root: Konva.Node, child: Konva.Node): boolean => {\n let cur: Konva.Node | null = child;\n while (cur) {\n if (cur === root) return true;\n cur = cur.getParent();\n }\n return false;\n };\n return isDesc(group, nodeA) && isDesc(group, nodeB);\n };\n // If we have a hover group and both nodes are under it, and the hover is not the selected node — select targetOwnerNode\n if (\n targetOwnerGroup &&\n inSameGroup(selectedNode, targetOwnerNode, targetOwnerGroup) &&\n selectedNode !== targetOwnerNode\n ) {\n owner = targetOwnerNode;\n }\n }\n // If not found — hide\n if (!owner) {\n this._destroyHoverTr();\n return;\n }\n // Consider the user predicate already by owner\n if (!this._options.selectablePredicate(owner)) {\n this._destroyHoverTr();\n return;\n }\n\n // If we hover over the already selected node/branch — do not duplicate the frame\n if (this._selected) {\n const selectedNode = this._selected.getNode() as unknown as Konva.Node;\n const isAncestor = (a: Konva.Node, b: Konva.Node): boolean => {\n // true, if a is an ancestor of b\n let cur: Konva.Node | null = b;\n while (cur) {\n if (cur === a) return true;\n cur = cur.getParent();\n }\n return false;\n };\n // Hide hover only if it is the same node or if selectedNode is an ancestor of owner\n // Do not hide if owner is an ancestor of selectedNode (this means that owner is a higher group)\n const shouldSuppress = ctrlPressed\n ? owner === selectedNode\n : owner === selectedNode || isAncestor(selectedNode, owner);\n if (shouldSuppress) {\n this._destroyHoverTr();\n return;\n }\n }\n\n const tr = this._ensureHoverTr();\n tr.nodes([owner]);\n tr.visible(true);\n tr.moveToTop();\n layer.batchDraw();\n };\n\n private _onHoverDown = () => {\n this._isPointerDown = true;\n this._destroyHoverTr();\n };\n\n private _onHoverUp = () => {\n this._isPointerDown = false;\n };\n\n private _onHoverLeave = (_e: Konva.KonvaEventObject<MouseEvent>) => {\n this._destroyHoverTr();\n };\n\n private _refreshTransformer() {\n if (!this._core) return;\n\n // Clear the previous one\n if (this._transformer) {\n this._transformer.destroy();\n this._transformer = null;\n }\n\n if (!this._options.enableTransformer || !this._selected) return;\n\n const layer = this._core.nodes.layer;\n const transformer = new Konva.Transformer({\n rotateEnabled: false,\n rotationSnapTolerance: 15,\n flipEnabled: false,\n keepRatio: false,\n rotationSnaps: [\n 0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285,\n 300, 315, 330, 345, 360,\n ],\n enabledAnchors: [\n 'top-left',\n 'top-center',\n 'top-right',\n 'middle-right',\n 'bottom-right',\n 'bottom-center',\n 'bottom-left',\n 'middle-left',\n ],\n });\n layer.add(transformer);\n transformer.nodes([this._selected.getNode() as unknown as Konva.Node]);\n // Global size constraint: do not allow collapsing to 0 and fix the opposite angle\n transformer.boundBoxFunc((_, newBox) => {\n const MIN = 1; // px\n let w = newBox.width;\n let h = newBox.height;\n let x = newBox.x;\n let y = newBox.y;\n\n // Clamp sizes to MIN, without moving the position\n // (fixing the opposite angle is done in transform.corner-sync)\n if (w < 0) {\n w = MIN;\n } else if (w < MIN) {\n w = MIN;\n }\n\n if (h < 0) {\n h = MIN;\n } else if (h < MIN) {\n h = MIN;\n }\n\n return { ...newBox, x, y, width: w, height: h };\n });\n this._transformer = transformer;\n // Stretch anchors to the full side and hide them visually (leaving hit-area)\n this._restyleSideAnchors();\n // Add corner radius handlers if supported\n this._setupCornerRadiusHandles(false);\n // Add rotation handlers\n this._setupRotateHandles();\n // Add/Update size label\n this._setupSizeLabel();\n // During transformation (resize/scale) synchronize positions of all overlays\n const updateKeepRatio = () => {\n const active =\n typeof transformer.getActiveAnchor === 'function' ? transformer.getActiveAnchor() : '';\n const isCorner =\n active === 'top-left' ||\n active === 'top-right' ||\n active === 'bottom-left' ||\n active === 'bottom-right';\n transformer.keepRatio(isCorner && this._ratioKeyPressed);\n };\n transformer.on('transformstart.keepratio', () => {\n updateKeepRatio();\n // Hide corner-radius handlers during transformation\n this._cornerHandlesSuppressed = true;\n this._cornerHandlesGroup?.visible(false);\n this._hideRadiusLabel();\n\n // Save the absolute position of the opposite corner for fixing origin\n // ONLY for corner anchors (for all node types, including groups)\n const node = this._selected?.getNode() as unknown as Konva.Node | undefined;\n const activeAnchor =\n typeof transformer.getActiveAnchor === 'function' ? transformer.getActiveAnchor() : '';\n const isCornerAnchor =\n activeAnchor === 'top-left' ||\n activeAnchor === 'top-right' ||\n activeAnchor === 'bottom-left' ||\n activeAnchor === 'bottom-right';\n\n // Apply fixing for corner anchors (including groups)\n if (node && isCornerAnchor) {\n // For groups use clientRect, for single nodes — width/height\n const isGroup = node instanceof Konva.Group;\n let width: number;\n let height: number;\n let localX = 0;\n let localY = 0;\n\n if (isGroup) {\n // For groups use clientRect, for single nodes — width/height\n const clientRect = node.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: false,\n });\n width = clientRect.width;\n height = clientRect.height;\n localX = clientRect.x;\n localY = clientRect.y;\n } else {\n // For single nodes use width/height\n width = node.width();\n height = node.height();\n }\n\n const absTransform = node.getAbsoluteTransform();\n\n // Determine the local coordinates of the opposite corner\n let oppositeX = 0;\n let oppositeY = 0;\n\n if (activeAnchor === 'top-left') {\n oppositeX = localX + width;\n oppositeY = localY + height;\n } else if (activeAnchor === 'top-right') {\n oppositeX = localX;\n oppositeY = localY + height;\n } else if (activeAnchor === 'bottom-right') {\n oppositeX = localX;\n oppositeY = localY;\n } else {\n // bottom-left\n oppositeX = localX + width;\n oppositeY = localY;\n }\n\n // Convert to absolute coordinates\n this._transformOppositeCorner = absTransform.point({ x: oppositeX, y: oppositeY });\n } else {\n // For side anchors do not fix the angle\n this._transformOppositeCorner = null;\n }\n });\n transformer.on('transform.keepratio', updateKeepRatio);\n\n transformer.on('transform.corner-sync', () => {\n // «Incorporate» non-uniform scaling into width/height for Rect,\n const n = this._selected?.getNode() as unknown as Konva.Node | undefined;\n if (n) {\n this._bakeRectScale(n);\n\n // Correct the node position to keep the opposite angle in place\n if (this._transformOppositeCorner) {\n const activeAnchor =\n typeof transformer.getActiveAnchor === 'function' ? transformer.getActiveAnchor() : '';\n const absTransform = n.getAbsoluteTransform();\n\n // For groups use clientRect, for single nodes use width/height\n const isGroup = n instanceof Konva.Group;\n let width: number;\n let height: number;\n let localX = 0;\n let localY = 0;\n\n if (isGroup) {\n // For groups use clientRect, for single nodes use width/height\n const clientRect = n.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: false,\n });\n width = clientRect.width;\n height = clientRect.height;\n localX = clientRect.x;\n localY = clientRect.y;\n } else {\n // For single nodes use width/height\n width = n.width();\n height = n.height();\n }\n\n // Determine the local coordinates of the opposite corner\n let oppositeX = 0;\n let oppositeY = 0;\n\n if (activeAnchor === 'top-left') {\n oppositeX = localX + width;\n oppositeY = localY + height;\n } else if (activeAnchor === 'top-right') {\n oppositeX = localX;\n oppositeY = localY + height;\n } else if (activeAnchor === 'bottom-right') {\n oppositeX = localX;\n oppositeY = localY;\n } else if (activeAnchor === 'bottom-left') {\n oppositeX = localX + width;\n oppositeY = localY;\n }\n\n // Current absolute position of the opposite corner\n const currentOpposite = absTransform.point({ x: oppositeX, y: oppositeY });\n\n // Calculate the offset\n const dx = this._transformOppositeCorner.x - currentOpposite.x;\n const dy = this._transformOppositeCorner.y - currentOpposite.y;\n\n // Correct the node position in local coordinates of the parent\n const parent = n.getParent();\n if (parent && (Math.abs(dx) > 0.01 || Math.abs(dy) > 0.01)) {\n const parentInv = parent.getAbsoluteTransform().copy().invert();\n const currentPosAbs = n.getAbsolutePosition();\n const newPosAbs = { x: currentPosAbs.x + dx, y: currentPosAbs.y + dy };\n const newPosLocal = parentInv.point(newPosAbs);\n n.position(newPosLocal);\n }\n }\n }\n this._restyleSideAnchors();\n // OPTIMIZATION: use debounced UI update\n this._scheduleUIUpdate();\n // Temporary group: update rotation handles position\n this._updateTempRotateHandlesPosition();\n this._core?.nodes.layer.batchDraw();\n });\n transformer.on('transformend.corner-sync', () => {\n // Reset the flag suppressing corner-radius handlers and saved angle\n this._cornerHandlesSuppressed = false;\n this._transformOppositeCorner = null;\n this._restyleSideAnchors();\n // OPTIMIZATION: use debounced UI update\n this._scheduleUIUpdate();\n this._core?.nodes.layer.batchDraw();\n });\n // Listen to attribute changes of the selected node, if size/position changes programmatically\n const selNode = this._selected.getNode() as unknown as Konva.Node;\n // Remove previous handlers if any, then attach new ones with namespace\n selNode.off('.overlay-sync');\n const syncOverlays = () => {\n this._restyleSideAnchors();\n // OPTIMIZATION: use debounced UI update\n this._scheduleUIUpdate();\n this._scheduleBatchDraw();\n };\n selNode.on(\n 'widthChange.overlay-sync heightChange.overlay-sync scaleXChange.overlay-sync scaleYChange.overlay-sync rotationChange.overlay-sync xChange.overlay-sync yChange.overlay-sync',\n syncOverlays,\n );\n this._scheduleBatchDraw();\n }\n\n // Restyle side-anchors (top/right/bottom/left) to fill the side of the selected node\n private _restyleSideAnchors() {\n if (!this._core || !this._selected || !this._transformer) return;\n const node = this._selected.getNode() as unknown as Konva.Node;\n restyleSideAnchorsUtil(this._core, this._transformer, node);\n }\n\n // ===================== Rotate Handles (four corners) =====================\n private _setupRotateHandles() {\n if (!this._core || !this._selected) return;\n const layer = this._core.nodes.layer;\n this._destroyRotateHandles();\n const group = new Konva.Group({ name: 'rotate-handles-group', listening: true });\n layer.add(group);\n group.moveToTop();\n this._rotateHandlesGroup = group;\n const tl = makeRotateHandle('rotate-tl');\n const tr = makeRotateHandle('rotate-tr');\n const br = makeRotateHandle('rotate-br');\n const bl = makeRotateHandle('rotate-bl');\n // Add one by one to exclude runtime/type issues with varargs\n group.add(tl);\n group.add(tr);\n group.add(br);\n group.add(bl);\n this._rotateHandles = { tl, tr, br, bl };\n\n const bindRotate = (h: Konva.Circle) => {\n h.on('dragstart.rotate', () => {\n if (!this._selected) return;\n const node = this._selected.getNode() as unknown as Konva.Node;\n const dec = node.getAbsoluteTransform().decompose();\n const center = this._getNodeCenterAbs(node);\n this._rotateCenterAbsStart = center;\n const p = this._core?.stage.getPointerPosition() ?? h.getAbsolutePosition();\n const start = (Math.atan2(p.y - center.y, p.x - center.x) * 180) / Math.PI;\n this._rotateDragState = { base: dec.rotation || 0, start };\n // Save the current state of stage.draggable before disabling\n if (this._core) this._prevStageDraggableBeforeRotate = this._core.stage.draggable();\n // Disable drag on the stage and the node\n if (typeof node.draggable === 'function') node.draggable(false);\n this._core?.stage.draggable(false);\n // Cursor: show 'grabbing' during rotation\n if (this._core) this._core.stage.container().style.cursor = 'grabbing';\n });\n h.on('dragmove.rotate', (e: Konva.KonvaEventObject<DragEvent>) => {\n if (!this._core || !this._selected || !this._rotateDragState) return;\n const node = this._selected.getNode() as unknown as Konva.Node;\n // Use fixed center if available to prevent drift\n const centerRef = this._rotateCenterAbsStart ?? this._getNodeCenterAbs(node);\n const pointer = this._core.stage.getPointerPosition() ?? h.getAbsolutePosition();\n const curr = (Math.atan2(pointer.y - centerRef.y, pointer.x - centerRef.x) * 180) / Math.PI;\n let rot = this._rotateDragState.base + (curr - this._rotateDragState.start);\n // Snapping as in Transformer, but with correct angle normalization\n const norm = (deg: number) => {\n let x = deg % 360;\n if (x < 0) x += 360;\n return x;\n };\n const angDiff = (a: number, b: number) => {\n // minimum signed difference between a and b modulo 360 in range [-180, 180)\n let d = norm(a - b + 180) - 180;\n return d;\n };\n // Snap only when Shift is pressed. Free rotation without Shift\n if (e.evt.shiftKey) {\n const tr = this._transformer;\n let snaps: number[] | undefined;\n let tol = 5;\n if (tr) {\n const s = tr.rotationSnaps();\n if (Array.isArray(s)) snaps = s.map((v) => norm(v));\n const t = tr.rotationSnapTolerance();\n if (typeof t === 'number') tol = t;\n }\n if (snaps?.length) {\n const rotN = norm(rot);\n let best = rot;\n let bestDiff = Infinity;\n for (const a of snaps) {\n const d = Math.abs(angDiff(rotN, a));\n if (d < bestDiff && d <= tol) {\n best = a; // use normalized snap angle\n bestDiff = d;\n }\n }\n if (bestDiff !== Infinity) rot = best;\n }\n }\n node.rotation(rot);\n // Compensation for position: keep the center unchanged\n if (this._rotateCenterAbsStart) {\n const centerAfter = this._getNodeCenterAbs(node);\n const dxAbs = this._rotateCenterAbsStart.x - centerAfter.x;\n const dyAbs = this._rotateCenterAbsStart.y - centerAfter.y;\n const parent = node.getParent();\n if (parent) {\n const inv = parent.getAbsoluteTransform().copy().invert();\n const from = inv.point({ x: centerAfter.x, y: centerAfter.y });\n const to = inv.point({ x: centerAfter.x + dxAbs, y: centerAfter.y + dyAbs });\n const nx = node.x() + (to.x - from.x);\n const ny = node.y() + (to.y - from.y);\n if (typeof node.position === 'function') node.position({ x: nx, y: ny });\n }\n }\n this._transformer?.forceUpdate();\n this._restyleSideAnchors();\n this._core.nodes.layer.batchDraw();\n // OPTIMIZATION: use debounced UI update\n this._scheduleUIUpdate();\n });\n h.on('dragend.rotate', () => {\n this._rotateDragState = null;\n this._rotateCenterAbsStart = null;\n // Restore scene pan, draggable node — according to settings\n if (this._selected) {\n const node = this._selected.getNode() as unknown as Konva.Node;\n if (this._options.dragEnabled && typeof node.draggable === 'function') {\n node.draggable(true);\n }\n }\n // Restore previous state of stage.draggable instead of unconditional true\n if (this._core && this._prevStageDraggableBeforeRotate !== null) {\n this._core.stage.draggable(this._prevStageDraggableBeforeRotate);\n this._prevStageDraggableBeforeRotate = null;\n }\n // Final recalculation of custom middle‑handlers\n this._restyleSideAnchors();\n // OPTIMIZATION: use debounced UI update\n this._scheduleUIUpdate();\n this._core?.nodes.layer.batchDraw();\n // Restore cursor to 'grab' after rotation handler drag end\n if (this._core) this._core.stage.container().style.cursor = 'grab';\n });\n };\n\n bindRotate(tl);\n bindRotate(tr);\n bindRotate(br);\n bindRotate(bl);\n\n // Hover cursors for rotation handles\n const setCursor = (c: string) => {\n if (this._core) this._core.stage.container().style.cursor = c;\n };\n if (this._rotateHandles.tl) {\n this._rotateHandles.tl.on('mouseenter.rotate-cursor', () => {\n setCursor('pointer');\n });\n this._rotateHandles.tl.on('mouseleave.rotate-cursor', () => {\n setCursor('default');\n });\n }\n if (this._rotateHandles.tr) {\n this._rotateHandles.tr.on('mouseenter.rotate-cursor', () => {\n setCursor('pointer');\n });\n this._rotateHandles.tr.on('mouseleave.rotate-cursor', () => {\n setCursor('default');\n });\n }\n if (this._rotateHandles.br) {\n this._rotateHandles.br.on('mouseenter.rotate-cursor', () => {\n setCursor('pointer');\n });\n this._rotateHandles.br.on('mouseleave.rotate-cursor', () => {\n setCursor('default');\n });\n }\n if (this._rotateHandles.bl) {\n this._rotateHandles.bl.on('mouseenter.rotate-cursor', () => {\n setCursor('pointer');\n });\n this._rotateHandles.bl.on('mouseleave.rotate-cursor', () => {\n setCursor('default');\n });\n }\n\n this._updateRotateHandlesPosition();\n }\n\n private _destroyRotateHandles() {\n if (this._rotateHandlesGroup) {\n this._rotateHandlesGroup.destroy();\n this._rotateHandlesGroup = null;\n }\n this._rotateHandles = { tl: null, tr: null, br: null, bl: null };\n this._rotateDragState = null;\n }\n\n private _getNodeCenterAbs(node: Konva.Node) {\n const tr = node.getAbsoluteTransform().copy();\n const local = node.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: false });\n return tr.point({ x: local.x + local.width / 2, y: local.y + local.height / 2 });\n }\n\n private _updateRotateHandlesPosition() {\n if (!this._core || !this._selected || !this._rotateHandlesGroup) return;\n const node = this._selected.getNode() as unknown as Konva.Node;\n const local = node.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: false });\n const width = local.width;\n const height = local.height;\n if (width <= 0 || height <= 0) return;\n const tr = node.getAbsoluteTransform().copy();\n const mapAbs = (pt: { x: number; y: number }) => tr.point(pt);\n const offset = 12;\n const centerAbs = mapAbs({ x: local.x + width / 2, y: local.y + height / 2 });\n const c0 = mapAbs({ x: local.x, y: local.y });\n const c1 = mapAbs({ x: local.x + width, y: local.y });\n const c2 = mapAbs({ x: local.x + width, y: local.y + height });\n const c3 = mapAbs({ x: local.x, y: local.y + height });\n const dir = (c: { x: number; y: number }) => {\n const vx = c.x - centerAbs.x;\n const vy = c.y - centerAbs.y;\n const len = Math.hypot(vx, vy) || 1;\n return { x: vx / len, y: vy / len };\n };\n const d0 = dir(c0),\n d1 = dir(c1),\n d2 = dir(c2),\n d3 = dir(c3);\n const p0 = { x: c0.x + d0.x * offset, y: c0.y + d0.y * offset };\n const p1 = { x: c1.x + d1.x * offset, y: c1.y + d1.y * offset };\n const p2 = { x: c2.x + d2.x * offset, y: c2.y + d2.y * offset };\n const p3 = { x: c3.x + d3.x * offset, y: c3.y + d3.y * offset };\n\n if (this._rotateHandles.tl) this._rotateHandles.tl.absolutePosition(p0);\n if (this._rotateHandles.tr) this._rotateHandles.tr.absolutePosition(p1);\n if (this._rotateHandles.br) this._rotateHandles.br.absolutePosition(p2);\n if (this._rotateHandles.bl) this._rotateHandles.bl.absolutePosition(p3);\n\n const parent = this._rotateHandlesGroup.getParent();\n if (parent) {\n const pd = parent.getAbsoluteTransform().decompose();\n const invX = 1 / (Math.abs(pd.scaleX) || 1);\n const invY = 1 / (Math.abs(pd.scaleY) || 1);\n if (this._rotateHandles.tl) this._rotateHandles.tl.scale({ x: invX, y: invY });\n if (this._rotateHandles.tr) this._rotateHandles.tr.scale({ x: invX, y: invY });\n if (this._rotateHandles.br) this._rotateHandles.br.scale({ x: invX, y: invY });\n if (this._rotateHandles.bl) this._rotateHandles.bl.scale({ x: invX, y: invY });\n }\n this._rotateHandlesGroup.moveToTop();\n }\n\n // ===================== Size Label (width × height) =====================\n private _setupSizeLabel() {\n if (!this._core || !this._selected) return;\n const layer = this._core.nodes.layer;\n this._destroySizeLabel();\n const label = new Konva.Label({ listening: false, opacity: 0.95 });\n const tag = new Konva.Tag({\n fill: '#2b83ff',\n cornerRadius: 4,\n shadowColor: '#000',\n shadowBlur: 6,\n shadowOpacity: 0.25,\n } as Konva.TagConfig);\n const text = new Konva.Text({\n text: '',\n fontFamily: 'Inter, Calibri, Arial, sans-serif',\n fontSize: 12,\n padding: 4,\n fill: '#ffffff',\n } as Konva.TextConfig);\n label.add(tag);\n label.add(text);\n layer.add(label);\n this._sizeLabel = label;\n this._updateSizeLabel();\n }\n\n // OPTIMIZATION: Debounced UI update\n private _scheduleUIUpdate() {\n this._uiUpdateDebounce.schedule(() => {\n this._updateSizeLabel();\n this._updateRotateHandlesPosition();\n this._updateCornerRadiusHandlesPosition();\n });\n }\n\n private _updateSizeLabel() {\n if (!this._core || !this._selected || !this._sizeLabel) return;\n const node = this._selected.getNode();\n const bbox = node.getClientRect({ skipShadow: true, skipStroke: false });\n const localRect = node.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const nodeDec = node.getAbsoluteTransform().decompose();\n const worldDec = this._core.nodes.world.getAbsoluteTransform().decompose();\n const nodeAbsX = Math.abs(nodeDec.scaleX) || 1;\n const nodeAbsY = Math.abs(nodeDec.scaleY) || 1;\n const worldAbsX = Math.abs(worldDec.scaleX) || 1;\n const worldAbsY = Math.abs(worldDec.scaleY) || 1;\n const logicalW = localRect.width * (nodeAbsX / worldAbsX);\n const logicalH = localRect.height * (nodeAbsY / worldAbsY);\n const w = Math.max(0, Math.round(logicalW));\n const h = Math.max(0, Math.round(logicalH));\n\n const text = this._sizeLabel.getText();\n text.text(String(w) + ' × ' + String(h));\n\n const offset = 8;\n const centerX = bbox.x + bbox.width / 2;\n const bottomY = bbox.y + bbox.height + offset;\n\n const labelRect = this._sizeLabel.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const labelW = labelRect.width;\n this._sizeLabel.absolutePosition({ x: centerX, y: bottomY });\n this._sizeLabel.offsetX(labelW / 2);\n this._sizeLabel.offsetY(0);\n const parent = this._sizeLabel.getParent();\n if (parent) {\n const pDec = parent.getAbsoluteTransform().decompose();\n const invScaleX = 1 / (Math.abs(pDec.scaleX) || 1);\n const invScaleY = 1 / (Math.abs(pDec.scaleY) || 1);\n this._sizeLabel.scale({ x: invScaleX, y: invScaleY });\n }\n this._sizeLabel.moveToTop();\n if (this._transformer) this._transformer.moveToTop();\n if (this._cornerHandlesGroup) this._cornerHandlesGroup.moveToTop();\n }\n\n private _destroySizeLabel() {\n if (this._sizeLabel) {\n this._sizeLabel.destroy();\n this._sizeLabel = null;\n }\n }\n\n // ===================== Corner Radius Handles =====================\n private _isCornerRadiusSupported(konvaNode: Konva.Node): konvaNode is Konva.Rect {\n return konvaNode instanceof Konva.Rect;\n }\n\n private _getCornerRadiusArray(konvaNode: Konva.Rect): [number, number, number, number] {\n const val = konvaNode.cornerRadius();\n if (Array.isArray(val)) {\n const [tl = 0, tr = 0, br = 0, bl = 0] = val;\n return [tl || 0, tr || 0, br || 0, bl || 0];\n }\n const num = typeof val === 'number' ? val : 0;\n return [num, num, num, num];\n }\n\n private _setCornerRadiusArray(konvaNode: Konva.Rect, arr: [number, number, number, number]) {\n const [a, b, c, d] = arr;\n if (a === b && b === c && c === d) {\n konvaNode.cornerRadius(a);\n } else {\n konvaNode.cornerRadius(arr);\n }\n }\n\n private _setupCornerRadiusHandles(showCornerPerimeters = false) {\n if (!this._core || !this._selected) return;\n const node = this._selected.getNode() as unknown as Konva.Node;\n if (!this._isCornerRadiusSupported(node)) return;\n\n const layer = this._core.nodes.layer;\n const stage = this._core.stage;\n\n // Снести предыдущие\n this._destroyCornerRadiusHandles();\n\n const group = new Konva.Group({ name: 'corner-radius-handles-group', listening: true });\n layer.add(group);\n group.moveToTop();\n group.visible(false);\n this._cornerHandlesGroup = group;\n\n node.off('.cornerRadiusHover');\n node.on('mouseenter.cornerRadiusHover', () => {\n if (!this._core || !this._cornerHandlesGroup) return;\n const world = this._core.nodes.world;\n const currentZoom = world.scaleX();\n if (currentZoom < 0.3) return;\n this._cornerHandlesGroup.visible(true);\n });\n node.on('mouseleave.cornerRadiusHover', () => {\n if (!this._cornerHandlesGroup) return;\n const pointer = stage.getPointerPosition();\n if (!pointer) {\n this._cornerHandlesGroup.visible(false);\n return;\n }\n const shapes = layer.getIntersection(pointer);\n if (shapes && this._cornerHandlesGroup.isAncestorOf(shapes)) {\n return;\n }\n this._cornerHandlesGroup.visible(false);\n });\n\n group.on('mouseenter.cornerRadiusHover', () => {\n if (!this._core || !this._cornerHandlesGroup) return;\n const world = this._core.nodes.world;\n const currentZoom = world.scaleX();\n if (currentZoom < 0.3) return;\n this._cornerHandlesGroup.visible(true);\n });\n group.on('mouseleave.cornerRadiusHover', () => {\n if (this._cornerHandlesGroup) this._cornerHandlesGroup.visible(false);\n });\n\n const pointer = stage.getPointerPosition();\n if (pointer) {\n const world = this._core.nodes.world;\n const currentZoom = world.scaleX();\n if (currentZoom >= 0.3) {\n const shapes = layer.getIntersection(pointer);\n if (shapes && (shapes === node || node.isAncestorOf(shapes))) {\n this._cornerHandlesGroup.visible(true);\n }\n }\n }\n\n const computeCornerSquares = () => {\n const width = node.width();\n const height = node.height();\n\n const absScale = node.getAbsoluteScale();\n const invX = 1 / (Math.abs(absScale.x) || 1);\n const invY = 1 / (Math.abs(absScale.y) || 1);\n const ox = 12 * invX;\n const oy = 12 * invY;\n\n const dxToCenter = Math.max(0, width / 2 - ox);\n const dyToCenter = Math.max(0, height / 2 - oy);\n const side = Math.min(dxToCenter, dyToCenter);\n\n return {\n tl: { corner: { x: ox, y: oy }, sign: { x: 1, y: 1 }, side },\n tr: { corner: { x: width - ox, y: oy }, sign: { x: -1, y: 1 }, side },\n br: { corner: { x: width - ox, y: height - oy }, sign: { x: -1, y: -1 }, side },\n bl: { corner: { x: ox, y: height - oy }, sign: { x: 1, y: -1 }, side },\n } as const;\n };\n\n const snapToCornerDiagonal = (absPos: Konva.Vector2d, key: 'tl' | 'tr' | 'br' | 'bl') => {\n const nodeAbsT = node.getAbsoluteTransform().copy();\n const toLocal = (p: Konva.Vector2d) => nodeAbsT.copy().invert().point(p);\n const toAbs = (p: Konva.Vector2d) => nodeAbsT.point(p);\n\n const squares = computeCornerSquares();\n const s = squares[key];\n\n const pL = toLocal(absPos);\n const dx = pL.x - s.corner.x;\n const dy = pL.y - s.corner.y;\n\n let t = (s.sign.x * dx + s.sign.y * dy) / 2;\n t = Math.max(0, Math.min(s.side, t));\n\n const snappedLocal: Konva.Vector2d = {\n x: s.corner.x + s.sign.x * t,\n y: s.corner.y + s.sign.y * t,\n };\n const snappedAbs = toAbs(snappedLocal) as Konva.Vector2d;\n return { snappedAbs, r: t, meta: s };\n };\n\n const makeSquare = (name: string): Konva.Line =>\n new Konva.Line({\n name,\n points: [],\n stroke: showCornerPerimeters ? '#4a90e2' : '',\n strokeWidth: showCornerPerimeters ? 1 : 0,\n dash: showCornerPerimeters ? [4, 4] : [],\n closed: true,\n listening: false,\n });\n\n const sqTL = makeSquare('corner-square-tl');\n const sqTR = makeSquare('corner-square-tr');\n const sqBR = makeSquare('corner-square-br');\n const sqBL = makeSquare('corner-square-bl');\n group.add(sqTL, sqTR, sqBR, sqBL);\n\n // ===== Хэндлеры =====\n const makeHandle = (name: string): Konva.Circle => {\n const handle = new Konva.Circle({\n name,\n radius: 4,\n fill: '#ffffff',\n stroke: '#4a90e2',\n strokeWidth: 1.5,\n draggable: true,\n dragOnTop: true,\n hitStrokeWidth: 16,\n });\n handle.on('mouseenter.corner-radius', () => {\n if (this._core) this._core.stage.container().style.cursor = 'default';\n });\n return handle;\n };\n\n const tl = makeHandle('corner-radius-tl');\n const tr = makeHandle('corner-radius-tr');\n const br = makeHandle('corner-radius-br');\n const bl = makeHandle('corner-radius-bl');\n group.add(tl, tr, br, bl);\n this._cornerHandles = { tl, tr, br, bl };\n\n type Key = 'tl' | 'tr' | 'br' | 'bl';\n const keyToIndex: Record<Key, 0 | 1 | 2 | 3> = { tl: 0, tr: 1, br: 2, bl: 3 };\n let routeEnabled = false;\n let routeActive: Key | null = null;\n let lastAltOnly = false;\n\n const getCenterAbs = () => {\n const absT = node.getAbsoluteTransform().copy();\n const w = node.width();\n const h = node.height();\n return absT.point({ x: w / 2, y: h / 2 });\n };\n\n const getAllHandleAbs = () => {\n const res: Partial<Record<Key, Konva.Vector2d>> = {};\n if (this._cornerHandles.tl) res.tl = this._cornerHandles.tl.getAbsolutePosition();\n if (this._cornerHandles.tr) res.tr = this._cornerHandles.tr.getAbsolutePosition();\n if (this._cornerHandles.br) res.br = this._cornerHandles.br.getAbsolutePosition();\n if (this._cornerHandles.bl) res.bl = this._cornerHandles.bl.getAbsolutePosition();\n return res;\n };\n\n const isNearCenterPoint = (p: Konva.Vector2d, epsPx = 8) => {\n const c = getCenterAbs();\n return Math.hypot(p.x - c.x, p.y - c.y) <= epsPx;\n };\n const isNearCenterLine = (p: Konva.Vector2d, epsPx = 6) => {\n const c = getCenterAbs();\n return Math.min(Math.abs(p.x - c.x), Math.abs(p.y - c.y)) <= epsPx;\n };\n const anyHandlesOverlapNear = (start: Konva.Vector2d, epsPx = 8) => {\n const all = getAllHandleAbs();\n let countNear = 0;\n (['tl', 'tr', 'br', 'bl'] as Key[]).forEach((k) => {\n const hp = all[k];\n if (hp && Math.hypot(hp.x - start.x, hp.y - start.y) <= epsPx) countNear++;\n });\n return countNear >= 2;\n };\n\n const pickRouteByAbsPos = (posAbs: Konva.Vector2d) => {\n if (!routeEnabled || routeActive) return;\n const c = getCenterAbs();\n let vx = posAbs.x - c.x,\n vy = posAbs.y - c.y;\n const mag = Math.hypot(vx, vy);\n if (mag < 0.1) return;\n vx /= mag;\n vy /= mag;\n\n const absT = node.getAbsoluteTransform().copy();\n const squares = computeCornerSquares();\n const diag: Record<Key, { x: number; y: number }> = (\n ['tl', 'tr', 'br', 'bl'] as Key[]\n ).reduce(\n (acc, k) => {\n const s = squares[k];\n const cornerAbs = absT.point(s.corner);\n const dx = cornerAbs.x - c.x;\n const dy = cornerAbs.y - c.y;\n const len = Math.hypot(dx, dy) || 1;\n acc[k] = { x: dx / len, y: dy / len };\n return acc;\n },\n {} as Record<Key, { x: number; y: number }>,\n );\n\n let best: Key = 'tl',\n bestDot = -Infinity;\n (['tl', 'tr', 'br', 'bl'] as Key[]).forEach((k) => {\n const d = diag[k];\n const dot = vx * d.x + vy * d.y;\n if (dot > bestDot) {\n bestDot = dot;\n best = k;\n }\n });\n routeActive = best;\n };\n\n const makeBound = (defKey: Key) => (pos: Konva.Vector2d) => {\n pickRouteByAbsPos(pos);\n const key = routeActive ?? defKey;\n\n const { snappedAbs, r: t, meta: s } = snapToCornerDiagonal(pos, key);\n\n const w = node.width();\n const hgt = node.height();\n const maxR = Math.max(0, Math.min(w, hgt) / 2);\n const percent = s.side > 0 ? t / s.side : 0;\n let rPix = Math.round(percent * maxR);\n rPix = Math.max(0, Math.min(rPix, maxR));\n\n const arr = this._getCornerRadiusArray(node);\n const idx = keyToIndex[key];\n if (lastAltOnly) {\n arr[idx] = rPix;\n } else {\n arr[0] = rPix;\n arr[1] = rPix;\n arr[2] = rPix;\n arr[3] = rPix;\n }\n this._setCornerRadiusArray(node, arr);\n\n this._showRadiusLabelForCorner(idx);\n updatePositions();\n this._core?.nodes.layer.batchDraw();\n\n return snappedAbs;\n };\n\n tl.dragBoundFunc(makeBound('tl'));\n tr.dragBoundFunc(makeBound('tr'));\n br.dragBoundFunc(makeBound('br'));\n bl.dragBoundFunc(makeBound('bl'));\n\n const updatePositions = () => {\n const { tl, tr, br, bl } = this._cornerHandles;\n if (!tl || !tr || !br || !bl) return;\n\n if (this._cornerHandlesSuppressed) {\n this._cornerHandlesGroup?.visible(false);\n this._radiusLabel?.visible(false);\n return;\n }\n if (this._core && this._cornerHandlesGroup && this._radiusLabel) {\n const world = this._core.nodes.world;\n const currentZoom = world.scaleX();\n if (currentZoom < 0.3) {\n this._cornerHandlesGroup.visible(false);\n this._radiusLabel.visible(false);\n return;\n }\n this._cornerHandlesGroup.visible(true);\n }\n\n const nodeAbsT = node.getAbsoluteTransform().copy();\n const layerInvAbsT = layer.getAbsoluteTransform().copy().invert();\n const toAbs = (p: { x: number; y: number }) => nodeAbsT.point(p);\n const toLayer = (p: { x: number; y: number }) => layerInvAbsT.point(nodeAbsT.point(p));\n\n const squares = computeCornerSquares();\n const radii = this._getCornerRadiusArray(node);\n\n const placeHandle = (key: Key, idx: 0 | 1 | 2 | 3, h: Konva.Circle) => {\n const s = squares[key];\n const w = node.width();\n const hgt = node.height();\n const maxR = Math.max(0, Math.min(w, hgt) / 2);\n\n const rPix = Math.max(0, Math.min(maxR, radii[idx] || 0));\n const percent = maxR > 0 ? rPix / maxR : 0;\n const t = Math.max(0, Math.min(s.side, percent * s.side));\n\n const pLocal = {\n x: s.corner.x + s.sign.x * t,\n y: s.corner.y + s.sign.y * t,\n };\n h.absolutePosition(toAbs(pLocal));\n };\n\n const placeSquare = (key: Key, line: Konva.Line) => {\n const s = squares[key];\n const c = s.corner;\n const e = { x: s.corner.x + s.sign.x * s.side, y: s.corner.y + s.sign.y * s.side };\n\n const p1 = toLayer({ x: c.x, y: c.y });\n const p2 = toLayer({ x: e.x, y: c.y });\n const p3 = toLayer({ x: e.x, y: e.y });\n const p4 = toLayer({ x: c.x, y: e.y });\n\n line.points([p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y]);\n };\n\n placeSquare('tl', sqTL);\n placeSquare('tr', sqTR);\n placeSquare('br', sqBR);\n placeSquare('bl', sqBL);\n\n placeHandle('tl', 0, tl);\n placeHandle('tr', 1, tr);\n placeHandle('br', 2, br);\n placeHandle('bl', 3, bl);\n\n const grpParent = this._cornerHandlesGroup?.getParent();\n if (grpParent) {\n const pd = grpParent.getAbsoluteTransform().decompose();\n const invX = 1 / (Math.abs(pd.scaleX) || 1);\n const invY = 1 / (Math.abs(pd.scaleY) || 1);\n tl.scale({ x: invX, y: invY });\n tr.scale({ x: invX, y: invY });\n br.scale({ x: invX, y: invY });\n bl.scale({ x: invX, y: invY });\n }\n this._cornerHandlesGroup?.moveToTop();\n };\n this._updateCornerRadiusHandlesPosition = updatePositions;\n\n const onDragStartRoute = (h: Konva.Circle, ev?: Konva.KonvaEventObject<DragEvent>) => {\n lastAltOnly = !!(ev?.evt as MouseEvent | undefined)?.altKey;\n const startAbs = h.getAbsolutePosition();\n routeEnabled =\n isNearCenterPoint(startAbs, 8) ||\n isNearCenterLine(startAbs, 6) ||\n anyHandlesOverlapNear(startAbs, 8);\n\n routeActive = null;\n\n if (routeEnabled) {\n const p = this._core?.stage.getPointerPosition() ?? startAbs;\n pickRouteByAbsPos(p);\n }\n };\n\n const dragHandler =\n (_defaultKey: Key, _defaultIndex: 0 | 1 | 2 | 3) =>\n (e: Konva.KonvaEventObject<DragEvent>) => {\n lastAltOnly = (e.evt as MouseEvent).altKey;\n };\n\n const dragEndReset = () => {\n routeEnabled = false;\n routeActive = null;\n lastAltOnly = false;\n };\n\n tl.on('dragstart.corner-radius', (ev) => {\n onDragStartRoute(tl, ev);\n });\n tr.on('dragstart.corner-radius', (ev) => {\n onDragStartRoute(tr, ev);\n });\n br.on('dragstart.corner-radius', (ev) => {\n onDragStartRoute(br, ev);\n });\n bl.on('dragstart.corner-radius', (ev) => {\n onDragStartRoute(bl, ev);\n });\n\n tl.on('dragmove.corner-radius', dragHandler('tl', 0));\n tr.on('dragmove.corner-radius', dragHandler('tr', 1));\n br.on('dragmove.corner-radius', dragHandler('br', 2));\n bl.on('dragmove.corner-radius', dragHandler('bl', 3));\n\n tl.on('dragend.corner-radius', dragEndReset);\n tr.on('dragend.corner-radius', dragEndReset);\n br.on('dragend.corner-radius', dragEndReset);\n bl.on('dragend.corner-radius', dragEndReset);\n\n const showRadius = (cornerIndex: 0 | 1 | 2 | 3) => () => {\n this._showRadiusLabelForCorner(cornerIndex);\n };\n const hideRadius = () => {\n this._hideRadiusLabel();\n };\n const updateDuringDrag = (cornerIndex: 0 | 1 | 2 | 3) => () => {\n this._showRadiusLabelForCorner(cornerIndex);\n };\n\n tl.on('mouseenter.corner-radius', showRadius(0));\n tr.on('mouseenter.corner-radius', showRadius(1));\n br.on('mouseenter.corner-radius', showRadius(2));\n bl.on('mouseenter.corner-radius', showRadius(3));\n tl.on('mouseleave.corner-radius', hideRadius);\n tr.on('mouseleave.corner-radius', hideRadius);\n br.on('mouseleave.corner-radius', hideRadius);\n bl.on('mouseleave.corner-radius', hideRadius);\n\n tl.on('dragstart.corner-radius', showRadius(0));\n tr.on('dragstart.corner-radius', showRadius(1));\n br.on('dragstart.corner-radius', showRadius(2));\n bl.on('dragstart.corner-radius', showRadius(3));\n tl.on('dragmove.corner-radius', updateDuringDrag(0));\n tr.on('dragmove.corner-radius', updateDuringDrag(1));\n br.on('dragmove.corner-radius', updateDuringDrag(2));\n bl.on('dragmove.corner-radius', updateDuringDrag(3));\n tl.on('dragend.corner-radius', hideRadius);\n tr.on('dragend.corner-radius', hideRadius);\n br.on('dragend.corner-radius', hideRadius);\n bl.on('dragend.corner-radius', hideRadius);\n\n const onDown = () => {\n if (!this._selected) return;\n const n = this._selected.getNode() as unknown as Konva.Node;\n n.draggable(false);\n };\n const onUp = () => {\n if (!this._selected) return;\n const n = this._selected.getNode() as unknown as Konva.Node;\n if (this._options.dragEnabled) n.draggable(true);\n };\n tl.on('mousedown.corner-radius touchstart.corner-radius', onDown);\n tr.on('mousedown.corner-radius touchstart.corner-radius', onDown);\n br.on('mousedown.corner-radius touchstart.corner-radius', onDown);\n bl.on('mousedown.corner-radius touchstart.corner-radius', onDown);\n tl.on('mouseup.corner-radius touchend.corner-radius', onUp);\n tr.on('mouseup.corner-radius touchend.corner-radius', onUp);\n br.on('mouseup.corner-radius touchend.corner-radius', onUp);\n bl.on('mouseup.corner-radius touchend.corner-radius', onUp);\n\n const ns = '.corner-squares';\n let pending = false;\n const schedule = () => {\n if (pending) return;\n pending = true;\n Konva.Util.requestAnimFrame(() => {\n pending = false;\n updatePositions();\n this._core?.nodes.layer.batchDraw();\n });\n };\n stage.on(\n [\n 'wheel',\n 'resize',\n 'xChange',\n 'yChange',\n 'positionChange',\n 'scaleXChange',\n 'scaleYChange',\n 'scaleChange',\n ]\n .map((e) => e + ns)\n .join(' '),\n schedule,\n );\n layer.on(\n ['xChange', 'yChange', 'positionChange', 'scaleXChange', 'scaleYChange', 'scaleChange']\n .map((e) => e + ns)\n .join(' '),\n schedule,\n );\n node.on(\n [\n 'dragmove',\n 'transform',\n 'xChange',\n 'yChange',\n 'widthChange',\n 'heightChange',\n 'rotationChange',\n 'scaleXChange',\n 'scaleYChange',\n 'positionChange',\n 'scaleChange',\n ]\n .map((e) => e + ns)\n .join(' '),\n schedule,\n );\n if (this._transformer) {\n this._transformer.on('transformstart' + ns, () => {\n this._cornerHandlesSuppressed = true;\n this._cornerHandlesGroup?.visible(false);\n this._hideRadiusLabel();\n this._core?.nodes.layer.batchDraw();\n });\n this._transformer.on('transform' + ns, () => {\n updatePositions();\n this._core?.nodes.layer.batchDraw();\n });\n this._transformer.on('transformend' + ns, () => {\n this._cornerHandlesSuppressed = false;\n schedule();\n });\n }\n group.on('destroy' + ns, () => {\n stage.off(ns);\n layer.off(ns);\n node.off(ns);\n this._transformer?.off(ns);\n });\n\n // Инициализация\n updatePositions();\n layer.batchDraw();\n }\n\n private _destroyCornerRadiusHandles() {\n if (this._cornerHandlesGroup) {\n this._cornerHandlesGroup.destroy();\n this._cornerHandlesGroup = null;\n }\n this._cornerHandles = { tl: null, tr: null, br: null, bl: null };\n if (this._core) this._core.stage.container().style.cursor = 'default';\n this._destroyRadiusLabel();\n if (this._selected) {\n const n = this._selected.getNode() as unknown as Konva.Node;\n n.off('.overlay-sync');\n }\n }\n\n private _bakeRectScale(node: Konva.Node) {\n if (!(node instanceof Konva.Rect)) return;\n const sx = node.scaleX();\n const sy = node.scaleY();\n if (sx === 1 && sy === 1) return;\n const absBefore = node.getAbsolutePosition();\n const w = node.width();\n const h = node.height();\n const nx = Math.abs(sx) * w;\n const ny = Math.abs(sy) * h;\n node.width(nx);\n node.height(ny);\n node.scaleX(1);\n node.scaleY(1);\n node.setAbsolutePosition(absBefore);\n }\n\n private _updateCornerRadiusHandlesPosition() {\n if (!this._core || !this._selected || !this._cornerHandlesGroup) return;\n const nodeRaw = this._selected.getNode() as unknown as Konva.Node;\n if (!this._isCornerRadiusSupported(nodeRaw)) return;\n const node = nodeRaw;\n\n const local = node.getClientRect({ skipTransform: true, skipShadow: true, skipStroke: true });\n const width = local.width;\n const height = local.height;\n if (width <= 0 || height <= 0) return;\n\n const tr = node.getAbsoluteTransform().copy();\n const mapAbs = (pt: { x: number; y: number }) => tr.point(pt);\n\n const absScale = node.getAbsoluteScale();\n const invX = 1 / (Math.abs(absScale.x) || 1);\n const invY = 1 / (Math.abs(absScale.y) || 1);\n const offXLocal = 12 * invX;\n const offYLocal = 12 * invY;\n\n const radii = this._getCornerRadiusArray(node);\n const maxR = Math.min(width, height) / 2 || 1;\n const normalize = (v: { x: number; y: number }) => {\n const len = Math.hypot(v.x, v.y) || 1;\n return { x: v.x / len, y: v.y / len };\n };\n const dirLocal = [\n normalize({ x: width / 2 - offXLocal, y: height / 2 - offYLocal }), // tl -> center\n normalize({ x: -(width / 2 - offXLocal), y: height / 2 - offYLocal }), // tr -> center\n normalize({ x: -(width / 2 - offXLocal), y: -(height / 2 - offYLocal) }), // br -> center\n normalize({ x: width / 2 - offXLocal, y: -(height / 2 - offYLocal) }), // bl -> center\n ] as const;\n\n const p0 = mapAbs({\n x: local.x + offXLocal + dirLocal[0].x * Math.min(maxR, radii[0]),\n y: local.y + offYLocal + dirLocal[0].y * Math.min(maxR, radii[0]),\n });\n const p1 = mapAbs({\n x: local.x + width - offXLocal + dirLocal[1].x * Math.min(maxR, radii[1]),\n y: local.y + offYLocal + dirLocal[1].y * Math.min(maxR, radii[1]),\n });\n const p2 = mapAbs({\n x: local.x + width - offXLocal + dirLocal[2].x * Math.min(maxR, radii[2]),\n y: local.y + height - offYLocal + dirLocal[2].y * Math.min(maxR, radii[2]),\n });\n const p3 = mapAbs({\n x: local.x + offXLocal + dirLocal[3].x * Math.min(maxR, radii[3]),\n y: local.y + height - offYLocal + dirLocal[3].y * Math.min(maxR, radii[3]),\n });\n\n if (this._cornerHandles.tl) this._cornerHandles.tl.absolutePosition(p0);\n if (this._cornerHandles.tr) this._cornerHandles.tr.absolutePosition(p1);\n if (this._cornerHandles.br) this._cornerHandles.br.absolutePosition(p2);\n if (this._cornerHandles.bl) this._cornerHandles.bl.absolutePosition(p3);\n\n const grpParent = this._cornerHandlesGroup.getParent();\n if (grpParent) {\n const pd = grpParent.getAbsoluteTransform().decompose();\n const invPX = 1 / (Math.abs(pd.scaleX) || 1);\n const invPY = 1 / (Math.abs(pd.scaleY) || 1);\n if (this._cornerHandles.tl) this._cornerHandles.tl.scale({ x: invPX, y: invPY });\n if (this._cornerHandles.tr) this._cornerHandles.tr.scale({ x: invPX, y: invPY });\n if (this._cornerHandles.br) this._cornerHandles.br.scale({ x: invPX, y: invPY });\n if (this._cornerHandles.bl) this._cornerHandles.bl.scale({ x: invPX, y: invPY });\n }\n this._cornerHandlesGroup.moveToTop();\n }\n\n private _updateCornerRadiusHandlesVisibility() {\n if (!this._core || !this._selected || !this._cornerHandlesGroup) return;\n\n const world = this._core.nodes.world;\n const currentZoom = world.scaleX();\n const stage = this._core.stage;\n const layer = this._core.nodes.layer;\n const node = this._selected.getNode() as unknown as Konva.Node;\n\n const pointer = stage.getPointerPosition();\n if (!pointer) {\n if (currentZoom < 0.3) {\n this._cornerHandlesGroup.visible(false);\n }\n return;\n }\n\n // Проверяем зум\n if (currentZoom < 0.3) {\n // При малом зуме всегда скрываем\n this._cornerHandlesGroup.visible(false);\n return;\n }\n\n const shapes = layer.getIntersection(pointer);\n if (shapes) {\n const isOverNode = shapes === node || node.isAncestorOf(shapes);\n const isOverHandles = this._cornerHandlesGroup.isAncestorOf(shapes);\n\n if (isOverNode || isOverHandles) {\n this._cornerHandlesGroup.visible(true);\n } else {\n this._cornerHandlesGroup.visible(false);\n }\n } else {\n this._cornerHandlesGroup.visible(false);\n }\n }\n\n private _ensureRadiusLabel(): Konva.Label | null {\n if (!this._core) return null;\n if (this._radiusLabel) return this._radiusLabel;\n const layer = this._core.nodes.layer;\n const label = new Konva.Label({ listening: false, opacity: 0.95 });\n const tag = new Konva.Tag({\n fill: '#2b83ff',\n cornerRadius: 4,\n shadowColor: '#000',\n shadowBlur: 6,\n shadowOpacity: 0.25,\n } as Konva.TagConfig);\n const text = new Konva.Text({\n text: '',\n fontFamily: 'Inter, Calibri, Arial, sans-serif',\n fontSize: 12,\n padding: 4,\n fill: '#ffffff',\n } as Konva.TextConfig);\n label.add(tag);\n label.add(text);\n label.visible(false);\n layer.add(label);\n this._radiusLabel = label;\n return label;\n }\n\n private _updateRadiusLabelAt(absPt: { x: number; y: number }, textStr: string) {\n const lbl = this._ensureRadiusLabel();\n if (!lbl) return;\n const text = lbl.getText();\n text.text(textStr);\n const labelRect = lbl.getClientRect({\n skipTransform: true,\n skipShadow: true,\n skipStroke: true,\n });\n const labelW = labelRect.width;\n const offset = { x: 8, y: 8 };\n lbl.absolutePosition({ x: absPt.x - offset.x, y: absPt.y + offset.y });\n lbl.offsetX(labelW);\n lbl.offsetY(0);\n const parent = lbl.getParent();\n if (parent) {\n const pDec = parent.getAbsoluteTransform().decompose();\n const invScaleX = 1 / (Math.abs(pDec.scaleX) || 1);\n const invScaleY = 1 / (Math.abs(pDec.scaleY) || 1);\n lbl.scale({ x: invScaleX, y: invScaleY });\n }\n lbl.visible(true);\n lbl.moveToTop();\n if (this._transformer) this._transformer.moveToTop();\n }\n\n private _showRadiusLabelForCorner(cornerIndex: 0 | 1 | 2 | 3) {\n if (!this._core || !this._selected) return;\n const nodeRaw = this._selected.getNode() as unknown as Konva.Node;\n if (!this._isCornerRadiusSupported(nodeRaw)) return;\n const node = nodeRaw;\n const radii = this._getCornerRadiusArray(node);\n const r = Math.round(radii[cornerIndex]);\n const handle =\n cornerIndex === 0\n ? this._cornerHandles.tl\n : cornerIndex === 1\n ? this._cornerHandles.tr\n : cornerIndex === 2\n ? this._cornerHandles.br\n : this._cornerHandles.bl;\n if (!handle) return;\n const p = handle.getAbsolutePosition();\n this._updateRadiusLabelAt(p, 'Radius ' + String(r));\n }\n\n private _hideRadiusLabel() {\n if (this._radiusLabel) this._radiusLabel.visible(false);\n }\n\n private _destroyRadiusLabel() {\n if (this._radiusLabel) {\n this._radiusLabel.destroy();\n this._radiusLabel = null;\n }\n }\n\n // ===================== Helpers =====================\n private _findBaseNodeByTarget(target: Konva.Node): BaseNode | null {\n if (!this._core) return null;\n if (this._selected) {\n const selectedKonva = this._selected.getNode() as unknown as Konva.Node;\n if (selectedKonva === target) return this._selected;\n if (typeof selectedKonva.isAncestorOf === 'function' && selectedKonva.isAncestorOf(target)) {\n return this._selected;\n }\n }\n let topMostAncestor: BaseNode | null = null;\n for (const n of this._core.nodes.list()) {\n const node = n.getNode() as unknown as Konva.Node;\n if (typeof node.isAncestorOf === 'function' && node.isAncestorOf(target)) {\n let isTopMost = true;\n for (const other of this._core.nodes.list()) {\n if (other === n) continue;\n const otherNode = other.getNode() as unknown as Konva.Node;\n if (typeof otherNode.isAncestorOf === 'function' && otherNode.isAncestorOf(node)) {\n isTopMost = false;\n break;\n }\n }\n if (isTopMost) {\n topMostAncestor = n;\n }\n }\n }\n if (topMostAncestor) return topMostAncestor;\n\n for (const n of this._core.nodes.list()) {\n if (n.getNode() === target) return n;\n }\n return null;\n }\n\n private _onNodeRemoved = (removed: BaseNode) => {\n if (this._selected && this._selected === removed) {\n this._clearSelection();\n }\n };\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\n\nexport interface GridPluginOptions {\n stepX?: number; // grid step in world coordinates\n stepY?: number;\n color?: string; // grid line color\n lineWidth?: number; // grid line width on screen (px)\n visible?: boolean;\n minScaleToShow?: number | null; // if set and scale is less — grid is hidden\n enableSnap?: boolean; // enable snap to grid on drag/resize\n}\n\n/**\n * GridPlugin — draws a grid and implements snap to grid on drag/resize.\n * Architecture is identical to other plugins: onAttach/onDetach, own layer with Konva.Shape.\n *\n * Important points of the current architecture:\n * - Panning/scale is performed by Stage transformations.\n * - Nodes are placed on the NodeManager layer (core.nodes.layer), also Transformers are added to it.\n */\nexport class GridPlugin extends Plugin {\n private _core?: CoreEngine;\n private _layer: Konva.Layer | null = null;\n private _shape: Konva.Shape | null = null;\n\n private _stepX: number;\n private _stepY: number;\n private _color: string;\n private _lineWidth: number;\n private _visible: boolean;\n private _minScaleToShow: number | null;\n private _enableSnap: boolean;\n\n // handlers\n private _dragMoveHandler: ((e: Konva.KonvaEventObject<MouseEvent>) => void) | null = null;\n private _nodesAddHandler: ((e: Konva.KonvaEventObject<Event>) => void) | null = null;\n private _nodesRemoveHandler: ((e: Konva.KonvaEventObject<Event>) => void) | null = null;\n\n // Cache for optimization\n private _redrawScheduled = false;\n private _transformersCache: Konva.Node[] = [];\n private _cacheInvalidated = true;\n\n constructor(options: GridPluginOptions = {}) {\n super();\n this._stepX = Math.max(1, options.stepX ?? 1);\n this._stepY = Math.max(1, options.stepY ?? 1);\n this._color = options.color ?? '#2b313a';\n this._lineWidth = options.lineWidth ?? 1;\n this._visible = options.visible ?? true;\n this._minScaleToShow = options.minScaleToShow ?? 8;\n this._enableSnap = options.enableSnap ?? true;\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n // Draw grid in the same layer as content (nodes.layer), but outside the world group,\n // so it doesn't transform with the camera and can overlap nodes.\n const layer = core.nodes.layer;\n\n // Shape with custom sceneFunc\n const sceneFunc = (ctx: Konva.Context, _shape: Konva.Shape) => {\n if (!this._visible) return;\n if (!this._core) return;\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n // Only appears when minScaleToShow is reached (if set)\n if (this._minScaleToShow != null && scale < this._minScaleToShow) return;\n\n const stageW = stage.width();\n const stageH = stage.height();\n // GridLayer doesn't transform, world transforms through world\n const scaleX = world.scaleX();\n const scaleY = world.scaleY();\n const stepXPx = Math.max(1, this._stepX) * Math.max(1e-6, scaleX);\n const stepYPx = Math.max(1, this._stepY) * Math.max(1e-6, scaleY);\n // Смещение в экране считается от позиции world, как в «рабочем» проекте\n const offX = ((world.x() % stepXPx) + stepXPx) % stepXPx;\n const offY = ((world.y() % stepYPx) + stepYPx) % stepYPx;\n\n ctx.beginPath();\n ctx.lineWidth = this._lineWidth;\n ctx.strokeStyle = this._color;\n // Without rounding/0.5px, to avoid drift accumulation during scaling\n for (let x = offX; x <= stageW; x += stepXPx) {\n ctx.moveTo(x, 0);\n ctx.lineTo(x, stageH);\n }\n for (let y = offY; y <= stageH; y += stepYPx) {\n ctx.moveTo(0, y);\n ctx.lineTo(stageW, y);\n }\n ctx.stroke();\n };\n\n const shape = new Konva.Shape({ listening: false, sceneFunc });\n layer.add(shape);\n // Grid should be above nodes, but below Transformers — order will be set below\n\n this._layer = layer;\n this._shape = shape;\n\n // Subscriptions to scene and world transformations/size changes — grid redraw\n // Optimization: use throttling\n const stage = core.stage;\n const world = core.nodes.world;\n stage.on('resize.grid', () => {\n this._scheduleRedraw();\n });\n world.on('xChange.grid yChange.grid scaleXChange.grid scaleYChange.grid', () => {\n this._scheduleRedraw();\n });\n\n // Function: raise all Transformers above grid-shape\n const bringTransformersToTop = () => {\n // Optimization: cache transformers\n if (this._cacheInvalidated) {\n this._transformersCache = layer.find('Transformer');\n this._cacheInvalidated = false;\n }\n for (const n of this._transformersCache) n.moveToTop();\n // Then move the grid directly below them\n this._shape?.moveToTop();\n for (const n of this._transformersCache) n.moveToTop();\n };\n bringTransformersToTop();\n\n // Snap: dragging\n this._dragMoveHandler = (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core || !this._enableSnap) return;\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n const target = e.target as Konva.Node;\n // Skip stage and layers\n if (target === (stage as unknown as Konva.Node) || target instanceof Konva.Layer) return;\n // Check if target is inside nodes layer\n const nodesLayer = this._core.nodes.layer;\n let p: Konva.Node | null = target;\n let inNodesLayer = false;\n while (p) {\n if (p === (nodesLayer as unknown as Konva.Node)) {\n inNodesLayer = true;\n break;\n }\n p = p.getParent();\n }\n if (!inNodesLayer) return;\n // Only for draggable\n const anyNode = target as unknown as { draggable?: () => boolean };\n if (typeof anyNode.draggable === 'function' && !anyNode.draggable()) return;\n\n const abs = target.getAbsolutePosition();\n const sx = world.scaleX() || 1;\n const sy = world.scaleY() || 1;\n const pixelMode = this._minScaleToShow != null ? sx >= this._minScaleToShow : false;\n\n if (pixelMode) {\n // Snap to world grid cells (multiple of stepX/stepY in world coordinates)\n const wx = (abs.x - world.x()) / sx;\n const wy = (abs.y - world.y()) / sy;\n const stepX = Math.max(1, this._stepX);\n const stepY = Math.max(1, this._stepY);\n const snappedWX = Math.round(wx / stepX) * stepX;\n const snappedWY = Math.round(wy / stepY) * stepY;\n const snappedAbsX = snappedWX * sx + world.x();\n const snappedAbsY = snappedWY * sy + world.y();\n if (Math.abs(snappedAbsX - abs.x) > 0.001 || Math.abs(snappedAbsY - abs.y) > 0.001) {\n target.absolutePosition({ x: snappedAbsX, y: snappedAbsY });\n }\n } else {\n // World snap: multiple of stepX/stepY in world coordinates, independent of scale\n const wx = (abs.x - world.x()) / sx;\n const wy = (abs.y - world.y()) / sy;\n const stepX = Math.max(1, this._stepX);\n const stepY = Math.max(1, this._stepY);\n const snappedWX = Math.round(wx / stepX) * stepX;\n const snappedWY = Math.round(wy / stepY) * stepY;\n const snappedAbsX = snappedWX * sx + world.x();\n const snappedAbsY = snappedWY * sy + world.y();\n if (Math.abs(snappedAbsX - abs.x) > 0.001 || Math.abs(snappedAbsY - abs.y) > 0.001) {\n target.absolutePosition({ x: snappedAbsX, y: snappedAbsY });\n }\n }\n };\n stage.on('dragmove.grid', this._dragMoveHandler);\n\n // Snap: resize through Transformer.boundBoxFunc\n const attachTransformerSnap = (n: Konva.Node) => {\n const anyN = n as unknown as {\n getClassName?: () => string;\n nodes?: () => Konva.Node[];\n boundBoxFunc?: (fn?: (oldBox: unknown, newBox: unknown) => unknown) => void;\n getActiveAnchor?: () => string | undefined;\n };\n const cls = typeof anyN.getClassName === 'function' ? anyN.getClassName() : '';\n if (cls !== 'Transformer') return;\n const tr = n as Konva.Transformer;\n const snapFn = (\n _oldBox: { x: number; y: number; width: number; height: number; rotation: number },\n newBox: { x: number; y: number; width: number; height: number; rotation: number },\n ): { x: number; y: number; width: number; height: number; rotation: number } => {\n const base = newBox;\n if (!this._enableSnap || !this._core) return base;\n const nodes = typeof anyN.nodes === 'function' ? anyN.nodes() : [];\n const target = nodes[0];\n if (!target) return base;\n // Always pixel snap of the bounds in screen pixels. The rotater anchor is not touched.\n const anchor = typeof anyN.getActiveAnchor === 'function' ? anyN.getActiveAnchor() : '';\n if (anchor === 'rotater') return base;\n\n // Snap edges to world grid: in what units does base come? In the parent coordinates of the node,\n // which are related to \"world\" (nodes in world). Therefore we quantize by stepX/stepY directly.\n const stepX = Math.max(1, this._stepX);\n const stepY = Math.max(1, this._stepY);\n const a = typeof anchor === 'string' ? anchor : '';\n\n // For non-rotated — exact snap of edges in world coordinates.\n const worldAbs = this._core.nodes.world.getAbsoluteTransform();\n const invWorldAbs = worldAbs.copy();\n invWorldAbs.invert();\n\n // Box boundBoxFunc (base/newBox) — in ABSOLUTE coordinates\n const leftA = base.x;\n const rightA = base.x + base.width;\n const topA = base.y;\n const bottomA = base.y + base.height;\n\n // Translation to WORLD: abs -> world\n const Lw = invWorldAbs.point({ x: leftA, y: topA }).x;\n const Rw = invWorldAbs.point({ x: rightA, y: topA }).x;\n const Tw = invWorldAbs.point({ x: leftA, y: topA }).y;\n const Bw = invWorldAbs.point({ x: leftA, y: bottomA }).y;\n\n let newLw = Lw;\n let newRw = Rw;\n let newTw = Tw;\n let newBw = Bw;\n\n // Snap only moving edges to the nearest lines of the world grid (eps for stability)\n const q = (v: number, s: number) => Math.round((v + 1e-9) / s) * s;\n if (a.includes('left')) newLw = q(Lw, stepX);\n if (a.includes('right')) newRw = q(Rw, stepX);\n if (a.includes('top')) newTw = q(Tw, stepY);\n if (a.includes('bottom')) newBw = q(Bw, stepY);\n\n // Minimal sizes in WORLD\n if (newRw - newLw < stepX) {\n if (a.includes('left')) newLw = newRw - stepX;\n else newRw = newLw + stepX;\n }\n if (newBw - newTw < stepY) {\n if (a.includes('top')) newTw = newBw - stepY;\n else newBw = newTw + stepY;\n }\n\n // Back to ABSOLUTE coordinates: world -> abs\n const leftAbs = worldAbs.point({ x: newLw, y: newTw }).x;\n const topAbs = worldAbs.point({ x: newLw, y: newTw }).y;\n const rightAbs = worldAbs.point({ x: newRw, y: newTw }).x;\n const bottomAbs = worldAbs.point({ x: newLw, y: newBw }).y;\n\n // Assembly of the final box directly from ABS coordinates, obtained from snapped world edges\n const round3 = (v: number) => Math.round(v * 1000) / 1000;\n const result = {\n x: round3(leftAbs),\n y: round3(topAbs),\n width: round3(rightAbs - leftAbs),\n height: round3(bottomAbs - topAbs),\n rotation: base.rotation,\n };\n return result;\n };\n // Setup boundBoxFunc through queueMicrotask, so that SelectionPlugin can set its boundBoxFunc first\n globalThis.queueMicrotask(() => {\n tr.boundBoxFunc(snapFn);\n });\n };\n\n const walkAttach = (n: Konva.Node) => {\n attachTransformerSnap(n);\n const anyN = n as unknown as { getChildren?: () => Konva.Node[] };\n const children = typeof anyN.getChildren === 'function' ? anyN.getChildren() : [];\n for (const c of children) walkAttach(c);\n };\n\n // Walk through the current tree of nodes layer\n walkAttach(core.nodes.layer as unknown as Konva.Node);\n\n // Handle dynamic addition/deletion\n this._nodesAddHandler = (e: Konva.KonvaEventObject<Event>) => {\n const added = (e as unknown as { child?: Konva.Node }).child ?? (e.target as Konva.Node);\n walkAttach(added);\n // If added Transformer — raise it above the grid\n const anyAdded = added as unknown as { getClassName?: () => string };\n const cls = typeof anyAdded.getClassName === 'function' ? anyAdded.getClassName() : '';\n if (cls === 'Transformer') {\n this._cacheInvalidated = true; // invalidate cache\n added.moveToTop();\n // restore grid immediately below Transformers\n this._shape?.moveToTop();\n // and raise all Transformers again\n // Optimization: update cache and use it\n this._transformersCache = layer.find('Transformer');\n this._cacheInvalidated = false;\n for (const n of this._transformersCache) n.moveToTop();\n }\n };\n this._nodesRemoveHandler = (e: Konva.KonvaEventObject<Event>) => {\n const removed = (e as unknown as { child?: Konva.Node }).child ?? (e.target as Konva.Node);\n const walkDetach = (n: Konva.Node) => {\n const anyN = n as unknown as {\n getClassName?: () => string;\n boundBoxFunc?: (fn?: (oldBox: unknown, newBox: unknown) => unknown) => void;\n getChildren?: () => Konva.Node[];\n };\n const cls = typeof anyN.getClassName === 'function' ? anyN.getClassName() : '';\n if (cls === 'Transformer') {\n (\n n as unknown as {\n boundBoxFunc?: (fn?: (oldBox: unknown, newBox: unknown) => unknown) => void;\n }\n ).boundBoxFunc?.(undefined);\n }\n const children = typeof anyN.getChildren === 'function' ? anyN.getChildren() : [];\n for (const c of children) walkDetach(c);\n };\n walkDetach(removed);\n // Check if removed was a Transformer\n const anyRemoved = removed as unknown as { getClassName?: () => string };\n const cls = typeof anyRemoved.getClassName === 'function' ? anyRemoved.getClassName() : '';\n if (cls === 'Transformer') {\n this._cacheInvalidated = true; // invalidate cache\n }\n // Restore order: grid immediately below Transformers, transformers above\n this._shape?.moveToTop();\n // Optimization: update cache and use it\n if (this._cacheInvalidated) {\n this._transformersCache = layer.find('Transformer');\n this._cacheInvalidated = false;\n }\n for (const n of this._transformersCache) n.moveToTop();\n };\n core.nodes.layer.on('add.grid', this._nodesAddHandler);\n core.nodes.layer.on('remove.grid', this._nodesRemoveHandler);\n\n // Pixel snap of the radius of rounded rectangles\n core.nodes.layer.on('cornerRadiusChange.grid', (e: Konva.KonvaEventObject<Event>) => {\n const node = e.target as unknown as {\n getClassName?: () => string;\n cornerRadius?: () => number | number[];\n cornerRadiusSetter?: (v: number | number[]) => void;\n } & Konva.Rect;\n const cls = typeof node.getClassName === 'function' ? node.getClassName() : '';\n if (cls !== 'Rect') return;\n const getCR = (node as { cornerRadius: () => number | number[] }).cornerRadius;\n if (typeof getCR !== 'function') return;\n const value = getCR.call(node);\n const apply = (rounded: number | number[]) => {\n // Konva API setter — the same function cornerRadius(value)\n (node as { cornerRadius: (v: number | number[]) => void }).cornerRadius(rounded);\n };\n const stage = this._core?.stage;\n const scale = stage?.scaleX() ?? 1;\n const pixelMode = this._minScaleToShow != null ? scale >= this._minScaleToShow : false;\n if (Array.isArray(value)) {\n const rounded = value.map((v) => {\n if (pixelMode) {\n const scaleX = stage?.scaleX() ?? 1;\n const scaleY = stage?.scaleY() ?? 1;\n const rPx = v * (0.5 * (scaleX + scaleY));\n const snappedPx = Math.max(0, Math.round(rPx));\n return snappedPx / Math.max(1e-6, 0.5 * (scaleX + scaleY));\n } else {\n return Math.max(0, Math.round(v));\n }\n });\n apply(rounded);\n } else if (typeof value === 'number') {\n if (pixelMode) {\n const scaleX = stage?.scaleX() ?? 1;\n const scaleY = stage?.scaleY() ?? 1;\n const rPx = value * (0.5 * (scaleX + scaleY));\n const snappedPx = Math.max(0, Math.round(rPx));\n apply(snappedPx / Math.max(1e-6, 0.5 * (scaleX + scaleY)));\n } else {\n apply(Math.max(0, Math.round(value)));\n }\n }\n });\n }\n\n /**\n * Deferred redraw (throttling)\n */\n private _scheduleRedraw() {\n if (this._redrawScheduled) return;\n\n this._redrawScheduled = true;\n const raf = globalThis.requestAnimationFrame;\n raf(() => {\n this._redrawScheduled = false;\n this._layer?.batchDraw();\n });\n }\n\n protected onDetach(core: CoreEngine): void {\n const stage = core.stage;\n stage.off('.grid');\n core.nodes.layer.off('.grid');\n\n if (this._shape) this._shape.destroy();\n // Layer nodes belong to the engine — do not delete\n\n this._shape = null;\n this._layer = null;\n this._dragMoveHandler = null;\n this._nodesAddHandler = null;\n this._nodesRemoveHandler = null;\n\n core.stage.batchDraw();\n }\n\n public setVisible(visible: boolean): void {\n this._visible = visible;\n if (this._core) this._core.stage.batchDraw();\n }\n // Getters for synchronization with the ruler\n public get stepX(): number {\n return this._stepX;\n }\n public get stepY(): number {\n return this._stepY;\n }\n public get minScaleToShow(): number | null {\n return this._minScaleToShow;\n }\n public setStep(stepX: number, stepY: number): void {\n this._stepX = Math.max(1, stepX);\n this._stepY = Math.max(1, stepY);\n if (this._core) this._core.stage.batchDraw();\n }\n public setMinScaleToShow(value: number | null): void {\n this._minScaleToShow = value;\n if (this._core) this._core.stage.batchDraw();\n }\n public setSnap(enabled: boolean): void {\n this._enableSnap = enabled;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\n\nexport interface RulerPluginOptions {\n thicknessPx?: number; // Ruler thickness in pixels\n fontFamily?: string;\n fontSizePx?: number;\n color?: string; // Ruler text and ticks color\n bgColor?: string; // Ruler background color\n borderColor?: string; // Ruler border color\n enabled?: boolean; // Is ruler enabled by default\n}\n\nexport class RulerPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<RulerPluginOptions>;\n private _layer: Konva.Layer | null = null;\n\n private _hGroup?: Konva.Group;\n private _vGroup?: Konva.Group;\n\n private _hBg?: Konva.Rect;\n private _vBg?: Konva.Rect;\n\n private _hTicksShape?: Konva.Shape;\n private _vTicksShape?: Konva.Shape;\n\n private _hBorder?: Konva.Line;\n private _vBorder?: Konva.Line;\n\n private _redrawScheduled = false;\n private _lastRedrawTime = 0;\n private _redrawThrottleMs = 16; // ~60 FPS\n private _panThrottleMs = 32; // ~30 FPS for panning (more aggressive throttling)\n\n // Cache for optimization\n private _cachedActiveGuide: { type: 'h' | 'v'; coord: number } | null = null;\n private _cacheInvalidated = true;\n\n // Cache for step calculations (by scale)\n private _stepsCache = new Map<\n number,\n {\n step: number;\n stepPx: number;\n majorStep: number;\n mediumStep: number;\n labelStep: number;\n drawStep: number;\n // Precomputed constants for loop\n drawStepEpsilon: number;\n majorTickLength: number;\n mediumTickLength: number;\n minorTickLength: number;\n fontString: string;\n }\n >();\n\n constructor(options: RulerPluginOptions = {}) {\n super();\n const {\n thicknessPx = 30,\n fontFamily = 'Inter, Calibri, Arial, sans-serif',\n fontSizePx = 10,\n color = '#8c8c8c',\n bgColor = '#2c2c2c',\n borderColor = '#1f1f1f',\n enabled = true,\n } = options;\n this._options = {\n thicknessPx,\n fontFamily,\n fontSizePx,\n color,\n bgColor,\n borderColor,\n enabled,\n };\n }\n\n /**\n * Calculate optimal step for ruler ticks\n * Uses nice numbers: 1, 2, 5, 10, 20, 50, 100 and so on\n */\n private _calculateNiceStep(minWorldStep: number): number {\n if (!isFinite(minWorldStep) || minWorldStep <= 0) return 1;\n\n const magnitude = Math.pow(10, Math.floor(Math.log10(minWorldStep)));\n const normalized = minWorldStep / magnitude;\n\n let nice: number;\n if (normalized <= 1) nice = 1;\n else if (normalized <= 2) nice = 2;\n else if (normalized <= 5) nice = 5;\n else nice = 10;\n\n return nice * magnitude;\n }\n\n /**\n * Format number for display on ruler\n * Always returns an integer without decimal places\n */\n private _formatNumber(value: number): string {\n return Math.round(value).toString();\n }\n\n /**\n * Calculate and cache parameters for ticks for current scale\n */\n private _getStepsConfig(scale: number) {\n // Check cache\n const cached = this._stepsCache.get(scale);\n if (cached) return cached;\n\n const tPx = this._options.thicknessPx;\n const minStepPx = 50;\n const minWorldStep = minStepPx / scale;\n let step = this._calculateNiceStep(minWorldStep);\n\n // IMPORTANT: round to integer\n if (step < 1) step = 1;\n\n const stepPx = step * scale;\n\n // Adaptive system of levels for ticks and labels\n let majorStep: number;\n let mediumStep: number;\n let labelStep: number;\n let drawStep: number;\n\n if (stepPx >= 60) {\n majorStep = step * 10;\n mediumStep = step * 5;\n labelStep = step;\n drawStep = step;\n } else if (stepPx >= 40) {\n majorStep = step * 10;\n mediumStep = step * 5;\n labelStep = step * 5;\n drawStep = step;\n } else {\n majorStep = step * 10;\n mediumStep = step * 5;\n labelStep = step * 10;\n drawStep = step;\n }\n\n // Precompute constants for cycle\n const config = {\n step,\n stepPx,\n majorStep,\n mediumStep,\n labelStep,\n drawStep,\n drawStepEpsilon: drawStep * 0.01,\n majorTickLength: tPx * 0.6,\n mediumTickLength: tPx * 0.4,\n minorTickLength: tPx * 0.25,\n fontString: `${String(this._options.fontSizePx)}px ${this._options.fontFamily}`,\n };\n\n // Limit cache size (keep last 10 scales)\n if (this._stepsCache.size > 10) {\n const firstKey = this._stepsCache.keys().next().value;\n if (firstKey !== undefined) this._stepsCache.delete(firstKey);\n }\n\n this._stepsCache.set(scale, config);\n return config;\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n // Create layer for ruler and RulerHighlightPlugin\n this._layer = new Konva.Layer({\n name: 'ruler-layer',\n listening: true,\n });\n\n if (this._options.enabled) {\n core.stage.add(this._layer);\n }\n\n // Groups for horizontal and vertical ruler\n // listening: true to allow events from backgrounds to bubble to RulerGuidesPlugin\n this._hGroup = new Konva.Group({ listening: true });\n this._vGroup = new Konva.Group({ listening: true });\n this._layer.add(this._hGroup);\n this._layer.add(this._vGroup);\n\n // Ruler backgrounds (can listen to events from other plugins, e.g. RulerGuidesPlugin)\n this._hBg = new Konva.Rect({\n fill: this._options.bgColor,\n listening: true,\n name: 'ruler-h-bg',\n });\n this._vBg = new Konva.Rect({\n fill: this._options.bgColor,\n listening: true,\n name: 'ruler-v-bg',\n });\n this._hGroup.add(this._hBg);\n this._vGroup.add(this._vBg);\n\n // Ruler borders (dividers between ruler and working area)\n this._hBorder = new Konva.Line({\n stroke: this._options.borderColor,\n strokeWidth: 1,\n listening: false,\n });\n this._vBorder = new Konva.Line({\n stroke: this._options.borderColor,\n strokeWidth: 1,\n listening: false,\n });\n this._hGroup.add(this._hBorder);\n this._vGroup.add(this._vBorder);\n\n // Shape for horizontal ruler (ticks + labels)\n this._hTicksShape = new Konva.Shape({\n listening: false,\n sceneFunc: (ctx) => {\n // Get active guide once for both rulers\n const activeGuide = this._getActiveGuideInfo();\n this._drawHorizontalRuler(ctx, activeGuide);\n },\n });\n this._hGroup.add(this._hTicksShape);\n\n // Shape for vertical ruler (ticks + labels)\n this._vTicksShape = new Konva.Shape({\n listening: false,\n sceneFunc: (ctx) => {\n // Get active guide once for both rulers\n const activeGuide = this._getActiveGuideInfo();\n this._drawVerticalRuler(ctx, activeGuide);\n },\n });\n this._vGroup.add(this._vTicksShape);\n\n // Subscribe to camera and stage size changes\n const stage = core.stage;\n const world = core.nodes.world;\n\n stage.on('resize.ruler', () => {\n this._scheduleRedraw();\n });\n\n // Split panning and zooming events for different throttling\n world.on('xChange.ruler yChange.ruler', () => {\n this._invalidateGuideCache();\n this._scheduleRedraw(true); // true = panning (more aggressive throttling)\n });\n\n world.on('scaleXChange.ruler scaleYChange.ruler', () => {\n this._invalidateGuideCache();\n this._scheduleRedraw(false); // false = zoom (normal throttling)\n });\n\n // Subscribe to changes in guides for cache invalidation\n stage.on('guidesChanged.ruler', () => {\n this._invalidateGuideCache();\n this._scheduleRedraw();\n });\n\n // Initial draw\n this._redraw();\n core.stage.batchDraw();\n }\n\n protected onDetach(core: CoreEngine): void {\n // Unsubscribe from all events\n core.stage.off('.ruler');\n core.nodes.world.off('.ruler');\n\n // Remove layer\n if (this._layer) {\n this._layer.destroy();\n this._layer = null;\n }\n }\n\n /**\n * Get active guide from RulerGuidesPlugin (with caching)\n */\n private _getActiveGuideInfo(): { type: 'h' | 'v'; coord: number } | null {\n if (!this._core) return null;\n\n // Use cache if it is not invalidated\n if (!this._cacheInvalidated) {\n return this._cachedActiveGuide;\n }\n\n // Find RulerGuidesPlugin through stage\n const guidesLayer = this._core.stage.findOne('.guides-layer');\n if (!guidesLayer) {\n this._cachedActiveGuide = null;\n this._cacheInvalidated = false;\n return null;\n }\n\n // Get active guide\n const guides = (guidesLayer as unknown as Konva.Layer).find('Line');\n for (const guide of guides) {\n const line = guide as Konva.Line & { worldCoord: number };\n if (line.strokeWidth() === 2) {\n // Active line has strokeWidth = 2\n const worldCoord = line.worldCoord;\n const type = line.name() === 'guide-h' ? 'h' : 'v';\n this._cachedActiveGuide = { type, coord: worldCoord };\n this._cacheInvalidated = false;\n return this._cachedActiveGuide;\n }\n }\n\n this._cachedActiveGuide = null;\n this._cacheInvalidated = false;\n return null;\n }\n\n /**\n * Invalidate active guide cache\n */\n private _invalidateGuideCache() {\n this._cacheInvalidated = true;\n }\n\n /**\n * Universal ruler drawing (horizontal or vertical)\n * @param ctx - canvas context\n * @param axis - ruler axis ('h' for horizontal, 'v' for vertical)\n * @param activeGuide - cached active guide info\n */\n private _drawRuler(\n ctx: Konva.Context,\n axis: 'h' | 'v',\n activeGuide: { type: 'h' | 'v'; coord: number } | null,\n ) {\n if (!this._core) return;\n\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n const scale = world.scaleX() || 1e-9;\n const tPx = this._options.thicknessPx;\n\n const isHorizontal = axis === 'h';\n const stageSize = isHorizontal ? stage.width() : stage.height();\n const worldOffset = isHorizontal ? world.x() : world.y();\n\n // Horizontal ruler highlights vertical guide and vice versa\n const highlightCoord =\n activeGuide?.type === (isHorizontal ? 'v' : 'h') ? activeGuide.coord : null;\n\n // Get cached step configuration\n const config = this._getStepsConfig(scale);\n const {\n majorStep,\n mediumStep,\n labelStep,\n drawStep,\n drawStepEpsilon,\n majorTickLength,\n mediumTickLength,\n minorTickLength,\n fontString,\n } = config;\n\n ctx.save();\n\n // Calculate first visible tick\n const worldStart = -worldOffset / scale;\n const firstTick = Math.floor(worldStart / drawStep) * drawStep;\n\n // Collect ticks by type for batching\n const majorTicks: number[] = [];\n const mediumTicks: number[] = [];\n const minorTicks: number[] = [];\n const labels: { pos: number; text: string }[] = [];\n let highlightedTick: number | null = null;\n\n // First pass: classify ticks\n for (let worldPos = firstTick; ; worldPos += drawStep) {\n const screenPos = worldOffset + worldPos * scale;\n\n if (screenPos > stageSize) break;\n if (screenPos < 0) continue;\n\n // Check if this coordinate is an active guide\n const isHighlighted =\n highlightCoord !== null && Math.abs(worldPos - highlightCoord) < drawStepEpsilon;\n\n if (isHighlighted) {\n highlightedTick = screenPos;\n labels.push({ pos: screenPos, text: this._formatNumber(worldPos) });\n continue;\n }\n\n // Determine tick type\n const isMajor = Math.abs(worldPos % majorStep) < drawStepEpsilon;\n const isMedium = !isMajor && Math.abs(worldPos % mediumStep) < drawStepEpsilon;\n\n if (isMajor) {\n majorTicks.push(screenPos);\n } else if (isMedium) {\n mediumTicks.push(screenPos);\n } else {\n minorTicks.push(screenPos);\n }\n\n // Label\n const shouldShowLabel = Math.abs(worldPos % labelStep) < drawStepEpsilon;\n if (shouldShowLabel) {\n labels.push({ pos: screenPos, text: this._formatNumber(worldPos) });\n }\n }\n\n // Second pass: batch tick drawing\n // Draw minor ticks\n if (minorTicks.length > 0) {\n ctx.strokeStyle = this._options.color;\n ctx.globalAlpha = 0.4;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const pos of minorTicks) {\n if (isHorizontal) {\n ctx.moveTo(pos, tPx);\n ctx.lineTo(pos, tPx - minorTickLength);\n } else {\n ctx.moveTo(tPx, pos);\n ctx.lineTo(tPx - minorTickLength, pos);\n }\n }\n ctx.stroke();\n }\n\n // Draw medium ticks\n if (mediumTicks.length > 0) {\n ctx.strokeStyle = this._options.color;\n ctx.globalAlpha = 0.6;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const pos of mediumTicks) {\n if (isHorizontal) {\n ctx.moveTo(pos, tPx);\n ctx.lineTo(pos, tPx - mediumTickLength);\n } else {\n ctx.moveTo(tPx, pos);\n ctx.lineTo(tPx - mediumTickLength, pos);\n }\n }\n ctx.stroke();\n }\n\n // Draw major ticks\n if (majorTicks.length > 0) {\n ctx.strokeStyle = this._options.color;\n ctx.globalAlpha = 0.9;\n ctx.lineWidth = 1;\n ctx.beginPath();\n for (const pos of majorTicks) {\n if (isHorizontal) {\n ctx.moveTo(pos, tPx);\n ctx.lineTo(pos, tPx - majorTickLength);\n } else {\n ctx.moveTo(tPx, pos);\n ctx.lineTo(tPx - majorTickLength, pos);\n }\n }\n ctx.stroke();\n }\n\n // Draw highlighted tick\n if (highlightedTick !== null) {\n ctx.strokeStyle = '#ff8c00';\n ctx.globalAlpha = 1;\n ctx.lineWidth = 2;\n ctx.beginPath();\n if (isHorizontal) {\n ctx.moveTo(highlightedTick, tPx);\n ctx.lineTo(highlightedTick, tPx - majorTickLength);\n } else {\n ctx.moveTo(tPx, highlightedTick);\n ctx.lineTo(tPx - majorTickLength, highlightedTick);\n }\n ctx.stroke();\n }\n\n // Draw labels\n if (labels.length > 0) {\n ctx.font = fontString;\n ctx.textBaseline = 'top';\n ctx.textAlign = 'left';\n\n for (const label of labels) {\n const isHighlighted = label.pos === highlightedTick;\n ctx.globalAlpha = isHighlighted ? 1 : 0.9;\n ctx.fillStyle = isHighlighted ? '#ff8c00' : this._options.color;\n\n if (isHorizontal) {\n ctx.fillText(label.text, label.pos + 4, 4);\n } else {\n // Rotate text for vertical ruler\n const x = 4;\n const y = label.pos + 4;\n ctx.setTransform(0, -1, 1, 0, x, y);\n ctx.fillText(label.text, 0, 0);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n }\n }\n\n // Additionally draw highlighted coordinate, even if it doesn't fall on regular grid\n if (highlightCoord !== null) {\n const screenPos = worldOffset + highlightCoord * scale;\n if (screenPos >= 0 && screenPos <= stageSize) {\n const alreadyDrawn = Math.abs(highlightCoord % drawStep) < drawStepEpsilon;\n\n if (!alreadyDrawn) {\n // Draw tick\n ctx.strokeStyle = '#ff8c00';\n ctx.globalAlpha = 1;\n ctx.lineWidth = 2;\n ctx.beginPath();\n if (isHorizontal) {\n ctx.moveTo(screenPos, tPx);\n ctx.lineTo(screenPos, tPx - majorTickLength);\n } else {\n ctx.moveTo(tPx, screenPos);\n ctx.lineTo(tPx - majorTickLength, screenPos);\n }\n ctx.stroke();\n\n // Draw label\n ctx.fillStyle = '#ff8c00';\n ctx.font = fontString;\n ctx.textBaseline = 'top';\n ctx.textAlign = 'left';\n\n if (isHorizontal) {\n ctx.fillText(this._formatNumber(highlightCoord), screenPos + 4, 4);\n } else {\n const x = 4;\n const y = screenPos + 4;\n ctx.setTransform(0, -1, 1, 0, x, y);\n ctx.fillText(this._formatNumber(highlightCoord), 0, 0);\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n }\n }\n }\n }\n\n ctx.restore();\n }\n\n /**\n * Draw horizontal ruler\n * @param activeGuide - cached active guide info\n */\n private _drawHorizontalRuler(\n ctx: Konva.Context,\n activeGuide: { type: 'h' | 'v'; coord: number } | null,\n ) {\n this._drawRuler(ctx, 'h', activeGuide);\n }\n\n /**\n * Draw vertical ruler\n * @param activeGuide - cached active guide info\n */\n private _drawVerticalRuler(\n ctx: Konva.Context,\n activeGuide: { type: 'h' | 'v'; coord: number } | null,\n ) {\n this._drawRuler(ctx, 'v', activeGuide);\n }\n\n /**\n * Full ruler redraw\n */\n private _redraw() {\n if (!this._core || !this._layer) return;\n\n const stage = this._core.stage;\n const stageW = stage.width();\n const stageH = stage.height();\n const tPx = this._options.thicknessPx;\n\n // Update background sizes\n if (this._hBg) {\n this._hBg.size({ width: stageW, height: tPx });\n }\n if (this._vBg) {\n this._vBg.size({ width: tPx, height: stageH });\n }\n\n // Update borders\n if (this._hBorder) {\n this._hBorder.points([0, tPx, stageW, tPx]);\n }\n if (this._vBorder) {\n this._vBorder.points([tPx, 0, tPx, stageH]);\n }\n\n // Redraw rulers\n this._layer.batchDraw();\n }\n\n /**\n * Deferred redraw with improved throttling\n * Groups fast zoom/pan events for optimization\n * @param isPanning - true for panning (more aggressive throttling)\n */\n private _scheduleRedraw(isPanning = false) {\n if (!this._core || !this._layer) return;\n\n const now = globalThis.performance.now();\n const timeSinceLastRedraw = now - this._lastRedrawTime;\n\n // If redraw is already scheduled, skip\n if (this._redrawScheduled) return;\n\n this._redrawScheduled = true;\n\n // Choose throttle period based on event type\n const throttleMs = isPanning ? this._panThrottleMs : this._redrawThrottleMs;\n\n // If enough time has passed since last redraw, draw immediately\n if (timeSinceLastRedraw >= throttleMs) {\n globalThis.requestAnimationFrame(() => {\n this._redrawScheduled = false;\n this._lastRedrawTime = globalThis.performance.now();\n this._redraw();\n });\n } else {\n // Otherwise defer until throttle period expires\n const delay = throttleMs - timeSinceLastRedraw;\n globalThis.setTimeout(() => {\n globalThis.requestAnimationFrame(() => {\n this._redrawScheduled = false;\n this._lastRedrawTime = globalThis.performance.now();\n this._redraw();\n });\n }, delay);\n }\n }\n\n public show() {\n if (this._core && this._layer) {\n this._core.stage.add(this._layer);\n this._layer.moveToTop();\n this._redraw();\n this._core.stage.batchDraw();\n }\n }\n\n public hide() {\n if (this._layer?.getStage()) {\n this._layer.remove();\n this._core?.stage.batchDraw();\n }\n }\n\n /**\n * Toggle ruler visibility\n */\n public toggle() {\n if (this._layer?.getStage()) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Check if ruler is visible\n */\n public isVisible(): boolean {\n return !!this._layer?.getStage();\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\n\n// Extended type for Line with worldCoord\ninterface GuideLineWithCoord extends Konva.Line {\n worldCoord: number;\n}\n\nexport interface RulerGuidesPluginOptions {\n guideColor?: string; // color of guides\n activeColor?: string; // color of active guide\n rulerThicknessPx?: number; // thickness of ruler (should match RulerPlugin)\n snapToGrid?: boolean; // snap to grid\n gridStep?: number; // grid step for snapping\n}\n\nexport class RulerGuidesPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<RulerGuidesPluginOptions>;\n private _guidesLayer: Konva.Layer | null = null;\n private _guides: GuideLineWithCoord[] = [];\n private _activeGuide: GuideLineWithCoord | null = null;\n private _draggingGuide: { type: 'h' | 'v'; line: GuideLineWithCoord } | null = null;\n\n // Cache for optimization\n private _rulerLayerCache: Konva.Layer | null = null;\n private _updateScheduled = false;\n private _dragMoveScheduled = false;\n private _batchDrawScheduled = false;\n\n constructor(options: RulerGuidesPluginOptions = {}) {\n super();\n const {\n guideColor = '#8e3e2c', // orange for regular lines\n activeColor = '#2b83ff', // blue for active line\n rulerThicknessPx = 30,\n snapToGrid = true,\n gridStep = 1, // step 1px for precise positioning\n } = options;\n this._options = {\n guideColor,\n activeColor,\n rulerThicknessPx,\n snapToGrid,\n gridStep,\n };\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n // Check for ruler-layer (created by RulerPlugin)\n const rulerLayer = core.stage.findOne('.ruler-layer');\n if (!rulerLayer) {\n throw new Error(\n 'RulerGuidesPlugin requires RulerPlugin to be added to the CoreEngine first. ' +\n 'Please add RulerPlugin before RulerGuidesPlugin.',\n );\n }\n\n // Create layer for guides\n this._guidesLayer = new Konva.Layer({ name: 'guides-layer' });\n core.stage.add(this._guidesLayer);\n\n // Move guides-layer ABOVE all layers (including ruler-layer)\n // Guides must be visible above everything\n this._guidesLayer.moveToTop();\n\n // Subscribe to stage events for tracking dragging from ruler\n const stage = core.stage;\n const thicknessPx = this._options.rulerThicknessPx;\n\n stage.on('mousedown.ruler-guides', () => {\n const pos = stage.getPointerPosition();\n if (!pos) return;\n\n // Check if we clicked on a guide line\n const target = stage.getIntersection(pos);\n if (target && (target.name() === 'guide-h' || target.name() === 'guide-v')) {\n // Click on a guide line - handled by its own handler\n return;\n }\n\n // Check click position relative to ruler\n if (pos.y <= thicknessPx && pos.x >= thicknessPx) {\n // Click on horizontal ruler\n this._startCreateGuide('h');\n } else if (pos.x <= thicknessPx && pos.y >= thicknessPx) {\n // Click on vertical ruler\n this._startCreateGuide('v');\n } else {\n // Click outside ruler and guides - reset active guide\n this._setActiveGuide(null);\n }\n });\n\n // Cursors on hover over rulers\n stage.on('mousemove.ruler-guides', () => {\n const pos = stage.getPointerPosition();\n if (!pos) return;\n\n // Check if we are over a guide line or another interactive element\n const target = stage.getIntersection(pos);\n if (target) {\n const targetName = target.name();\n // If over a guide line or interactive element (anchor, rotater and so on) - do not change cursor\n if (\n targetName === 'guide-h' ||\n targetName === 'guide-v' ||\n targetName.includes('_anchor') ||\n targetName.includes('rotater') ||\n target.draggable()\n ) {\n return;\n }\n }\n\n // Check if we are over horizontal ruler\n if (pos.y <= thicknessPx && pos.x >= thicknessPx) {\n // Over horizontal ruler\n stage.container().style.cursor = 'ns-resize';\n } else if (pos.x <= thicknessPx && pos.y >= thicknessPx) {\n // Over vertical ruler\n stage.container().style.cursor = 'ew-resize';\n } else {\n // Not over ruler and not over guide\n if (!this._draggingGuide) {\n stage.container().style.cursor = 'default';\n }\n }\n });\n\n // Cache ruler-layer\n this._rulerLayerCache = core.stage.findOne('.ruler-layer') as Konva.Layer | null;\n\n // Subscribe to world changes for updating line positions\n const world = core.nodes.world;\n world.on(\n 'xChange.ruler-guides yChange.ruler-guides scaleXChange.ruler-guides scaleYChange.ruler-guides',\n () => {\n this._scheduleUpdate();\n },\n );\n\n // Subscribe to stage resize for updating line length\n stage.on('resize.ruler-guides', () => {\n this._scheduleUpdate();\n });\n\n core.stage.batchDraw();\n }\n\n protected onDetach(core: CoreEngine): void {\n // Unsubscribe from all events\n core.stage.off('.ruler-guides');\n core.nodes.world.off('.ruler-guides');\n\n // Remove layer\n if (this._guidesLayer) {\n this._guidesLayer.destroy();\n this._guidesLayer = null;\n }\n\n this._guides = [];\n this._activeGuide = null;\n this._draggingGuide = null;\n }\n\n /**\n * Schedules update of guide positions (without throttling for smoothness)\n */\n private _scheduleUpdate() {\n if (this._updateScheduled) return;\n\n this._updateScheduled = true;\n globalThis.requestAnimationFrame(() => {\n this._updateScheduled = false;\n this._updateGuidesPositions();\n });\n }\n\n /**\n * Updates positions of all guides when world transform changes\n */\n private _updateGuidesPositions() {\n if (!this._core || this._guides.length === 0) return;\n\n // Cache all calculations once\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n const worldX = world.x();\n const worldY = world.y();\n const stageW = this._core.stage.width();\n const stageH = this._core.stage.height();\n\n // Pre-calculate point arrays for reuse\n const hPoints = [0, 0, stageW, 0];\n const vPoints = [0, 0, 0, stageH];\n\n // Optimization: use for-of and minimize method calls\n for (const guide of this._guides) {\n const worldCoord = guide.worldCoord;\n const isHorizontal = guide.name() === 'guide-h';\n\n if (isHorizontal) {\n const screenY = worldY + worldCoord * scale;\n guide.position({ x: 0, y: screenY });\n guide.points(hPoints);\n } else {\n const screenX = worldX + worldCoord * scale;\n guide.position({ x: screenX, y: 0 });\n guide.points(vPoints);\n }\n }\n\n this._guidesLayer?.batchDraw();\n }\n\n /**\n * Snaps coordinate to grid\n */\n private _snapToGrid(coord: number): number {\n if (!this._options.snapToGrid) return Math.round(coord);\n const step = this._options.gridStep;\n return Math.round(coord / step) * step;\n }\n\n /**\n * Schedules batchDraw for grouping updates\n */\n private _scheduleBatchDraw() {\n if (this._batchDrawScheduled) return;\n this._batchDrawScheduled = true;\n\n globalThis.requestAnimationFrame(() => {\n this._batchDrawScheduled = false;\n this._core?.stage.batchDraw();\n });\n }\n\n /**\n * Starts creating a guide line from ruler\n */\n private _startCreateGuide(type: 'h' | 'v') {\n if (!this._core || !this._guidesLayer) return;\n\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n const pos = stage.getPointerPosition();\n if (!pos) return;\n\n // Calculate world coordinate with grid snapping\n const rawCoord = type === 'h' ? (pos.y - world.y()) / scale : (pos.x - world.x()) / scale;\n const worldCoord = this._snapToGrid(rawCoord);\n\n // Create guide line\n const line = new Konva.Line({\n name: type === 'h' ? 'guide-h' : 'guide-v',\n stroke: this._options.guideColor,\n strokeWidth: 1,\n opacity: 1,\n draggable: true,\n hitStrokeWidth: 8,\n dragBoundFunc: (p) => {\n if (!this._core) return p;\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n\n // Limit movement to one axis with grid snapping\n if (type === 'h') {\n const rawWorldY = (p.y - world.y()) / scale;\n const worldY = this._snapToGrid(rawWorldY);\n return { x: 0, y: world.y() + worldY * scale };\n } else {\n const rawWorldX = (p.x - world.x()) / scale;\n const worldX = this._snapToGrid(rawWorldX);\n return { x: world.x() + worldX * scale, y: 0 };\n }\n },\n });\n\n // Save world coordinate\n (line as GuideLineWithCoord).worldCoord = worldCoord;\n\n // Add event handlers\n line.on('mouseenter', () => {\n if (this._core) {\n this._core.stage.container().style.cursor = type === 'h' ? 'ns-resize' : 'ew-resize';\n }\n this._scheduleBatchDraw();\n });\n\n line.on('mouseleave', () => {\n if (this._core && !this._draggingGuide) {\n this._core.stage.container().style.cursor = 'default';\n }\n this._scheduleBatchDraw();\n });\n\n line.on('click', () => {\n this._setActiveGuide(line as GuideLineWithCoord);\n });\n\n line.on('dragstart', () => {\n const guideLine = line as GuideLineWithCoord;\n this._draggingGuide = { type, line: guideLine };\n this._setActiveGuide(guideLine);\n if (this._core) {\n this._core.stage.container().style.cursor = type === 'h' ? 'ns-resize' : 'ew-resize';\n }\n });\n\n line.on('dragmove', () => {\n if (!this._core || this._dragMoveScheduled) return;\n\n this._dragMoveScheduled = true;\n globalThis.requestAnimationFrame(() => {\n this._dragMoveScheduled = false;\n if (!this._core) return;\n\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n const pos = line.getAbsolutePosition();\n\n // Update world coordinate with grid snapping\n const rawCoord = type === 'h' ? (pos.y - world.y()) / scale : (pos.x - world.x()) / scale;\n const worldCoord = this._snapToGrid(rawCoord);\n\n (line as GuideLineWithCoord).worldCoord = worldCoord;\n\n // Set cursor while dragging\n this._core.stage.container().style.cursor = type === 'h' ? 'ns-resize' : 'ew-resize';\n\n // Update ruler for dynamic highlighting\n if (this._rulerLayerCache) {\n this._rulerLayerCache.batchDraw();\n }\n });\n });\n\n line.on('dragend', () => {\n this._draggingGuide = null;\n // Cursor stays resize, since mouse is still over the line\n if (this._core) {\n this._core.stage.container().style.cursor = type === 'h' ? 'ns-resize' : 'ew-resize';\n }\n });\n\n const guideLine = line as GuideLineWithCoord;\n this._guidesLayer.add(guideLine);\n this._guides.push(guideLine);\n this._setActiveGuide(guideLine);\n\n // Initial position and size\n if (type === 'h') {\n line.position({ x: 0, y: world.y() + worldCoord * scale });\n line.points([0, 0, stage.width(), 0]);\n } else {\n line.position({ x: world.x() + worldCoord * scale, y: 0 });\n line.points([0, 0, 0, stage.height()]);\n }\n\n // Начинаем перетаскивание программно\n this._draggingGuide = { type, line: guideLine };\n\n const moveHandler = () => {\n if (!this._draggingGuide || !this._core) return;\n\n const p = this._core.stage.getPointerPosition();\n if (!p) return;\n\n const world = this._core.nodes.world;\n const scale = world.scaleX();\n const rawCoord = type === 'h' ? (p.y - world.y()) / scale : (p.x - world.x()) / scale;\n const worldCoord = this._snapToGrid(rawCoord);\n\n (line as GuideLineWithCoord).worldCoord = worldCoord;\n\n if (type === 'h') {\n line.position({ x: 0, y: world.y() + worldCoord * scale });\n line.points([0, 0, this._core.stage.width(), 0]);\n } else {\n line.position({ x: world.x() + worldCoord * scale, y: 0 });\n line.points([0, 0, 0, this._core.stage.height()]);\n }\n\n this._scheduleBatchDraw();\n };\n\n const upHandler = () => {\n this._draggingGuide = null;\n if (this._core) {\n this._core.stage.off('mousemove.guide-create');\n this._core.stage.off('mouseup.guide-create');\n }\n };\n\n stage.on('mousemove.guide-create', moveHandler);\n stage.on('mouseup.guide-create', upHandler);\n\n this._scheduleBatchDraw();\n }\n\n private _setActiveGuide(guide: GuideLineWithCoord | null) {\n if (this._activeGuide && this._activeGuide !== guide) {\n // Сбрасываем предыдущую активную направляющую\n this._activeGuide.stroke(this._options.guideColor);\n this._activeGuide.strokeWidth(1);\n }\n this._activeGuide = guide;\n if (guide) {\n // Highlight new active guide\n guide.stroke(this._options.activeColor);\n guide.strokeWidth(2);\n }\n\n // Notify ruler about the need to redraw for coordinate highlighting\n // Optimization: use cached layer\n if (this._rulerLayerCache) {\n this._rulerLayerCache.batchDraw();\n }\n\n // Notify RulerPlugin about changes to guides\n this._core?.stage.fire('guidesChanged.ruler');\n\n this._scheduleBatchDraw();\n }\n\n /**\n * Get active guide\n */\n public getActiveGuide(): Konva.Line | null {\n return this._activeGuide;\n }\n\n /**\n * Get active guide info\n * @returns { type: 'h' | 'v', coord: number } | null\n */\n public getActiveGuideInfo(): { type: 'h' | 'v'; coord: number } | null {\n if (!this._activeGuide) return null;\n const worldCoord = this._activeGuide.worldCoord;\n const type = this._activeGuide.name() === 'guide-h' ? ('h' as const) : ('v' as const);\n return { type, coord: worldCoord };\n }\n\n /**\n * Remove active guide\n */\n public removeActiveGuide() {\n if (this._activeGuide) {\n this._activeGuide.destroy();\n this._guides = this._guides.filter((g) => g !== this._activeGuide);\n this._activeGuide = null;\n this._scheduleBatchDraw();\n }\n }\n\n /**\n * Get all guides\n */\n public getGuides(): Konva.Line[] {\n return [...this._guides];\n }\n\n /**\n * Remove all guides\n */\n public clearGuides() {\n this._guides.forEach((g) => g.destroy());\n this._guides = [];\n this._activeGuide = null;\n this._scheduleBatchDraw();\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\nimport { DebounceHelper } from '../utils/DebounceHelper';\n\nimport { Plugin } from './Plugin';\n\nexport interface RulerHighlightPluginOptions {\n highlightColor?: string; // color of the highlight\n highlightOpacity?: number; // opacity of the highlight\n rulerThicknessPx?: number; // thickness of the ruler (should match RulerPlugin)\n}\n\n/**\n * RulerHighlightPlugin\n * Highlights the areas of the coordinate system that are occupied by selected objects\n * Works only if RulerPlugin and SelectionPlugin are present\n */\nexport class RulerHighlightPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<RulerHighlightPluginOptions>;\n private _highlightLayer: Konva.Layer | null = null;\n private _hGroup: Konva.Group | null = null; // horizontal ruler group\n private _vGroup: Konva.Group | null = null; // vertical ruler group\n private _hHighlights: Konva.Rect[] = []; // horizontal highlights\n private _vHighlights: Konva.Rect[] = []; // vertical highlights\n\n // Cache for optimization\n private _updateDebounce = new DebounceHelper();\n private _transformersCache: Konva.Transformer[] = [];\n private _cacheInvalidated = true;\n\n constructor(options: RulerHighlightPluginOptions = {}) {\n super();\n const { highlightColor = '#2b83ff', highlightOpacity = 0.3, rulerThicknessPx = 30 } = options;\n this._options = {\n highlightColor,\n highlightOpacity,\n rulerThicknessPx,\n };\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n // Check for the presence of ruler-layer (created by RulerPlugin)\n const rulerLayer = core.stage.findOne('.ruler-layer') as Konva.Layer | null;\n if (!rulerLayer) {\n globalThis.console.warn(\n 'RulerHighlightPlugin: RulerPlugin not found. ' +\n 'Please add RulerPlugin before RulerHighlightPlugin. ' +\n 'Plugin will not work without RulerPlugin.',\n );\n return;\n }\n\n // Use the same ruler-layer for highlights\n this._highlightLayer = rulerLayer;\n\n // Find the groups of horizontal and vertical rulers inside ruler-layer\n // They should be the first two Group in layer\n const groups = rulerLayer.find('Group');\n if (groups.length >= 2) {\n this._hGroup = groups[0] as Konva.Group;\n this._vGroup = groups[1] as Konva.Group;\n } else {\n globalThis.console.warn('RulerHighlightPlugin: Could not find ruler groups');\n return;\n }\n\n // Subscribe to world changes for updating highlight positions\n // Optimization: use throttling for all events\n const world = core.nodes.world;\n world.on(\n 'xChange.ruler-highlight yChange.ruler-highlight scaleXChange.ruler-highlight scaleYChange.ruler-highlight',\n () => {\n this._scheduleUpdate();\n },\n );\n\n // Subscribe to stage resize for updating highlight positions\n core.stage.on('resize.ruler-highlight', () => {\n this._scheduleUpdate();\n });\n\n // Subscribe to transformer changes (selection)\n // Use event delegation through stage\n core.stage.on('transform.ruler-highlight transformend.ruler-highlight', () => {\n this._scheduleUpdate();\n });\n\n // Subscribe to clicks for tracking selection change\n core.stage.on('click.ruler-highlight', () => {\n this._invalidateCache();\n this._scheduleUpdate();\n });\n\n // Subscribe to dragmove for updating during dragging\n core.stage.on('dragmove.ruler-highlight', () => {\n this._scheduleUpdate();\n });\n\n // Subscribe to AreaSelection events for immediate update on area selection\n core.stage.on('mouseup.ruler-highlight', () => {\n this._invalidateCache();\n this._scheduleUpdate();\n });\n\n // Initial draw\n this._updateHighlights();\n }\n\n protected onDetach(core: CoreEngine): void {\n // Unsubscribe from all events\n try {\n core.stage.off('.ruler-highlight');\n core.nodes.world.off('.ruler-highlight');\n } catch {\n // Ignore errors on unsubscribe\n }\n\n // Remove only our highlights, but not the layer (it belongs to RulerPlugin)\n this._hHighlights.forEach((r) => {\n try {\n r.destroy();\n } catch {\n // Ignore errors on destroy\n }\n });\n this._vHighlights.forEach((r) => {\n try {\n r.destroy();\n } catch {\n // Ignore errors on destroy\n }\n });\n\n this._hHighlights = [];\n this._vHighlights = [];\n this._highlightLayer = null;\n this._hGroup = null;\n this._vGroup = null;\n }\n\n /**\n * Schedules an update (debouncing)\n */\n private _scheduleUpdate() {\n this._updateDebounce.schedule(() => {\n this._updateHighlights();\n });\n }\n\n /**\n * Invalidates the cache of transformers\n */\n private _invalidateCache() {\n this._cacheInvalidated = true;\n }\n\n /**\n * Updates highlights based on selected objects\n */\n private _updateHighlights() {\n if (!this._core) return;\n if (!this._highlightLayer) return; // layer not created - do nothing\n\n // Optimization: reuse existing highlights instead of recreating\n // Clear old highlights only if they exist\n for (const highlight of this._hHighlights) {\n highlight.destroy();\n }\n this._hHighlights = [];\n\n for (const highlight of this._vHighlights) {\n highlight.destroy();\n }\n this._vHighlights = [];\n\n // Get selected objects directly from transformers (already unwrapped)\n const allNodes = this._getSelectedKonvaNodes();\n if (allNodes.length === 0) {\n this._highlightLayer.batchDraw();\n return;\n }\n\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n const stageW = stage.width();\n const stageH = stage.height();\n const tPx = this._options.rulerThicknessPx;\n\n const worldScale = world.scaleX();\n const worldX = world.x();\n const worldY = world.y();\n\n // Collect segments for horizontal and vertical rulers\n interface Segment {\n start: number;\n end: number;\n }\n const hSegments: Segment[] = [];\n const vSegments: Segment[] = [];\n\n // For each object, get its bounds\n for (const konvaNode of allNodes) {\n // Get bbox object relative to world node (without world transform)\n const rect = konvaNode.getClientRect({ relativeTo: world });\n\n // Convert world coordinates to screen coordinates\n const screenX1 = worldX + rect.x * worldScale;\n const screenX2 = worldX + (rect.x + rect.width) * worldScale;\n const screenY1 = worldY + rect.y * worldScale;\n const screenY2 = worldY + (rect.y + rect.height) * worldScale;\n\n // Add segments for horizontal ruler (X)\n if (screenX1 < stageW && screenX2 > tPx) {\n const start = Math.max(tPx, screenX1);\n const end = Math.min(stageW, screenX2);\n if (start < end) {\n hSegments.push({ start, end });\n }\n }\n\n // Add segments for vertical ruler (Y)\n if (screenY1 < stageH && screenY2 > tPx) {\n const start = Math.max(tPx, screenY1);\n const end = Math.min(stageH, screenY2);\n if (start < end) {\n vSegments.push({ start, end });\n }\n }\n }\n\n // Merge overlapping/adjacent segments for optimization\n const mergedHSegments = this._mergeSegments(hSegments);\n const mergedVSegments = this._mergeSegments(vSegments);\n\n // Create rectangles for horizontal ruler\n if (this._hGroup) {\n for (const seg of mergedHSegments) {\n const hRect = new Konva.Rect({\n x: seg.start,\n y: 0,\n width: seg.end - seg.start,\n height: tPx,\n fill: this._options.highlightColor,\n opacity: this._options.highlightOpacity,\n listening: false,\n name: 'ruler-highlight-h',\n });\n this._hGroup.add(hRect);\n hRect.setZIndex(1);\n this._hHighlights.push(hRect);\n }\n }\n\n // Create rectangles for vertical ruler\n if (this._vGroup) {\n for (const seg of mergedVSegments) {\n const vRect = new Konva.Rect({\n x: 0,\n y: seg.start,\n width: tPx,\n height: seg.end - seg.start,\n fill: this._options.highlightColor,\n opacity: this._options.highlightOpacity,\n listening: false,\n name: 'ruler-highlight-v',\n });\n this._vGroup.add(vRect);\n vRect.setZIndex(1);\n this._vHighlights.push(vRect);\n }\n }\n\n this._highlightLayer.batchDraw();\n }\n\n /**\n * Recursively collects all individual objects (unwraps groups)\n */\n private _collectNodes(node: Konva.Node, result: Konva.Node[]): void {\n // Skip Transformer and other service objects\n const className = node.getClassName();\n const nodeName = node.name();\n\n // List of service names to skip\n const serviceNames = ['overlay-hit', 'ruler-', 'guide-', '_anchor', 'back', 'rotater'];\n const isServiceNode = serviceNames.some((name) => nodeName.includes(name));\n\n if (className === 'Transformer' || className === 'Layer' || isServiceNode) {\n return;\n }\n\n // If it's Group - recursively process children\n if (className === 'Group') {\n const group = node as Konva.Group;\n const children = group.getChildren();\n\n // If group is empty, skip it\n if (children.length === 0) {\n return;\n }\n\n // Unwrap children of group\n for (const child of children) {\n this._collectNodes(child, result);\n }\n } else {\n // It's a regular object (Shape, Rect, Circle and so on) - add it\n // Only if it's not a duplicate\n if (!result.includes(node)) {\n result.push(node);\n }\n }\n }\n\n /**\n * Merges overlapping and adjacent segments\n */\n private _mergeSegments(\n segments: { start: number; end: number }[],\n ): { start: number; end: number }[] {\n if (segments.length === 0) return [];\n\n // Sort segments by start\n const sorted = segments.slice().sort((a, b) => a.start - b.start);\n\n const first = sorted[0];\n if (!first) return [];\n\n const merged: { start: number; end: number }[] = [];\n let current = { start: first.start, end: first.end };\n\n for (let i = 1; i < sorted.length; i++) {\n const seg = sorted[i];\n if (!seg) continue;\n\n // If segments overlap or are adjacent (with a small gap)\n if (seg.start <= current.end + 1) {\n // Merge segments\n current.end = Math.max(current.end, seg.end);\n } else {\n // Segments do not overlap - save current and start new\n merged.push(current);\n current = { start: seg.start, end: seg.end };\n }\n }\n\n // Add last segment\n merged.push(current);\n\n return merged;\n }\n\n /**\n * Get list of selected Konva nodes (with group unwrapping)\n * Optimization: cache transformers\n */\n private _getSelectedKonvaNodes(): Konva.Node[] {\n if (!this._core) return [];\n\n const transformerNodes: Konva.Node[] = [];\n\n try {\n // Optimization: use transformers cache\n if (this._cacheInvalidated) {\n this._transformersCache = this._core.stage.find('Transformer');\n this._cacheInvalidated = false;\n }\n\n for (const tr of this._transformersCache) {\n const nodes = tr.nodes();\n\n for (const konvaNode of nodes) {\n if (!transformerNodes.includes(konvaNode)) {\n transformerNodes.push(konvaNode);\n }\n }\n }\n } catch {\n // Ignore errors\n }\n\n // Now unwrap groups to get individual objects\n const allNodes: Konva.Node[] = [];\n for (const node of transformerNodes) {\n this._collectNodes(node, allNodes);\n }\n\n return allNodes;\n }\n\n /**\n * Public method to force update highlights\n * Useful to call when selection changes from outside\n */\n public update() {\n this._updateHighlights();\n }\n}\n","import type { CoreEngine } from '../core/CoreEngine';\n\nimport { Plugin } from './Plugin';\nimport { RulerGuidesPlugin } from './RulerGuidesPlugin';\n\nexport interface RulerManagerPluginOptions {\n enabled?: boolean; // is manager enabled on start\n}\n\n/**\n * RulerManagerPlugin\n * Manages visibility of ruler and guides on Shift+R\n */\nexport class RulerManagerPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<RulerManagerPluginOptions>;\n private _visible = true; // current visibility state\n\n constructor(options: RulerManagerPluginOptions = {}) {\n super();\n const { enabled = true } = options;\n this._options = {\n enabled,\n };\n }\n\n protected onAttach(core: CoreEngine): void {\n if (!this._options.enabled) return;\n\n this._core = core;\n\n // Subscribe to keyboard events\n this._bindKeyboardEvents();\n }\n\n protected onDetach(_core: CoreEngine): void {\n // Unsubscribe from keyboard events\n this._unbindKeyboardEvents();\n }\n\n /**\n * Bind keyboard events\n */\n private _bindKeyboardEvents(): void {\n globalThis.addEventListener('keydown', this._handleKeyDown);\n }\n\n /**\n * Unbind keyboard events\n */\n private _unbindKeyboardEvents(): void {\n globalThis.removeEventListener('keydown', this._handleKeyDown);\n }\n\n /**\n * Keyboard event handler\n */\n private _handleKeyDown = (e: KeyboardEvent): void => {\n // Check Shift+R (any layout, any case)\n // R on English and К on Russian layout\n if (e.shiftKey && (e.key === 'r' || e.key === 'R' || e.key === 'к' || e.key === 'К')) {\n e.preventDefault();\n this.toggle();\n return;\n }\n\n // Check Delete or Backspace for removing active guide\n // Use e.code for layout independence\n if (e.code === 'Delete' || e.code === 'Backspace') {\n const deleted = this.deleteActiveGuide();\n if (deleted) {\n e.preventDefault();\n }\n }\n };\n\n /**\n * Toggle visibility of ruler and guides\n */\n public toggle(): void {\n if (this._visible) {\n this.hide();\n } else {\n this.show();\n }\n }\n\n /**\n * Show ruler and guides\n */\n public show(): void {\n if (!this._core) return;\n\n this._visible = true;\n\n // Show ruler-layer (RulerPlugin and RulerHighlightPlugin)\n const rulerLayer = this._core.stage.findOne('.ruler-layer');\n if (rulerLayer && !rulerLayer.isVisible()) {\n rulerLayer.show();\n }\n\n // Show guides-layer (RulerGuidesPlugin)\n const guidesLayer = this._core.stage.findOne('.guides-layer');\n if (guidesLayer && !guidesLayer.isVisible()) {\n guidesLayer.show();\n }\n\n this._core.stage.batchDraw();\n }\n\n /**\n * Hide ruler and guides\n */\n public hide(): void {\n if (!this._core) return;\n\n this._visible = false;\n\n // Hide ruler-layer (RulerPlugin and RulerHighlightPlugin)\n const rulerLayer = this._core.stage.findOne('.ruler-layer');\n if (rulerLayer?.isVisible()) {\n rulerLayer.hide();\n }\n\n // Hide guides-layer (RulerGuidesPlugin)\n const guidesLayer = this._core.stage.findOne('.guides-layer');\n if (guidesLayer?.isVisible()) {\n guidesLayer.hide();\n }\n\n this._core.stage.batchDraw();\n }\n\n /**\n * Check if ruler is visible\n */\n public isVisible(): boolean {\n return this._visible;\n }\n\n /**\n * Remove active guide line\n * @returns true if guide was removed, false if no active guide\n */\n public deleteActiveGuide(): boolean {\n if (!this._core) return false;\n\n // Find RulerGuidesPlugin using get method\n const guidesPlugin = this._core.plugins.list().find((p) => p instanceof RulerGuidesPlugin);\n if (!guidesPlugin) return false;\n\n // Check for method existence using duck typing\n if ('getActiveGuide' in guidesPlugin && 'removeActiveGuide' in guidesPlugin) {\n // Check if there is an active guide\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const getActiveGuide = guidesPlugin.getActiveGuide as () => unknown;\n const activeGuide = getActiveGuide.call(guidesPlugin);\n\n if (!activeGuide) return false;\n\n // Remove active guide\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const removeActiveGuide = guidesPlugin.removeActiveGuide as () => void;\n removeActiveGuide.call(guidesPlugin);\n\n return true;\n }\n\n return false;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\nimport { GroupNode } from '../nodes/GroupNode';\nimport type { BaseNode } from '../nodes/BaseNode';\n\nimport { Plugin } from './Plugin';\nimport { SelectionPlugin } from './SelectionPlugin';\n\nexport interface AreaSelectionPluginOptions {\n rectStroke?: string;\n rectFill?: string;\n rectStrokeWidth?: number;\n rectOpacity?: number; // применяется к fill\n enableKeyboardShortcuts?: boolean; // Ctrl+G, Ctrl+Shift+G\n}\n\n/**\n * AreaSelectionPlugin\n * - Drag LKM over empty space draws selection rectangle (marquee) in screen coordinates\n * - All nodes whose client rectangles intersect the rectangle are temporarily grouped\n * - Click outside — temporary group is removed, nodes return to their original positions\n * - Ctrl+G — lock in permanent group (GroupNode through NodeManager)\n * - Ctrl+Shift+G — unlock selected permanent group\n */\nexport class AreaSelectionPlugin extends Plugin {\n private _core?: CoreEngine;\n private _layer: Konva.Layer | null = null; // layer for selection rectangle\n private _rect: Konva.Rect | null = null;\n\n private _start: { x: number; y: number } | null = null;\n private _transformer: Konva.Transformer | null = null;\n // Modelasso forms temporary group, so single clicks are not needed\n private _selecting = false;\n\n private _options: Required<AreaSelectionPluginOptions>;\n\n constructor(options: AreaSelectionPluginOptions = {}) {\n super();\n this._options = {\n rectStroke: options.rectStroke ?? '#2b83ff',\n rectFill: options.rectFill ?? '#2b83ff',\n rectStrokeWidth: options.rectStrokeWidth ?? 1,\n rectOpacity: options.rectOpacity ?? 0.15,\n enableKeyboardShortcuts: options.enableKeyboardShortcuts ?? true,\n };\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n const layer = new Konva.Layer({ name: 'area-selection-layer', listening: false });\n core.stage.add(layer);\n this._layer = layer;\n\n // Рамка выбора\n this._rect = new Konva.Rect({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n visible: false,\n stroke: this._options.rectStroke,\n strokeWidth: this._options.rectStrokeWidth,\n fill: this._options.rectFill,\n opacity: this._options.rectOpacity,\n listening: false,\n });\n layer.add(this._rect);\n\n const stage = core.stage;\n\n stage.on('mousedown.area', (e: Konva.KonvaEventObject<MouseEvent>) => {\n // Only LKM and only click on empty space (outside nodes layer)\n if (e.evt.button !== 0) return;\n if (e.target !== stage && e.target.getLayer() === core.nodes.layer) return;\n\n const p = stage.getPointerPosition();\n if (!p || !this._rect) return;\n\n // Ignore clicks on rulers (RulerPlugin)\n const rulerLayer = stage.findOne('.ruler-layer');\n if (rulerLayer && e.target.getLayer() === rulerLayer) {\n return;\n }\n\n // Ignore clicks on guides (RulerGuidesPlugin)\n const guidesLayer = stage.findOne('.guides-layer');\n if (guidesLayer && e.target.getLayer() === guidesLayer) {\n return;\n }\n\n // Ignore clicks on rulers (RulerPlugin)\n const rulerThickness = 30; // should match RulerPlugin\n if (p.y <= rulerThickness || p.x <= rulerThickness) {\n return;\n }\n\n // If click is inside permanent group bbox, disable marquee selection\n if (this._pointerInsidePermanentGroupBBox(p)) {\n return;\n }\n\n this._selecting = true;\n this._start = { x: p.x, y: p.y };\n this._rect.visible(true);\n this._rect.position({ x: p.x, y: p.y });\n this._rect.size({ width: 0, height: 0 });\n this._layer?.batchDraw();\n });\n\n stage.on('mousemove.area', () => {\n if (!this._selecting || !this._rect || !this._start) return;\n\n // Check if we are over rulers (RulerPlugin)\n const p = stage.getPointerPosition();\n if (!p) return;\n\n const rulerThickness = 30;\n const overRuler = p.y <= rulerThickness || p.x <= rulerThickness;\n\n // If we are over rulers (RulerPlugin), disable marquee selection\n if (overRuler) {\n this._selecting = false;\n this._rect.visible(false);\n this._layer?.batchDraw();\n return;\n }\n\n const x = Math.min(this._start.x, p.x);\n const y = Math.min(this._start.y, p.y);\n const w = Math.abs(p.x - this._start.x);\n const h = Math.abs(p.y - this._start.y);\n this._rect.position({ x, y });\n this._rect.size({ width: w, height: h });\n this._layer?.batchDraw();\n\n // Current set of nodes under the rectangle — form temporary group (as Shift‑multi selection)\n // If node belongs to permanent group, select the entire group\n const bbox = { x, y, width: w, height: h };\n const allNodes: BaseNode[] = this._core?.nodes.list() ?? [];\n const pickedSet = new Set<BaseNode>();\n for (const bn of allNodes) {\n const node = bn.getNode() as unknown as Konva.Node;\n const layer = node.getLayer();\n if (layer !== this._core?.nodes.layer) continue;\n const r = node.getClientRect({ skipShadow: true, skipStroke: false });\n if (this._rectsIntersect(bbox, r)) {\n const owner = this._findOwningGroupBaseNode(node);\n pickedSet.add(owner ?? bn);\n }\n }\n const pickedBase: BaseNode[] = Array.from(pickedSet);\n const sel = this._getSelectionPlugin();\n if (sel) {\n const ctrl = sel.getMultiGroupController();\n if (pickedBase.length > 0) {\n ctrl.ensure(pickedBase);\n } else {\n // If the rectangle left the only (or all) node — temporary group fades away\n ctrl.destroy();\n }\n this._core?.stage.batchDraw();\n }\n });\n\n stage.on('mouseup.area', () => {\n if (!this._selecting) return;\n this._finalizeArea();\n });\n\n // Click outside — remove temporary group/selection\n stage.on('click.area', (e: Konva.KonvaEventObject<MouseEvent>) => {\n if (!this._core) return;\n // Do not interfere with Shift‑clicks: multi selection handles SelectionPlugin\n if (e.evt.shiftKey) return;\n const sel = this._getSelectionPlugin();\n const ctrl = sel?.getMultiGroupController();\n const tempActive = !!ctrl?.isActive();\n if (!tempActive && !this._isPermanentGroupSelected()) return;\n\n const target = e.target as Konva.Node;\n const groupNode = this._currentGroupNode();\n if (groupNode) {\n // If click is not on a child of the current group, clear selection\n const isInside = this._isAncestor(groupNode, target);\n if (!isInside) this._clearSelection();\n } else {\n // Only temporary (via SelectionPlugin)\n if (tempActive && ctrl) {\n const insideTemp = ctrl.isInsideTempByTarget(target);\n if (!insideTemp) {\n ctrl.destroy();\n this._core.stage.batchDraw();\n }\n }\n }\n });\n\n // Hotkeys are handled in SelectionPlugin, no duplicates here\n }\n\n protected onDetach(core: CoreEngine): void {\n // Remove subscriptions\n core.stage.off('.area');\n\n // Clear current state\n this._clearSelection();\n\n // Remove layer\n if (this._layer) this._layer.destroy();\n this._layer = null;\n this._rect = null;\n }\n\n // =================== Internal logic ===================\n private _finalizeArea() {\n if (!this._core || !this._rect || !this._start) return;\n this._selecting = false;\n\n const bbox = this._rect.getClientRect({ skipStroke: true });\n // hide rect, but do not remove — will be needed later\n this._rect.visible(false);\n this._layer?.batchDraw();\n\n // Find nodes intersecting with bbox (in client coordinates)\n const nodes: BaseNode[] = this._core.nodes.list();\n const picked: Konva.Node[] = [];\n for (const n of nodes) {\n const node = n.getNode() as unknown as Konva.Node;\n // Только те, что реально в слое нод\n const layer = node.getLayer();\n if (layer !== this._core.nodes.layer) continue;\n const r = node.getClientRect({ skipShadow: true, skipStroke: false });\n if (this._rectsIntersect(bbox, r)) picked.push(node);\n }\n\n // Form a set of nodes and apply as a temporary group (as Shift‑multi selection)\n const sel = this._getSelectionPlugin();\n if (sel) {\n const list: BaseNode[] = this._core.nodes.list();\n const baseSet = new Set<BaseNode>();\n for (const kn of picked) {\n const bn = list.find((n) => n.getNode() === (kn as unknown as Konva.Node)) ?? null;\n const owner = this._findOwningGroupBaseNode(kn as unknown as Konva.Node);\n if (owner) baseSet.add(owner);\n else if (bn) baseSet.add(bn);\n }\n const baseNodes = Array.from(baseSet);\n if (baseNodes.length > 0) {\n sel.getMultiGroupController().ensure(baseNodes);\n this._core.stage.batchDraw();\n } else {\n sel.getMultiGroupController().destroy();\n }\n }\n }\n\n private _clearSelection() {\n // If permanent GroupNode selected via our Transformer — just remove transformer\n if (this._isPermanentGroupSelected()) {\n if (this._transformer) this._transformer.destroy();\n this._transformer = null;\n this._core?.stage.batchDraw();\n }\n // Remove temporary group (if any) via SelectionPlugin\n const sel = this._getSelectionPlugin();\n const ctrl = sel?.getMultiGroupController();\n if (ctrl) ctrl.destroy();\n }\n\n // Get SelectionPlugin from CoreEngine\n private _getSelectionPlugin(): SelectionPlugin | null {\n if (!this._core) return null;\n const sel = this._core.plugins.list().find((p) => p instanceof SelectionPlugin);\n return sel ?? null;\n }\n\n // ================ Utils ================\n private _rectsIntersect(\n a: { x: number; y: number; width: number; height: number },\n b: { x: number; y: number; width: number; height: number },\n ): boolean {\n // Inclusive intersection: touching by border is also considered\n return (\n a.x <= b.x + b.width && a.x + a.width >= b.x && a.y <= b.y + b.height && a.y + a.height >= b.y\n );\n }\n\n // Find parent GroupNode for current node\n private _findOwningGroupBaseNode(node: Konva.Node): BaseNode | null {\n if (!this._core) return null;\n const list: BaseNode[] = this._core.nodes.list();\n // Collect all permanent groups (GroupNode) and compare their Konva.Node\n const groupBaseNodes = list.filter((bn) => bn instanceof GroupNode);\n let cur: Konva.Node | null = node;\n while (cur) {\n const owner = groupBaseNodes.find((gbn) => gbn.getNode() === cur) ?? null;\n if (owner) return owner;\n cur = cur.getParent();\n }\n return null;\n }\n private _isAncestor(ancestor: Konva.Node, node: Konva.Node): boolean {\n let cur: Konva.Node | null = node;\n while (cur) {\n if (cur === ancestor) return true;\n cur = cur.getParent();\n }\n return false;\n }\n\n private _isPermanentGroupSelected(): boolean {\n if (!this._transformer) return false;\n const nodes = typeof this._transformer.nodes === 'function' ? this._transformer.nodes() : [];\n const n = nodes[0];\n if (!n) return false;\n // Permanent group is a registered in NodeManager GroupNode\n if (!this._core) return false;\n return this._core.nodes.list().some((bn) => bn instanceof GroupNode && bn.getNode() === n);\n }\n\n private _currentGroupNode(): Konva.Group | null {\n if (!this._transformer) return null;\n const nodes = typeof this._transformer.nodes === 'function' ? this._transformer.nodes() : [];\n const n = nodes[0];\n if (!n) return null;\n return n instanceof Konva.Group ? n : null;\n }\n\n // true, if pointer inside visual bbox any permanent group (GroupNode from NodeManager)\n private _pointerInsidePermanentGroupBBox(p: { x: number; y: number }): boolean {\n if (!this._core) return false;\n const list: BaseNode[] = this._core.nodes.list();\n for (const bn of list) {\n if (!(bn instanceof GroupNode)) continue;\n const node = bn.getNode();\n const bbox = node.getClientRect({ skipShadow: true, skipStroke: true });\n const inside =\n p.x >= bbox.x && p.x <= bbox.x + bbox.width && p.y >= bbox.y && p.y <= bbox.y + bbox.height;\n if (inside) return true;\n }\n return false;\n }\n}\n","import Konva from 'konva';\n\nimport type { CoreEngine } from '../core/CoreEngine';\nimport type { BaseNode } from '../nodes/BaseNode';\n\nimport { Plugin } from './Plugin';\nimport { SelectionPlugin } from './SelectionPlugin';\n\nexport interface NodeHotkeysOptions {\n target?: Window | Document | HTMLElement | EventTarget;\n ignoreEditableTargets?: boolean;\n}\n\ninterface ClipboardData {\n nodes: {\n type: string;\n config: Record<string, unknown>;\n position: { x: number; y: number };\n children?: ClipboardData['nodes'];\n }[];\n // Visual center in world coordinates at the time of copying (takes into account offset/rotation/scale)\n center?: { x: number; y: number };\n}\n\nexport class NodeHotkeysPlugin extends Plugin {\n private _core?: CoreEngine;\n private _options: Required<Omit<NodeHotkeysOptions, 'target'>> & { target: EventTarget };\n private _clipboard: ClipboardData | null = null;\n private _selectionPlugin?: SelectionPlugin;\n\n constructor(options: NodeHotkeysOptions = {}) {\n super();\n const { target = globalThis as unknown as EventTarget, ignoreEditableTargets = true } = options;\n\n this._options = {\n target,\n ignoreEditableTargets,\n };\n }\n\n protected onAttach(core: CoreEngine): void {\n this._core = core;\n\n // Subscribe to keydown\n this._options.target.addEventListener('keydown', this._onKeyDown as EventListener);\n }\n\n protected onDetach(_core: CoreEngine): void {\n this._options.target.removeEventListener('keydown', this._onKeyDown as EventListener);\n this._core = undefined as unknown as CoreEngine;\n this._selectionPlugin = undefined as unknown as SelectionPlugin;\n this._clipboard = null;\n }\n\n private _onKeyDown = (e: KeyboardEvent) => {\n if (!this._core) return;\n\n // Lazy get SelectionPlugin on first use (robust against minification via instanceof)\n if (!this._selectionPlugin) {\n const plugin = this._core.plugins.list().find((p) => p instanceof SelectionPlugin);\n if (plugin) {\n this._selectionPlugin = plugin;\n }\n }\n\n if (!this._selectionPlugin) return;\n\n // Ignore if focus is on editable element\n if (this._options.ignoreEditableTargets && this._isEditableTarget(e.target)) {\n return;\n }\n\n const ctrl = e.ctrlKey || e.metaKey;\n const shift = e.shiftKey;\n\n // Ctrl+C - Copy\n if (ctrl && e.code === 'KeyC') {\n e.preventDefault();\n this._handleCopy();\n return;\n }\n\n // Ctrl+X - Cut\n if (ctrl && e.code === 'KeyX') {\n e.preventDefault();\n this._handleCut();\n return;\n }\n\n // Ctrl+V - Paste\n if (ctrl && e.code === 'KeyV') {\n e.preventDefault();\n this._handlePaste();\n return;\n }\n\n // Delete or Backspace - Delete\n if (e.code === 'Delete' || e.code === 'Backspace') {\n e.preventDefault();\n this._handleDelete();\n return;\n }\n\n // Ctrl+] or Ctrl+Shift+= - Raise z-index (moveUp)\n if (ctrl && (e.code === 'BracketRight' || (shift && e.code === 'Equal'))) {\n e.preventDefault();\n this._handleMoveUp();\n return;\n }\n\n // Ctrl+[ or Ctrl+Shift+- - Lower z-index (moveDown)\n if (ctrl && (e.code === 'BracketLeft' || (shift && e.code === 'Minus'))) {\n e.preventDefault();\n this._handleMoveDown();\n return;\n }\n };\n\n private _isEditableTarget(target: EventTarget | null): boolean {\n if (!target || !(target instanceof HTMLElement)) return false;\n const tagName = target.tagName.toLowerCase();\n if (tagName === 'input' || tagName === 'textarea') return true;\n if (target.isContentEditable) return true;\n return false;\n }\n\n private _handleCopy(): void {\n const selected = this._getSelectedNodes();\n if (selected.length === 0) return;\n\n const nodes = selected.map((node) => this._serializeNode(node));\n const center = this._computeSelectionWorldCenter(selected);\n this._clipboard = { nodes, center };\n\n // Copied successfully\n if (this._core) {\n this._core.eventBus.emit('clipboard:copy', selected);\n }\n }\n\n private _handleCut(): void {\n const selected = this._getSelectedNodes();\n if (selected.length === 0) return;\n\n const nodes = selected.map((node) => this._serializeNode(node));\n const center = this._computeSelectionWorldCenter(selected);\n this._clipboard = { nodes, center };\n\n // Delete nodes\n this._deleteNodes(selected);\n\n // Cut successfully\n if (this._core) {\n this._core.eventBus.emit('clipboard:cut', selected);\n }\n }\n\n private _handlePaste(): void {\n if (!this._core || !this._clipboard || this._clipboard.nodes.length === 0) return;\n // Determine paste position\n const pastePosition = this._getPastePosition();\n\n // Calculate center of copied nodes\n const clipboardCenter = this._getClipboardCenter();\n\n // Paste nodes with offset relative to new position\n const newNodes: BaseNode[] = [];\n for (const nodeData of this._clipboard.nodes) {\n const offsetX = nodeData.position.x - clipboardCenter.x;\n const offsetY = nodeData.position.y - clipboardCenter.y;\n\n const newNode = this._deserializeNode(nodeData, {\n x: pastePosition.x + offsetX,\n y: pastePosition.y + offsetY,\n });\n\n if (newNode) {\n newNodes.push(newNode);\n }\n }\n\n // Pasted successfully\n if (newNodes.length > 0) {\n this._core.eventBus.emit('clipboard:paste', newNodes);\n }\n this._core.nodes.layer.batchDraw();\n }\n\n private _handleDelete(): void {\n const selected = this._getSelectedNodes();\n if (selected.length === 0) return;\n\n this._deleteNodes(selected);\n // Deleted successfully\n }\n\n private _getSelectedNodes(): BaseNode[] {\n if (!this._selectionPlugin) return [];\n // 1) If a temporary group (_tempMultiGroup) is active, collect nodes from its children\n const tempGroup = (\n this._selectionPlugin as unknown as { _tempMultiGroup?: { getChildren?: () => unknown[] } }\n )._tempMultiGroup;\n if (tempGroup && typeof tempGroup.getChildren === 'function' && this._core) {\n const children = tempGroup.getChildren();\n const list: BaseNode[] = this._core.nodes.list();\n const set = new Set<BaseNode>();\n for (const ch of children) {\n const bn = list.find((n) => n.getNode() === ch);\n if (bn) set.add(bn);\n }\n if (set.size > 0) return Array.from(set);\n }\n\n // 2) Check temporary group through _tempMultiSet (multiset SelectionPlugin)\n const tempMultiSet = (this._selectionPlugin as unknown as { _tempMultiSet?: Set<BaseNode> })\n ._tempMultiSet;\n if (tempMultiSet && tempMultiSet.size > 0) {\n return Array.from(tempMultiSet);\n }\n\n // 3) Check single selection\n const selected = (this._selectionPlugin as unknown as { _selected?: BaseNode | null })\n ._selected;\n if (selected) {\n return [selected];\n }\n\n return [];\n }\n\n private _deleteNodes(nodes: BaseNode[]): void {\n if (!this._core) return;\n\n // Clear selection before deletion\n if (this._selectionPlugin) {\n const plugin = this._selectionPlugin as unknown as {\n _destroyTempMulti?: () => void;\n _clearSelection?: () => void;\n };\n if (typeof plugin._destroyTempMulti === 'function') {\n plugin._destroyTempMulti();\n }\n if (typeof plugin._clearSelection === 'function') {\n plugin._clearSelection();\n }\n }\n\n // Delete nodes\n for (const node of nodes) {\n this._core.nodes.remove(node);\n }\n }\n\n // Serialize node to buffer, position in world coordinates\n private _serializeNode(node: BaseNode): ClipboardData['nodes'][0] {\n const konvaNode = node.getNode();\n const attrs = konvaNode.getAttrs();\n // Use Konva className (robust against minification), not constructor.name\n const nodeType = this._getNodeTypeFromKonva(konvaNode as unknown as Konva.Node);\n\n let pos = { x: 0, y: 0 };\n if (this._core) {\n const kn = konvaNode as unknown as Konva.Node;\n const abs = kn.getAbsolutePosition();\n const inv = this._core.nodes.world.getAbsoluteTransform().copy().invert();\n const wpt = inv.point(abs);\n pos = { x: wpt.x, y: wpt.y };\n }\n\n const serialized: ClipboardData['nodes'][0] = {\n type: nodeType,\n config: {\n ...attrs,\n id: undefined,\n },\n position: pos,\n };\n\n // If it's a group, serialize child elements\n if (nodeType === 'group') {\n const gKn = konvaNode as unknown as Konva.Group;\n const children = gKn.getChildren();\n const serializedChildren: ClipboardData['nodes'] = [];\n\n for (const child of children) {\n // Serialize each child Konva.Node directly\n const childSerialized = this._serializeKonvaNode(child as unknown as Konva.Node);\n if (childSerialized) {\n serializedChildren.push(childSerialized);\n }\n }\n\n if (serializedChildren.length > 0) {\n serialized.children = serializedChildren;\n }\n }\n\n return serialized;\n }\n\n // Serialize Konva.Node (not BaseNode) for group children\n private _serializeKonvaNode(kn: Konva.Node): ClipboardData['nodes'][0] | null {\n if (!this._core) return null;\n\n const attrs = kn.getAttrs();\n const className = kn.getClassName();\n\n // Define type of className Konva (Rect -> shape, Circle -> circle, etc.)\n let nodeType = className.toLowerCase();\n if (nodeType === 'rect') nodeType = 'shape';\n\n // For group children, save RELATIVE positions (x, y inside group)\n const serialized: ClipboardData['nodes'][0] = {\n type: nodeType,\n config: {\n ...attrs,\n id: undefined,\n },\n position: { x: kn.x(), y: kn.y() }, // Relative coordinates inside group\n };\n\n // Recursively process nested groups\n if (kn instanceof Konva.Group) {\n const children = kn.getChildren();\n const serializedChildren: ClipboardData['nodes'] = [];\n\n for (const child of children) {\n const childSerialized = this._serializeKonvaNode(child as unknown as Konva.Node);\n if (childSerialized) {\n serializedChildren.push(childSerialized);\n }\n }\n\n if (serializedChildren.length > 0) {\n serialized.children = serializedChildren;\n }\n }\n\n return serialized;\n }\n\n // Get node type from Konva className (robust against minification)\n private _getNodeTypeFromKonva(kn: Konva.Node): string {\n const className = kn.getClassName();\n // Map Konva class names to our internal types\n const typeMap: Record<string, string> = {\n Rect: 'shape',\n Circle: 'circle',\n Ellipse: 'ellipse',\n Text: 'text',\n Image: 'image',\n Group: 'group',\n Arc: 'arc',\n Star: 'star',\n Arrow: 'arrow',\n Ring: 'ring',\n RegularPolygon: 'regularPolygon',\n Label: 'label',\n };\n return typeMap[className] ?? className.toLowerCase();\n }\n\n private _deserializeNode(\n data: ClipboardData['nodes'][0],\n position: { x: number; y: number },\n ): BaseNode | null {\n if (!this._core) return null;\n\n // Remove zIndex from config, as it will be set automatically\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { zIndex, ...configWithoutZIndex } = data.config;\n\n const config = {\n ...configWithoutZIndex,\n x: position.x,\n y: position.y,\n };\n\n try {\n let newNode: BaseNode | null = null;\n\n switch (data.type) {\n case 'shape':\n newNode = this._core.nodes.addShape(config);\n break;\n case 'text':\n newNode = this._core.nodes.addText(config);\n break;\n case 'circle':\n newNode = this._core.nodes.addCircle(config);\n break;\n case 'ellipse':\n newNode = this._core.nodes.addEllipse(config);\n break;\n case 'arc':\n newNode = this._core.nodes.addArc(config);\n break;\n case 'star':\n newNode = this._core.nodes.addStar(config);\n break;\n case 'arrow':\n newNode = this._core.nodes.addArrow(config);\n break;\n case 'ring':\n newNode = this._core.nodes.addRing(config);\n break;\n case 'regularPolygon':\n case 'regularpolygon':\n newNode = this._core.nodes.addRegularPolygon(config);\n break;\n case 'image':\n newNode = this._core.nodes.addImage(config);\n break;\n case 'label':\n // LabelNode пока не поддерживается через NodeManager\n globalThis.console.warn('LabelNode is not supported for copy/paste yet');\n return null;\n case 'group': {\n newNode = this._core.nodes.addGroup(config);\n // Принудительно применяем все атрибуты трансформации после создания\n const groupKonvaNode = newNode.getNode() as unknown as Konva.Group;\n // Применяем масштаб, поворот и другие атрибуты\n if (data.config['scaleX'] !== undefined)\n groupKonvaNode.scaleX(data.config['scaleX'] as number);\n if (data.config['scaleY'] !== undefined)\n groupKonvaNode.scaleY(data.config['scaleY'] as number);\n if (data.config['rotation'] !== undefined)\n groupKonvaNode.rotation(data.config['rotation'] as number);\n if (data.config['skewX'] !== undefined)\n groupKonvaNode.skewX(data.config['skewX'] as number);\n if (data.config['skewY'] !== undefined)\n groupKonvaNode.skewY(data.config['skewY'] as number);\n if (data.config['offsetX'] !== undefined)\n groupKonvaNode.offsetX(data.config['offsetX'] as number);\n if (data.config['offsetY'] !== undefined)\n groupKonvaNode.offsetY(data.config['offsetY'] as number);\n\n // CRITICAL FIX: restore ALL child elements through NodeManager\n // This ensures that they can be accessed through double-click\n if (data.children && data.children.length > 0) {\n for (const childData of data.children) {\n // Create ANY child node (group or regular) through _deserializeNode\n // This registers it in NodeManager and makes it available\n const childBaseNode = this._deserializeNode(childData, {\n x: childData.position.x,\n y: childData.position.y,\n });\n if (childBaseNode) {\n const childKonvaNode = childBaseNode.getNode();\n // Disable draggable for child elements\n if (typeof childKonvaNode.draggable === 'function') {\n childKonvaNode.draggable(false);\n }\n // Move from world to parent group\n childKonvaNode.moveTo(groupKonvaNode);\n }\n }\n }\n break;\n }\n default:\n globalThis.console.warn(`Unknown node type: ${data.type}`);\n return null;\n }\n\n // Apply transformation attributes for ALL node types\n const konvaNode = newNode.getNode() as unknown as Konva.Node;\n if (data.config['scaleX'] !== undefined) konvaNode.scaleX(data.config['scaleX'] as number);\n if (data.config['scaleY'] !== undefined) konvaNode.scaleY(data.config['scaleY'] as number);\n if (data.config['rotation'] !== undefined)\n konvaNode.rotation(data.config['rotation'] as number);\n if (data.config['skewX'] !== undefined) konvaNode.skewX(data.config['skewX'] as number);\n if (data.config['skewY'] !== undefined) konvaNode.skewY(data.config['skewY'] as number);\n if (data.config['offsetX'] !== undefined) konvaNode.offsetX(data.config['offsetX'] as number);\n if (data.config['offsetY'] !== undefined) konvaNode.offsetY(data.config['offsetY'] as number);\n\n return newNode;\n } catch (error) {\n globalThis.console.error(`Failed to deserialize node:`, error);\n return null;\n }\n }\n\n private _getPastePosition(): { x: number; y: number } {\n if (!this._core) return { x: 0, y: 0 };\n\n const stage = this._core.stage;\n const pointer = stage.getPointerPosition();\n\n // Check if cursor is on screen and within canvas\n if (pointer && this._isPointerOnScreen(pointer)) {\n const world = this._core.nodes.world;\n const worldTransform = world.getAbsoluteTransform().copy().invert();\n const worldPos = worldTransform.point(pointer);\n return { x: worldPos.x, y: worldPos.y };\n }\n\n // If cursor is not on screen or out of bounds - paste in the center of the screen\n return this._getScreenCenter();\n }\n\n private _isPointerOnScreen(pointer: { x: number; y: number }): boolean {\n if (!this._core) return false;\n const stage = this._core.stage;\n const width = stage.width();\n const height = stage.height();\n return pointer.x >= 0 && pointer.x <= width && pointer.y >= 0 && pointer.y <= height;\n }\n\n private _getScreenCenter(): { x: number; y: number } {\n if (!this._core) return { x: 0, y: 0 };\n\n const stage = this._core.stage;\n const world = this._core.nodes.world;\n\n const centerX = stage.width() / 2;\n const centerY = stage.height() / 2;\n\n const worldTransform = world.getAbsoluteTransform().copy().invert();\n const worldPos = worldTransform.point({ x: centerX, y: centerY });\n\n return { x: worldPos.x, y: worldPos.y };\n }\n\n private _getClipboardCenter(): { x: number; y: number } {\n if (!this._clipboard || this._clipboard.nodes.length === 0) {\n return { x: 0, y: 0 };\n }\n // If exact visual center is saved, use it\n if (this._clipboard.center) return this._clipboard.center;\n // Fallback: average of positions\n let sumX = 0;\n let sumY = 0;\n for (const node of this._clipboard.nodes) {\n sumX += node.position.x;\n sumY += node.position.y;\n }\n return { x: sumX / this._clipboard.nodes.length, y: sumY / this._clipboard.nodes.length };\n }\n\n // Calculate visual bbox of selected nodes and return its center in world coordinates\n private _computeSelectionWorldCenter(nodes: BaseNode[]): { x: number; y: number } {\n if (!this._core || nodes.length === 0) return { x: 0, y: 0 };\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n for (const n of nodes) {\n const kn = n.getNode() as unknown as Konva.Node;\n // clientRect already accounts for all transformations (except default stroke — not critical for us)\n const r = kn.getClientRect({ skipShadow: true, skipStroke: true });\n minX = Math.min(minX, r.x);\n minY = Math.min(minY, r.y);\n maxX = Math.max(maxX, r.x + r.width);\n maxY = Math.max(maxY, r.y + r.height);\n }\n\n if (!isFinite(minX) || !isFinite(minY) || !isFinite(maxX) || !isFinite(maxY)) {\n return { x: 0, y: 0 };\n }\n\n // Center of bbox is now in stage coordinates. Convert to world coordinates.\n const cxStage = (minX + maxX) / 2;\n const cyStage = (minY + maxY) / 2;\n const world = this._core.nodes.world;\n const invWorld = world.getAbsoluteTransform().copy().invert();\n const ptWorld = invWorld.point({ x: cxStage, y: cyStage });\n return { x: ptWorld.x, y: ptWorld.y };\n }\n\n // Raise z-index of selected node (increment by 1)\n private _handleMoveUp(): void {\n const selected = this._getSelectedNodes();\n if (selected.length === 0) return;\n\n // Move each selected node one level forward\n for (const node of selected) {\n const konvaNode = node.getNode() as unknown as Konva.Node;\n\n // Skip changing z-index for single node inside a real group\n if (this._isNodeInsidePermanentGroup(konvaNode)) {\n continue;\n }\n\n const oldIndex = konvaNode.zIndex();\n konvaNode.moveUp();\n const newIndex = konvaNode.zIndex();\n\n // Check if z-index change is possible (for nodes inside groups)\n this._syncGroupZIndex(konvaNode);\n\n // Emit z-index change event\n if (this._core && oldIndex !== newIndex) {\n this._core.eventBus.emit('node:zIndexChanged', node, oldIndex, newIndex);\n }\n }\n\n if (this._core) {\n // Force redraw of the entire layer\n this._core.nodes.layer.draw();\n\n // Also redraw stage to update transformer\n this._core.stage.batchDraw();\n }\n }\n\n // Lower z-index of selected node (decrement by 1)\n private _handleMoveDown(): void {\n const selected = this._getSelectedNodes();\n if (selected.length === 0) return;\n\n // Move each selected node one level backward (in reverse order to avoid conflicts)\n for (let i = selected.length - 1; i >= 0; i--) {\n const node = selected[i];\n if (!node) continue;\n const konvaNode = node.getNode() as unknown as Konva.Node;\n\n // Skip changing z-index for single node inside a real group\n if (this._isNodeInsidePermanentGroup(konvaNode)) {\n continue;\n }\n\n const oldIndex = konvaNode.zIndex();\n konvaNode.moveDown();\n const newIndex = konvaNode.zIndex();\n\n // Check if z-index change is possible (for nodes inside groups)\n this._syncGroupZIndex(konvaNode);\n\n // Emit z-index change event\n if (this._core && oldIndex !== newIndex) {\n this._core.eventBus.emit('node:zIndexChanged', node, oldIndex, newIndex);\n }\n }\n\n if (this._core) {\n // Force redraw of the entire layer\n this._core.nodes.layer.draw();\n\n // Also redraw stage to update transformer\n this._core.stage.batchDraw();\n }\n }\n\n /**\n * Checks if the node is inside a real group (not the group itself)\n */\n private _isNodeInsidePermanentGroup(konvaNode: Konva.Node): boolean {\n // If it's the group itself, allow z-index change\n if (konvaNode instanceof Konva.Group) {\n return false;\n }\n\n const parent = konvaNode.getParent();\n if (!parent) return false;\n\n // If parent is a group (not world) - it's a real group\n return parent instanceof Konva.Group && parent.name() !== 'world';\n }\n\n /**\n * Checks if the node is inside a real group\n * - For group itself — do nothing (moveUp/moveDown already applied to the group)\n * - For node inside group — FORBIDDEN to change z-index\n */\n private _syncGroupZIndex(konvaNode: Konva.Node): void {\n const parent = konvaNode.getParent();\n if (!parent) return;\n\n // If it's the group itself, do nothing (moveUp/moveDown already applied to the group)\n // Children keep their relative order inside the group\n if (konvaNode instanceof Konva.Group) {\n return;\n }\n\n // If node inside group — FORBIDDEN to change z-index\n // Need to change z-index of the group, not individual nodes\n if (parent instanceof Konva.Group && parent.name() !== 'world') {\n // z-index change forbidden for nodes inside group\n return;\n }\n }\n}\n"]}
|