@vertexvis/viewer 0.23.7-canary.1 → 0.23.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/cjs/{cursors-d0bd6404.js → cursors-a1da6c6b.js} +19 -1
  2. package/dist/cjs/cursors-a1da6c6b.js.map +1 -0
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +1 -1
  5. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +14 -14
  6. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js.map +1 -1
  7. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +1 -1
  8. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
  9. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +1 -1
  10. package/dist/cjs/vertex-viewer.cjs.entry.js +1 -1
  11. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js +13 -13
  12. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js.map +1 -1
  13. package/dist/collection/lib/cursors.js +18 -0
  14. package/dist/collection/lib/cursors.js.map +1 -1
  15. package/dist/components/cursors.js +18 -0
  16. package/dist/components/cursors.js.map +1 -1
  17. package/dist/components/vertex-viewer-measurement-distance.js +13 -13
  18. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -1
  19. package/dist/esm/{cursors-34b3da50.js → cursors-70716df3.js} +19 -1
  20. package/dist/esm/cursors-70716df3.js.map +1 -0
  21. package/dist/esm/index.js +1 -1
  22. package/dist/esm/index.mjs +1 -1
  23. package/dist/esm/vertex-viewer-box-query-tool.entry.js +1 -1
  24. package/dist/esm/vertex-viewer-measurement-distance.entry.js +14 -14
  25. package/dist/esm/vertex-viewer-measurement-distance.entry.js.map +1 -1
  26. package/dist/esm/vertex-viewer-measurement-precise.entry.js +1 -1
  27. package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
  28. package/dist/esm/vertex-viewer-pin-tool.entry.js +1 -1
  29. package/dist/esm/vertex-viewer.entry.js +1 -1
  30. package/dist/types/components/viewer-measurement-distance/viewer-measurement-distance.d.ts +3 -3
  31. package/dist/types/lib/cursors.d.ts +8 -0
  32. package/dist/viewer/index.esm.js +1 -1
  33. package/dist/viewer/{p-d3bcde8b.entry.js → p-6f1ed862.entry.js} +2 -2
  34. package/dist/viewer/{p-401ada4a.entry.js → p-82a0dcb2.entry.js} +2 -2
  35. package/dist/viewer/{p-14765f2d.entry.js → p-af7987b2.entry.js} +2 -2
  36. package/dist/viewer/p-af7987b2.entry.js.map +1 -0
  37. package/dist/viewer/{p-84d1293d.entry.js → p-c878e4ac.entry.js} +2 -2
  38. package/dist/viewer/{p-d2ddc770.entry.js → p-caaf5f09.entry.js} +2 -2
  39. package/dist/viewer/{p-aa5bf24d.entry.js → p-cd746316.entry.js} +2 -2
  40. package/dist/viewer/p-d457f24a.js +5 -0
  41. package/dist/viewer/p-d457f24a.js.map +1 -0
  42. package/dist/viewer/viewer.esm.js +1 -1
  43. package/package.json +7 -7
  44. package/readme.md +4 -4
  45. package/dist/cjs/cursors-d0bd6404.js.map +0 -1
  46. package/dist/esm/cursors-34b3da50.js.map +0 -1
  47. package/dist/viewer/p-14765f2d.entry.js.map +0 -1
  48. package/dist/viewer/p-d7952e13.js +0 -5
  49. package/dist/viewer/p-d7952e13.js.map +0 -1
  50. /package/dist/viewer/{p-d3bcde8b.entry.js.map → p-6f1ed862.entry.js.map} +0 -0
  51. /package/dist/viewer/{p-401ada4a.entry.js.map → p-82a0dcb2.entry.js.map} +0 -0
  52. /package/dist/viewer/{p-84d1293d.entry.js.map → p-c878e4ac.entry.js.map} +0 -0
  53. /package/dist/viewer/{p-d2ddc770.entry.js.map → p-caaf5f09.entry.js.map} +0 -0
  54. /package/dist/viewer/{p-aa5bf24d.entry.js.map → p-cd746316.entry.js.map} +0 -0
@@ -17,7 +17,7 @@ const grpc = require('./grpc-03f091dd.js');
17
17
  const streamAttributes = require('./streamAttributes-d5b8a234.js');
18
18
  const queries = require('./queries-f5b15154.js');
19
19
  const config = require('./config-889d1218.js');
20
- const cursors = require('./cursors-d0bd6404.js');
20
+ const cursors = require('./cursors-a1da6c6b.js');
21
21
  const dom = require('./dom-e8da5b8c.js');
22
22
  const entities = require('./entities-ed091fe1.js');
23
23
  const viewport = require('./viewport-f1cdd317.js');
@@ -241,9 +241,9 @@ export class ViewerMeasurementDistance {
241
241
  this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);
242
242
  await this.getStencilBuffer();
243
243
  this.updateViewport();
244
- this.handleViewerChanged(this.viewer);
245
- this.handleModeChanged();
246
- this.computePropsAndState();
244
+ await this.handleViewerChanged(this.viewer);
245
+ await this.handleModeChanged();
246
+ await this.computePropsAndState();
247
247
  this.model.onIndicatorChanged((pt) => {
248
248
  this.indicatorPt = pt;
249
249
  });
@@ -258,8 +258,8 @@ export class ViewerMeasurementDistance {
258
258
  /**
259
259
  * @ignore
260
260
  */
261
- componentWillUpdate() {
262
- this.computePropsAndState();
261
+ async componentWillUpdate() {
262
+ await this.computePropsAndState();
263
263
  }
264
264
  /**
265
265
  * @ignore
@@ -283,14 +283,14 @@ export class ViewerMeasurementDistance {
283
283
  /**
284
284
  * @ignore
285
285
  */
286
- handleViewerChanged(newViewer, oldViewer) {
286
+ async handleViewerChanged(newViewer, oldViewer) {
287
287
  if (oldViewer != null) {
288
288
  oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);
289
- this.removeInteractionListeners(oldViewer);
289
+ await this.removeInteractionListeners(oldViewer);
290
290
  }
291
291
  if (newViewer != null) {
292
292
  newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);
293
- this.addInteractionListeners(newViewer);
293
+ await this.addInteractionListeners(newViewer);
294
294
  }
295
295
  }
296
296
  /**
@@ -308,7 +308,7 @@ export class ViewerMeasurementDistance {
308
308
  /**
309
309
  * @ignore
310
310
  */
311
- handleModeChanged() {
311
+ async handleModeChanged() {
312
312
  var _a;
313
313
  this.warnIfDepthBuffersDisabled();
314
314
  // If we're not in edit or replace mode, ensure that the measurement
@@ -317,8 +317,8 @@ export class ViewerMeasurementDistance {
317
317
  (_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
318
318
  }
319
319
  if (this.viewer != null) {
320
- this.removeInteractionListeners(this.viewer);
321
- this.addInteractionListeners(this.viewer);
320
+ await this.removeInteractionListeners(this.viewer);
321
+ await this.addInteractionListeners(this.viewer);
322
322
  }
323
323
  }
324
324
  /**
@@ -339,9 +339,9 @@ export class ViewerMeasurementDistance {
339
339
  handleInvalidChanged() {
340
340
  this.updateInteractionModel();
341
341
  }
342
- computePropsAndState() {
342
+ async computePropsAndState() {
343
343
  this.updateCamera();
344
- this.updateDepthBuffer();
344
+ await this.updateDepthBuffer();
345
345
  this.updateMeasurementPropsFromModel();
346
346
  this.updateOverlays();
347
347
  }
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-measurement-distance.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/viewer-measurement-distance.tsx"],"names":[],"mappings":"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","sourcesContent":["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 { Line3, Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport {\n MEASUREMENT_LINE_CAP_LENGTH,\n MEASUREMENT_SNAP_DISTANCE,\n} from '../../lib/constants';\nimport { Cursor, measurementCursor } from '../../lib/cursors';\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { Formatter } from '../../lib/formatter';\nimport {\n makeMinimumDistanceResult,\n MeasurementModel,\n MeasurementOverlay,\n MeasurementOverlayManager,\n} from '../../lib/measurement';\nimport {\n DepthBuffer,\n DistanceUnits,\n DistanceUnitType,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\nimport { getMeasurementBoundingClientRect } from './dom';\nimport { PointToPointHitTester } from './hitTest';\nimport {\n PointToPointHitProvider,\n PointToPointInteraction,\n PointToPointInteractionController,\n PointToPointInteractionModel,\n} from './interactions';\nimport {\n Anchor,\n getViewingElementPositions,\n MeasurementElementPositions,\n} from './utils';\nimport { DistanceMeasurementRenderer } from './viewer-measurement-distance-components';\n\n/**\n * Contains the bounding boxes of child elements of this component. This\n * information is useful for positioning popups or other elements around the\n * measurement.\n *\n * @see {@link ViewerDistanceMeasurement.computeElementMetrics} - For\n * calculating element metrics.\n */\nexport interface ViewerMeasurementDistanceElementMetrics {\n startAnchor: DOMRect;\n endAnchor: DOMRect;\n label: DOMRect;\n}\n\n/**\n * The supported measurement modes.\n *\n * @see {@link ViewerDistanceMeasurement.mode} - For more details about modes.\n */\nexport type ViewerMeasurementDistanceMode = 'edit' | 'replace' | '';\n\n/**\n * A details object describing the edit begin event.\n */\nexport interface EditBeginEventDetails {\n type: Exclude<ViewerMeasurementDistanceMode, ''>;\n anchor: Anchor;\n}\n/**\n * A details object describing the edit end event.\n */\nexport interface EditEndEventDetails {\n start: Vector3.Vector3;\n end: Vector3.Vector3;\n valid: boolean;\n}\n\ninterface StateMap {\n hoverCursor?: Disposable;\n stencil?: StencilBuffer;\n depthBuffer?: DepthBuffer;\n}\n\nconst INTERACTION_THRESHOLD = 3;\n\n/**\n * @slot start-anchor - An HTML element for the starting point anchor.\n *\n * @slot start-label - An HTML or text element that displays next to the start\n * anchor.\n *\n * @slot end-anchor - An HTML element for the ending point anchor.\n *\n * @slot end-label - An HTML or text element that displays next to the end\n * anchor.\n *\n * @slot indicator - An HTML element for the measurement indicator. The\n * indicator represents the position where a measurement will be placed while\n * editing.\n */\n@Component({\n tag: 'vertex-viewer-measurement-distance',\n styleUrl: 'viewer-measurement-distance.css',\n shadow: true,\n})\nexport class ViewerMeasurementDistance {\n /**\n * The world position of the starting anchor.\n */\n @Prop({ mutable: true })\n public start?: Vector3.Vector3;\n\n /**\n * The world position of the starting anchor, as a JSON string. The JSON\n * string can be an array or object representation in the format of `[x, y,\n * z]` or `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public startJson?: string;\n\n /**\n * The world position of the ending anchor.\n */\n @Prop({ mutable: true })\n public end?: Vector3.Vector3;\n\n /**\n * The world position of the ending anchor, as a JSON string. The JSON string\n * can be an array or object representation in the format of `[x, y, z]` or\n * `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public endJson?: string;\n\n /**\n * The distance between `start` and `end` in real world units. Value will be\n * undefined if the start and end positions are undefined, or if the\n * measurement is invalid.\n */\n @Prop({ mutable: true })\n public distance?: number;\n\n /**\n * Enables the display of axis reference lines between the start and end\n * point.\n */\n @Prop()\n public showAxisReferenceLines = false;\n\n /**\n * The distance, in pixels, between the mouse and nearest snappable edge. A\n * value of 0 disables snapping.\n */\n @Prop()\n public snapDistance: number = MEASUREMENT_SNAP_DISTANCE;\n\n /**\n * The unit of measurement.\n */\n @Prop()\n public units: DistanceUnitType = 'millimeters';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public labelFormatter?: Formatter<number | undefined>;\n\n /**\n * The distance from an anchor to its label.\n */\n @Prop()\n public anchorLabelOffset = 20;\n\n /**\n * The length of the caps at each end of the distance measurement.\n */\n @Prop()\n public lineCapLength = MEASUREMENT_LINE_CAP_LENGTH;\n\n /**\n * A mode that specifies how the measurement component should behave.\n *\n * When unset, the component will not respond to interactions with the\n * handles.\n *\n * When `edit`, the measurement anchors are interactive and the user is able\n * to reposition them.\n *\n * When `replace`, anytime the user clicks on the canvas, a new measurement\n * will be created and replace any existing measurement. After a measurement\n * is created, the measurement will be editable.\n */\n @Prop({ reflect: true })\n public mode: ViewerMeasurementDistanceMode = '';\n\n /**\n * A property that reflects which anchor is currently being interacted with.\n */\n @Prop({ reflect: true, mutable: true })\n public interactingAnchor: Anchor | 'none' = 'none';\n\n /**\n * Indicates if the measurement is invalid. A measurement is invalid if either\n * the start or end position are not on the surface of the model.\n */\n @Prop({ mutable: true, reflect: true })\n public invalid = false;\n\n /**\n * The camera used to position the anchors. If `viewer` is defined, then the\n * projection view matrix of the viewer will be used.\n */\n @Prop()\n public camera?: FrameCameraBase;\n\n /**\n * @internal\n */\n @Prop()\n public hitProvider?: PointToPointHitProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public indicatorPt?: Vector3.Vector3;\n\n /**\n * The viewer to connect to this measurement. The measurement will redraw any\n * time the viewer redraws the scene.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The measurement model that will be updated when this measurement changes.\n * You can pass this to a <vertex-viewer-measurement-details> component to\n * display measurement outcomes.\n */\n @Prop()\n public measurementModel: MeasurementModel = new MeasurementModel();\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * measurement.\n */\n @Event()\n public editBegin!: EventEmitter<EditBeginEventDetails>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * measurement.\n */\n @Event()\n public editEnd!: EventEmitter<EditEndEventDetails>;\n\n @State()\n private viewport: Viewport = new Viewport(0, 0);\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private interactionCount = 0;\n\n @State()\n private internalCamera?: FrameCameraBase;\n\n @State()\n private invalidateStateCounter = 0;\n\n @State()\n // Any data that should be preserved across live-reloads, but should not cause\n // a rerender if changed.\n private stateMap: StateMap = {};\n\n @State()\n private measurementUnits = new DistanceUnits(this.units);\n\n @Element()\n private hostEl!: HTMLElement;\n\n private model = PointToPointInteractionModel.empty();\n private controller = new PointToPointInteractionController(this.model);\n private interaction?: PointToPointInteraction;\n\n private overlays = new MeasurementOverlayManager();\n private overlay?: MeasurementOverlay;\n\n private isUserInteractingWithModel = false;\n\n private newInteractionHandler?: Disposable;\n\n /**\n * Computes the bounding boxes of the anchors and label. **Note:** invoking\n * this function uses `getBoundingClientRect` internally and will cause a\n * relayout of the DOM.\n */\n @Method()\n public async computeElementMetrics(): Promise<\n ViewerMeasurementDistanceElementMetrics | undefined\n > {\n const startAnchorEl =\n this.hostEl.shadowRoot?.getElementById('start-anchor');\n const endAnchorEl = this.hostEl.shadowRoot?.getElementById('end-anchor');\n const labelEl = this.hostEl.shadowRoot?.getElementById('label');\n\n if (startAnchorEl != null && endAnchorEl != null && labelEl != null) {\n return {\n startAnchor: startAnchorEl.getBoundingClientRect(),\n endAnchor: endAnchorEl.getBoundingClientRect(),\n label: labelEl.getBoundingClientRect(),\n };\n } else {\n return undefined;\n }\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.hoverCursor?.dispose();\n this.newInteractionHandler?.dispose();\n }\n\n /**\n * @ignore\n */\n protected async componentWillLoad(): Promise<void> {\n this.updatePropsFromJson();\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n\n await this.getStencilBuffer();\n this.updateViewport();\n\n this.handleViewerChanged(this.viewer);\n this.handleModeChanged();\n\n this.computePropsAndState();\n\n this.model.onIndicatorChanged((pt) => {\n this.indicatorPt = pt;\n });\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected componentWillUpdate(): void {\n this.computePropsAndState();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n {this.showAxisReferenceLines && (\n <vertex-viewer-measurement-overlays\n measurementOverlays={this.overlays}\n viewer={this.viewer}\n />\n )}\n {this.renderMeasurement()}\n </Host>\n );\n }\n\n private renderMeasurement(): h.JSX.IntrinsicElements {\n const positions = this.computeElementPositions();\n const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } =\n positions;\n const distance = this.formatDistance(this.distance);\n\n if (this.mode === 'edit' || this.mode === 'replace') {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={indicatorPt}\n distance={distance}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n onStartAnchorPointerDown={this.handleEditAnchor('start')}\n onEndAnchorPointerDown={this.handleEditAnchor('end')}\n />\n );\n } else {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={this.indicatorPt}\n distance={distance}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n linePointerEvents=\"painted\"\n />\n );\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n if (oldViewer != null) {\n oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);\n this.removeInteractionListeners(oldViewer);\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);\n this.addInteractionListeners(newViewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('units')\n protected handleUnitsChanged(): void {\n this.measurementUnits = new DistanceUnits(this.units);\n }\n\n /**\n * @ignore\n */\n @Watch('camera')\n protected handleCameraChanged(): void {\n this.updateCamera();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected handleModeChanged(): void {\n this.warnIfDepthBuffersDisabled();\n\n // If we're not in edit or replace mode, ensure that the measurement\n // cursor is removed.\n if (this.mode === '') {\n this.stateMap.hoverCursor?.dispose();\n }\n\n if (this.viewer != null) {\n this.removeInteractionListeners(this.viewer);\n this.addInteractionListeners(this.viewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('start')\n protected handleStartChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('end')\n protected handleEndChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('invalid')\n protected handleInvalidChanged(): void {\n this.updateInteractionModel();\n }\n\n private computePropsAndState(): void {\n this.updateCamera();\n this.updateDepthBuffer();\n this.updateMeasurementPropsFromModel();\n this.updateOverlays();\n }\n\n private updateOverlays(): void {\n this.overlay?.dispose();\n\n if (\n this.showAxisReferenceLines &&\n this.interactionCount === 0 &&\n !this.invalid &&\n this.start != null &&\n this.end != null\n ) {\n this.overlay = this.overlays.addDistanceVector(this.start, this.end);\n }\n }\n\n private async setCursor(cursor: Cursor): Promise<void> {\n this.stateMap.hoverCursor?.dispose();\n\n if (!this.isUserInteractingWithModel) {\n this.stateMap.hoverCursor = await this.viewer?.addCursor(cursor);\n }\n }\n\n private computeElementPositions(): MeasurementElementPositions {\n if (this.mode === 'replace') {\n return this.computeReplaceElementPositions();\n } else {\n return this.computeEditOrViewElementPositions();\n }\n }\n\n private computeEditOrViewElementPositions(): MeasurementElementPositions {\n const measurement = this.model.getMeasurement();\n if (this.internalCamera != null && measurement != null) {\n return this.computeLineElementPositions(Line3.create(measurement));\n } else {\n return {};\n }\n }\n\n private computeReplaceElementPositions(): MeasurementElementPositions {\n if (this.internalCamera != null) {\n const measurement = this.model.getMeasurement();\n\n const line =\n measurement != null\n ? this.computeLineElementPositions(Line3.create(measurement))\n : {};\n const indicator =\n this.indicatorPt != null\n ? {\n indicatorPt: this.viewport.transformWorldToViewport(\n this.indicatorPt,\n this.internalCamera.projectionViewMatrix\n ),\n }\n : {};\n\n return { ...line, ...indicator };\n } else {\n return {};\n }\n }\n\n private computeLineElementPositions(\n line: Line3.Line3\n ): MeasurementElementPositions {\n if (this.internalCamera != null) {\n return getViewingElementPositions(line, this.interactingAnchor, {\n viewport: this.viewport,\n camera: this.internalCamera,\n });\n } else {\n return {};\n }\n }\n\n private updateCamera(): void {\n this.internalCamera = this.camera || this.viewer?.frame?.scene.camera;\n }\n\n private async updateDepthBuffer(): Promise<void> {\n this.stateMap.depthBuffer = await this.viewer?.frame?.depthBuffer();\n }\n\n private updateViewport(): void {\n const rect = getMeasurementBoundingClientRect(this.hostEl);\n this.viewport = new Viewport(rect.width, rect.height);\n this.elementBounds = rect;\n }\n\n private updatePropsFromJson(): void {\n this.start = parseVector3(this.startJson ?? this.start);\n this.end = parseVector3(this.endJson ?? this.end);\n }\n\n private updateInteractionModel(): void {\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n }\n\n private handleFrameDrawn = (): void => {\n this.invalidateState();\n };\n\n private invalidateState(): void {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n }\n\n private async addInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n if (this.mode === 'replace') {\n interactionTarget.addEventListener('pointermove', this.updateStartAnchor);\n interactionTarget.addEventListener('pointerdown', this.newMeasurement);\n interactionTarget.addEventListener('pointerleave', this.clearIndicator);\n }\n }\n\n private async removeInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n interactionTarget.removeEventListener(\n 'pointermove',\n this.updateStartAnchor\n );\n interactionTarget.removeEventListener('pointerdown', this.newMeasurement);\n interactionTarget.removeEventListener('pointerleave', this.clearIndicator);\n }\n\n private clearIndicator = (): void => {\n this.controller.clearIndicator();\n };\n\n private updateStartAnchor = async (event: PointerEvent): Promise<void> => {\n await this.getStencilBuffer();\n\n if (this.interactionCount === 0) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.updateIndicator(snapPt);\n }\n };\n\n private newMeasurement = (event: PointerEvent): void => {\n if (this.interactionCount === 0 && event.button === 0) {\n // Function that registers event listeners to perform a new measurement.\n const startMeasurement = (start: () => void): void => {\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n window.removeEventListener('pointermove', pointerMove);\n };\n const pointerUp = async (): Promise<void> => {\n dispose();\n start();\n };\n const pointerMove = (event: PointerEvent): void => {\n if (event.buttons > 0) {\n dispose();\n }\n };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n // Function that registers event listeners to detect if a user is\n // interacting with the model. If so, we temporarily disable measurement\n // updates until the user finishes.\n const pointerDownAndMove = (callback: () => void): Disposable => {\n let downPt: Point.Point = Point.create(0, 0);\n\n const pointerMove = (event: PointerEvent): void => {\n const dist = Point.distance(\n downPt,\n getMouseClientPosition(event, this.elementBounds)\n );\n if (dist >= INTERACTION_THRESHOLD) {\n callback();\n }\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n };\n\n const pointerUp = (): void => dispose();\n\n const pointerDown = (event: PointerEvent): void => {\n downPt = getMouseClientPosition(event, this.elementBounds);\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerdown', pointerDown);\n\n return {\n dispose: () => window.removeEventListener('pointerdown', pointerDown),\n };\n };\n\n // Function that registers event listeners to finish a measurement.\n const measureInteraction = (): void => {\n const handleDownAndMove = pointerDownAndMove(() => {\n this.isUserInteractingWithModel = true;\n this.stateMap.hoverCursor?.dispose();\n });\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n handleDownAndMove.dispose();\n };\n\n const pointerMove = this.createInteractionMoveHandler();\n const pointerUp = async (event: PointerEvent): Promise<void> => {\n if (event.button === 0) {\n if (this.isUserInteractingWithModel) {\n this.isUserInteractingWithModel = false;\n } else {\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n dispose();\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n }\n }\n };\n\n this.beginEditing('replace', 'end');\n this.newInteractionHandler = { dispose };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction = this.controller.newMeasurement(snapPt, hits);\n\n if (this.interaction != null) {\n startMeasurement(measureInteraction);\n }\n }\n }\n };\n\n private handleEditAnchor(\n anchor: Anchor\n ): ((event: PointerEvent) => Promise<void>) | undefined {\n if (this.mode === 'edit' || this.mode === 'replace') {\n const handlePointerMove = this.createInteractionMoveHandler();\n const handlePointerUp = async (event: PointerEvent): Promise<void> => {\n const hits = this.getHitProvider();\n if (hits != null) {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n };\n\n return async (event) => {\n await this.getStencilBuffer();\n\n if (event.button === 0) {\n this.beginEditing('edit', anchor);\n\n this.interaction = this.controller.editMeasurement(anchor);\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n }\n };\n }\n }\n\n private createInteractionMoveHandler(): (\n event: PointerEvent\n ) => Promise<void> {\n return async (event) => {\n const hits = this.getHitProvider();\n if (this.elementBounds != null && hits != null) {\n event.preventDefault();\n await this.getStencilBuffer();\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction?.update(snapPt, hits);\n this.updateMeasurementPropsFromModel();\n }\n };\n }\n\n private async getStencilBuffer(): Promise<void> {\n const stencil = await this.viewer?.stencilBuffer.latestAfterInteraction();\n this.stateMap.stencil = stencil;\n }\n\n private snapPoint(pt: Point.Point, event: MouseEvent): Point.Point {\n const hits = this.getHitProvider();\n if (hits != null && !event.shiftKey) {\n const snapDistance = Math.max(0, this.snapDistance);\n return hits.hitTester().snapToNearestPixel(pt, snapDistance);\n }\n return pt;\n }\n\n private formatDistance(distance: number | undefined): string {\n const dist =\n distance != null\n ? this.measurementUnits.convertWorldValueToReal(distance)\n : undefined;\n\n if (this.labelFormatter != null) {\n return this.labelFormatter(dist);\n } else {\n const abbreviated = this.measurementUnits.unit.abbreviatedName;\n return dist == null\n ? '---'\n : `~${dist.toFixed(this.fractionalDigits)} ${abbreviated}`;\n }\n }\n\n private beginEditing(\n type: EditBeginEventDetails['type'],\n anchor: EditBeginEventDetails['anchor']\n ): void {\n if (this.interactionCount === 0) {\n this.interactingAnchor = anchor;\n this.editBegin.emit({ type, anchor });\n }\n this.interactionCount = this.interactionCount + 1;\n }\n\n private endEditing(): void {\n if (this.interactionCount === 1) {\n const measurement = this.model.getMeasurement();\n\n this.interactingAnchor = 'none';\n this.updateMeasurementModel();\n\n if (measurement != null) {\n this.editEnd.emit(measurement);\n }\n }\n this.interactionCount = this.interactionCount - 1;\n }\n\n private updateMeasurementModel(): void {\n this.measurementModel.clearOutcome();\n\n if (!this.invalid && this.start != null && this.end != null) {\n this.measurementModel.setOutcome({\n isApproximate: true,\n results: [makeMinimumDistanceResult(this.start, this.end)],\n });\n }\n }\n\n private getHitProvider(): PointToPointHitProvider | undefined {\n if (this.hitProvider == null) {\n const hitTester = this.getHitTester();\n const viewer = this.viewer;\n if (viewer != null && hitTester != null) {\n return {\n hitTester: () => hitTester,\n raycaster: async () => (await viewer.scene()).raycaster(),\n };\n }\n } else return this.hitProvider;\n }\n\n private getHitTester(): PointToPointHitTester | undefined {\n const { stencil, depthBuffer } = this.stateMap;\n if (depthBuffer != null) {\n return new PointToPointHitTester(\n stencil,\n depthBuffer,\n this.viewport,\n this.internalCamera\n );\n }\n }\n\n private updateMeasurementPropsFromModel(): void {\n const measurement = this.model.getMeasurement();\n this.start = measurement?.start;\n this.end = measurement?.end;\n this.distance = measurement?.distance;\n this.invalid = measurement != null && !measurement.valid;\n }\n\n private async updateIndicator(pt: Point.Point): Promise<void> {\n const hits = this.getHitProvider();\n const clearCursor =\n hits == null || !this.controller.moveIndicator(pt, hits);\n\n if (clearCursor) {\n this.stateMap.hoverCursor?.dispose();\n } else {\n await this.setCursor(measurementCursor);\n }\n }\n\n private warnIfDepthBuffersDisabled(): void {\n if (this.viewer != null && this.viewer.depthBuffers == null) {\n console.warn(\n 'Measurement editing is disabled. <vertex-viewer> must have its `depth-buffers` attribute set.'\n );\n }\n }\n}\n\nfunction parseVector3(\n value: string | Vector3.Vector3 | undefined\n): Vector3.Vector3 | undefined {\n return typeof value === 'string' ? Vector3.fromJson(value) : value;\n}\n"]}
1
+ {"version":3,"file":"viewer-measurement-distance.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/viewer-measurement-distance.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,KAAK,EAEL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAG5D,OAAO,EACL,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAU,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,OAAO,EACL,yBAAyB,EACzB,gBAAgB,EAEhB,yBAAyB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAEL,aAAa,EAIb,QAAQ,GACT,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,gCAAgC,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAClD,OAAO,EAGL,iCAAiC,EACjC,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAEL,0BAA0B,GAE3B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,2BAA2B,EAAE,MAAM,0CAA0C,CAAC;AA6CvF,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC;;;;;;;;;;;;;;GAcG;AAMH,MAAM,OAAO,yBAAyB;EALtC;IA0CE;;;OAGG;IAEI,2BAAsB,GAAG,KAAK,CAAC;IAEtC;;;OAGG;IAEI,iBAAY,GAAW,yBAAyB,CAAC;IAExD;;OAEG;IAEI,UAAK,GAAqB,aAAa,CAAC;IAE/C;;OAEG;IAEI,qBAAgB,GAAG,CAAC,CAAC;IAU5B;;OAEG;IAEI,sBAAiB,GAAG,EAAE,CAAC;IAE9B;;OAEG;IAEI,kBAAa,GAAG,2BAA2B,CAAC;IAEnD;;;;;;;;;;;;OAYG;IAEI,SAAI,GAAkC,EAAE,CAAC;IAEhD;;OAEG;IAEI,sBAAiB,GAAoB,MAAM,CAAC;IAEnD;;;OAGG;IAEI,YAAO,GAAG,KAAK,CAAC;IA4BvB;;;;OAIG;IAEI,qBAAgB,GAAqB,IAAI,gBAAgB,EAAE,CAAC;IAiB3D,aAAQ,GAAa,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAMxC,qBAAgB,GAAG,CAAC,CAAC;IAMrB,2BAAsB,GAAG,CAAC,CAAC;IAK3B,aAAQ,GAAa,EAAE,CAAC;IAGxB,qBAAgB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAKjD,UAAK,GAAG,4BAA4B,CAAC,KAAK,EAAE,CAAC;IAC7C,eAAU,GAAG,IAAI,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAG/D,aAAQ,GAAG,IAAI,yBAAyB,EAAE,CAAC;IAG3C,+BAA0B,GAAG,KAAK,CAAC;IAyTnC,qBAAgB,GAAG,GAAS,EAAE;MACpC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC;IA6BM,mBAAc,GAAG,GAAS,EAAE;MAClC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;IACnC,CAAC,CAAC;IAEM,sBAAiB,GAAG,KAAK,EAAE,KAAmB,EAAiB,EAAE;MACvE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;MAE9B,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE;QAC/B,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;OACpC;IACH,CAAC,CAAC;IAEM,mBAAc,GAAG,CAAC,KAAmB,EAAQ,EAAE;MACrD,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACrD,wEAAwE;QACxE,MAAM,gBAAgB,GAAG,CAAC,KAAiB,EAAQ,EAAE;UACnD,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACnD,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;UACzD,CAAC,CAAC;UACF,MAAM,SAAS,GAAG,KAAK,IAAmB,EAAE;YAC1C,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,CAAC;UACV,CAAC,CAAC;UACF,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAChD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE;cACrB,OAAO,EAAE,CAAC;aACX;UACH,CAAC,CAAC;UAEF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;UACpD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,iEAAiE;QACjE,wEAAwE;QACxE,mCAAmC;QACnC,MAAM,kBAAkB,GAAG,CAAC,QAAoB,EAAc,EAAE;UAC9D,IAAI,MAAM,GAAgB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;UAE7C,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAChD,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CACzB,MAAM,EACN,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAClD,CAAC;YACF,IAAI,IAAI,IAAI,qBAAqB,EAAE;cACjC,QAAQ,EAAE,CAAC;aACZ;UACH,CAAC,CAAC;UAEF,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;UACrD,CAAC,CAAC;UAEF,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,OAAO,EAAE,CAAC;UAExC,MAAM,WAAW,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAChD,MAAM,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC3D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;UAClD,CAAC,CAAC;UAEF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;UAEpD,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC;WACtE,CAAC;QACJ,CAAC,CAAC;QAEF,mEAAmE;QACnE,MAAM,kBAAkB,GAAG,GAAS,EAAE;UACpC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,EAAE;;YAChD,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;YACvC,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,OAAO,EAAE,CAAC;UACvC,CAAC,CAAC,CAAC;UAEH,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YACvD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACnD,iBAAiB,CAAC,OAAO,EAAE,CAAC;UAC9B,CAAC,CAAC;UAEF,MAAM,WAAW,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;UACxD,MAAM,SAAS,GAAG,KAAK,EAAE,KAAmB,EAAiB,EAAE;;YAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;cACtB,IAAI,IAAI,CAAC,0BAA0B,EAAE;gBACnC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;eACzC;mBAAM;gBACL,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACnC,IAAI,IAAI,IAAI,IAAI,EAAE;kBAChB,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;kBAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;kBACzC,MAAM,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA,CAAC;kBAE7C,OAAO,EAAE,CAAC;kBACV,IAAI,CAAC,+BAA+B,EAAE,CAAC;kBACvC,IAAI,CAAC,UAAU,EAAE,CAAC;iBACnB;eACF;aACF;UACH,CAAC,CAAC;UAEF,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;UACpC,IAAI,CAAC,qBAAqB,GAAG,EAAE,OAAO,EAAE,CAAC;UAEzC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;UACpD,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,EAAE;UAChB,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;UAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;UACzC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;UAEhE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;YAC5B,gBAAgB,CAAC,kBAAkB,CAAC,CAAC;WACtC;SACF;OACF;IACH,CAAC,CAAC;GA4KH;EA3nBC;;;;KAIG;EAEI,KAAK,CAAC,qBAAqB;;IAGhC,MAAM,aAAa,GACjB,MAAA,IAAI,CAAC,MAAM,CAAC,UAAU,0CAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,UAAU,0CAAE,cAAc,CAAC,YAAY,CAAC,CAAC;IACzE,MAAM,OAAO,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,UAAU,0CAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAEhE,IAAI,aAAa,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,EAAE;MACnE,OAAO;QACL,WAAW,EAAE,aAAa,CAAC,qBAAqB,EAAE;QAClD,SAAS,EAAE,WAAW,CAAC,qBAAqB,EAAE;QAC9C,KAAK,EAAE,OAAO,CAAC,qBAAqB,EAAE;OACvC,CAAC;KACH;SAAM;MACL,OAAO,SAAS,CAAC;KAClB;EACH,CAAC;EAED;;KAEG;EACO,oBAAoB;;IAC5B,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,OAAO,EAAE,CAAC;IACrC,MAAA,IAAI,CAAC,qBAAqB,0CAAE,OAAO,EAAE,CAAC;EACxC,CAAC;EAED;;KAEG;EACO,KAAK,CAAC,iBAAiB;IAC/B,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEzE,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC9B,IAAI,CAAC,cAAc,EAAE,CAAC;IAEtB,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAE/B,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAElC,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE;MACnC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;EACL,CAAC;EAED;;KAEG;EACO,gBAAgB;IACxB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;EAC9B,CAAC;EAED;;KAEG;EACO,KAAK,CAAC,mBAAmB;IACjC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;EACpC,CAAC;EAED;;KAEG;EACO,MAAM;IACd,OAAO,CACL,EAAC,IAAI;MACF,IAAI,CAAC,sBAAsB,IAAI,CAC9B,0CACE,mBAAmB,EAAE,IAAI,CAAC,QAAQ,EAClC,MAAM,EAAE,IAAI,CAAC,MAAM,GACnB,CACH;MACA,IAAI,CAAC,iBAAiB,EAAE,CACpB,CACR,CAAC;EACJ,CAAC;EAEO,iBAAiB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjD,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,GAChE,SAAS,CAAC;IACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;MACnD,OAAO,CACL,EAAC,2BAA2B,IAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,eAAe,EAAE,SAAS,EAC1B,aAAa,EAAE,OAAO,EACtB,wBAAwB,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,EACxD,sBAAsB,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GACpD,CACH,CAAC;KACH;SAAM;MACL,OAAO,CACL,EAAC,2BAA2B,IAC1B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,IAAI,CAAC,WAAW,EAC7B,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,SAAS,EAC1B,aAAa,EAAE,OAAO,EACtB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EACzC,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,iBAAiB,EAAC,SAAS,GAC3B,CACH,CAAC;KACH;EACH,CAAC;EAED;;KAEG;EAEO,KAAK,CAAC,mBAAmB,CACjC,SAAmC,EACnC,SAAmC;IAEnC,IAAI,SAAS,IAAI,IAAI,EAAE;MACrB,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;MACnE,MAAM,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;KAClD;IAED,IAAI,SAAS,IAAI,IAAI,EAAE;MACrB,SAAS,CAAC,gBAAgB,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;MAChE,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;KAC/C;EACH,CAAC;EAED;;KAEG;EAEO,kBAAkB;IAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;EACxD,CAAC;EAED;;KAEG;EAEO,mBAAmB;IAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;EACtB,CAAC;EAED;;KAEG;EAEO,KAAK,CAAC,iBAAiB;;IAC/B,IAAI,CAAC,0BAA0B,EAAE,CAAC;IAElC,oEAAoE;IACpE,qBAAqB;IACrB,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE,EAAE;MACpB,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,OAAO,EAAE,CAAC;KACtC;IAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE;MACvB,MAAM,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;MACnD,MAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KACjD;EACH,CAAC;EAED;;KAEG;EAEO,kBAAkB;IAC1B,IAAI,CAAC,sBAAsB,EAAE,CAAC;EAChC,CAAC;EAED;;KAEG;EAEO,gBAAgB;IACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;EAChC,CAAC;EAED;;KAEG;EAEO,oBAAoB;IAC5B,IAAI,CAAC,sBAAsB,EAAE,CAAC;EAChC,CAAC;EAEO,KAAK,CAAC,oBAAoB;IAChC,IAAI,CAAC,YAAY,EAAE,CAAC;IACpB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC/B,IAAI,CAAC,+BAA+B,EAAE,CAAC;IACvC,IAAI,CAAC,cAAc,EAAE,CAAC;EACxB,CAAC;EAEO,cAAc;;IACpB,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,EAAE,CAAC;IAExB,IACE,IAAI,CAAC,sBAAsB;MAC3B,IAAI,CAAC,gBAAgB,KAAK,CAAC;MAC3B,CAAC,IAAI,CAAC,OAAO;MACb,IAAI,CAAC,KAAK,IAAI,IAAI;MAClB,IAAI,CAAC,GAAG,IAAI,IAAI,EAChB;MACA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;KACtE;EACH,CAAC;EAEO,KAAK,CAAC,SAAS,CAAC,MAAc;;IACpC,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,OAAO,EAAE,CAAC;IAErC,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;MACpC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,SAAS,CAAC,MAAM,CAAC,CAAA,CAAC;KAClE;EACH,CAAC;EAEO,uBAAuB;IAC7B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;MAC3B,OAAO,IAAI,CAAC,8BAA8B,EAAE,CAAC;KAC9C;SAAM;MACL,OAAO,IAAI,CAAC,iCAAiC,EAAE,CAAC;KACjD;EACH,CAAC;EAEO,iCAAiC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IAChD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE;MACtD,OAAO,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;KACpE;SAAM;MACL,OAAO,EAAE,CAAC;KACX;EACH,CAAC;EAEO,8BAA8B;IACpC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;MAEhD,MAAM,IAAI,GACR,WAAW,IAAI,IAAI;QACjB,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC;MACT,MAAM,SAAS,GACb,IAAI,CAAC,WAAW,IAAI,IAAI;QACtB,CAAC,CAAC;UACE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CACjD,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,CAAC,oBAAoB,CACzC;SACF;QACH,CAAC,CAAC,EAAE,CAAC;MAET,uCAAY,IAAI,GAAK,SAAS,EAAG;KAClC;SAAM;MACL,OAAO,EAAE,CAAC;KACX;EACH,CAAC;EAEO,2BAA2B,CACjC,IAAiB;IAEjB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MAC/B,OAAO,0BAA0B,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE;QAC9D,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,IAAI,CAAC,cAAc;OAC5B,CAAC,CAAC;KACJ;SAAM;MACL,OAAO,EAAE,CAAC;KACX;EACH,CAAC;EAEO,YAAY;;IAClB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,KAAI,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,0CAAE,KAAK,CAAC,MAAM,CAAA,CAAC;EACxE,CAAC;EAEO,KAAK,CAAC,iBAAiB;;IAC7B,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,MAAM,CAAA,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,0CAAE,WAAW,EAAE,CAAA,CAAC;EACtE,CAAC;EAEO,cAAc;IACpB,MAAM,IAAI,GAAG,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;EAC5B,CAAC;EAEO,mBAAmB;;IACzB,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,MAAA,IAAI,CAAC,SAAS,mCAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,MAAA,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC,GAAG,CAAC,CAAC;EACpD,CAAC;EAEO,sBAAsB;IAC5B,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;EAC3E,CAAC;EAMO,eAAe;IACrB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;EAChE,CAAC;EAEO,KAAK,CAAC,uBAAuB,CACnC,MAA+B;IAE/B,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,+BAA+B,EAAE,CAAC;IACzE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;MAC3B,iBAAiB,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;MAC1E,iBAAiB,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;MACvE,iBAAiB,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;KACzE;EACH,CAAC;EAEO,KAAK,CAAC,0BAA0B,CACtC,MAA+B;IAE/B,MAAM,iBAAiB,GAAG,MAAM,MAAM,CAAC,+BAA+B,EAAE,CAAC;IACzE,iBAAiB,CAAC,mBAAmB,CACnC,aAAa,EACb,IAAI,CAAC,iBAAiB,CACvB,CAAC;IACF,iBAAiB,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1E,iBAAiB,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;EAC7E,CAAC;EA+HO,gBAAgB,CACtB,MAAc;IAEd,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;MACnD,MAAM,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;MAC9D,MAAM,eAAe,GAAG,KAAK,EAAE,KAAmB,EAAiB,EAAE;;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,IAAI,IAAI,IAAI,EAAE;UAChB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;UAC7D,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;UAEzD,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;UAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;UACzC,MAAM,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA,CAAC;UAE7C,IAAI,CAAC,+BAA+B,EAAE,CAAC;UACvC,IAAI,CAAC,UAAU,EAAE,CAAC;SACnB;MACH,CAAC,CAAC;MAEF,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;QACrB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;UACtB,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;UAElC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;UAE3D,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;UAC1D,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;SACvD;MACH,CAAC,CAAC;KACH;EACH,CAAC;EAEO,4BAA4B;IAGlC,OAAO,KAAK,EAAE,KAAK,EAAE,EAAE;;MACrB,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;MACnC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;QAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE9B,MAAM,EAAE,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzC,MAAA,IAAI,CAAC,WAAW,0CAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,+BAA+B,EAAE,CAAC;OACxC;IACH,CAAC,CAAC;EACJ,CAAC;EAEO,KAAK,CAAC,gBAAgB;;IAC5B,MAAM,OAAO,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,aAAa,CAAC,sBAAsB,EAAE,CAAA,CAAC;IAC1E,IAAI,CAAC,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;EAClC,CAAC;EAEO,SAAS,CAAC,EAAe,EAAE,KAAiB;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;MACnC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;MACpD,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;KAC9D;IACD,OAAO,EAAE,CAAC;EACZ,CAAC;EAEO,cAAc,CAAC,QAA4B;IACjD,MAAM,IAAI,GACR,QAAQ,IAAI,IAAI;MACd,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAAC,QAAQ,CAAC;MACzD,CAAC,CAAC,SAAS,CAAC;IAEhB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,EAAE;MAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;KAClC;SAAM;MACL,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC;MAC/D,OAAO,IAAI,IAAI,IAAI;QACjB,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,WAAW,EAAE,CAAC;KAC9D;EACH,CAAC;EAEO,YAAY,CAClB,IAAmC,EACnC,MAAuC;IAEvC,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE;MAC/B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;MAChC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;KACvC;IACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;EACpD,CAAC;EAEO,UAAU;IAChB,IAAI,IAAI,CAAC,gBAAgB,KAAK,CAAC,EAAE;MAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;MAEhD,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;MAChC,IAAI,CAAC,sBAAsB,EAAE,CAAC;MAE9B,IAAI,WAAW,IAAI,IAAI,EAAE;QACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;OAChC;KACF;IACD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;EACpD,CAAC;EAEO,sBAAsB;IAC5B,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;IAErC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE;MAC3D,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAC/B,aAAa,EAAE,IAAI;QACnB,OAAO,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;OAC3D,CAAC,CAAC;KACJ;EACH,CAAC;EAEO,cAAc;IACpB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,EAAE;MAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;MACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;MAC3B,IAAI,MAAM,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE;QACvC,OAAO;UACL,SAAS,EAAE,GAAG,EAAE,CAAC,SAAS;UAC1B,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE;SAC1D,CAAC;OACH;KACF;;MAAM,OAAO,IAAI,CAAC,WAAW,CAAC;EACjC,CAAC;EAEO,YAAY;IAClB,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/C,IAAI,WAAW,IAAI,IAAI,EAAE;MACvB,OAAO,IAAI,qBAAqB,CAC9B,OAAO,EACP,WAAW,EACX,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,cAAc,CACpB,CAAC;KACH;EACH,CAAC;EAEO,+BAA+B;IACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;IAChD,IAAI,CAAC,KAAK,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC;IAChC,IAAI,CAAC,GAAG,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,GAAG,CAAC;IAC5B,IAAI,CAAC,QAAQ,GAAG,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,CAAC;IACtC,IAAI,CAAC,OAAO,GAAG,WAAW,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;EAC3D,CAAC;EAEO,KAAK,CAAC,eAAe,CAAC,EAAe;;IAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,WAAW,GACf,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE3D,IAAI,WAAW,EAAE;MACf,MAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,0CAAE,OAAO,EAAE,CAAC;KACtC;SAAM;MACL,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;KACzC;EACH,CAAC;EAEO,0BAA0B;IAChC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,EAAE;MAC3D,OAAO,CAAC,IAAI,CACV,+FAA+F,CAChG,CAAC;KACH;EACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF;AAED,SAAS,YAAY,CACnB,KAA2C;EAE3C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACrE,CAAC","sourcesContent":["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 { Line3, Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport {\n MEASUREMENT_LINE_CAP_LENGTH,\n MEASUREMENT_SNAP_DISTANCE,\n} from '../../lib/constants';\nimport { Cursor, measurementCursor } from '../../lib/cursors';\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { Formatter } from '../../lib/formatter';\nimport {\n makeMinimumDistanceResult,\n MeasurementModel,\n MeasurementOverlay,\n MeasurementOverlayManager,\n} from '../../lib/measurement';\nimport {\n DepthBuffer,\n DistanceUnits,\n DistanceUnitType,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\nimport { getMeasurementBoundingClientRect } from './dom';\nimport { PointToPointHitTester } from './hitTest';\nimport {\n PointToPointHitProvider,\n PointToPointInteraction,\n PointToPointInteractionController,\n PointToPointInteractionModel,\n} from './interactions';\nimport {\n Anchor,\n getViewingElementPositions,\n MeasurementElementPositions,\n} from './utils';\nimport { DistanceMeasurementRenderer } from './viewer-measurement-distance-components';\n\n/**\n * Contains the bounding boxes of child elements of this component. This\n * information is useful for positioning popups or other elements around the\n * measurement.\n *\n * @see {@link ViewerDistanceMeasurement.computeElementMetrics} - For\n * calculating element metrics.\n */\nexport interface ViewerMeasurementDistanceElementMetrics {\n startAnchor: DOMRect;\n endAnchor: DOMRect;\n label: DOMRect;\n}\n\n/**\n * The supported measurement modes.\n *\n * @see {@link ViewerDistanceMeasurement.mode} - For more details about modes.\n */\nexport type ViewerMeasurementDistanceMode = 'edit' | 'replace' | '';\n\n/**\n * A details object describing the edit begin event.\n */\nexport interface EditBeginEventDetails {\n type: Exclude<ViewerMeasurementDistanceMode, ''>;\n anchor: Anchor;\n}\n/**\n * A details object describing the edit end event.\n */\nexport interface EditEndEventDetails {\n start: Vector3.Vector3;\n end: Vector3.Vector3;\n valid: boolean;\n}\n\ninterface StateMap {\n hoverCursor?: Disposable;\n stencil?: StencilBuffer;\n depthBuffer?: DepthBuffer;\n}\n\nconst INTERACTION_THRESHOLD = 3;\n\n/**\n * @slot start-anchor - An HTML element for the starting point anchor.\n *\n * @slot start-label - An HTML or text element that displays next to the start\n * anchor.\n *\n * @slot end-anchor - An HTML element for the ending point anchor.\n *\n * @slot end-label - An HTML or text element that displays next to the end\n * anchor.\n *\n * @slot indicator - An HTML element for the measurement indicator. The\n * indicator represents the position where a measurement will be placed while\n * editing.\n */\n@Component({\n tag: 'vertex-viewer-measurement-distance',\n styleUrl: 'viewer-measurement-distance.css',\n shadow: true,\n})\nexport class ViewerMeasurementDistance {\n /**\n * The world position of the starting anchor.\n */\n @Prop({ mutable: true })\n public start?: Vector3.Vector3;\n\n /**\n * The world position of the starting anchor, as a JSON string. The JSON\n * string can be an array or object representation in the format of `[x, y,\n * z]` or `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public startJson?: string;\n\n /**\n * The world position of the ending anchor.\n */\n @Prop({ mutable: true })\n public end?: Vector3.Vector3;\n\n /**\n * The world position of the ending anchor, as a JSON string. The JSON string\n * can be an array or object representation in the format of `[x, y, z]` or\n * `{\"x\": 0, \"y\": 0, \"z\": 0}`.\n */\n @Prop()\n public endJson?: string;\n\n /**\n * The distance between `start` and `end` in real world units. Value will be\n * undefined if the start and end positions are undefined, or if the\n * measurement is invalid.\n */\n @Prop({ mutable: true })\n public distance?: number;\n\n /**\n * Enables the display of axis reference lines between the start and end\n * point.\n */\n @Prop()\n public showAxisReferenceLines = false;\n\n /**\n * The distance, in pixels, between the mouse and nearest snappable edge. A\n * value of 0 disables snapping.\n */\n @Prop()\n public snapDistance: number = MEASUREMENT_SNAP_DISTANCE;\n\n /**\n * The unit of measurement.\n */\n @Prop()\n public units: DistanceUnitType = 'millimeters';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public labelFormatter?: Formatter<number | undefined>;\n\n /**\n * The distance from an anchor to its label.\n */\n @Prop()\n public anchorLabelOffset = 20;\n\n /**\n * The length of the caps at each end of the distance measurement.\n */\n @Prop()\n public lineCapLength = MEASUREMENT_LINE_CAP_LENGTH;\n\n /**\n * A mode that specifies how the measurement component should behave.\n *\n * When unset, the component will not respond to interactions with the\n * handles.\n *\n * When `edit`, the measurement anchors are interactive and the user is able\n * to reposition them.\n *\n * When `replace`, anytime the user clicks on the canvas, a new measurement\n * will be created and replace any existing measurement. After a measurement\n * is created, the measurement will be editable.\n */\n @Prop({ reflect: true })\n public mode: ViewerMeasurementDistanceMode = '';\n\n /**\n * A property that reflects which anchor is currently being interacted with.\n */\n @Prop({ reflect: true, mutable: true })\n public interactingAnchor: Anchor | 'none' = 'none';\n\n /**\n * Indicates if the measurement is invalid. A measurement is invalid if either\n * the start or end position are not on the surface of the model.\n */\n @Prop({ mutable: true, reflect: true })\n public invalid = false;\n\n /**\n * The camera used to position the anchors. If `viewer` is defined, then the\n * projection view matrix of the viewer will be used.\n */\n @Prop()\n public camera?: FrameCameraBase;\n\n /**\n * @internal\n */\n @Prop()\n public hitProvider?: PointToPointHitProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public indicatorPt?: Vector3.Vector3;\n\n /**\n * The viewer to connect to this measurement. The measurement will redraw any\n * time the viewer redraws the scene.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The measurement model that will be updated when this measurement changes.\n * You can pass this to a <vertex-viewer-measurement-details> component to\n * display measurement outcomes.\n */\n @Prop()\n public measurementModel: MeasurementModel = new MeasurementModel();\n\n /**\n * An event that is dispatched anytime the user begins editing the\n * measurement.\n */\n @Event()\n public editBegin!: EventEmitter<EditBeginEventDetails>;\n\n /**\n * An event that is dispatched when the user has finished editing the\n * measurement.\n */\n @Event()\n public editEnd!: EventEmitter<EditEndEventDetails>;\n\n @State()\n private viewport: Viewport = new Viewport(0, 0);\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private interactionCount = 0;\n\n @State()\n private internalCamera?: FrameCameraBase;\n\n @State()\n private invalidateStateCounter = 0;\n\n @State()\n // Any data that should be preserved across live-reloads, but should not cause\n // a rerender if changed.\n private stateMap: StateMap = {};\n\n @State()\n private measurementUnits = new DistanceUnits(this.units);\n\n @Element()\n private hostEl!: HTMLElement;\n\n private model = PointToPointInteractionModel.empty();\n private controller = new PointToPointInteractionController(this.model);\n private interaction?: PointToPointInteraction;\n\n private overlays = new MeasurementOverlayManager();\n private overlay?: MeasurementOverlay;\n\n private isUserInteractingWithModel = false;\n\n private newInteractionHandler?: Disposable;\n\n /**\n * Computes the bounding boxes of the anchors and label. **Note:** invoking\n * this function uses `getBoundingClientRect` internally and will cause a\n * relayout of the DOM.\n */\n @Method()\n public async computeElementMetrics(): Promise<\n ViewerMeasurementDistanceElementMetrics | undefined\n > {\n const startAnchorEl =\n this.hostEl.shadowRoot?.getElementById('start-anchor');\n const endAnchorEl = this.hostEl.shadowRoot?.getElementById('end-anchor');\n const labelEl = this.hostEl.shadowRoot?.getElementById('label');\n\n if (startAnchorEl != null && endAnchorEl != null && labelEl != null) {\n return {\n startAnchor: startAnchorEl.getBoundingClientRect(),\n endAnchor: endAnchorEl.getBoundingClientRect(),\n label: labelEl.getBoundingClientRect(),\n };\n } else {\n return undefined;\n }\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.stateMap.hoverCursor?.dispose();\n this.newInteractionHandler?.dispose();\n }\n\n /**\n * @ignore\n */\n protected async componentWillLoad(): Promise<void> {\n this.updatePropsFromJson();\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n\n await this.getStencilBuffer();\n this.updateViewport();\n\n await this.handleViewerChanged(this.viewer);\n await this.handleModeChanged();\n\n await this.computePropsAndState();\n\n this.model.onIndicatorChanged((pt) => {\n this.indicatorPt = pt;\n });\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected async componentWillUpdate(): Promise<void> {\n await this.computePropsAndState();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n {this.showAxisReferenceLines && (\n <vertex-viewer-measurement-overlays\n measurementOverlays={this.overlays}\n viewer={this.viewer}\n />\n )}\n {this.renderMeasurement()}\n </Host>\n );\n }\n\n private renderMeasurement(): h.JSX.IntrinsicElements {\n const positions = this.computeElementPositions();\n const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } =\n positions;\n const distance = this.formatDistance(this.distance);\n\n if (this.mode === 'edit' || this.mode === 'replace') {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={indicatorPt}\n distance={distance}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n onStartAnchorPointerDown={this.handleEditAnchor('start')}\n onEndAnchorPointerDown={this.handleEditAnchor('end')}\n />\n );\n } else {\n return (\n <DistanceMeasurementRenderer\n startPt={startPt}\n endPt={endPt}\n centerPt={labelPt}\n indicatorPt={this.indicatorPt}\n distance={distance}\n hideStartAnchor={hideStart}\n hideEndAnchor={hideEnd}\n anchorLabelOffset={this.anchorLabelOffset}\n lineCapLength={this.lineCapLength}\n linePointerEvents=\"painted\"\n />\n );\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): Promise<void> {\n if (oldViewer != null) {\n oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);\n await this.removeInteractionListeners(oldViewer);\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);\n await this.addInteractionListeners(newViewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('units')\n protected handleUnitsChanged(): void {\n this.measurementUnits = new DistanceUnits(this.units);\n }\n\n /**\n * @ignore\n */\n @Watch('camera')\n protected handleCameraChanged(): void {\n this.updateCamera();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected async handleModeChanged(): Promise<void> {\n this.warnIfDepthBuffersDisabled();\n\n // If we're not in edit or replace mode, ensure that the measurement\n // cursor is removed.\n if (this.mode === '') {\n this.stateMap.hoverCursor?.dispose();\n }\n\n if (this.viewer != null) {\n await this.removeInteractionListeners(this.viewer);\n await this.addInteractionListeners(this.viewer);\n }\n }\n\n /**\n * @ignore\n */\n @Watch('start')\n protected handleStartChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('end')\n protected handleEndChanged(): void {\n this.updateInteractionModel();\n }\n\n /**\n * @ignore\n */\n @Watch('invalid')\n protected handleInvalidChanged(): void {\n this.updateInteractionModel();\n }\n\n private async computePropsAndState(): Promise<void> {\n this.updateCamera();\n await this.updateDepthBuffer();\n this.updateMeasurementPropsFromModel();\n this.updateOverlays();\n }\n\n private updateOverlays(): void {\n this.overlay?.dispose();\n\n if (\n this.showAxisReferenceLines &&\n this.interactionCount === 0 &&\n !this.invalid &&\n this.start != null &&\n this.end != null\n ) {\n this.overlay = this.overlays.addDistanceVector(this.start, this.end);\n }\n }\n\n private async setCursor(cursor: Cursor): Promise<void> {\n this.stateMap.hoverCursor?.dispose();\n\n if (!this.isUserInteractingWithModel) {\n this.stateMap.hoverCursor = await this.viewer?.addCursor(cursor);\n }\n }\n\n private computeElementPositions(): MeasurementElementPositions {\n if (this.mode === 'replace') {\n return this.computeReplaceElementPositions();\n } else {\n return this.computeEditOrViewElementPositions();\n }\n }\n\n private computeEditOrViewElementPositions(): MeasurementElementPositions {\n const measurement = this.model.getMeasurement();\n if (this.internalCamera != null && measurement != null) {\n return this.computeLineElementPositions(Line3.create(measurement));\n } else {\n return {};\n }\n }\n\n private computeReplaceElementPositions(): MeasurementElementPositions {\n if (this.internalCamera != null) {\n const measurement = this.model.getMeasurement();\n\n const line =\n measurement != null\n ? this.computeLineElementPositions(Line3.create(measurement))\n : {};\n const indicator =\n this.indicatorPt != null\n ? {\n indicatorPt: this.viewport.transformWorldToViewport(\n this.indicatorPt,\n this.internalCamera.projectionViewMatrix\n ),\n }\n : {};\n\n return { ...line, ...indicator };\n } else {\n return {};\n }\n }\n\n private computeLineElementPositions(\n line: Line3.Line3\n ): MeasurementElementPositions {\n if (this.internalCamera != null) {\n return getViewingElementPositions(line, this.interactingAnchor, {\n viewport: this.viewport,\n camera: this.internalCamera,\n });\n } else {\n return {};\n }\n }\n\n private updateCamera(): void {\n this.internalCamera = this.camera || this.viewer?.frame?.scene.camera;\n }\n\n private async updateDepthBuffer(): Promise<void> {\n this.stateMap.depthBuffer = await this.viewer?.frame?.depthBuffer();\n }\n\n private updateViewport(): void {\n const rect = getMeasurementBoundingClientRect(this.hostEl);\n this.viewport = new Viewport(rect.width, rect.height);\n this.elementBounds = rect;\n }\n\n private updatePropsFromJson(): void {\n this.start = parseVector3(this.startJson ?? this.start);\n this.end = parseVector3(this.endJson ?? this.end);\n }\n\n private updateInteractionModel(): void {\n this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);\n }\n\n private handleFrameDrawn = (): void => {\n this.invalidateState();\n };\n\n private invalidateState(): void {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n }\n\n private async addInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n if (this.mode === 'replace') {\n interactionTarget.addEventListener('pointermove', this.updateStartAnchor);\n interactionTarget.addEventListener('pointerdown', this.newMeasurement);\n interactionTarget.addEventListener('pointerleave', this.clearIndicator);\n }\n }\n\n private async removeInteractionListeners(\n viewer: HTMLVertexViewerElement\n ): Promise<void> {\n const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();\n interactionTarget.removeEventListener(\n 'pointermove',\n this.updateStartAnchor\n );\n interactionTarget.removeEventListener('pointerdown', this.newMeasurement);\n interactionTarget.removeEventListener('pointerleave', this.clearIndicator);\n }\n\n private clearIndicator = (): void => {\n this.controller.clearIndicator();\n };\n\n private updateStartAnchor = async (event: PointerEvent): Promise<void> => {\n await this.getStencilBuffer();\n\n if (this.interactionCount === 0) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.updateIndicator(snapPt);\n }\n };\n\n private newMeasurement = (event: PointerEvent): void => {\n if (this.interactionCount === 0 && event.button === 0) {\n // Function that registers event listeners to perform a new measurement.\n const startMeasurement = (start: () => void): void => {\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n window.removeEventListener('pointermove', pointerMove);\n };\n const pointerUp = async (): Promise<void> => {\n dispose();\n start();\n };\n const pointerMove = (event: PointerEvent): void => {\n if (event.buttons > 0) {\n dispose();\n }\n };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n // Function that registers event listeners to detect if a user is\n // interacting with the model. If so, we temporarily disable measurement\n // updates until the user finishes.\n const pointerDownAndMove = (callback: () => void): Disposable => {\n let downPt: Point.Point = Point.create(0, 0);\n\n const pointerMove = (event: PointerEvent): void => {\n const dist = Point.distance(\n downPt,\n getMouseClientPosition(event, this.elementBounds)\n );\n if (dist >= INTERACTION_THRESHOLD) {\n callback();\n }\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n };\n\n const pointerUp = (): void => dispose();\n\n const pointerDown = (event: PointerEvent): void => {\n downPt = getMouseClientPosition(event, this.elementBounds);\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerdown', pointerDown);\n\n return {\n dispose: () => window.removeEventListener('pointerdown', pointerDown),\n };\n };\n\n // Function that registers event listeners to finish a measurement.\n const measureInteraction = (): void => {\n const handleDownAndMove = pointerDownAndMove(() => {\n this.isUserInteractingWithModel = true;\n this.stateMap.hoverCursor?.dispose();\n });\n\n const dispose = (): void => {\n window.removeEventListener('pointermove', pointerMove);\n window.removeEventListener('pointerup', pointerUp);\n handleDownAndMove.dispose();\n };\n\n const pointerMove = this.createInteractionMoveHandler();\n const pointerUp = async (event: PointerEvent): Promise<void> => {\n if (event.button === 0) {\n if (this.isUserInteractingWithModel) {\n this.isUserInteractingWithModel = false;\n } else {\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n dispose();\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n }\n }\n };\n\n this.beginEditing('replace', 'end');\n this.newInteractionHandler = { dispose };\n\n window.addEventListener('pointermove', pointerMove);\n window.addEventListener('pointerup', pointerUp);\n };\n\n const hits = this.getHitProvider();\n if (hits != null) {\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction = this.controller.newMeasurement(snapPt, hits);\n\n if (this.interaction != null) {\n startMeasurement(measureInteraction);\n }\n }\n }\n };\n\n private handleEditAnchor(\n anchor: Anchor\n ): ((event: PointerEvent) => Promise<void>) | undefined {\n if (this.mode === 'edit' || this.mode === 'replace') {\n const handlePointerMove = this.createInteractionMoveHandler();\n const handlePointerUp = async (event: PointerEvent): Promise<void> => {\n const hits = this.getHitProvider();\n if (hits != null) {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n await this.interaction?.finish(snapPt, hits);\n\n this.updateMeasurementPropsFromModel();\n this.endEditing();\n }\n };\n\n return async (event) => {\n await this.getStencilBuffer();\n\n if (event.button === 0) {\n this.beginEditing('edit', anchor);\n\n this.interaction = this.controller.editMeasurement(anchor);\n\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n }\n };\n }\n }\n\n private createInteractionMoveHandler(): (\n event: PointerEvent\n ) => Promise<void> {\n return async (event) => {\n const hits = this.getHitProvider();\n if (this.elementBounds != null && hits != null) {\n event.preventDefault();\n await this.getStencilBuffer();\n\n const pt = getMouseClientPosition(event, this.elementBounds);\n const snapPt = this.snapPoint(pt, event);\n this.interaction?.update(snapPt, hits);\n this.updateMeasurementPropsFromModel();\n }\n };\n }\n\n private async getStencilBuffer(): Promise<void> {\n const stencil = await this.viewer?.stencilBuffer.latestAfterInteraction();\n this.stateMap.stencil = stencil;\n }\n\n private snapPoint(pt: Point.Point, event: MouseEvent): Point.Point {\n const hits = this.getHitProvider();\n if (hits != null && !event.shiftKey) {\n const snapDistance = Math.max(0, this.snapDistance);\n return hits.hitTester().snapToNearestPixel(pt, snapDistance);\n }\n return pt;\n }\n\n private formatDistance(distance: number | undefined): string {\n const dist =\n distance != null\n ? this.measurementUnits.convertWorldValueToReal(distance)\n : undefined;\n\n if (this.labelFormatter != null) {\n return this.labelFormatter(dist);\n } else {\n const abbreviated = this.measurementUnits.unit.abbreviatedName;\n return dist == null\n ? '---'\n : `~${dist.toFixed(this.fractionalDigits)} ${abbreviated}`;\n }\n }\n\n private beginEditing(\n type: EditBeginEventDetails['type'],\n anchor: EditBeginEventDetails['anchor']\n ): void {\n if (this.interactionCount === 0) {\n this.interactingAnchor = anchor;\n this.editBegin.emit({ type, anchor });\n }\n this.interactionCount = this.interactionCount + 1;\n }\n\n private endEditing(): void {\n if (this.interactionCount === 1) {\n const measurement = this.model.getMeasurement();\n\n this.interactingAnchor = 'none';\n this.updateMeasurementModel();\n\n if (measurement != null) {\n this.editEnd.emit(measurement);\n }\n }\n this.interactionCount = this.interactionCount - 1;\n }\n\n private updateMeasurementModel(): void {\n this.measurementModel.clearOutcome();\n\n if (!this.invalid && this.start != null && this.end != null) {\n this.measurementModel.setOutcome({\n isApproximate: true,\n results: [makeMinimumDistanceResult(this.start, this.end)],\n });\n }\n }\n\n private getHitProvider(): PointToPointHitProvider | undefined {\n if (this.hitProvider == null) {\n const hitTester = this.getHitTester();\n const viewer = this.viewer;\n if (viewer != null && hitTester != null) {\n return {\n hitTester: () => hitTester,\n raycaster: async () => (await viewer.scene()).raycaster(),\n };\n }\n } else return this.hitProvider;\n }\n\n private getHitTester(): PointToPointHitTester | undefined {\n const { stencil, depthBuffer } = this.stateMap;\n if (depthBuffer != null) {\n return new PointToPointHitTester(\n stencil,\n depthBuffer,\n this.viewport,\n this.internalCamera\n );\n }\n }\n\n private updateMeasurementPropsFromModel(): void {\n const measurement = this.model.getMeasurement();\n this.start = measurement?.start;\n this.end = measurement?.end;\n this.distance = measurement?.distance;\n this.invalid = measurement != null && !measurement.valid;\n }\n\n private async updateIndicator(pt: Point.Point): Promise<void> {\n const hits = this.getHitProvider();\n const clearCursor =\n hits == null || !this.controller.moveIndicator(pt, hits);\n\n if (clearCursor) {\n this.stateMap.hoverCursor?.dispose();\n } else {\n await this.setCursor(measurementCursor);\n }\n }\n\n private warnIfDepthBuffersDisabled(): void {\n if (this.viewer != null && this.viewer.depthBuffers == null) {\n console.warn(\n 'Measurement editing is disabled. <vertex-viewer> must have its `depth-buffers` attribute set.'\n );\n }\n }\n}\n\nfunction parseVector3(\n value: string | Vector3.Vector3 | undefined\n): Vector3.Vector3 | undefined {\n return typeof value === 'string' ? Vector3.fromJson(value) : value;\n}\n"]}
@@ -32,6 +32,14 @@ export class CursorManager {
32
32
  * @see {@link CursorManager.getActiveCursor} to query the current cursor.
33
33
  */
34
34
  add(cursor, priority = CursorManager.NORMAL_PRIORITY) {
35
+ // Ensure a duplicate cursor will not be added to the cursor manager.
36
+ // If a matching cursor exists, delete it before proceeding.
37
+ // Note that deleting the old cursor and adding the new one results in the
38
+ // new cursor taking precedent over other existing cursors with the same priority.
39
+ const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);
40
+ if (duplicateCursor != null) {
41
+ this.remove(duplicateCursor.id);
42
+ }
35
43
  const id = ++this.nextId;
36
44
  const instance = { id, cursor, priority, dispose: () => this.remove(id) };
37
45
  this.cursors.push(instance);
@@ -50,6 +58,16 @@ export class CursorManager {
50
58
  this.onChanged.emit();
51
59
  }
52
60
  }
61
+ /**
62
+ * Checks to see if an existing cursor matches the provided cursor and priority level.
63
+ * The matching cursor is returned if found.
64
+ *
65
+ * @param cursorToCheck The cursor to check for duplicates against.
66
+ * @param priorityToCheck The priority level to check for duplicates against.
67
+ */
68
+ getExistingDuplicateCursor(cursorToCheck, priorityToCheck) {
69
+ return this.cursors.find((cursor) => cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck);
70
+ }
53
71
  /**
54
72
  * Returns the active cursor based on priority and insertion order.
55
73
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cursors.js","sourceRoot":"","sources":["../../../../src/lib/cursors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiE/D;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;EAA1B;IAiBE;;;;;OAKG;IACa,cAAS,GAAG,IAAI,eAAe,EAAQ,CAAC;IAEhD,YAAO,GAAqB,EAAE,CAAC;IAE/B,WAAM,GAAG,CAAC,CAAC;EAiDrB,CAAC;EA/CC;;;;;;;;;KASG;EACI,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe;IAExC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;EAClB,CAAC;EAED;;;;KAIG;EACK,MAAM,CAAC,QAAgB;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;EACH,CAAC;EAED;;;;KAIG;EACI,eAAe;;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;OACxB,MAAM,EAAE;OACR,OAAO,EAAE;OACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;EAC3B,CAAC;;AA1ED;;GAEG;AACoB,0BAAY,GAAG,CAAC,CAAC;AAExC;;;GAGG;AACoB,6BAAe,GAAG,EAAE,CAAC;AAE5C;;GAEG;AACoB,2BAAa,GAAG,EAAE,CAAC;AA+D5C,+EAA+E;AAE/E,MAAM,CAAC,MAAM,iBAAiB,GAAG;EAC/B,GAAG,EAAE,irBAAirB;EACtrB,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;EACxC,GAAG,EAAE,siCAAsiC;EAC3iC,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;EACvB,GAAG,EAAE,2oCAA2oC;EAChpC,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;EAC5B,GAAG,EAAE,mvBAAmvB;EACxvB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;EAC5B,GAAG,EAAE,+0BAA+0B;EACp1B,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;CACb,CAAC","sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"]}
1
+ {"version":3,"file":"cursors.js","sourceRoot":"","sources":["../../../../src/lib/cursors.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"]}
@@ -33,6 +33,14 @@ class CursorManager {
33
33
  * @see {@link CursorManager.getActiveCursor} to query the current cursor.
34
34
  */
35
35
  add(cursor, priority = CursorManager.NORMAL_PRIORITY) {
36
+ // Ensure a duplicate cursor will not be added to the cursor manager.
37
+ // If a matching cursor exists, delete it before proceeding.
38
+ // Note that deleting the old cursor and adding the new one results in the
39
+ // new cursor taking precedent over other existing cursors with the same priority.
40
+ const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);
41
+ if (duplicateCursor != null) {
42
+ this.remove(duplicateCursor.id);
43
+ }
36
44
  const id = ++this.nextId;
37
45
  const instance = { id, cursor, priority, dispose: () => this.remove(id) };
38
46
  this.cursors.push(instance);
@@ -51,6 +59,16 @@ class CursorManager {
51
59
  this.onChanged.emit();
52
60
  }
53
61
  }
62
+ /**
63
+ * Checks to see if an existing cursor matches the provided cursor and priority level.
64
+ * The matching cursor is returned if found.
65
+ *
66
+ * @param cursorToCheck The cursor to check for duplicates against.
67
+ * @param priorityToCheck The priority level to check for duplicates against.
68
+ */
69
+ getExistingDuplicateCursor(cursorToCheck, priorityToCheck) {
70
+ return this.cursors.find((cursor) => cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck);
71
+ }
54
72
  /**
55
73
  * Returns the active cursor based on priority and insertion order.
56
74
  *
@@ -1 +1 @@
1
- {"file":"cursors.js","mappings":";;;;;AAiEA;;;;;;;MAOa,aAAa;EAA1B;;;;;;;IAuBkB,cAAS,GAAG,IAAI,eAAe,EAAQ,CAAC;IAEhD,YAAO,GAAqB,EAAE,CAAC;IAE/B,WAAM,GAAG,CAAC,CAAC;GAiDpB;;;;;;;;;;;EArCQ,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe;IAExC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;GACjB;;;;;;EAOO,MAAM,CAAC,QAAgB;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;GACF;;;;;;EAOM,eAAe;;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;OACxB,MAAM,EAAE;OACR,OAAO,EAAE;OACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;GAC1B;;AA1ED;;;AAGuB,0BAAY,GAAG,CAAC,CAAC;AAExC;;;;AAIuB,6BAAe,GAAG,EAAE,CAAC;AAE5C;;;AAGuB,2BAAa,GAAG,EAAE,CAAC;AA+D5C;MAEa,iBAAiB,GAAG;EAC/B,GAAG,EAAE,irBAAirB;EACtrB,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,0BAA0B,GAAG;EACxC,GAAG,EAAE,siCAAsiC;EAC3iC,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,SAAS,GAAG;EACvB,GAAG,EAAE,2oCAA2oC;EAChpC,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,mvBAAmvB;EACxvB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,+0BAA+0B;EACp1B,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;;;;;","names":[],"sources":["./src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"version":3}
1
+ {"file":"cursors.js","mappings":";;;;;AAiEA;;;;;;;MAOa,aAAa;EAA1B;;;;;;;IAuBkB,cAAS,GAAG,IAAI,eAAe,EAAQ,CAAC;IAEhD,YAAO,GAAqB,EAAE,CAAC;IAE/B,WAAM,GAAG,CAAC,CAAC;GA2EpB;;;;;;;;;;;EA/DQ,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe;;;;;IAMxC,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1E,IAAI,eAAe,IAAI,IAAI,EAAE;MAC3B,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;KACjC;IAED,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;IACzB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACtB,OAAO,QAAQ,CAAC;GACjB;;;;;;EAOO,MAAM,CAAC,QAAgB;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,QAAQ,CAAC,CAAC;IAClE,IAAI,KAAK,IAAI,CAAC,EAAE;MACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;MAC9B,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;GACF;;;;;;;;EASO,0BAA0B,CAChC,aAAqB,EACrB,eAAuB;IAEvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,MAAM,KACL,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,CACzE,CAAC;GACH;;;;;;EAOM,eAAe;;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;OACxB,MAAM,EAAE;OACR,OAAO,EAAE;OACT,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,0CAAE,MAAM,CAAC;GAC1B;;AApGD;;;AAGuB,0BAAY,GAAG,CAAC,CAAC;AAExC;;;;AAIuB,6BAAe,GAAG,EAAE,CAAC;AAE5C;;;AAGuB,2BAAa,GAAG,EAAE,CAAC;AAyF5C;MAEa,iBAAiB,GAAG;EAC/B,GAAG,EAAE,irBAAirB;EACtrB,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,0BAA0B,GAAG;EACxC,GAAG,EAAE,siCAAsiC;EAC3iC,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;EACZ;MAEW,SAAS,GAAG;EACvB,GAAG,EAAE,2oCAA2oC;EAChpC,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,mvBAAmvB;EACxvB,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,EAAE;EACX;MAEW,cAAc,GAAG;EAC5B,GAAG,EAAE,+0BAA+0B;EACp1B,OAAO,EAAE,CAAC,EAAE;EACZ,OAAO,EAAE,CAAC,EAAE;;;;;","names":[],"sources":["./src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 22,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"version":3}
@@ -653,9 +653,9 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
653
653
  this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);
654
654
  await this.getStencilBuffer();
655
655
  this.updateViewport();
656
- this.handleViewerChanged(this.viewer);
657
- this.handleModeChanged();
658
- this.computePropsAndState();
656
+ await this.handleViewerChanged(this.viewer);
657
+ await this.handleModeChanged();
658
+ await this.computePropsAndState();
659
659
  this.model.onIndicatorChanged((pt) => {
660
660
  this.indicatorPt = pt;
661
661
  });
@@ -670,8 +670,8 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
670
670
  /**
671
671
  * @ignore
672
672
  */
673
- componentWillUpdate() {
674
- this.computePropsAndState();
673
+ async componentWillUpdate() {
674
+ await this.computePropsAndState();
675
675
  }
676
676
  /**
677
677
  * @ignore
@@ -693,14 +693,14 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
693
693
  /**
694
694
  * @ignore
695
695
  */
696
- handleViewerChanged(newViewer, oldViewer) {
696
+ async handleViewerChanged(newViewer, oldViewer) {
697
697
  if (oldViewer != null) {
698
698
  oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);
699
- this.removeInteractionListeners(oldViewer);
699
+ await this.removeInteractionListeners(oldViewer);
700
700
  }
701
701
  if (newViewer != null) {
702
702
  newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);
703
- this.addInteractionListeners(newViewer);
703
+ await this.addInteractionListeners(newViewer);
704
704
  }
705
705
  }
706
706
  /**
@@ -718,7 +718,7 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
718
718
  /**
719
719
  * @ignore
720
720
  */
721
- handleModeChanged() {
721
+ async handleModeChanged() {
722
722
  var _a;
723
723
  this.warnIfDepthBuffersDisabled();
724
724
  // If we're not in edit or replace mode, ensure that the measurement
@@ -727,8 +727,8 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
727
727
  (_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
728
728
  }
729
729
  if (this.viewer != null) {
730
- this.removeInteractionListeners(this.viewer);
731
- this.addInteractionListeners(this.viewer);
730
+ await this.removeInteractionListeners(this.viewer);
731
+ await this.addInteractionListeners(this.viewer);
732
732
  }
733
733
  }
734
734
  /**
@@ -749,9 +749,9 @@ const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends
749
749
  handleInvalidChanged() {
750
750
  this.updateInteractionModel();
751
751
  }
752
- computePropsAndState() {
752
+ async computePropsAndState() {
753
753
  this.updateCamera();
754
- this.updateDepthBuffer();
754
+ await this.updateDepthBuffer();
755
755
  this.updateMeasurementPropsFromModel();
756
756
  this.updateOverlays();
757
757
  }