@vertexvis/viewer 1.0.1-canary.8 → 1.0.1-testing.0

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 (122) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/{multiElementInteractionHandler-CV_R_zWs.js → multiElementInteractionHandler-DFzC3VJQ.js} +14 -11
  3. package/dist/cjs/multiElementInteractionHandler-DFzC3VJQ.js.map +1 -0
  4. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +20 -11
  5. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  6. package/dist/cjs/vertex-scene-tree.cjs.entry.js +18 -5
  7. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  8. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  9. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +7 -5
  10. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  11. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +6 -6
  12. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  13. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +5 -5
  14. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  15. package/dist/cjs/vertex-viewer.cjs.entry.js +18 -12
  16. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  17. package/dist/cjs/viewer.cjs.js +1 -1
  18. package/dist/collection/components/scene-tree/scene-tree.js +18 -5
  19. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  20. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +20 -11
  21. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  22. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js +8 -6
  23. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js.map +1 -1
  24. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js +7 -7
  25. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  26. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +6 -7
  27. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
  28. package/dist/collection/lib/interactions/baseInteractionHandler.js +12 -9
  29. package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
  30. package/dist/collection/lib/interactions/mouseInteractions.js +17 -11
  31. package/dist/collection/lib/interactions/mouseInteractions.js.map +1 -1
  32. package/dist/components/index.js +1 -1
  33. package/dist/components/{p-COS1Inc5.js → p-BQV-PVa_.js} +2 -2
  34. package/dist/components/p-BQV-PVa_.js.map +1 -0
  35. package/dist/components/p-CAQf9dsL.js +5 -0
  36. package/dist/components/p-CAQf9dsL.js.map +1 -0
  37. package/dist/components/{p-CEXF82El.js → p-CKQId0I1.js} +2 -2
  38. package/dist/components/p-CKQId0I1.js.map +1 -0
  39. package/dist/components/{p-CEHeeaoZ.js → p-CUGGgEIf.js} +2 -2
  40. package/dist/components/{p-CWieLCfP.js → p-CoCastpC.js} +2 -2
  41. package/dist/components/{p-BNHniQXm.js → p-ae0Zapzr.js} +2 -2
  42. package/dist/components/p-ae0Zapzr.js.map +1 -0
  43. package/dist/components/vertex-scene-tree-table-layout.js +1 -1
  44. package/dist/components/vertex-scene-tree.js +1 -1
  45. package/dist/components/vertex-scene-tree.js.map +1 -1
  46. package/dist/components/vertex-viewer-dom-renderer.js +1 -1
  47. package/dist/components/vertex-viewer-pin-group.js +1 -1
  48. package/dist/components/vertex-viewer-pin-label.js +1 -1
  49. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  50. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  51. package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
  52. package/dist/components/vertex-viewer-view-cube.js +1 -1
  53. package/dist/components/vertex-viewer.js +1 -1
  54. package/dist/components/vertex-viewer.js.map +1 -1
  55. package/dist/esm/{controller-zACO6f4n.js → controller-DCFz4xj6.js} +3 -3
  56. package/dist/esm/{controller-zACO6f4n.js.map → controller-DCFz4xj6.js.map} +1 -1
  57. package/dist/esm/index.js +1 -1
  58. package/dist/esm/index.mjs +1 -1
  59. package/dist/esm/loader.js +1 -1
  60. package/dist/esm/loader.mjs +1 -1
  61. package/dist/esm/{multiElementInteractionHandler-CJhrgviV.js → multiElementInteractionHandler-DjlrKVbu.js} +14 -11
  62. package/dist/esm/multiElementInteractionHandler-DjlrKVbu.js.map +1 -0
  63. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +20 -11
  64. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  65. package/dist/esm/vertex-scene-tree.entry.js +19 -6
  66. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  67. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  68. package/dist/esm/vertex-viewer-pin-group.entry.js +8 -6
  69. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  70. package/dist/esm/vertex-viewer-pin-label_2.entry.js +6 -6
  71. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  72. package/dist/esm/vertex-viewer-transform-widget.entry.js +5 -5
  73. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  74. package/dist/esm/vertex-viewer.entry.js +18 -12
  75. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  76. package/dist/esm/viewer.js +1 -1
  77. package/dist/types/components/scene-tree/scene-tree.d.ts +2 -0
  78. package/dist/types/components/scene-tree-table-layout/scene-tree-table-layout.d.ts +2 -0
  79. package/dist/types/components/viewer-pin-group/viewer-pin-group.d.ts +1 -0
  80. package/dist/types/components/viewer-transform-widget/viewer-transform-widget.d.ts +1 -1
  81. package/dist/types/lib/interactions/baseInteractionHandler.d.ts +1 -1
  82. package/dist/types/lib/interactions/mouseInteractions.d.ts +8 -2
  83. package/dist/viewer/index.esm.js +1 -1
  84. package/dist/viewer/p-07214ba9.entry.js +5 -0
  85. package/dist/viewer/p-07214ba9.entry.js.map +1 -0
  86. package/dist/viewer/p-1a463ace.entry.js +5 -0
  87. package/dist/viewer/p-1a463ace.entry.js.map +1 -0
  88. package/dist/viewer/p-9c18d87a.entry.js +5 -0
  89. package/dist/viewer/p-9c18d87a.entry.js.map +1 -0
  90. package/dist/viewer/{p-D4lmv56q.js → p-Dg5Yw3qK.js} +2 -2
  91. package/dist/viewer/{p-D4lmv56q.js.map → p-Dg5Yw3qK.js.map} +1 -1
  92. package/dist/viewer/{p-DkLznn4v.js → p-DwjktKp5.js} +2 -2
  93. package/dist/viewer/p-DwjktKp5.js.map +1 -0
  94. package/dist/viewer/{p-dcaf1cb9.entry.js → p-b8d8d308.entry.js} +2 -2
  95. package/dist/viewer/p-d26d4b99.entry.js +5 -0
  96. package/dist/viewer/{p-76cf5c2a.entry.js.map → p-d26d4b99.entry.js.map} +1 -1
  97. package/dist/viewer/{p-d4d044fc.entry.js → p-daecf887.entry.js} +2 -2
  98. package/dist/viewer/p-daecf887.entry.js.map +1 -0
  99. package/dist/viewer/{p-0cbadaa8.entry.js → p-fe2fdc83.entry.js} +2 -2
  100. package/dist/viewer/p-fe2fdc83.entry.js.map +1 -0
  101. package/dist/viewer/viewer.esm.js +1 -1
  102. package/package.json +7 -7
  103. package/dist/cjs/multiElementInteractionHandler-CV_R_zWs.js.map +0 -1
  104. package/dist/components/p-BNHniQXm.js.map +0 -1
  105. package/dist/components/p-BzhmEGZ5.js +0 -5
  106. package/dist/components/p-BzhmEGZ5.js.map +0 -1
  107. package/dist/components/p-CEXF82El.js.map +0 -1
  108. package/dist/components/p-COS1Inc5.js.map +0 -1
  109. package/dist/esm/multiElementInteractionHandler-CJhrgviV.js.map +0 -1
  110. package/dist/viewer/p-0cbadaa8.entry.js.map +0 -1
  111. package/dist/viewer/p-19c5eeaf.entry.js +0 -5
  112. package/dist/viewer/p-19c5eeaf.entry.js.map +0 -1
  113. package/dist/viewer/p-1a82245e.entry.js +0 -5
  114. package/dist/viewer/p-1a82245e.entry.js.map +0 -1
  115. package/dist/viewer/p-5ccf054e.entry.js +0 -5
  116. package/dist/viewer/p-5ccf054e.entry.js.map +0 -1
  117. package/dist/viewer/p-76cf5c2a.entry.js +0 -5
  118. package/dist/viewer/p-DkLznn4v.js.map +0 -1
  119. package/dist/viewer/p-d4d044fc.entry.js.map +0 -1
  120. /package/dist/components/{p-CEHeeaoZ.js.map → p-CUGGgEIf.js.map} +0 -0
  121. /package/dist/components/{p-CWieLCfP.js.map → p-CoCastpC.js.map} +0 -0
  122. /package/dist/viewer/{p-dcaf1cb9.entry.js.map → p-b8d8d308.entry.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"names":["getComputedStyle","el","window","viewerPinLabelCss","VertexPinLabel","constructor","hostRef","this","value","focused","textareaRows","computeContentSize","readDOM","contentEl","contentElBounds","getBoundingClientRect","computedStyles","Math","max","ceil","parseFloat","getPropertyValue","handleInputKeyDown","event","stopPropagation","key","ctrlKey","metaKey","shiftKey","preventDefault","submit","handlePointerDown","elementBounds","buttons","relativePointerDownPosition","translatePointToRelative","getMouseClientPosition","pinPointerDownPosition","_a","pin","label","point","addEventListener","handlePointerMove","handlePointerUp","relative","relativeDelta","Point","subtract","myUpdatedPin","add","undefined","pinController","updatePin","computeScreenPosition","getToolMode","pointerDownScreen","translatePointToScreen","distanceBetweenStartAndEndPoint","distance","labelFocused","emit","_b","id","removeEventListener","handleTextBlur","handleTextInput","input","target","setFocus","inputEl","focus","_c","labelBlurred","text","watchFocusChange","labelChanged","setSelectedPinId","watchPinChange","watchElementBoundsChange","componentWillLoad","componentDidLoad","resizeObserver","ResizeObserver","contentResizeObserver","hostEl","observe","PinController","PinModel","disconnectedCallback","disconnect","componentDidRender","render","primaryColor","accentColor","getPinColors","h","Host","class","classNames","onPointerDown","style","top","computedScreenPosition","y","toString","left","x","minWidth","computeMinWidth","maxWidth","computeMaxWidth","maxHeight","computeMaxHeight","borderColor","background","disabled","ref","rows","onKeyDown","onInput","onBlur","hiddenContent","includes","split","reduce","res","str","expected","width","computeRemainingWidth","computeRemainingHeight","height","isTextPin","viewerPinLabelLineCss","VertexPinLabelLine","stroke","x1","labelPoint","y1","x2","pinPoint","y2","_d"],"sources":["src/components/viewer-pin-label/utils.ts","src/components/viewer-pin-label/viewer-pin-label.css?tag=vertex-viewer-pin-label","src/components/viewer-pin-label/viewer-pin-label.tsx","src/components/viewer-pin-label-line/viewer-pin-label-line.css?tag=vertex-viewer-pin-label-line","src/components/viewer-pin-label-line/viewer-pin-label-line.tsx"],"sourcesContent":["export function getComputedStyle(el: HTMLElement): CSSStyleDeclaration {\n return window.getComputedStyle(el);\n}\n",":host {\n /**\n * @prop --viewer-annotations-pin-label-background-color: A CSS color that\n * specifies the color of the label background\n */\n --viewer-annotations-pin-label-background-color: var(--viewer-annotations-pin-accent-color);\n\n /**\n * @prop --viewer-annotations-pin-label-border-color: A CSS color that\n * specifies the color of the label's border\n */\n --viewer-annotations-pin-label-border-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-label-focused-border-color: A CSS color that\n * specifies the color of the label's border when focused. \n */\n --viewer-annotations-pin-label-focused-border-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-label-color: A CSS color that\n * specifies the color of the label \n */\n --viewer-annotations-pin-label-color: var(--white);\n\n /**\n * @prop --viewer-annotations-pin-label-padding-y: A var that\n * specifies the vertical padding of the label\n */\n --viewer-annotations-pin-label-padding-y: 0.375em;\n\n /**\n * @prop --viewer-annotations-pin-label-padding-x: A var that\n * specifies the horizontal padding of the label\n */\n --viewer-annotations-pin-label-padding-x: 0.5em;\n\n /**\n * @prop --viewer-annotations-pin-label-border-width: A CSS length that\n * specifies the width of the border on this label. Defaults to `2px`.\n */\n --viewer-annotations-pin-label-border-width: 2px;\n\n /**\n * @prop --viewer-annotations-pin-label-border-style: A CSS variable that\n * specifies the style of border on this label. Defaults to `solid`.\n */\n --viewer-annotations-pin-label-border-style: solid;\n\n /**\n * @prop --viewer-annotations-pin-label-border-radius: A var that\n * specifies the border radius of the label\n */\n --viewer-annotations-pin-label-border-radius: 0.25em;\n\n /**\n * @prop --viewer-annotations-pin-label-min-width: A CSS length that\n * specifies the minimum width of the label. Defaults to `2rem`.\n */\n --viewer-annotations-pin-label-min-width: 2rem;\n\n /**\n * @prop --viewer-annotations-pin-label-max-width: A CSS length that\n * specifies the maximum width of the label. Defaults to `25rem`.\n */\n --viewer-annotations-pin-label-max-width: 25rem;\n\n /**\n * @prop --viewer-annotations-pin-label-max-height: A CSS length that\n * specifies the maximum height of the label. Defaults to `50rem`.\n */\n --viewer-annotations-pin-label-max-height: 50rem;\n\n overflow: hidden;\n pointer-events: none;\n}\n\n:host([mode='']) .pin-label {\n color: var(--viewer-annotations-pin-label-color);\n background: var(--viewer-annotations-pin-label-background-color);\n}\n\n.pin-label-text {\n font-family: Arial, Helvetica, sans-serif;\n font-size: 0.875rem;\n line-height: 1rem;\n word-break: break-word;\n white-space: pre-wrap;\n}\n\n.pin-label-input-wrapper {\n display: flex;\n position: absolute;\n pointer-events: auto;\n box-sizing: border-box;\n min-width: var(--viewer-annotations-pin-label-min-width);\n max-width: var(--viewer-annotations-pin-label-max-width);\n max-height: var(--viewer-annotations-pin-label-max-height);\n background: var(--viewer-annotations-pin-label-background-color);\n border-width: var(--viewer-annotations-pin-label-border-width);\n border-style: var(--viewer-annotations-pin-label-border-style);\n border-color: var(--viewer-annotations-pin-label-border-color);\n border-radius: var(--viewer-annotations-pin-label-border-radius);\n}\n\n.pin-label-input-wrapper.focused {\n min-width: var(--viewer-annotations-pin-label-max-width);\n border-color: var(--viewer-annotations-pin-label-focused-border-color);\n}\n\n.pin-input-drag-target {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n cursor: pointer;\n}\n\n.pin-label-input {\n resize: none;\n position: relative;\n outline: none;\n border: none;\n word-break: break-word;\n padding: 0 0 0 0;\n background-color: transparent;\n margin: var(--viewer-annotations-pin-label-padding-y) var(--viewer-annotations-pin-label-padding-x);\n width: var(--viewer-annotations-pin-label-min-width);\n flex-grow: 1;\n overflow: hidden;\n max-width: calc(var(--viewer-annotations-pin-label-max-width) - calc(2 * var(--viewer-annotations-pin-label-padding-x)));\n}\n\n.pin-label-input.readonly {\n pointer-events: auto;\n color: black;\n cursor: pointer;\n}\n\n.pin-label-hidden {\n position: absolute;\n visibility: hidden;\n pointer-events: none;\n width: auto;\n height: auto;\n box-sizing: border-box;\n border-width: var(--viewer-annotations-pin-label-border-width);\n border-style: var(--viewer-annotations-pin-label-border-style);\n border-color: var(--viewer-annotations-pin-label-border-color);\n margin: var(--viewer-annotations-pin-label-padding-y) 0;\n padding: 0 var(--viewer-annotations-pin-label-padding-x);\n max-width: calc(var(--viewer-annotations-pin-label-max-width) - calc(2 * var(--viewer-annotations-pin-label-padding-x)));\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n JSX,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport classNames from 'classnames';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport { PinController } from '../../lib/pins/controller';\nimport {\n getPinColors,\n isTextPin,\n PinModel,\n TextPin,\n} from '../../lib/pins/model';\nimport { readDOM } from '../../lib/stencil';\nimport {\n translatePointToRelative,\n translatePointToScreen,\n} from '../viewer-pin-tool/utils';\nimport { getComputedStyle } from './utils';\n\n@Component({\n tag: 'vertex-viewer-pin-label',\n styleUrl: 'viewer-pin-label.css',\n shadow: false,\n})\nexport class VertexPinLabel {\n /**\n * The pin to draw for the group\n */\n @Prop()\n public pin?: TextPin;\n\n /**\n * The dimensions of the canvas for the pins\n */\n @Prop()\n public elementBounds?: DOMRect;\n\n /**\n * The current text value of the component. Value is updated on user\n * interaction.\n */\n @Prop({ mutable: true })\n public value = '';\n\n /**\n * The controller that drives behavior for pin operations\n */\n @Prop()\n public pinController?: PinController;\n\n /**\n * @internal\n */\n @Event({ bubbles: true })\n public labelChanged!: EventEmitter<void>;\n\n /**\n * Emitted whenever the label is focused, with the ID of the\n * associated pin (or undefined if no pin is provided).\n */\n @Event({ bubbles: true })\n public labelFocused!: EventEmitter<string | undefined>;\n\n /**\n * Emitted whenever the label is blurred, with the ID of the\n * associated pin (or undefined if no pin is provided).\n */\n @Event({ bubbles: true })\n public labelBlurred!: EventEmitter<string | undefined>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private focused = false;\n\n @State()\n private computedScreenPosition?: Point.Point;\n\n @State()\n private textareaRows = 1;\n\n @State()\n private contentElBounds?: DOMRect;\n\n private relativePointerDownPosition?: Point.Point;\n private pinPointerDownPosition?: Point.Point;\n\n private inputEl?: HTMLTextAreaElement;\n private contentEl?: HTMLDivElement;\n\n private resizeObserver?: ResizeObserver;\n private contentResizeObserver?: ResizeObserver;\n\n /**\n * Gives focus to the component's internal text input.\n */\n @Method()\n public async setFocus(): Promise<void> {\n // HTMLInputElement.focus() doesn't exist in tests.\n if (typeof this.inputEl?.focus === 'function') {\n this.focused = true;\n this.labelFocused.emit(this.pin?.id);\n this.inputEl?.focus();\n }\n }\n\n /**\n * @internal\n * submits the current text, unfocuses the input and emits the blur event to consumers\n */\n @Method()\n public async submit(): Promise<void> {\n this.focused = false;\n this.labelBlurred.emit(this.pin?.id);\n if (this.pin != null) {\n this.pinController?.updatePin({\n ...this.pin,\n label: {\n point: this.pin.label.point,\n text: this.value,\n },\n });\n }\n }\n\n @Watch('focused')\n protected watchFocusChange(): void {\n this.labelChanged.emit();\n\n if (this.focused) {\n this.pinController?.setSelectedPinId(this.pin?.id);\n }\n }\n\n @Watch('pin')\n protected watchPinChange(): void {\n this.value = this.pin?.label.text ?? '';\n this.computeScreenPosition();\n }\n\n @Watch('elementBounds')\n protected watchElementBoundsChange(): void {\n this.computeScreenPosition();\n }\n\n protected componentWillLoad(): void {\n this.value = this.pin?.label.text ?? '';\n this.computeScreenPosition();\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => {\n this.labelChanged.emit();\n });\n\n this.contentResizeObserver = new ResizeObserver(this.computeContentSize);\n\n if (this.hostEl != null) {\n this.resizeObserver.observe(this.hostEl);\n }\n\n if (this.contentEl != null) {\n this.contentResizeObserver.observe(this.contentEl);\n }\n\n if (this.pinController == null) {\n this.pinController = new PinController(new PinModel());\n }\n }\n\n protected disconnectedCallback(): void {\n this.resizeObserver?.disconnect();\n this.contentResizeObserver?.disconnect();\n }\n\n protected componentDidRender(): void {\n if (this.focused && this.inputEl != null) {\n this.setFocus();\n }\n }\n\n protected render(): JSX.Element {\n const { primaryColor, accentColor } = getPinColors(this.pin);\n return (\n <Host>\n <div\n class={classNames('pin-label-input-wrapper', {\n focused: this.focused,\n })}\n onPointerDown={this.handlePointerDown}\n style={{\n top: `${this.computedScreenPosition?.y.toString() || 0}px`,\n left: `${this.computedScreenPosition?.x.toString() || 0}px`,\n minWidth: this.computeMinWidth(),\n maxWidth: this.computeMaxWidth(),\n maxHeight: this.computeMaxHeight(),\n borderColor: primaryColor,\n background: accentColor,\n }}\n >\n <textarea\n id={`pin-label-input-${this.pin?.id}`}\n class={classNames('pin-label-input', 'pin-label-text', {\n ['readonly']: !this.focused,\n })}\n disabled={!this.focused}\n ref={(ref) => (this.inputEl = ref)}\n value={this.value}\n rows={this.textareaRows}\n onKeyDown={this.handleInputKeyDown}\n onInput={this.handleTextInput}\n onBlur={this.handleTextBlur}\n />\n {/* This corrects for a behavior in Firefox where setting the `disabled` attribute to true */}\n {/* prevents any events from propagating. */}\n {!this.focused && (\n <div\n class=\"pin-input-drag-target\"\n onPointerDown={this.handlePointerDown}\n />\n )}\n </div>\n <div\n ref={(el) => (this.contentEl = el)}\n class={classNames('pin-label-text', 'pin-label-hidden')}\n style={{\n maxWidth: this.computeMaxWidth(),\n maxHeight: this.computeMaxHeight(),\n }}\n >\n {this.hiddenContent()}\n </div>\n </Host>\n );\n }\n\n private hiddenContent(): Array<string | HTMLBRElement> {\n // This corrects some inconsistencies in how a newline character\n // is represented in a div. Leveraging `<br>`s results in a more\n // consistent representation of the newlines in a textarea.\n return this.value.includes('\\n')\n ? this.value\n .split('\\n')\n .reduce(\n (res, str) => [...res, str, <br />],\n [] as Array<string | HTMLBRElement>\n )\n : [this.value];\n }\n\n private computeMinWidth(): string {\n if (this.contentElBounds != null) {\n const expected = `${this.contentElBounds.width + 8}px`;\n\n return `min(${expected}, ${this.computeMaxWidth()})`;\n } else {\n return `var(--viewer-annotations-pin-label-min-width)`;\n }\n }\n\n private computeMaxWidth(): string {\n const expected = `var(--viewer-annotations-pin-label-max-width)`;\n\n return `min(${expected}, ${this.computeRemainingWidth()})`;\n }\n\n private computeMaxHeight(): string {\n const expected = `var(--viewer-annotations-pin-label-max-height)`;\n\n return `min(${expected}, ${this.computeRemainingHeight()})`;\n }\n\n private computeRemainingWidth(): string {\n return `calc(${this.elementBounds?.width.toString() || 0}px - ${\n this.computedScreenPosition?.x.toString() || 0\n }px)`;\n }\n\n private computeRemainingHeight(): string {\n return `calc(${this.elementBounds?.height.toString() || 0}px - ${\n this.computedScreenPosition?.y.toString() || 0\n }px)`;\n }\n\n private computeScreenPosition(): void {\n this.computedScreenPosition =\n isTextPin(this.pin) &&\n this.elementBounds != null &&\n this.pin.label.point != null\n ? translatePointToScreen(this.pin.label.point, this.elementBounds)\n : undefined;\n }\n\n private computeContentSize = (): void => {\n readDOM(() => {\n if (this.contentEl != null) {\n this.contentElBounds = this.contentEl.getBoundingClientRect();\n const computedStyles = getComputedStyle(this.contentEl);\n this.textareaRows = Math.max(\n 1,\n Math.ceil(\n (parseFloat(computedStyles.getPropertyValue('height')) -\n parseFloat(computedStyles.getPropertyValue('borderWidth')) * 2) /\n parseFloat(computedStyles.getPropertyValue('lineHeight'))\n )\n );\n }\n });\n };\n\n private handleInputKeyDown = (event: KeyboardEvent): void => {\n event.stopPropagation();\n if (\n event.key === 'Enter' &&\n (event.ctrlKey || event.metaKey || event.shiftKey)\n ) {\n this.textareaRows += 1;\n this.value += '\\n';\n } else if (event.key === 'Enter') {\n event.preventDefault();\n this.submit();\n }\n };\n\n private handlePointerDown = (event: PointerEvent): void => {\n if (!this.focused) {\n if (this.elementBounds != null) {\n if (event.buttons !== 2) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.relativePointerDownPosition = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds\n );\n this.pinPointerDownPosition = this.pin?.label.point;\n\n window.addEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n }\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n if (\n this.elementBounds != null &&\n this.relativePointerDownPosition &&\n this.pinPointerDownPosition != null\n ) {\n // Prevent selection of any text while interacting with the label\n event.preventDefault();\n event.stopPropagation();\n\n const point = getMouseClientPosition(event, this.elementBounds);\n const relative = translatePointToRelative(point, this.elementBounds);\n\n const relativeDelta = Point.subtract(\n relative,\n this.relativePointerDownPosition\n );\n\n const myUpdatedPin =\n this.pin != null\n ? {\n ...this.pin,\n label: {\n ...this.pin.label,\n point: Point.add(this.pinPointerDownPosition, relativeDelta),\n },\n }\n : undefined;\n\n if (myUpdatedPin) {\n this.pinController?.updatePin(myUpdatedPin);\n this.computeScreenPosition();\n }\n }\n };\n\n private handlePointerUp = (event: PointerEvent): void => {\n if (\n this.pinController?.getToolMode() === 'edit' &&\n this.relativePointerDownPosition != null &&\n this.elementBounds != null\n ) {\n const pointerDownScreen = translatePointToScreen(\n this.relativePointerDownPosition,\n this.elementBounds\n );\n const distanceBetweenStartAndEndPoint = Point.distance(\n pointerDownScreen,\n getMouseClientPosition(event, this.elementBounds)\n );\n\n if (distanceBetweenStartAndEndPoint <= 2) {\n this.focused = true;\n this.labelFocused.emit(this.pin?.id);\n }\n }\n\n this.relativePointerDownPosition = undefined;\n this.pinPointerDownPosition = undefined;\n\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.removeEventListener('pointerup', this.handlePointerUp);\n };\n\n private handleTextBlur = (): void => {\n this.submit();\n };\n\n private handleTextInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n };\n}\n","\n:host {\n /**\n * @prop --viewer-annotations-pin-label-line-color: A CSS color that\n * specifies the color of the label line\n */\n --viewer-annotations-pin-label-line-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-label-line-width: A CSS color that\n * specifies the width of the label line\n */\n --viewer-annotations-pin-label-line-width: 1;\n\n overflow: hidden;\n pointer-events: none;\n}\n\n.label-line {\n pointer-events: auto;\n stroke: var(--viewer-annotations-pin-label-line-color);\n stroke-width: var( --viewer-annotations-pin-label-line-width);\n cursor: default;\n}\n\n.svg {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n pointer-events: none;\n height: 100%;\n width: 100%;\n}\n","import {\n Component,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n JSX,\n Prop,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nimport { getPinColors, Pin } from '../../lib/pins/model';\n\n@Component({\n tag: 'vertex-viewer-pin-label-line',\n styleUrl: 'viewer-pin-label-line.css',\n shadow: false,\n})\nexport class VertexPinLabelLine {\n @Prop()\n public pinPoint: Point.Point | undefined;\n\n @Prop()\n public labelPoint: Point.Point | undefined;\n\n @Prop()\n public pin: Pin | undefined;\n\n protected render(): JSX.Element {\n const { primaryColor } = getPinColors(this.pin);\n return (\n <Host>\n <svg class=\"svg\">\n <line\n class=\"label-line\"\n style={{\n stroke: primaryColor,\n }}\n x1={this.labelPoint?.x}\n y1={this.labelPoint?.y}\n x2={this.pinPoint?.x}\n y2={this.pinPoint?.y}\n />\n </svg>\n </Host>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
- */
4
- import{h as i,F as t,r as e}from"./p-CCVkga9Q.js";import{p as n,m as o,v as s}from"./p-DfdVaPrt.js";import"./p-D4lmv56q.js";import"./p-C-9RlwtF.js";import"./p-Cmw9UEdq.js";import"./p-BNuMPeJ8.js";import"./p-ux1ckSDN.js";import"./p-BYfDquz2.js";import"./p-Bl7Tdbc9.js";import"./p-ujnhJ1UM.js";import"./p-BAhfr1Nx.js";import{V as r}from"./p-Dn7vK758.js";import{g as a,i as l,b as d,P as p,a as h,c}from"./p-ND6l6nAr.js";import{c as v}from"./p-Dw4-tG-V.js";import"./p--8q6LyIm.js";import"./p-BuOEMGyM.js";import"./p-CG9AChtV.js";import"./p-CiSHWNC4.js";const u=({pin:e,selected:n,occluded:o,detached:s})=>{const{primaryColor:r}=a(e);return i(t,null,d(e)&&i("div",{id:"pin-anchor",class:v("pin-anchor",{selected:n,"pin-occluded":o,"pin-detached":s}),style:{background:r}}),l(e)&&i("vertex-viewer-icon",{name:"pin-fill",size:"lg",class:v("pin",{"pin-selected":n,"pin-occluded":o,"pin-detached":s}),style:{color:r}}))};function b(i,t,e){const o={x:i.x+e.width/2,y:i.y};const s={x:i.x+e.width/2,y:i.y+e.height};const r={x:i.x+e.width,y:i.y+e.height/2};const a={x:i.x,y:i.y+e.height/2};const l=[o,s,a,r];const d=l.map((i=>n.distance(i,t)));const p=d.indexOf(Math.min(...d));return l[p]}const f=()=>`:host{--viewer-annotations-pin-primary-color:var(--blue-700);--viewer-annotations-pin-accent-color:var(--blue-200);--viewer-annotations-pin-dot-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-font-size:0.75rem;--viewer-annotations-pin-selected-stroke:var(--white);--viewer-annotations-pin-selected-border:2px solid var(--white);--viewer-annotations-pin-label-border:2px solid var(--black);--viewer-annotations-pin-selected-stroke:var(--white);font-size:var(--viewer-annotations-pin-font-size);position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none}.pin-anchor{position:absolute;border-radius:50%;transform:translate(-50%, -50%);display:block;width:9px;height:9px;box-sizing:border-box;border:var(--viewer-annotations-pin-label-border);background:var(--viewer-annotations-pin-dot-color);pointer-events:auto;cursor:pointer}.selected{width:13px;height:13px;border:var(--viewer-annotations-pin-selected-border)}.pin{color:var(--viewer-annotations-pin-color);cursor:pointer;transition:opacity 0.3s ease-in;transform:translate(0px, -12px)}.pin-selected{stroke-width:1;stroke:var(--viewer-annotations-pin-selected-stroke)}.pin-occluded{opacity:.3;transition:opacity 0.3s ease-in}.pin-detached{visibility:hidden}`;const w=class{constructor(i){e(this,i);this.matrix=o.makeIdentity();this.projectionViewMatrix=o.makeIdentity();this.pinModel=new p;this.selected=false;this.occluded=false;this.detached=false;this.invalidateStateCounter=0;this.invalidateState=()=>{this.invalidateStateCounter=this.invalidateStateCounter+1}}componentDidLoad(){var i;this.setLabelObserver();if(this.pinController==null){this.pinController=new h(this.pinModel)}if(this.selected){(i=this.labelEl)===null||i===void 0?void 0:i.setFocus()}}async handleOcclusionStateChanged(i){this.occluded=i.detail}async handleDetachedStateChanged(i){this.detached=i.detail}disconnectedCallback(){var i,t;(i=this.labelEl)===null||i===void 0?void 0:i.removeEventListener("labelChanged",this.invalidateState);(t=this.resizeObserver)===null||t===void 0?void 0:t.disconnect()}render(){var e;if(this.pin==null){throw new Error("Unable to draw pin")}const{pinPoint:n,labelPoint:o}=this.computePinPoints(this.pin);return i(t,{key:"b26f95c0e4b86b263eca80c5db8576ef1c787b26"},i("vertex-viewer-dom-element",{key:"9fcb9d0f55f9abb3397db4051ed59c7a05d4ae6a","data-testid":`drawn-pin-${this.pin.id}`,position:this.pin.worldPosition,onPointerDown:async()=>{var i;await((i=this.labelEl)===null||i===void 0?void 0:i.submit());this.selectPin();this.handleAnchorPointerDown()},detachedOff:false},i(u,{key:"2264652f4c83539f47af324f6937fb6581edafe1",pin:this.pin,selected:this.selected,occluded:this.occluded,detached:this.detached})),d(this.pin)&&!this.occluded&&!this.detached&&i(t,{key:"04c86f573b99fb320b0a651dc903131e6654bd9e"},i("vertex-viewer-pin-label-line",{key:"cec6ee8195fba5fadd9e1b272abd61b6b6dd05c6",id:`pin-label-line-${(e=this.pin)===null||e===void 0?void 0:e.id}`,pinPoint:n,pin:this.pin,labelPoint:o,onPointerDown:()=>this.selectPin()}),i("vertex-viewer-pin-label",{key:"556a36ac8e9046b0e40c6973c1ecf47319f28ab6",pin:this.pin,ref:i=>this.labelEl=i,elementBounds:this.elementBounds,pinController:this.pinController,onPointerDown:()=>this.selectPin()})))}setLabelObserver(){if(this.labelEl!=null){this.labelEl.addEventListener("labelChanged",this.invalidateState);this.resizeObserver=new ResizeObserver((()=>this.invalidateState()));this.resizeObserver.observe(this.labelEl)}}computePinPoints(i){if(this.elementBounds!=null&&this.pin!=null){return d(this.pin)&&this.pin.label.point!=null?this.computeTextPinPoints(this.pin,this.elementBounds):this.computeDefaultPinPoints(this.pin,this.elementBounds)}return{pinPoint:i.worldPosition}}computeDefaultPinPoints(i,t){return{pinPoint:this.getFromWorldPosition(i.worldPosition,this.projectionViewMatrix,t)}}computeTextPinPoints(i,t){var e,n,o,s;const{pinPoint:r}=this.computeDefaultPinPoints(i,t);const a=c(i.label.point,t);const l=((n=(e=this.labelEl)===null||e===void 0?void 0:e.firstElementChild)===null||n===void 0?void 0:n.clientWidth)||0;const d=((s=(o=this.labelEl)===null||o===void 0?void 0:o.firstElementChild)===null||s===void 0?void 0:s.clientHeight)||0;return{pinPoint:r,labelPoint:b(a,r,{width:l,height:d})}}handleAnchorPointerDown(){var i,t;if(this.elementBounds!=null&&((i=this.pinController)===null||i===void 0?void 0:i.getToolMode())==="edit"&&this.pin!=null){(t=this.pinController)===null||t===void 0?void 0:t.setDraggable({id:this.pin.id})}}selectPin(){var i,t;(i=this.pinController)===null||i===void 0?void 0:i.setSelectedPinId((t=this.pin)===null||t===void 0?void 0:t.id)}getFromWorldPosition(i,t,e){const n=s.transformMatrix(i,t);return r.fromDimensions(e).transformVectorToViewport(n)}};w.style=f();export{w as vertex_viewer_pin_group};
5
- //# sourceMappingURL=p-1a82245e.entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["PinRenderer","pin","selected","occluded","detached","primaryColor","getPinColors","h","Fragment","isTextPin","id","class","classNames","style","background","isIconPin","name","size","color","getClosestCenterToPoint","boxPoint","pointToMeasure","dimensions","topPoint","x","width","y","bottomPoint","height","rightPoint","leftPoint","candidates","distances","map","candidate","Point","distance","candidateIndex","indexOf","Math","min","viewerPinGroupCss","ViewerPinGroup","constructor","hostRef","this","matrix","Matrix4","makeIdentity","projectionViewMatrix","pinModel","PinModel","invalidateStateCounter","invalidateState","componentDidLoad","setLabelObserver","pinController","PinController","_a","labelEl","setFocus","handleOcclusionStateChanged","event","detail","handleDetachedStateChanged","disconnectedCallback","removeEventListener","_b","resizeObserver","disconnect","render","Error","pinPoint","labelPoint","computePinPoints","key","position","worldPosition","onPointerDown","async","submit","selectPin","handleAnchorPointerDown","detachedOff","ref","el","elementBounds","addEventListener","ResizeObserver","observe","label","point","computeTextPinPoints","computeDefaultPinPoints","getFromWorldPosition","screenPosition","translatePointToScreen","labelWidth","firstElementChild","clientWidth","labelHeight","_d","_c","clientHeight","getToolMode","setDraggable","setSelectedPinId","pt","ndcPt","Vector3","transformMatrix","Viewport","fromDimensions","transformVectorToViewport"],"sources":["src/components/viewer-pin-group/pin-renderer.tsx","src/components/viewer-pin-group/utils.ts","src/components/viewer-pin-group/viewer-pin-group.css?tag=vertex-viewer-pin-group","src/components/viewer-pin-group/viewer-pin-group.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Fragment, FunctionalComponent, h } from '@stencil/core';\nimport classNames from 'classnames';\n\nimport { getPinColors, isIconPin, isTextPin, Pin } from '../../lib/pins/model';\n\ninterface PinRendererProps {\n pin?: Pin;\n selected: boolean;\n occluded: boolean;\n detached: boolean;\n}\n\nexport const PinRenderer: FunctionalComponent<PinRendererProps> = ({\n pin,\n selected,\n occluded,\n detached,\n}) => {\n const { primaryColor } = getPinColors(pin);\n\n return (\n <Fragment>\n {isTextPin(pin) && (\n <div\n id=\"pin-anchor\"\n class={classNames('pin-anchor', {\n selected: selected,\n 'pin-occluded': occluded,\n 'pin-detached': detached,\n })}\n style={{\n background: primaryColor,\n }}\n ></div>\n )}\n\n {isIconPin(pin) && (\n <vertex-viewer-icon\n name=\"pin-fill\"\n size=\"lg\"\n class={classNames('pin', {\n 'pin-selected': selected,\n 'pin-occluded': occluded,\n 'pin-detached': detached,\n })}\n style={{\n color: primaryColor,\n }}\n />\n )}\n </Fragment>\n );\n};\n","import { Dimensions, Point } from '@vertexvis/geometry';\n\nexport function getClosestCenterToPoint(\n boxPoint: Point.Point,\n pointToMeasure: Point.Point,\n dimensions: Dimensions.Dimensions\n): Point.Point {\n const topPoint = {\n x: boxPoint.x + dimensions.width / 2,\n y: boxPoint.y,\n };\n\n const bottomPoint = {\n x: boxPoint.x + dimensions.width / 2,\n y: boxPoint.y + dimensions.height,\n };\n\n const rightPoint = {\n x: boxPoint.x + dimensions.width,\n y: boxPoint.y + dimensions.height / 2,\n };\n\n const leftPoint = {\n x: boxPoint.x,\n y: boxPoint.y + dimensions.height / 2,\n };\n\n const candidates = [topPoint, bottomPoint, leftPoint, rightPoint];\n\n const distances = candidates.map((candidate) =>\n Point.distance(candidate, pointToMeasure)\n );\n\n const candidateIndex = distances.indexOf(Math.min(...distances));\n return candidates[candidateIndex];\n}\n",":host {\n\n /**\n * @prop --viewer-annotations-pin-primary-color: A CSS color that\n * specifies the primary color for the pins. This value gets used for the dot color \n * and borders\n */\n --viewer-annotations-pin-primary-color: var(--blue-700);\n\n /**\n * @prop --viewer-annotations-pin-accent-color: A CSS color that\n * specifies the accent color for the pins. This value gets used for background colors\n * \n */\n\n --viewer-annotations-pin-accent-color: var(--blue-200);\n /**\n * @prop viewer-annotations-pin-dot-color: A CSS color that\n * specifies the color of the anchor dot\n */\n --viewer-annotations-pin-dot-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-color: A CSS color that\n * specifies the color of the pin\n */\n --viewer-annotations-pin-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-font-size: A CSS property to specify\n the font size of the pin\n */\n --viewer-annotations-pin-font-size: 0.75rem;\n\n /**\n * @prop --viewer-annotations-pin-selected-stroke: A CSS color that\n * specifies the stroke color of a selected pin\n */\n --viewer-annotations-pin-selected-stroke: var(--white);\n\n /**\n * @prop --viewer-annotations-pin-selected-border: A CSS color that\n * specifies the border of a selected pin\n */\n --viewer-annotations-pin-selected-border: 2px solid var(--white);\n\n /**\n * @prop --viewer-annotations-pin-label-border: A CSS color that\n * specifies the border of a text pin anchor\n */\n --viewer-annotations-pin-label-border: 2px solid var(--black);\n\n /**\n * @prop --viewer-annotations-pin-selected-border: A CSS color that\n * specifies the stroke of a selected default pin\n */\n --viewer-annotations-pin-selected-stroke: var(--white);\n\n font-size: var(--viewer-annotations-pin-font-size);\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.pin-anchor {\n position: absolute;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n display: block;\n width: 9px;\n height: 9px;\n box-sizing: border-box;\n border: var(--viewer-annotations-pin-label-border);\n background: var(--viewer-annotations-pin-dot-color);\n pointer-events: auto;\n cursor: pointer;\n}\n\n.selected {\n width: 13px;\n height: 13px;\n border: var(--viewer-annotations-pin-selected-border)\n}\n\n.pin {\n color: var(--viewer-annotations-pin-color);\n cursor: pointer;\n transition: opacity 0.3s ease-in;\n\n /**\n * Place bottom point of the pin at the location instead of the middle of the pin\n */\n transform: translate(0px, -12px);\n}\n\n.pin-selected {\n stroke-width: 1;\n stroke: var(--viewer-annotations-pin-selected-stroke);\n}\n\n.pin-occluded {\n opacity: .3;\n transition: opacity 0.3s ease-in;\n}\n\n.pin-detached {\n visibility: hidden;\n}","import {\n Component,\n Fragment,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n JSX,\n Listen,\n Prop,\n State,\n} from '@stencil/core';\nimport { Dimensions, Matrix4, Point, Vector3 } from '@vertexvis/geometry';\n\nimport { Viewport } from '../..';\nimport { PinController } from '../../lib/pins/controller';\nimport { isTextPin, Pin, TextPin } from '../../lib/pins/model';\nimport { PinModel } from '../../lib/pins/model';\nimport { translatePointToScreen } from '../viewer-pin-tool/utils';\nimport { PinRenderer } from './pin-renderer';\nimport { getClosestCenterToPoint } from './utils';\n\ninterface ComputedPoints {\n pinPoint: Point.Point;\n labelPoint?: Point.Point;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-group',\n styleUrl: 'viewer-pin-group.css',\n shadow: false,\n})\nexport class ViewerPinGroup {\n /**\n * The pin to draw for the group\n */\n @Prop()\n public pin?: Pin;\n\n /**\n * The local matrix of this element.\n */\n @Prop({ mutable: true, attribute: null })\n public matrix: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n /**\n * Projection view matrix used for computing the position of the pin line\n */\n @Prop()\n public projectionViewMatrix: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n /**\n * The dimensions of the canvas for the pins\n */\n @Prop({ mutable: true })\n public elementBounds?: DOMRect;\n\n /**\n * The model that contains the entities and outcomes from performing pin operations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The controller that drives behavior for pin operations\n */\n @Prop()\n public pinController?: PinController;\n\n /**\n * Whether the pin is \"selected\"\n */\n @Prop()\n public selected = false;\n\n /**\n * @internal\n * Whether the pin is occluded\n */\n @Prop({ mutable: true, reflect: true })\n public occluded = false;\n\n /**\n * @internal\n * Whether the pin is detached\n */\n @Prop({ mutable: true, reflect: true })\n public detached = false;\n\n @State()\n private invalidateStateCounter = 0;\n\n private labelEl: HTMLVertexViewerPinLabelElement | undefined;\n\n private resizeObserver?: ResizeObserver;\n\n protected componentDidLoad(): void {\n this.setLabelObserver();\n\n if (this.pinController == null) {\n this.pinController = new PinController(this.pinModel);\n }\n\n if (this.selected) {\n this.labelEl?.setFocus();\n }\n }\n\n /**\n * @ignore\n */\n @Listen('occlusionStateChanged')\n protected async handleOcclusionStateChanged(\n event: CustomEvent<boolean>\n ): Promise<void> {\n this.occluded = event.detail;\n }\n\n /**\n * @ignore\n */\n @Listen('detachedStateChanged')\n protected async handleDetachedStateChanged(\n event: CustomEvent<boolean>\n ): Promise<void> {\n this.detached = event.detail;\n }\n\n protected disconnectedCallback(): void {\n this.labelEl?.removeEventListener('labelChanged', this.invalidateState);\n this.resizeObserver?.disconnect();\n }\n\n protected render(): JSX.Element {\n if (this.pin == null) {\n throw new Error('Unable to draw pin');\n }\n\n const { pinPoint, labelPoint } = this.computePinPoints(this.pin);\n\n return (\n <Fragment>\n <vertex-viewer-dom-element\n data-testid={`drawn-pin-${this.pin.id}`}\n position={this.pin.worldPosition}\n onPointerDown={async () => {\n await this.labelEl?.submit();\n this.selectPin();\n this.handleAnchorPointerDown();\n }}\n detachedOff={false}\n >\n <PinRenderer\n pin={this.pin}\n selected={this.selected}\n occluded={this.occluded}\n detached={this.detached}\n />\n </vertex-viewer-dom-element>\n\n {isTextPin(this.pin) && !this.occluded && !this.detached && (\n <Fragment>\n <vertex-viewer-pin-label-line\n id={`pin-label-line-${this.pin?.id}`}\n pinPoint={pinPoint}\n pin={this.pin}\n labelPoint={labelPoint}\n onPointerDown={() => this.selectPin()}\n ></vertex-viewer-pin-label-line>\n\n <vertex-viewer-pin-label\n pin={this.pin}\n ref={(el) => (this.labelEl = el)}\n elementBounds={this.elementBounds}\n pinController={this.pinController}\n onPointerDown={() => this.selectPin()}\n ></vertex-viewer-pin-label>\n </Fragment>\n )}\n </Fragment>\n );\n }\n\n private invalidateState = (): void => {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n };\n\n private setLabelObserver(): void {\n if (this.labelEl != null) {\n this.labelEl.addEventListener('labelChanged', this.invalidateState);\n\n this.resizeObserver = new ResizeObserver(() => this.invalidateState());\n this.resizeObserver.observe(this.labelEl);\n }\n }\n\n private computePinPoints(pin: Pin): ComputedPoints {\n if (this.elementBounds != null && this.pin != null) {\n return isTextPin(this.pin) && this.pin.label.point != null\n ? this.computeTextPinPoints(this.pin, this.elementBounds)\n : this.computeDefaultPinPoints(this.pin, this.elementBounds);\n }\n\n return { pinPoint: pin.worldPosition };\n }\n\n private computeDefaultPinPoints(\n pin: Pin,\n elementBounds: DOMRect\n ): ComputedPoints {\n return {\n pinPoint: this.getFromWorldPosition(\n pin.worldPosition,\n this.projectionViewMatrix,\n elementBounds\n ),\n };\n }\n\n private computeTextPinPoints(\n pin: TextPin,\n elementBounds: DOMRect\n ): ComputedPoints {\n const { pinPoint } = this.computeDefaultPinPoints(pin, elementBounds);\n\n const screenPosition = translatePointToScreen(\n pin.label.point,\n elementBounds\n );\n\n const labelWidth = this.labelEl?.firstElementChild?.clientWidth || 0;\n const labelHeight = this.labelEl?.firstElementChild?.clientHeight || 0;\n\n return {\n pinPoint,\n labelPoint: getClosestCenterToPoint(screenPosition, pinPoint, {\n width: labelWidth,\n height: labelHeight,\n }),\n };\n }\n\n private handleAnchorPointerDown(): void {\n if (\n this.elementBounds != null &&\n this.pinController?.getToolMode() === 'edit' &&\n this.pin != null\n ) {\n this.pinController?.setDraggable({ id: this.pin.id });\n }\n }\n\n private selectPin(): void {\n this.pinController?.setSelectedPinId(this.pin?.id);\n }\n\n private getFromWorldPosition(\n pt: Vector3.Vector3,\n projectionViewMatrix: Matrix4.Matrix4,\n dimensions: Dimensions.Dimensions\n ): Point.Point {\n const ndcPt = Vector3.transformMatrix(pt, projectionViewMatrix);\n return Viewport.fromDimensions(dimensions).transformVectorToViewport(ndcPt);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
- */
4
- import{r as t,c as i,h as s,H as n,a as e}from"./p-CCVkga9Q.js";import{p as o,v as h,a,b as r,r as c,c as l,d,e as u}from"./p-DfdVaPrt.js";import{s as f}from"./p-BU0JYf18.js";import{t as p,p as w,S as m,a as v,c as g,W as y}from"./p-BYfDquz2.js";import{m as b,E as C,a as P,c as S,d as I,o as k,u as T,b as A}from"./p-BuOEMGyM.js";import{c as D}from"./p-Dw4-tG-V.js";import{u as M,I as x,p as E,C as B,W as R,S as j,V as z,M as L,a as V,b as $}from"./p--8q6LyIm.js";import{p as O}from"./p-ujnhJ1UM.js";import{s as K,r as H}from"./p-BNuMPeJ8.js";import{r as N,c as F,a as W}from"./p-CjG1fMh1.js";import{h as q,i as U,j as J,k as _,l as G,m as X,n as Z,o as Y,p as Q,u as tt,t as it,q as st,r as nt,s as et,v as ot,w as ht,x as at,y as rt,z as ct,B as lt,C as dt,E as ut,G as ft,H as pt,I as wt,J as mt,K as vt,L as gt,M as yt}from"./p-Bl7Tdbc9.js";import{t as bt,m as Ct,n as Pt,j as St,M as It,k as kt,S as Tt}from"./p-ZM5wo68e.js";import{p as At}from"./p-DJ1a3qgM.js";import{C as Dt}from"./p-C-9RlwtF.js";import{g as Mt,c as xt}from"./p-p0obU98x.js";import{E as Et}from"./p-BAhfr1Nx.js";import{V as Bt}from"./p-Dn7vK758.js";import{B as Rt,M as jt}from"./p-DkLznn4v.js";import{w as zt}from"./p-BxtKMwBH.js";import"./p-ux1ckSDN.js";import"./p-CG9AChtV.js";import"./p-CPk-nchx.js";const Lt=0;const Vt=255;class $t{constructor(t){this.viewer=t;this.handleInteractionStarted=()=>{this.invalidateStencilBuffer();this.pendingInteractionFinished=new Promise((t=>{this.pendingInteractionFinishedResolver=t}))};this.handleInteractionFinished=()=>{var t;(t=this.pendingInteractionFinishedResolver)===null||t===void 0?void 0:t.call(this);this.pendingInteractionFinished=undefined;this.pendingInteractionFinishedResolver=undefined};this.invalidateStencilBuffer=()=>{this.pendingStencilBuffer=undefined};t.addEventListener("interactionStarted",this.handleInteractionStarted);t.addEventListener("interactionFinished",this.handleInteractionFinished);t.addEventListener("frameReceived",(()=>{this.invalidateStencilBuffer()}))}async fetch(){var t;const i=await this.viewer.isSceneReady();const s=i?await this.viewer.scene():undefined;const n=s!=null?s.crossSectioning().current().sectionPlanes.length>0||this.viewer.featureLines!=null:false;const e=(t=this.viewer.frame)===null||t===void 0?void 0:t.scene.camera;if(n&&this.viewer.stream!=null&&e!=null){const t=await this.viewer.stream.getStencilBuffer({includeDepthBuffer:true});const{stencilBuffer:i,depthBuffer:s,imageAttributes:n}=q(t);const[o,h]=await Promise.all([U(new Uint8Array(i)),U(new Uint8Array(s))]);return Ot.fromPng(o,n,i,J.fromPng(h,e,n))}else return undefined}latest(){if(this.pendingStencilBuffer==null){this.pendingStencilBuffer=this.fetch()}return this.pendingStencilBuffer}async latestAfterInteraction(){await this.pendingInteractionFinished;return this.latest()}}class Ot{constructor(t,i,s,n,e){this.imageAttr=t;this.imageBytes=i;this.pixelBytes=s;this.imageChannels=n;this.depthBuffer=e}static fromPng(t,i,s,n){if(!(t.data instanceof Uint8Array)){throw new Error("Expected stencil PNG to have depth of 8-bit")}else if(t.channels!==1){throw new Error("Expected stencil PNG to have 1 color channel")}else{return new Ot(i,s,t.data,t.channels,n)}}getValue(t){const{width:i,height:s}=this.imageAttr.imageRect;const n=o.subtract(t,this.imageAttr.imageRect);const e=1/this.imageAttr.imageScale;const h=o.scale(n,e,e);if(h.x>=0&&h.y>=0&&h.x<i&&h.y<s){const t=Math.floor(h.x)+Math.floor(h.y)*i;const s=this.pixelBytes[t];return s}else return 0}hitTest(t){return this.getValue(t)!==Lt}snapToNearestPixel(t,i,s=()=>true){const n=i*2;const e=o.create(t.x-i,t.y-i);const h=[];for(let a=0;a<n*n;a++){const r=a%n;const c=Math.floor(a/n);const l=o.add(e,{x:r,y:c});if(o.distance(l,t)<=i){const t=this.getValue(l);if(t===Vt&&s(t)){h.push(l)}}}const a=h.sort(((i,s)=>o.distance(i,t)-o.distance(s,t)));const r=a[0];return r!=null?o.create(Math.floor(r.x)+.5,Math.floor(r.y)+.5):t}}function Kt(t){return new Promise((i=>setTimeout(i,t)))}const Ht=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",_),b.mapRequiredProp("createdAt",G),b.mapRequiredProp("modifiedAt",G),b.mapProp("name",X),b.mapProp("suppliedId",X))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,name:n,suppliedId:e})));const Nt=b.ifInvalidThrow(Ht);const Ft=b.defineMapper(b.compose((t=>t.toObject()),b.read(b.mapRequiredProp("id",_),b.mapRequiredProp("createdAt",G),b.mapRequiredProp("modifiedAt",G),b.mapProp("suppliedId",X),b.mapRequiredProp("data",(t=>{if(t.callout!=null){return qt(t.callout)}else if(t.customJson!=null){return Ut(t.customJson)}else{throw new Error("Undefined or unknown annotation data.")}})))),(([t,i,s,n,e])=>({id:t,createdAt:i,modifiedAt:s,suppliedId:n,data:e})));const Wt=b.ifInvalidThrow(Ft);const qt=b.defineMapper(b.read(b.mapRequiredProp("position",Z),b.mapProp("icon",X),b.mapProp("primaryColor",X),b.mapProp("accentColor",X)),(([t,i,s,n])=>({type:"callout",position:t,icon:i,primaryColor:s,accentColor:n})));const Ut=b.defineMapper(b.read(b.requiredProp("type"),b.mapRequiredProp("jsonData",(t=>JSON.parse(t)))),(([t,i])=>({type:"custom",jsonType:t,jsonData:i})));class Jt{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s;this.onStateChange=new C}async addAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await F(this.jwtProvider,s);const e=new K.CreateSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.createSceneViewAnnotationSet(e,n,i)}));return this.fetch()}disconnect(){if(this.connection!=null){this.connection.dispose();this.connection=undefined}}connect(t=1e4){this.disconnect();const i=this.pollAnnotationState(t);this.connection={dispose:()=>i.abort()}}async fetch(t={}){const i=await this.fetchAnnotationSetsAsArray();const s=await this.fetchAnnotationsAsArray(i);const n=(await Promise.all(s)).reduce(((t,[i,s])=>({annotations:{...t.annotations,[i.id]:s}})),{annotations:{}});if(t.signal==null||!t.signal.aborted){this.updateState(n)}return n}async removeAnnotationSet(t){await N((async i=>{const s=this.deviceIdProvider();const n=await F(this.jwtProvider,s);const e=new K.DeleteSceneViewAnnotationSetRequest;const o=new M.Uuid;o.setHex(t);e.setSceneAnnotationSetId(o);this.client.deleteSceneViewAnnotationSet(e,n,i)}));return this.fetch()}pollAnnotationState(t){const i=new AbortController;const s=async t=>{await this.fetch({signal:i.signal});if(!i.signal.aborted){await Kt(t);await s(t)}};P.abort(i.signal,s(t));return i}fetchAnnotationSets(){return W((t=>async i=>{const s=this.deviceIdProvider();const n=await F(this.jwtProvider,s);const e=new K.ListSceneViewAnnotationSetsRequest;if(t!=null){const i=new O.Pager;i.setCursor(t);i.setLimit(100);e.setPage(i)}this.client.listSceneViewAnnotationSets(e,n,i)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}async fetchAnnotationSetsAsArray(){return(await P.asArray(this.fetchAnnotationSets())).flatMap((t=>t.getSceneAnnotationSetsList())).map((t=>Nt(t)))}fetchAnnotations(t){return W((i=>async s=>{const n=this.deviceIdProvider();const e=await F(this.jwtProvider,n);const o=new K.ListSceneAnnotationsRequest;const h=bt(t);o.setSceneAnnotationSetId(h);if(i!=null){const t=new O.Pager;t.setCursor(i);t.setLimit(100);o.setPage(t)}this.client.listSceneAnnotations(o,e,s)}),(t=>{var i;return(i=t.toObject().nextCursor)===null||i===void 0?void 0:i.next}))}fetchAnnotationsAsArray(t){const i=t.map((async t=>{const i=(await P.asArray(this.fetchAnnotations(t.id))).flatMap((t=>t.getSceneAnnotationsList())).map((t=>Wt(t)));return[t,i]}));return Promise.all(i)}updateState(t){this.state=t;this.onStateChange.emit(t)}}const _t=b.defineMapper(b.read(b.mapRequiredProp("color",Y),b.getProp("thickness")),(([t,i])=>({color:t,thickness:i})));const Gt=b.defineMapper(b.read(b.mapRequiredProp("color",Y)),(([t])=>({color:t})));const Xt=b.defineMapper(b.read(b.pickFirst(b.mapProp("arrow",b.ifDefined((t=>({...t,type:"arrow-end"})))),b.mapProp("circle",b.ifDefined((t=>({...t,type:"circle-end"})))),b.mapProp("dash",b.ifDefined((t=>({...t,type:"dash-end"})))))),(([t])=>t!==null&&t!==void 0?t:undefined));const Zt=b.defineMapper(b.read(b.mapRequiredProp("startPosition",Q),b.mapRequiredProp("endPosition",Q),b.mapProp("strokeStyle",b.ifDefined(_t)),b.mapProp("fillStyle",b.ifDefined(Gt)),b.mapProp("startShape",b.ifDefined(Xt)),b.mapProp("endShape",b.ifDefined(Xt))),(([t,i,s,n,e,o])=>({type:"line-2d",startPosition:t,endPosition:i,strokeStyle:s,fillStyle:n,startShape:e!==null&&e!==void 0?e:undefined,endShape:o!==null&&o!==void 0?o:undefined})));const Yt=b.defineMapper(b.read(b.mapRequiredProp("topLeft",Q),b.mapRequiredProp("bottomRight",Q),b.mapProp("strokeStyle",b.ifDefined(_t)),b.mapProp("fillStyle",b.ifDefined(Gt))),(([t,i,s,n])=>({type:"oval-2d",topLeftPosition:t,bottomRightPosition:i,strokeStyle:s,fillStyle:n})));const Qt=b.defineMapper(b.read(b.mapRequiredProp("positionsList",b.mapArray(Q)),b.mapProp("strokeStyle",b.ifDefined(_t)),b.mapProp("fillStyle",b.ifDefined(Gt))),(([t,i,s])=>({type:"freeform-2d",positions:t,strokeStyle:i,fillStyle:s})));const ti=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Y),b.mapRequiredProp("accentColor",Y),b.mapRequiredProp("position",Z),b.mapProp("sceneItemId",b.ifDefined(_))),(([t,i,s,n])=>({type:"pin-2d",primaryColor:t,accentColor:i,position:s,sceneItemId:n!==null&&n!==void 0?n:undefined})));const ii=b.defineMapper(b.read(b.mapRequiredProp("primaryColor",Y),b.mapRequiredProp("accentColor",Y),b.mapRequiredProp("anchorPosition",Z),b.mapRequiredProp("textPosition",Q),b.getProp("text"),b.mapProp("sceneItemId",b.ifDefined(_))),(([t,i,s,n,e,o])=>({type:"callout",primaryColor:t,accentColor:i,anchorPosition:s,textPosition:n,text:e,sceneItemId:o!==null&&o!==void 0?o:undefined})));const si=b.defineMapper(b.read(b.pickFirst(b.mapProp("line2d",b.ifDefined(Zt)),b.mapProp("oval",b.ifDefined(Yt)),b.mapProp("freeform",b.ifDefined(Qt)),b.mapProp("pin",b.ifDefined(ti)),b.mapProp("callout",b.ifDefined(ii)))),(([t])=>t!==null&&t!==void 0?t:undefined));const ni=b.defineMapper(b.read(b.mapRequiredProp("itemsList",b.mapArray(si))),(([t])=>({items:t.filter((t=>t!=null))})));const ei=b.defineMapper(b.read(b.mapRequiredProp("canvas",b.mapRequiredProp("document",b.mapRequiredProp("v1",ni)))),(([t])=>t));const oi=b.ifInvalidThrow(ei);class hi{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getCanvas({canvasId:t,sceneViewStateId:i}){if(t!=null&&i!=null){throw new Error("Invalid request. Only one lookup ID between `canvasId` and `sceneViewStateId` can be provided.")}const s=await N((async s=>{const n=this.deviceIdProvider();const e=await F(this.jwtProvider,n);const o=new K.GetCanvasRequest;if(t!=null){const i=bt(t);o.setCanvasId(i)}else if(i!=null){const t=bt(i);o.setSceneViewStateId(t)}this.client.getCanvas(o,e,s)}));return oi(s.toObject())}}class ai{constructor(t,i,s){this.stream=t;this.configProvider=i;this.imageScaleProvider=s}predicate(t){return t.altKey&&!t.shiftKey}async fn(t){var i;const s=this.imageScaleProvider();const n=await this.stream.hitItems({point:o.scale(t.position,(s===null||s===void 0?void 0:s.x)||1,(s===null||s===void 0?void 0:s.y)||1)},true);if(((i=n.hitItems)===null||i===void 0?void 0:i.hits)!=null&&n.hitItems.hits.length>0){await this.stream.flyTo({itemId:n.hitItems.hits[0].itemId,animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit results found for fly to part [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}}class ri{constructor(t,i,s,n,e,o,h,a,r,c,l){this.stream=t;this.cursors=i;this.getConfig=s;this.getScene=n;this.getFrame=e;this.getViewport=o;this.tapEmitter=h;this.doubleTapEmitter=a;this.longPressEmitter=r;this.interactionStartedEmitter=c;this.interactionFinishedEmitter=l;this.tap=this.tap.bind(this);this.doubleTap=this.doubleTap.bind(this);this.longPress=this.longPress.bind(this);this.emitTapEvent=this.emitTapEvent.bind(this)}addCursor(t,i){return this.cursors.add(t,i)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async getEntityTypeAtPoint(t){var i;const s=this.getViewport();const n=await((i=this.getFrame())===null||i===void 0?void 0:i.featureMap());if(n!=null){const i=s.transformPointToFrame(t,n);return n.getEntityType(i)}else{return Et.NO_GEOMETRY}}getRayFromPoint(t){const i=this.getViewport();const s=this.getFrame();if(s!=null){return i.transformPointToRay(t,s.image,s.scene.camera)}else throw new Error("Cannot get camera. Frame is undefined.")}async tap(t,i={},s=0){this.emitTapEvent(this.tapEmitter.emit,t,i,s)}async doubleTap(t,i={},s=0){this.emitTapEvent(this.doubleTapEmitter.emit,t,i,s)}async longPress(t,i={},s=0){this.emitTapEvent(this.longPressEmitter.emit,t,i,s)}async beginInteraction(){if(!this.isInteracting()){this.interactionStartedEmitter.emit();this.sceneLoadingPromise=this.getScene();this.currentCamera=(await this.sceneLoadingPromise).camera();this.sceneLoadingPromise=undefined;await this.stream.beginInteraction()}}async transformCamera(...t){var i;const s=t[0];const n=t[1];if(this.isInteracting()){const t=await this.getScene();const e=this.getViewport();const o=this.getFrame();const h=await(o===null||o===void 0?void 0:o.depthBuffer());this.currentCamera=this.currentCamera!=null&&e!=null&&o!=null?s({camera:this.currentCamera,viewport:e,scale:t.scale(),boundingBox:t.boundingBox(),frame:o,depthBuffer:h}):undefined;await((i=this.currentCamera)===null||i===void 0?void 0:i.render(n))}}async twistCamera(...t){return this.transformCamera((({camera:i,viewport:s})=>{const n=h.normalize(h.subtract(i.lookAt,i.position));if(t.length===1&&typeof t[0]==="number"){const s=a.toRadians(-t[0]);return i.rotateAroundAxis(s,n)}else if(t.length===1){const n=o.create(s.width/2,s.height/2);const e=a.toDegrees(a.fromPoints(n,t[0]));const r=this.lastAngle!=null?e-this.lastAngle:0;this.lastAngle=e;const c=h.normalize(h.subtract(i.lookAt,i.position));const l=a.toRadians(-r);return i.rotateAroundAxis(l,c)}return i}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,depthBuffer:e})=>{if(this.panData==null){const o=i.toFrameCamera();const h=o.direction;const a=n.transformPointToRay(t,s.image,o);const l=r.fromNormalAndCoplanarPoint(h,i.lookAt);const d=c.intersectPlane(a,l);if(d==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}const u=e!=null?this.getWorldPoint(t,e,d):d;const f=r.fromNormalAndCoplanarPoint(h,u);this.panData={hitPt:u,hitPlane:f,startingCamera:o}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const r=n.transformPointToRay(t,s.image,a);const l=c.intersectPlane(r,o);if(l!=null){const t=h.subtract(e,l);return i.update(a).moveBy(t)}}return i}))}async viewAll(){await(await this.getScene()).camera().viewAll().render()}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=h.normalize(i.up);const e=h.normalize(h.subtract(i.lookAt,i.position));const o=h.cross(n,e);const a=h.cross(e,o);const r=h.normalize({x:t.x*o.x+t.y*a.x,y:t.x*o.y+t.y*a.y,z:t.x*o.z+t.y*a.z});const c=h.cross(r,e);const l=9.5*t.x/s.width;const d=9.5*t.y/s.height;const u=Math.abs(l)+Math.abs(d);return i.rotateAroundAxis(u,c)}))}async rotateCameraAtPoint(t,i){return this.transformCamera((({camera:s,viewport:n,depthBuffer:e})=>{if(this.worldRotationPoint==null){this.worldRotationPoint=e!=null?this.getWorldPoint(i,e,s.lookAt):s.lookAt}const o=h.normalize(s.up);const a=h.normalize(h.subtract(s.lookAt,s.position));const r=h.cross(o,a);const c=h.cross(a,r);const l=h.normalize({x:t.x*r.x+t.y*c.x,y:t.x*r.y+t.y*c.y,z:t.x*r.z+t.y*c.z});const d=h.cross(l,a);const u=9.5*t.x/n.width;const f=9.5*t.y/n.height;const p=Math.abs(u)+Math.abs(f);const w=s.rotateAroundAxisAtPoint(p,this.worldRotationPoint,d);return w.update({lookAt:h.add(h.scale(Math.abs(s.signedDistanceToBoundingBoxCenter())/h.magnitude(w.viewVector),w.viewVector),w.position)})}))}async zoomCamera(t){return this.transformCamera((({camera:i,viewport:s,frame:n,boundingBox:e})=>{if(s!=null&&n!=null){const o=i===null||i===void 0?void 0:i.toFrameCamera().isPerspective();if(o){const n=i.viewVector;const e=h.magnitude(n);const o=3*e*(t/s.height);const a=h.normalize(n);const r=h.scale(o,a);const c=h.add(i.position,r);const l=i.update({position:c});return l}else{const o=i;const a=i.toFrameCamera();const d=a.direction;const u=s.transformPointToRay(s.center,n.image,a);const f=4*(t/s.height);const p=h.magnitude(l.diagonal(e))*1e-5;const w=Math.max(p,o.fovHeight*(1-f));const m=r.fromNormalAndCoplanarPoint(d,a.lookAt);const v=c.intersectPlane(u,m);if(v!=null){const t=r.projectPoint(m,o.lookAt);const s=(o.fovHeight-w)/o.fovHeight;const n=h.scale(s,h.subtract(v,t));const e=h.add(o.lookAt,n);const a=i.update({lookAt:e,rotationPoint:e,fovHeight:w});return a}}}return i}))}async pivotCamera(t,i){return this.transformCamera((({camera:s})=>{const{position:n,up:e,lookAt:o}=s;const r=h.normalize(e);const c=h.normalize(s.viewVector);const l=h.cross(r,c);const d=h.cross(c,l);const u=h.rotateAboutAxis(a.toRadians(t),o,l,n);const f=h.rotateAboutAxis(a.toRadians(i),u,d,n);return s.update({...s,lookAt:f})}))}async endInteraction(){await this.sceneLoadingPromise;if(this.isInteracting()){this.currentCamera=undefined;this.worldRotationPoint=undefined;this.panData=undefined;this.zoomData=undefined;this.resetLastAngle();this.interactionFinishedEmitter.emit();await this.stream.endInteraction()}}resetLastAngle(){this.lastAngle=undefined}isInteracting(){return this.currentCamera!=null}pixelThreshold(t){const i=this.isCoarseInputDevice(t)?this.getConfig().coarsePointerThreshold:this.getConfig().finePointerThreshold;return i*window.devicePixelRatio}async hitItems(t){var i;const s=await(await this.getScene()).raycaster().hitItems(t);return(i=s===null||s===void 0?void 0:s.hits)!==null&&i!==void 0?i:[]}emitTapEvent(t,i,s={},n=0){const{altKey:e=false,ctrlKey:o=false,metaKey:h=false,shiftKey:a=false}=s;t({position:i,altKey:e,ctrlKey:o,metaKey:h,shiftKey:a,buttons:n})}isCoarseInputDevice(t){return t||window.matchMedia("(pointer: coarse)").matches}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}class ci extends ri{constructor(t,i,s,n,e,o,h,a,r,c,l){super(t,i,s,n,e,o,h,a,r,c,l)}async getWorldPointFromViewport(t){const i=this.getViewport();const s=this.getFrame();if(s==null){throw new Error("Cannot get world point. Frame is undefined.")}const n=await s.depthBuffer();return n!=null?i.transformPointToWorldSpace(t,n,.5):undefined}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{const n=i.viewVector;const e=h.normalize(i.up);const a=h.normalize(n);const r=o.scale(t,.5,.5);const c=h.magnitude(n);const l=r.x*c/s.width;const d=r.y*c/s.height;const u=h.cross(e,a);const f=h.cross(a,u);const p=h.add(h.scale(l,u),h.scale(d,f));return i.moveBy(p)}))}async panCameraToScreenPoint(t){return this.transformCamera((({camera:i,frame:s,viewport:n,boundingBox:e})=>{if(this.panData==null){const e=i.toFrameCamera();const o=e.direction;const h=n.transformPointToRay(t,s.image,e);const a=r.fromNormalAndCoplanarPoint(o,i.lookAt);const l=c.intersectPlane(h,a);if(l==null){console.warn("Cannot determine fallback for pan. Ray does not intersect plane.");return i}this.panData={hitPt:l,hitPlane:a,startingCamera:e}}if(this.panData!=null){const{hitPt:e,hitPlane:o,startingCamera:a}=this.panData;const r=n.transformPointToRay(t,s.image,a);const l=c.intersectPlane(r,o);if(l!=null){const t=h.subtract(e,l);const s=h.add(a.lookAt,t);return i.update({lookAt:s,rotationPoint:s})}}return i}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:a,boundingBox:d})=>{if(this.orthographicZoomData==null||o.distance(t,this.orthographicZoomData.startingScreenPt)>2){const i=s.toFrameCamera();const o=i.direction;const h=n.transformPointToRay(t,e.image,i);const l=r.fromNormalAndCoplanarPoint(o,i.lookAt);const d=c.intersectPlane(h,l);if(d==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const u=a!=null?this.getWorldPoint(t,a,d):d;const f=r.fromNormalAndCoplanarPoint(o,u);this.orthographicZoomData={hitPt:u,hitPlane:f,startingScreenPt:t}}if(this.orthographicZoomData!=null){const{hitPt:t,hitPlane:e}=this.orthographicZoomData;const o=4*(i/n.height);const a=h.magnitude(l.diagonal(d))*1e-5;const c=Math.max(a,s.fovHeight*(1-o));const u=r.projectPoint(e,s.lookAt);const f=(s.fovHeight-c)/s.fovHeight;const p=h.scale(f,h.subtract(t,u));const w=h.add(s.lookAt,p);return s.update({lookAt:w,rotationPoint:w,fovHeight:c})}return s}))}async rotateCamera(t){return this.transformCamera((({camera:i,viewport:s,boundingBox:n})=>{var e;const o=h.normalize(i.up);const a=h.normalize(h.subtract(i.lookAt,i.position));const r=h.cross(o,a);const c=h.cross(a,r);const d=h.normalize({x:t.x*r.x+t.y*c.x,y:t.x*r.y+t.y*c.y,z:t.x*r.z+t.y*c.z});const u=h.cross(d,a);const f=9.5*t.x/s.width;const p=9.5*t.y/s.height;const w=Math.abs(f)+Math.abs(p);const m=i.rotationPoint!=null&&((e=i.rotationPoint)===null||e===void 0?void 0:e.x)!=null?i.rotationPoint:i.lookAt;const v=i.rotateAroundAxisAtPoint(w,m,u);const g=tt(v.lookAt,v.viewVector,l.center(n));return v.update({lookAt:g})}))}getWorldPoint(t,i,s){const n=this.getViewport();const e=n.transformPointToFrame(t,i);const o=i.hitTest(e);return o?n.transformPointToWorldSpace(t,i):s}}const li=.2;class di extends ri{constructor(t,i,s,n,e,o,h,a,r,c,l){super(t,i,s,n,e,o,h,a,r,c,l)}async panCameraByDelta(t){return this.transformCamera((({camera:i,viewport:s})=>{var n;const e=i.viewVector;const a=h.normalize(i.up);const r=h.normalize(e);const c=o.scale(t,.25,.25);const l=h.magnitude(e)*Math.tan((n=i.fovY)!==null&&n!==void 0?n:45);const d=c.x*l/s.width;const u=c.y/s.width*l;const f=h.cross(a,r);const p=h.cross(r,f);const w=h.add(h.scale(d,f),h.scale(u,p));return i.moveBy(w)}))}async zoomCameraToPoint(t,i){return this.transformCamera((({camera:s,viewport:n,frame:e,depthBuffer:o,boundingBox:a})=>{const l=e.scene.camera;const d=l.direction;const u=s.toFrameCamera();const f=n.transformPointToRay(t,e.image,u);if(this.zoomData==null){const i=r.fromNormalAndCoplanarPoint(d,l.lookAt);const n=c.intersectPlane(f,i);if(n==null){console.warn("Cannot determine fallback point for zoom. Ray does not intersect plane.");return s}const e=o!=null?this.getWorldPoint(t,o,n):n;const h=r.fromNormalAndCoplanarPoint(d,e);this.zoomData={hitPt:e,hitPlane:h}}if(this.zoomData!=null){const{hitPlane:t}=this.zoomData;const{position:e,distance:o,isPastHitPlane:l,keepCurrent:d}=this.computeZoomDistances(i,s,n,a,f,this.zoomData);if(l&&!d){const t=c.create({origin:e,direction:h.normalize(s.viewVector)});return s.update({position:e,lookAt:c.at(t,o)})}else if(!d){return s.update({position:e,lookAt:r.projectPoint(t,e)})}}return s}))}walk(t){this.transformCamera((({camera:i,boundingBox:s})=>{const{position:n,up:e,lookAt:o}=i;const a=h.normalize(e);const r=h.normalize(i.viewVector);const c=Math.min(...h.toArray(l.lengths(s)));const d=h.scale(c,t);const u=h.cross(a,r);const f=h.cross(u,a);const p=h.scale(d.x,h.normalize(u));const w=h.scale(d.y,h.normalize(a));const m=h.scale(d.z,h.normalize(f));const v=h.negate(h.add(p,w,m));return i.update({...i,position:h.add(n,v),lookAt:h.add(o,v)})}))}computeZoomDistances(t,i,s,n,e,o){const a=this.getConfig();const{hitPt:r,hitPlane:l}=o;const d=a.useMinimumPerspectiveZoomDistance?this.computeZoomMinimumDistance(i,n):-1;const u=h.distance(i.position,r);const f=Math.max(d,u);const p=6*f*t/s.height;const w=c.at(e,p);const m=c.create({origin:w,direction:h.normalize(i.viewVector)});const v=c.intersectPlane(m,l);if(v==null&&a.useMinimumPerspectiveZoomDistance){const i=6*d*t/s.height;const n=c.at(e,i);return{position:n,distance:d,isPastHitPlane:true,keepCurrent:false}}else if(v==null){return{position:i.position,distance:f,isPastHitPlane:true,keepCurrent:true}}return{position:w,distance:f,isPastHitPlane:false,keepCurrent:false}}computeZoomMinimumDistance(t,i){const s=Math.abs(i.min.x)+Math.abs(i.max.x);const n=Math.abs(i.min.y)+Math.abs(i.max.y);const e=Math.abs(i.min.z)+Math.abs(i.max.z);const o=Math.max(s,n,e);const a=Math.abs(h.dot(h.normalize(t.viewVector),h.right()));const r=Math.abs(h.dot(h.normalize(t.viewVector),h.up()));const c=Math.abs(h.dot(h.normalize(t.viewVector),h.back()));const l=s*a;const d=n*r;const u=e*c;const f=o/s;const p=o/n;const w=o/e;return(l+d+u)/(f+p+w)*li}}class ui{constructor(t,i,s,n){this.stream=t;this.configProvider=i;this.imageScaleProvider=s;this.sceneProvider=n}predicate(t){return t.altKey&&t.shiftKey}async fn(t){var i,s;const n=this.imageScaleProvider();const e=await this.stream.hitItems({point:o.scale(t.position,(n===null||n===void 0?void 0:n.x)||1,(n===null||n===void 0?void 0:n.y)||1)},true);if(((i=e.hitItems)===null||i===void 0?void 0:i.hits)!=null&&e.hitItems.hits.length>0&&e.hitItems.hits[0].hitPoint!=null){const i=await this.sceneProvider();const n=(await this.sceneProvider()).camera();const o=e.hitItems.hits[0];if(o.hitPoint!=null&&o.hitPoint.x!=null&&o.hitPoint.y!=null&&o.hitPoint.z!=null){const t=h.create(o.hitPoint.x,o.hitPoint.y,o.hitPoint.z);const s=await this.getLookAtPoint(i,t,n.viewVector);await this.stream.flyTo({camera:it(n.update({lookAt:s,rotationPoint:s}).toFrameCamera()),animation:{duration:p(this.configProvider().animation.durationMs)}})}else{console.debug(`No hit position found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}, hit-id={${(s=o.itemId)===null||s===void 0?void 0:s.hex}}]`)}}else{console.debug(`No hit results found for fly to position [position={x: ${t.position.x}, y: ${t.position.y}}]`)}}getLookAtPoint(t,i,s){if(t.isOrthographic()){return tt(i,s,l.center(t.boundingBox()))}else{return i}}}class fi{setPosition(t){this.currentPosition=t}getPosition(){return this.currentPosition}getType(){return this.type}beginDrag(t,i,s,n){}drag(t,i){}endDrag(t,i){if(this.currentPosition!=null){i.endInteraction();this.currentPosition=undefined}}async zoom(t,i){}}class pi extends fi{constructor(){super(...arguments);this.type="rotate"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=o.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=o.create(t.screenX,t.screenY);const n=o.subtract(s,this.currentPosition);i.rotateCamera(n);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class wi extends fi{constructor(){super(...arguments);this.type="rotate-point"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=o.create(t.screenX,t.screenY);this.startingPosition=i;s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.startingPosition!=null){const s=o.create(t.screenX,t.screenY);const n=o.subtract(s,this.currentPosition);i.rotateCameraAtPoint(n,this.startingPosition);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class mi extends fi{constructor(t){super();this.interactionConfigProvider=t;this.type="zoom";this.didTransformBegin=false}async beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=o.create(t.clientX,t.clientY);const i=n.getBoundingClientRect();const e=Mt(t,i);this.startPt=e;await s.beginInteraction()}}async drag(t,i){if(this.currentPosition!=null){const s=o.create(t.clientX,t.clientY);const n=o.subtract(s,this.currentPosition);if(this.startPt!=null){await i.zoomCameraToPoint(this.startPt,n.y);this.currentPosition=s}}}endDrag(t,i){super.endDrag(t,i);this.stopInteractionTimer();this.didTransformBegin=false;this.startPt=undefined}async zoom(t,i){await this.operateWithTimer(i,(()=>i.zoomCamera(this.getDirectionalDelta(t))))}async zoomToPoint(t,i,s){await this.operateWithTimer(s,(()=>s.zoomCameraToPoint(t,this.getDirectionalDelta(i))))}async beginInteraction(t){this.didTransformBegin=true;await t.beginInteraction()}async endInteraction(t){this.didTransformBegin=false;await t.endInteraction()}resetInteractionTimer(t){this.stopInteractionTimer();this.startInteractionTimer(t)}getDirectionalDelta(t){return this.interactionConfigProvider().reverseMouseWheelDirection?-t:t}getInteractionDelay(){return this.interactionConfigProvider().mouseWheelInteractionEndDebounce}startInteractionTimer(t){this.interactionTimer=window.setTimeout((async()=>{this.interactionTimer=undefined;await this.endInteraction(t)}),this.getInteractionDelay())}stopInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}async operateWithTimer(t,i){if(!this.didTransformBegin){await this.beginInteraction(t)}this.resetInteractionTimer(t);i()}}class vi extends fi{constructor(){super(...arguments);this.type="pan"}beginDrag(t,i,s,n){if(this.currentPosition==null){this.currentPosition=o.create(t.screenX,t.screenY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null&&this.canvasRect!=null){const s=Mt(t,this.canvasRect);i.panCameraToScreenPoint(s);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class gi extends fi{constructor(){super(...arguments);this.type="twist"}beginDrag(t,i,s,n){this.currentPosition=o.create(t.offsetX,t.offsetY);this.canvasRect=n.getBoundingClientRect();s.beginInteraction()}drag(t,i){const s=Mt(t,this.canvasRect);this.currentPosition=s;i.twistCamera(s)}endDrag(t,i){super.endDrag(t,i)}}class yi extends fi{constructor(){super(...arguments);this.type="pivot"}beginDrag(t,i,s){if(this.currentPosition==null){this.currentPosition=o.create(t.screenX,t.screenY);s.beginInteraction()}}drag(t,i){if(this.currentPosition!=null){const s=o.create(t.screenX,t.screenY);const n=o.subtract(s,this.currentPosition);i.pivotCamera(-.25*n.y,.25*n.x);this.currentPosition=s}}endDrag(t,i){super.endDrag(t,i)}}class bi extends Rt{constructor(t,i=new pi,s=new wi,n=new mi((()=>t().interactions)),e=new vi,o=new gi,h=new yi){super("mousedown","mouseup","mousemove",i,s,n,e,o,h,t)}}function Ci(t){window.requestAnimationFrame(t)}class Pi{constructor(){this.previousFirstPoints=[];this.previousSecondPoints=[]}initialize(t,i){this.element=t;this.interactionApi=i}dispose(){this.element=undefined}beginTwoPointTouch(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i]}handleTwoPointTouchMove(t,i){this.previousFirstPoints=[...this.previousFirstPoints,t];this.previousSecondPoints=[...this.previousSecondPoints,i];Ci((()=>{var t,i,s,n;if(this.previousFirstPoints.length>1&&this.previousSecondPoints.length>1&&this.previousFirstPoints.length===this.previousSecondPoints.length){const e=this.previousFirstPoints;const h=this.previousSecondPoints;this.previousFirstPoints=this.previousFirstPoints.slice(-1);this.previousSecondPoints=this.previousSecondPoints.slice(-1);const a=e.reduce(((t,i,s)=>{if(s<e.length-1){const n=e[s+1];const o=h[s];const a=h[s+1];return{deltas:[...t.deltas,this.computeDelta(i,o,n,a)],zooms:[...t.zooms,this.computeZoom(i,o,n,a)],angles:[...t.angles,this.computeAngle(i,o,n,a)]}}return t}),{deltas:[],zooms:[],angles:[]});const r=a.deltas.reduce(((t,i)=>o.add(t,i)),o.create());const c=a.zooms.reduce(((t,i)=>t+i),0);const l=a.angles.reduce(((t,i)=>t+i),0);const d=o.create((e[e.length-1].x+h[h.length-1].x)/2,(e[e.length-1].y+h[h.length-1].y)/2);(t=this.interactionApi)===null||t===void 0?void 0:t.beginInteraction();(i=this.interactionApi)===null||i===void 0?void 0:i.zoomCameraToPoint(d,c);(s=this.interactionApi)===null||s===void 0?void 0:s.panCameraByDelta(r);(n=this.interactionApi)===null||n===void 0?void 0:n.twistCamera(l)}}))}endTwoPointTouch(){this.previousFirstPoints=[];this.previousSecondPoints=[]}computeDelta(t,i,s,n){return o.add(o.subtract(s,t),o.subtract(n,i))}computeZoom(t,i,s,n){const e=o.distance(s,n)-o.distance(t,i);return e*.5}computeAngle(t,i,s,n){const e=d.create(o.subtract(t,i),o.subtract(s,n));return a.toDegrees(Math.atan2(d.determinant(e),d.dot(e)))}}class Si extends Pi{constructor(){super();this.touchPoints={};this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("pointerdown",this.handlePointerDown);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}handlePointerDown(t){const i=o.create(t.screenX,t.screenY);this.touchPoints={...this.touchPoints,[t.pointerId]:i};const s=Object.keys(this.touchPoints);if(s.length===1){window.addEventListener("pointermove",this.handlePointerMove);window.addEventListener("pointerup",this.handlePointerUp)}else if(s.length===2){this.beginTwoPointTouch(this.touchPoints[0],this.touchPoints[1])}}handlePointerMove(t){if(this.touchPoints[t.pointerId]!=null){this.touchPoints[t.pointerId]=o.create(t.screenX,t.screenY)}const i=Object.keys(this.touchPoints);if(i.length===2){const t=this.touchPoints[i[0]];const s=this.touchPoints[i[1]];this.handleTwoPointTouchMove(t,s)}}handlePointerUp(t){var i;delete this.touchPoints[t.pointerId];const s=Object.keys(this.touchPoints);if(s.length===1){(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction()}if(s.length===0){window.removeEventListener("pointermove",this.handlePointerMove);window.removeEventListener("pointerup",this.handlePointerUp)}this.endTwoPointTouch()}}class Ii extends jt{constructor(t,i=new pi,s=new wi,n=new mi((()=>t().interactions)),e=new vi,o=new gi,h=new yi){super("pointerdown","pointerup","pointermove",i,s,n,e,o,h,t);this.touchPoints=new Set;this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this)}initialize(t,i){super.initialize(t,i);t.addEventListener("pointerdown",this.handlePointerDown)}addEventListenersToElement(t){t.addEventListener(this.downEvent,this.handleDownEvent);t.addEventListener("wheel",this.handleMouseWheel,{passive:false});return{dispose:()=>{t.removeEventListener(this.downEvent,this.handleDownEvent);t.removeEventListener("wheel",this.handleMouseWheel)}}}handlePointerDown(t){this.downPosition=o.create(t.screenX,t.screenY);this.touchPoints.add(t.pointerId);if(this.touchPoints.size===1){window.addEventListener("pointerup",this.handlePointerUp)}if(this.touchPoints.size===2){this.disableIndividualInteractions=true}}handlePointerUp(t){this.touchPoints.delete(t.pointerId);if(this.touchPoints.size<2){this.disableIndividualInteractions=false}if(this.touchPoints.size===0){window.removeEventListener("pointerup",this.handlePointerUp)}}}class ki{constructor(t,i,s,n){this.downEvent=t;this.upEvent=i;this.moveEvent=s;this.getConfig=n;this.handleDown=this.handleDown.bind(this);this.handleUp=this.handleUp.bind(this);this.handleMove=this.handleMove.bind(this);this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this);this.handlePointerMove=this.handlePointerMove.bind(this);this.handlePointerEnd=this.handlePointerEnd.bind(this);this.clearPositions=this.clearPositions.bind(this);this.restartDoubleTapTimer=this.restartDoubleTapTimer.bind(this);this.clearDoubleTapTimer=this.clearDoubleTapTimer.bind(this);this.restartLongPressTimer=this.restartLongPressTimer.bind(this);this.clearLongPressTimer=this.clearLongPressTimer.bind(this);this.setPointerPositions=this.setPointerPositions.bind(this);this.emit=this.emit.bind(this)}dispose(){var t,i;(t=this.element)===null||t===void 0?void 0:t.removeEventListener(this.downEvent,this.handleDown);(i=this.element)===null||i===void 0?void 0:i.removeEventListener("touchstart",this.handleTouchStart);this.element=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer()}initialize(t,i){this.element=t;this.interactionApi=i;t.addEventListener(this.downEvent,this.handleDown);t.addEventListener("touchstart",this.handleTouchStart,{passive:true})}handleTouchStart(t){if(t.touches.length===1){this.setPointerPositions(o.create(t.touches[0].clientX,t.touches[0].clientY));this.restartLongPressTimer();window.addEventListener("touchend",this.handleTouchEnd);window.addEventListener("touchmove",this.handleTouchMove)}}handleTouchMove(t){if(t.touches.length>0){this.handlePointerMove(o.create(t.touches[0].clientX,t.touches[0].clientY),true)}}handleTouchEnd(t){if(this.pointerDownPosition!=null){window.removeEventListener("touchend",this.handleTouchEnd);window.removeEventListener("touchmove",this.handleTouchMove)}this.handlePointerEnd(this.pointerDownPosition)}handleDown(t){this.setPointerPositions(o.create(t.clientX,t.clientY));this.buttons=t.buttons;const i={altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey};this.restartLongPressTimer(i);window.addEventListener(this.upEvent,this.handleUp);window.addEventListener(this.moveEvent,this.handleMove)}handleMove(t){this.handlePointerMove(o.create(t.clientX,t.clientY),this.isTouch(t))}handleUp(t){if(this.pointerDownPosition!=null){window.removeEventListener(this.upEvent,this.handleUp);window.removeEventListener(this.moveEvent,this.handleMove)}this.handlePointerEnd(o.create(t.clientX,t.clientY),{altKey:t.altKey,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey},this.buttons,this.isTouch(t));this.buttons=undefined}handlePointerMove(t,i){var s;const n=((s=this.interactionApi)===null||s===void 0?void 0:s.pixelThreshold(i))||2;if(this.pointerDownPosition!=null&&o.distance(t,this.pointerDownPosition)>=n&&this.interactionTimer==null){this.clearPositions()}}handlePointerEnd(t,i={},s=0,n=false){var e,o;if(t!=null){if(this.longPressTimer!=null){this.emit((e=this.interactionApi)===null||e===void 0?void 0:e.tap)(t,i,s)}if(this.doubleTapTimer!=null&&this.secondPointerDownPosition!=null){this.emit((o=this.interactionApi)===null||o===void 0?void 0:o.doubleTap)(t,i,s,this.secondPointerDownPosition);this.clearDoubleTapTimer()}}this.pointerDownPosition=undefined;this.clearLongPressTimer()}emit(t){return(i,s={},n=0,e,h=false)=>{var a;const r=e||this.pointerDownPosition;const c=((a=this.interactionApi)===null||a===void 0?void 0:a.pixelThreshold(h))||1;let l;if(this.interactionTimer!=null){l=this.getCanvasPosition(r||i)}else if(r!=null&&o.distance(r,i)<=c){l=this.getCanvasPosition(i)}if(l!=null&&t!=null){t(l,s,n)}}}getCanvasPosition(t){var i;const s=(i=this.element)===null||i===void 0?void 0:i.getBoundingClientRect();const n=s!=null?o.create(s.left,s.top):undefined;return n!=null?o.subtract(o.create(t.x,t.y),n):undefined}clearPositions(){this.pointerDownPosition=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined;this.clearDoubleTapTimer();this.clearLongPressTimer();this.clearInteractionTimer()}clearDoubleTapTimer(){if(this.doubleTapTimer!=null){window.clearTimeout(this.doubleTapTimer)}this.doubleTapTimer=undefined;this.firstPointerDownPosition=undefined;this.secondPointerDownPosition=undefined}restartDoubleTapTimer(){this.clearDoubleTapTimer();this.doubleTapTimer=window.setTimeout((()=>this.clearDoubleTapTimer()),this.getConfig().events.doubleTapThreshold)}clearLongPressTimer(){if(this.longPressTimer!=null){window.clearTimeout(this.longPressTimer)}this.longPressTimer=undefined}restartLongPressTimer(t={}){this.clearLongPressTimer();this.longPressTimer=window.setTimeout((()=>{var i;if(this.pointerDownPosition){this.emit((i=this.interactionApi)===null||i===void 0?void 0:i.longPress)(this.pointerDownPosition,t,this.buttons)}this.clearLongPressTimer()}),this.getConfig().events.longPressThreshold)}restartInteractionTimer(){this.clearInteractionTimer();this.interactionTimer=window.setTimeout((()=>{this.interactionTimer=undefined}),this.getConfig().interactions.interactionDelay)}clearInteractionTimer(){if(this.interactionTimer!=null){window.clearTimeout(this.interactionTimer);this.interactionTimer=undefined}}setPointerPositions(t){this.pointerDownPosition=t;this.restartInteractionTimer();if(this.firstPointerDownPosition==null){this.restartDoubleTapTimer();this.firstPointerDownPosition=t}else{this.secondPointerDownPosition=t}}isTouch(t){return window.PointerEvent!=null&&t instanceof PointerEvent?t.pointerType==="touch":false}}class Ti extends Pi{constructor(){super();this.handleTouchStart=this.handleTouchStart.bind(this);this.handleTouchMove=this.handleTouchMove.bind(this);this.handleTouchEnd=this.handleTouchEnd.bind(this)}dispose(){var t;(t=this.element)===null||t===void 0?void 0:t.removeEventListener("touchstart",this.handleTouchStart);super.dispose()}initialize(t,i){super.initialize(t,i);t.addEventListener("touchstart",this.handleTouchStart)}handleTouchStart(t){if(t.touches.length>=1){t.preventDefault();const i=t.touches[0];this.currentPosition1=o.create(i.screenX,i.screenY);if(t.touches[1]!=null){this.beginTwoPointTouch(this.currentPosition1,o.create(t.touches[1].screenX,t.touches[1].screenY))}window.addEventListener("touchmove",this.handleTouchMove,{passive:false});window.addEventListener("touchend",this.handleTouchEnd)}}handleTouchMove(t){t.preventDefault();if(t.touches.length===1){this.handleOnePointTouchMove(t.touches[0])}else if(t.touches.length===2){const i=o.create(t.touches[0].clientX,t.touches[0].clientY);const s=o.create(t.touches[1].clientX,t.touches[1].clientY);this.handleTwoPointTouchMove(i,s)}}handleTouchEnd(t){var i;t.preventDefault();(i=this.interactionApi)===null||i===void 0?void 0:i.endInteraction();this.isInteracting=false;window.removeEventListener("touchmove",this.handleTouchMove);window.removeEventListener("touchend",this.handleTouchEnd);this.endTwoPointTouch()}handleOnePointTouchMove(t){var i,s,n;const e=o.create(t.screenX,t.screenY);if(this.currentPosition1!=null){const t=o.subtract(e,this.currentPosition1);const h=((i=this.interactionApi)===null||i===void 0?void 0:i.pixelThreshold(true))||2;if(o.distance(e,this.currentPosition1)>=h||this.isInteracting){(s=this.interactionApi)===null||s===void 0?void 0:s.beginInteraction();(n=this.interactionApi)===null||n===void 0?void 0:n.rotateCamera(t);this.isInteracting=true}}this.currentPosition1=e}}const Ai={clearMarks:()=>undefined,clearMeasures:()=>undefined,getEntriesByName:()=>[],mark:()=>undefined,measure:()=>undefined};function Di(){var t;if(typeof window!=="undefined"){return window.performance}return(t=globalThis.performance)!==null&&t!==void 0?t:Ai}class Mi{constructor(t,i=Di()){this.name=t;this.perf=i;this.measures=new Set;this.nextId=0}clearMeasurements(){this.perf.clearMeasures(this.name)}measure(t){if(t instanceof Promise){const i=this.begin();return t.finally((()=>this.end(i)))}else if(typeof t==="function"){const i=this.begin();const s=t();this.end(i);return s}else{throw new Error("Input must be a function or Promise")}}takeMeasurements(){const t=this.perf.getEntriesByName(this.name);this.clearMeasurements();return t}takeLastMeasurement(){const t=this.takeMeasurements();return t[t.length-1]}begin(){const t=`${this.name}-${this.nextId++}`;this.measures.add(t);this.perf.mark(t);return t}end(t){this.perf.measure(this.name,t);this.perf.clearMarks(t);this.measures.delete(t)}}const xi=new Mi("paint_time");function Ei(t){const i=new Uint8Array(t.byteLength);i.set(t);return i.buffer}function Bi(t){return new Promise(((i,s)=>{const n=new Blob([Ei(t)]);const e=URL.createObjectURL(n);const o=new Image;o.addEventListener("load",(()=>{i({image:o,dispose:()=>undefined});URL.revokeObjectURL(e)}));o.addEventListener("error",(()=>{s(new x("Failed to load image data"));URL.revokeObjectURL(e)}));o.src=e}))}async function Ri(t){const i=new Blob([Ei(t)]);const s=await window.createImageBitmap(i);return{image:s,dispose:()=>s.close()}}function ji(t){if(window.createImageBitmap!=null){return Ri(t)}else{return Bi(t)}}const zi=1e3;function Li(t,i){const s=i.viewport.calculateDrawRect(i.frame.image);i.canvas.clearRect(0,0,i.canvasDimensions.width,i.canvasDimensions.height);i.canvas.drawImage(t.image,s.x,s.y,s.width,s.height)}function Vi(t,i){const s=t.takeMeasurements();if(s.length>0){i(s)}}function $i(t,i,s,n,e=zi){let o;let h=0;let a;let r=[];function c(){h++;if(o==null){o=setInterval((()=>{Vi(t,n);if(h===0){d()}}),e)}}function l(){h--}function d(){if(o!=null){clearInterval(o);o=undefined}}if(s){setInterval((()=>{if(a!=null){if(r.length===5){r=[...r.slice(1),a]}else{r.push(a)}const t=r.reduce(((t,i)=>t+i))/r.length;console.debug(`Paint rate: ${a}fps`);console.debug(`Paint rate (avg): ${t}`);a=undefined}}),1e3)}return s=>{c();return t.measure((async()=>{const t=await i(s);a=a==null?1:a+1;return t})).finally((()=>l()))}}function Oi(){let t=[];function i(i){if(i!=null){const s=i.copy({correlationIds:[...i.correlationIds,...t.filter((t=>!i.correlationIds.includes(t)))]});t=[];return s}return i}function s(){let t=-1;return async i=>{if(i.frame.sequenceNumber>t){const s=await ji(i.frame.image.imageBytes);t=i.frame.sequenceNumber;return s}}}function n(){let t=-1;return async(i,s)=>{var n;if(s!=null&&i.frame.sequenceNumber>t){t=i.frame.sequenceNumber;(n=i.beforeDraw)===null||n===void 0?void 0:n.call(i);Li(s,i);s.dispose();return i.frame}s===null||s===void 0?void 0:s.dispose()}}const e=s();const o=n();return async s=>{var n,h;const a=(h=(n=s.predicate)===null||n===void 0?void 0:n.call(s))!==null&&h!==void 0?h:true;t=[...t,...s.frame.correlationIds];if(a){return e(s).then((t=>o(s,t).then(i)))}}}function Ki(t){return i=>{var s;const n=(s=i.request.requestId)===null||s===void 0?void 0:s.value;if(n!=null){t(n)(i)}}}function Hi(t){return i=>{const{drawFrame:s}=i.request;if(s!=null){t(s)(i)}}}const Ni=1*60;function Fi(t){let i=false;return s=>{const n=t();if(n!=null){const t=n.remoteTime(new Date(Date.now()));const e=p(s,t);const o=w(e).getTime();if(o>=0){return e}else{if(!i){console.warn(`Possible erroneous send to receive timing. Muting for ${Ni}s. [sent-at=${s.toISOString()}, received-at=${t.toISOString()}, remote-time=${n.knownRemoteTime.toISOString()}]`);i=true;setTimeout((()=>i=false),Ni*1e3)}return undefined}}}}function Wi(t,i){const s=Fi(i);return Ki((i=>Hi((n=>n=>{const e=w(n.sentAtTime);if(e!=null){t.replyResult(i,{drawFrame:{sendToReceiveDuration:s(e)}})}}))))}var qi=H();const Ui=b.defineMapper(b.read(b.requiredProp("d"),b.requiredProp("ns"),b.mapRequiredProp("ka",st),b.mapRequiredProp("kd",st),b.mapRequiredProp("ks",st),b.mapRequiredProp("ke",st)),(([t,i,s,n,e,o])=>({opacity:t,glossiness:i,ambient:s,diffuse:n,specular:e,emissive:o})));const Ji=b.defineMapper(b.read(b.mapRequiredProp("defaultMaterial",(()=>Ct)),b.mapRequiredProp("colorMaterial",Ui)),(([t,i])=>({defaultMaterial:t,colorMaterial:i})));const _i=b.defineMapper(b.read(b.requiredProp("name"),b.requiredProp("category")),(([t,i])=>({name:t,category:i})));const Gi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"string",value:t})));const Xi=b.mapProp("string",b.ifDefined(Gi));const Zi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"long",value:t})));const Yi=b.mapProp("pb_long",b.ifDefined(Zi));const Qi=b.defineMapper(b.read(b.getProp("value")),(([t])=>({type:"double",value:t})));const ts=b.mapProp("pb_double",b.ifDefined(Qi));const is=b.defineMapper(b.read(b.requiredProp("value")),(([t])=>({type:"timestamp",value:t})));const ss=b.mapProp("date",b.ifDefined(is));const ns=b.compose(b.pickFirst(Xi,Yi,ts,ss),b.required("value"));const es=b.defineMapper(b.read(b.requiredProp("id"),b.mapProp("key",b.ifDefined(_i)),b.mapProp("value",b.ifDefined(ns))),(([t,i,s])=>({id:t,key:i,value:s})));const os=b.defineMapper(b.read(b.mapProp("cursor",nt),b.mapRequiredProp("entriesList",b.mapArray(es))),(([t,i])=>({paging:{next:t},entries:i})));const hs=b.ifInvalidThrow(os);const as=b.defineMapper(b.read(b.mapRequiredProp("id",_),b.mapRequiredProp("createdAt",et),b.mapProp("materialOverride",b.ifDefined(Ji)),b.mapProp("transform",b.ifDefined(ot)),b.mapProp("isVisible",b.ifDefined(ht)),b.mapProp("isSelected",b.ifDefined(ht)),b.mapProp("isPhantom",b.ifDefined(ht)),b.mapProp("endItem",b.ifDefined(ht))),(([t,i,s,n,e,o,h,a])=>({id:t,createdAt:i,materialOverride:s,transform:n,isVisible:e,isSelected:o,isPhantom:h,endItem:a})));const rs=b.defineMapper(b.read(b.mapRequiredProp("id",_),b.mapRequiredProp("createdAt",et),b.mapRequiredProp("name",X),b.mapProp("parentId",b.ifDefined(_)),b.mapProp("suppliedId",b.ifDefined(X)),b.mapProp("boundingBox",b.ifDefined(at)),b.mapProp("worldTransform",b.ifDefined(ot)),b.mapProp("override",b.ifDefined(as))),(([t,i,s,n,e,o,h,a])=>({id:t,createdAt:i,name:s,parentId:n!==null&&n!==void 0?n:undefined,suppliedId:e,boundingBox:o,worldTransform:h,override:a})));const cs=b.ifInvalidThrow(b.defineMapper(b.read(b.mapProp("item",b.ifDefined(rs))),(([t])=>t!==null&&t!==void 0?t:undefined)));class ls{constructor(t,i,s){this.client=t;this.jwtProvider=i;this.deviceIdProvider=s}async getSceneViewItem(t,i,s){const n=await N((async n=>{const e=this.deviceIdProvider();const o=await F(this.jwtProvider,e);const h=new K.GetSceneViewItemRequest;h.setSceneItemId(bt(t));h.setViewId(bt(i));const a=new qi.FieldMask;if(s.includeBoundingBox){a.addPaths("bounding_box")}if(s.includeWorldTransform){a.addPaths("world_transform")}if(s.includeOverride){a.addPaths("override")}h.setAdditionalFields(a);this.client.getSceneViewItem(h,o,n)}));return cs(n.toObject())}async listSceneItemMetadata(t,i){const s=await N((async s=>{const n=this.deviceIdProvider();const e=await F(this.jwtProvider,n);const o=new K.ListSceneItemMetadataRequest;o.setItemId(bt(t));const h=new E.Pager;if(i.size!=null){h.setLimit(i.size)}if(i.cursor!=null){h.setCursor(i.cursor)}o.setPager(h);this.client.listSceneItemMetadata(o,e,s)}));return hs(s.toObject())}}var ds;(function(t){t["DEVICE_ID"]="vertexvis:device-id"})(ds||(ds={}));function us(){if(typeof window==="undefined"){throw new Error("Local storage is not available.")}return window.localStorage}function fs(t,i,s=us()){const n=s.getItem(t);if(n!=null){const e={...JSON.parse(n),...i};s.setItem(t,JSON.stringify(e))}else{s.setItem(t,JSON.stringify(i))}}function ps(t,i,s=us()){const n=s.getItem(t);if(n!=null){return i(JSON.parse(n))}}function ws(t,i,s,n){return P.retry((()=>{if(!t.aborted){return i()}return Promise.resolve(s)}),n)}class ms extends m{constructor(t,i={}){var s,n,e,o,h;super(t,{loggingEnabled:i.loggingEnabled});this.state={type:"disconnected"};this.stateChanged=new C;this.dimensions=u.create(0,0);this.streamAttributes={};this.enableTemporalRefinement=(s=i.enableTemporalRefinement)!==null&&s!==void 0?s:true;this.frameBgColor=S.create(255,255,255);this.config=At("platprod");this.options={tokenRefreshOffsetInSeconds:(n=i.tokenRefreshOffsetInSeconds)!==null&&n!==void 0?n:30,offlineThresholdInSeconds:(e=i.offlineThresholdInSeconds)!==null&&e!==void 0?e:30,loadTimeoutInSeconds:(o=i.loadTimeoutInSeconds)!==null&&o!==void 0?o:15,enableTemporalRefinement:(h=i.enableTemporalRefinement)!==null&&h!==void 0?h:true}}isPaused(){return this.pausedState!=null}getState(){return this.state}disconnect(){if(this.state.type!=="disconnected"&&this.state.type!=="connection-failed"){console.debug("Disconnecting websocket");this.state.connection.dispose();this.updateState({type:"disconnected"})}}async load(t,i,s,n=At("platprod"),e){this.clientId=i;this.deviceId=s;this.config=n;if(this.state.type==="disconnected"){await this.loadIfDisconnected(t,e)}else if(this.state.type==="connection-failed"){await this.loadIfDisconnected(t,e)}else{await this.loadIfConnectingOrConnected(t,this.state,e)}return this.state}update(t){this.frameBgColor=t.frameBgColor?t.frameBgColor:this.frameBgColor;if(t.dimensions!=null&&!I(t.dimensions,this.dimensions)){this.dimensions=t.dimensions;this.ifState("connected",(()=>this.updateDimensions({dimensions:this.getDimensions()})))}const i=!I(this.streamAttributes,t.streamAttributes);if(t.streamAttributes!=null&&i){this.streamAttributes=t.streamAttributes;this.ifState("connected",(()=>this.updateStream({streamAttributes:vs(this.streamAttributes)})))}if(t.enableTemporalRefinement!=null&&t.enableTemporalRefinement!==this.enableTemporalRefinement){this.enableTemporalRefinement=t.enableTemporalRefinement;if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}}pause(){if(this.state.type==="connected"){this.pausedState=this.state;console.debug(`Stream paused [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);this.disconnect()}}async resume(){if(this.pausedState!=null){console.debug(`Stream resumed [stream-id=${this.pausedState.streamId}, scene-id=${this.pausedState.sceneId}, scene-view-id=${this.pausedState.sceneViewId}]`);await this.connectToExistingStream(this.pausedState);this.pausedState=undefined}}async loadIfConnectingOrConnected(t,i,s){var n;const{resource:e,subResource:o}=i.resource;const h=Pt(t);const a=!k.isEqual(e,h.resource);const r=!k.isEqual(o,h.subResource);const c=i.type==="connecting"||i.type==="reconnecting";const l=i.type==="connected";if(a||c&&r){this.disconnect();return this.loadIfDisconnected(t)}else if(l&&r&&((n=h.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"){const t=h.queries.find((t=>t.type==="supplied-id"));const n={...h.subResource.id!=null?{sceneViewStateId:{hex:h.subResource.id}}:{},...t!=null?{sceneViewStateSuppliedId:{value:t.id}}:{},...s!=null?{cameraType:ys(s)}:{}};await this.loadSceneViewState(n);this.updateState({...i,resource:h})}}async loadIfDisconnected(t,i){try{await this.connectWithNewStream(Pt(t),i)}catch(t){if(t instanceof B){this.updateState({type:"connection-failed",message:`Cannot load scene. ${t.message}`,error:t})}else if(t instanceof v){this.updateState({type:"connection-failed",message:`Cannot load scene. Stream request failed to start stream.`,error:t})}else{this.updateState({type:"connection-failed",message:`Cannot load scene for unknown reason. See console logs.`,error:t})}throw t}}connectWithNewStream(t,i){return this.openWebsocketStream(t,"connecting",(()=>this.requestNewStream(t,i)))}connectToExistingStream(t){return this.openWebsocketStream(t.resource,"reconnecting",(()=>this.requestReconnectStream(t)),{maxRetries:Number.POSITIVE_INFINITY})}async openWebsocketStream(t,i,s,{maxRetries:n=3}={}){var e;const o=Cs(Ps(this.config,t.resource,this.clientId,this.deviceId));console.debug(`Initiating WS connection [uri=${o.url}]`);(e=this.abortController)===null||e===void 0?void 0:e.abort();const h=new AbortController;this.abortController=h;const a=bs(this.config);this.updateState({type:i,resource:t,connection:{dispose:()=>{this.dispose();h.abort()}}});const r=await P.abort(h.signal,ws(h.signal,(()=>this.connect(o,a)),{dispose:()=>{}},{maxRetries:n,delaysInMs:ms.WS_RECONNECT_DELAYS})).catch((t=>{throw new R("Websocket connection failed.",t instanceof Error?t:undefined)}));if(!r.aborted){return this.requestNewOrExistingStream(t,r.result,s)}else{this.updateState({type:"disconnected"})}}async requestNewOrExistingStream(t,i,s){const n=this.requestClock();const e=await s();console.debug(`Stream connected [stream-id=${e.streamId}, scene-id=${e.sceneId}, scene-view-id=${e.sceneViewId}]`);const o=this.onRequest((t=>{const i=t.request.drawFrame;if(i!=null){const t=dt(e.worldOrientation)(i);if(this.state.type==="connected"){if(t.depthBufferBytes!=null||this.state.frame.temporalRefinementCorrelationId!==t.temporalRefinementCorrelationId){this.updateState({...this.state,frame:t,fallbackDepthBufferBytes:t.depthBufferBytes})}else{this.updateState({...this.state,frame:t.copy({depthBufferBytes:this.state.fallbackDepthBufferBytes})})}}}}));const h=this.reconnectWhenNeeded();const a=this.refreshTokenWhenExpired(e.token);const r=this.acknowledgeFrameRequests();const c=e.frame==null?await this.waitForFrame(e.worldOrientation,this.options.loadTimeoutInSeconds):e.frame;const l=await n;console.debug(`Synchronized clocks [local-time=${l.knownLocalTime.toISOString()}, remote-time=${l.knownRemoteTime.toISOString()}]`);this.updateState({type:"connected",connection:{dispose:()=>{h.dispose();o.dispose();a.dispose();r.dispose();i.dispose()}},resource:t,streamId:e.streamId,deviceId:e.deviceId,sceneId:e.sceneId,sceneViewId:e.sceneViewId,worldOrientation:e.worldOrientation,token:e.token,frame:c,clock:l,fallbackDepthBufferBytes:undefined})}async requestNewStream(t,i){var s,n;const e=t.queries.find((t=>t.type==="supplied-id"));const o=ut(await this.startStream({streamKey:{value:t.resource.id},dimensions:this.getDimensions(),frameBackgroundColor:gs(this.frameBgColor),clientSupportsTemporalRefinement:this.enableTemporalRefinement,streamAttributes:vs(this.streamAttributes),sceneViewStateId:((s=t.subResource)===null||s===void 0?void 0:s.type)==="scene-view-state"&&t.subResource.id!=null?{hex:t.subResource.id}:undefined,sceneViewStateSuppliedId:((n=t.subResource)===null||n===void 0?void 0:n.type)==="scene-view-state"&&e!=null?{value:e.id}:undefined,cameraType:i!=null?ys(i):undefined}));return{resource:t,streamId:o.streamId,sceneId:o.sceneId,sceneViewId:o.sceneViewId,deviceId:o.sessionId,token:o.token,worldOrientation:o.worldOrientation,frame:undefined,fallbackDepthBufferBytes:undefined}}async requestReconnectStream(t){const i=ft(await this.reconnect({streamId:{hex:t.streamId},dimensions:this.getDimensions(),frameBackgroundColor:gs(this.frameBgColor),streamAttributes:vs(this.streamAttributes),clientSupportsTemporalRefinement:this.enableTemporalRefinement}));return{...t,token:i.token}}async requestClock(){const t=pt(await this.syncTime({requestTime:g()}));return new St(t)}reconnectWhenNeeded(){const t=this.onClose((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}));const i=this.onRequest((t=>{const i=t.request.gracefulReconnection!=null;if(i&&this.state.type==="connected"){console.debug("Received request for graceful reconnect. Closing connection and attempting reconnect.");this.closeAndReconnect(this.state)}}));const s=this.reconnectWhenOffline();return{dispose:()=>{t.dispose();i.dispose();s.dispose()}}}refreshTokenWhenExpired(t){let i;const s=t=>{const{tokenRefreshOffsetInSeconds:n}=this.options;const e=t.remainingTimeInMs(n);i=window.setTimeout((async()=>{const t=await this.refreshToken();const i=wt(t);s(i);if(this.state.type==="connected"){this.updateState({...this.state,token:i})}}),e)};s(t);return{dispose:()=>clearTimeout(i)}}reconnectWhenOffline(){let t;const i=()=>window.clearTimeout(t);const s=()=>{i();const s=this.options.offlineThresholdInSeconds;console.debug(`Detected that host is offline. Will attempt reconnect in ${s}s.`);t=window.setTimeout((()=>{if(this.state.type==="connected"){this.closeAndReconnect(this.state)}}),s*1e3)};const n=()=>{console.debug("Detected that host is online.");i()};const e=()=>s();window.addEventListener("offline",e);window.addEventListener("online",n);return{dispose:()=>{i();window.removeEventListener("offline",e);window.removeEventListener("online",n)}}}closeAndReconnect(t){t.connection.dispose();return this.connectToExistingStream(t)}async waitForFrame(t,i){let s;try{return await P.timeout(i*1e3,new Promise((i=>{s=this.onRequest((n=>{try{const s=n.request.drawFrame;if(s!=null){const n=dt(t)(s);i(n)}}finally{s===null||s===void 0?void 0:s.dispose()}}))})))}catch(t){throw new j(`Frame timed out after ${i}s`,t instanceof Error?t:undefined)}finally{s===null||s===void 0?void 0:s.dispose()}}acknowledgeFrameRequests(){return this.onRequest(Wi(this,(()=>this.state.type==="connected"?this.state.clock:undefined)))}updateState(t){if(this.state!==t){this.state=t;this.stateChanged.emit(this.state)}}getDimensions(){if(u.area(this.dimensions)===0){return u.create(1,1)}return this.dimensions}ifState(t,i){if(this.state.type===t){return i()}}onStateChanged(t){return this.stateChanged.on(t)}}ms.WS_RECONNECT_DELAYS=[0,1e3,1e3,5e3];const vs=b.ifInvalidThrow(rt);const gs=b.ifInvalidThrow(ct);const ys=b.ifInvalidThrow(lt);function bs(t){return{EXPERIMENTAL_frameDelivery:{...t.EXPERIMENTAL_frameDelivery,rateLimitingEnabled:t.flags.throttleFrameDelivery},EXPERIMENTAL_adaptiveRendering:{...t.EXPERIMENTAL_adaptiveRendering,enabled:t.flags.adaptiveRendering},EXPERIMENTAL_qualityOfService:{...t.EXPERIMENTAL_qualityOfService}}}function Cs(t){return{url:T.toString(t),protocols:["ws.vertexvis.com"]}}function Ps(t,i,s,n){if(s!=null){return T.appendPath(T.toString(T.parseAndAddParams("/ws",{clientId:s,deviceId:n})),T.parse(t.network.renderingHost))}else{return T.appendPath(`/stream-keys/${i.id}/session`,T.parse(t.network.renderingHost))}}class Ss{constructor(t){this.callback=t;this.handleVisibilityChange=this.handleVisibilityChange.bind(this);this.emitVisibilityChange=this.emitVisibilityChange.bind(this);this.mutationObservers=[]}isVisible(t){if("checkVisibility"in t){return t.checkVisibility({visibilityProperty:true,opacityProperty:true})}return true}observe(t){this.targetElement=t;this.watchElementVisibility(t)}unobserve(){if(this.targetElement!=null){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}this.targetElement=undefined}disconnect(){this.mutationObservers.forEach((t=>t.disconnect()));this.mutationObservers=[]}watchElementVisibility(t){if(t!=null){const i=new MutationObserver(this.handleVisibilityChange);i.observe(t,{attributes:true,attributeFilter:["style","class","hidden"]});this.mutationObservers=[...this.mutationObservers,i];this.watchElementVisibility(t.parentElement)}}handleVisibilityChange(){if(this.targetElement!=null){this.emitVisibilityChange(this.targetElement)}}emitVisibilityChange(t){const i=t!=null?this.isVisible(t):true;console.debug(`Detected visibility change [visible={${i}}]`);this.callback(i)}}const Is=15e3;function ks(t){return t.getBoundingClientRect()}function Ts(t,i){const s=window.getComputedStyle(t);const n=s.getPropertyValue(i);return n!==""?n:undefined}const As=()=>`:host{--image-background:var(--image-background);--viewer-background:var(--viewer-background);display:block;position:relative;width:300px;height:300px;min-width:1px;min-height:1px;user-select:none;-webkit-user-select:none}.canvas-container{display:flex;justify-content:center;align-items:center;width:100%;height:100%;position:relative}.enable-pointer-events{touch-action:none}.viewer-container{width:100%;height:100%;overflow:hidden}.error-message{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}`;const Ds=class{constructor(s){t(this,s);this.tap=i(this,"tap");this.doubletap=i(this,"doubletap");this.longpress=i(this,"longpress");this.frameReceived=i(this,"frameReceived");this.frameDrawn=i(this,"frameDrawn");this.tokenExpired=i(this,"tokenExpired");this.connectionChange=i(this,"connectionChange");this.sceneReady=i(this,"sceneReady");this.sceneChanged=i(this,"sceneChanged");this.interactionStarted=i(this,"interactionStarted");this.interactionFinished=i(this,"interactionFinished");this.cameraTypeChanged=i(this,"cameraTypeChanged");this.annotationStateChanged=i(this,"annotationStateChanged");this.deviceIdChange=i(this,"deviceIdChange");this.dimensionschange=i(this,"dimensionschange");this.configEnv="platprod";this.cameraControls=true;this.cameraType="perspective";this.keyboardControls=true;this.rotateAroundTapPoint=true;this.phantom={opacity:.1};this.noDefaultLights=false;this.enableTemporalRefinement=true;this.experimentalRenderingOptions="";this.crossSectioning={endCapEnabled:true,endCapColor:undefined};this.resizeDebounce=100;this.viewport=Bt.fromDimensions(u.create(0,0));this.experimentalSkipVisibilityCheck=false;this.stateMap={cursorManager:new Dt,streamState:{type:"disconnected"}};this.isVisible=false;this.frameRenderVersion=0;this.interactionHandlers=[];this.defaultInteractionHandlerDisposables=[];this.tapKeyInteractions=[];this.defaultTapKeyInteractions=[];this.internalFrameDrawnDispatcher=new C;this.handleUpdateStreamAttributesWithTimer=()=>{const t=50;if(this.streamAttributesUpdateTimer==null){this.streamAttributesUpdateTimer=setTimeout((()=>{this.streamAttributesUpdateTimer=undefined;this.updateStreamAttributes()}),t)}};this.handleElementResize=this.handleElementResize.bind(this);this.handleVisibilityChange=this.handleVisibilityChange.bind(this)}connectedCallback(){var t,i,s;(t=this.stencilBuffer)!==null&&t!==void 0?t:this.stencilBuffer=new $t(this.hostElement);this.visibilityObserver=new Ss(this.handleVisibilityChange);this.isVisible=this.visibilityObserver.isVisible(this.hostElement);if(!this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.observe(this.hostElement)}(s=this.stream)===null||s===void 0?void 0:s.resume()}componentWillLoad(){var t;this.updateResolvedConfig();this.calculateComponentDimensions();this.resizeObserver=new ResizeObserver(this.handleElementResize);this.registerSlotChangeListeners();const i=this.getResolvedConfig();const s=new f.SceneViewAPIClient(i.network.sceneViewHost);this.annotations=new Jt(s,(()=>this.token),(()=>this.deviceId));this.annotations.onStateChange.on((t=>{this.annotationStateChanged.emit(t);const i=Object.keys(t.annotations).length;this.handleAnnotationSetsChange(i)}));this.stream=(t=this.stream)!==null&&t!==void 0?t:new ms(new y,{loggingEnabled:i.flags.logWsMessages,enableTemporalRefinement:this.enableTemporalRefinement});this.addStreamListeners();this.modelViews=new It(s,this.stream,(()=>this.token),(()=>this.deviceId));this.pmi=new kt(s,(()=>this.token),(()=>this.deviceId));this.sceneItems=new ls(s,(()=>this.token),(()=>this.deviceId));this.canvases=new hi(s,(()=>this.token),(()=>this.deviceId));this.updateStreamAttributes();this.stateMap.cursorManager.onChanged.on((()=>this.handleCursorChanged()))}async componentDidLoad(){var t,i,s;this.interactionApi=this.createInteractionApi();this.isVisible=(i=(t=this.visibilityObserver)===null||t===void 0?void 0:t.isVisible(this.hostElement))!==null&&i!==void 0?i:true;if(this.canvasContainerElement!=null){(s=this.resizeObserver)===null||s===void 0?void 0:s.observe(this.canvasContainerElement)}this.loadOrResumeStream().catch((t=>{console.error("Error loading scene",t)}));await this.initializeDefaultInteractionHandlers();this.injectViewerApi()}disconnectedCallback(){var t,i,s;(t=this.visibilityObserver)===null||t===void 0?void 0:t.disconnect();(i=this.annotations)===null||i===void 0?void 0:i.disconnect();(s=this.stream)===null||s===void 0?void 0:s.pause()}render(){var t;return s(n,{key:"74a819b1bfe60df7eed430e8b1fcab1da2c6d615"},s("div",{key:"0433589e2d8bcd48a768be1c6fc5e64156b3c721",ref:t=>this.viewerContainerElement=t,class:"viewer-container",style:{cursor:xt((t=this.cursor)!==null&&t!==void 0?t:"")},onContextMenu:t=>t.preventDefault()},s("div",{key:"21c1a73f5829d61492930fc383f90b2ace08ee90",ref:t=>this.canvasContainerElement=t,class:D("canvas-container",{"enable-pointer-events ":window.PointerEvent!=null})},s("canvas",{key:"ce9d22609bdef1ab64363cd453867b2d46fff855",ref:t=>{this.canvasElement=t;this.stateMap.interactionTarget=t},class:"canvas"}),this.errorMessage!=null?s("div",{class:"error-message"},this.errorMessage):null),s("slot",{key:"7b06932ad3ed6ebec1ed1a8ce433a7b61ba75720"})))}async dispatchFrameDrawn(t){this.frame=t;this.internalFrameDrawnDispatcher.emit(t);this.frameDrawn.emit(t)}async registerInteractionHandler(t){this.interactionHandlers.push(t);this.initializeInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerBasicInteractionHandler(t){this.interactionHandlers.push(t);this.initializeBasicInteractionHandler(t);return{dispose:()=>{const i=this.interactionHandlers.indexOf(t);if(i!==-1){this.interactionHandlers[i].dispose();this.interactionHandlers.splice(i,1)}}}}async registerTapKeyInteraction(t){this.tapKeyInteractions=[...this.tapKeyInteractions,t]}async getInteractionTarget_DEPRECATED(){if(this.stateMap.interactionTarget!=null){return this.stateMap.interactionTarget}else throw new Error("Interaction target is undefined.")}async addCursor(t,i){return this.stateMap.cursorManager.add(t,i)}async getInteractionHandlers(){return this.interactionHandlers}async getKeyInteractions(){return this.tapKeyInteractions}async getBaseInteractionHandler(){return this.baseInteractionHandler}async getJwt(){return this.token}handleSrcChanged(t){if(t!=null){this.load(t,{cameraType:this.cameraType})}else{this.unload()}}handleCameraControlsChanged(){this.initializeDefaultCameraInteractionHandlers()}handleKeyboardControlsChanged(){this.initializeDefaultKeyboardInteractionHandlers()}handleRotateAboutTapPointChanged(){var t,i;this.updateStreamAttributes();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}else{(i=this.baseInteractionHandler)===null||i===void 0?void 0:i.setPrimaryInteractionType("rotate")}}handleCameraTypeChanged(t,i){if(t!==i){this.updateCameraType()}}handleStreamAttributesChanged(){this.handleUpdateStreamAttributesWithTimer()}handleEnableTemporalRefinementChanged(){this.updateEnableTemporalRefinement()}handleConfigChanged(){this.updateResolvedConfig()}handleConfigEnvChanged(){this.updateResolvedConfig()}async load(t,i){var s,n;const e=this.experimentalSkipVisibilityCheck||this.isVisible;if(!e){console.debug("Detected the viewer is hidden. Delaying load until visible.");return}if(this.stream!=null&&this.dimensions!=null){const{EXPERIMENTAL_annotationPollingIntervalInMs:e}=this.getResolvedConfig();this.calculateComponentDimensions();this.stream.update({streamAttributes:this.getStreamAttributes(),config:At(this.configEnv,this.config),dimensions:this.dimensions,frameBgColor:this.getBackgroundColor()});const o=await((s=this.stream)===null||s===void 0?void 0:s.load(t,this.clientId,this.getDeviceId(),this.getResolvedConfig(),i===null||i===void 0?void 0:i.cameraType));if(o.type==="connected"){this.sceneReady.emit();if(e!==undefined){(n=this.annotations)===null||n===void 0?void 0:n.connect(e)}}}else{throw new z("Cannot load scene. Viewer has not been initialized.")}}async unload(){var t;if(this.stream!=null){this.frameRenderVersion+=1;(t=this.annotations)===null||t===void 0?void 0:t.disconnect();this.stream.disconnect();this.frame=undefined;this.errorMessage=undefined}if(this.canvasElement!=null){const t=this.canvasElement.getContext("2d");if(t!=null){t.clearRect(0,0,this.canvasElement.width,this.canvasElement.height)}}}async reload(){if(this.src!=null){await this.unload();await this.load(this.src,{cameraType:this.cameraType})}}async scene(){return this.createScene()}async isSceneReady(){return this.stateMap.streamState.type==="connected"}async handleTapEvent(t){this.tapKeyInteractions.filter((i=>i.predicate(t.detail))).forEach((i=>i.fn(t.detail)))}emitConnectionChange(t){if(t.status==="connected"){if(t.jwt.length===0){throw new L("JWT is empty")}}if(!this.hostElement.isConnected){return}this.connectionChange.emit(t)}handleElementResize(t){const i=t.length>0&&this.dimensions!=null&&!u.isEqual(t[0].contentRect,this.viewport);if(i){if(this.resizeTimer!=null){clearTimeout(this.resizeTimer);this.resizeTimer=undefined}if(!this.isResizing){this.resizeTimer=setTimeout((()=>{this.isResizing=true;this.isResizeUpdate=true;this.recalculateComponentDimensions()}),this.resizeDebounce)}}}handleVisibilityChange(t){var i;this.isVisible=t;if(this.isVisible){(i=this.visibilityObserver)===null||i===void 0?void 0:i.disconnect();this.loadOrResumeStream()}}async loadOrResumeStream(){var t,i,s;const n=(i=(t=this.stream)===null||t===void 0?void 0:t.isPaused())!==null&&i!==void 0?i:false;if(this.src!=null&&!n){await this.load(this.src,{cameraType:this.cameraType})}else if(n){(s=this.stream)===null||s===void 0?void 0:s.resume()}}registerSlotChangeListeners(){this.mutationObserver=new MutationObserver((t=>this.injectViewerApi()));this.mutationObserver.observe(this.hostElement,{childList:true,subtree:true});this.styleObserver=new MutationObserver((t=>this.syncViewerStyles()));this.styleObserver.observe(this.hostElement,{attributes:true,attributeFilter:["style"]})}injectViewerApi(){function t(t){return Array.from(t.querySelectorAll("*"))}const i=t(this.hostElement);i.filter((t=>t.nodeName.startsWith("VERTEX-"))).reduce(((i,s)=>[...i,s,...t(s)]),[]).forEach((t=>{t.viewer=this.hostElement}))}syncViewerStyles(){var t;const i=this.getBackgroundColor();(t=this.stream)===null||t===void 0?void 0:t.update({frameBgColor:i,streamAttributes:this.getStreamAttributes()})}calculateComponentDimensions(){var t;const i=2073600;const s=this.getBounds();if((s===null||s===void 0?void 0:s.width)!=null&&(s===null||s===void 0?void 0:s.height)!=null){const n=u.create(s.width,s.height);const e=u.scaleFit(i,n);this.hostDimensions=n;this.dimensions=e!=null?u.create(e.width,e.height):undefined;this.viewport=Bt.fromDimensions((t=this.getCanvasDimensions())!==null&&t!==void 0?t:u.create(0,0))}}recalculateComponentDimensions(){var t;if(this.isResizing){this.calculateComponentDimensions();this.isResizing=false;if(((t=this.stream)===null||t===void 0?void 0:t.getState().type)==="connected"){this.updateDimensions(this.dimensions)}}}reportPerformance(t){if(this.stateMap.streamState.type==="connected"){const i={timings:t.map((t=>({receiveToPaintDuration:p(t.duration)})))};this.getStream().recordPerformance(i,false)}}addStreamListeners(){this.stateMap.streamListeners=this.getStream().stateChanged.on((t=>{this.handleStreamStateChanged(this.stateMap.streamState,t)}))}handleStreamStateChanged(t,i){this.stateMap.streamState=i;if(i.type==="connecting"){this.handleConnecting(t,i)}else if(i.type==="connected"){this.handleConnected(t,i)}else if(i.type==="connection-failed"){this.handleConnectionFailed(t,i)}else if(i.type==="disconnected"){this.handleDisconnected(t,i)}}handleConnecting(t,i){if(t.type!=="connecting"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"connecting"})}}handleConnected(t,i){var s;this.token=i.token.token;if(t.type!=="connected"){this.errorMessage=undefined;this.canvasRenderer=$i(xi,Oi(),this.getResolvedConfig().flags.logFrameRate,(t=>this.reportPerformance(t)));this.emitConnectionChange({status:"connected",jwt:i.token.token});this.deviceIdChange.emit(i.deviceId)}if(((s=this.frame)===null||s===void 0?void 0:s.getId())!==i.frame.getId()){this.updateFrame(i.frame)}this.updateDimensions(this.dimensions)}handleConnectionFailed(t,i){if(t.type!=="connection-failed"){this.token=undefined;this.errorMessage=i.message;this.emitConnectionChange({status:"connection-failed",errorMessage:i.message})}}handleDisconnected(t,i){if(t.type!=="disconnected"){this.token=undefined;this.errorMessage=undefined;this.emitConnectionChange({status:"disconnected"})}}updateDimensions(t){var i;(i=this.stream)===null||i===void 0?void 0:i.update({dimensions:t});this.dimensionschange.emit(t)}async updateFrame(t){var i;const s=this.getCanvasDimensions();const n=this.frameRenderVersion;if(this.canvasElement!=null&&s!=null&&((i=this.frame)===null||i===void 0?void 0:i.getId())!==t.getId()){const i=this.canvasElement.getContext("2d");if(i!=null){const e=this.frame;this.frame=mt(t,e);this.updateInteractionApi(e);const o={canvas:i,canvasDimensions:s,dimensions:this.dimensions,frame:this.frame,viewport:this.viewport,beforeDraw:()=>{this.updateCanvasDimensions(s);this.isResizeUpdate=false},predicate:()=>{if(this.isResizeUpdate){return this.dimensions==null||u.isEqual(this.dimensions,o.frame.image.imageAttr.frameDimensions)}return true}};this.frameReceived.emit(this.frame);if(this.frame.scene.hasChanged){this.sceneChanged.emit()}const h=await this.canvasRenderer(o);if(h!=null&&n===this.frameRenderVersion){this.updateViewerBackground();this.dispatchFrameDrawn(h)}}}}updateViewerBackground(){const t=this.getBackgroundColor();zt((()=>{var i,s;(i=this.viewerContainerElement)===null||i===void 0?void 0:i.style.setProperty("background",t!=null?S.toHexString(t):"#ffffff");(s=this.canvasContainerElement)===null||s===void 0?void 0:s.style.setProperty("background",t!=null?S.toHexString(t):"#ffffff")}))}async initializeDefaultInteractionHandlers(){var t;await this.initializeDefaultCameraInteractionHandlers();await this.initializeDefaultTapInteractionHandler();this.initializeDefaultKeyboardInteractionHandlers();if(this.rotateAroundTapPoint){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setPrimaryInteractionType("rotate-point")}}clearDefaultCameraInteractionHandlers(){this.defaultInteractionHandlerDisposables.forEach((t=>t.dispose()));this.defaultInteractionHandlerDisposables=[]}clearDefaultKeyboardInteractions(){this.defaultTapKeyInteractions.forEach((t=>{const i=this.tapKeyInteractions.indexOf(t);if(i!==-1){this.tapKeyInteractions.splice(i,1)}}));this.tapKeyInteractions=[]}async initializeDefaultCameraInteractionHandlers(){var t,i;this.clearDefaultCameraInteractionHandlers();if(this.cameraControls){if(window.PointerEvent!=null){this.baseInteractionHandler=(t=this.baseInteractionHandler)!==null&&t!==void 0?t:new Ii((()=>this.getResolvedConfig()));const i=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new Si);this.defaultInteractionHandlerDisposables=[i,s]}else{this.baseInteractionHandler=(i=this.baseInteractionHandler)!==null&&i!==void 0?i:new bi((()=>this.getResolvedConfig()));const t=await this.registerInteractionHandler(this.baseInteractionHandler);const s=await this.registerInteractionHandler(new Ti);this.defaultInteractionHandlerDisposables=[t,s]}}}initializeDefaultKeyboardInteractionHandlers(){var t;this.clearDefaultKeyboardInteractions();if(this.keyboardControls&&this.stream!=null){(t=this.baseInteractionHandler)===null||t===void 0?void 0:t.setDefaultKeyboardControls(this.keyboardControls);const i=new ai(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()));const s=new ui(this.stream,(()=>this.getResolvedConfig()),(()=>this.getImageScale()),(()=>this.createScene()));this.registerTapKeyInteraction(i);this.registerTapKeyInteraction(s);this.defaultTapKeyInteractions=[i,s]}}async initializeDefaultTapInteractionHandler(){if(this.tapHandlerDisposable==null){if(window.PointerEvent!=null){const t=new ki("pointerdown","pointerup","pointermove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}else{const t=new ki("mousedown","mouseup","mousemove",(()=>this.getResolvedConfig()));this.tapHandlerDisposable=await this.registerInteractionHandler(t)}}}initializeInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new V("Cannot initialize interaction handler. Interaction target is undefined.")}if(this.interactionApi==null){throw new V("Cannot initialize interaction handler. Interaction APi is undefined.")}t.initialize(this.stateMap.interactionTarget,this.interactionApi)}initializeBasicInteractionHandler(t){if(this.stateMap.interactionTarget==null){throw new V("Cannot initialize interaction handler. Interaction target is undefined.")}t.initialize(this.stateMap.interactionTarget)}createInteractionApi(){if(this.stream==null){throw new $("Cannot create interaction API. Component has not been initialized.")}return this.frame==null||this.frame.scene.camera.isPerspective()?new di(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished):new ci(this.stream,this.stateMap.cursorManager,(()=>this.getResolvedConfig().interactions),(()=>this.createScene()),(()=>this.frame),(()=>this.viewport),this.tap,this.doubletap,this.longpress,this.interactionStarted,this.interactionFinished)}handleCursorChanged(){window.requestAnimationFrame((()=>{this.cursor=this.stateMap.cursorManager.getActiveCursor()}))}async createScene(){const t=await this.waitForConnectedState();const i=vt();const{frame:s,sceneId:n,sceneViewId:e,worldOrientation:o}=t;return new Tt(this.getStream(),s,dt(o),i,(()=>this.getImageScale()),this.viewport,n,e)}getBackgroundColor(){if(this.canvasContainerElement!=null){const t=Ts(this.hostElement,"--image-background");const i=Ts(this.hostElement,"--viewer-background");const s=t!==null&&t!==void 0?t:i;return s!=null?S.fromCss(s):S.create(255,255,255)}}getBounds(){return ks(this.hostElement)}getCanvasDimensions(){return this.getResolvedConfig().flags.letterboxFrames?this.dimensions:this.hostDimensions}getImageScale(){const t=this.getCanvasDimensions();if(this.dimensions!=null&&t!=null){return o.create(this.dimensions.width/t.width,this.dimensions.height/t.height)}}getStreamAttributes(){return{depthBuffers:this.getDepthBufferStreamAttributesValue(),experimentalRenderingOptions:this.experimentalRenderingOptions,featureHighlighting:this.featureHighlighting,featureLines:this.featureLines,featureMaps:this.featureMaps,frames:{frameBackgroundColor:this.getBackgroundColor()},noDefaultLights:this.noDefaultLights,phantom:this.phantom,sceneComparison:this.sceneComparison,selectionHighlighting:this.selectionHighlighting,crossSectioning:this.crossSectioning}}updateCanvasDimensions(t){if(this.canvasElement!=null){this.canvasElement.width=t.width;this.canvasElement.height=t.height}}updateStreamAttributes(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({streamAttributes:this.getStreamAttributes()})}updateEnableTemporalRefinement(){var t;(t=this.stream)===null||t===void 0?void 0:t.update({enableTemporalRefinement:this.enableTemporalRefinement})}updateInteractionApi(t){if(this.frame!=null){const i=(t==null||t.scene.camera.isPerspective())&&this.frame.scene.camera.isOrthographic();const s=(t==null||t.scene.camera.isOrthographic())&&this.frame.scene.camera.isPerspective();if(i||s){this.interactionApi=this.createInteractionApi();this.cameraType=this.frame.scene.camera.isPerspective()?"perspective":"orthographic";this.cameraTypeChanged.emit(this.cameraType);this.interactionHandlers.forEach((t=>this.initializeInteractionHandler(t)))}}}updateCameraType(){var t,i;if(this.frame!=null){if(this.cameraType==="orthographic"&&this.frame.scene.camera.isPerspective()){(t=this.stream)===null||t===void 0?void 0:t.replaceCamera({camera:it(gt(this.frame.scene.camera,this.frame.scene.boundingBox))})}else if(this.cameraType==="perspective"&&this.frame.scene.camera.isOrthographic()){(i=this.stream)===null||i===void 0?void 0:i.replaceCamera({camera:it(yt(this.frame.scene.camera))})}}}handleAnnotationSetsChange(t){if(t>0&&this.getDepthBufferStreamAttributesValue()==null){this.stateMap.depthBuffersOverrideForAnnotations=true;this.updateStreamAttributes()}else if(t===0&&this.stateMap.depthBuffersOverrideForAnnotations){this.stateMap.depthBuffersOverrideForAnnotations=false;this.updateStreamAttributes()}}getDepthBufferStreamAttributesValue(){var t;const i=(t=this.depthBuffers)!==null&&t!==void 0?t:this.rotateAroundTapPoint||this.stateMap.depthBuffersOverrideForAnnotations?"final":undefined;return i}updateResolvedConfig(){this.resolvedConfig=At(this.configEnv,this.config)}getResolvedConfig(){return Ms("Resolved config is undefined",(()=>this.resolvedConfig))}getStream(){return Ms("Stream is undefined",(()=>this.stream))}getDeviceId(){if(this.deviceId==null){try{this.deviceId=ps(ds.DEVICE_ID,(t=>t["device-id"]))}catch(t){console.warn("Cannot read device ID. Local storage is not supported.")}if(this.deviceId==null){this.deviceId=A.create();try{fs(ds.DEVICE_ID,{["device-id"]:this.deviceId})}catch(t){console.warn("Cannot write device ID. Local storage is not supported.")}}}return this.deviceId}async waitForConnectedState(){if(this.stateMap.streamState.type!=="connected"){console.debug("Stream was not in a connected state. Waiting for successful connection.");return new Promise(((t,i)=>{const s=this.getStream().onStateChanged((i=>{if(i.type==="connected"){t(i)}}));setTimeout((()=>{s.dispose();i(new Error("Timed out waiting for connected state."))}),Is)}))}return this.stateMap.streamState}get hostElement(){return e(this)}static get watchers(){return{src:[{handleSrcChanged:0}],cameraControls:[{handleCameraControlsChanged:0}],keyboardControls:[{handleKeyboardControlsChanged:0}],rotateAroundTapPoint:[{handleRotateAboutTapPointChanged:0}],cameraType:[{handleCameraTypeChanged:0}],crossSectioning:[{handleStreamAttributesChanged:0}],depthBuffers:[{handleStreamAttributesChanged:0}],experimentalRenderingOptions:[{handleStreamAttributesChanged:0}],featureHighlighting:[{handleStreamAttributesChanged:0}],featureLines:[{handleStreamAttributesChanged:0}],featureMaps:[{handleStreamAttributesChanged:0}],noDefaultLights:[{handleStreamAttributesChanged:0}],phantom:[{handleStreamAttributesChanged:0}],sceneComparison:[{handleStreamAttributesChanged:0}],selectionHighlighting:[{handleStreamAttributesChanged:0}],enableTemporalRefinement:[{handleEnableTemporalRefinementChanged:0}],config:[{handleConfigChanged:0}],configEnv:[{handleConfigEnvChanged:0}]}}};function Ms(t,i){const s=i();if(s!=null){return s}else throw new Error(t)}Ds.style=As();export{Ds as vertex_viewer};
5
- //# sourceMappingURL=p-5ccf054e.entry.js.map