@vertexvis/viewer 1.0.0-testing.7 → 1.0.0-testing.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +15 -5
- package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js.map +1 -1
- package/dist/collection/components/viewer-markup/viewer-markup-components.js +12 -2
- package/dist/collection/components/viewer-markup/viewer-markup-components.js.map +1 -1
- package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow.js +1 -1
- package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow.js.map +1 -1
- package/dist/collection/components/viewer-markup-circle/viewer-markup-circle.js +1 -1
- package/dist/collection/components/viewer-markup-circle/viewer-markup-circle.js.map +1 -1
- package/dist/collection/components/viewer-markup-freeform/viewer-markup-freeform.js +1 -1
- package/dist/collection/components/viewer-markup-freeform/viewer-markup-freeform.js.map +1 -1
- package/dist/components/{p-CjiOj-dT.js → p-5_uPLHD2.js} +2 -2
- package/dist/components/{p-CjiOj-dT.js.map → p-5_uPLHD2.js.map} +1 -1
- package/dist/components/{p-DTWAiCst.js → p-BYYwcm7k.js} +2 -2
- package/dist/components/{p-C2vaYcRL.js → p-CCg_OPx0.js} +2 -2
- package/dist/components/{p-C2vaYcRL.js.map → p-CCg_OPx0.js.map} +1 -1
- package/dist/components/{p-rAFiyecT.js → p-D40K0qiO.js} +2 -2
- package/dist/components/{p-rAFiyecT.js.map → p-D40K0qiO.js.map} +1 -1
- package/dist/components/{p-Dru_6caB.js → p-DXGQW235.js} +2 -2
- package/dist/components/p-DXGQW235.js.map +1 -0
- package/dist/components/vertex-viewer-markup-arrow.js +1 -1
- package/dist/components/vertex-viewer-markup-circle.js +1 -1
- package/dist/components/vertex-viewer-markup-freeform.js +1 -1
- package/dist/components/vertex-viewer-markup-tool.js +1 -1
- package/dist/components/vertex-viewer-markup.js +1 -1
- package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +15 -5
- package/dist/esm/vertex-viewer-markup-arrow_3.entry.js.map +1 -1
- package/dist/types/components/viewer-markup/viewer-markup-components.d.ts +1 -0
- package/dist/types/testing/random.d.ts +1 -0
- package/dist/viewer/p-e50d025a.entry.js +5 -0
- package/dist/viewer/p-e50d025a.entry.js.map +1 -0
- package/dist/viewer/viewer.esm.js +1 -1
- package/package.json +7 -7
- package/dist/components/p-Dru_6caB.js.map +0 -1
- package/dist/viewer/p-52cbea01.entry.js +0 -5
- package/dist/viewer/p-52cbea01.entry.js.map +0 -1
- /package/dist/components/{p-DTWAiCst.js.map → p-BYYwcm7k.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"vertex-viewer-markup-arrow_3.entry.js","mappings":"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","names":["Point","Rectangle","Dimensions","dimensions","point","angle","Angle","classNames"],"sources":["src/components/viewer-markup/markup-utils.ts","src/components/viewer-markup/viewer-markup-components.tsx","src/lib/markup/interactions.ts","src/components/viewer-markup-arrow/interactions.ts","src/components/viewer-markup-arrow/viewer-markup-arrow-components.tsx","src/components/viewer-markup-arrow/viewer-markup-arrow.css?tag=vertex-viewer-markup-arrow&encapsulation=shadow","src/components/viewer-markup-arrow/viewer-markup-arrow.tsx","src/components/viewer-markup-circle/interactions.ts","src/components/viewer-markup-circle/viewer-markup-circle-components.tsx","src/components/viewer-markup-circle/viewer-markup-circle.css?tag=vertex-viewer-markup-circle&encapsulation=shadow","src/components/viewer-markup-circle/viewer-markup-circle.tsx","src/components/viewer-markup-freeform/interactions.ts","src/components/viewer-markup-freeform/viewer-markup-freeform.css?tag=vertex-viewer-markup-freeform&encapsulation=shadow","src/components/viewer-markup-freeform/viewer-markup-freeform.tsx"],"sourcesContent":["import { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\n\nimport { MarkupCenteringBehavior } from '../../lib/types';\nimport { isVertexViewerArrowMarkup } from '../viewer-markup-arrow/utils';\nimport { isVertexViewerCircleMarkup } from '../viewer-markup-circle/utils';\nimport { isVertexViewerFreeformMarkup } from '../viewer-markup-freeform/utils';\n\nexport type BoundingBox2dAnchorPosition =\n | 'left'\n | 'right'\n | 'top'\n | 'bottom'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n | 'center';\n\nexport function getBoundingBox2dAnchorPosition(\n rect: Rectangle.Rectangle,\n position: BoundingBox2dAnchorPosition\n): Point.Point {\n switch (position) {\n case 'top-left':\n return Point.create(rect.x, rect.y);\n case 'top':\n return Point.create(rect.x + rect.width / 2, rect.y);\n case 'top-right':\n return Point.create(rect.x + rect.width, rect.y);\n case 'right':\n return Point.create(rect.x + rect.width, rect.y + rect.height / 2);\n case 'bottom-right':\n return Point.create(rect.x + rect.width, rect.y + rect.height);\n case 'bottom':\n return Point.create(rect.x + rect.width / 2, rect.y + rect.height);\n case 'bottom-left':\n return Point.create(rect.x, rect.y + rect.height);\n case 'left':\n return Point.create(rect.x, rect.y + rect.height / 2);\n case 'center':\n return Rectangle.center(rect);\n }\n}\n\nexport function translatePointToScreen(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1\n): Point.Point {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativePoint = Point.add(\n Point.scale(pt, contentScaleFactor, contentScaleFactor),\n Dimensions.center(contentDimensions)\n );\n\n // Include an offset for width and height to account for cases where the\n // content dimensions are smaller than the canvas dimensions.\n const scaledContentWidth = contentDimensions.width * effectiveScalar;\n const scaledContentHeight = contentDimensions.height * effectiveScalar;\n const centerOffsetX =\n centeringBehavior === 'both' || centeringBehavior === 'x-only'\n ? Math.max(0, (canvasDimensions.width - scaledContentWidth) / 2)\n : 0;\n const centerOffsetY =\n centeringBehavior === 'both' || centeringBehavior === 'y-only'\n ? Math.max(0, (canvasDimensions.height - scaledContentHeight) / 2)\n : 0;\n\n return Point.create(\n contentRelativePoint.x * effectiveScalar + centerOffsetX,\n contentRelativePoint.y * effectiveScalar + centerOffsetY\n );\n}\n\nexport function translatePointToBounds(\n pt: Point.Point,\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions\n): Point.Point {\n const rectToScreen = translateRectToScreen(rect, canvasDimensions);\n return Point.add(pt, rectToScreen);\n}\n\nexport function translateDimensionsToScreen(\n dimensions: Dimensions.Dimensions,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n scale = 1\n): Dimensions.Dimensions {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativeDimensions = Dimensions.scale(\n contentScaleFactor,\n contentScaleFactor,\n dimensions\n );\n\n return Dimensions.scale(\n effectiveScalar,\n effectiveScalar,\n contentRelativeDimensions\n );\n}\n\n/**\n * Translates a rectangle in relative units, to a rectangle in screen units.\n *\n * Shape coordinates are persisted in relative units, so they can be presented\n * at any size.\n */\nexport function translateRectToScreen(\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions?: Dimensions.Dimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1\n): Rectangle.Rectangle {\n const position = translatePointToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n centeringBehavior,\n scale\n );\n const dimensions = translateDimensionsToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n scale\n );\n return Rectangle.fromPointAndDimensions(position, dimensions);\n}\n\n/**\n * Translates a point in screen units, to a point in relative units.\n */\nexport function translatePointToRelative(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions\n): Point.Point {\n const scaleFactor = 1 / getScaleFactor(canvasDimensions);\n const point = Point.scale(\n Point.subtract(pt, Dimensions.center(canvasDimensions)),\n scaleFactor,\n scaleFactor\n );\n\n return point;\n}\n\n/**\n * Translates a set of points in relative `original` units to\n * points in relative `bounds` units.\n */\nexport function translatePointsToBounds(\n points: Point.Point[],\n original: Rectangle.Rectangle,\n bounds: Rectangle.Rectangle\n): Point.Point[] {\n return points.map((pt) =>\n Point.add(\n Point.scale(\n Point.subtract(pt, original),\n bounds.width / (original.width || 1),\n bounds.height / (original.height || 1)\n ),\n bounds\n )\n );\n}\n\nexport function createRectangle(\n initialPoint: Point.Point,\n currentPoint: Point.Point,\n maintainAspectRatio: boolean\n): Rectangle.Rectangle {\n const bounds = Rectangle.fromPoints(initialPoint, currentPoint);\n if (maintainAspectRatio) {\n const fitBoundsSize = Math.max(bounds.width, bounds.height);\n const isPortrait = bounds.height > bounds.width;\n const currentIsLeftOfInitial = currentPoint.x <= initialPoint.x;\n const currentIsAboveInitial = currentPoint.y <= initialPoint.y;\n const fitBoundsX = currentIsLeftOfInitial\n ? isPortrait\n ? initialPoint.x - fitBoundsSize\n : currentPoint.x\n : initialPoint.x;\n const fitBoundsY = currentIsAboveInitial\n ? isPortrait\n ? currentPoint.y\n : initialPoint.y - fitBoundsSize\n : initialPoint.y;\n return Rectangle.create(\n fitBoundsX,\n fitBoundsY,\n fitBoundsSize,\n fitBoundsSize\n );\n } else {\n return bounds;\n }\n}\n\nexport function transformRectangle(\n bounds: Rectangle.Rectangle,\n start: Point.Point,\n current: Point.Point,\n anchor: BoundingBox2dAnchorPosition,\n maintainAspectRatio?: boolean\n): Rectangle.Rectangle {\n const delta = Point.subtract(current, start);\n const { x: left, y: top, width: w, height: h } = bounds;\n const right = left + w;\n const bottom = top + h;\n const topLeft = Point.create(left, top);\n const bottomLeft = Point.create(left, bottom);\n const topRight = Point.create(right, top);\n const bottomRight = Point.create(right, bottom);\n switch (anchor) {\n case 'top-left':\n return createRectangle(bottomRight, current, !!maintainAspectRatio);\n case 'top':\n return createRectangle(\n bottomRight,\n Point.create(left, current.y),\n !!maintainAspectRatio\n );\n case 'top-right':\n return createRectangle(bottomLeft, current, !!maintainAspectRatio);\n case 'right':\n return createRectangle(\n bottomLeft,\n Point.create(current.x, top),\n !!maintainAspectRatio\n );\n case 'bottom-right':\n return createRectangle(topLeft, current, !!maintainAspectRatio);\n case 'bottom':\n return createRectangle(\n topLeft,\n Point.create(right, current.y),\n !!maintainAspectRatio\n );\n case 'bottom-left':\n return createRectangle(topRight, current, !!maintainAspectRatio);\n case 'left':\n return createRectangle(\n bottomRight,\n Point.create(current.x, top),\n !!maintainAspectRatio\n );\n case 'center':\n return Rectangle.create(\n bounds.x + delta.x,\n bounds.y + delta.y,\n bounds.width,\n bounds.height\n );\n }\n}\n\nexport function isVertexViewerMarkupElement(\n el: HTMLElement\n): el is\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement {\n return (\n isVertexViewerArrowMarkup(el) ||\n isVertexViewerCircleMarkup(el) ||\n isVertexViewerFreeformMarkup(el)\n );\n}\n\nexport function isValidPointData(...points: Point.Point[]): boolean {\n return points.every((pt) => !isNaN(pt.x) && !isNaN(pt.y));\n}\n\nexport function isValidStartEvent(event: PointerEvent): boolean {\n const el = event.target as HTMLElement;\n\n return isVertexViewerMarkupElement(el) && el.mode !== 'edit';\n}\n\nfunction getScaleFactor(dimensions: Dimensions.Dimensions): number {\n // We intentionally use the content's height when scaling to maintain a consistent coordinate\n // space for markup. This is to ensure the markup will be displayed in the same position\n // on the canvas regardless of the aspect ratio at the time the markup was created.\n // See https://github.com/Vertexvis/vertex-web-sdk/pull/429 for more details.\n return dimensions.height;\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nexport interface RelativeAnchorProps {\n id?: string;\n transform?: string;\n rotation?: number;\n name: string;\n point: Point.Point;\n onPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const RelativeAnchor: FunctionalComponent<RelativeAnchorProps> = (\n { id, transform, rotation, name, point, onPointerDown },\n children\n) => {\n return (\n <div\n id={id}\n class=\"bounds-anchor-position\"\n style={{\n top: `${point.y}px`,\n left: `${point.x}px`,\n }}\n onTouchStart={(event) => event.preventDefault()}\n onPointerDown={onPointerDown}\n >\n <div style={{ transform }}>\n <div\n class=\"bounds-anchor\"\n style={{\n transform: `rotateZ(${rotation ?? 0}deg)`,\n }}\n >\n <slot name={name}>{children}</slot>\n </div>\n </div>\n </div>\n );\n};\n\nexport interface SvgShadowProps {\n id: string;\n}\n\nexport const SvgShadow: FunctionalComponent<SvgShadowProps> = ({ id }) => {\n return (\n <filter id={id}>\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"2\" />\n <feOffset dx=\"0\" dy=\"1\" result=\"offsetblur\" />\n <feFlood flood-color=\"#000000\" flood-opacity=\"0.25\" />\n <feComposite in2=\"offsetblur\" operator=\"in\" />\n <feMerge>\n <feMergeNode />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n );\n};\n","import type { InteractionApi, InteractionHandler } from '../interactions';\n\nexport abstract class MarkupInteractionHandler implements InteractionHandler {\n protected element?: HTMLElement;\n protected elementBounds?: DOMRect;\n protected api?: InteractionApi;\n\n private resizeObserver: ResizeObserver;\n\n public constructor() {\n this.resizeObserver = new ResizeObserver(([entry]) => {\n this.elementBounds = this.computeBoundingRect();\n });\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.elementBounds = this.computeBoundingRect();\n this.resizeObserver.observe(this.element);\n\n this.element.addEventListener('pointerdown', this.handlePointerDown);\n }\n\n public dispose(): void {\n this.resizeObserver.disconnect();\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n protected acceptInteraction(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n this.handleInteractionAttempt(event);\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n this.handleInteractionMove(event);\n };\n\n private handlePointerUp = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.handleInteractionEnd(event);\n };\n\n protected abstract computeBoundingRect(): DOMRect;\n\n protected abstract handleInteractionAttempt(event: PointerEvent): void;\n\n protected abstract handleInteractionMove(event: PointerEvent): void;\n\n protected abstract handleInteractionEnd(event: PointerEvent): void;\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n translatePointToRelative,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\n\ntype ViewerMarkupArrowEditAnchor = 'start' | 'end' | 'center';\n\nexport class ArrowMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private anchor: ViewerMarkupArrowEditAnchor = 'end';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupArrowElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: ViewerMarkupArrowEditAnchor,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n this.markupEl.start =\n this.markupEl.start ??\n translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (this.elementBounds != null && this.pointerId === event.pointerId) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n if (this.anchor === 'start') {\n this.markupEl.start = position;\n } else if (this.anchor === 'end') {\n this.markupEl.end = position;\n } else if (this.markupEl.start != null && this.markupEl.end != null) {\n const center = Point.create(\n (this.markupEl.start.x + this.markupEl.end.x) / 2,\n (this.markupEl.start.y + this.markupEl.end.y) / 2\n );\n const xDifference = center.x - position.x;\n const yDifference = center.y - position.y;\n\n this.markupEl.start = Point.create(\n this.markupEl.start.x - xDifference,\n this.markupEl.start.y - yDifference\n );\n this.markupEl.end = Point.create(\n this.markupEl.end.x - xDifference,\n this.markupEl.end.y - yDifference\n );\n }\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n const screenStart =\n this.markupEl.start != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.start, this.elementBounds)\n : undefined;\n const screenEnd =\n this.markupEl.end != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.end, this.elementBounds)\n : undefined;\n\n if (\n this.markupEl.mode !== '' &&\n screenStart != null &&\n screenEnd != null &&\n Point.distance(screenStart, screenEnd) >= 2\n ) {\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.start = undefined;\n this.markupEl.end = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Angle, Point } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox1dProps {\n start: Point.Point;\n end: Point.Point;\n offset?: Point.Point;\n onStartAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n onEndAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox1d: FunctionalComponent<BoundingBox1dProps> = ({\n start,\n end,\n offset,\n onStartAnchorPointerDown,\n onCenterAnchorPointerDown,\n onEndAnchorPointerDown,\n}) => {\n const angle = Angle.normalize(\n Angle.toDegrees(Angle.fromPoints(start, end)) - 270\n );\n const center = Point.create((start.x + end.x) / 2, (start.y + end.y) / 2);\n const transform =\n offset != null ? `translate(${offset.x}px, ${offset.y}px)` : undefined;\n\n return (\n <div class=\"bounds-container\">\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-start-anchor\"\n name=\"start-anchor\"\n rotation={angle}\n point={start}\n onPointerDown={onStartAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-end-anchor\"\n name=\"end-anchor\"\n rotation={angle}\n point={end}\n onPointerDown={onEndAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-arrow-line-stroke-color: A CSS color that\n * specifies the color of the arrow line's outline.\n */\n --viewer-markup-arrow-line-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-line-stroke-width: A CSS length that\n * specifies the width of the arrow line's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-arrow-line-stroke-width: 4px;\n /**\n * @prop --viewer-markup-arrow-head-stroke-color: A CSS color that\n * specifies the color of the arrow head's outline.\n */\n --viewer-markup-arrow-head-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-stroke-width: A CSS length that\n * specifies the width of the arrow head's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-arrow-head-stroke-width: 4px;\n /**\n * @prop --viewer-markup-arrow-head-fill-color: A CSS color that\n * specifies the color of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-fill-opacity: A number between\n * 0 and 1 that specifies the opacity of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-opacity: 1;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-color: A CSS color that\n * specifies the color of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-width: A CSS length that\n * specifies the width of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-background-color: A CSS color that\n * specifies the background color of the arrow start/end resize anchors.\n */\n --viewer-markup-arrow-bounds-cap-background-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center resize anchor.\n */\n --viewer-markup-arrow-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-outline-width: A CSS color that\n * specifies the width of the selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-outline-color: A CSS color that\n * specifies the color of selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-arrow-scale: A number that specifies the scale of the arrow.\n * This is used to scale the arrow's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-arrow-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-line-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-arrow-line-stroke-width) *\n var(--viewer-markup-arrow-scale)\n );\n cursor: default;\n}\n\n.head {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-head-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-arrow-head-stroke-width) *\n var(--viewer-markup-arrow-scale)\n );\n fill: var(--viewer-markup-arrow-head-fill-color);\n fill-opacity: var(--viewer-markup-arrow-head-fill-opacity);\n cursor: default;\n}\n\n.bounds-line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-bounds-outline-color);\n stroke-width: var(--viewer-markup-arrow-bounds-outline-width);\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-arrow-bounds-anchor-width);\n height: var(--viewer-markup-arrow-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-arrow-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-arrow-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-arrow-bounds-center-anchor-background-color\n );\n}\n\n.bounds-cap-anchor {\n border-width: var(--viewer-markup-arrow-bounds-cap-border-width);\n border-color: var(--viewer-markup-arrow-bounds-cap-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-arrow-bounds-cap-background-color);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidPointData,\n isValidStartEvent,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { ArrowMarkupInteractionHandler } from './interactions';\nimport {\n arrowheadPointsToCirclePoints,\n arrowheadPointsToHashPoints,\n arrowheadPointsToPathPoints,\n arrowheadPointsToPolygonPoints,\n createLineAnchorStylePoints,\n LineAnchorStyle,\n LineAnchorStylePoints,\n parsePoint,\n} from './utils';\nimport { BoundingBox1d } from './viewer-markup-arrow-components';\n\n/**\n * The supported arrow markup modes.\n *\n * @see {@link ViewerMarkupArrowMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupArrowMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-arrow',\n styleUrl: 'viewer-markup-arrow.css',\n shadow: true,\n})\nexport class ViewerMarkupArrow {\n /**\n * The position of the starting anchor. Can either be an instance of a\n * `Point` or a JSON string representation in the format of `[x, y]` or\n * `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public start?: Point.Point;\n\n /**\n * The position of the starting anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'start' })\n public startJson?: string;\n\n /**\n * The position of the ending anchor. Can either be an instance of a `Point`\n * or a JSON string representation in the format of `[x, y]` or `{\"x\": 0,\n * \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true })\n public end?: Point.Point;\n\n /**\n * The position of the ending anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'end' })\n public endJson?: string;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * The style of the starting anchor. This defaults to none.\n */\n @Prop({ mutable: true })\n public startLineAnchorStyle: LineAnchorStyle = 'none';\n\n /**\n * The style of the ending anchor. This defaults to 'arrow-triangle.'\n */\n @Prop({ mutable: true })\n public endLineAnchorStyle: LineAnchorStyle = 'arrow-triangle';\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupArrowMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupArrowElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new ArrowMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updatePointsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('start')\n protected handleStartJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('end')\n protected handleEndJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-arrow-scale',\n this.scale?.toString() ?? '1'\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updatePointsFromProps(): void {\n this.start = this.start || parsePoint(this.startJson);\n this.end = this.end || parsePoint(this.endJson);\n }\n\n private renderLineAnchorStyle(\n anchorStyle: LineAnchorStyle,\n arrowheadPoints: LineAnchorStylePoints\n ): h.JSX.IntrinsicElements {\n if (anchorStyle === 'arrow-triangle') {\n return (\n <polygon\n id=\"line-anchor-arrow-triangle\"\n class=\"head\"\n points={arrowheadPointsToPolygonPoints(arrowheadPoints, this.scale)}\n />\n );\n } else if (anchorStyle === 'arrow-line') {\n return (\n <path\n id=\"line-anchor-arrow-line\"\n class=\"head\"\n d={arrowheadPointsToPathPoints(arrowheadPoints, this.scale)}\n />\n );\n } else if (anchorStyle === 'hash') {\n const hashPoints = arrowheadPointsToHashPoints(\n arrowheadPoints,\n this.scale\n );\n\n return <line id=\"line-anchor-hash\" class=\"head\" {...hashPoints} />;\n } else if (anchorStyle === 'dot') {\n const circlePoints = arrowheadPointsToCirclePoints(\n arrowheadPoints,\n this.scale\n );\n\n return <circle id=\"line-anchor-circle\" class=\"head\" {...circlePoints} />;\n } else {\n return <div />;\n }\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.start != null && this.end != null && this.elementBounds != null) {\n const elementBounds = this.elementBounds;\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n const screenStart = translatePointToScreen(\n this.start,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n const screenEnd = translatePointToScreen(\n this.end,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n\n if (isValidPointData(screenStart, screenEnd)) {\n const arrowheadStartPoints = createLineAnchorStylePoints(\n screenEnd,\n screenStart\n );\n const arrowheadEndPoints = createLineAnchorStylePoints(\n screenStart,\n screenEnd\n );\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"arrow-shadow\" />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#arrow-shadow)\"\n >\n {this.renderLineAnchorStyle(\n this.startLineAnchorStyle,\n arrowheadStartPoints\n )}\n <line\n id=\"arrow-line\"\n class=\"line\"\n x1={arrowheadEndPoints.tip.x}\n y1={arrowheadEndPoints.tip.y}\n x2={arrowheadStartPoints.tip.x}\n y2={arrowheadStartPoints.tip.y}\n />\n {this.renderLineAnchorStyle(\n this.endLineAnchorStyle,\n arrowheadEndPoints\n )}\n </g>\n {this.mode === 'edit' && (\n <g transform={`translate(${offsetX} ${offsetY})`}>\n <line\n id=\"bounding-box-1d-line\"\n class=\"bounds-line\"\n x1={screenStart.x}\n y1={screenStart.y}\n x2={screenEnd.x}\n y2={screenEnd.y}\n />\n </g>\n )}\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox1d\n start={screenStart}\n end={screenEnd}\n offset={{ x: offsetX, y: offsetY }}\n onStartAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('start', event)\n }\n onCenterAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('center', event)\n }\n onEndAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('end', event)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return <Host></Host>;\n }\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class CircleMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private startPosition?: Point.Point;\n private resizeBounds?: Rectangle.Rectangle;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupCircleElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.resizeBounds = this.markupEl.bounds;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n this.pointerId = event.pointerId;\n this.startPosition = position;\n this.markupEl.bounds =\n this.markupEl.bounds ?? Rectangle.create(position.x, position.y, 0, 0);\n this.resizeBounds = this.markupEl.bounds;\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.markupEl.bounds != null &&\n this.startPosition != null &&\n this.elementBounds != null &&\n this.pointerId === event.pointerId\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.markupEl.bounds = transformRectangle(\n this.resizeBounds ?? this.markupEl.bounds,\n this.startPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.bounds != null &&\n this.markupEl.bounds?.width > 0 &&\n this.markupEl.bounds?.height > 0\n ) {\n this.anchor = 'bottom-right';\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.bounds = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { getBoundingBox2dAnchorPosition } from '../viewer-markup/markup-utils';\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox2dProps {\n bounds: Rectangle.Rectangle;\n offset?: Point.Point;\n onTopLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onTopRightAnchorPointerDown?: (event: PointerEvent) => void;\n onRightAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomRightAnchorPointerDown?: (event: PointerEvent) => void;\n onTopAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox2d: FunctionalComponent<BoundingBox2dProps> = ({\n bounds,\n offset,\n onTopLeftAnchorPointerDown,\n onLeftAnchorPointerDown,\n onTopRightAnchorPointerDown,\n onRightAnchorPointerDown,\n onBottomLeftAnchorPointerDown,\n onBottomAnchorPointerDown,\n onBottomRightAnchorPointerDown,\n onTopAnchorPointerDown,\n onCenterAnchorPointerDown,\n}) => {\n const padded = Rectangle.pad(bounds, 6);\n const center = Rectangle.center(padded);\n const transform =\n offset != null ? `translate(${offset.x}px, ${offset.y}px)` : undefined;\n\n return (\n <div class=\"bounds-container\">\n <div\n class=\"bounds-outline\"\n style={{\n top: `${padded.y}px`,\n left: `${padded.x}px`,\n width: `${padded.width}px`,\n height: `${padded.height}px`,\n transform,\n }}\n ></div>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-left-anchor\"\n name=\"top-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-left')}\n onPointerDown={onTopLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-left-anchor\"\n name=\"left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'left')}\n onPointerDown={onLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-right-anchor\"\n name=\"top-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-right')}\n onPointerDown={onTopRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-right-anchor\"\n name=\"right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'right')}\n onPointerDown={onRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-left-anchor\"\n name=\"bottom-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-left')}\n onPointerDown={onBottomLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-anchor\"\n name=\"bottom-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom')}\n onPointerDown={onBottomAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-right-anchor\"\n name=\"bottom-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-right')}\n onPointerDown={onBottomRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-anchor\"\n name=\"top-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top')}\n onPointerDown={onTopAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-color: A CSS color that\n * specifies the color of the circle's outline.\n */\n --viewer-markup-circle-ellipse-stroke-color: var(--red-700);\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-width: A CSS length that\n * specifies the width of the circle's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-circle-ellipse-stroke-width: 4px;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-color: A CSS color that\n * specifies the color of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-color: none;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-opacity: A number between\n * 0 and 1 that specifies the opacity of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-opacity: 0;\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-color: A CSS color that\n * specifies the color of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-width: A CSS length that\n * specifies the width of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-color: A CSS color that\n * specifies the color of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-width: A CSS length that\n * specifies the width of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-background-color: A CSS color that\n * specifies the background color of the edge and corner resize anchors.\n */\n --viewer-markup-circle-bounds-edge-anchor-background-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center reposition anchor.\n */\n --viewer-markup-circle-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-circle-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-circle-scale: A number that specifies the scale of the circle.\n * This is used to scale the circle's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-circle-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.ellipse {\n pointer-events: auto;\n stroke: var(--viewer-markup-circle-ellipse-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-circle-ellipse-stroke-width) *\n var(--viewer-markup-circle-scale)\n );\n fill: var(--viewer-markup-circle-ellipse-fill-color);\n fill-opacity: var(--viewer-markup-circle-ellipse-fill-opacity);\n cursor: default;\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-outline {\n position: absolute;\n border-width: var(--viewer-markup-circle-bounds-outline-border-width);\n border-color: var(--viewer-markup-circle-bounds-outline-border-color);\n border-style: solid;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-circle-bounds-anchor-width);\n height: var(--viewer-markup-circle-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-circle-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-circle-bounds-center-anchor-background-color\n );\n}\n\n.bounds-edge-anchor {\n border-width: var(--viewer-markup-circle-bounds-edge-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-edge-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-circle-bounds-edge-anchor-background-color\n );\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { CircleMarkupInteractionHandler } from './interactions';\nimport { parseBounds } from './utils';\nimport { BoundingBox2d } from './viewer-markup-circle-components';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupCircleMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupCircleMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-circle',\n styleUrl: 'viewer-markup-circle.css',\n shadow: true,\n})\nexport class ViewerMarkupCircle {\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupCircleMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupCircleElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new CircleMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredHandler?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updateBoundsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updateBoundsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n if (newViewer != null) {\n this.registeredHandler = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('bounds')\n protected handleBoundsJsonChange(): void {\n this.updateBoundsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-circle-scale',\n this.scale.toString()\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updateBoundsFromProps(): void {\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.bounds != null && this.elementBounds != null) {\n const relativeBounds = translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n const center = Rectangle.center(relativeBounds);\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"circle-shadow\" />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#circle-shadow)\"\n >\n <ellipse\n class=\"ellipse\"\n cx={center.x}\n cy={center.y}\n rx={relativeBounds.width / 2}\n ry={relativeBounds.height / 2}\n stroke={'#000ff0'}\n stroke-width={4}\n fill={'none'}\n />\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox2d\n bounds={relativeBounds}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointsToBounds,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class FreeformMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private min?: Point.Point;\n private max?: Point.Point;\n\n private resizeBounds?: Rectangle.Rectangle;\n private resizePoints?: Point.Point[];\n private resizeStartPosition?: Point.Point;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupFreeformElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit' && this.elementBounds != null) {\n this.resizeBounds = this.markupEl.bounds;\n this.resizePoints = this.markupEl.points;\n this.anchor = anchor;\n this.resizeStartPosition = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n window.addEventListener('pointermove', this.handleResizeInteractionMove);\n window.addEventListener('pointerup', this.handleResizeInteractionEnd);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n this.updateMinAndMax(position);\n this.markupEl.points = this.markupEl.points ?? [position];\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.pointerId === event.pointerId &&\n this.markupEl.points != null &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n this.updateMinAndMax(position);\n this.markupEl.points = [...this.markupEl.points, position];\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.points != null &&\n this.markupEl.points.length > 2 &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(\n event,\n this.elementBounds\n );\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n\n this.updateMinAndMax(position);\n\n this.markupEl.points = [...this.markupEl.points, position];\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.points = undefined;\n }\n\n this.min = undefined;\n this.max = undefined;\n this.pointerId = undefined;\n }\n }\n\n private handleResizeInteractionMove = (event: PointerEvent): void => {\n if (\n this.resizeStartPosition != null &&\n this.elementBounds != null &&\n this.resizeBounds != null &&\n this.resizePoints != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n const updatedBounds = transformRectangle(\n this.resizeBounds,\n this.resizeStartPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n\n this.markupEl.points = translatePointsToBounds(\n this.resizePoints,\n this.resizeBounds,\n updatedBounds\n );\n this.markupEl.bounds = updatedBounds;\n }\n };\n\n private handleResizeInteractionEnd = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handleResizeInteractionMove);\n window.removeEventListener('pointerup', this.handleResizeInteractionEnd);\n\n this.resizeBounds = undefined;\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n };\n\n private updateMinAndMax(position: Point.Point): void {\n this.min =\n this.min != null\n ? Point.create(\n Math.min(this.min.x, position.x),\n Math.min(this.min.y, position.y)\n )\n : position;\n this.max =\n this.max != null\n ? Point.create(\n Math.max(this.max.x, position.x),\n Math.max(this.max.y, position.y)\n )\n : position;\n this.markupEl.bounds = Rectangle.create(\n this.min.x,\n this.min.y,\n this.max.x - this.min.x,\n this.max.y - this.min.y\n );\n }\n}\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-freeform-stroke-color: A CSS color that\n * specifies the color of the freeform line.\n */\n --viewer-markup-freeform-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-freeform-stroke-width: A CSS length that\n * specifies the width of the freeform line.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-freeform-stroke-width: 4px;\n /**\n * @prop --viewer-markup-freeform-line-join: The join behavior between\n * the lines making up this freeform markup. Defaults to `round`.\n */\n --viewer-markup-freeform-line-join: round;\n /**\n * @prop --viewer-markup-freeform-line-cap: The cap behavior for\n * the lines making up this freeform markup. Defaults to `round`.\n */\n --viewer-markup-freeform-line-cap: round;\n /**\n * @prop --viewer-markup-freeform-bounds-outline-border-color: A CSS color that\n * specifies the color of the circle's selected bounding box border.\n */\n --viewer-markup-freeform-bounds-outline-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-freeform-bounds-outline-border-width: A CSS length that\n * specifies the width of the circle's selected bounding box border.\n */\n --viewer-markup-freeform-bounds-outline-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-border-color: A CSS color that\n * specifies the color of the edge and corner resize anchors' borders.\n */\n --viewer-markup-freeform-bounds-edge-anchor-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-border-width: A CSS length that\n * specifies the width of the edge and corner resize anchors' borders.\n */\n --viewer-markup-freeform-bounds-edge-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-background-color: A CSS color that\n * specifies the background color of the edge and corner resize anchors.\n */\n --viewer-markup-freeform-bounds-edge-anchor-background-color: white;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center reposition anchor's border.\n */\n --viewer-markup-freeform-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center reposition anchor's border.\n */\n --viewer-markup-freeform-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center reposition anchor.\n */\n --viewer-markup-freeform-bounds-center-anchor-background-color: var(\n --blue-400\n );\n /**\n * @prop --viewer-markup-freeform-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-freeform-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-freeform-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-freeform-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-freeform-scale: A number that specifies the scale of the freeform.\n * This is used to scale the freeform's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-freeform-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.path {\n pointer-events: auto;\n cursor: default;\n stroke: var(--viewer-markup-freeform-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-freeform-stroke-width) *\n var(--viewer-markup-freeform-scale)\n );\n stroke-linejoin: var(--viewer-markup-freeform-line-join);\n stroke-linecap: var(--viewer-markup-freeform-line-cap);\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-outline {\n position: absolute;\n border-width: var(--viewer-markup-freeform-bounds-outline-border-width);\n border-color: var(--viewer-markup-freeform-bounds-outline-border-color);\n border-style: solid;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-freeform-bounds-anchor-width);\n height: var(--viewer-markup-freeform-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-freeform-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-freeform-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-freeform-bounds-center-anchor-background-color\n );\n}\n\n.bounds-edge-anchor {\n border-width: var(--viewer-markup-freeform-bounds-edge-anchor-border-width);\n border-color: var(--viewer-markup-freeform-bounds-edge-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-freeform-bounds-edge-anchor-background-color\n );\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translatePointToScreen,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { parseBounds } from '../viewer-markup-circle/utils';\nimport { BoundingBox2d } from '../viewer-markup-circle/viewer-markup-circle-components';\nimport { FreeformMarkupInteractionHandler } from './interactions';\nimport { parsePoints } from './utils';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupFreeformMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupFreeformMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-freeform',\n styleUrl: 'viewer-markup-freeform.css',\n shadow: true,\n})\nexport class ViewerMarkupFreeform {\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public points?: Point.Point[];\n\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'points' })\n public pointsJson?: string;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupFreeformMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupFreeformElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private screenPoints: Point.Point[] = [];\n\n private interactionHandler = new FreeformMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('originatingViewport')\n @Watch('offset')\n @Watch('scale')\n @Watch('bounds')\n @Watch('points')\n protected recomputePointsFromProps(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-freeform-scale',\n this.scale.toString()\n );\n });\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n this.screenPoints = this.convertPointsToScreen() ?? this.screenPoints;\n }\n\n private updatePointsFromProps(): void {\n this.points = this.points ?? parsePoints(this.pointsJson);\n this.screenPoints = this.convertPointsToScreen() ?? [];\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.screenPoints.length > 0 && this.elementBounds != null) {\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"freeform-markup-shadow\" />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#freeform-markup-shadow)\"\n >\n <path\n class=\"path\"\n d={this.screenPoints.reduce(\n (d, pt) => `${d}L${pt.x},${pt.y}`,\n `M${this.screenPoints[0].x},${this.screenPoints[0].y}`\n )}\n fill=\"none\"\n />\n </g>\n </svg>\n {this.mode === 'edit' && this.bounds != null && (\n <BoundingBox2d\n bounds={translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n\n private convertPointsToScreen(): Point.Point[] | undefined {\n const elementBounds = this.elementBounds;\n if (elementBounds != null) {\n return this.points?.map((pt) =>\n translatePointToScreen(\n pt,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )\n );\n }\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"vertex-viewer-markup-arrow_3.entry.js","mappings":"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","names":["Point","Rectangle","Dimensions","dimensions","point","angle","Angle","classNames"],"sources":["src/components/viewer-markup/markup-utils.ts","src/components/viewer-markup/viewer-markup-components.tsx","src/lib/markup/interactions.ts","src/components/viewer-markup-arrow/interactions.ts","src/components/viewer-markup-arrow/viewer-markup-arrow-components.tsx","src/components/viewer-markup-arrow/viewer-markup-arrow.css?tag=vertex-viewer-markup-arrow&encapsulation=shadow","src/components/viewer-markup-arrow/viewer-markup-arrow.tsx","src/components/viewer-markup-circle/interactions.ts","src/components/viewer-markup-circle/viewer-markup-circle-components.tsx","src/components/viewer-markup-circle/viewer-markup-circle.css?tag=vertex-viewer-markup-circle&encapsulation=shadow","src/components/viewer-markup-circle/viewer-markup-circle.tsx","src/components/viewer-markup-freeform/interactions.ts","src/components/viewer-markup-freeform/viewer-markup-freeform.css?tag=vertex-viewer-markup-freeform&encapsulation=shadow","src/components/viewer-markup-freeform/viewer-markup-freeform.tsx"],"sourcesContent":["import { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\n\nimport { MarkupCenteringBehavior } from '../../lib/types';\nimport { isVertexViewerArrowMarkup } from '../viewer-markup-arrow/utils';\nimport { isVertexViewerCircleMarkup } from '../viewer-markup-circle/utils';\nimport { isVertexViewerFreeformMarkup } from '../viewer-markup-freeform/utils';\n\nexport type BoundingBox2dAnchorPosition =\n | 'left'\n | 'right'\n | 'top'\n | 'bottom'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n | 'center';\n\nexport function getBoundingBox2dAnchorPosition(\n rect: Rectangle.Rectangle,\n position: BoundingBox2dAnchorPosition\n): Point.Point {\n switch (position) {\n case 'top-left':\n return Point.create(rect.x, rect.y);\n case 'top':\n return Point.create(rect.x + rect.width / 2, rect.y);\n case 'top-right':\n return Point.create(rect.x + rect.width, rect.y);\n case 'right':\n return Point.create(rect.x + rect.width, rect.y + rect.height / 2);\n case 'bottom-right':\n return Point.create(rect.x + rect.width, rect.y + rect.height);\n case 'bottom':\n return Point.create(rect.x + rect.width / 2, rect.y + rect.height);\n case 'bottom-left':\n return Point.create(rect.x, rect.y + rect.height);\n case 'left':\n return Point.create(rect.x, rect.y + rect.height / 2);\n case 'center':\n return Rectangle.center(rect);\n }\n}\n\nexport function translatePointToScreen(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1\n): Point.Point {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativePoint = Point.add(\n Point.scale(pt, contentScaleFactor, contentScaleFactor),\n Dimensions.center(contentDimensions)\n );\n\n // Include an offset for width and height to account for cases where the\n // content dimensions are smaller than the canvas dimensions.\n const scaledContentWidth = contentDimensions.width * effectiveScalar;\n const scaledContentHeight = contentDimensions.height * effectiveScalar;\n const centerOffsetX =\n centeringBehavior === 'both' || centeringBehavior === 'x-only'\n ? Math.max(0, (canvasDimensions.width - scaledContentWidth) / 2)\n : 0;\n const centerOffsetY =\n centeringBehavior === 'both' || centeringBehavior === 'y-only'\n ? Math.max(0, (canvasDimensions.height - scaledContentHeight) / 2)\n : 0;\n\n return Point.create(\n contentRelativePoint.x * effectiveScalar + centerOffsetX,\n contentRelativePoint.y * effectiveScalar + centerOffsetY\n );\n}\n\nexport function translatePointToBounds(\n pt: Point.Point,\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions\n): Point.Point {\n const rectToScreen = translateRectToScreen(rect, canvasDimensions);\n return Point.add(pt, rectToScreen);\n}\n\nexport function translateDimensionsToScreen(\n dimensions: Dimensions.Dimensions,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n scale = 1\n): Dimensions.Dimensions {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativeDimensions = Dimensions.scale(\n contentScaleFactor,\n contentScaleFactor,\n dimensions\n );\n\n return Dimensions.scale(\n effectiveScalar,\n effectiveScalar,\n contentRelativeDimensions\n );\n}\n\n/**\n * Translates a rectangle in relative units, to a rectangle in screen units.\n *\n * Shape coordinates are persisted in relative units, so they can be presented\n * at any size.\n */\nexport function translateRectToScreen(\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions?: Dimensions.Dimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1\n): Rectangle.Rectangle {\n const position = translatePointToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n centeringBehavior,\n scale\n );\n const dimensions = translateDimensionsToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n scale\n );\n return Rectangle.fromPointAndDimensions(position, dimensions);\n}\n\n/**\n * Translates a point in screen units, to a point in relative units.\n */\nexport function translatePointToRelative(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions\n): Point.Point {\n const scaleFactor = 1 / getScaleFactor(canvasDimensions);\n const point = Point.scale(\n Point.subtract(pt, Dimensions.center(canvasDimensions)),\n scaleFactor,\n scaleFactor\n );\n\n return point;\n}\n\n/**\n * Translates a set of points in relative `original` units to\n * points in relative `bounds` units.\n */\nexport function translatePointsToBounds(\n points: Point.Point[],\n original: Rectangle.Rectangle,\n bounds: Rectangle.Rectangle\n): Point.Point[] {\n return points.map((pt) =>\n Point.add(\n Point.scale(\n Point.subtract(pt, original),\n bounds.width / (original.width || 1),\n bounds.height / (original.height || 1)\n ),\n bounds\n )\n );\n}\n\nexport function createRectangle(\n initialPoint: Point.Point,\n currentPoint: Point.Point,\n maintainAspectRatio: boolean\n): Rectangle.Rectangle {\n const bounds = Rectangle.fromPoints(initialPoint, currentPoint);\n if (maintainAspectRatio) {\n const fitBoundsSize = Math.max(bounds.width, bounds.height);\n const isPortrait = bounds.height > bounds.width;\n const currentIsLeftOfInitial = currentPoint.x <= initialPoint.x;\n const currentIsAboveInitial = currentPoint.y <= initialPoint.y;\n const fitBoundsX = currentIsLeftOfInitial\n ? isPortrait\n ? initialPoint.x - fitBoundsSize\n : currentPoint.x\n : initialPoint.x;\n const fitBoundsY = currentIsAboveInitial\n ? isPortrait\n ? currentPoint.y\n : initialPoint.y - fitBoundsSize\n : initialPoint.y;\n return Rectangle.create(\n fitBoundsX,\n fitBoundsY,\n fitBoundsSize,\n fitBoundsSize\n );\n } else {\n return bounds;\n }\n}\n\nexport function transformRectangle(\n bounds: Rectangle.Rectangle,\n start: Point.Point,\n current: Point.Point,\n anchor: BoundingBox2dAnchorPosition,\n maintainAspectRatio?: boolean\n): Rectangle.Rectangle {\n const delta = Point.subtract(current, start);\n const { x: left, y: top, width: w, height: h } = bounds;\n const right = left + w;\n const bottom = top + h;\n const topLeft = Point.create(left, top);\n const bottomLeft = Point.create(left, bottom);\n const topRight = Point.create(right, top);\n const bottomRight = Point.create(right, bottom);\n switch (anchor) {\n case 'top-left':\n return createRectangle(bottomRight, current, !!maintainAspectRatio);\n case 'top':\n return createRectangle(\n bottomRight,\n Point.create(left, current.y),\n !!maintainAspectRatio\n );\n case 'top-right':\n return createRectangle(bottomLeft, current, !!maintainAspectRatio);\n case 'right':\n return createRectangle(\n bottomLeft,\n Point.create(current.x, top),\n !!maintainAspectRatio\n );\n case 'bottom-right':\n return createRectangle(topLeft, current, !!maintainAspectRatio);\n case 'bottom':\n return createRectangle(\n topLeft,\n Point.create(right, current.y),\n !!maintainAspectRatio\n );\n case 'bottom-left':\n return createRectangle(topRight, current, !!maintainAspectRatio);\n case 'left':\n return createRectangle(\n bottomRight,\n Point.create(current.x, top),\n !!maintainAspectRatio\n );\n case 'center':\n return Rectangle.create(\n bounds.x + delta.x,\n bounds.y + delta.y,\n bounds.width,\n bounds.height\n );\n }\n}\n\nexport function isVertexViewerMarkupElement(\n el: HTMLElement\n): el is\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement {\n return (\n isVertexViewerArrowMarkup(el) ||\n isVertexViewerCircleMarkup(el) ||\n isVertexViewerFreeformMarkup(el)\n );\n}\n\nexport function isValidPointData(...points: Point.Point[]): boolean {\n return points.every((pt) => !isNaN(pt.x) && !isNaN(pt.y));\n}\n\nexport function isValidStartEvent(event: PointerEvent): boolean {\n const el = event.target as HTMLElement;\n\n return isVertexViewerMarkupElement(el) && el.mode !== 'edit';\n}\n\nfunction getScaleFactor(dimensions: Dimensions.Dimensions): number {\n // We intentionally use the content's height when scaling to maintain a consistent coordinate\n // space for markup. This is to ensure the markup will be displayed in the same position\n // on the canvas regardless of the aspect ratio at the time the markup was created.\n // See https://github.com/Vertexvis/vertex-web-sdk/pull/429 for more details.\n return dimensions.height;\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nexport interface RelativeAnchorProps {\n id?: string;\n transform?: string;\n rotation?: number;\n name: string;\n point: Point.Point;\n onPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const RelativeAnchor: FunctionalComponent<RelativeAnchorProps> = (\n { id, transform, rotation, name, point, onPointerDown },\n children\n) => {\n return (\n <div\n id={id}\n class=\"bounds-anchor-position\"\n style={{\n top: `${point.y}px`,\n left: `${point.x}px`,\n }}\n onTouchStart={(event) => event.preventDefault()}\n onPointerDown={onPointerDown}\n >\n <div style={{ transform }}>\n <div\n class=\"bounds-anchor\"\n style={{\n transform: `rotateZ(${rotation ?? 0}deg)`,\n }}\n >\n <slot name={name}>{children}</slot>\n </div>\n </div>\n </div>\n );\n};\n\nexport interface SvgShadowProps {\n id: string;\n scale?: number;\n}\n\nexport const SvgShadow: FunctionalComponent<SvgShadowProps> = ({\n id,\n scale,\n}) => {\n // Scale default values for a `<filter>` element by the provided scale.\n // This prevents the filter area from being too small when scale is greater than 1,\n // and uses the default values for a scale less than 1 to prevent the same issue.\n // See https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/filter\n // for more details on the default values used here.\n const effectiveScale = scale ?? 1;\n const xOffset = Math.max(10, 10 * effectiveScale);\n const yOffset = Math.max(10, 10 * effectiveScale);\n const width = Math.max(120, 110 * effectiveScale + xOffset);\n const height = Math.max(120, 110 * effectiveScale + yOffset);\n\n return (\n <filter\n id={id}\n filterUnits=\"userSpaceOnUse\"\n x={`${-xOffset}%`}\n y={`${-yOffset}%`}\n width={`${width}%`}\n height={`${height}%`}\n >\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"2\" />\n <feOffset dx=\"0\" dy=\"1\" result=\"offsetblur\" />\n <feFlood flood-color=\"#000000\" flood-opacity=\"0.25\" />\n <feComposite in2=\"offsetblur\" operator=\"in\" />\n <feMerge>\n <feMergeNode />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n );\n};\n","import type { InteractionApi, InteractionHandler } from '../interactions';\n\nexport abstract class MarkupInteractionHandler implements InteractionHandler {\n protected element?: HTMLElement;\n protected elementBounds?: DOMRect;\n protected api?: InteractionApi;\n\n private resizeObserver: ResizeObserver;\n\n public constructor() {\n this.resizeObserver = new ResizeObserver(([entry]) => {\n this.elementBounds = this.computeBoundingRect();\n });\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.elementBounds = this.computeBoundingRect();\n this.resizeObserver.observe(this.element);\n\n this.element.addEventListener('pointerdown', this.handlePointerDown);\n }\n\n public dispose(): void {\n this.resizeObserver.disconnect();\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n protected acceptInteraction(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n this.handleInteractionAttempt(event);\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n this.handleInteractionMove(event);\n };\n\n private handlePointerUp = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.handleInteractionEnd(event);\n };\n\n protected abstract computeBoundingRect(): DOMRect;\n\n protected abstract handleInteractionAttempt(event: PointerEvent): void;\n\n protected abstract handleInteractionMove(event: PointerEvent): void;\n\n protected abstract handleInteractionEnd(event: PointerEvent): void;\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n translatePointToRelative,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\n\ntype ViewerMarkupArrowEditAnchor = 'start' | 'end' | 'center';\n\nexport class ArrowMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private anchor: ViewerMarkupArrowEditAnchor = 'end';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupArrowElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: ViewerMarkupArrowEditAnchor,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n this.markupEl.start =\n this.markupEl.start ??\n translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (this.elementBounds != null && this.pointerId === event.pointerId) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n if (this.anchor === 'start') {\n this.markupEl.start = position;\n } else if (this.anchor === 'end') {\n this.markupEl.end = position;\n } else if (this.markupEl.start != null && this.markupEl.end != null) {\n const center = Point.create(\n (this.markupEl.start.x + this.markupEl.end.x) / 2,\n (this.markupEl.start.y + this.markupEl.end.y) / 2\n );\n const xDifference = center.x - position.x;\n const yDifference = center.y - position.y;\n\n this.markupEl.start = Point.create(\n this.markupEl.start.x - xDifference,\n this.markupEl.start.y - yDifference\n );\n this.markupEl.end = Point.create(\n this.markupEl.end.x - xDifference,\n this.markupEl.end.y - yDifference\n );\n }\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n const screenStart =\n this.markupEl.start != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.start, this.elementBounds)\n : undefined;\n const screenEnd =\n this.markupEl.end != null && this.elementBounds != null\n ? translatePointToScreen(this.markupEl.end, this.elementBounds)\n : undefined;\n\n if (\n this.markupEl.mode !== '' &&\n screenStart != null &&\n screenEnd != null &&\n Point.distance(screenStart, screenEnd) >= 2\n ) {\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.start = undefined;\n this.markupEl.end = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Angle, Point } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox1dProps {\n start: Point.Point;\n end: Point.Point;\n offset?: Point.Point;\n onStartAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n onEndAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox1d: FunctionalComponent<BoundingBox1dProps> = ({\n start,\n end,\n offset,\n onStartAnchorPointerDown,\n onCenterAnchorPointerDown,\n onEndAnchorPointerDown,\n}) => {\n const angle = Angle.normalize(\n Angle.toDegrees(Angle.fromPoints(start, end)) - 270\n );\n const center = Point.create((start.x + end.x) / 2, (start.y + end.y) / 2);\n const transform =\n offset != null ? `translate(${offset.x}px, ${offset.y}px)` : undefined;\n\n return (\n <div class=\"bounds-container\">\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-start-anchor\"\n name=\"start-anchor\"\n rotation={angle}\n point={start}\n onPointerDown={onStartAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-end-anchor\"\n name=\"end-anchor\"\n rotation={angle}\n point={end}\n onPointerDown={onEndAnchorPointerDown}\n >\n <div class={classNames('bounds-default-anchor', 'bounds-cap-anchor')} />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-1d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-arrow-line-stroke-color: A CSS color that\n * specifies the color of the arrow line's outline.\n */\n --viewer-markup-arrow-line-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-line-stroke-width: A CSS length that\n * specifies the width of the arrow line's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-arrow-line-stroke-width: 4px;\n /**\n * @prop --viewer-markup-arrow-head-stroke-color: A CSS color that\n * specifies the color of the arrow head's outline.\n */\n --viewer-markup-arrow-head-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-stroke-width: A CSS length that\n * specifies the width of the arrow head's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-arrow-head-stroke-width: 4px;\n /**\n * @prop --viewer-markup-arrow-head-fill-color: A CSS color that\n * specifies the color of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-color: var(--red-800);\n /**\n * @prop --viewer-markup-arrow-head-fill-opacity: A number between\n * 0 and 1 that specifies the opacity of the arrow head's fill.\n */\n --viewer-markup-arrow-head-fill-opacity: 1;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-color: A CSS color that\n * specifies the color of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-cap-border-width: A CSS length that\n * specifies the width of arrow start/end resize anchors' border.\n */\n --viewer-markup-arrow-bounds-cap-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-cap-background-color: A CSS color that\n * specifies the background color of the arrow start/end resize anchors.\n */\n --viewer-markup-arrow-bounds-cap-background-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center resize anchor's border.\n */\n --viewer-markup-arrow-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center resize anchor.\n */\n --viewer-markup-arrow-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-outline-width: A CSS color that\n * specifies the width of the selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-width: 1px;\n /**\n * @prop --viewer-markup-arrow-bounds-outline-color: A CSS color that\n * specifies the color of selected arrow outline.\n */\n --viewer-markup-arrow-bounds-outline-color: var(--blue-400);\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-arrow-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-arrow-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-arrow-scale: A number that specifies the scale of the arrow.\n * This is used to scale the arrow's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-arrow-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-line-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-arrow-line-stroke-width) *\n var(--viewer-markup-arrow-scale)\n );\n cursor: default;\n}\n\n.head {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-head-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-arrow-head-stroke-width) *\n var(--viewer-markup-arrow-scale)\n );\n fill: var(--viewer-markup-arrow-head-fill-color);\n fill-opacity: var(--viewer-markup-arrow-head-fill-opacity);\n cursor: default;\n}\n\n.bounds-line {\n pointer-events: auto;\n stroke: var(--viewer-markup-arrow-bounds-outline-color);\n stroke-width: var(--viewer-markup-arrow-bounds-outline-width);\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-arrow-bounds-anchor-width);\n height: var(--viewer-markup-arrow-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-arrow-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-arrow-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-arrow-bounds-center-anchor-background-color\n );\n}\n\n.bounds-cap-anchor {\n border-width: var(--viewer-markup-arrow-bounds-cap-border-width);\n border-color: var(--viewer-markup-arrow-bounds-cap-border-color);\n border-style: solid;\n background-color: var(--viewer-markup-arrow-bounds-cap-background-color);\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidPointData,\n isValidStartEvent,\n translatePointToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { ArrowMarkupInteractionHandler } from './interactions';\nimport {\n arrowheadPointsToCirclePoints,\n arrowheadPointsToHashPoints,\n arrowheadPointsToPathPoints,\n arrowheadPointsToPolygonPoints,\n createLineAnchorStylePoints,\n LineAnchorStyle,\n LineAnchorStylePoints,\n parsePoint,\n} from './utils';\nimport { BoundingBox1d } from './viewer-markup-arrow-components';\n\n/**\n * The supported arrow markup modes.\n *\n * @see {@link ViewerMarkupArrowMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupArrowMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-arrow',\n styleUrl: 'viewer-markup-arrow.css',\n shadow: true,\n})\nexport class ViewerMarkupArrow {\n /**\n * The position of the starting anchor. Can either be an instance of a\n * `Point` or a JSON string representation in the format of `[x, y]` or\n * `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public start?: Point.Point;\n\n /**\n * The position of the starting anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'start' })\n public startJson?: string;\n\n /**\n * The position of the ending anchor. Can either be an instance of a `Point`\n * or a JSON string representation in the format of `[x, y]` or `{\"x\": 0,\n * \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true })\n public end?: Point.Point;\n\n /**\n * The position of the ending anchor, as a JSON string. Can either be an\n * instance of a `Point` or a JSON string representation in the format of\n * `[x, y]` or `{\"x\": 0, \"y\": 0}`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'end' })\n public endJson?: string;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * The style of the starting anchor. This defaults to none.\n */\n @Prop({ mutable: true })\n public startLineAnchorStyle: LineAnchorStyle = 'none';\n\n /**\n * The style of the ending anchor. This defaults to 'arrow-triangle.'\n */\n @Prop({ mutable: true })\n public endLineAnchorStyle: LineAnchorStyle = 'arrow-triangle';\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupArrowMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupArrowElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new ArrowMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updatePointsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('start')\n protected handleStartJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('end')\n protected handleEndJsonChange(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-arrow-scale',\n this.scale?.toString() ?? '1'\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updatePointsFromProps(): void {\n this.start = this.start || parsePoint(this.startJson);\n this.end = this.end || parsePoint(this.endJson);\n }\n\n private renderLineAnchorStyle(\n anchorStyle: LineAnchorStyle,\n arrowheadPoints: LineAnchorStylePoints\n ): h.JSX.IntrinsicElements {\n if (anchorStyle === 'arrow-triangle') {\n return (\n <polygon\n id=\"line-anchor-arrow-triangle\"\n class=\"head\"\n points={arrowheadPointsToPolygonPoints(arrowheadPoints, this.scale)}\n />\n );\n } else if (anchorStyle === 'arrow-line') {\n return (\n <path\n id=\"line-anchor-arrow-line\"\n class=\"head\"\n d={arrowheadPointsToPathPoints(arrowheadPoints, this.scale)}\n />\n );\n } else if (anchorStyle === 'hash') {\n const hashPoints = arrowheadPointsToHashPoints(\n arrowheadPoints,\n this.scale\n );\n\n return <line id=\"line-anchor-hash\" class=\"head\" {...hashPoints} />;\n } else if (anchorStyle === 'dot') {\n const circlePoints = arrowheadPointsToCirclePoints(\n arrowheadPoints,\n this.scale\n );\n\n return <circle id=\"line-anchor-circle\" class=\"head\" {...circlePoints} />;\n } else {\n return <div />;\n }\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.start != null && this.end != null && this.elementBounds != null) {\n const elementBounds = this.elementBounds;\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n const screenStart = translatePointToScreen(\n this.start,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n const screenEnd = translatePointToScreen(\n this.end,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n\n if (isValidPointData(screenStart, screenEnd)) {\n const arrowheadStartPoints = createLineAnchorStylePoints(\n screenEnd,\n screenStart\n );\n const arrowheadEndPoints = createLineAnchorStylePoints(\n screenStart,\n screenEnd\n );\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"arrow-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#arrow-shadow)\"\n >\n {this.renderLineAnchorStyle(\n this.startLineAnchorStyle,\n arrowheadStartPoints\n )}\n <line\n id=\"arrow-line\"\n class=\"line\"\n x1={arrowheadEndPoints.tip.x}\n y1={arrowheadEndPoints.tip.y}\n x2={arrowheadStartPoints.tip.x}\n y2={arrowheadStartPoints.tip.y}\n />\n {this.renderLineAnchorStyle(\n this.endLineAnchorStyle,\n arrowheadEndPoints\n )}\n </g>\n {this.mode === 'edit' && (\n <g transform={`translate(${offsetX} ${offsetY})`}>\n <line\n id=\"bounding-box-1d-line\"\n class=\"bounds-line\"\n x1={screenStart.x}\n y1={screenStart.y}\n x2={screenEnd.x}\n y2={screenEnd.y}\n />\n </g>\n )}\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox1d\n start={screenStart}\n end={screenEnd}\n offset={{ x: offsetX, y: offsetY }}\n onStartAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('start', event)\n }\n onCenterAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('center', event)\n }\n onEndAnchorPointerDown={(event) =>\n this.interactionHandler.editAnchor('end', event)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return <Host></Host>;\n }\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class CircleMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private startPosition?: Point.Point;\n private resizeBounds?: Rectangle.Rectangle;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupCircleElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit') {\n this.anchor = anchor;\n this.resizeBounds = this.markupEl.bounds;\n this.startInteraction(event);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n this.pointerId = event.pointerId;\n this.startPosition = position;\n this.markupEl.bounds =\n this.markupEl.bounds ?? Rectangle.create(position.x, position.y, 0, 0);\n this.resizeBounds = this.markupEl.bounds;\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.markupEl.bounds != null &&\n this.startPosition != null &&\n this.elementBounds != null &&\n this.pointerId === event.pointerId\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n this.markupEl.bounds = transformRectangle(\n this.resizeBounds ?? this.markupEl.bounds,\n this.startPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.bounds != null &&\n this.markupEl.bounds?.width > 0 &&\n this.markupEl.bounds?.height > 0\n ) {\n this.anchor = 'bottom-right';\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.bounds = undefined;\n }\n\n this.pointerId = undefined;\n }\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { getBoundingBox2dAnchorPosition } from '../viewer-markup/markup-utils';\nimport { RelativeAnchor } from '../viewer-markup/viewer-markup-components';\n\nexport interface BoundingBox2dProps {\n bounds: Rectangle.Rectangle;\n offset?: Point.Point;\n onTopLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onTopRightAnchorPointerDown?: (event: PointerEvent) => void;\n onRightAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomLeftAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomAnchorPointerDown?: (event: PointerEvent) => void;\n onBottomRightAnchorPointerDown?: (event: PointerEvent) => void;\n onTopAnchorPointerDown?: (event: PointerEvent) => void;\n onCenterAnchorPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const BoundingBox2d: FunctionalComponent<BoundingBox2dProps> = ({\n bounds,\n offset,\n onTopLeftAnchorPointerDown,\n onLeftAnchorPointerDown,\n onTopRightAnchorPointerDown,\n onRightAnchorPointerDown,\n onBottomLeftAnchorPointerDown,\n onBottomAnchorPointerDown,\n onBottomRightAnchorPointerDown,\n onTopAnchorPointerDown,\n onCenterAnchorPointerDown,\n}) => {\n const padded = Rectangle.pad(bounds, 6);\n const center = Rectangle.center(padded);\n const transform =\n offset != null ? `translate(${offset.x}px, ${offset.y}px)` : undefined;\n\n return (\n <div class=\"bounds-container\">\n <div\n class=\"bounds-outline\"\n style={{\n top: `${padded.y}px`,\n left: `${padded.x}px`,\n width: `${padded.width}px`,\n height: `${padded.height}px`,\n transform,\n }}\n ></div>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-left-anchor\"\n name=\"top-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-left')}\n onPointerDown={onTopLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-left-anchor\"\n name=\"left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'left')}\n onPointerDown={onLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-right-anchor\"\n name=\"top-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top-right')}\n onPointerDown={onTopRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-right-anchor\"\n name=\"right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'right')}\n onPointerDown={onRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-left-anchor\"\n name=\"bottom-left-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-left')}\n onPointerDown={onBottomLeftAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-anchor\"\n name=\"bottom-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom')}\n onPointerDown={onBottomAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-bottom-right-anchor\"\n name=\"bottom-right-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'bottom-right')}\n onPointerDown={onBottomRightAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-top-anchor\"\n name=\"top-anchor\"\n point={getBoundingBox2dAnchorPosition(padded, 'top')}\n onPointerDown={onTopAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-edge-anchor')}\n />\n </RelativeAnchor>\n <RelativeAnchor\n transform={transform}\n id=\"bounding-box-2d-center-anchor\"\n name=\"center-anchor\"\n point={center}\n onPointerDown={onCenterAnchorPointerDown}\n >\n <div\n class={classNames('bounds-default-anchor', 'bounds-center-anchor')}\n />\n </RelativeAnchor>\n </div>\n );\n};\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-color: A CSS color that\n * specifies the color of the circle's outline.\n */\n --viewer-markup-circle-ellipse-stroke-color: var(--red-700);\n /**\n * @prop --viewer-markup-circle-ellipse-stroke-width: A CSS length that\n * specifies the width of the circle's outline.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-circle-ellipse-stroke-width: 4px;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-color: A CSS color that\n * specifies the color of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-color: none;\n /**\n * @prop --viewer-markup-circle-ellipse-fill-opacity: A number between\n * 0 and 1 that specifies the opacity of the circle's fill.\n */\n --viewer-markup-circle-ellipse-fill-opacity: 0;\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-color: A CSS color that\n * specifies the color of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-outline-border-width: A CSS length that\n * specifies the width of the circle's selected bounding box border.\n */\n --viewer-markup-circle-bounds-outline-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-color: A CSS color that\n * specifies the color of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-border-width: A CSS length that\n * specifies the width of the edge and corner resize anchors' borders.\n */\n --viewer-markup-circle-bounds-edge-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-edge-anchor-background-color: A CSS color that\n * specifies the background color of the edge and corner resize anchors.\n */\n --viewer-markup-circle-bounds-edge-anchor-background-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center reposition anchor's border.\n */\n --viewer-markup-circle-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-circle-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center reposition anchor.\n */\n --viewer-markup-circle-bounds-center-anchor-background-color: var(--blue-400);\n /**\n * @prop --viewer-markup-circle-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-circle-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-circle-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-circle-scale: A number that specifies the scale of the circle.\n * This is used to scale the circle's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-circle-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.ellipse {\n pointer-events: auto;\n stroke: var(--viewer-markup-circle-ellipse-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-circle-ellipse-stroke-width) *\n var(--viewer-markup-circle-scale)\n );\n fill: var(--viewer-markup-circle-ellipse-fill-color);\n fill-opacity: var(--viewer-markup-circle-ellipse-fill-opacity);\n cursor: default;\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-outline {\n position: absolute;\n border-width: var(--viewer-markup-circle-bounds-outline-border-width);\n border-color: var(--viewer-markup-circle-bounds-outline-border-color);\n border-style: solid;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-circle-bounds-anchor-width);\n height: var(--viewer-markup-circle-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-circle-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-circle-bounds-center-anchor-background-color\n );\n}\n\n.bounds-edge-anchor {\n border-width: var(--viewer-markup-circle-bounds-edge-anchor-border-width);\n border-color: var(--viewer-markup-circle-bounds-edge-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-circle-bounds-edge-anchor-background-color\n );\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { CircleMarkupInteractionHandler } from './interactions';\nimport { parseBounds } from './utils';\nimport { BoundingBox2d } from './viewer-markup-circle-components';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupCircleMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupCircleMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-circle',\n styleUrl: 'viewer-markup-circle.css',\n shadow: true,\n})\nexport class ViewerMarkupCircle {\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupCircleMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupCircleElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new CircleMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredHandler?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updateBoundsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updateBoundsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n if (newViewer != null) {\n this.registeredHandler = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('bounds')\n protected handleBoundsJsonChange(): void {\n this.updateBoundsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-circle-scale',\n this.scale.toString()\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updateBoundsFromProps(): void {\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.bounds != null && this.elementBounds != null) {\n const relativeBounds = translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n const center = Rectangle.center(relativeBounds);\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"circle-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#circle-shadow)\"\n >\n <ellipse\n class=\"ellipse\"\n cx={center.x}\n cy={center.y}\n rx={relativeBounds.width / 2}\n ry={relativeBounds.height / 2}\n stroke={'#000ff0'}\n stroke-width={4}\n fill={'none'}\n />\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox2d\n bounds={relativeBounds}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n","import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { MarkupInteractionHandler } from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointsToBounds,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class FreeformMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private min?: Point.Point;\n private max?: Point.Point;\n\n private resizeBounds?: Rectangle.Rectangle;\n private resizePoints?: Point.Point[];\n private resizeStartPosition?: Point.Point;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupFreeformElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>\n ) {\n super();\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit' && this.elementBounds != null) {\n this.resizeBounds = this.markupEl.bounds;\n this.resizePoints = this.markupEl.points;\n this.anchor = anchor;\n this.resizeStartPosition = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n window.addEventListener('pointermove', this.handleResizeInteractionMove);\n window.addEventListener('pointerup', this.handleResizeInteractionEnd);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n this.updateMinAndMax(position);\n this.markupEl.points = this.markupEl.points ?? [position];\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.pointerId === event.pointerId &&\n this.markupEl.points != null &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n this.updateMinAndMax(position);\n this.markupEl.points = [...this.markupEl.points, position];\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.points != null &&\n this.markupEl.points.length > 2 &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(\n event,\n this.elementBounds\n );\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds\n );\n\n this.updateMinAndMax(position);\n\n this.markupEl.points = [...this.markupEl.points, position];\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.points = undefined;\n }\n\n this.min = undefined;\n this.max = undefined;\n this.pointerId = undefined;\n }\n }\n\n private handleResizeInteractionMove = (event: PointerEvent): void => {\n if (\n this.resizeStartPosition != null &&\n this.elementBounds != null &&\n this.resizeBounds != null &&\n this.resizePoints != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n\n const updatedBounds = transformRectangle(\n this.resizeBounds,\n this.resizeStartPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n\n this.markupEl.points = translatePointsToBounds(\n this.resizePoints,\n this.resizeBounds,\n updatedBounds\n );\n this.markupEl.bounds = updatedBounds;\n }\n };\n\n private handleResizeInteractionEnd = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handleResizeInteractionMove);\n window.removeEventListener('pointerup', this.handleResizeInteractionEnd);\n\n this.resizeBounds = undefined;\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n };\n\n private updateMinAndMax(position: Point.Point): void {\n this.min =\n this.min != null\n ? Point.create(\n Math.min(this.min.x, position.x),\n Math.min(this.min.y, position.y)\n )\n : position;\n this.max =\n this.max != null\n ? Point.create(\n Math.max(this.max.x, position.x),\n Math.max(this.max.y, position.y)\n )\n : position;\n this.markupEl.bounds = Rectangle.create(\n this.min.x,\n this.min.y,\n this.max.x - this.min.x,\n this.max.y - this.min.y\n );\n }\n}\n",":host {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n /**\n * @prop --viewer-markup-freeform-stroke-color: A CSS color that\n * specifies the color of the freeform line.\n */\n --viewer-markup-freeform-stroke-color: var(--red-800);\n /**\n * @prop --viewer-markup-freeform-stroke-width: A CSS length that\n * specifies the width of the freeform line.\n *\n * Note that this is scaled by the component's scale factor, so providing a scale\n * other than 1 will result in a different stroke width.\n */\n --viewer-markup-freeform-stroke-width: 4px;\n /**\n * @prop --viewer-markup-freeform-line-join: The join behavior between\n * the lines making up this freeform markup. Defaults to `round`.\n */\n --viewer-markup-freeform-line-join: round;\n /**\n * @prop --viewer-markup-freeform-line-cap: The cap behavior for\n * the lines making up this freeform markup. Defaults to `round`.\n */\n --viewer-markup-freeform-line-cap: round;\n /**\n * @prop --viewer-markup-freeform-bounds-outline-border-color: A CSS color that\n * specifies the color of the circle's selected bounding box border.\n */\n --viewer-markup-freeform-bounds-outline-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-freeform-bounds-outline-border-width: A CSS length that\n * specifies the width of the circle's selected bounding box border.\n */\n --viewer-markup-freeform-bounds-outline-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-border-color: A CSS color that\n * specifies the color of the edge and corner resize anchors' borders.\n */\n --viewer-markup-freeform-bounds-edge-anchor-border-color: var(--blue-400);\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-border-width: A CSS length that\n * specifies the width of the edge and corner resize anchors' borders.\n */\n --viewer-markup-freeform-bounds-edge-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-edge-anchor-background-color: A CSS color that\n * specifies the background color of the edge and corner resize anchors.\n */\n --viewer-markup-freeform-bounds-edge-anchor-background-color: white;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-border-color: A CSS color that\n * specifies the color of the center reposition anchor's border.\n */\n --viewer-markup-freeform-bounds-center-anchor-border-color: white;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-border-width: A CSS length that\n * specifies the width of the center reposition anchor's border.\n */\n --viewer-markup-freeform-bounds-center-anchor-border-width: 1px;\n /**\n * @prop --viewer-markup-freeform-bounds-center-anchor-background-color: A CSS color that\n * specifies the background color of the center reposition anchor.\n */\n --viewer-markup-freeform-bounds-center-anchor-background-color: var(\n --blue-400\n );\n /**\n * @prop --viewer-markup-freeform-bounds-anchor-width: A CSS length that\n * specifies the width of the resize and reposition anchors.\n */\n --viewer-markup-freeform-bounds-anchor-width: 9px;\n /**\n * @prop --viewer-markup-freeform-bounds-anchor-height: A CSS length that\n * specifies the height of the resize and reposition anchors.\n */\n --viewer-markup-freeform-bounds-anchor-height: 9px;\n /**\n * @prop --viewer-markup-freeform-scale: A number that specifies the scale of the freeform.\n * This is used to scale the freeform's stroke width. Defaults to 1, and is managed internally\n * by the component.\n */\n --viewer-markup-freeform-scale: 1;\n}\n\n.svg {\n pointer-events: none;\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n.path {\n pointer-events: auto;\n cursor: default;\n stroke: var(--viewer-markup-freeform-stroke-color);\n stroke-width: calc(\n var(--viewer-markup-freeform-stroke-width) *\n var(--viewer-markup-freeform-scale)\n );\n stroke-linejoin: var(--viewer-markup-freeform-line-join);\n stroke-linecap: var(--viewer-markup-freeform-line-cap);\n}\n\n.create-overlay {\n pointer-events: auto;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n cursor: crosshair;\n}\n\n.bounds-container {\n pointer-events: none;\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n overflow: hidden;\n}\n\n.bounds-outline {\n position: absolute;\n border-width: var(--viewer-markup-freeform-bounds-outline-border-width);\n border-color: var(--viewer-markup-freeform-bounds-outline-border-color);\n border-style: solid;\n box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-anchor-position {\n position: absolute;\n transform: translate(-50%, -50%);\n}\n\n.bounds-anchor {\n pointer-events: auto;\n cursor: default;\n user-select: none;\n}\n\n.bounds-default-anchor {\n width: var(--viewer-markup-freeform-bounds-anchor-width);\n height: var(--viewer-markup-freeform-bounds-anchor-height);\n box-sizing: border-box;\n box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.bounds-center-anchor {\n border-radius: 100%;\n border-width: var(--viewer-markup-freeform-bounds-center-anchor-border-width);\n border-color: var(--viewer-markup-freeform-bounds-center-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-freeform-bounds-center-anchor-background-color\n );\n}\n\n.bounds-edge-anchor {\n border-width: var(--viewer-markup-freeform-bounds-edge-anchor-border-width);\n border-color: var(--viewer-markup-freeform-bounds-edge-anchor-border-color);\n border-style: solid;\n background-color: var(\n --viewer-markup-freeform-bounds-edge-anchor-background-color\n );\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translatePointToScreen,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { parseBounds } from '../viewer-markup-circle/utils';\nimport { BoundingBox2d } from '../viewer-markup-circle/viewer-markup-circle-components';\nimport { FreeformMarkupInteractionHandler } from './interactions';\nimport { parsePoints } from './utils';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupFreeformMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupFreeformMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-freeform',\n styleUrl: 'viewer-markup-freeform.css',\n shadow: true,\n})\nexport class ViewerMarkupFreeform {\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public points?: Point.Point[];\n\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'points' })\n public pointsJson?: string;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupFreeformMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n /**\n * An event that is dispatched when this markup element is in view\n * mode (`this.mode === \"\"`), and it completes a rerender.\n */\n @Event({ bubbles: true })\n public viewRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupFreeformElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private screenPoints: Point.Point[] = [];\n\n private interactionHandler = new FreeformMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected componentDidRender(): void {\n if (this.mode === '') {\n this.viewRendered.emit();\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction = await newViewer.registerInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('originatingViewport')\n @Watch('offset')\n @Watch('scale')\n @Watch('bounds')\n @Watch('points')\n protected recomputePointsFromProps(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-freeform-scale',\n this.scale.toString()\n );\n });\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n this.screenPoints = this.convertPointsToScreen() ?? this.screenPoints;\n }\n\n private updatePointsFromProps(): void {\n this.points = this.points ?? parsePoints(this.pointsJson);\n this.screenPoints = this.convertPointsToScreen() ?? [];\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (this.screenPoints.length > 0 && this.elementBounds != null) {\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"freeform-markup-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#freeform-markup-shadow)\"\n >\n <path\n class=\"path\"\n d={this.screenPoints.reduce(\n (d, pt) => `${d}L${pt.x},${pt.y}`,\n `M${this.screenPoints[0].x},${this.screenPoints[0].y}`\n )}\n fill=\"none\"\n />\n </g>\n </svg>\n {this.mode === 'edit' && this.bounds != null && (\n <BoundingBox2d\n bounds={translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n\n private convertPointsToScreen(): Point.Point[] | undefined {\n const elementBounds = this.elementBounds;\n if (elementBounds != null) {\n return this.points?.map((pt) =>\n translatePointToScreen(\n pt,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )\n );\n }\n }\n}\n"],"version":3}
|