@inweb/markup 26.4.0 → 26.4.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/dist/markup.js +561 -126
- package/dist/markup.js.map +1 -1
- package/dist/markup.min.js +1 -1
- package/dist/markup.module.js +672 -138
- package/dist/markup.module.js.map +1 -1
- package/lib/markup/IMarkupArrow.d.ts +8 -8
- package/lib/markup/IMarkupCloud.d.ts +12 -5
- package/lib/markup/IMarkupEllipse.d.ts +4 -4
- package/lib/markup/IMarkupImage.d.ts +3 -3
- package/lib/markup/IMarkupLine.d.ts +2 -2
- package/lib/markup/IMarkupObject.d.ts +4 -0
- package/lib/markup/IMarkupRectangle.d.ts +10 -3
- package/lib/markup/IMarkupText.d.ts +3 -3
- package/lib/markup/Konva/KonvaArrow.d.ts +4 -1
- package/lib/markup/Konva/KonvaCloud.d.ts +4 -1
- package/lib/markup/Konva/KonvaEllipse.d.ts +4 -1
- package/lib/markup/Konva/KonvaImage.d.ts +4 -1
- package/lib/markup/Konva/KonvaLine.d.ts +4 -1
- package/lib/markup/Konva/KonvaMarkup.d.ts +2 -2
- package/lib/markup/Konva/KonvaRectangle.d.ts +4 -1
- package/lib/markup/Konva/KonvaText.d.ts +4 -1
- package/package.json +3 -3
- package/src/markup/IMarkupArrow.ts +8 -8
- package/src/markup/IMarkupCloud.ts +10 -5
- package/src/markup/IMarkupEllipse.ts +4 -4
- package/src/markup/IMarkupImage.ts +3 -3
- package/src/markup/IMarkupLine.ts +2 -2
- package/src/markup/IMarkupObject.ts +5 -0
- package/src/markup/IMarkupRectangle.ts +8 -3
- package/src/markup/IMarkupText.ts +3 -3
- package/src/markup/Konva/KonvaArrow.ts +49 -4
- package/src/markup/Konva/KonvaCloud.ts +110 -11
- package/src/markup/Konva/KonvaEllipse.ts +102 -2
- package/src/markup/Konva/KonvaImage.ts +60 -2
- package/src/markup/Konva/KonvaLine.ts +97 -3
- package/src/markup/Konva/KonvaMarkup.ts +182 -166
- package/src/markup/Konva/KonvaRectangle.ts +103 -4
- package/src/markup/Konva/KonvaText.ts +61 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markup.module.js","sources":["../src/markup/WorldTransform.ts","../src/markup/Konva/MarkupColor.ts","../src/markup/Konva/KonvaLine.ts","../src/markup/Konva/KonvaText.ts","../src/markup/Konva/KonvaRectangle.ts","../src/markup/Konva/KonvaEllipse.ts","../src/markup/Konva/KonvaArrow.ts","../src/markup/Konva/KonvaImage.ts","../src/markup/Konva/KonvaCloud.ts","../src/markup/Konva/KonvaMarkup.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IWorldTransform } from \"./IWorldTransform\";\n\nexport class WorldTransform implements IWorldTransform {\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n return { x: position.x, y: position.y, z: 0 };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n return { x: position.x, y: position.y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Defines the markup color helper object.\n */\nexport class MarkupColor {\n public R: number;\n public G: number;\n public B: number;\n public HEX: string;\n\n /**\n * Creates an instance of the color.\n *\n * @param r - The `red` component of the color, as a number between 0 and 255.\n * @param g - The `green` component of the color, as a number between 0 and 255.\n * @param b - The `blue` component of the color, as a number between 0 and 255.\n */\n constructor(r: number, g: number, b: number) {\n this.setColor(r, g, b);\n }\n\n /**\n * Returns the color as a string in hexadecimal color syntax `#RGB` using its primary color components\n * (red, green, blue) written as hexadecimal numbers.\n */\n public asHex(): string {\n return \"#\" + this.HEX;\n }\n\n /**\n * Returns the color as an {r, g, b} object.\n */\n public asRGB(): { r: number; g: number; b: number } {\n return { r: this.R, g: this.G, b: this.B };\n }\n\n /**\n * Sets the color.\n *\n * @param r - The `red` component of the color, as a number between 0 and 255.\n * @param g - The `green` component of the color, as a number between 0 and 255.\n * @param b - The `blue` component of the color, as a number between 0 and 255.\n */\n public setColor(r: number, g: number, b: number): void {\n this.R = r;\n this.G = g;\n this.B = b;\n this.HEX = this.rgbToHex(r, g, b);\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n const valueToHex = (c: number) => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupLine, IMarkupLineParams, MarkupLineType } from \"../IMarkupLine\";\n\nconst LineTypeSpecs = new Map<string, number[]>([\n [\"solid\", []],\n [\"dot\", [30, 30, 0.001, 30]],\n [\"dash\", [30, 30]],\n]);\n\nexport class KonvaLine implements IMarkupLine {\n private _ref: Konva.Line;\n\n constructor(params: IMarkupLineParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.points)\n params.points = [\n { x: 0, y: 0 },\n { x: 100, y: 100 },\n ];\n\n const konvaPoints = [];\n params.points.forEach((point) => konvaPoints.push(point.x, point.y));\n\n this._ref = new Konva.Line({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.width ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || [],\n });\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Line\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): number[] {\n return this._ref.points();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n getLineType(): string {\n const typeSpecs = this._ref.dash() || [];\n let type: MarkupLineType;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n\n setLineType(type: string) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n\n addPoints(points: [{ x: number; y: number }]) {\n let newPoints = this._ref.points();\n points.forEach((point) => {\n newPoints = newPoints.concat([point.x, point.y]);\n });\n\n this._ref.points(newPoints);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupText, IMarkupTextParams } from \"../IMarkupText\";\n\nexport class KonvaText implements IMarkupText {\n private _ref: Konva.Text;\n private readonly TEXT_FONT_FAMILY = \"Calibri\";\n\n constructor(params: IMarkupTextParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.text) params.text = \"default\";\n\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: params.fontSize ?? 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: params.color ?? \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: params.rotation ?? 0,\n });\n\n this._ref.width(this._ref.getTextWidth());\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 50;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < Math.round(this.getFontSize())) newHeight = Math.round(this.getFontSize());\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Text\";\n }\n\n getColor(): string {\n return this._ref.fill() as string;\n }\n\n setColor(hex: string): void {\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getText(): string {\n return this._ref.text();\n }\n\n setText(text: string): void {\n this._ref.text(text);\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n }\n\n getFontSize(): number {\n return this._ref.fontSize();\n }\n\n setFontSize(size: number): void {\n this._ref.fontSize(size);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupRectangle, IMarkupRectangleParams } from \"../IMarkupRectangle\";\n\nexport class KonvaRectangle implements IMarkupRectangle {\n private _ref: Konva.Rect;\n\n constructor(params: IMarkupRectangleParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n\n this._ref = new Konva.Rect({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 50;\n const minHeight = 50;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Rectangle\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupEllipse, IMarkupEllipseParams } from \"../IMarkupEllipse\";\n\nexport class KonvaEllipse implements IMarkupEllipse {\n private _ref: Konva.Ellipse;\n\n constructor(params: IMarkupEllipseParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.radius) params.radius = { x: 25, y: 25 };\n\n this._ref = new Konva.Ellipse({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newRadiusX = this._ref.radiusX();\n if (scaleByX) newRadiusX *= attrs.scaleX;\n let newRadiusY = this._ref.radiusY();\n if (scaleByY) newRadiusY *= attrs.scaleY;\n\n const minRadiusX = 25;\n const minRadiusY = 25;\n\n if (newRadiusX < minRadiusX) newRadiusX = minRadiusX;\n if (newRadiusY < minRadiusY) newRadiusY = minRadiusY;\n\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.radius({ x: newRadiusX, y: newRadiusX });\n } else {\n this._ref.radius({ x: newRadiusY, y: newRadiusY });\n }\n } else {\n this._ref.radius({ x: newRadiusX, y: newRadiusY });\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n }\n\n getRadiusX(): number {\n return this._ref.radiusX();\n }\n\n setRadiusX(r: number): void {\n this._ref.radiusX(r);\n }\n\n getRadiusY(): number {\n return this._ref.radiusY();\n }\n\n setRadiusY(r: number): void {\n this._ref.radiusY(r);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Ellipse\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupArrow, IMarkupArrowParams } from \"../IMarkupArrow\";\n\nexport class KonvaArrow implements IMarkupArrow {\n private _ref: Konva.Arrow;\n\n constructor(params: IMarkupArrowParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.start) params.start = { x: 0, y: 0 };\n if (!params.end) params.end = { x: 100, y: 100 };\n\n this._ref = new Konva.Arrow({\n stroke: params.color ?? \"#ff0000\",\n fill: params.color ?? \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [params.start.x, params.start.y, params.end.x, params.end.y],\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Arrow\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): { x: number; y: number }[] {\n const points = this._ref.points();\n return [\n { x: points[0], y: points[1] },\n { x: points[2], y: points[3] },\n ];\n }\n\n setPoints(points: { x: number; y: number }[]): void {\n if (points.length === 2) {\n this._ref.points([points[0].x, points[0].y, points[1].x, points[1].y]);\n }\n }\n\n getStartPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[0], y: points[1] };\n }\n\n setStartPoint(x: number, y: number): void {\n const points = this._ref.points();\n this._ref.points([x, y, points[2], points[3]]);\n }\n\n getEndPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[2], y: points[3] };\n }\n\n setEndPoint(x: number, y: number): void {\n const points = this._ref.points();\n this._ref.points([points[0], points[1], x, y]);\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupImage, IMarkupImageParams } from \"../IMarkupImage\";\n\nexport class KonvaImage implements IMarkupImage {\n private _ref: Konva.Image;\n private _canvasImage: HTMLImageElement;\n private _ratio = 1;\n private readonly EPSILON = 10e-6;\n private readonly BASE64_HEADER_START = \"data:image/\";\n private readonly BASE64_NOT_FOUND =\n \"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAmhJREFUWIXtlr9rVEEQxz+H8RQUJIdeIopYm0vkCg0GBBtbG1NF7Kxt7dR/IGIw/uhTaBNLERURg2kCEUyCYCPi70b0InjGS57FzOZN3r19d+9HJIVfWO52dma/s7Mz8xa2KAaBCWAR+AkECWOmSOIdwC1gtQOpHc+NfQ8wClQ8+1d0vcdH/lQ3bSIRGAZ2pTjAqNovANXIWlXlAXA2zvi2Ln4AjqYgtagYEutENSLvjRoOImFv5iB32Ae8UrLXwFBk3h9ndF0VJnKSO9gTu3yKu5Z1LKnS8YIcABgw5Ks692JZFXcXRJ46Aq6kikCnHNi/mQ50WwVtfaIoBzL3gRk2drSscJ2wrc4VvUoe2wn/41/iBfoVLRnBGnDSY3AAKacy8AmYR+o7K1zCl6wgrgpOAc/MuhvfgMuk+1JGHQgSBcAloKXy78AjYBppJk5/noTulseBMZ23iD/piHFkEdgTQzKk+5wHjmHC3cmBg0BD5xcSTrFXyQPgIWFtDwMvab+2N8DpbhyY1v/3E8gdDgNfVX9SCVZ0/gW4B0wB71S2BpxLcuCM/jaQSHSDEeAX4VMuAG4gTzyHbcAVXXO6GxxwIX+vvxe7JHcYQ07nHqklj96UIW/YhSWzMKcep8VVtf8B1Dw6h4DfhB+sdbgn2R+gnoEc5NR3dZ+3QJ9H74HqXLPCGlJyTfI9y3YCs0owq3OLOpKkLeBI1HhSDT/mdKIPiUCARMTlQx34TMLjtww8IczmO8AJ/N/2JNSQXAiQ671JePePge0+wzJSQq4FFzlaenIvucUAkiQLhC/mLGNZ9xgn5s63BP4CCk0QDtm4BhoAAAAASUVORK5CYII=\";\n\n constructor(params: IMarkupImageParams, ref = null) {\n if (ref) {\n if (!ref.src || !ref.src.startsWith(this.BASE64_HEADER_START)) ref.src = this.BASE64_NOT_FOUND;\n if (ref.height() <= this.EPSILON) ref.height(32);\n if (ref.width() <= this.EPSILON) ref.width(32);\n\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio =\n this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON\n ? 1\n : this._ref.height() / this._ref.width();\n\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.src || !params.src.startsWith(this.BASE64_HEADER_START)) params.src = this.BASE64_NOT_FOUND;\n\n this._canvasImage = new Image();\n\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n if (this._ref.height() <= this.EPSILON) this._ref.height(this._canvasImage.height);\n if (this._ref.width() <= this.EPSILON) this._ref.width(this._canvasImage.width);\n\n this._ratio =\n this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON\n ? 1\n : this._ref.height() / this._ref.width();\n\n // need to rescale only if input width and height are 0 - we do not loading Viewpoint with existing params\n if (\n (params.width <= this.EPSILON || params.height <= this.EPSILON) &&\n (params.maxWidth >= this.EPSILON || params.maxWidth >= this.EPSILON)\n ) {\n const heightOutOfCanvas = params.maxHeight - this._canvasImage.height;\n const widthOutOfCanvas = params.maxWidth - this._canvasImage.width;\n\n if (heightOutOfCanvas <= this.EPSILON || widthOutOfCanvas <= this.EPSILON) {\n if (widthOutOfCanvas <= this.EPSILON && widthOutOfCanvas < heightOutOfCanvas / this._ratio) {\n this._ref.height(params.maxWidth * this._ratio);\n this._ref.width(params.maxWidth);\n } else {\n this._ref.width(params.maxHeight / this._ratio);\n this._ref.height(params.maxHeight);\n }\n }\n }\n };\n\n this._canvasImage.onerror = () => {\n this._canvasImage.onerror = function () {};\n this._canvasImage.src = this.BASE64_NOT_FOUND;\n };\n\n this._canvasImage.src = params.src;\n\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: params.width ?? 0,\n height: params.height ?? 0,\n draggable: true,\n });\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.width(newWidth);\n this._ref.height(newWidth * this._ratio);\n } else {\n this._ref.width(newHeight / this._ratio);\n this._ref.height(newHeight);\n }\n } else {\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getSrc(): string {\n return this._canvasImage.src;\n }\n\n setSrc(src: any) {\n this._canvasImage.src = src;\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n\n getHeight(): number {\n return this._ref.height();\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Image\";\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n }\n}\n","import Konva from \"konva\";\nimport { IMarkupCloud, IMarkupCloudParams } from \"../IMarkupCloud\";\n\nexport class KonvaCloud implements IMarkupCloud {\n private _ref: Konva.Shape;\n\n constructor(params: IMarkupCloudParams, ref = null) {\n if (ref) {\n this._ref = ref;\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n\n const arcRadius = 16;\n\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return { x: midX, y: midY };\n }\n\n const points = [\n { x: 0, y: 0 },\n { x: 0 + this._ref.width(), y: 0 },\n { x: 0 + this._ref.width(), y: 0 + this._ref.height() },\n { x: 0, y: 0 + this._ref.height() },\n { x: 0, y: 0 },\n ];\n\n const midPoint = calculateMidpoint({ x: 0, y: 0 }, this._ref.width(), this._ref.height());\n\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, arcRadius, endAngle, startAngle);\n } else {\n context.arc(pX, pY, arcRadius, startAngle, endAngle);\n }\n\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n\n context.closePath();\n // (!) Konva specific method, it is very important\n // it will apply are required styles\n context.fillStrokeShape(shape);\n },\n });\n\n this._ref.className = \"Cloud\";\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 100;\n const minHeight = 100;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.getSelfRect = () => {\n return {\n x: 0 - arcRadius,\n y: 0 - arcRadius,\n width: this._ref.width() + 2 * arcRadius,\n height: this._ref.height() + 2 * arcRadius,\n };\n };\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Cloud\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete() {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition() {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.position({ x, y });\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IEventEmitter } from \"@inweb/eventemitter2\";\nimport {\n ChangeActiveDraggerEvent,\n IArrow,\n ICloud,\n IEllipse,\n IImage,\n ILine,\n IRectangle,\n IText,\n IViewpoint,\n PanEvent,\n ZoomAtEvent,\n} from \"@inweb/viewer-core\";\n\nimport { IMarkup, MarkupMode } from \"../IMarkup\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\nimport { IMarkupObject } from \"../IMarkupObject\";\nimport { MarkupLineType } from \"../IMarkupLine\";\nimport { MarkupColor } from \"./MarkupColor\";\nimport { KonvaLine } from \"./KonvaLine\";\nimport { KonvaText } from \"./KonvaText\";\nimport { KonvaRectangle } from \"./KonvaRectangle\";\nimport { KonvaEllipse } from \"./KonvaEllipse\";\nimport { KonvaArrow } from \"./KonvaArrow\";\nimport { KonvaImage } from \"./KonvaImage\";\nimport { KonvaCloud } from \"./KonvaCloud\";\n\nconst MarkupMode2Konva = {\n SelectMarkup: {\n name: \"SelectMarkup\",\n initializer: null,\n },\n Line: {\n name: \"Line\",\n initializer: (ref: any, params = null) => new KonvaLine(params, ref),\n },\n Text: {\n name: \"Text\",\n initializer: (ref: any, params = null) => new KonvaText(params, ref),\n },\n Rectangle: {\n name: \"Rect\",\n initializer: (ref: any, params = null) => new KonvaRectangle(params, ref),\n },\n Ellipse: {\n name: \"Ellipse\",\n initializer: (ref: any, params = null) => new KonvaEllipse(params, ref),\n },\n Arrow: {\n name: \"Arrow\",\n initializer: (ref: any, params = null) => new KonvaArrow(params, ref),\n },\n Image: {\n name: \"Image\",\n initializer: (ref: any, params = null) => new KonvaImage(params, ref),\n },\n Cloud: {\n name: \"Cloud\",\n initializer: (ref: any, params = null) => new KonvaCloud(params, ref),\n },\n};\n\n/**\n * 2D markup core.\n */\nexport class KonvaMarkup implements IMarkup {\n private _viewer: IEventEmitter;\n private _worldTransformer: IWorldTransform;\n private _container: HTMLElement;\n private _containerEvents: string[] = [];\n private _markupIsActive = false;\n private _markupMode: MarkupMode;\n private _markupColor = new MarkupColor(255, 0, 0);\n private _konvaStage: Konva.Stage;\n private _konvaLayer: Konva.Layer;\n private _konvaTransformer: Konva.Transformer;\n\n private _textInputRef: HTMLTextAreaElement;\n private _textInputPos: Konva.Vector2d;\n private _textInputAngle: number;\n private _imageInputRef: HTMLInputElement;\n private _imageInputPos: Konva.Vector2d;\n private _markupContainer: HTMLDivElement;\n private _resizeObserver: ResizeObserver;\n private _groupImages: Konva.Group;\n private _groupGeometry: Konva.Group;\n private _groupTexts: Konva.Group;\n\n public lineWidth = 4;\n public lineType: MarkupLineType = \"solid\";\n public fontSize = 34;\n\n initialize(\n container: HTMLElement,\n containerEvents?: string[],\n viewer?: IEventEmitter,\n worldTransformer?: IWorldTransform\n ): void {\n if (!Konva)\n throw new Error(\n 'Markup error: Konva is not initialized. Forgot to add <script src=\"https://unpkg.com/konva@9/konva.min.js\"></script> to your page?'\n );\n\n this._viewer = viewer;\n this._worldTransformer = worldTransformer ?? new WorldTransform();\n this._container = container;\n this._containerEvents = containerEvents ?? [];\n\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = \"markup-container\";\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n this._markupContainer.style.outline = \"0px\"; // <- to eliminate grey box during delete elements\n this._markupContainer.style.pointerEvents = \"none\";\n\n const parentDiv = this._container.parentElement;\n parentDiv.appendChild(this._markupContainer);\n\n this._resizeObserver = new ResizeObserver(this.resizeContainer);\n this._resizeObserver.observe(parentDiv);\n\n this._markupColor.setColor(255, 0, 0);\n\n this.initializeKonva();\n\n if (this._viewer) {\n // this._containerEvents.forEach((x) => this._markupContainer.addEventListener(x, this.redirectToViewer));\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n this._viewer.addEventListener(\"zoomat\", this.zoomAt);\n }\n }\n\n dispose(): void {\n if (this._viewer) {\n this._viewer.removeEventListener(\"zoomat\", this.zoomAt);\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n // this._containerEvents.forEach((x) => this._markupContainer.removeEventListener(x, this.redirectToViewer));\n }\n\n this.destroyKonva();\n\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n\n this._markupContainer?.remove();\n this._markupContainer = undefined;\n\n this._container = undefined;\n this._viewer = undefined;\n this._worldTransformer = undefined;\n\n this._markupIsActive = false;\n }\n\n changeActiveDragger = (event: ChangeActiveDraggerEvent) => {\n const draggerName = event.data;\n\n this._markupContainer.className = this._container.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${draggerName.toLowerCase()}`)\n .join(\" \");\n\n this.removeTextInput();\n this.removeImageInput();\n\n this.enableEditMode(draggerName as MarkupMode);\n };\n\n resizeContainer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible container, or container with parent removed\n if (!this._konvaStage) return;\n\n this._konvaStage.width(width);\n this._konvaStage.height(height);\n };\n\n pan = (event: PanEvent) => {\n const newPos = {\n x: this._konvaStage.x() + event.dX,\n y: this._konvaStage.y() + event.dY,\n };\n this._konvaStage.position(newPos);\n };\n\n zoomAt = (event: ZoomAtEvent) => {\n const newScale = this._konvaStage.scaleX() * event.data;\n this._konvaStage.scale({ x: newScale, y: newScale });\n\n const newPos = {\n x: event.x - (event.x - this._konvaStage.x()) * event.data,\n y: event.y - (event.y - this._konvaStage.y()) * event.data,\n };\n this._konvaStage.position(newPos);\n };\n\n redirectToViewer = (event: any) => {\n if (this._viewer) this._viewer.emit(event);\n };\n\n syncOverlay(): void {}\n\n clearOverlay(): void {\n this.removeTextInput();\n this.removeImageInput();\n this.clearSelected();\n this.getObjects().forEach((obj) => obj.delete());\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor.asRGB();\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n this._markupColor.setColor(r, g, b);\n this.redirectToViewer({ type: \"changemarkupcolor\", data: { r, g, b } });\n }\n\n colorizeAllMarkup(r: number, g: number, b: number): void {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getObjects().filter((obj: any) => obj.setColor?.(hexColor));\n }\n\n colorizeSelectedMarkups(r: number, g: number, b: number): void {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getSelectedObjects().filter((obj: any) => obj.setColor?.(hexColor));\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._konvaStage.scale({ x: 1, y: 1 });\n this._konvaStage.position({ x: 0, y: 0 });\n\n const markupColor = viewpoint.custom_fields?.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n viewpoint.lines?.forEach((line: ILine) => {\n const linePoints = [];\n line.points.forEach((point) => {\n const screenPoint = this._worldTransformer.worldToScreen(point);\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n });\n this.addLine(linePoints, line.color, line.type as MarkupLineType, line.width, line.id);\n });\n\n viewpoint.texts?.forEach((text: IText) => {\n const screenPoint = this._worldTransformer.worldToScreen(text.position);\n this.addText(text.text, screenPoint, text.angle, text.color, text.text_size, text.font_size, text.id);\n });\n\n viewpoint.rectangles?.forEach((rect: IRectangle) => {\n const screenPoint = this._worldTransformer.worldToScreen(rect.position);\n this.addRectangle(screenPoint, rect.width, rect.height, rect.line_width, rect.color, rect.id);\n });\n\n viewpoint.ellipses?.forEach((ellipse: IEllipse) => {\n const screenPoint = this._worldTransformer.worldToScreen(ellipse.position);\n this.addEllipse(screenPoint, ellipse.radius, ellipse.line_width, ellipse.color, ellipse.id);\n });\n\n viewpoint.arrows?.forEach((arrow: IArrow) => {\n const startPoint = this._worldTransformer.worldToScreen(arrow.start);\n const endPoint = this._worldTransformer.worldToScreen(arrow.end);\n this.addArrow(startPoint, endPoint, arrow.color, arrow.id);\n });\n\n viewpoint.clouds?.forEach((cloud: ICloud) => {\n const screenPoint = this._worldTransformer.worldToScreen(cloud.position);\n this.addCloud(screenPoint, cloud.width, cloud.height, cloud.line_width, cloud.color, cloud.id);\n });\n\n viewpoint.images?.forEach((image: IImage) => {\n const screenPoint = this._worldTransformer.worldToScreen(image.position);\n this.addImage(screenPoint, image.src, image.width, image.height, image.id);\n });\n }\n\n getViewpoint(viewpoint: IViewpoint): IViewpoint {\n if (!viewpoint) viewpoint = {};\n\n viewpoint.lines = this.getMarkupLines();\n viewpoint.texts = this.getMarkupTexts();\n viewpoint.arrows = this.getMarkupArrows();\n viewpoint.clouds = this.getMarkupClouds();\n viewpoint.ellipses = this.getMarkupEllipses();\n viewpoint.images = this.getMarkupImages();\n viewpoint.rectangles = this.getMarkupRectangles();\n\n viewpoint.custom_fields = { markup_color: this.getMarkupColor() };\n viewpoint.snapshot = { data: this.combineMarkupWithDrawing() };\n\n return viewpoint;\n }\n\n enableEditMode(mode: MarkupMode | false): this {\n if (!mode || !MarkupMode2Konva[mode]) {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._markupContainer.style.pointerEvents = \"none\";\n this._markupIsActive = false;\n } else {\n this._markupMode = mode;\n this._markupContainer.style.pointerEvents = \"all\";\n this._markupIsActive = true;\n }\n return this;\n }\n\n createObject(type: string, params: any): IMarkupObject {\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer)\n throw new Error(`Markup CreateObject - unsupported markup type ${type}`);\n\n const object = konvaShape.initializer(null, params);\n this.addObject(object);\n\n return object;\n }\n\n getObjects(): IMarkupObject[] {\n const objects = [];\n Object.keys(MarkupMode2Konva).forEach((type) => {\n const konvaShape = MarkupMode2Konva[type];\n this.konvaLayerFind(type).forEach((ref) => objects.push(konvaShape.initializer(ref)));\n });\n return objects;\n }\n\n getSelectedObjects(): IMarkupObject[] {\n if (!this._konvaTransformer) return [];\n\n return this._konvaTransformer\n .nodes()\n .map((ref) => {\n const name = ref.className;\n const konvaShape = Object.values(MarkupMode2Konva).find((shape) => shape.name === name);\n return konvaShape ? konvaShape.initializer(ref) : null;\n })\n .filter((x) => x);\n }\n\n selectObjects(objects: IMarkupObject[]) {\n if (!this._konvaTransformer) return;\n\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x) => x.ref()));\n this._konvaTransformer.nodes(selectedObjs);\n }\n\n clearSelected(): void {\n if (this._konvaTransformer) this._konvaTransformer.nodes([]);\n }\n\n private addObject(object: IMarkupObject): void {\n if (object.type() === \"Image\") this._groupImages.add(object.ref());\n else if (object.type() === \"Text\") this._groupTexts.add(object.ref());\n else this._groupGeometry.add(object.ref());\n }\n\n private konvaLayerFind(type: string): any {\n if (!this._konvaLayer) return [];\n\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) return [];\n\n // for \"draggable\" Konva uses Rectangles in Transformer. We need only Shapes from layer.\n return this._konvaLayer\n .find(konvaShape.name)\n .filter(\n (ref) =>\n ref.parent === this._konvaLayer ||\n ref.parent === this._groupImages ||\n ref.parent === this._groupGeometry ||\n ref.parent === this._groupTexts\n );\n }\n\n private getRelativePointPosition = (point, node) => {\n // the function will return pointer position relative to the passed node\n const transform = node.getAbsoluteTransform().copy();\n // to detect relative position we need to invert transform\n transform.invert();\n // get pointer (say mouse or touch) position\n // now we find relative point\n return transform.point(point);\n };\n\n private getRelativePointerPosition = (node) => {\n return this.getRelativePointPosition(node.getStage().getPointerPosition(), node);\n };\n\n private initializeKonva(): any {\n // first we need Konva core things: stage and layer\n const stage = new Konva.Stage({\n container: this._markupContainer,\n width: this._container.clientWidth,\n height: this._container.clientHeight,\n });\n this._konvaStage = stage;\n\n const layer = new Konva.Layer({ pixelRation: window.devicePixelRatio });\n stage.add(layer);\n\n this._groupImages = new Konva.Group();\n layer.add(this._groupImages);\n this._groupGeometry = new Konva.Group();\n layer.add(this._groupGeometry);\n this._groupTexts = new Konva.Group();\n layer.add(this._groupTexts);\n\n this._konvaLayer = layer;\n\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n keepRatio: false,\n flipEnabled: false,\n });\n layer.add(transformer);\n this._konvaTransformer = transformer;\n\n let isPaint = false;\n let lastLine;\n let mouseDownPos;\n let lastObj;\n\n stage.on(\"mousedown touchstart\", (e) => {\n // do nothing if we mousedown on any shape\n if (!this._markupIsActive || e.target !== stage || this._markupMode === \"Text\" || this._markupMode === \"Image\")\n return;\n\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n\n const pos = this.getRelativePointerPosition(stage);\n mouseDownPos = pos;\n\n isPaint = [\"Arrow\", \"Cloud\", \"Ellipse\", \"Line\", \"Rectangle\"].some((m) => m === this._markupMode);\n if (this._markupMode === \"Line\") {\n // add point twice, so we have some drawings even on a simple click\n lastLine = this.addLine([pos.x, pos.y, pos.x, pos.y]);\n }\n });\n\n stage.on(\"mouseup touchend\", (e) => {\n if (!this._markupIsActive) return;\n\n if (isPaint) {\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (defParams) {\n if (this._markupMode === \"Rectangle\") {\n this.addRectangle({ x: startX, y: startY }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n this.addEllipse({ x: startX, y: startY }, { x: dX / 2, y: dY / 2 });\n } else if (this._markupMode === \"Arrow\") {\n this.addArrow(\n { x: mouseDownPos.x, y: mouseDownPos.y },\n { x: defParams ? mouseDownPos.x + 200 : pos.x, y: defParams ? startY : pos.y }\n );\n } else if (this._markupMode === \"Cloud\") {\n this.addCloud({ x: startX, y: startY }, Math.max(100, dX), Math.max(100, dY));\n }\n }\n }\n\n lastObj = undefined;\n isPaint = false;\n });\n\n stage.on(\"mousemove touchmove\", (e) => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n\n // prevent scrolling on touch devices\n //e.evt.preventDefault();\n\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n\n if (this._markupMode === \"Line\") {\n lastLine.addPoints([{ x: pos.x, y: pos.y }]);\n } else if (this._markupMode === \"Arrow\") {\n if (lastObj) lastObj.setEndPoint(pos.x, pos.y);\n else lastObj = this.addArrow({ x: mouseDownPos.x, y: mouseDownPos.y }, { x: pos.x, y: pos.y });\n } else if (this._markupMode === \"Rectangle\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(dX);\n lastObj.setHeight(dY);\n } else lastObj = this.addRectangle({ x: startX, y: startY }, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setRadiusX(dX);\n lastObj.setRadiusY(dY);\n } else lastObj = this.addEllipse({ x: startX, y: startY }, { x: dX, y: dY });\n } else if (this._markupMode === \"Cloud\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(Math.max(100, dX));\n lastObj.setHeight(Math.max(100, dY));\n } else lastObj = this.addCloud({ x: startX, y: startY }, dX, dY);\n }\n });\n\n // clicks should select/deselect shapes\n stage.on(\"click tap\", (e) => {\n if (!this._markupIsActive) return;\n\n // if click on empty area - remove all selections\n if (e.target === stage) {\n if (this._markupMode === \"Text\") {\n if (this._textInputRef && this._textInputRef.value)\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n } else if (this._markupMode === \"Image\") {\n if (this._imageInputRef && this._imageInputRef.value)\n this.addImage(\n { x: this._imageInputPos.x, y: this._imageInputPos.y },\n this._imageInputRef.value,\n 0,\n 0,\n this._imageInputRef.value\n );\n else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createImageInput(pos);\n }\n }\n transformer.nodes([]);\n return;\n }\n\n if (this._markupMode === \"Text\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef && this._textInputRef.value)\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else\n this.createTextInput(\n { x: e.target.attrs.x, y: e.target.attrs.y },\n e.evt.pageX,\n e.evt.pageY,\n e.target.attrs.rotation,\n e.target.attrs.text\n );\n return;\n } else {\n this.removeTextInput();\n }\n }\n\n if (this._markupMode === \"Image\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Image\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._imageInputRef && this._imageInputRef.value)\n this.addImage(this._imageInputPos, this._imageInputRef.value, 0, 0);\n else this.createImageInput({ x: e.target.attrs.x, y: e.target.attrs.y });\n return;\n } else {\n this.removeImageInput();\n }\n }\n\n if (\n transformer.nodes().filter((x) => x.className === \"Cloud\" || x.className === \"Image\").length > 0 ||\n e.target.className === \"Cloud\" ||\n e.target.className === \"Image\"\n ) {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n\n // do we pressed shift or ctrl?\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n\n if (!metaPressed && !isSelected) {\n // if no key pressed and the node is not selected\n // select just one\n transformer.nodes([e.target]);\n } else if (metaPressed && isSelected) {\n // if we pressed keys and node was selected\n // we need to remove it from selection:\n const nodes = transformer.nodes().slice(); // use slice to have new copy of array\n // remove node from array\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n // add the node into selection\n const nodes = transformer.nodes().concat([e.target]);\n transformer.nodes(nodes);\n }\n });\n\n const container = stage.container();\n container.tabIndex = 1;\n // focus it\n // also stage will be in focus on its click\n container.focus();\n\n container.addEventListener(\"keydown\", (e) => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n this.getSelectedObjects().forEach((obj: IMarkupObject) => obj.delete());\n this.clearSelected();\n return;\n }\n e.preventDefault();\n });\n }\n\n private destroyKonva() {\n this.removeTextInput();\n this.removeImageInput();\n this.clearOverlay();\n\n this._konvaStage?.destroy();\n\n this._groupImages = undefined;\n this._groupGeometry = undefined;\n this._groupTexts = undefined;\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n\n private getMarkupLines(): Array<ILine> {\n const lines = [];\n\n this.konvaLayerFind(\"Line\").forEach((ref) => {\n const linePoints = ref.points();\n if (!linePoints) return;\n\n const worldPoints = [];\n const absoluteTransform = ref.getAbsoluteTransform();\n for (let i = 0; i < linePoints.length; i += 2) {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n // https://stackoverflow.com/a/57641487 - check answer's comments\n const atPoint = absoluteTransform.point({\n x: linePoints[i],\n y: linePoints[i + 1],\n });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n\n worldPoints.push(worldPoint);\n }\n\n const konvaLine = new KonvaLine(null, ref);\n const line: ILine = {\n id: konvaLine.id(),\n points: worldPoints,\n color: konvaLine.getColor() || \"#ff0000\",\n type: konvaLine.getLineType() || this.lineType,\n width: konvaLine.getLineWidth() || this.lineWidth,\n };\n\n lines.push(line);\n });\n\n return lines;\n }\n\n private getMarkupTexts(): Array<IText> {\n const texts = [];\n\n this.konvaLayerFind(\"Text\").forEach((ref) => {\n const textSize = 0.02;\n const textScale = this._worldTransformer.getScale();\n\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({ x: position.x, y: position.y });\n\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n\n const shape = new KonvaText(null, ref);\n const text: IText = {\n id: shape.id(),\n position: worldPoint,\n text: shape.getText(),\n text_size: textSize * textScale.y,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize() * stageAbsoluteTransform.getMatrix()[0],\n };\n\n texts.push(text);\n });\n\n return texts;\n }\n\n private getMarkupRectangles(): Array<IRectangle> {\n const rectangles = [];\n\n this.konvaLayerFind(\"Rectangle\").forEach((ref) => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({ x: position.x, y: position.y });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaRectangle(null, ref);\n const rectangle: IRectangle = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n rectangles.push(rectangle);\n });\n\n return rectangles;\n }\n\n private getMarkupEllipses(): Array<IEllipse> {\n const ellipses = [];\n\n this.konvaLayerFind(\"Ellipse\").forEach((ref) => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({ x: position.x, y: position.y });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaEllipse(null, ref);\n const ellipse: IEllipse = {\n id: shape.id(),\n position: worldPoint,\n radius: {\n x: ref.getRadiusX() * scale,\n y: ref.getRadiusY() * scale,\n },\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n ellipses.push(ellipse);\n });\n\n return ellipses;\n }\n\n private getMarkupArrows(): Array<IArrow> {\n const arrows = [];\n\n this.konvaLayerFind(\"Arrow\").forEach((ref) => {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n const absoluteTransform = ref.getAbsoluteTransform();\n\n const atStartPoint = absoluteTransform.point({\n x: ref.points()[0],\n y: ref.points()[1],\n });\n const worldStartPoint = this._worldTransformer.screenToWorld(atStartPoint);\n\n const atEndPoint = absoluteTransform.point({\n x: ref.points()[2],\n y: ref.points()[3],\n });\n const worldEndPoint = this._worldTransformer.screenToWorld(atEndPoint);\n\n const shape = new KonvaArrow(null, ref);\n const arrow: IArrow = {\n id: shape.id(),\n start: worldStartPoint,\n end: worldEndPoint,\n color: shape.getColor(),\n };\n\n arrows.push(arrow);\n });\n\n return arrows;\n }\n\n private getMarkupImages(): Array<IImage> {\n const images = [];\n\n this.konvaLayerFind(\"Image\").forEach((ref) => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({ x: position.x, y: position.y });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaImage(null, ref);\n const image: IImage = {\n id: shape.id(),\n position: worldPoint,\n src: shape.getSrc(),\n width: shape.getWidth() * scale,\n height: shape.getHeight() * scale,\n };\n\n images.push(image);\n });\n\n return images;\n }\n\n private getMarkupClouds(): Array<ICloud> {\n const clouds = [];\n\n this.konvaLayerFind(\"Cloud\").forEach((ref) => {\n const position = ref.position();\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const atPoint = stageAbsoluteTransform.point({ x: position.x, y: position.y });\n const worldPoint = this._worldTransformer.screenToWorld(atPoint);\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaCloud(null, ref);\n const cloud: ICloud = {\n id: shape.id(),\n position: worldPoint,\n width: shape.getWidth() * scale,\n height: shape.getHeigth() * scale,\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n clouds.push(cloud);\n });\n\n return clouds;\n }\n\n private combineMarkupWithDrawing() {\n this.clearSelected();\n\n const tempCanvas = document.createElement(\"canvas\");\n if (this._konvaStage) {\n tempCanvas.width = this._konvaStage.width();\n tempCanvas.height = this._konvaStage.height();\n\n const ctx = tempCanvas.getContext(\"2d\");\n if (this._container instanceof HTMLCanvasElement) ctx.drawImage(this._container, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({ pixelRatio: window.devicePixelRatio }), 0, 0);\n }\n\n return tempCanvas.toDataURL(\"image/jpeg\", 0.25);\n }\n\n private addLine(\n linePoints: number[],\n color?: string,\n type?: MarkupLineType,\n width?: number,\n id?: string\n ): KonvaLine | void {\n if (!linePoints || linePoints.length === 0) return;\n\n const points: { x: number; y: number }[] = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({ x: linePoints[i], y: linePoints[i + 1] });\n }\n\n const konvaLine = new KonvaLine({\n points,\n type: type || this.lineType,\n width: width || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n });\n\n this.addObject(konvaLine);\n return konvaLine;\n }\n\n private createTextInput(pos: Konva.Vector2d, inputX: number, inputY: number, angle: number, text: string): void {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.style.fontSize = `${this.fontSize}px`;\n this._textInputRef.style.color = `${this._markupColor.asHex()}`;\n this._textInputRef.style.fontFamily = \"Calibri\";\n\n this._textInputRef.onkeydown = (event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n\n setTimeout(() => {\n this._textInputRef.focus();\n }, 50);\n } else {\n this.removeTextInput();\n }\n }\n\n private removeTextInput(): void {\n this._textInputRef?.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n\n private createImageInput(pos: Konva.Vector2d): void {\n if (!this._imageInputRef) {\n const convertBase64 = (file) => {\n return new Promise<string | ArrayBuffer>((resolve, reject) => {\n const fileReader = new FileReader();\n fileReader.readAsDataURL(file);\n\n fileReader.onload = () => {\n resolve(fileReader.result);\n };\n\n fileReader.onerror = (error) => {\n reject(error);\n };\n });\n };\n\n this._imageInputPos = pos;\n this._imageInputRef = document.createElement(\"input\");\n this._imageInputRef.style.display = \"none\";\n this._imageInputRef.type = \"file\";\n this._imageInputRef.accept = \"image/png, image/jpeg\";\n this._imageInputRef.onchange = async (event) => {\n const file = (event.target as HTMLInputElement).files[0];\n const base64 = await convertBase64(file);\n this.addImage({ x: this._imageInputPos.x, y: this._imageInputPos.y }, base64.toString(), 0, 0);\n };\n this._imageInputRef.oncancel = (event) => {\n this.removeImageInput();\n };\n document.body.appendChild(this._imageInputRef);\n\n setTimeout(() => {\n this._imageInputRef.click();\n }, 50);\n } else {\n this.removeImageInput();\n }\n }\n\n private removeImageInput(): void {\n this._imageInputRef?.remove();\n this._imageInputRef = null;\n this._imageInputPos = null;\n }\n\n private addText(\n text: string,\n position: Konva.Vector2d,\n angle?: number,\n color?: string,\n textSize?: number,\n fontSize?: number,\n id?: string\n ): KonvaText | void {\n if (!text) return;\n\n // in case of edit - remove old Konva.Text object\n this.getSelectedObjects().at(0)?.delete();\n\n this.clearSelected();\n this.removeTextInput();\n\n // in case we have old viewpoint without font_size\n const tolerance = 1.0e-6;\n if (textSize && textSize > tolerance && (!fontSize || fontSize < tolerance)) {\n const size = 0.02;\n const scale = this._worldTransformer.getScale();\n fontSize = textSize / (scale.y / size) / 34;\n }\n\n const konvaText = new KonvaText({\n position: { x: position.x, y: position.y },\n text,\n rotation: angle,\n fontSize: fontSize || this.fontSize,\n color: color || this._markupColor.asHex(),\n id,\n });\n\n this.addObject(konvaText);\n return konvaText;\n }\n\n private addRectangle(\n position: Konva.Vector2d,\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaRectangle | void {\n if (!position) return;\n\n const konvaRectangle = new KonvaRectangle({\n position,\n width,\n height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n });\n\n this.addObject(konvaRectangle);\n return konvaRectangle;\n }\n\n private addEllipse(\n position: { x: number; y: number },\n radius: { x: number; y: number },\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaEllipse | void {\n if (!position) return;\n\n const konvaEllipse = new KonvaEllipse({\n position,\n radius,\n lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n });\n\n this.addObject(konvaEllipse);\n return konvaEllipse;\n }\n\n private addArrow(\n start: { x: number; y: number },\n end: { x: number; y: number },\n color?: string,\n id?: string\n ): KonvaArrow | void {\n if (!start || !end) return;\n\n const konvaArrow = new KonvaArrow({\n start,\n end,\n color: color || this._markupColor.asHex(),\n id,\n });\n\n this.addObject(konvaArrow);\n return konvaArrow;\n }\n\n private addCloud(\n position: { x: number; y: number },\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaCloud | void {\n if (!position || !width || !height) return;\n\n const konvaCloud = new KonvaCloud({\n position,\n width,\n height,\n color: color || this._markupColor.asHex(),\n lineWidth: lineWidth || this.lineWidth,\n id,\n });\n\n this.addObject(konvaCloud);\n return konvaCloud;\n }\n\n private addImage(\n position: { x: number; y: number },\n src: string,\n width?: number,\n height?: number,\n id?: string\n ): KonvaImage | void {\n if (!position || !src) return;\n\n // in case of edit - remove old Image placeholder object\n this.getSelectedObjects().at(0)?.delete();\n\n this.clearSelected();\n this.removeImageInput();\n\n const konvaImage = new KonvaImage({\n position,\n src,\n width,\n height,\n maxWidth: this._konvaStage.width() - position.x,\n maxHeight: this._konvaStage.height() - position.y,\n id,\n });\n\n this.addObject(konvaImage);\n return konvaImage;\n }\n}\n"],"names":["WorldTransform","screenToWorld","position","x","y","z","worldToScreen","getScale","MarkupColor","constructor","r","g","b","this","setColor","asHex","HEX","asRGB","R","G","B","rgbToHex","valueToHex","c","hex","toString","LineTypeSpecs","Map","KonvaLine","params","ref","_ref","points","konvaPoints","forEach","point","push","Konva","Line","stroke","_a","color","strokeWidth","_b","width","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","get","type","on","e","attrs","target","rotation","id","_id","enableMouseEditing","value","getColor","getRotation","setRotation","degrees","getZIndex","zIndex","setZIndex","destroy","getPoints","setLineWidth","size","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","concat","KonvaText","TEXT_FONT_FAMILY","text","Text","fontSize","fontFamily","fill","align","_c","getTextWidth","scaleByX","Math","abs","scaleX","scaleByY","scaleY","newWidth","newHeight","height","minWidth","round","getFontSize","scale","getText","setText","getPosition","setPosition","setFontSize","KonvaRectangle","Rect","lineWidth","_d","minHeight","getWidth","getHeigth","setWidth","w","setHeight","h","KonvaEllipse","radius","Ellipse","radiusX","radiusY","newRadiusX","newRadiusY","minRadiusX","minRadiusY","evt","ctrlKey","shiftKey","getRadiusX","setRadiusX","getRadiusY","setRadiusY","KonvaArrow","start","end","Arrow","setPoints","length","getStartPoint","setStartPoint","getEndPoint","setEndPoint","KonvaImage","_ratio","EPSILON","BASE64_HEADER_START","BASE64_NOT_FOUND","src","startsWith","_canvasImage","image","Image","onload","maxWidth","heightOutOfCanvas","maxHeight","widthOutOfCanvas","onerror","getSrc","setSrc","getHeight","KonvaCloud","arcRadius","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","dx","dy","sqrt","arcCount","floor","lengthMod","pX","pY","pEndX","pEndY","endAngle","atan","startAngle","PI","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","getSelfRect","MarkupMode2Konva","SelectMarkup","name","initializer","Rectangle","Cloud","KonvaMarkup","_containerEvents","_markupIsActive","_markupColor","lineType","changeActiveDragger","event","draggerName","data","_markupContainer","_container","split","filter","toLowerCase","join","removeTextInput","removeImageInput","enableEditMode","resizeContainer","entries","contentRect","_konvaStage","pan","newPos","dX","dY","zoomAt","newScale","redirectToViewer","_viewer","emit","getRelativePointPosition","node","transform","getAbsoluteTransform","copy","invert","getRelativePointerPosition","getStage","getPointerPosition","initialize","container","containerEvents","viewer","worldTransformer","Error","_worldTransformer","undefined","document","createElement","style","top","left","outline","pointerEvents","parentDiv","parentElement","appendChild","_resizeObserver","ResizeObserver","observe","initializeKonva","addEventListener","dispose","removeEventListener","destroyKonva","disconnect","remove","syncOverlay","clearOverlay","clearSelected","getObjects","obj","delete","getMarkupColor","setMarkupColor","colorizeAllMarkup","hexColor","call","colorizeSelectedMarkups","getSelectedObjects","setViewpoint","viewpoint","markupColor","custom_fields","markup_color","lines","line","linePoints","screenPoint","addLine","texts","addText","angle","text_size","font_size","rectangles","rect","addRectangle","line_width","_e","ellipses","ellipse","addEllipse","_f","arrows","arrow","startPoint","endPoint","addArrow","_g","clouds","cloud","addCloud","_h","images","addImage","getViewpoint","getMarkupLines","getMarkupTexts","getMarkupArrows","getMarkupClouds","getMarkupEllipses","getMarkupImages","getMarkupRectangles","snapshot","combineMarkupWithDrawing","mode","_markupMode","createObject","konvaShape","object","addObject","objects","Object","keys","konvaLayerFind","_konvaTransformer","nodes","map","values","find","selectObjects","selectedObjs","_groupImages","add","_groupTexts","_groupGeometry","_konvaLayer","parent","stage","Stage","clientWidth","clientHeight","layer","Layer","pixelRation","window","devicePixelRatio","Group","transformer","Transformer","shouldOverdrawWholeArea","keepRatio","flipEnabled","isPaint","lastLine","mouseDownPos","lastObj","pos","some","m","defParams","startX","min","startY","max","_textInputRef","_textInputPos","_textInputAngle","createTextInput","pageX","pageY","_imageInputRef","_imageInputPos","createImageInput","rotateEnabled","metaPressed","metaKey","isSelected","indexOf","slice","splice","tabIndex","focus","code","preventDefault","worldPoints","absoluteTransform","i","atPoint","worldPoint","konvaLine","textSize","textScale","stageAbsoluteTransform","getMatrix","rectangle","atStartPoint","worldStartPoint","atEndPoint","worldEndPoint","tempCanvas","ctx","getContext","HTMLCanvasElement","drawImage","toCanvas","pixelRatio","toDataURL","inputX","inputY","display","onkeydown","key","body","setTimeout","convertBase64","file","Promise","resolve","reject","fileReader","FileReader","readAsDataURL","result","error","accept","onchange","async","files","base64","oncancel","click","at","tolerance","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markup.module.js","sources":["../src/markup/WorldTransform.ts","../src/markup/Konva/MarkupColor.ts","../src/markup/Konva/KonvaLine.ts","../src/markup/Konva/KonvaText.ts","../src/markup/Konva/KonvaRectangle.ts","../src/markup/Konva/KonvaEllipse.ts","../src/markup/Konva/KonvaArrow.ts","../src/markup/Konva/KonvaImage.ts","../src/markup/Konva/KonvaCloud.ts","../src/markup/Konva/KonvaMarkup.ts"],"sourcesContent":["///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport { IWorldTransform } from \"./IWorldTransform\";\n\nexport class WorldTransform implements IWorldTransform {\n screenToWorld(position: { x: number; y: number }): { x: number; y: number; z: number } {\n return { x: position.x, y: position.y, z: 0 };\n }\n\n worldToScreen(position: { x: number; y: number; z: number }): { x: number; y: number } {\n return { x: position.x, y: position.y };\n }\n\n getScale(): { x: number; y: number; z: number } {\n return { x: 1, y: 1, z: 1 };\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\n/**\n * Defines the markup color helper object.\n */\nexport class MarkupColor {\n public R: number;\n public G: number;\n public B: number;\n public HEX: string;\n\n /**\n * Creates an instance of the color.\n *\n * @param r - The `red` component of the color, as a number between 0 and 255.\n * @param g - The `green` component of the color, as a number between 0 and 255.\n * @param b - The `blue` component of the color, as a number between 0 and 255.\n */\n constructor(r: number, g: number, b: number) {\n this.setColor(r, g, b);\n }\n\n /**\n * Returns the color as a string in hexadecimal color syntax `#RGB` using its primary color components\n * (red, green, blue) written as hexadecimal numbers.\n */\n public asHex(): string {\n return \"#\" + this.HEX;\n }\n\n /**\n * Returns the color as an {r, g, b} object.\n */\n public asRGB(): { r: number; g: number; b: number } {\n return { r: this.R, g: this.G, b: this.B };\n }\n\n /**\n * Sets the color.\n *\n * @param r - The `red` component of the color, as a number between 0 and 255.\n * @param g - The `green` component of the color, as a number between 0 and 255.\n * @param b - The `blue` component of the color, as a number between 0 and 255.\n */\n public setColor(r: number, g: number, b: number): void {\n this.R = r;\n this.G = g;\n this.B = b;\n this.HEX = this.rgbToHex(r, g, b);\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n const valueToHex = (c: number) => {\n const hex = c.toString(16);\n return hex === \"0\" ? \"00\" : hex;\n };\n\n return valueToHex(r) + valueToHex(g) + valueToHex(b);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupLine, IMarkupLineParams, MarkupLineType } from \"../IMarkupLine\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nconst LineTypeSpecs = new Map<string, number[]>([\n [\"solid\", []],\n [\"dot\", [30, 30, 0.001, 30]],\n [\"dash\", [30, 30]],\n]);\n\nexport class KonvaLine implements IMarkupLine {\n private _ref: Konva.Line;\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupLineParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n let wcsPoints = this._ref.getAttr(\"wcsPoints\");\n if (!wcsPoints) {\n wcsPoints = [];\n let points = this._ref.points();\n let wcsPoint;\n for (let i = 0; i < points.length; i += 2) {\n wcsPoint = this._worldTransformer.screenToWorld({ x: points[i], y: points[i + 1] });\n wcsPoints.push({ x: wcsPoint.x, y: wcsPoint.y, z: wcsPoint.z });\n }\n this._ref.setAttr(\"wcsPoints\", wcsPoints);\n }\n return;\n }\n\n if (!params) params = {};\n if (!params.points)\n params.points = [\n { x: 0, y: 0 },\n { x: 100, y: 100 },\n ];\n\n const konvaPoints = [];\n const wcsPoints = [];\n params.points.forEach((point) => {\n konvaPoints.push(point.x, point.y);\n let wcsPoint = this._worldTransformer.screenToWorld({ x: point.x, y: point.y });\n wcsPoints.push({ x: wcsPoint.x, y: wcsPoint.y, z: wcsPoint.z });\n });\n\n this._ref = new Konva.Line({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.width ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: konvaPoints,\n draggable: true,\n strokeScaleEnabled: false,\n dash: LineTypeSpecs.get(params.type) || [],\n });\n\n this._ref.setAttr(\"wcsPoints\", wcsPoints);\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n });\n\n this._ref.on(\"transformend\", (e) => {\n const absoluteTransform = this._ref.getAbsoluteTransform();\n\n let wcsPoints = [];\n let points = this._ref.points();\n let wcsPoint;\n for (let i = 0; i < points.length; i += 2) {\n const position = absoluteTransform.point({ x: points[i], y: points[i + 1] });\n wcsPoint = this._worldTransformer.screenToWorld({ x: position.x, y: position.y });\n wcsPoints.push({ x: wcsPoint.x, y: wcsPoint.y, z: wcsPoint.z });\n }\n this._ref.setAttr(\"wcsPoints\", wcsPoints);\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getAbsoluteTransform();\n\n let wcsPoints = [];\n let points = this._ref.points();\n let wcsPoint;\n for (let i = 0; i < points.length; i += 2) {\n const position = absoluteTransform.point({ x: points[i], y: points[i + 1] });\n wcsPoint = this._worldTransformer.screenToWorld({ x: position.x, y: position.y });\n wcsPoints.push({ x: wcsPoint.x, y: wcsPoint.y, z: wcsPoint.z });\n }\n this._ref.setAttr(\"wcsPoints\", wcsPoints);\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Line\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string) {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): number[] {\n return this._ref.points();\n }\n\n setLineWidth(size: number) {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n getLineType(): string {\n const typeSpecs = this._ref.dash() || [];\n let type: MarkupLineType;\n switch (typeSpecs) {\n case LineTypeSpecs.get(\"dot\"):\n type = \"dot\";\n break;\n case LineTypeSpecs.get(\"dash\"):\n type = \"dash\";\n break;\n default:\n type = \"solid\";\n break;\n }\n return type;\n }\n\n setLineType(type: string) {\n const specs = LineTypeSpecs.get(type);\n if (specs) this._ref.dash(specs);\n }\n\n addPoints(points: [{ x: number; y: number }]) {\n let newPoints = this._ref.points();\n let wcsPoints = this._ref.getAttr(\"wcsPoints\");\n points.forEach((point) => {\n newPoints = newPoints.concat([point.x, point.y]);\n let wcsPoint = this._worldTransformer.screenToWorld(point);\n wcsPoints.push(wcsPoint);\n });\n\n this._ref.points(newPoints);\n }\n\n updateScreenCoordinates(): void {\n let wcsPoints = this._ref.getAttr(\"wcsPoints\");\n let points = [];\n let invert = this._ref.getAbsoluteTransform().copy();\n invert = invert.invert();\n wcsPoints.forEach((point) => {\n let screenPoint = this._worldTransformer.worldToScreen(point);\n screenPoint = invert.point({ x: screenPoint.x, y: screenPoint.y });\n points.push(screenPoint.x);\n points.push(screenPoint.y);\n });\n\n this._ref.points([]);\n this._ref.points(points);\n this._ref.clearCache();\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupText, IMarkupTextParams } from \"../IMarkupText\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaText implements IMarkupText {\n private _ref: Konva.Text;\n private _worldTransformer: IWorldTransform;\n private readonly TEXT_FONT_FAMILY = \"Calibri\";\n\n constructor(params: IMarkupTextParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n const wcsStart = this._ref.getAttr(\"wcsStart\");\n if (!wcsStart) {\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() }));\n }\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.text) params.text = \"default\";\n\n this._ref = new Konva.Text({\n x: params.position.x,\n y: params.position.y,\n text: params.text,\n fontSize: params.fontSize ?? 34,\n fontFamily: this.TEXT_FONT_FAMILY,\n fill: params.color ?? \"#ff0000\",\n align: \"left\",\n draggable: true,\n rotation: params.rotation ?? 0,\n });\n\n this._ref.width(this._ref.getTextWidth());\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: params.position.x, y: params.position.y }));\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 50;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < Math.round(this.getFontSize())) newHeight = Math.round(this.getFontSize());\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.on(\"transformend\", (e) => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Text\";\n }\n\n getColor(): string {\n return this._ref.fill() as string;\n }\n\n setColor(hex: string): void {\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n getText(): string {\n return this._ref.text();\n }\n\n setText(text: string): void {\n this._ref.text(text);\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n getFontSize(): number {\n return this._ref.fontSize();\n }\n\n setFontSize(size: number): void {\n this._ref.fontSize(size);\n }\n\n updateScreenCoordinates(): void {\n let screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsStart\"));\n\n let invert = this._ref.getStage().getAbsoluteTransform().copy();\n invert = invert.invert();\n const positionStart = invert.point(screenPositionStart);\n\n this._ref.position({ x: positionStart.x, y: positionStart.y });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupRectangle, IMarkupRectangleParams } from \"../IMarkupRectangle\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaRectangle implements IMarkupRectangle {\n private _ref: Konva.Rect;\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupRectangleParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n const wcsStart = this._ref.getAttr(\"wcsStart\");\n const wcsEnd = this._ref.getAttr(\"wcsEnd\");\n\n if (!wcsStart) {\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() }));\n }\n if (!wcsEnd) {\n const rightBottomPoint = { x: ref.x() + ref.width(), y: ref.y() + ref.height() };\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: rightBottomPoint.x, y: rightBottomPoint.y })\n );\n }\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (params.position2) {\n params.width = params.position.x - params.position2.x;\n params.height = params.position.y - params.position2.y;\n } else {\n if (!params.width || !params.height) {\n params.position2 = { x: 200, y: 200 };\n params.width = 200;\n params.height = 200;\n } else {\n params.position2 = { x: params.position.x + params.width, y: params.position.y + params.height };\n }\n }\n\n this._ref = new Konva.Rect({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: params.position.x, y: params.position.y }));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x: params.position2.x, y: params.position2.y }));\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 50;\n const minHeight = 50;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.on(\"transformend\", (e) => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: position.x + this._ref.width(), y: position.y + this._ref.height() })\n );\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: position.x + this._ref.width(), y: position.y + this._ref.height() })\n );\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n\n const rightLowerPoint = { x: this._ref.x() + w, y: this._ref.y() + this._ref.height() };\n const wcsRightLowerPoint = this._worldTransformer.screenToWorld(rightLowerPoint);\n this._ref.setAttr(\"wcsEnd\", wcsRightLowerPoint);\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n\n const rightLowerPoint = { x: this._ref.x() + this._ref.width(), y: this._ref.y() + h };\n const wcsRightLowerPoint = this._worldTransformer.screenToWorld(rightLowerPoint);\n this._ref.setAttr(\"wcsEnd\", wcsRightLowerPoint);\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Rectangle\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n updateScreenCoordinates(): void {\n let screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsStart\"));\n let screenPositionEnd = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsEnd\"));\n\n let invert = this._ref.getStage().getAbsoluteTransform().copy();\n invert = invert.invert();\n const positionStart = invert.point(screenPositionStart);\n const positionEnd = invert.point(screenPositionEnd);\n\n this._ref.position({ x: positionStart.x, y: positionStart.y });\n this._ref.width(Math.abs(positionEnd.x - positionStart.x));\n this._ref.height(Math.abs(positionEnd.y - positionStart.y));\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupEllipse, IMarkupEllipseParams } from \"../IMarkupEllipse\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaEllipse implements IMarkupEllipse {\n private _ref: Konva.Ellipse;\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupEllipseParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n\n const wcsPosition = this._ref.getAttr(\"wcsPosition\");\n const radiusX = this._ref.getAttr(\"wcsRadiusX\");\n const radiusY = this._ref.getAttr(\"wcsRadiusY\");\n if (!wcsPosition) {\n this._ref.setAttr(\"wcsPosition\", this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() }));\n }\n if (!radiusX) {\n this._ref.setAttr(\n \"wcsRadiusX\",\n this._worldTransformer.screenToWorld({ x: ref.x() + ref.radiusX(), y: ref.y() })\n );\n }\n if (!radiusY) {\n this._ref.setAttr(\n \"wcsRadiusY\",\n this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() + ref.radiusY() })\n );\n }\n\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.radius) params.radius = { x: 25, y: 25 };\n\n this._ref = new Konva.Ellipse({\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n x: params.position.x,\n y: params.position.y,\n radiusX: params.radius.x,\n radiusY: params.radius.y,\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.setAttr(\n \"wcsPosition\",\n this._worldTransformer.screenToWorld({ x: params.position.x, y: params.position.y })\n );\n this._ref.setAttr(\n \"wcsRadiusX\",\n this._worldTransformer.screenToWorld({ x: this._ref.x() + params.radius.x, y: this._ref.y() })\n );\n this._ref.setAttr(\n \"wcsRadiusY\",\n this._worldTransformer.screenToWorld({ x: this._ref.x(), y: this._ref.y() + params.radius.y })\n );\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newRadiusX = this._ref.radiusX();\n if (scaleByX) newRadiusX *= attrs.scaleX;\n let newRadiusY = this._ref.radiusY();\n if (scaleByY) newRadiusY *= attrs.scaleY;\n\n const minRadiusX = 25;\n const minRadiusY = 25;\n\n if (newRadiusX < minRadiusX) newRadiusX = minRadiusX;\n if (newRadiusY < minRadiusY) newRadiusY = minRadiusY;\n\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.radius({ x: newRadiusX, y: newRadiusX });\n } else {\n this._ref.radius({ x: newRadiusY, y: newRadiusY });\n }\n } else {\n this._ref.radius({ x: newRadiusX, y: newRadiusY });\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.on(\"transformend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsPosition\", this._worldTransformer.screenToWorld(position));\n const radiusX = absoluteTransform.point({ x: this._ref.x() + this._ref.radiusX(), y: this._ref.y() });\n this._ref.setAttr(\"wcsRadiusX\", this._worldTransformer.screenToWorld(radiusX));\n const radiusY = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() + this._ref.radiusY() });\n this._ref.setAttr(\"wcsRadiusY\", this._worldTransformer.screenToWorld(radiusY));\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsPosition\", this._worldTransformer.screenToWorld(position));\n const radiusX = absoluteTransform.point({ x: this._ref.x() + this._ref.radiusX(), y: this._ref.y() });\n this._ref.setAttr(\"wcsRadiusX\", this._worldTransformer.screenToWorld(radiusX));\n const radiusY = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() + this._ref.radiusY() });\n this._ref.setAttr(\"wcsRadiusY\", this._worldTransformer.screenToWorld(radiusY));\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n this._ref.setAttr(\"wcsPosition\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n getRadiusX(): number {\n return this._ref.radiusX();\n }\n\n setRadiusX(r: number): void {\n this._ref.radiusX(r);\n this._ref.setAttr(\"wcsRadiusX\", this._worldTransformer.screenToWorld({ x: this._ref.x() + r, y: this._ref.y() }));\n }\n\n getRadiusY(): number {\n return this._ref.radiusY();\n }\n\n setRadiusY(r: number): void {\n this._ref.radiusY(r);\n this._ref.setAttr(\"wcsRadiusY\", this._worldTransformer.screenToWorld({ x: this._ref.x(), y: this._ref.y() + r }));\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Ellipse\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n updateScreenCoordinates(): void {\n let screenPosition = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsPosition\"));\n let radiusX = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsRadiusX\"));\n let radiusY = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsRadiusY\"));\n\n let invert = this._ref.getStage().getAbsoluteTransform().copy();\n invert = invert.invert();\n const position = invert.point({ x: screenPosition.x, y: screenPosition.y });\n\n this._ref.position({ x: position.x, y: position.y });\n this._ref.radius({\n x: Math.abs(invert.point(radiusX).x - position.x),\n y: Math.abs(invert.point(radiusY).y - position.y),\n });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupArrow, IMarkupArrowParams } from \"../IMarkupArrow\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaArrow implements IMarkupArrow {\n private _ref: Konva.Arrow;\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupArrowParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n const wcsStart = this._ref.getAttr(\"wcsStart\");\n const wcsEnd = this._ref.getAttr(\"wcsEnd\");\n if (!wcsStart)\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: ref.points()[0], y: ref.points()[1] }));\n if (!wcsEnd)\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x: ref.points()[2], y: ref.points()[3] }));\n return;\n }\n\n if (!params) params = {};\n if (!params.start) params.start = { x: 0, y: 0 };\n if (!params.end) params.end = { x: 100, y: 100 };\n\n this._ref = new Konva.Arrow({\n stroke: params.color ?? \"#ff0000\",\n fill: params.color ?? \"#ff0000\",\n strokeWidth: 4,\n globalCompositeOperation: \"source-over\",\n lineCap: \"round\",\n lineJoin: \"round\",\n points: [params.start.x, params.start.y, params.end.x, params.end.y],\n draggable: true,\n strokeScaleEnabled: false,\n });\n\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: params.start.x, y: params.start.y }));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x: params.end.x, y: params.end.y }));\n\n this._ref.on(\"transformend\", (e) => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const points = this._ref.points();\n const absoluteTransform = this._ref.getAbsoluteTransform();\n const transformStart = absoluteTransform.point({ x: points[0], y: points[1] });\n const transformEnd = absoluteTransform.point({ x: points[2], y: points[3] });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(transformStart));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld(transformEnd));\n });\n\n this._ref.on(\"dragend\", (e) => {\n const points = this._ref.points();\n const absoluteTransform = e.target.getAbsoluteTransform();\n const transformStart = absoluteTransform.point({ x: points[0], y: points[1] });\n const transformEnd = absoluteTransform.point({ x: points[2], y: points[3] });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(transformStart));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld(transformEnd));\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Arrow\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n this._ref.fill(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPoints(): { x: number; y: number }[] {\n const points = this._ref.points();\n return [\n { x: points[0], y: points[1] },\n { x: points[2], y: points[3] },\n ];\n }\n\n setPoints(points: { x: number; y: number }[]): void {\n if (points.length === 2) {\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: points[0].x, y: points[0].y }));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x: points[1].x, y: points[1].y }));\n this._ref.points([points[0].x, points[0].y, points[1].x, points[1].y]);\n }\n }\n\n getStartPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[0], y: points[1] };\n }\n\n setStartPoint(x: number, y: number): void {\n const points = this._ref.points();\n this._ref.points([x, y, points[2], points[3]]);\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n getEndPoint(): { x: number; y: number } {\n const points = this._ref.points();\n return { x: points[2], y: points[3] };\n }\n\n setEndPoint(x: number, y: number): void {\n const points = this._ref.points();\n this._ref.points([points[0], points[1], x, y]);\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n updateScreenCoordinates(): void {\n let screenStartPoint = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsStart\"));\n let screenEndPoint = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsEnd\"));\n\n let invert = this._ref.getAbsoluteTransform().copy();\n invert = invert.invert();\n const startPoint = invert.point({ x: screenStartPoint.x, y: screenStartPoint.y });\n const endPoint = invert.point({ x: screenEndPoint.x, y: screenEndPoint.y });\n\n this._ref.points([startPoint.x, startPoint.y, endPoint.x, endPoint.y]);\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupImage, IMarkupImageParams } from \"../IMarkupImage\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaImage implements IMarkupImage {\n private _ref: Konva.Image;\n private _canvasImage: HTMLImageElement;\n private _ratio = 1;\n private readonly EPSILON = 10e-6;\n private readonly BASE64_HEADER_START = \"data:image/\";\n private readonly BASE64_NOT_FOUND =\n \"data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAADsAAAA7AF5KHG9AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAmhJREFUWIXtlr9rVEEQxz+H8RQUJIdeIopYm0vkCg0GBBtbG1NF7Kxt7dR/IGIw/uhTaBNLERURg2kCEUyCYCPi70b0InjGS57FzOZN3r19d+9HJIVfWO52dma/s7Mz8xa2KAaBCWAR+AkECWOmSOIdwC1gtQOpHc+NfQ8wClQ8+1d0vcdH/lQ3bSIRGAZ2pTjAqNovANXIWlXlAXA2zvi2Ln4AjqYgtagYEutENSLvjRoOImFv5iB32Ae8UrLXwFBk3h9ndF0VJnKSO9gTu3yKu5Z1LKnS8YIcABgw5Ks692JZFXcXRJ46Aq6kikCnHNi/mQ50WwVtfaIoBzL3gRk2drSscJ2wrc4VvUoe2wn/41/iBfoVLRnBGnDSY3AAKacy8AmYR+o7K1zCl6wgrgpOAc/MuhvfgMuk+1JGHQgSBcAloKXy78AjYBppJk5/noTulseBMZ23iD/piHFkEdgTQzKk+5wHjmHC3cmBg0BD5xcSTrFXyQPgIWFtDwMvab+2N8DpbhyY1v/3E8gdDgNfVX9SCVZ0/gW4B0wB71S2BpxLcuCM/jaQSHSDEeAX4VMuAG4gTzyHbcAVXXO6GxxwIX+vvxe7JHcYQ07nHqklj96UIW/YhSWzMKcep8VVtf8B1Dw6h4DfhB+sdbgn2R+gnoEc5NR3dZ+3QJ9H74HqXLPCGlJyTfI9y3YCs0owq3OLOpKkLeBI1HhSDT/mdKIPiUCARMTlQx34TMLjtww8IczmO8AJ/N/2JNSQXAiQ671JePePge0+wzJSQq4FFzlaenIvucUAkiQLhC/mLGNZ9xgn5s63BP4CCk0QDtm4BhoAAAAASUVORK5CYII=\";\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupImageParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n if (!ref.src || !ref.src.startsWith(this.BASE64_HEADER_START)) ref.src = this.BASE64_NOT_FOUND;\n if (ref.height() <= this.EPSILON) ref.height(32);\n if (ref.width() <= this.EPSILON) ref.width(32);\n\n this._ref = ref;\n this._canvasImage = ref.image();\n this._ratio =\n this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON\n ? 1\n : this._ref.height() / this._ref.width();\n\n const wcsStart = this._ref.getAttr(\"wcsStart\");\n if (!wcsStart) {\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() }));\n }\n\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (!params.src || !params.src.startsWith(this.BASE64_HEADER_START)) params.src = this.BASE64_NOT_FOUND;\n\n this._canvasImage = new Image();\n\n this._canvasImage.onload = () => {\n this._ref.image(this._canvasImage);\n if (this._ref.height() <= this.EPSILON) this._ref.height(this._canvasImage.height);\n if (this._ref.width() <= this.EPSILON) this._ref.width(this._canvasImage.width);\n\n this._ratio =\n this._ref.height() <= this.EPSILON || this._ref.width() <= this.EPSILON\n ? 1\n : this._ref.height() / this._ref.width();\n\n // need to rescale only if input width and height are 0 - we do not loading Viewpoint with existing params\n if (\n (params.width <= this.EPSILON || params.height <= this.EPSILON) &&\n (params.maxWidth >= this.EPSILON || params.maxWidth >= this.EPSILON)\n ) {\n const heightOutOfCanvas = params.maxHeight - this._canvasImage.height;\n const widthOutOfCanvas = params.maxWidth - this._canvasImage.width;\n\n if (heightOutOfCanvas <= this.EPSILON || widthOutOfCanvas <= this.EPSILON) {\n if (widthOutOfCanvas <= this.EPSILON && widthOutOfCanvas < heightOutOfCanvas / this._ratio) {\n this._ref.height(params.maxWidth * this._ratio);\n this._ref.width(params.maxWidth);\n } else {\n this._ref.width(params.maxHeight / this._ratio);\n this._ref.height(params.maxHeight);\n }\n }\n }\n };\n\n this._canvasImage.onerror = () => {\n this._canvasImage.onerror = function () {};\n this._canvasImage.src = this.BASE64_NOT_FOUND;\n };\n\n this._canvasImage.src = params.src;\n\n this._ref = new Konva.Image({\n x: params.position.x,\n y: params.position.y,\n image: this._canvasImage,\n width: params.width ?? 0,\n height: params.height ?? 0,\n draggable: true,\n });\n\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: params.position.x, y: params.position.y }));\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n if (e.evt.ctrlKey || e.evt.shiftKey) {\n if (scaleByX) {\n this._ref.width(newWidth);\n this._ref.height(newWidth * this._ratio);\n } else {\n this._ref.width(newHeight / this._ratio);\n this._ref.height(newHeight);\n }\n } else {\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.on(\"transformend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n });\n\n this._ref.id(this._ref._id.toString());\n }\n\n getSrc(): string {\n return this._canvasImage.src;\n }\n\n setSrc(src: any) {\n this._canvasImage.src = src;\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n this._ref.height(w * this._ratio);\n }\n\n getHeight(): number {\n return this._ref.height();\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n this._ref.width(h / this._ratio);\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Image\";\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition(): { x: number; y: number } {\n return this._ref.getPosition();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.setPosition({ x, y });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n updateScreenCoordinates(): void {\n let screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsStart\"));\n\n let invert = this._ref.getStage().getAbsoluteTransform().copy();\n invert = invert.invert();\n const positionStart = invert.point(screenPositionStart);\n\n this._ref.position({ x: positionStart.x, y: positionStart.y });\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IMarkupCloud, IMarkupCloudParams } from \"../IMarkupCloud\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\n\nexport class KonvaCloud implements IMarkupCloud {\n private _ref: Konva.Shape;\n private _worldTransformer: IWorldTransform;\n\n constructor(params: IMarkupCloudParams, ref = null, worldTransformer = new WorldTransform()) {\n this._worldTransformer = worldTransformer;\n\n if (ref) {\n this._ref = ref;\n const wcsStart = this._ref.getAttr(\"wcsStart\");\n const wcsEnd = this._ref.getAttr(\"wcsEnd\");\n if (!wcsStart) {\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: ref.x(), y: ref.y() }));\n }\n if (!wcsEnd) {\n const rightBottomPoint = { x: ref.x() + ref.width(), y: ref.y() + ref.height() };\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: rightBottomPoint.x, y: rightBottomPoint.y })\n );\n }\n return;\n }\n\n if (!params) params = {};\n if (!params.position) params.position = { x: 0, y: 0 };\n if (params.position2) {\n params.width = params.position.x - params.position2.x;\n params.height = params.position.y - params.position2.y;\n } else {\n if (!params.width || !params.height) {\n params.position2 = { x: 200, y: 200 };\n params.width = 200;\n params.height = 200;\n } else {\n params.position2 = { x: params.position.x + params.width, y: params.position.y + params.height };\n }\n }\n\n const ARC_RADIUS = 16;\n\n this._ref = new Konva.Shape({\n x: params.position.x,\n y: params.position.y,\n width: params.width ?? 200,\n height: params.height ?? 200,\n stroke: params.color ?? \"#ff0000\",\n strokeWidth: params.lineWidth ?? 4,\n draggable: true,\n strokeScaleEnabled: false,\n globalCompositeOperation: \"source-over\",\n sceneFunc: (context, shape) => {\n function calculateMidpoint(position, width, height) {\n const midX = position.x + width / 2;\n const midY = position.y + height / 2;\n return { x: midX, y: midY };\n }\n\n const points = [\n { x: 0, y: 0 },\n { x: 0 + this._ref.width(), y: 0 },\n { x: 0 + this._ref.width(), y: 0 + this._ref.height() },\n { x: 0, y: 0 + this._ref.height() },\n { x: 0, y: 0 },\n ];\n\n const midPoint = calculateMidpoint({ x: 0, y: 0 }, this._ref.width(), this._ref.height());\n\n const baseArcLength = 30;\n context.beginPath();\n for (let iPoint = 0; iPoint < points.length - 1; iPoint++) {\n let approxArcLength = baseArcLength;\n const dx = points[iPoint + 1].x - points[iPoint].x;\n const dy = points[iPoint + 1].y - points[iPoint].y;\n const length = Math.sqrt(dx * dx + dy * dy);\n\n const arcCount = Math.floor(length / approxArcLength);\n const lengthMod = length % approxArcLength;\n approxArcLength = baseArcLength + arcCount / lengthMod;\n\n let pX = points[iPoint].x + dx / arcCount / 2;\n let pY = points[iPoint].y + dy / arcCount / 2;\n const pEndX = points[iPoint + 1].x;\n const pEndY = points[iPoint + 1].y;\n const endAngle = Math.atan((pEndY - pY) / (pEndX - pX));\n const startAngle = endAngle + Math.PI;\n const counterClockwise = pX > midPoint.x && pY > midPoint.y;\n for (let iArc = 0; iArc < arcCount; iArc++) {\n if (counterClockwise) {\n context.arc(pX, pY, ARC_RADIUS, endAngle, startAngle);\n } else {\n context.arc(pX, pY, ARC_RADIUS, startAngle, endAngle);\n }\n\n pX += dx / arcCount;\n pY += dy / arcCount;\n }\n }\n\n context.closePath();\n // (!) Konva specific method, it is very important\n // it will apply are required styles\n context.fillStrokeShape(shape);\n },\n });\n\n this._ref.className = \"Cloud\";\n\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x: params.position.x, y: params.position.y }));\n this._ref.setAttr(\"wcsEnd\", this._worldTransformer.screenToWorld({ x: params.position2.x, y: params.position2.y }));\n\n this._ref.on(\"transform\", (e) => {\n const attrs = e.target.attrs;\n\n const scaleByX = Math.abs(attrs.scaleX - 1) > 10e-6;\n const scaleByY = Math.abs(attrs.scaleY - 1) > 10e-6;\n\n let newWidth = this._ref.width();\n if (scaleByX) newWidth *= attrs.scaleX;\n let newHeight = this._ref.height();\n if (scaleByY) newHeight *= attrs.scaleY;\n\n const minWidth = 100;\n const minHeight = 100;\n\n if (newWidth < minWidth) newWidth = minWidth;\n if (newHeight < minHeight) newHeight = minHeight;\n\n if (scaleByX) {\n this._ref.width(newWidth);\n }\n\n if (scaleByY) {\n this._ref.height(newHeight);\n }\n\n this._ref.scale({ x: 1, y: 1 });\n });\n\n this._ref.on(\"transformend\", (e) => {\n const attrs = e.target.attrs;\n if (attrs.rotation !== this._ref.rotation()) this._ref.rotation(attrs.rotation);\n\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: position.x + this._ref.width(), y: position.y + this._ref.height() })\n );\n });\n\n this._ref.on(\"dragend\", (e) => {\n const absoluteTransform = this._ref.getStage().getAbsoluteTransform();\n const position = absoluteTransform.point({ x: this._ref.x(), y: this._ref.y() });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld(position));\n this._ref.setAttr(\n \"wcsEnd\",\n this._worldTransformer.screenToWorld({ x: position.x + this._ref.width(), y: position.y + this._ref.height() })\n );\n });\n\n this._ref.getSelfRect = () => {\n return {\n x: 0 - ARC_RADIUS,\n y: 0 - ARC_RADIUS,\n width: this._ref.width() + 2 * ARC_RADIUS,\n height: this._ref.height() + 2 * ARC_RADIUS,\n };\n };\n\n this._ref.id(this._ref._id.toString());\n }\n\n ref() {\n return this._ref;\n }\n\n id(): string {\n return this._ref.id();\n }\n\n enableMouseEditing(value: boolean): void {\n this._ref.draggable(value);\n }\n\n type(): string {\n return \"Cloud\";\n }\n\n getColor(): string {\n return this._ref.stroke() as string;\n }\n\n setColor(hex: string): void {\n this._ref.stroke(hex);\n }\n\n getRotation(): number {\n return this._ref.rotation();\n }\n\n setRotation(degrees: number): void {\n this._ref.rotation(degrees);\n }\n\n getZIndex(): number {\n return this._ref.zIndex();\n }\n\n setZIndex(zIndex: number): void {\n this._ref.zIndex(zIndex);\n }\n\n delete(): void {\n this._ref.destroy();\n this._ref = null;\n }\n\n getPosition() {\n return this._ref.position();\n }\n\n setPosition(x: number, y: number): void {\n this._ref.position({ x, y });\n this._ref.setAttr(\"wcsStart\", this._worldTransformer.screenToWorld({ x, y }));\n }\n\n getWidth(): number {\n return this._ref.width();\n }\n\n setWidth(w: number): void {\n this._ref.width(w);\n\n const rightLowerPoint = { x: this._ref.x() + w, y: this._ref.y() + this._ref.height() };\n const wcsRightLowerPoint = this._worldTransformer.screenToWorld(rightLowerPoint);\n this._ref.setAttr(\"wcsEnd\", wcsRightLowerPoint);\n }\n\n getHeigth(): number {\n return this._ref.height();\n }\n\n setHeight(h: number): void {\n this._ref.height(h);\n\n const rightLowerPoint = { x: this._ref.x() + this._ref.width(), y: this._ref.y() + h };\n const wcsRightLowerPoint = this._worldTransformer.screenToWorld(rightLowerPoint);\n this._ref.setAttr(\"wcsEnd\", wcsRightLowerPoint);\n }\n\n getLineWidth(): number {\n return this._ref.strokeWidth();\n }\n\n setLineWidth(size: number): void {\n this._ref.strokeWidth(size);\n }\n\n updateScreenCoordinates(): void {\n let screenPositionStart = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsStart\"));\n let screenPositionEnd = this._worldTransformer.worldToScreen(this._ref.getAttr(\"wcsEnd\"));\n\n let invert = this._ref.getStage().getAbsoluteTransform().copy();\n invert = invert.invert();\n const positionStart = invert.point(screenPositionStart);\n const positionEnd = invert.point(screenPositionEnd);\n\n this._ref.position({ x: positionStart.x, y: positionStart.y });\n this._ref.width(Math.abs(positionEnd.x - positionStart.x));\n this._ref.height(Math.abs(positionEnd.y - positionStart.y));\n }\n}\n","///////////////////////////////////////////////////////////////////////////////\n// Copyright (C) 2002-2025, Open Design Alliance (the \"Alliance\").\n// All rights reserved.\n//\n// This software and its documentation and related materials are owned by\n// the Alliance. The software may only be incorporated into application\n// programs owned by members of the Alliance, subject to a signed\n// Membership Agreement and Supplemental Software License Agreement with the\n// Alliance. The structure and organization of this software are the valuable\n// trade secrets of the Alliance and its suppliers. The software is also\n// protected by copyright law and international treaty provisions. Application\n// programs incorporating this software must include the following statement\n// with their copyright notices:\n//\n// This application incorporates Open Design Alliance software pursuant to a\n// license agreement with Open Design Alliance.\n// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.\n// All rights reserved.\n//\n// By use of this software, its documentation or related materials, you\n// acknowledge and accept the above terms.\n///////////////////////////////////////////////////////////////////////////////\n\nimport Konva from \"konva\";\nimport { IEventEmitter } from \"@inweb/eventemitter2\";\nimport {\n ChangeActiveDraggerEvent,\n IArrow,\n ICloud,\n IEllipse,\n IImage,\n ILine,\n IRectangle,\n IText,\n IViewpoint,\n PanEvent,\n ZoomAtEvent,\n ResizeEvent,\n} from \"@inweb/viewer-core\";\n\nimport { IMarkup, MarkupMode } from \"../IMarkup\";\nimport { IWorldTransform } from \"../IWorldTransform\";\nimport { WorldTransform } from \"../WorldTransform\";\nimport { IMarkupObject } from \"../IMarkupObject\";\nimport { MarkupLineType } from \"../IMarkupLine\";\nimport { MarkupColor } from \"./MarkupColor\";\nimport { KonvaLine } from \"./KonvaLine\";\nimport { KonvaText } from \"./KonvaText\";\nimport { KonvaRectangle } from \"./KonvaRectangle\";\nimport { KonvaEllipse } from \"./KonvaEllipse\";\nimport { KonvaArrow } from \"./KonvaArrow\";\nimport { KonvaImage } from \"./KonvaImage\";\nimport { KonvaCloud } from \"./KonvaCloud\";\n\nconst MarkupMode2Konva = {\n SelectMarkup: {\n name: \"SelectMarkup\",\n initializer: null,\n },\n Line: {\n name: \"Line\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaLine(params, ref, ...attr),\n },\n Text: {\n name: \"Text\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaText(params, ref, ...attr),\n },\n Rectangle: {\n name: \"Rect\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaRectangle(params, ref, ...attr),\n },\n Ellipse: {\n name: \"Ellipse\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaEllipse(params, ref, ...attr),\n },\n Arrow: {\n name: \"Arrow\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaArrow(params, ref, ...attr),\n },\n Image: {\n name: \"Image\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaImage(params, ref, ...attr),\n },\n Cloud: {\n name: \"Cloud\",\n initializer: (ref: any, params = null, ...attr: any) => new KonvaCloud(params, ref, ...attr),\n },\n};\n\nfunction debounce(func, wait: number) {\n let timeout = null;\n return (...args) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n timeout = null;\n func(...args);\n }, wait);\n };\n}\n\n/**\n * 2D markup core.\n */\nexport class KonvaMarkup implements IMarkup {\n private _viewer: IEventEmitter;\n private _worldTransformer: IWorldTransform;\n private _container: HTMLElement;\n private _markupIsActive = false;\n private _markupMode: MarkupMode;\n private _markupColor = new MarkupColor(255, 0, 0);\n private _konvaStage: Konva.Stage;\n private _konvaLayer: Konva.Layer;\n private _konvaTransformer: Konva.Transformer;\n\n private _textInputRef: HTMLTextAreaElement;\n private _textInputPos: Konva.Vector2d;\n private _textInputAngle: number;\n private _imageInputRef: HTMLInputElement;\n private _imageInputPos: Konva.Vector2d;\n private _markupContainer: HTMLDivElement;\n private _resizeObserver: ResizeObserver;\n private _groupImages: Konva.Group;\n private _groupGeometry: Konva.Group;\n private _groupTexts: Konva.Group;\n\n public lineWidth = 4;\n public lineType: MarkupLineType = \"solid\";\n public fontSize = 34;\n\n initialize(\n container: HTMLElement,\n containerEvents?: string[],\n viewer?: IEventEmitter,\n worldTransformer?: IWorldTransform\n ): void {\n if (!Konva)\n throw new Error(\n 'Markup error: Konva is not initialized. Forgot to add <script src=\"https://unpkg.com/konva@9/konva.min.js\"></script> to your page?'\n );\n\n this._viewer = viewer;\n this._worldTransformer = worldTransformer ?? new WorldTransform();\n this._container = container;\n\n this._markupContainer = document.createElement(\"div\");\n this._markupContainer.id = \"markup-container\";\n this._markupContainer.style.position = \"absolute\";\n this._markupContainer.style.top = \"0px\";\n this._markupContainer.style.left = \"0px\";\n this._markupContainer.style.outline = \"0px\"; // <- to eliminate grey box during delete elements\n this._markupContainer.style.pointerEvents = \"none\";\n\n const parentDiv = this._container.parentElement;\n parentDiv.appendChild(this._markupContainer);\n\n if (viewer) this._viewer.addEventListener(\"resize\", this.resizeViewer);\n else this._resizeObserver = new ResizeObserver(debounce(this.resizeContainer, 100));\n\n this._markupColor.setColor(255, 0, 0);\n\n this.initializeKonva();\n\n if (this._viewer) {\n this._viewer.addEventListener(\"changeactivedragger\", this.changeActiveDragger);\n this._viewer.addEventListener(\"pan\", this.pan);\n this._viewer.addEventListener(\"zoomat\", this.zoomAt);\n }\n }\n\n dispose(): void {\n if (this._viewer) {\n this._viewer.removeEventListener(\"zoomat\", this.zoomAt);\n this._viewer.removeEventListener(\"pan\", this.pan);\n this._viewer.removeEventListener(\"changeactivedragger\", this.changeActiveDragger);\n }\n\n this.destroyKonva();\n\n this._resizeObserver?.disconnect();\n this._resizeObserver = undefined;\n\n this._markupContainer?.remove();\n this._markupContainer = undefined;\n\n this._container = undefined;\n this._viewer = undefined;\n this._worldTransformer = undefined;\n\n this._markupIsActive = false;\n }\n\n changeActiveDragger = (event: ChangeActiveDraggerEvent) => {\n const draggerName = event.data;\n\n this._markupContainer.className = this._container.className\n .split(\" \")\n .filter((x) => !x.startsWith(\"oda-cursor-\"))\n .filter((x) => x)\n .concat(`oda-cursor-${draggerName.toLowerCase()}`)\n .join(\" \");\n\n this.removeTextInput();\n this.removeImageInput();\n\n this.enableEditMode(draggerName as MarkupMode);\n };\n\n resizeContainer = (entries: ResizeObserverEntry[]) => {\n const { width, height } = entries[0].contentRect;\n\n if (!width || !height) return; // <- invisible container, or container with parent removed\n if (!this._konvaStage) return;\n\n this._konvaStage.width(width);\n this._konvaStage.height(height);\n\n this.getObjects().forEach((markupObject) => {\n markupObject.updateScreenCoordinates();\n });\n };\n\n resizeViewer = (event: ResizeEvent) => {\n const { width, height } = event;\n\n if (!width || !height) return; // <- invisible container, or container with parent removed\n if (!this._konvaStage) return;\n\n this._konvaStage.width(width);\n this._konvaStage.height(height);\n\n this.getObjects().forEach((markupObject) => {\n markupObject.updateScreenCoordinates();\n });\n };\n\n pan = (event: PanEvent) => {\n this.getObjects().forEach((markupObject) => {\n markupObject.updateScreenCoordinates();\n });\n };\n\n zoomAt = (event: ZoomAtEvent) => {\n this.getObjects().forEach((markupObject) => {\n markupObject.updateScreenCoordinates();\n });\n };\n\n redirectToViewer = (event: any) => {\n if (this._viewer) this._viewer.emit(event);\n };\n\n syncOverlay(): void {}\n\n clearOverlay(): void {\n this.removeTextInput();\n this.removeImageInput();\n this.clearSelected();\n this.getObjects().forEach((obj) => obj.delete());\n }\n\n getMarkupColor(): { r: number; g: number; b: number } {\n return this._markupColor.asRGB();\n }\n\n setMarkupColor(r: number, g: number, b: number): void {\n this._markupColor.setColor(r, g, b);\n this.redirectToViewer({ type: \"changemarkupcolor\", data: { r, g, b } });\n }\n\n colorizeAllMarkup(r: number, g: number, b: number): void {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getObjects().filter((obj: any) => obj.setColor?.(hexColor));\n }\n\n colorizeSelectedMarkups(r: number, g: number, b: number): void {\n const hexColor = new MarkupColor(r, g, b).asHex();\n this.getSelectedObjects().filter((obj: any) => obj.setColor?.(hexColor));\n }\n\n setViewpoint(viewpoint: IViewpoint): void {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._konvaStage.scale({ x: 1, y: 1 });\n this._konvaStage.position({ x: 0, y: 0 });\n\n const markupColor = viewpoint.custom_fields?.markup_color || { r: 255, g: 0, b: 0 };\n this.setMarkupColor(markupColor.r, markupColor.g, markupColor.b);\n\n viewpoint.lines?.forEach((line: ILine) => {\n const linePoints = [];\n line.points.forEach((point) => {\n const screenPoint = this._worldTransformer.worldToScreen(point);\n linePoints.push(screenPoint.x);\n linePoints.push(screenPoint.y);\n });\n this.addLine(linePoints, line.color, line.type as MarkupLineType, line.width, line.id);\n });\n\n viewpoint.texts?.forEach((text: IText) => {\n const screenPoint = this._worldTransformer.worldToScreen(text.position);\n this.addText(text.text, screenPoint, text.angle, text.color, text.text_size, text.font_size, text.id);\n });\n\n viewpoint.rectangles?.forEach((rect: IRectangle) => {\n const screenPoint = this._worldTransformer.worldToScreen(rect.position);\n this.addRectangle(screenPoint, null, rect.width, rect.height, rect.line_width, rect.color, rect.id);\n });\n\n viewpoint.ellipses?.forEach((ellipse: IEllipse) => {\n const screenPoint = this._worldTransformer.worldToScreen(ellipse.position);\n this.addEllipse(screenPoint, ellipse.radius, ellipse.line_width, ellipse.color, ellipse.id);\n });\n\n viewpoint.arrows?.forEach((arrow: IArrow) => {\n const startPoint = this._worldTransformer.worldToScreen(arrow.start);\n const endPoint = this._worldTransformer.worldToScreen(arrow.end);\n this.addArrow(startPoint, endPoint, arrow.color, arrow.id);\n });\n\n viewpoint.clouds?.forEach((cloud: ICloud) => {\n const screenPoint = this._worldTransformer.worldToScreen(cloud.position);\n this.addCloud(screenPoint, null, cloud.width, cloud.height, cloud.line_width, cloud.color, cloud.id);\n });\n\n viewpoint.images?.forEach((image: IImage) => {\n const screenPoint = this._worldTransformer.worldToScreen(image.position);\n this.addImage(screenPoint, image.src, image.width, image.height, image.id);\n });\n }\n\n getViewpoint(viewpoint: IViewpoint): IViewpoint {\n if (!viewpoint) viewpoint = {};\n\n viewpoint.lines = this.getMarkupLines();\n viewpoint.texts = this.getMarkupTexts();\n viewpoint.arrows = this.getMarkupArrows();\n viewpoint.clouds = this.getMarkupClouds();\n viewpoint.ellipses = this.getMarkupEllipses();\n viewpoint.images = this.getMarkupImages();\n viewpoint.rectangles = this.getMarkupRectangles();\n\n viewpoint.custom_fields = { markup_color: this.getMarkupColor() };\n viewpoint.snapshot = { data: this.combineMarkupWithDrawing() };\n\n return viewpoint;\n }\n\n enableEditMode(mode: MarkupMode | false): this {\n if (!mode || !MarkupMode2Konva[mode]) {\n this.clearSelected();\n this.removeTextInput();\n this.removeImageInput();\n this._markupContainer.style.pointerEvents = \"none\";\n this._markupIsActive = false;\n } else {\n this._markupMode = mode;\n this._markupContainer.style.pointerEvents = \"all\";\n this._markupIsActive = true;\n }\n return this;\n }\n\n createObject(type: string, params: any): IMarkupObject {\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer)\n throw new Error(`Markup CreateObject - unsupported markup type ${type}`);\n\n const object = konvaShape.initializer(null, params, this._worldTransformer);\n this.addObject(object);\n\n return object;\n }\n\n getObjects(): IMarkupObject[] {\n const objects = [];\n Object.keys(MarkupMode2Konva).forEach((type) => {\n const konvaShape = MarkupMode2Konva[type];\n this.konvaLayerFind(type).forEach((ref) =>\n objects.push(konvaShape.initializer(ref, null, this._worldTransformer))\n );\n });\n return objects;\n }\n\n getSelectedObjects(): IMarkupObject[] {\n if (!this._konvaTransformer) return [];\n\n return this._konvaTransformer\n .nodes()\n .map((ref) => {\n const name = ref.className;\n const konvaShape = Object.values(MarkupMode2Konva).find((shape) => shape.name === name);\n return konvaShape ? konvaShape.initializer(ref, null, this._worldTransformer) : null;\n })\n .filter((x) => x);\n }\n\n selectObjects(objects: IMarkupObject[]) {\n if (!this._konvaTransformer) return;\n\n const selectedObjs = this._konvaTransformer.nodes().concat(objects.map((x) => x.ref()));\n this._konvaTransformer.nodes(selectedObjs);\n }\n\n clearSelected(): void {\n if (this._konvaTransformer) this._konvaTransformer.nodes([]);\n }\n\n private addObject(object: IMarkupObject): void {\n if (object.type() === \"Image\") this._groupImages.add(object.ref());\n else if (object.type() === \"Text\") this._groupTexts.add(object.ref());\n else this._groupGeometry.add(object.ref());\n }\n\n private konvaLayerFind(type: string): any {\n if (!this._konvaLayer) return [];\n\n const konvaShape = MarkupMode2Konva[type];\n if (!konvaShape || !konvaShape.initializer) return [];\n\n // for \"draggable\" Konva uses Rectangles in Transformer. We need only Shapes from layer.\n return this._konvaLayer\n .find(konvaShape.name)\n .filter(\n (ref) =>\n ref.parent === this._konvaLayer ||\n ref.parent === this._groupImages ||\n ref.parent === this._groupGeometry ||\n ref.parent === this._groupTexts\n );\n }\n\n private getRelativePointPosition = (point, node) => {\n // the function will return pointer position relative to the passed node\n const transform = node.getAbsoluteTransform().copy();\n // to detect relative position we need to invert transform\n transform.invert();\n // get pointer (say mouse or touch) position\n // now we find relative point\n return transform.point(point);\n };\n\n private getRelativePointerPosition = (node) => {\n return this.getRelativePointPosition(node.getStage().getPointerPosition(), node);\n };\n\n private initializeKonva(): any {\n // first we need Konva core things: stage and layer\n const stage = new Konva.Stage({\n container: this._markupContainer,\n width: this._container.clientWidth,\n height: this._container.clientHeight,\n });\n this._konvaStage = stage;\n\n const layer = new Konva.Layer({ pixelRation: window.devicePixelRatio });\n stage.add(layer);\n\n this._groupImages = new Konva.Group();\n layer.add(this._groupImages);\n this._groupGeometry = new Konva.Group();\n layer.add(this._groupGeometry);\n this._groupTexts = new Konva.Group();\n layer.add(this._groupTexts);\n\n this._konvaLayer = layer;\n\n const transformer = new Konva.Transformer({\n shouldOverdrawWholeArea: false,\n keepRatio: false,\n flipEnabled: false,\n });\n layer.add(transformer);\n this._konvaTransformer = transformer;\n\n let isPaint = false;\n let lastLine;\n let mouseDownPos;\n let lastObj;\n\n stage.on(\"mousedown touchstart\", (e) => {\n // do nothing if we mousedown on any shape\n if (!this._markupIsActive || e.target !== stage || this._markupMode === \"Text\" || this._markupMode === \"Image\")\n return;\n\n if (e.target === stage && transformer.nodes().length > 0) {\n transformer.nodes([]);\n return;\n }\n\n const pos = this.getRelativePointerPosition(stage);\n mouseDownPos = pos;\n\n isPaint = [\"Arrow\", \"Cloud\", \"Ellipse\", \"Line\", \"Rectangle\"].some((m) => m === this._markupMode);\n if (this._markupMode === \"Line\") {\n // add point twice, so we have some drawings even on a simple click\n lastLine = this.addLine([pos.x, pos.y, pos.x, pos.y]);\n }\n });\n\n stage.on(\"mouseup touchend\", (e) => {\n if (!this._markupIsActive) return;\n\n if (isPaint) {\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n if (defParams) {\n if (this._markupMode === \"Rectangle\") {\n this.addRectangle({ x: startX, y: startY }, null, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n this.addEllipse({ x: startX, y: startY }, { x: dX / 2, y: dY / 2 });\n } else if (this._markupMode === \"Arrow\") {\n this.addArrow(\n { x: mouseDownPos.x, y: mouseDownPos.y },\n { x: defParams ? mouseDownPos.x + 200 : pos.x, y: defParams ? startY : pos.y }\n );\n } else if (this._markupMode === \"Cloud\") {\n this.addCloud({ x: startX, y: startY }, null, Math.max(100, dX), Math.max(100, dY));\n }\n }\n }\n\n lastObj = undefined;\n isPaint = false;\n });\n\n stage.on(\"mousemove touchmove\", (e) => {\n if (!this._markupIsActive) return;\n if (!isPaint) {\n return;\n }\n\n // prevent scrolling on touch devices\n //e.evt.preventDefault();\n\n const pos = this.getRelativePointerPosition(stage);\n const defParams = mouseDownPos && pos.x === mouseDownPos.x && pos.y === mouseDownPos.y;\n const startX = defParams ? mouseDownPos.x : Math.min(mouseDownPos.x, pos.x);\n const startY = defParams ? mouseDownPos.y : Math.min(mouseDownPos.y, pos.y);\n const dX = defParams ? 200 : Math.abs(mouseDownPos.x - pos.x);\n const dY = defParams ? 200 : Math.abs(mouseDownPos.y - pos.y);\n\n if (this._markupMode === \"Line\") {\n lastLine.addPoints([{ x: pos.x, y: pos.y }]);\n } else if (this._markupMode === \"Arrow\") {\n if (lastObj) lastObj.setEndPoint(pos.x, pos.y);\n else lastObj = this.addArrow({ x: mouseDownPos.x, y: mouseDownPos.y }, { x: pos.x, y: pos.y });\n } else if (this._markupMode === \"Rectangle\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(dX);\n lastObj.setHeight(dY);\n } else lastObj = this.addRectangle({ x: startX, y: startY }, null, dX, dY);\n } else if (this._markupMode === \"Ellipse\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setRadiusX(dX);\n lastObj.setRadiusY(dY);\n } else lastObj = this.addEllipse({ x: startX, y: startY }, { x: dX, y: dY });\n } else if (this._markupMode === \"Cloud\") {\n if (lastObj) {\n lastObj.setPosition(startX, startY);\n lastObj.setWidth(Math.max(100, dX));\n lastObj.setHeight(Math.max(100, dY));\n } else lastObj = this.addCloud({ x: startX, y: startY }, null, dX, dY);\n }\n });\n\n // clicks should select/deselect shapes\n stage.on(\"click tap\", (e) => {\n if (!this._markupIsActive) return;\n\n // if click on empty area - remove all selections\n if (e.target === stage) {\n if (this._markupMode === \"Text\") {\n if (this._textInputRef && this._textInputRef.value)\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createTextInput(pos, e.evt.pageX, e.evt.pageY, 0, null);\n }\n } else if (this._markupMode === \"Image\") {\n if (this._imageInputRef && this._imageInputRef.value)\n this.addImage(\n { x: this._imageInputPos.x, y: this._imageInputPos.y },\n this._imageInputRef.value,\n 0,\n 0,\n this._imageInputRef.value\n );\n else if (transformer.nodes().length === 0) {\n const pos = this.getRelativePointerPosition(stage);\n this.createImageInput(pos);\n }\n }\n transformer.nodes([]);\n return;\n }\n\n if (this._markupMode === \"Text\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Text\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._textInputRef && this._textInputRef.value)\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n else\n this.createTextInput(\n { x: e.target.attrs.x, y: e.target.attrs.y },\n e.evt.pageX,\n e.evt.pageY,\n e.target.attrs.rotation,\n e.target.attrs.text\n );\n return;\n } else {\n this.removeTextInput();\n }\n }\n\n if (this._markupMode === \"Image\" || this._markupMode === \"SelectMarkup\") {\n if (e.target.className === \"Image\" && transformer.nodes().length === 1 && transformer.nodes()[0] === e.target) {\n if (this._imageInputRef && this._imageInputRef.value)\n this.addImage(this._imageInputPos, this._imageInputRef.value, 0, 0);\n else this.createImageInput({ x: e.target.attrs.x, y: e.target.attrs.y });\n return;\n } else {\n this.removeImageInput();\n }\n }\n\n if (\n transformer.nodes().filter((x) => x.className === \"Cloud\" || x.className === \"Image\").length > 0 ||\n e.target.className === \"Cloud\" ||\n e.target.className === \"Image\"\n ) {\n transformer.rotateEnabled(false);\n } else {\n transformer.rotateEnabled(true);\n }\n\n // do we pressed shift or ctrl?\n const metaPressed = e.evt.shiftKey || e.evt.ctrlKey || e.evt.metaKey;\n const isSelected = transformer.nodes().indexOf(e.target) >= 0;\n\n if (!metaPressed && !isSelected) {\n // if no key pressed and the node is not selected\n // select just one\n transformer.nodes([e.target]);\n } else if (metaPressed && isSelected) {\n // if we pressed keys and node was selected\n // we need to remove it from selection:\n const nodes = transformer.nodes().slice(); // use slice to have new copy of array\n // remove node from array\n nodes.splice(nodes.indexOf(e.target), 1);\n transformer.nodes(nodes);\n } else if (metaPressed && !isSelected) {\n // add the node into selection\n const nodes = transformer.nodes().concat([e.target]);\n transformer.nodes(nodes);\n }\n });\n\n const container = stage.container();\n container.tabIndex = 1;\n // focus it\n // also stage will be in focus on its click\n container.focus();\n\n container.addEventListener(\"keydown\", (e) => {\n if (!this._markupIsActive) return;\n if (e.code === \"Delete\") {\n this.getSelectedObjects().forEach((obj: IMarkupObject) => obj.delete());\n this.clearSelected();\n return;\n }\n e.preventDefault();\n });\n }\n\n private destroyKonva() {\n this.removeTextInput();\n this.removeImageInput();\n this.clearOverlay();\n\n this._konvaStage?.destroy();\n\n this._groupImages = undefined;\n this._groupGeometry = undefined;\n this._groupTexts = undefined;\n this._konvaLayer = undefined;\n this._konvaTransformer = undefined;\n this._konvaStage = undefined;\n }\n\n private getMarkupLines(): Array<ILine> {\n const lines = [];\n\n this.konvaLayerFind(\"Line\").forEach((ref) => {\n const wcsPoints = ref.getAttr(\"wcsPoints\");\n if (!wcsPoints) return;\n\n const konvaLine = new KonvaLine(null, ref, this._worldTransformer);\n const line: ILine = {\n id: konvaLine.id(),\n points: wcsPoints,\n color: konvaLine.getColor() || \"#ff0000\",\n type: konvaLine.getLineType() || this.lineType,\n width: konvaLine.getLineWidth() || this.lineWidth,\n };\n\n lines.push(line);\n });\n\n return lines;\n }\n\n private getMarkupTexts(): Array<IText> {\n const texts = [];\n\n this.konvaLayerFind(\"Text\").forEach((ref) => {\n const textSize = 0.02;\n const textScale = this._worldTransformer.getScale();\n\n const wcsPosition = ref.getAttr(\"wcsStart\");\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n\n const shape = new KonvaText(null, ref, this._worldTransformer);\n const text: IText = {\n id: shape.id(),\n position: wcsPosition,\n text: shape.getText(),\n text_size: textSize * textScale.y,\n angle: shape.getRotation(),\n color: shape.getColor(),\n font_size: shape.getFontSize() * stageAbsoluteTransform.getMatrix()[0],\n };\n\n texts.push(text);\n });\n\n return texts;\n }\n\n private getMarkupRectangles(): Array<IRectangle> {\n const rectangles = [];\n\n this.konvaLayerFind(\"Rectangle\").forEach((ref) => {\n const wcsStart = ref.getAttr(\"wcsStart\");\n const wcsEnd = ref.getAttr(\"wcsEnd\");\n const screenStart = this._worldTransformer.worldToScreen(wcsStart);\n const screenEnd = this._worldTransformer.worldToScreen(wcsEnd);\n\n const shape = new KonvaRectangle(null, ref, this._worldTransformer);\n const rectangle: IRectangle = {\n id: shape.id(),\n position: wcsStart,\n width: Math.abs(screenStart.x - screenEnd.x),\n height: Math.abs(screenStart.y - screenEnd.y),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n rectangles.push(rectangle);\n });\n\n return rectangles;\n }\n\n private getMarkupEllipses(): Array<IEllipse> {\n const ellipses = [];\n\n this.konvaLayerFind(\"Ellipse\").forEach((ref) => {\n const wcsPosition = ref.getAttr(\"wcsPosition\");\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaEllipse(null, ref, this._worldTransformer);\n const ellipse: IEllipse = {\n id: shape.id(),\n position: wcsPosition,\n radius: {\n x: ref.getRadiusX() * scale,\n y: ref.getRadiusY() * scale,\n },\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n ellipses.push(ellipse);\n });\n\n return ellipses;\n }\n\n private getMarkupArrows(): Array<IArrow> {\n const arrows = [];\n\n this.konvaLayerFind(\"Arrow\").forEach((ref) => {\n // we need getAbsoluteTransform because inside Konva position starts from {0, 0}\n const wcsStart = ref.getAttr(\"wcsStart\");\n const wcsEnd = ref.getAttr(\"wcsEnd\");\n\n const shape = new KonvaArrow(null, ref, this._worldTransformer);\n const arrow: IArrow = {\n id: shape.id(),\n start: wcsStart,\n end: wcsEnd,\n color: shape.getColor(),\n };\n\n arrows.push(arrow);\n });\n\n return arrows;\n }\n\n private getMarkupImages(): Array<IImage> {\n const images = [];\n\n this.konvaLayerFind(\"Image\").forEach((ref) => {\n const wcsStart = ref.getAttr(\"wcsStart\");\n const stageAbsoluteTransform = this._konvaStage.getAbsoluteTransform();\n const scale = stageAbsoluteTransform.getMatrix()[0];\n\n const shape = new KonvaImage(null, ref, this._worldTransformer);\n const image: IImage = {\n id: shape.id(),\n position: wcsStart,\n src: shape.getSrc(),\n width: shape.getWidth() * scale,\n height: shape.getHeight() * scale,\n };\n\n images.push(image);\n });\n\n return images;\n }\n\n private getMarkupClouds(): Array<ICloud> {\n const clouds = [];\n\n this.konvaLayerFind(\"Cloud\").forEach((ref) => {\n const wcsStart = ref.getAttr(\"wcsStart\");\n const wcsEnd = ref.getAttr(\"wcsEnd\");\n const screenStart = this._worldTransformer.worldToScreen(wcsStart);\n const screenEnd = this._worldTransformer.worldToScreen(wcsEnd);\n\n const shape = new KonvaCloud(null, ref, this._worldTransformer);\n const cloud: ICloud = {\n id: shape.id(),\n position: wcsStart,\n width: Math.abs(screenStart.x - screenEnd.x),\n height: Math.abs(screenStart.y - screenEnd.y),\n line_width: shape.getLineWidth(),\n color: shape.getColor(),\n };\n\n clouds.push(cloud);\n });\n\n return clouds;\n }\n\n private combineMarkupWithDrawing() {\n this.clearSelected();\n\n const tempCanvas = document.createElement(\"canvas\");\n if (this._konvaStage) {\n tempCanvas.width = this._konvaStage.width();\n tempCanvas.height = this._konvaStage.height();\n\n const ctx = tempCanvas.getContext(\"2d\");\n if (this._container instanceof HTMLCanvasElement) ctx.drawImage(this._container, 0, 0);\n ctx.drawImage(this._konvaStage.toCanvas({ pixelRatio: window.devicePixelRatio }), 0, 0);\n }\n\n return tempCanvas.toDataURL(\"image/jpeg\", 0.25);\n }\n\n private addLine(\n linePoints: number[],\n color?: string,\n type?: MarkupLineType,\n width?: number,\n id?: string\n ): KonvaLine | void {\n if (!linePoints || linePoints.length === 0) return;\n\n const points: { x: number; y: number }[] = [];\n for (let i = 0; i < linePoints.length; i += 2) {\n points.push({ x: linePoints[i], y: linePoints[i + 1] });\n }\n\n const konvaLine = new KonvaLine(\n {\n points,\n type: type || this.lineType,\n width: width || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaLine);\n return konvaLine;\n }\n\n private createTextInput(pos: Konva.Vector2d, inputX: number, inputY: number, angle: number, text: string): void {\n if (!this._textInputRef) {\n this._textInputPos = pos;\n this._textInputAngle = angle;\n this._textInputRef = document.createElement(\"textarea\");\n this._textInputRef.style.zIndex = \"9999\";\n this._textInputRef.style.position = \"absolute\";\n this._textInputRef.style.display = \"block\";\n this._textInputRef.style.top = inputY + \"px\";\n this._textInputRef.style.left = inputX + \"px\";\n this._textInputRef.style.fontSize = `${this.fontSize}px`;\n this._textInputRef.style.color = `${this._markupColor.asHex()}`;\n this._textInputRef.style.fontFamily = \"Calibri\";\n\n this._textInputRef.onkeydown = (event) => {\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n this.addText(this._textInputRef.value, this._textInputPos, this._textInputAngle);\n }\n if (event.key === \"Escape\") {\n event.preventDefault();\n this.removeTextInput();\n }\n };\n if (text) this._textInputRef.value = text;\n document.body.appendChild(this._textInputRef);\n\n setTimeout(() => {\n this._textInputRef.focus();\n }, 50);\n } else {\n this.removeTextInput();\n }\n }\n\n private removeTextInput(): void {\n this._textInputRef?.remove();\n this._textInputRef = null;\n this._textInputPos = null;\n this._textInputAngle = 0;\n }\n\n private createImageInput(pos: Konva.Vector2d): void {\n if (!this._imageInputRef) {\n const convertBase64 = (file) => {\n return new Promise<string | ArrayBuffer>((resolve, reject) => {\n const fileReader = new FileReader();\n fileReader.readAsDataURL(file);\n\n fileReader.onload = () => {\n resolve(fileReader.result);\n };\n\n fileReader.onerror = (error) => {\n reject(error);\n };\n });\n };\n\n this._imageInputPos = pos;\n this._imageInputRef = document.createElement(\"input\");\n this._imageInputRef.style.display = \"none\";\n this._imageInputRef.type = \"file\";\n this._imageInputRef.accept = \"image/png, image/jpeg\";\n this._imageInputRef.onchange = async (event) => {\n const file = (event.target as HTMLInputElement).files[0];\n const base64 = await convertBase64(file);\n this.addImage({ x: this._imageInputPos.x, y: this._imageInputPos.y }, base64.toString(), 0, 0);\n };\n this._imageInputRef.oncancel = (event) => {\n this.removeImageInput();\n };\n document.body.appendChild(this._imageInputRef);\n\n setTimeout(() => {\n this._imageInputRef.click();\n }, 50);\n } else {\n this.removeImageInput();\n }\n }\n\n private removeImageInput(): void {\n this._imageInputRef?.remove();\n this._imageInputRef = null;\n this._imageInputPos = null;\n }\n\n private addText(\n text: string,\n position: Konva.Vector2d,\n angle?: number,\n color?: string,\n textSize?: number,\n fontSize?: number,\n id?: string\n ): KonvaText | void {\n if (!text) return;\n\n // in case of edit - remove old Konva.Text object\n this.getSelectedObjects().at(0)?.delete();\n\n this.clearSelected();\n this.removeTextInput();\n\n // in case we have old viewpoint without font_size\n const tolerance = 1.0e-6;\n if (textSize && textSize > tolerance && (!fontSize || fontSize < tolerance)) {\n const size = 0.02;\n const scale = this._worldTransformer.getScale();\n fontSize = textSize / (scale.y / size) / 34;\n }\n\n const konvaText = new KonvaText(\n {\n position: { x: position.x, y: position.y },\n text,\n rotation: angle,\n fontSize: fontSize || this.fontSize,\n color: color || this._markupColor.asHex(),\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaText);\n return konvaText;\n }\n\n private addRectangle(\n position: Konva.Vector2d,\n position2: Konva.Vector2d,\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaRectangle | void {\n if (!position) return;\n\n const konvaRectangle = new KonvaRectangle(\n {\n position,\n position2,\n width,\n height,\n lineWidth: lineWidth || this.lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaRectangle);\n return konvaRectangle;\n }\n\n private addEllipse(\n position: Konva.Vector2d,\n radius: Konva.Vector2d,\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaEllipse | void {\n if (!position) return;\n\n const konvaEllipse = new KonvaEllipse(\n {\n position,\n radius,\n lineWidth,\n color: color || this._markupColor.asHex(),\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaEllipse);\n return konvaEllipse;\n }\n\n private addArrow(start: Konva.Vector2d, end: Konva.Vector2d, color?: string, id?: string): KonvaArrow | void {\n if (!start || !end) return;\n\n const konvaArrow = new KonvaArrow(\n {\n start,\n end,\n color: color || this._markupColor.asHex(),\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaArrow);\n return konvaArrow;\n }\n\n private addCloud(\n position: Konva.Vector2d,\n position2: Konva.Vector2d,\n width: number,\n height: number,\n lineWidth?: number,\n color?: string,\n id?: string\n ): KonvaCloud | void {\n if (!position || !width || !height) return;\n\n const konvaCloud = new KonvaCloud(\n {\n position,\n position2,\n width,\n height,\n color: color || this._markupColor.asHex(),\n lineWidth: lineWidth || this.lineWidth,\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaCloud);\n return konvaCloud;\n }\n\n private addImage(\n position: Konva.Vector2d,\n src: string,\n width?: number,\n height?: number,\n id?: string\n ): KonvaImage | void {\n if (!position || !src) return;\n\n // in case of edit - remove old Image placeholder object\n this.getSelectedObjects().at(0)?.delete();\n\n this.clearSelected();\n this.removeImageInput();\n\n const konvaImage = new KonvaImage(\n {\n position,\n src,\n width,\n height,\n maxWidth: this._konvaStage.width() - position.x,\n maxHeight: this._konvaStage.height() - position.y,\n id,\n },\n null,\n this._worldTransformer\n );\n\n this.addObject(konvaImage);\n return konvaImage;\n }\n}\n"],"names":["WorldTransform","screenToWorld","position","x","y","z","worldToScreen","getScale","MarkupColor","constructor","r","g","b","this","setColor","asHex","HEX","asRGB","R","G","B","rgbToHex","valueToHex","c","hex","toString","LineTypeSpecs","Map","KonvaLine","params","ref","worldTransformer","_worldTransformer","_ref","wcsPoints","getAttr","points","wcsPoint","i","length","push","setAttr","konvaPoints","forEach","point","Konva","Line","stroke","_a","color","strokeWidth","_b","width","globalCompositeOperation","lineCap","lineJoin","draggable","strokeScaleEnabled","dash","get","type","on","e","attrs","target","rotation","absoluteTransform","getAbsoluteTransform","id","_id","enableMouseEditing","value","getColor","getRotation","setRotation","degrees","getZIndex","zIndex","setZIndex","destroy","getPoints","setLineWidth","size","getLineWidth","getLineType","typeSpecs","setLineType","specs","addPoints","newPoints","concat","updateScreenCoordinates","invert","copy","screenPoint","clearCache","KonvaText","TEXT_FONT_FAMILY","wcsStart","text","Text","fontSize","fontFamily","fill","align","_c","getTextWidth","scaleByX","Math","abs","scaleX","scaleByY","scaleY","newWidth","newHeight","height","minWidth","round","getFontSize","scale","getStage","getText","setText","getPosition","setPosition","setFontSize","screenPositionStart","positionStart","KonvaRectangle","wcsEnd","rightBottomPoint","position2","Rect","lineWidth","_d","minHeight","getWidth","getHeigth","setWidth","w","rightLowerPoint","wcsRightLowerPoint","setHeight","h","screenPositionEnd","positionEnd","KonvaEllipse","wcsPosition","radiusX","radiusY","radius","Ellipse","newRadiusX","newRadiusY","minRadiusX","minRadiusY","evt","ctrlKey","shiftKey","getRadiusX","setRadiusX","getRadiusY","setRadiusY","screenPosition","KonvaArrow","start","end","Arrow","transformStart","transformEnd","setPoints","getStartPoint","setStartPoint","getEndPoint","setEndPoint","screenStartPoint","screenEndPoint","startPoint","endPoint","KonvaImage","_ratio","EPSILON","BASE64_HEADER_START","BASE64_NOT_FOUND","src","startsWith","_canvasImage","image","Image","onload","maxWidth","heightOutOfCanvas","maxHeight","widthOutOfCanvas","onerror","getSrc","setSrc","getHeight","KonvaCloud","ARC_RADIUS","Shape","sceneFunc","context","shape","calculateMidpoint","midX","midY","midPoint","baseArcLength","beginPath","iPoint","approxArcLength","dx","dy","sqrt","arcCount","floor","lengthMod","pX","pY","pEndX","pEndY","endAngle","atan","startAngle","PI","counterClockwise","iArc","arc","closePath","fillStrokeShape","className","getSelfRect","MarkupMode2Konva","SelectMarkup","name","initializer","attr","Rectangle","Cloud","debounce","func","wait","timeout","args","clearTimeout","setTimeout","KonvaMarkup","_markupIsActive","_markupColor","lineType","changeActiveDragger","event","draggerName","data","_markupContainer","_container","split","filter","toLowerCase","join","removeTextInput","removeImageInput","enableEditMode","resizeContainer","entries","contentRect","_konvaStage","getObjects","markupObject","resizeViewer","pan","zoomAt","redirectToViewer","_viewer","emit","getRelativePointPosition","node","transform","getRelativePointerPosition","getPointerPosition","initialize","container","containerEvents","viewer","Error","undefined","document","createElement","style","top","left","outline","pointerEvents","parentDiv","parentElement","appendChild","addEventListener","_resizeObserver","ResizeObserver","initializeKonva","dispose","removeEventListener","destroyKonva","disconnect","remove","syncOverlay","clearOverlay","clearSelected","obj","delete","getMarkupColor","setMarkupColor","colorizeAllMarkup","hexColor","call","colorizeSelectedMarkups","getSelectedObjects","setViewpoint","viewpoint","markupColor","custom_fields","markup_color","lines","line","linePoints","addLine","texts","addText","angle","text_size","font_size","rectangles","rect","addRectangle","line_width","_e","ellipses","ellipse","addEllipse","_f","arrows","arrow","addArrow","_g","clouds","cloud","addCloud","_h","images","addImage","getViewpoint","getMarkupLines","getMarkupTexts","getMarkupArrows","getMarkupClouds","getMarkupEllipses","getMarkupImages","getMarkupRectangles","snapshot","combineMarkupWithDrawing","mode","_markupMode","createObject","konvaShape","object","addObject","objects","Object","keys","konvaLayerFind","_konvaTransformer","nodes","map","values","find","selectObjects","selectedObjs","_groupImages","add","_groupTexts","_groupGeometry","_konvaLayer","parent","stage","Stage","clientWidth","clientHeight","layer","Layer","pixelRation","window","devicePixelRatio","Group","transformer","Transformer","shouldOverdrawWholeArea","keepRatio","flipEnabled","isPaint","lastLine","mouseDownPos","lastObj","pos","some","m","defParams","startX","min","startY","dX","dY","max","_textInputRef","_textInputPos","_textInputAngle","createTextInput","pageX","pageY","_imageInputRef","_imageInputPos","createImageInput","rotateEnabled","metaPressed","metaKey","isSelected","indexOf","slice","splice","tabIndex","focus","code","preventDefault","konvaLine","textSize","textScale","stageAbsoluteTransform","getMatrix","screenStart","screenEnd","rectangle","tempCanvas","ctx","getContext","HTMLCanvasElement","drawImage","toCanvas","pixelRatio","toDataURL","inputX","inputY","display","onkeydown","key","body","convertBase64","file","Promise","resolve","reject","fileReader","FileReader","readAsDataURL","result","error","accept","onchange","async","files","base64","oncancel","click","at","tolerance","konvaText","konvaRectangle","konvaEllipse","konvaArrow","konvaCloud","konvaImage"],"mappings":"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"}
|