@vertexvis/viewer 1.0.2-canary.3 → 1.0.2-canary.4

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 (501) hide show
  1. package/dist/cjs/config-20ozv4y8.js.map +1 -1
  2. package/dist/cjs/controller-BhcNbaX_.js.map +1 -1
  3. package/dist/cjs/controller-CSwG6gbQ.js.map +1 -1
  4. package/dist/cjs/cursors-BZmDRtaZ.js.map +1 -1
  5. package/dist/cjs/dom-BBil4aN3.js.map +1 -1
  6. package/dist/cjs/dom-CvGkFQon.js.map +1 -1
  7. package/dist/cjs/entities-D6kgGria.js.map +1 -1
  8. package/dist/cjs/geometry_pb-BTko2Wi0.js.map +1 -1
  9. package/dist/cjs/grpc-BsWFEUrc.js.map +1 -1
  10. package/dist/cjs/index.cjs.js.map +1 -1
  11. package/dist/cjs/model-C9WvOKYT.js.map +1 -1
  12. package/dist/cjs/model-D17EQTIh.js.map +1 -1
  13. package/dist/cjs/model-DAB4oD5n.js.map +1 -1
  14. package/dist/cjs/model-DkXCzhs_.js.map +1 -1
  15. package/dist/cjs/multiElementInteractionHandler-BHvRKVIp.js.map +1 -1
  16. package/dist/cjs/overlays-B-06bUbI.js.map +1 -1
  17. package/dist/cjs/queries-Da9I-xMf.js.map +1 -1
  18. package/dist/cjs/regl-component-HhKCyGQ3.js.map +1 -1
  19. package/dist/cjs/representation_pb-CrCGjlyP.js.map +1 -1
  20. package/dist/cjs/results-1wRRZiYG.js.map +1 -1
  21. package/dist/cjs/row-Cet6xXup.js.map +1 -1
  22. package/dist/cjs/stencil-Hsr_8Chs.js.map +1 -1
  23. package/dist/cjs/streamAttributes-D_J-W8-2.js.map +1 -1
  24. package/dist/cjs/templates-DvjgjnlO.js.map +1 -1
  25. package/dist/cjs/util-DIJSIQXH.js.map +1 -1
  26. package/dist/cjs/utils-CibrnHQ4.js.map +1 -1
  27. package/dist/cjs/utils-D8MbXbwO.js.map +1 -1
  28. package/dist/cjs/utils-qErVs2Vt.js.map +1 -1
  29. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +6 -8
  30. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  31. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  32. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js.map +1 -1
  33. package/dist/cjs/vertex-scene-tree.cjs.entry.js +2 -2
  34. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  35. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +2 -2
  36. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js.map +1 -1
  37. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  38. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js.map +1 -1
  39. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
  40. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js.map +1 -1
  41. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +1 -1
  42. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js.map +1 -1
  43. package/dist/cjs/vertex-viewer-icon.cjs.entry.js.map +1 -1
  44. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js.map +1 -1
  45. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js.map +1 -1
  46. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
  47. package/dist/cjs/vertex-viewer-markup.cjs.entry.js.map +1 -1
  48. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js.map +1 -1
  49. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js.map +1 -1
  50. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +2 -2
  51. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js.map +1 -1
  52. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js.map +1 -1
  53. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +2 -2
  54. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  55. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  56. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +1 -1
  57. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js.map +1 -1
  58. package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js.map +1 -1
  59. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +4 -5
  60. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  61. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +1 -1
  62. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js.map +1 -1
  63. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
  64. package/dist/cjs/vertex-viewer.cjs.entry.js +9 -5
  65. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  66. package/dist/cjs/viewport-CG1VYkIU.js.map +1 -1
  67. package/dist/collection/components/scene-tree/errors.js.map +1 -1
  68. package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
  69. package/dist/collection/components/scene-tree/lib/dom.js.map +1 -1
  70. package/dist/collection/components/scene-tree/lib/errors.js.map +1 -1
  71. package/dist/collection/components/scene-tree/lib/grpc.js.map +1 -1
  72. package/dist/collection/components/scene-tree/lib/handlers.js.map +1 -1
  73. package/dist/collection/components/scene-tree/lib/row.js.map +1 -1
  74. package/dist/collection/components/scene-tree/lib/viewer-ops.js.map +1 -1
  75. package/dist/collection/components/scene-tree/scene-tree.js +2 -2
  76. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  77. package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
  78. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js +1 -1
  79. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js.map +1 -1
  80. package/dist/collection/components/scene-tree-table-cell/utils.js.map +1 -1
  81. package/dist/collection/components/scene-tree-table-layout/lib/dom.js.map +1 -1
  82. package/dist/collection/components/scene-tree-table-layout/lib/window.js.map +1 -1
  83. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +5 -5
  84. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  85. package/dist/collection/components/viewer/utils.js.map +1 -1
  86. package/dist/collection/components/viewer/viewer.js +9 -5
  87. package/dist/collection/components/viewer/viewer.js.map +1 -1
  88. package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js +2 -2
  89. package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js.map +1 -1
  90. package/dist/collection/components/viewer-dom-element/utils.js.map +1 -1
  91. package/dist/collection/components/viewer-dom-element/viewer-dom-element.js +1 -1
  92. package/dist/collection/components/viewer-dom-element/viewer-dom-element.js.map +1 -1
  93. package/dist/collection/components/viewer-dom-group/utils.js.map +1 -1
  94. package/dist/collection/components/viewer-dom-group/viewer-dom-group.js +1 -1
  95. package/dist/collection/components/viewer-dom-group/viewer-dom-group.js.map +1 -1
  96. package/dist/collection/components/viewer-dom-renderer/renderer2d.js.map +1 -1
  97. package/dist/collection/components/viewer-dom-renderer/renderer3d.js.map +1 -1
  98. package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js.map +1 -1
  99. package/dist/collection/components/viewer-hit-result-indicator/lib/dom.js.map +1 -1
  100. package/dist/collection/components/viewer-hit-result-indicator/lib/indicator.js.map +1 -1
  101. package/dist/collection/components/viewer-hit-result-indicator/lib/plane.js.map +1 -1
  102. package/dist/collection/components/viewer-hit-result-indicator/lib/point.js.map +1 -1
  103. package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js +1 -1
  104. package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js.map +1 -1
  105. package/dist/collection/components/viewer-icon/viewer-icon.js.map +1 -1
  106. package/dist/collection/components/viewer-markup/markup-utils.js.map +1 -1
  107. package/dist/collection/components/viewer-markup/viewer-markup-components.js.map +1 -1
  108. package/dist/collection/components/viewer-markup/viewer-markup.js +1 -1
  109. package/dist/collection/components/viewer-markup/viewer-markup.js.map +1 -1
  110. package/dist/collection/components/viewer-markup-arrow/interactions.js.map +1 -1
  111. package/dist/collection/components/viewer-markup-arrow/utils.js.map +1 -1
  112. package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow-components.js.map +1 -1
  113. package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow.js.map +1 -1
  114. package/dist/collection/components/viewer-markup-circle/interactions.js.map +1 -1
  115. package/dist/collection/components/viewer-markup-circle/utils.js.map +1 -1
  116. package/dist/collection/components/viewer-markup-circle/viewer-markup-circle.js.map +1 -1
  117. package/dist/collection/components/viewer-markup-freeform/interactions.js.map +1 -1
  118. package/dist/collection/components/viewer-markup-freeform/utils.js.map +1 -1
  119. package/dist/collection/components/viewer-markup-freeform/viewer-markup-freeform.js.map +1 -1
  120. package/dist/collection/components/viewer-markup-tool/viewer-markup-tool.js.map +1 -1
  121. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details.js.map +1 -1
  122. package/dist/collection/components/viewer-measurement-distance/hitTest.js.map +1 -1
  123. package/dist/collection/components/viewer-measurement-distance/interactions.js.map +1 -1
  124. package/dist/collection/components/viewer-measurement-distance/utils.js.map +1 -1
  125. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js.map +1 -1
  126. package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js +1 -1
  127. package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js.map +1 -1
  128. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js +1 -1
  129. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js.map +1 -1
  130. package/dist/collection/components/viewer-measurement-precise/viewer-measurement-precise.js.map +1 -1
  131. package/dist/collection/components/viewer-pin-group/utils.js.map +1 -1
  132. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js +2 -2
  133. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js.map +1 -1
  134. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  135. package/dist/collection/components/viewer-pin-tool/utils.js.map +1 -1
  136. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js +1 -1
  137. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js.map +1 -1
  138. package/dist/collection/components/viewer-teleport-tool/viewer-teleport-tool.js.map +1 -1
  139. package/dist/collection/components/viewer-transform-widget/util.js +1 -2
  140. package/dist/collection/components/viewer-transform-widget/util.js.map +1 -1
  141. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget-components.js.map +1 -1
  142. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +3 -3
  143. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
  144. package/dist/collection/components/viewer-transform-widget/widget.js.map +1 -1
  145. package/dist/collection/components/viewer-view-cube/viewer-view-cube.js +1 -1
  146. package/dist/collection/components/viewer-view-cube/viewer-view-cube.js.map +1 -1
  147. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
  148. package/dist/collection/lib/annotations/controller.js.map +1 -1
  149. package/dist/collection/lib/canvases/controller.js.map +1 -1
  150. package/dist/collection/lib/canvases/mapper.js.map +1 -1
  151. package/dist/collection/lib/config.js.map +1 -1
  152. package/dist/collection/lib/cursors.js.map +1 -1
  153. package/dist/collection/lib/dom.js.map +1 -1
  154. package/dist/collection/lib/grpc.js.map +1 -1
  155. package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
  156. package/dist/collection/lib/interactions/flyToPartKeyInteraction.js.map +1 -1
  157. package/dist/collection/lib/interactions/flyToPositionKeyInteraction.js.map +1 -1
  158. package/dist/collection/lib/interactions/interactionApi.js.map +1 -1
  159. package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
  160. package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
  161. package/dist/collection/lib/interactions/mouseInteractionHandler.js.map +1 -1
  162. package/dist/collection/lib/interactions/mouseInteractions.js.map +1 -1
  163. package/dist/collection/lib/interactions/multiElementInteractionHandler.js.map +1 -1
  164. package/dist/collection/lib/interactions/multiPointerInteractionHandler.js.map +1 -1
  165. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
  166. package/dist/collection/lib/interactions/pointerInteractionHandler.js.map +1 -1
  167. package/dist/collection/lib/interactions/tapInteractionHandler.js.map +1 -1
  168. package/dist/collection/lib/interactions/touchInteractionHandler.js.map +1 -1
  169. package/dist/collection/lib/keyBinding.js.map +1 -1
  170. package/dist/collection/lib/mappers/annotation.js.map +1 -1
  171. package/dist/collection/lib/mappers/camera.js.map +1 -1
  172. package/dist/collection/lib/mappers/color.js.map +1 -1
  173. package/dist/collection/lib/mappers/colorMaterial.js.map +1 -1
  174. package/dist/collection/lib/mappers/corePb.js.map +1 -1
  175. package/dist/collection/lib/mappers/corePbJs.js.map +1 -1
  176. package/dist/collection/lib/mappers/frameStreaming.js.map +1 -1
  177. package/dist/collection/lib/mappers/geometry.js.map +1 -1
  178. package/dist/collection/lib/mappers/material.js.map +1 -1
  179. package/dist/collection/lib/mappers/pagination.js.map +1 -1
  180. package/dist/collection/lib/mappers/scalar.js.map +1 -1
  181. package/dist/collection/lib/mappers/streamAttributes.js.map +1 -1
  182. package/dist/collection/lib/markup/interactions.js.map +1 -1
  183. package/dist/collection/lib/measurement/controller.js.map +1 -1
  184. package/dist/collection/lib/measurement/entities.js.map +1 -1
  185. package/dist/collection/lib/measurement/interactions.js.map +1 -1
  186. package/dist/collection/lib/measurement/mapper.js.map +1 -1
  187. package/dist/collection/lib/measurement/model.js.map +1 -1
  188. package/dist/collection/lib/measurement/overlays.js.map +1 -1
  189. package/dist/collection/lib/measurement/results.js.map +1 -1
  190. package/dist/collection/lib/meters.js.map +1 -1
  191. package/dist/collection/lib/model-views/controller.js.map +1 -1
  192. package/dist/collection/lib/model-views/mapper.js.map +1 -1
  193. package/dist/collection/lib/pins/controller.js.map +1 -1
  194. package/dist/collection/lib/pins/interactions.js.map +1 -1
  195. package/dist/collection/lib/pmi/controller.js.map +1 -1
  196. package/dist/collection/lib/pmi/mapper.js.map +1 -1
  197. package/dist/collection/lib/rendering/canvas.js.map +1 -1
  198. package/dist/collection/lib/rendering/imageLoaders.js.map +1 -1
  199. package/dist/collection/lib/rendering/matrices.js.map +1 -1
  200. package/dist/collection/lib/rendering/timing.js.map +1 -1
  201. package/dist/collection/lib/rendering/utils.js.map +1 -1
  202. package/dist/collection/lib/rendering/vectors.js.map +1 -1
  203. package/dist/collection/lib/scene-items/controller.js.map +1 -1
  204. package/dist/collection/lib/scene-items/mapper.js.map +1 -1
  205. package/dist/collection/lib/scenes/camera.js.map +1 -1
  206. package/dist/collection/lib/scenes/cameraRenderResult.js.map +1 -1
  207. package/dist/collection/lib/scenes/colorMaterial.js.map +1 -1
  208. package/dist/collection/lib/scenes/crossSectioner.js.map +1 -1
  209. package/dist/collection/lib/scenes/mapper.js.map +1 -1
  210. package/dist/collection/lib/scenes/operations.js.map +1 -1
  211. package/dist/collection/lib/scenes/queries.js.map +1 -1
  212. package/dist/collection/lib/scenes/raycaster.js.map +1 -1
  213. package/dist/collection/lib/scenes/scene.js.map +1 -1
  214. package/dist/collection/lib/scenes/sceneOperationExecuteResult.js.map +1 -1
  215. package/dist/collection/lib/scenes/sceneViewStateLoader.js.map +1 -1
  216. package/dist/collection/lib/stencil.js.map +1 -1
  217. package/dist/collection/lib/storage.js.map +1 -1
  218. package/dist/collection/lib/stream/dispatcher.js.map +1 -1
  219. package/dist/collection/lib/stream/stream.js.map +1 -1
  220. package/dist/collection/lib/stream/utils.js.map +1 -1
  221. package/dist/collection/lib/teleportation/interactions.js.map +1 -1
  222. package/dist/collection/lib/templates.js.map +1 -1
  223. package/dist/collection/lib/token.js.map +1 -1
  224. package/dist/collection/lib/transforms/axis-lines.js.map +1 -1
  225. package/dist/collection/lib/transforms/axis-rotation.js.map +1 -1
  226. package/dist/collection/lib/transforms/axis-translation.js.map +1 -1
  227. package/dist/collection/lib/transforms/controller.js.map +1 -1
  228. package/dist/collection/lib/transforms/drawable.js.map +1 -1
  229. package/dist/collection/lib/transforms/hits.js.map +1 -1
  230. package/dist/collection/lib/transforms/line.js.map +1 -1
  231. package/dist/collection/lib/transforms/mesh.js.map +1 -1
  232. package/dist/collection/lib/transforms/shape.js.map +1 -1
  233. package/dist/collection/lib/transforms/transformation-delta.js.map +1 -1
  234. package/dist/collection/lib/transforms/util.js.map +1 -1
  235. package/dist/collection/lib/types/clippingPlanes.js.map +1 -1
  236. package/dist/collection/lib/types/depthBuffer.js.map +1 -1
  237. package/dist/collection/lib/types/featureMap.js.map +1 -1
  238. package/dist/collection/lib/types/flags.js.map +1 -1
  239. package/dist/collection/lib/types/frame.js.map +1 -1
  240. package/dist/collection/lib/types/frameCamera.js.map +1 -1
  241. package/dist/collection/lib/types/loadableResource.js.map +1 -1
  242. package/dist/collection/lib/types/orientation.js.map +1 -1
  243. package/dist/collection/lib/types/sceneViewStateIdentifier.js.map +1 -1
  244. package/dist/collection/lib/types/standardView.js.map +1 -1
  245. package/dist/collection/lib/types/stencilBuffer.js.map +1 -1
  246. package/dist/collection/lib/types/synchronizedClock.js.map +1 -1
  247. package/dist/collection/lib/types/viewport.js.map +1 -1
  248. package/dist/collection/lib/visibilityObserver.js.map +1 -1
  249. package/dist/collection/lib/volume-intersection/controller.js.map +1 -1
  250. package/dist/collection/lib/volume-intersection/interactions.js.map +1 -1
  251. package/dist/collection/lib/volume-intersection/model.js.map +1 -1
  252. package/dist/collection/lib/walk-mode/controller.js.map +1 -1
  253. package/dist/collection/lib/walk-mode/interactions.js.map +1 -1
  254. package/dist/collection/lib/walk-mode/model.js.map +1 -1
  255. package/dist/collection/lib/webgl/regl-component.js.map +1 -1
  256. package/dist/collection/testing/annotations.js.map +1 -1
  257. package/dist/collection/testing/canvases.js.map +1 -1
  258. package/dist/collection/testing/colors.js.map +1 -1
  259. package/dist/collection/testing/eventually.js.map +1 -1
  260. package/dist/collection/testing/fixtures.js.map +1 -1
  261. package/dist/collection/testing/grpc.js +3 -9
  262. package/dist/collection/testing/grpc.js.map +1 -1
  263. package/dist/collection/testing/modelViews.js.map +1 -1
  264. package/dist/collection/testing/pmi.js.map +1 -1
  265. package/dist/collection/testing/random.js.map +1 -1
  266. package/dist/collection/testing/resizeObserver.js.map +1 -1
  267. package/dist/collection/testing/scene-items-helper.js.map +1 -1
  268. package/dist/collection/testing/sceneTree.js.map +1 -1
  269. package/dist/collection/testing/viewer.js.map +1 -1
  270. package/dist/collection/testing/webgl.js.map +1 -1
  271. package/dist/components/index.js.map +1 -1
  272. package/dist/components/{p-St4ctu2K.js → p-3-bKfpqr.js} +2 -2
  273. package/dist/components/{p-St4ctu2K.js.map → p-3-bKfpqr.js.map} +1 -1
  274. package/dist/components/p-3DqRAYgO.js.map +1 -1
  275. package/dist/components/p-B-ToCp8-.js.map +1 -1
  276. package/dist/components/p-B156bTbY.js +5 -0
  277. package/dist/components/p-B156bTbY.js.map +1 -0
  278. package/dist/components/p-B9R0QWr4.js.map +1 -1
  279. package/dist/components/p-BCOD9yfw.js.map +1 -1
  280. package/dist/components/p-BHAaIoH5.js.map +1 -1
  281. package/dist/components/{p-Doltf1wO.js → p-BOJJZ1cN.js} +2 -2
  282. package/dist/components/p-BOJJZ1cN.js.map +1 -0
  283. package/dist/components/p-BkHp-aAR.js.map +1 -1
  284. package/dist/components/p-Bkm6H5uq.js.map +1 -1
  285. package/dist/components/p-C-VWDW9n.js.map +1 -1
  286. package/dist/components/p-C79PxobX.js.map +1 -1
  287. package/dist/components/p-CAugdB_8.js.map +1 -1
  288. package/dist/components/p-CEzVEgdQ.js.map +1 -1
  289. package/dist/components/p-CGCJ5hbJ.js.map +1 -1
  290. package/dist/components/p-COlcifvm.js.map +1 -1
  291. package/dist/components/p-CXTH3zrN.js.map +1 -1
  292. package/dist/components/p-CZCXdo3t.js.map +1 -1
  293. package/dist/components/p-Cd7kap5W.js.map +1 -1
  294. package/dist/components/p-CiSHWNC4.js.map +1 -1
  295. package/dist/components/p-CjG1fMh1.js.map +1 -1
  296. package/dist/components/p-CkjXRDNL.js.map +1 -1
  297. package/dist/components/p-D0KZu516.js.map +1 -1
  298. package/dist/components/p-D12q-fpW.js.map +1 -1
  299. package/dist/components/p-D33gVA2W.js.map +1 -1
  300. package/dist/components/p-DC86ZXai.js.map +1 -1
  301. package/dist/components/{p-B80hfIq6.js → p-DF4kEsJU.js} +2 -2
  302. package/dist/components/p-DF4kEsJU.js.map +1 -0
  303. package/dist/components/p-DRh4_Z-g.js.map +1 -1
  304. package/dist/components/p-DRnMrHWY.js.map +1 -1
  305. package/dist/components/{p-b0ZzPHz8.js → p-DUC59SSO.js} +2 -2
  306. package/dist/components/p-DUC59SSO.js.map +1 -0
  307. package/dist/components/p-DVW2WZTq.js.map +1 -1
  308. package/dist/components/p-DZI8pnGz.js.map +1 -1
  309. package/dist/components/p-Dbz9yUqC.js.map +1 -1
  310. package/dist/components/p-Yfi0i5Kj.js.map +1 -1
  311. package/dist/components/p-abSJ29r7.js.map +1 -1
  312. package/dist/components/p-ahjMltGJ.js.map +1 -1
  313. package/dist/components/p-bal2RLiw.js.map +1 -1
  314. package/dist/components/{p-BopQW1sA.js → p-oK38ynrd.js} +2 -2
  315. package/dist/components/p-oK38ynrd.js.map +1 -0
  316. package/dist/components/vertex-scene-tree-table-cell.js +1 -1
  317. package/dist/components/vertex-scene-tree-table-cell.js.map +1 -1
  318. package/dist/components/vertex-scene-tree-table-layout.js +1 -1
  319. package/dist/components/vertex-scene-tree.js +1 -1
  320. package/dist/components/vertex-scene-tree.js.map +1 -1
  321. package/dist/components/vertex-viewer-box-query-tool.js +1 -1
  322. package/dist/components/vertex-viewer-box-query-tool.js.map +1 -1
  323. package/dist/components/vertex-viewer-dom-element.js +1 -1
  324. package/dist/components/vertex-viewer-dom-group.js +1 -1
  325. package/dist/components/vertex-viewer-hit-result-indicator.js +1 -1
  326. package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -1
  327. package/dist/components/vertex-viewer-markup-tool.js.map +1 -1
  328. package/dist/components/vertex-viewer-markup.js +1 -1
  329. package/dist/components/vertex-viewer-markup.js.map +1 -1
  330. package/dist/components/vertex-viewer-measurement-details.js.map +1 -1
  331. package/dist/components/vertex-viewer-measurement-distance.js +1 -1
  332. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -1
  333. package/dist/components/vertex-viewer-measurement-line.js +1 -1
  334. package/dist/components/vertex-viewer-measurement-overlays.js +1 -1
  335. package/dist/components/vertex-viewer-measurement-precise.js +1 -1
  336. package/dist/components/vertex-viewer-measurement-precise.js.map +1 -1
  337. package/dist/components/vertex-viewer-pin-group.js +1 -1
  338. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  339. package/dist/components/vertex-viewer-pin-tool.js.map +1 -1
  340. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  341. package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
  342. package/dist/components/vertex-viewer-view-cube.js +1 -1
  343. package/dist/components/vertex-viewer-view-cube.js.map +1 -1
  344. package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
  345. package/dist/components/vertex-viewer.js +1 -1
  346. package/dist/components/vertex-viewer.js.map +1 -1
  347. package/dist/esm/config-lglER3mU.js.map +1 -1
  348. package/dist/esm/controller-BMWGs-I6.js.map +1 -1
  349. package/dist/esm/controller-Iymb_J2R.js.map +1 -1
  350. package/dist/esm/cursors-BbBDEutb.js.map +1 -1
  351. package/dist/esm/dom-B3m2VjbN.js.map +1 -1
  352. package/dist/esm/dom-DX6pEG54.js.map +1 -1
  353. package/dist/esm/entities-zRken6VS.js.map +1 -1
  354. package/dist/esm/geometry_pb-BiZRfctN.js.map +1 -1
  355. package/dist/esm/grpc-CZAYqbTu.js.map +1 -1
  356. package/dist/esm/index.js.map +1 -1
  357. package/dist/esm/model-BYW5YIye.js.map +1 -1
  358. package/dist/esm/model-CLtwOS0o.js.map +1 -1
  359. package/dist/esm/model-D0EJdHmW.js.map +1 -1
  360. package/dist/esm/model-DHJ5aE4y.js.map +1 -1
  361. package/dist/esm/multiElementInteractionHandler-DwjL-r55.js.map +1 -1
  362. package/dist/esm/overlays-BE1oqniA.js.map +1 -1
  363. package/dist/esm/queries-DEzCmbTD.js.map +1 -1
  364. package/dist/esm/regl-component-DmkowWhg.js.map +1 -1
  365. package/dist/esm/representation_pb-g4f0WC4k.js.map +1 -1
  366. package/dist/esm/results-CFB6nKu8.js.map +1 -1
  367. package/dist/esm/row-CiSHWNC4.js.map +1 -1
  368. package/dist/esm/stencil-BV-7pO4q.js.map +1 -1
  369. package/dist/esm/streamAttributes-Cp8PEH9A.js.map +1 -1
  370. package/dist/esm/templates-DRh4_Z-g.js.map +1 -1
  371. package/dist/esm/util-BCZZYmp4.js.map +1 -1
  372. package/dist/esm/utils-BvZ9-fs0.js.map +1 -1
  373. package/dist/esm/utils-DC86ZXai.js.map +1 -1
  374. package/dist/esm/utils-D_pIldrS.js.map +1 -1
  375. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +6 -8
  376. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  377. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  378. package/dist/esm/vertex-scene-tree-table-cell.entry.js.map +1 -1
  379. package/dist/esm/vertex-scene-tree.entry.js +2 -2
  380. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  381. package/dist/esm/vertex-viewer-box-query-tool.entry.js +2 -2
  382. package/dist/esm/vertex-viewer-box-query-tool.entry.js.map +1 -1
  383. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  384. package/dist/esm/vertex-viewer-dom-element_2.entry.js.map +1 -1
  385. package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
  386. package/dist/esm/vertex-viewer-dom-group.entry.js.map +1 -1
  387. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +1 -1
  388. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js.map +1 -1
  389. package/dist/esm/vertex-viewer-icon.entry.js.map +1 -1
  390. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js.map +1 -1
  391. package/dist/esm/vertex-viewer-markup-tool.entry.js.map +1 -1
  392. package/dist/esm/vertex-viewer-markup.entry.js +1 -1
  393. package/dist/esm/vertex-viewer-markup.entry.js.map +1 -1
  394. package/dist/esm/vertex-viewer-measurement-details.entry.js.map +1 -1
  395. package/dist/esm/vertex-viewer-measurement-distance.entry.js.map +1 -1
  396. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +2 -2
  397. package/dist/esm/vertex-viewer-measurement-line_2.entry.js.map +1 -1
  398. package/dist/esm/vertex-viewer-measurement-precise.entry.js.map +1 -1
  399. package/dist/esm/vertex-viewer-pin-group.entry.js +2 -2
  400. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  401. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  402. package/dist/esm/vertex-viewer-pin-tool.entry.js +1 -1
  403. package/dist/esm/vertex-viewer-pin-tool.entry.js.map +1 -1
  404. package/dist/esm/vertex-viewer-teleport-tool.entry.js.map +1 -1
  405. package/dist/esm/vertex-viewer-transform-widget.entry.js +4 -5
  406. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  407. package/dist/esm/vertex-viewer-view-cube.entry.js +1 -1
  408. package/dist/esm/vertex-viewer-view-cube.entry.js.map +1 -1
  409. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
  410. package/dist/esm/vertex-viewer.entry.js +9 -5
  411. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  412. package/dist/esm/viewport-C8WQZxvx.js.map +1 -1
  413. package/dist/types/regl-shape.d.ts +1 -1
  414. package/dist/viewer/index.esm.js.map +1 -1
  415. package/dist/viewer/{p-eac63070.entry.js → p-051b5154.entry.js} +2 -2
  416. package/dist/viewer/p-051b5154.entry.js.map +1 -0
  417. package/dist/viewer/{p-3d3a7eeb.entry.js → p-0984c51f.entry.js} +2 -2
  418. package/dist/viewer/{p-3d3a7eeb.entry.js.map → p-0984c51f.entry.js.map} +1 -1
  419. package/dist/viewer/{p-864f40c7.entry.js → p-11cf755a.entry.js} +2 -2
  420. package/dist/viewer/p-11cf755a.entry.js.map +1 -0
  421. package/dist/viewer/{p-29d14611.entry.js → p-16775f7d.entry.js} +2 -2
  422. package/dist/viewer/p-16775f7d.entry.js.map +1 -0
  423. package/dist/viewer/{p-5a85cae5.entry.js → p-1eb636f8.entry.js} +2 -2
  424. package/dist/viewer/p-1eb636f8.entry.js.map +1 -0
  425. package/dist/viewer/{p-e993f300.entry.js → p-228d1d43.entry.js} +2 -2
  426. package/dist/viewer/p-228d1d43.entry.js.map +1 -0
  427. package/dist/viewer/p-33f44cc1.entry.js.map +1 -1
  428. package/dist/viewer/{p-3300d3dc.entry.js → p-35601c85.entry.js} +2 -2
  429. package/dist/viewer/p-35601c85.entry.js.map +1 -0
  430. package/dist/viewer/p-47766566.entry.js.map +1 -1
  431. package/dist/viewer/p-6e3a6bbd.entry.js.map +1 -1
  432. package/dist/viewer/p-7f388b45.entry.js.map +1 -1
  433. package/dist/viewer/p-89544066.entry.js.map +1 -1
  434. package/dist/viewer/{p-07b99ac9.entry.js → p-8c369777.entry.js} +2 -2
  435. package/dist/viewer/p-8c369777.entry.js.map +1 -0
  436. package/dist/viewer/{p-e59983dc.entry.js → p-9835c5e2.entry.js} +2 -2
  437. package/dist/viewer/p-9835c5e2.entry.js.map +1 -0
  438. package/dist/viewer/{p-aa95e21a.entry.js → p-9d8ff406.entry.js} +2 -2
  439. package/dist/viewer/p-9d8ff406.entry.js.map +1 -0
  440. package/dist/viewer/p-BDvACHun.js.map +1 -1
  441. package/dist/viewer/p-BIkuvTVH.js.map +1 -1
  442. package/dist/viewer/p-BRPkbTVP.js.map +1 -1
  443. package/dist/viewer/p-BsBIynwj.js.map +1 -1
  444. package/dist/viewer/p-BxtKMwBH.js.map +1 -1
  445. package/dist/viewer/p-C4y4Noe-.js.map +1 -1
  446. package/dist/viewer/p-C6KrfydC.js.map +1 -1
  447. package/dist/viewer/p-C7dYsPFU.js.map +1 -1
  448. package/dist/viewer/p-C9Cqbq6H.js.map +1 -1
  449. package/dist/viewer/p-CVWO4w6b.js.map +1 -1
  450. package/dist/viewer/p-ChqXy0cG.js.map +1 -1
  451. package/dist/viewer/p-CiSHWNC4.js.map +1 -1
  452. package/dist/viewer/p-CjG1fMh1.js.map +1 -1
  453. package/dist/viewer/p-Cs5KOvOQ.js.map +1 -1
  454. package/dist/viewer/p-CyGlYje2.js.map +1 -1
  455. package/dist/viewer/p-D6eJC1q4.js.map +1 -1
  456. package/dist/viewer/p-DC86ZXai.js.map +1 -1
  457. package/dist/viewer/p-DRh4_Z-g.js.map +1 -1
  458. package/dist/viewer/p-DUX5FvBC.js.map +1 -1
  459. package/dist/viewer/p-DX6pEG54.js.map +1 -1
  460. package/dist/viewer/p-D_ixWHO7.js.map +1 -1
  461. package/dist/viewer/p-DacE-wPp.js.map +1 -1
  462. package/dist/viewer/p-Dp56p_jX.js.map +1 -1
  463. package/dist/viewer/p-EsKoKfmx.js.map +1 -1
  464. package/dist/viewer/p-F8e15or2.js.map +1 -1
  465. package/dist/viewer/p-Jfxh0jq9.js.map +1 -1
  466. package/dist/viewer/p-WPRMWirY.js.map +1 -1
  467. package/dist/viewer/p-_93RRNxT.js.map +1 -1
  468. package/dist/viewer/p-a8a81cba.entry.js +5 -0
  469. package/dist/viewer/p-a8a81cba.entry.js.map +1 -0
  470. package/dist/viewer/p-a9282481.entry.js.map +1 -1
  471. package/dist/viewer/{p-63f4f702.entry.js → p-c7e62d66.entry.js} +2 -2
  472. package/dist/viewer/p-c7e62d66.entry.js.map +1 -0
  473. package/dist/viewer/p-d37e647b.entry.js.map +1 -1
  474. package/dist/viewer/{p-302f2078.entry.js → p-d9fe788f.entry.js} +2 -2
  475. package/dist/viewer/p-d9fe788f.entry.js.map +1 -0
  476. package/dist/viewer/p-e9b83dae.entry.js.map +1 -1
  477. package/dist/viewer/{p-70f3629d.entry.js → p-f271dc4a.entry.js} +2 -2
  478. package/dist/viewer/p-f271dc4a.entry.js.map +1 -0
  479. package/dist/viewer/p-f65c0769.entry.js.map +1 -1
  480. package/dist/viewer/viewer.esm.js +1 -1
  481. package/package.json +7 -7
  482. package/dist/components/p-B80hfIq6.js.map +0 -1
  483. package/dist/components/p-BopQW1sA.js.map +0 -1
  484. package/dist/components/p-DNtS2F8J.js +0 -5
  485. package/dist/components/p-DNtS2F8J.js.map +0 -1
  486. package/dist/components/p-Doltf1wO.js.map +0 -1
  487. package/dist/components/p-b0ZzPHz8.js.map +0 -1
  488. package/dist/viewer/p-07b99ac9.entry.js.map +0 -1
  489. package/dist/viewer/p-29d14611.entry.js.map +0 -1
  490. package/dist/viewer/p-302f2078.entry.js.map +0 -1
  491. package/dist/viewer/p-3300d3dc.entry.js.map +0 -1
  492. package/dist/viewer/p-5a85cae5.entry.js.map +0 -1
  493. package/dist/viewer/p-60c915e3.entry.js +0 -5
  494. package/dist/viewer/p-60c915e3.entry.js.map +0 -1
  495. package/dist/viewer/p-63f4f702.entry.js.map +0 -1
  496. package/dist/viewer/p-70f3629d.entry.js.map +0 -1
  497. package/dist/viewer/p-864f40c7.entry.js.map +0 -1
  498. package/dist/viewer/p-aa95e21a.entry.js.map +0 -1
  499. package/dist/viewer/p-e59983dc.entry.js.map +0 -1
  500. package/dist/viewer/p-e993f300.entry.js.map +0 -1
  501. package/dist/viewer/p-eac63070.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-markup-circle.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-circle/viewer-markup-circle.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,KAAK,EAEL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GACN,MAAM,eAAe,CAAC;AACvB,OAAO,EAAqB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAclE,MAAM,OAAO,kBAAkB;IAL/B;QA8BE;;;;;;WAMG;QAEI,SAAI,GAA2B,EAAE,CAAC;QAqBzC;;;;;;;;;;WAUG;QAEI,sBAAiB,GAA4B,MAAM,CAAC;QAW3D;;;;;WAKG;QAEI,UAAK,GAAG,CAAC,CAAC;QAsBT,uBAAkB,GAAG,IAAI,8BAA8B,CAC7D,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,cAAc,EACnB;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CACF,CAAC;QA8LM,4BAAuB,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC9D,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC;QAEM,qBAAgB,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,CAAC;KACH;IAnMC;;OAEG;IACO,iBAAiB;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACxC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAES,gBAAgB;QACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAES,oBAAoB;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAGM,KAAK,CAAC,OAAO;;QAClB,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QAEnC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAuB;;QACzD,MAAA,IAAI,CAAC,iBAAiB,0CAAE,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QAEnC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,iBAAiB,GAAG,MAAM,SAAS,CAAC,+BAA+B,CACtE,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACJ,CAAC;IACH,CAAC;IAGS,sBAAsB;QAC9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAGS,gBAAgB;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAMS,gCAAgC;QACxC,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;YAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;IACL,CAAC;IAGS,iBAAiB;QACzB,QAAQ,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAC3B,8BAA8B,EAC9B,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,cAAc;QACpB,MAAM,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;IAC5B,CAAC;IAEO,qBAAqB;;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,mCAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAEM,MAAM;;QACX,IACE,IAAI,CAAC,MAAM,IAAI,IAAI;YACnB,IAAI,CAAC,aAAa,IAAI,IAAI;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC;YACD,MAAM,cAAc,GAAG,qBAAqB,CAC1C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CACX,CAAC;YACF,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,CAAC,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,CAAC,mCAAI,CAAC,CAAC,GAAG,yBAAyB,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,CAAC,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,CAAC,mCAAI,CAAC,CAAC,GAAG,yBAAyB,EAAE,CAAC;YAEpE,OAAO,CACL,EAAC,IAAI;gBACH,WAAK,KAAK,EAAC,KAAK,EAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB;oBAClD;wBACE,EAAC,SAAS,IAAC,EAAE,EAAC,eAAe,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAI,CAC9C;oBACP,SACE,SAAS,EAAE,aAAa,OAAO,IAAI,OAAO,GAAG,EAC7C,MAAM,EAAC,qBAAqB;wBAE5B,eACE,KAAK,EAAC,SAAS,EACf,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,EAAE,EAAE,MAAM,CAAC,CAAC,EACZ,EAAE,EAAE,cAAc,CAAC,KAAK,GAAG,CAAC,EAC5B,EAAE,EAAE,cAAc,CAAC,MAAM,GAAG,CAAC,EAC7B,MAAM,EAAE,SAAS,kBACH,CAAC,EACf,IAAI,EAAE,MAAM,GACZ,CACA,CACA;gBACL,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CACvB,EAAC,aAAa,IACZ,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAClC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAChC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,EAEnD,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,EAEpD,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC5B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAE9C,6BAA6B,EAAE,CAAC,CAAC,EAAE,EAAE,CACnC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,EAEtD,8BAA8B,EAAE,CAAC,CAAC,EAAE,EAAE,CACpC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,EAEvD,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAEjD,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAE/C,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAEhD,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,GAEjD,CACH;gBACA,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CACzB,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACR,CACI,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CACL,EAAC,IAAI;gBACH,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACF,CACR,CAAC;QACJ,CAAC;IACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWF","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { BasicViewer, Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { CircleMarkupInteractionHandler } from './interactions';\nimport { parseBounds } from './utils';\nimport { BoundingBox2d } from './viewer-markup-circle-components';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupCircleMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupCircleMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-circle',\n styleUrl: 'viewer-markup-circle.css',\n shadow: true,\n})\nexport class ViewerMarkupCircle {\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupCircleMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupCircleElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new CircleMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd,\n {\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n }\n );\n\n private registeredHandler?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.handleScaleChange();\n this.handleScalingConfigurationChange();\n this.updateBoundsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updateBoundsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(newViewer?: BasicViewer): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n if (newViewer != null) {\n this.registeredHandler = await newViewer.registerBasicInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('bounds')\n protected handleBoundsJsonChange(): void {\n this.updateBoundsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n @Watch('scale')\n protected handleScalingConfigurationChange(): void {\n this.interactionHandler.updateScalingOptions({\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n });\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-circle-scale',\n this.scale.toString()\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updateBoundsFromProps(): void {\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (\n this.bounds != null &&\n this.elementBounds != null &&\n this.elementBounds.width > 0 &&\n this.elementBounds.height > 0\n ) {\n const relativeBounds = translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n );\n const center = Rectangle.center(relativeBounds);\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"circle-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#circle-shadow)\"\n >\n <ellipse\n class=\"ellipse\"\n cx={center.x}\n cy={center.y}\n rx={relativeBounds.width / 2}\n ry={relativeBounds.height / 2}\n stroke={'#000ff0'}\n stroke-width={4}\n fill={'none'}\n />\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox2d\n bounds={relativeBounds}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n"]}
1
+ {"version":3,"file":"viewer-markup-circle.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-circle/viewer-markup-circle.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { BasicViewer, Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { CircleMarkupInteractionHandler } from './interactions';\nimport { parseBounds } from './utils';\nimport { BoundingBox2d } from './viewer-markup-circle-components';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupCircleMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupCircleMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-circle',\n styleUrl: 'viewer-markup-circle.css',\n shadow: true,\n})\nexport class ViewerMarkupCircle {\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the circle. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a circle\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupCircleMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupCircleElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n private interactionHandler = new CircleMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd,\n {\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n },\n );\n\n private registeredHandler?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.handleScaleChange();\n this.handleScalingConfigurationChange();\n this.updateBoundsFromProps();\n }\n\n protected componentDidLoad(): void {\n this.updateBoundsFromProps();\n\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(newViewer?: BasicViewer): Promise<void> {\n this.registeredHandler?.dispose();\n this.registeredHandler = undefined;\n\n if (newViewer != null) {\n this.registeredHandler = await newViewer.registerBasicInteractionHandler(\n this.interactionHandler,\n );\n }\n }\n\n @Watch('bounds')\n protected handleBoundsJsonChange(): void {\n this.updateBoundsFromProps();\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n @Watch('scale')\n protected handleScalingConfigurationChange(): void {\n this.interactionHandler.updateScalingOptions({\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n });\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-circle-scale',\n this.scale.toString(),\n );\n });\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private updateBoundsFromProps(): void {\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (\n this.bounds != null &&\n this.elementBounds != null &&\n this.elementBounds.width > 0 &&\n this.elementBounds.height > 0\n ) {\n const relativeBounds = translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale,\n );\n const center = Rectangle.center(relativeBounds);\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"circle-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#circle-shadow)\"\n >\n <ellipse\n class=\"ellipse\"\n cx={center.x}\n cy={center.y}\n rx={relativeBounds.width / 2}\n ry={relativeBounds.height / 2}\n stroke={'#000ff0'}\n stroke-width={4}\n fill={'none'}\n />\n </g>\n </svg>\n {this.mode === 'edit' && (\n <BoundingBox2d\n bounds={relativeBounds}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/interactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EACL,wBAAwB,GAEzB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAEL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,OAAO,gCAAiC,SAAQ,wBAAwB;IAW5E,YACmB,QAA+C,EAC/C,gBAAoC,EACpC,cAA+C,EAChE,cAAuD;QAEvD,KAAK,CAAC,cAAc,CAAC,CAAC;QALL,aAAQ,GAAR,QAAQ,CAAuC;QAC/C,qBAAgB,GAAhB,gBAAgB,CAAoB;QACpC,mBAAc,GAAd,cAAc,CAAiC;QAL1D,WAAM,GAAgC,cAAc,CAAC;QA0HrD,gCAA2B,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAClE,IACE,IAAI,CAAC,mBAAmB,IAAI,IAAI;gBAChC,IAAI,CAAC,aAAa,IAAI,IAAI;gBAC1B,IAAI,CAAC,YAAY,IAAI,IAAI;gBACzB,IAAI,CAAC,YAAY,IAAI,IAAI,EACzB,CAAC;gBACD,MAAM,QAAQ,GAAG,wBAAwB,CACvC,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,IAAI,CAAC,cAAc,CAAC,iBAAiB,EACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;gBAEF,MAAM,aAAa,GAAG,kBAAkB,CACtC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,mBAAmB,EACxB,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,KAAK,CAAC,QAAQ,CACf,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,uBAAuB,CAC5C,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,YAAY,EACjB,aAAa,CACd,CAAC;gBACF,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,aAAa,CAAC;YACvC,CAAC;QACH,CAAC,CAAC;QAEM,+BAA0B,GAAG,CAAC,KAAmB,EAAQ,EAAE;YACjE,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC5E,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAEzE,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAE9B,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC;YACzD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC;IA1JF,CAAC;IAEM,UAAU,CACf,MAAmC,EACnC,KAAmB;QAEnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;YAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,mBAAmB,GAAG,wBAAwB,CACjD,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,EACjD,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,IAAI,CAAC,cAAc,CAAC,iBAAiB,EACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACzE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,KAAmB;QACzC,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAES,mBAAmB;QAC3B,OAAO,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAES,wBAAwB,CAAC,KAAmB;;QACpD,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;YACzB,IAAI,CAAC,SAAS,IAAI,IAAI;YACtB,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;YACjC,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,wBAAwB,CACvC,cAAc,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,IAAI,CAAC,cAAc,CAAC,iBAAiB,EACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,mCAAI,CAAC,QAAQ,CAAC,CAAC;YAE1D,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAES,qBAAqB,CAAC,KAAmB;QACjD,IACE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;YAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;YAC5B,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B,CAAC;YACD,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAG,wBAAwB,CACvC,cAAc,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,IAAI,CAAC,cAAc,CAAC,iBAAiB,EACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAES,oBAAoB,CAAC,KAAmB;QAChD,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;YACvC,IACE,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE;gBACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI;gBAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAC/B,IAAI,CAAC,aAAa,IAAI,IAAI,EAC1B,CAAC;gBACD,MAAM,cAAc,GAAG,sBAAsB,CAC3C,KAAK,EACL,IAAI,CAAC,aAAa,CACnB,CAAC;gBACF,MAAM,QAAQ,GAAG,wBAAwB,CACvC,cAAc,EACd,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,cAAc,CAAC,mBAAmB,EACvC,IAAI,CAAC,cAAc,CAAC,iBAAiB,EACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EACzB,IAAI,CAAC,cAAc,CAAC,MAAM,CAC3B,CAAC;gBAEF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBAE/B,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAE3D,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM,CAAC;gBACzD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC1E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC;YACnC,CAAC;YAED,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IA6CO,eAAe,CAAC,QAAqB;QAC3C,IAAI,CAAC,GAAG;YACN,IAAI,CAAC,GAAG,IAAI,IAAI;gBACd,CAAC,CAAC,KAAK,CAAC,MAAM,CACV,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CACjC;gBACH,CAAC,CAAC,QAAQ,CAAC;QACf,IAAI,CAAC,GAAG;YACN,IAAI,CAAC,GAAG,IAAI,IAAI;gBACd,CAAC,CAAC,KAAK,CAAC,MAAM,CACV,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CACjC;gBACH,CAAC,CAAC,QAAQ,CAAC;QACf,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CACrC,IAAI,CAAC,GAAG,CAAC,CAAC,EACV,IAAI,CAAC,GAAG,CAAC,CAAC,EACV,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EACvB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CACxB,CAAC;IACJ,CAAC;CACF","sourcesContent":["import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport {\n MarkupInteractionHandler,\n MarkupInteractionHandlerScalingOptions,\n} from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointsToBounds,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class FreeformMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private min?: Point.Point;\n private max?: Point.Point;\n\n private resizeBounds?: Rectangle.Rectangle;\n private resizePoints?: Point.Point[];\n private resizeStartPosition?: Point.Point;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupFreeformElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>,\n scalingOptions?: MarkupInteractionHandlerScalingOptions\n ) {\n super(scalingOptions);\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent\n ): void {\n if (this.markupEl.mode === 'edit' && this.elementBounds != null) {\n this.resizeBounds = this.markupEl.bounds;\n this.resizePoints = this.markupEl.points;\n this.anchor = anchor;\n this.resizeStartPosition = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset\n );\n\n window.addEventListener('pointermove', this.handleResizeInteractionMove);\n window.addEventListener('pointerup', this.handleResizeInteractionEnd);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset\n );\n this.updateMinAndMax(position);\n this.markupEl.points = this.markupEl.points ?? [position];\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.pointerId === event.pointerId &&\n this.markupEl.points != null &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset\n );\n this.updateMinAndMax(position);\n this.markupEl.points = [...this.markupEl.points, position];\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.points != null &&\n this.markupEl.points.length > 2 &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(\n event,\n this.elementBounds\n );\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset\n );\n\n this.updateMinAndMax(position);\n\n this.markupEl.points = [...this.markupEl.points, position];\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.points = undefined;\n }\n\n this.min = undefined;\n this.max = undefined;\n this.pointerId = undefined;\n }\n }\n\n private handleResizeInteractionMove = (event: PointerEvent): void => {\n if (\n this.resizeStartPosition != null &&\n this.elementBounds != null &&\n this.resizeBounds != null &&\n this.resizePoints != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset\n );\n\n const updatedBounds = transformRectangle(\n this.resizeBounds,\n this.resizeStartPosition,\n position,\n this.anchor,\n event.shiftKey\n );\n\n this.markupEl.points = translatePointsToBounds(\n this.resizePoints,\n this.resizeBounds,\n updatedBounds\n );\n this.markupEl.bounds = updatedBounds;\n }\n };\n\n private handleResizeInteractionEnd = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handleResizeInteractionMove);\n window.removeEventListener('pointerup', this.handleResizeInteractionEnd);\n\n this.resizeBounds = undefined;\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n };\n\n private updateMinAndMax(position: Point.Point): void {\n this.min =\n this.min != null\n ? Point.create(\n Math.min(this.min.x, position.x),\n Math.min(this.min.y, position.y)\n )\n : position;\n this.max =\n this.max != null\n ? Point.create(\n Math.max(this.max.x, position.x),\n Math.max(this.max.y, position.y)\n )\n : position;\n this.markupEl.bounds = Rectangle.create(\n this.min.x,\n this.min.y,\n this.max.x - this.min.x,\n this.max.y - this.min.y\n );\n }\n}\n"]}
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { EventEmitter } from '@stencil/core';\nimport { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getMouseClientPosition } from '../../lib/dom';\nimport {\n MarkupInteractionHandler,\n MarkupInteractionHandlerScalingOptions,\n} from '../../lib/markup/interactions';\nimport { MarkupInteraction } from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n BoundingBox2dAnchorPosition,\n transformRectangle,\n translatePointsToBounds,\n translatePointToRelative,\n} from '../viewer-markup/markup-utils';\n\nexport class FreeformMarkupInteractionHandler extends MarkupInteractionHandler {\n private pointerId?: number;\n private min?: Point.Point;\n private max?: Point.Point;\n\n private resizeBounds?: Rectangle.Rectangle;\n private resizePoints?: Point.Point[];\n private resizeStartPosition?: Point.Point;\n\n private anchor: BoundingBox2dAnchorPosition = 'bottom-right';\n\n public constructor(\n private readonly markupEl: HTMLVertexViewerMarkupFreeformElement,\n private readonly interactionBegin: EventEmitter<void>,\n private readonly interactionEnd: EventEmitter<MarkupInteraction>,\n scalingOptions?: MarkupInteractionHandlerScalingOptions,\n ) {\n super(scalingOptions);\n }\n\n public editAnchor(\n anchor: BoundingBox2dAnchorPosition,\n event: PointerEvent,\n ): void {\n if (this.markupEl.mode === 'edit' && this.elementBounds != null) {\n this.resizeBounds = this.markupEl.bounds;\n this.resizePoints = this.markupEl.points;\n this.anchor = anchor;\n this.resizeStartPosition = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset,\n );\n\n window.addEventListener('pointermove', this.handleResizeInteractionMove);\n window.addEventListener('pointerup', this.handleResizeInteractionEnd);\n }\n }\n\n public startInteraction(event: PointerEvent): void {\n this.handleInteractionAttempt(event);\n }\n\n protected computeBoundingRect(): DOMRect {\n return getMarkupBoundingClientRect(this.markupEl);\n }\n\n protected handleInteractionAttempt(event: PointerEvent): void {\n if (\n this.markupEl.mode !== '' &&\n this.pointerId == null &&\n this.elementBounds != null\n ) {\n this.pointerId = event.pointerId;\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset,\n );\n this.updateMinAndMax(position);\n this.markupEl.points = this.markupEl.points ?? [position];\n\n this.interactionBegin.emit();\n this.acceptInteraction();\n }\n }\n\n protected handleInteractionMove(event: PointerEvent): void {\n if (\n this.pointerId === event.pointerId &&\n this.markupEl.points != null &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(event, this.elementBounds);\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset,\n );\n this.updateMinAndMax(position);\n this.markupEl.points = [...this.markupEl.points, position];\n }\n }\n\n protected handleInteractionEnd(event: PointerEvent): void {\n if (this.pointerId === event.pointerId) {\n if (\n this.markupEl.mode !== '' &&\n this.markupEl.points != null &&\n this.markupEl.points.length > 2 &&\n this.elementBounds != null\n ) {\n const screenPosition = getMouseClientPosition(\n event,\n this.elementBounds,\n );\n const position = translatePointToRelative(\n screenPosition,\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset,\n );\n\n this.updateMinAndMax(position);\n\n this.markupEl.points = [...this.markupEl.points, position];\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n } else {\n this.markupEl.points = undefined;\n }\n\n this.min = undefined;\n this.max = undefined;\n this.pointerId = undefined;\n }\n }\n\n private handleResizeInteractionMove = (event: PointerEvent): void => {\n if (\n this.resizeStartPosition != null &&\n this.elementBounds != null &&\n this.resizeBounds != null &&\n this.resizePoints != null\n ) {\n const position = translatePointToRelative(\n getMouseClientPosition(event, this.elementBounds),\n this.elementBounds,\n this.scalingOptions.originatingViewport,\n this.scalingOptions.centeringBehavior,\n this.scalingOptions.scale,\n this.scalingOptions.offset,\n );\n\n const updatedBounds = transformRectangle(\n this.resizeBounds,\n this.resizeStartPosition,\n position,\n this.anchor,\n event.shiftKey,\n );\n\n this.markupEl.points = translatePointsToBounds(\n this.resizePoints,\n this.resizeBounds,\n updatedBounds,\n );\n this.markupEl.bounds = updatedBounds;\n }\n };\n\n private handleResizeInteractionEnd = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handleResizeInteractionMove);\n window.removeEventListener('pointerup', this.handleResizeInteractionEnd);\n\n this.resizeBounds = undefined;\n\n const newlyCreatedMarkup = this.markupEl.mode !== 'edit';\n this.interactionEnd.emit({ markup: this.markupEl, newlyCreatedMarkup });\n };\n\n private updateMinAndMax(position: Point.Point): void {\n this.min =\n this.min != null\n ? Point.create(\n Math.min(this.min.x, position.x),\n Math.min(this.min.y, position.y),\n )\n : position;\n this.max =\n this.max != null\n ? Point.create(\n Math.max(this.max.x, position.x),\n Math.max(this.max.y, position.y),\n )\n : position;\n this.markupEl.bounds = Rectangle.create(\n this.min.x,\n this.min.y,\n this.max.x - this.min.x,\n this.max.y - this.min.y,\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,UAAU,WAAW,CACzB,KAAyC;IAEzC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAgB,EAAE,EAAE,CACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACvC;QACH,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,EAAW;IAEX,OAAO,CACL,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,QAAQ,KAAK,+BAA+B,CAC7E,CAAC;AACJ,CAAC","sourcesContent":["import { Point } from '@vertexvis/geometry';\n\nexport function parsePoints(\n value: string | Point.Point[] | undefined\n): Point.Point[] | undefined {\n return typeof value === 'string'\n ? JSON.parse(value).map((values: number[]) =>\n Point.fromJson(JSON.stringify(values))\n )\n : value;\n}\n\nexport function isVertexViewerFreeformMarkup(\n el: unknown\n): el is HTMLVertexViewerMarkupFreeformElement {\n return (\n el instanceof HTMLElement && el.nodeName === 'VERTEX-VIEWER-MARKUP-FREEFORM'\n );\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAE5C,MAAM,UAAU,WAAW,CACzB,KAAyC;IAEzC,OAAO,OAAO,KAAK,KAAK,QAAQ;QAC9B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,MAAgB,EAAE,EAAE,CACzC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CACvC;QACH,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,EAAW;IAEX,OAAO,CACL,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,QAAQ,KAAK,+BAA+B,CAC7E,CAAC;AACJ,CAAC","sourcesContent":["import { Point } from '@vertexvis/geometry';\n\nexport function parsePoints(\n value: string | Point.Point[] | undefined,\n): Point.Point[] | undefined {\n return typeof value === 'string'\n ? JSON.parse(value).map((values: number[]) =>\n Point.fromJson(JSON.stringify(values)),\n )\n : value;\n}\n\nexport function isVertexViewerFreeformMarkup(\n el: unknown,\n): el is HTMLVertexViewerMarkupFreeformElement {\n return (\n el instanceof HTMLElement && el.nodeName === 'VERTEX-VIEWER-MARKUP-FREEFORM'\n );\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-markup-freeform.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/viewer-markup-freeform.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { BasicViewer, Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translatePointToScreen,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { parseBounds } from '../viewer-markup-circle/utils';\nimport { BoundingBox2d } from '../viewer-markup-circle/viewer-markup-circle-components';\nimport { FreeformMarkupInteractionHandler } from './interactions';\nimport { parsePoints } from './utils';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupFreeformMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupFreeformMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-freeform',\n styleUrl: 'viewer-markup-freeform.css',\n shadow: true,\n})\nexport class ViewerMarkupFreeform {\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public points?: Point.Point[];\n\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'points' })\n public pointsJson?: string;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupFreeformMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupFreeformElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private screenPoints: Point.Point[] = [];\n\n private interactionHandler = new FreeformMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd,\n {\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n }\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.handleScaleChange();\n this.handleScalingConfigurationChange();\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(newViewer?: BasicViewer): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction =\n await newViewer.registerBasicInteractionHandler(\n this.interactionHandler\n );\n }\n }\n\n @Watch('originatingViewport')\n @Watch('offset')\n @Watch('scale')\n @Watch('bounds')\n @Watch('points')\n protected recomputePointsFromProps(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n @Watch('scale')\n protected handleScalingConfigurationChange(): void {\n this.interactionHandler.updateScalingOptions({\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n });\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-freeform-scale',\n this.scale.toString()\n );\n });\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n this.screenPoints = this.convertPointsToScreen() ?? this.screenPoints;\n }\n\n private updatePointsFromProps(): void {\n this.points = this.points ?? parsePoints(this.pointsJson);\n this.screenPoints = this.convertPointsToScreen() ?? [];\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (\n this.screenPoints.length > 0 &&\n this.elementBounds != null &&\n this.elementBounds.width > 0 &&\n this.elementBounds.height > 0\n ) {\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"freeform-markup-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#freeform-markup-shadow)\"\n >\n <path\n class=\"path\"\n d={this.screenPoints.reduce(\n (d, pt) => `${d}L${pt.x},${pt.y}`,\n `M${this.screenPoints[0].x},${this.screenPoints[0].y}`\n )}\n fill=\"none\"\n />\n </g>\n </svg>\n {this.mode === 'edit' && this.bounds != null && (\n <BoundingBox2d\n bounds={translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n\n private convertPointsToScreen(): Point.Point[] | undefined {\n const elementBounds = this.elementBounds;\n if (elementBounds != null) {\n return this.points?.map((pt) =>\n translatePointToScreen(\n pt,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale\n )\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"viewer-markup-freeform.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-freeform/viewer-markup-freeform.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,OAAO,EACP,KAAK,EAEL,CAAC,EACD,IAAI,EACJ,MAAM,EACN,IAAI,EACJ,KAAK,EACL,KAAK,GACN,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AACxF,OAAO,EAAE,gCAAgC,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AActC,MAAM,OAAO,oBAAoB;IALjC;QAoDE;;;;;;WAMG;QAEI,SAAI,GAA6B,EAAE,CAAC;QAqB3C;;;;;;;;;;WAUG;QAEI,sBAAiB,GAA4B,MAAM,CAAC;QAW3D;;;;;WAKG;QAEI,UAAK,GAAG,CAAC,CAAC;QAuBT,iBAAY,GAAkB,EAAE,CAAC;QAEjC,uBAAkB,GAAG,IAAI,gCAAgC,CAC/D,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,cAAc,EACnB;YACE,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CACF,CAAC;QAgMM,4BAAuB,GAAG,CAAC,KAAmB,EAAQ,EAAE;YAC9D,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC;QAEM,qBAAgB,GAAG,CAAC,KAAiB,EAAQ,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE,CAAC;QACzB,CAAC,CAAC;KAgBH;IApNC;;OAEG;IACO,iBAAiB;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,gCAAgC,EAAE,CAAC;QACxC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAES,gBAAgB;QACxB,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAES,oBAAoB;QAC5B,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAGM,KAAK,CAAC,OAAO;;QAClB,MAAA,IAAI,CAAC,qBAAqB,0CAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC1E,CAAC;IAED;;OAEG;IAEO,KAAK,CAAC,mBAAmB,CAAC,SAAuB;;QACzD,MAAA,IAAI,CAAC,qBAAqB,0CAAE,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QAEvC,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,qBAAqB;gBACxB,MAAM,SAAS,CAAC,+BAA+B,CAC7C,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACN,CAAC;IACH,CAAC;IAOS,wBAAwB;QAChC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAMS,gCAAgC;QACxC,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;YAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;YAC7C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;SAC1C,CAAC,CAAC;IACL,CAAC;IAGS,iBAAiB;QACzB,QAAQ,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAC3B,gCAAgC,EAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CACtB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAGS,gBAAgB;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAEO,cAAc;;QACpB,MAAM,IAAI,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,MAAA,IAAI,CAAC,qBAAqB,EAAE,mCAAI,IAAI,CAAC,YAAY,CAAC;IACxE,CAAC;IAEO,qBAAqB;;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,mCAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,CAAC,YAAY,GAAG,MAAA,IAAI,CAAC,qBAAqB,EAAE,mCAAI,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAA,IAAI,CAAC,MAAM,mCAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAEM,MAAM;;QACX,IACE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YAC5B,IAAI,CAAC,aAAa,IAAI,IAAI;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAC7B,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,CAAC,mCAAI,CAAC,CAAC,GAAG,yBAAyB,EAAE,CAAC;YACpE,MAAM,OAAO,GAAG,CAAC,MAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,CAAC,mCAAI,CAAC,CAAC,GAAG,yBAAyB,EAAE,CAAC;YAEpE,OAAO,CACL,EAAC,IAAI;gBACH,WAAK,KAAK,EAAC,KAAK,EAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB;oBAClD;wBACE,EAAC,SAAS,IAAC,EAAE,EAAC,wBAAwB,EAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAI,CACvD;oBACP,SACE,SAAS,EAAE,aAAa,OAAO,IAAI,OAAO,GAAG,EAC7C,MAAM,EAAC,8BAA8B;wBAErC,YACE,KAAK,EAAC,MAAM,EACZ,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CACzB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EACjC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACvD,EACD,IAAI,EAAC,MAAM,GACX,CACA,CACA;gBACL,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,IAAI,CAC9C,EAAC,aAAa,IACZ,MAAM,EAAE,qBAAqB,CAC3B,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CACX,EACD,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAClC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAChC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,EAEnD,2BAA2B,EAAE,CAAC,CAAC,EAAE,EAAE,CACjC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,EAEpD,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC5B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAE9C,6BAA6B,EAAE,CAAC,CAAC,EAAE,EAAE,CACnC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC,CAAC,EAEtD,8BAA8B,EAAE,CAAC,CAAC,EAAE,EAAE,CACpC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC,EAEvD,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAEjD,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC7B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,EAE/C,wBAAwB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAEhD,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAC/B,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,GAEjD,CACH;gBACA,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CACzB,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACR,CACI,CACR,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CACL,EAAC,IAAI;gBACH,WACE,KAAK,EAAC,gBAAgB,EACtB,YAAY,EAAE,IAAI,CAAC,gBAAgB,GAC9B,CACF,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAYO,qBAAqB;;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACzC,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;YAC1B,OAAO,MAAA,IAAI,CAAC,MAAM,0CAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC7B,sBAAsB,CACpB,EAAE,EACF,aAAa,EACb,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,iBAAiB,EACtB,IAAI,CAAC,KAAK,CACX,CACF,CAAC;QACJ,CAAC;IACH,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\nimport { BasicViewer, Disposable } from '@vertexvis/utils';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { writeDOM } from '../../lib/stencil';\nimport {\n MarkupCenteringBehavior,\n MarkupInteraction,\n} from '../../lib/types/markup';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\nimport {\n isValidStartEvent,\n translatePointToScreen,\n translateRectToScreen,\n} from '../viewer-markup/markup-utils';\nimport { SvgShadow } from '../viewer-markup/viewer-markup-components';\nimport { parseBounds } from '../viewer-markup-circle/utils';\nimport { BoundingBox2d } from '../viewer-markup-circle/viewer-markup-circle-components';\nimport { FreeformMarkupInteractionHandler } from './interactions';\nimport { parsePoints } from './utils';\n\n/**\n * The supported markup modes.\n *\n * @see {@link ViewerMarkupFreeformMode.mode} - For more details about modes.\n */\nexport type ViewerMarkupFreeformMode = 'edit' | 'create' | '';\n\n@Component({\n tag: 'vertex-viewer-markup-freeform',\n styleUrl: 'viewer-markup-freeform.css',\n shadow: true,\n})\nexport class ViewerMarkupFreeform {\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public points?: Point.Point[];\n\n /**\n * The positions of the various points of this freeform markup. Can either be an array of\n * `Point`s or a JSON string representation in the format of `[[x1, y1], [x2, y2]]` or\n * `[{\"x\": 0, \"y\": 0}, {\"x\": 0, \"y\": 0}]`.\n *\n * Points are expected to be relative coordinates from `[-0.5, 0.5]`,\n * e.g. `[0, 0]` corresponds to a point in the center of the viewport.\n */\n @Prop({ attribute: 'points' })\n public pointsJson?: string;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 10, \"height\": 10}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ mutable: true, attribute: null })\n public bounds?: Rectangle.Rectangle;\n\n /**\n * The bounds of the freeform. Can either be an instance of a `Rectangle` or\n * a JSON string representation in the format of `[x, y, width, height]` or\n * `{\"x\": 0, \"y\": 0, \"width\": 0.1, \"height\": 0.1}`.\n *\n * Bounds are expected to have relative coordinates, with `[x, y]` from `[-0.5, 0.5]`\n * and `[width, height]` from `[0, 1]`, e.g. `[0, 0, 0.25, 0.25]`corresponds to a freeform\n * with a diameter of one fourth the viewport's smallest size in the center of the viewport.\n */\n @Prop({ attribute: 'bounds' })\n public boundsJson?: string;\n\n /**\n * A mode that specifies how the markup component should behave. When\n * unset, the component will not respond to interactions with the handles.\n * When `edit`, the markup anchors are interactive and the user is able\n * to reposition them. When `create`, anytime the user clicks on the canvas,\n * a new markup will be performed.\n */\n @Prop({ reflect: true })\n public mode: ViewerMarkupFreeformMode = '';\n\n /**\n * The viewer to connect to markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched anytime the user begins interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when the user has finished interacting with the\n * markup.\n */\n @Event({ bubbles: true })\n public interactionEnd!: EventEmitter<MarkupInteraction>;\n\n @Element()\n private hostEl!: HTMLVertexViewerMarkupFreeformElement;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private screenPoints: Point.Point[] = [];\n\n private interactionHandler = new FreeformMarkupInteractionHandler(\n this.hostEl,\n this.interactionBegin,\n this.interactionEnd,\n {\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n },\n );\n\n private registeredInteraction?: Disposable;\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.handleViewerChanged(this.viewer);\n this.handleScaleChange();\n this.handleScalingConfigurationChange();\n this.updatePointsFromProps();\n }\n\n protected componentDidLoad(): void {\n const resize = new ResizeObserver(() => this.updateViewport());\n resize.observe(this.hostEl);\n\n if (this.mode === 'create') {\n window.addEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n protected disconnectedCallback(): void {\n this.dispose();\n }\n\n @Method()\n public async dispose(): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected async handleViewerChanged(newViewer?: BasicViewer): Promise<void> {\n this.registeredInteraction?.dispose();\n this.registeredInteraction = undefined;\n\n if (newViewer != null) {\n this.registeredInteraction =\n await newViewer.registerBasicInteractionHandler(\n this.interactionHandler,\n );\n }\n }\n\n @Watch('originatingViewport')\n @Watch('offset')\n @Watch('scale')\n @Watch('bounds')\n @Watch('points')\n protected recomputePointsFromProps(): void {\n this.updatePointsFromProps();\n }\n\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n @Watch('scale')\n protected handleScalingConfigurationChange(): void {\n this.interactionHandler.updateScalingOptions({\n scale: this.scale,\n offset: this.offset,\n originatingViewport: this.originatingViewport,\n centeringBehavior: this.centeringBehavior,\n });\n }\n\n @Watch('scale')\n protected handleScaleChange(): void {\n writeDOM(() => {\n this.hostEl.style.setProperty(\n '--viewer-markup-freeform-scale',\n this.scale.toString(),\n );\n });\n }\n\n @Watch('mode')\n protected handleModeChange(): void {\n if (this.mode !== 'create') {\n window.removeEventListener('pointerdown', this.handleWindowPointerDown);\n }\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n this.screenPoints = this.convertPointsToScreen() ?? this.screenPoints;\n }\n\n private updatePointsFromProps(): void {\n this.points = this.points ?? parsePoints(this.pointsJson);\n this.screenPoints = this.convertPointsToScreen() ?? [];\n this.bounds = this.bounds ?? parseBounds(this.boundsJson);\n }\n\n public render(): h.JSX.IntrinsicElements {\n if (\n this.screenPoints.length > 0 &&\n this.elementBounds != null &&\n this.elementBounds.width > 0 &&\n this.elementBounds.height > 0\n ) {\n const offsetX = (this.offset?.x ?? 0) / getWindowDevicePixelRatio();\n const offsetY = (this.offset?.y ?? 0) / getWindowDevicePixelRatio();\n\n return (\n <Host>\n <svg class=\"svg\" onTouchStart={this.handleTouchStart}>\n <defs>\n <SvgShadow id=\"freeform-markup-shadow\" scale={this.scale} />\n </defs>\n <g\n transform={`translate(${offsetX} ${offsetY})`}\n filter=\"url(#freeform-markup-shadow)\"\n >\n <path\n class=\"path\"\n d={this.screenPoints.reduce(\n (d, pt) => `${d}L${pt.x},${pt.y}`,\n `M${this.screenPoints[0].x},${this.screenPoints[0].y}`,\n )}\n fill=\"none\"\n />\n </g>\n </svg>\n {this.mode === 'edit' && this.bounds != null && (\n <BoundingBox2d\n bounds={translateRectToScreen(\n this.bounds,\n this.elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale,\n )}\n offset={{ x: offsetX, y: offsetY }}\n onTopLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-left', e)\n }\n onTopRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top-right', e)\n }\n onTopAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('top', e)\n }\n onBottomLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-left', e)\n }\n onBottomRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom-right', e)\n }\n onBottomAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('bottom', e)\n }\n onLeftAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('left', e)\n }\n onRightAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('right', e)\n }\n onCenterAnchorPointerDown={(e) =>\n this.interactionHandler.editAnchor('center', e)\n }\n />\n )}\n {this.mode === 'create' && (\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n )}\n </Host>\n );\n } else {\n return (\n <Host>\n <div\n class=\"create-overlay\"\n onTouchStart={this.handleTouchStart}\n ></div>\n </Host>\n );\n }\n }\n\n private handleWindowPointerDown = (event: PointerEvent): void => {\n if (isValidStartEvent(event)) {\n this.interactionHandler.startInteraction(event);\n }\n };\n\n private handleTouchStart = (event: TouchEvent): void => {\n event.preventDefault();\n };\n\n private convertPointsToScreen(): Point.Point[] | undefined {\n const elementBounds = this.elementBounds;\n if (elementBounds != null) {\n return this.points?.map((pt) =>\n translatePointToScreen(\n pt,\n elementBounds,\n this.originatingViewport,\n this.centeringBehavior,\n this.scale,\n ),\n );\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-markup-tool.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-tool/viewer-markup-tool.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { BasicViewer } from '@vertexvis/utils';\n\nimport { stampTemplateWithId } from '../../lib/templates';\nimport {\n ArrowMarkup,\n CircleMarkup,\n FreeformMarkup,\n Markup,\n MarkupCenteringBehavior,\n} from '../../lib/types/markup';\nimport {\n isVertexViewerArrowMarkup,\n LineAnchorStyle,\n} from '../viewer-markup-arrow/utils';\nimport { isVertexViewerCircleMarkup } from '../viewer-markup-circle/utils';\nimport { isVertexViewerFreeformMarkup } from '../viewer-markup-freeform/utils';\n\n/**\n * The types of markup that can be performed by this tool.\n */\nexport type ViewerMarkupToolType = 'arrow' | 'circle' | 'freeform';\n\ninterface StateMap {\n markupElement?:\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement;\n}\n\n@Component({\n tag: 'vertex-viewer-markup-tool',\n styleUrl: 'viewer-markup-tool.css',\n shadow: true,\n})\nexport class ViewerMarkupTool {\n /**\n * An HTML template that describes the HTML to use for new arrow\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-arrow>`.\n */\n @Prop()\n public arrowTemplateId?: string;\n\n /**\n * An HTML template that describes the HTML to use for new circle\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-circle>`.\n */\n @Prop()\n public circleTemplateId?: string;\n\n /**\n * An HTML template that describes the HTML to use for new freeform\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-freeform>`.\n */\n @Prop()\n public freeformTemplateId?: string;\n\n /**\n * The type of markup.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Prop()\n public tool: ViewerMarkupToolType = 'arrow';\n\n /**\n * Disables markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Prop()\n public disabled = false;\n\n /**\n * The viewer to connect to markup.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The style of the starting anchor. This defaults to none.\n */\n @Prop({ mutable: true })\n public startLineAnchorStyle: LineAnchorStyle = 'none';\n\n /**\n * The style of the ending anchor. This defaults to 'arrow-triangle.'\n */\n @Prop({ mutable: true })\n public endLineAnchorStyle: LineAnchorStyle = 'arrow-triangle';\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched when a user begins a new markup.\n */\n @Event({ bubbles: true })\n public markupBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when a user has finished their markup.\n */\n @Event({ bubbles: true })\n public markupEnd!: EventEmitter<Markup>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n /**\n * Captures internal state that you want to preserve across dev refreshes, but\n * don't want to trigger a render when the state changes.\n */\n @State()\n private stateMap: StateMap = {};\n\n @Watch('viewer')\n protected async handleViewerChanged(): Promise<void> {\n if (this.stateMap.markupElement != null) {\n this.stateMap.markupElement.viewer = this.viewer;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('arrowTemplateId')\n @Watch('circleTemplateId')\n @Watch('disabled')\n @Watch('endLineAnchorStyle')\n @Watch('freeformTemplateId')\n @Watch('startLineAnchorStyle')\n @Watch('tool')\n protected handlePropertyChanged(): void {\n this.updateMarkupElement();\n }\n\n @Watch('scale')\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n protected handleScalingConfigurationChanged(): void {\n this.updateMarkupElement();\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.updateMarkupElement();\n }\n\n /**\n * Resets the state of the internally managed markup element\n * to allow for creating a new markup. This state is automatically\n * managed when this element is placed as a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Method()\n public async reset(): Promise<void> {\n const { markupElement } = this.stateMap;\n if (isVertexViewerFreeformMarkup(markupElement)) {\n markupElement.points = undefined;\n markupElement.bounds = undefined;\n markupElement.mode = 'create';\n } else if (isVertexViewerCircleMarkup(markupElement)) {\n markupElement.bounds = undefined;\n markupElement.mode = 'create';\n } else if (isVertexViewerArrowMarkup(markupElement)) {\n markupElement.start = undefined;\n markupElement.end = undefined;\n markupElement.mode = 'create';\n }\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n if (!this.disabled) {\n if (\n this.tool === 'arrow' ||\n this.tool === 'circle' ||\n this.tool === 'freeform'\n ) {\n return (\n <Host>\n <slot />\n </Host>\n );\n } else {\n return <Host>{`Unsupported tool type '${this.tool}'.`}</Host>;\n }\n } else {\n return <Host></Host>;\n }\n }\n\n private createArrowMarkupElement(): HTMLVertexViewerMarkupArrowElement {\n if (this.arrowTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.arrowTemplateId,\n isVertexViewerArrowMarkup,\n () =>\n console.warn(\n `Arrow template with ID ${this.arrowTemplateId} not found. Using default arrow element.`\n ),\n () =>\n console.warn(\n `Arrow template does not contain a vertex-viewer-markup-arrow. Using default arrow element.`\n )\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-arrow');\n }\n\n private createCircleMarkupElement(): HTMLVertexViewerMarkupCircleElement {\n if (this.circleTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.circleTemplateId,\n isVertexViewerCircleMarkup,\n () =>\n console.warn(\n `Circle template with ID ${this.circleTemplateId} not found. Using default circle element.`\n ),\n () =>\n console.warn(\n `Circle template does not contain a vertex-viewer-markup-circle. Using default circle element.`\n )\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-circle');\n }\n\n private createFreeformMarkupElement(): HTMLVertexViewerMarkupFreeformElement {\n if (this.freeformTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.freeformTemplateId,\n isVertexViewerFreeformMarkup,\n () =>\n console.warn(\n `Freeform template with ID ${this.freeformTemplateId} not found. Using default freeform element.`\n ),\n () =>\n console.warn(\n `Freeform template does not contain a vertex-viewer-markup-freeform. Using default freeform element.`\n )\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-freeform');\n }\n\n private createNewMarkupElement():\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement {\n switch (this.tool) {\n case 'arrow':\n return this.createArrowMarkupElement();\n case 'circle':\n return this.createCircleMarkupElement();\n case 'freeform':\n return this.createFreeformMarkupElement();\n }\n }\n\n private updateMarkupElement(): void {\n const { markupElement } = this.stateMap;\n if (markupElement != null) {\n markupElement.remove();\n markupElement.dispose();\n markupElement.viewer = undefined;\n markupElement.removeEventListener(\n 'interactionBegin',\n this.handleMarkupInteractionBegin\n );\n markupElement.removeEventListener(\n 'interactionEnd',\n this.handleMarkupInteractionEnd\n );\n }\n\n if (!this.disabled) {\n const newMarkupElement = this.createNewMarkupElement();\n this.hostEl.append(newMarkupElement);\n\n if (this.tool === 'arrow') {\n (\n newMarkupElement as HTMLVertexViewerMarkupArrowElement\n ).startLineAnchorStyle = this.startLineAnchorStyle;\n (\n newMarkupElement as HTMLVertexViewerMarkupArrowElement\n ).endLineAnchorStyle = this.endLineAnchorStyle;\n }\n\n newMarkupElement.mode = 'create';\n newMarkupElement.viewer = this.viewer;\n newMarkupElement.originatingViewport = this.originatingViewport;\n newMarkupElement.centeringBehavior = this.centeringBehavior;\n newMarkupElement.offset = this.offset;\n newMarkupElement.scale = this.scale;\n newMarkupElement.addEventListener(\n 'interactionBegin',\n this.handleMarkupInteractionBegin\n );\n newMarkupElement.addEventListener(\n 'interactionEnd',\n this.handleMarkupInteractionEnd\n );\n this.stateMap.markupElement = newMarkupElement;\n }\n }\n\n private handleMarkupInteractionBegin = (): void => {\n this.markupBegin.emit();\n };\n\n private handleMarkupInteractionEnd = (): void => {\n const { markupElement } = this.stateMap;\n if (isVertexViewerFreeformMarkup(markupElement)) {\n const { points, bounds } = markupElement;\n\n if (points != null && points.length > 0 && bounds != null) {\n this.markupEnd.emit(new FreeformMarkup({ points, bounds }));\n }\n } else if (isVertexViewerCircleMarkup(markupElement)) {\n const { bounds } = markupElement;\n\n if (bounds != null) {\n this.markupEnd.emit(new CircleMarkup({ bounds }));\n }\n } else if (isVertexViewerArrowMarkup(markupElement)) {\n const { start, end } = markupElement;\n\n if (start != null && end != null) {\n this.markupEnd.emit(new ArrowMarkup({ start, end }));\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"viewer-markup-tool.js","sourceRoot":"","sources":["../../../../../src/components/viewer-markup-tool/viewer-markup-tool.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { BasicViewer } from '@vertexvis/utils';\n\nimport { stampTemplateWithId } from '../../lib/templates';\nimport {\n ArrowMarkup,\n CircleMarkup,\n FreeformMarkup,\n Markup,\n MarkupCenteringBehavior,\n} from '../../lib/types/markup';\nimport {\n isVertexViewerArrowMarkup,\n LineAnchorStyle,\n} from '../viewer-markup-arrow/utils';\nimport { isVertexViewerCircleMarkup } from '../viewer-markup-circle/utils';\nimport { isVertexViewerFreeformMarkup } from '../viewer-markup-freeform/utils';\n\n/**\n * The types of markup that can be performed by this tool.\n */\nexport type ViewerMarkupToolType = 'arrow' | 'circle' | 'freeform';\n\ninterface StateMap {\n markupElement?:\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement;\n}\n\n@Component({\n tag: 'vertex-viewer-markup-tool',\n styleUrl: 'viewer-markup-tool.css',\n shadow: true,\n})\nexport class ViewerMarkupTool {\n /**\n * An HTML template that describes the HTML to use for new arrow\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-arrow>`.\n */\n @Prop()\n public arrowTemplateId?: string;\n\n /**\n * An HTML template that describes the HTML to use for new circle\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-circle>`.\n */\n @Prop()\n public circleTemplateId?: string;\n\n /**\n * An HTML template that describes the HTML to use for new freeform\n * markup. It's expected that the template contains a\n * `<vertex-viewer-markup-freeform>`.\n */\n @Prop()\n public freeformTemplateId?: string;\n\n /**\n * The type of markup.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Prop()\n public tool: ViewerMarkupToolType = 'arrow';\n\n /**\n * Disables markups.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Prop()\n public disabled = false;\n\n /**\n * The viewer to connect to markup.\n *\n * This property will automatically be set when a child of a\n * `<vertex-viewer-markup>` or `<vertex-viewer>` element.\n */\n @Prop()\n public viewer?: BasicViewer;\n\n /**\n * The style of the starting anchor. This defaults to none.\n */\n @Prop({ mutable: true })\n public startLineAnchorStyle: LineAnchorStyle = 'none';\n\n /**\n * The style of the ending anchor. This defaults to 'arrow-triangle.'\n */\n @Prop({ mutable: true })\n public endLineAnchorStyle: LineAnchorStyle = 'arrow-triangle';\n\n /**\n * The original viewport dimensions where this markup was created. This value is used\n * to determine where the markup should be rendered relative to the current viewport,\n * enabling some markup to appear \"off-screen\".\n *\n * When provided, all NDC values will be considered relative to this viewport.\n */\n @Prop()\n public originatingViewport?: Dimensions.Dimensions;\n\n /**\n * Defines the behavior of the provided markup when the originating viewport is smaller\n * than the current viewport, or is scaled to a size smaller than the current viewport\n * using the `scale` property.\n *\n * Options:\n * - `x-only`: Markup will be centered horizontally, but not vertically.\n * - `y-only`: Markup will be centered vertically, but not horizontally.\n * - `both`: Markup will be centered both horizontally and vertically.\n * - `none`: Markup will not be centered (default).\n */\n @Prop()\n public centeringBehavior: MarkupCenteringBehavior = 'none';\n\n /**\n * The current offset of the visible viewport. This value is used to determine where\n * markup should be rendered relative to the current viewport, enabling some markup to appear \"off-screen\".\n *\n * When provided, all computed coordinates will be offset by this amount.\n */\n @Prop()\n public offset?: Point.Point;\n\n /**\n * The scale to render this markup at. This value is used to scale the element's bounds\n * along with any `offset` to determine the final computed coordinates.\n *\n * When provided, all computed coordinates will be scaled by this amount.\n */\n @Prop()\n public scale = 1;\n\n /**\n * An event that is dispatched when a user begins a new markup.\n */\n @Event({ bubbles: true })\n public markupBegin!: EventEmitter<void>;\n\n /**\n * An event that is dispatched when a user has finished their markup.\n */\n @Event({ bubbles: true })\n public markupEnd!: EventEmitter<Markup>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n /**\n * Captures internal state that you want to preserve across dev refreshes, but\n * don't want to trigger a render when the state changes.\n */\n @State()\n private stateMap: StateMap = {};\n\n @Watch('viewer')\n protected async handleViewerChanged(): Promise<void> {\n if (this.stateMap.markupElement != null) {\n this.stateMap.markupElement.viewer = this.viewer;\n }\n }\n\n /**\n * @ignore\n */\n @Watch('arrowTemplateId')\n @Watch('circleTemplateId')\n @Watch('disabled')\n @Watch('endLineAnchorStyle')\n @Watch('freeformTemplateId')\n @Watch('startLineAnchorStyle')\n @Watch('tool')\n protected handlePropertyChanged(): void {\n this.updateMarkupElement();\n }\n\n @Watch('scale')\n @Watch('offset')\n @Watch('originatingViewport')\n @Watch('centeringBehavior')\n protected handleScalingConfigurationChanged(): void {\n this.updateMarkupElement();\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.updateMarkupElement();\n }\n\n /**\n * Resets the state of the internally managed markup element\n * to allow for creating a new markup. This state is automatically\n * managed when this element is placed as a child of a\n * `<vertex-viewer-markup>` element.\n */\n @Method()\n public async reset(): Promise<void> {\n const { markupElement } = this.stateMap;\n if (isVertexViewerFreeformMarkup(markupElement)) {\n markupElement.points = undefined;\n markupElement.bounds = undefined;\n markupElement.mode = 'create';\n } else if (isVertexViewerCircleMarkup(markupElement)) {\n markupElement.bounds = undefined;\n markupElement.mode = 'create';\n } else if (isVertexViewerArrowMarkup(markupElement)) {\n markupElement.start = undefined;\n markupElement.end = undefined;\n markupElement.mode = 'create';\n }\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n if (!this.disabled) {\n if (\n this.tool === 'arrow' ||\n this.tool === 'circle' ||\n this.tool === 'freeform'\n ) {\n return (\n <Host>\n <slot />\n </Host>\n );\n } else {\n return <Host>{`Unsupported tool type '${this.tool}'.`}</Host>;\n }\n } else {\n return <Host></Host>;\n }\n }\n\n private createArrowMarkupElement(): HTMLVertexViewerMarkupArrowElement {\n if (this.arrowTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.arrowTemplateId,\n isVertexViewerArrowMarkup,\n () =>\n console.warn(\n `Arrow template with ID ${this.arrowTemplateId} not found. Using default arrow element.`,\n ),\n () =>\n console.warn(\n `Arrow template does not contain a vertex-viewer-markup-arrow. Using default arrow element.`,\n ),\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-arrow');\n }\n\n private createCircleMarkupElement(): HTMLVertexViewerMarkupCircleElement {\n if (this.circleTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.circleTemplateId,\n isVertexViewerCircleMarkup,\n () =>\n console.warn(\n `Circle template with ID ${this.circleTemplateId} not found. Using default circle element.`,\n ),\n () =>\n console.warn(\n `Circle template does not contain a vertex-viewer-markup-circle. Using default circle element.`,\n ),\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-circle');\n }\n\n private createFreeformMarkupElement(): HTMLVertexViewerMarkupFreeformElement {\n if (this.freeformTemplateId != null) {\n const element = stampTemplateWithId(\n window.document.body,\n this.freeformTemplateId,\n isVertexViewerFreeformMarkup,\n () =>\n console.warn(\n `Freeform template with ID ${this.freeformTemplateId} not found. Using default freeform element.`,\n ),\n () =>\n console.warn(\n `Freeform template does not contain a vertex-viewer-markup-freeform. Using default freeform element.`,\n ),\n );\n\n if (element != null) {\n return element;\n }\n }\n\n return document.createElement('vertex-viewer-markup-freeform');\n }\n\n private createNewMarkupElement():\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement {\n switch (this.tool) {\n case 'arrow':\n return this.createArrowMarkupElement();\n case 'circle':\n return this.createCircleMarkupElement();\n case 'freeform':\n return this.createFreeformMarkupElement();\n }\n }\n\n private updateMarkupElement(): void {\n const { markupElement } = this.stateMap;\n if (markupElement != null) {\n markupElement.remove();\n markupElement.dispose();\n markupElement.viewer = undefined;\n markupElement.removeEventListener(\n 'interactionBegin',\n this.handleMarkupInteractionBegin,\n );\n markupElement.removeEventListener(\n 'interactionEnd',\n this.handleMarkupInteractionEnd,\n );\n }\n\n if (!this.disabled) {\n const newMarkupElement = this.createNewMarkupElement();\n this.hostEl.append(newMarkupElement);\n\n if (this.tool === 'arrow') {\n (\n newMarkupElement as HTMLVertexViewerMarkupArrowElement\n ).startLineAnchorStyle = this.startLineAnchorStyle;\n (\n newMarkupElement as HTMLVertexViewerMarkupArrowElement\n ).endLineAnchorStyle = this.endLineAnchorStyle;\n }\n\n newMarkupElement.mode = 'create';\n newMarkupElement.viewer = this.viewer;\n newMarkupElement.originatingViewport = this.originatingViewport;\n newMarkupElement.centeringBehavior = this.centeringBehavior;\n newMarkupElement.offset = this.offset;\n newMarkupElement.scale = this.scale;\n newMarkupElement.addEventListener(\n 'interactionBegin',\n this.handleMarkupInteractionBegin,\n );\n newMarkupElement.addEventListener(\n 'interactionEnd',\n this.handleMarkupInteractionEnd,\n );\n this.stateMap.markupElement = newMarkupElement;\n }\n }\n\n private handleMarkupInteractionBegin = (): void => {\n this.markupBegin.emit();\n };\n\n private handleMarkupInteractionEnd = (): void => {\n const { markupElement } = this.stateMap;\n if (isVertexViewerFreeformMarkup(markupElement)) {\n const { points, bounds } = markupElement;\n\n if (points != null && points.length > 0 && bounds != null) {\n this.markupEnd.emit(new FreeformMarkup({ points, bounds }));\n }\n } else if (isVertexViewerCircleMarkup(markupElement)) {\n const { bounds } = markupElement;\n\n if (bounds != null) {\n this.markupEnd.emit(new CircleMarkup({ bounds }));\n }\n } else if (isVertexViewerArrowMarkup(markupElement)) {\n const { start, end } = markupElement;\n\n if (start != null && end != null) {\n this.markupEnd.emit(new ArrowMarkup({ start, end }));\n }\n }\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-measurement-details.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-details/viewer-measurement-details.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Host, Prop, State, Watch } from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Formatter } from '../../lib/formatter';\nimport {\n MeasurementModel,\n MeasurementOutcome,\n MeasurementOverlay,\n MeasurementOverlayManager,\n MeasurementResult,\n} from '../../lib/measurement';\nimport {\n AngleUnits,\n AngleUnitType,\n AreaUnits,\n DistanceUnits,\n DistanceUnitType,\n Unit,\n} from '../../lib/types';\nimport {\n MinimumDistanceResultEntry,\n PlanarAngleResultEntry,\n PlanarDistanceResultEntry,\n SurfaceAreaResultEntry,\n} from './viewer-measurement-details-results';\n\n@Component({\n tag: 'vertex-viewer-measurement-details',\n styleUrl: 'viewer-measurement-details.css',\n shadow: true,\n})\nexport class ViewerMeasurementDetails {\n /**\n * The `MeasurementModel` that should be reflected in these details.\n * If not specified, a new `MeasurementModel` will be created,\n * which can then be used to update the display.\n */\n @Prop()\n public measurementModel?: MeasurementModel = new MeasurementModel();\n\n /**\n * The manager that the component will use to present measurement overlays.\n */\n @Prop()\n public measurementOverlays?: MeasurementOverlayManager;\n\n /**\n * The outcome to display. This property is automatically updated if a\n * measurement model is provided.\n */\n @Prop({ mutable: true })\n public measurementOutcome?: MeasurementOutcome;\n\n /**\n * The unit of distance-based measurement.\n */\n @Prop()\n public distanceUnits: DistanceUnitType = 'millimeters';\n\n /**\n * The unit of angle-based measurement.\n */\n @Prop()\n public angleUnits: AngleUnitType = 'degrees';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public distanceFormatter?: Formatter<number>;\n\n /**\n * An optional formatter that can be used to format the display of an angle.\n * The formatting function is passed a calculated angle in degrees and is\n * expected to return a string.\n */\n @Prop()\n public angleFormatter?: Formatter<number>;\n\n /**\n * An optional formatter that can be used to format the display of an area.\n * The formatting function is passed a calculated area and is\n * expected to return a string.\n */\n @Prop()\n public areaFormatter?: Formatter<number>;\n\n /**\n * A set of result types to display. If `undefined`, then all results will be\n * displayed.\n */\n @Prop()\n public resultTypes?: MeasurementResult['type'][];\n\n @State()\n private overlay?: MeasurementOverlay;\n\n @State()\n private distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);\n\n @State()\n private angleMeasurementUnits = new AngleUnits(this.angleUnits);\n\n @State()\n private areaMeasurementUnits = new AreaUnits(this.distanceUnits);\n\n private onOutcomeChangedHandler?: Disposable;\n\n /**\n * @internal\n */\n protected connectedCallback(): void {\n this.handleMeasurementModelChanged();\n }\n\n /**\n * @internal\n */\n protected disconnectedCallback(): void {\n this.onOutcomeChangedHandler?.dispose();\n }\n\n /**\n * @internal\n */\n @Watch('distanceUnits', { immediate: true })\n protected handleDistanceUnitsChanged(): void {\n this.distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);\n this.areaMeasurementUnits = new AreaUnits(this.distanceUnits);\n }\n\n /**\n * @internal\n */\n @Watch('angleUnits', { immediate: true })\n protected handleAngleUnitsChanged(): void {\n this.angleMeasurementUnits = new AngleUnits(this.angleUnits);\n }\n\n /**\n * @internal\n */\n @Watch('measurementModel', { immediate: true })\n protected handleMeasurementModelChanged(): void {\n this.onOutcomeChangedHandler?.dispose();\n this.onOutcomeChangedHandler = this.measurementModel?.onOutcomeChanged(\n this.handleOutcomeChange\n );\n\n this.updateStateFromModel();\n }\n\n /**\n * @internal\n */\n @Watch('resultTypes')\n protected handleResultTypesChanged(): void {\n this.updateStateFromModel();\n }\n\n /**\n * @internal\n */\n protected render(): h.JSX.IntrinsicElements {\n const isFilteredResultType = (result: MeasurementResult): boolean => {\n return this.resultTypes?.includes(result.type) ?? true;\n };\n\n const results = (this.measurementOutcome?.results ?? []).filter(\n isFilteredResultType\n );\n\n return (\n <Host>\n {this.renderResult('planar-angle', results, (result) => (\n <PlanarAngleResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeAngleFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('planar-distance', results, (result) => (\n <PlanarDistanceResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeDistanceFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('surface-area', results, (result) => (\n <SurfaceAreaResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeAreaFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('minimum-distance', results, (result) => (\n <MinimumDistanceResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeDistanceFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n </Host>\n );\n }\n\n private handleShowOverlay = (\n overlay: MeasurementOverlay | undefined\n ): void => {\n this.overlay = overlay;\n };\n\n private handleHideOverlay = (): void => {\n this.overlay?.dispose();\n };\n\n private handleOutcomeChange = (): void => {\n this.updateStateFromModel();\n };\n\n private updateStateFromModel(): void {\n this.measurementOutcome = this.measurementModel?.getOutcome();\n }\n\n private renderResult<T extends MeasurementResult['type']>(\n type: T,\n results: MeasurementResult[],\n render: (\n result: Extract<MeasurementResult, { type: T }>\n ) => h.JSX.IntrinsicElements | undefined\n ): h.JSX.IntrinsicElements | undefined {\n const result = this.getResultForType(type, results);\n return result != null ? render(result) : undefined;\n }\n\n private getResultForType<T extends MeasurementResult['type']>(\n type: T,\n results: MeasurementResult[]\n ): Extract<MeasurementResult, { type: T }> | undefined {\n return results.find((result) => result.type === type) as Extract<\n MeasurementResult,\n { type: T }\n >;\n }\n\n private makeDistanceFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.distanceMeasurementUnits.convertWorldValueToReal(value),\n this.distanceMeasurementUnits.unit,\n this.distanceFormatter\n );\n }\n\n private makeAngleFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.angleMeasurementUnits.convertTo(value),\n this.angleMeasurementUnits.unit,\n this.angleFormatter\n );\n }\n\n private makeAreaFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.areaMeasurementUnits.convertWorldValueToReal(value),\n this.areaMeasurementUnits.unit,\n this.areaFormatter\n );\n }\n\n private makeFormatter(\n convert: (value: number) => number,\n units: Unit,\n customFormatter: Formatter<number> | undefined\n ): Formatter<number> {\n return (value) => {\n const v = convert(value);\n\n if (customFormatter != null) {\n return customFormatter(v);\n } else {\n return this.formatValue(v, units);\n }\n };\n }\n\n private formatValue(value: number, unit: Unit): string {\n const val = value.toFixed(this.fractionalDigits);\n const isApprox = this.measurementOutcome?.isApproximate ?? false;\n return `${isApprox ? '~' + val : val} ${unit.abbreviatedName}`;\n }\n}\n"]}
1
+ {"version":3,"file":"viewer-measurement-details.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-details/viewer-measurement-details.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Host, Prop, State, Watch } from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { Formatter } from '../../lib/formatter';\nimport {\n MeasurementModel,\n MeasurementOutcome,\n MeasurementOverlay,\n MeasurementOverlayManager,\n MeasurementResult,\n} from '../../lib/measurement';\nimport {\n AngleUnits,\n AngleUnitType,\n AreaUnits,\n DistanceUnits,\n DistanceUnitType,\n Unit,\n} from '../../lib/types';\nimport {\n MinimumDistanceResultEntry,\n PlanarAngleResultEntry,\n PlanarDistanceResultEntry,\n SurfaceAreaResultEntry,\n} from './viewer-measurement-details-results';\n\n@Component({\n tag: 'vertex-viewer-measurement-details',\n styleUrl: 'viewer-measurement-details.css',\n shadow: true,\n})\nexport class ViewerMeasurementDetails {\n /**\n * The `MeasurementModel` that should be reflected in these details.\n * If not specified, a new `MeasurementModel` will be created,\n * which can then be used to update the display.\n */\n @Prop()\n public measurementModel?: MeasurementModel = new MeasurementModel();\n\n /**\n * The manager that the component will use to present measurement overlays.\n */\n @Prop()\n public measurementOverlays?: MeasurementOverlayManager;\n\n /**\n * The outcome to display. This property is automatically updated if a\n * measurement model is provided.\n */\n @Prop({ mutable: true })\n public measurementOutcome?: MeasurementOutcome;\n\n /**\n * The unit of distance-based measurement.\n */\n @Prop()\n public distanceUnits: DistanceUnitType = 'millimeters';\n\n /**\n * The unit of angle-based measurement.\n */\n @Prop()\n public angleUnits: AngleUnitType = 'degrees';\n\n /**\n * The number of fraction digits to display.\n */\n @Prop()\n public fractionalDigits = 2;\n\n /**\n * An optional formatter that can be used to format the display of a distance.\n * The formatting function is passed a calculated real-world distance and is\n * expected to return a string.\n */\n @Prop()\n public distanceFormatter?: Formatter<number>;\n\n /**\n * An optional formatter that can be used to format the display of an angle.\n * The formatting function is passed a calculated angle in degrees and is\n * expected to return a string.\n */\n @Prop()\n public angleFormatter?: Formatter<number>;\n\n /**\n * An optional formatter that can be used to format the display of an area.\n * The formatting function is passed a calculated area and is\n * expected to return a string.\n */\n @Prop()\n public areaFormatter?: Formatter<number>;\n\n /**\n * A set of result types to display. If `undefined`, then all results will be\n * displayed.\n */\n @Prop()\n public resultTypes?: MeasurementResult['type'][];\n\n @State()\n private overlay?: MeasurementOverlay;\n\n @State()\n private distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);\n\n @State()\n private angleMeasurementUnits = new AngleUnits(this.angleUnits);\n\n @State()\n private areaMeasurementUnits = new AreaUnits(this.distanceUnits);\n\n private onOutcomeChangedHandler?: Disposable;\n\n /**\n * @internal\n */\n protected connectedCallback(): void {\n this.handleMeasurementModelChanged();\n }\n\n /**\n * @internal\n */\n protected disconnectedCallback(): void {\n this.onOutcomeChangedHandler?.dispose();\n }\n\n /**\n * @internal\n */\n @Watch('distanceUnits', { immediate: true })\n protected handleDistanceUnitsChanged(): void {\n this.distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);\n this.areaMeasurementUnits = new AreaUnits(this.distanceUnits);\n }\n\n /**\n * @internal\n */\n @Watch('angleUnits', { immediate: true })\n protected handleAngleUnitsChanged(): void {\n this.angleMeasurementUnits = new AngleUnits(this.angleUnits);\n }\n\n /**\n * @internal\n */\n @Watch('measurementModel', { immediate: true })\n protected handleMeasurementModelChanged(): void {\n this.onOutcomeChangedHandler?.dispose();\n this.onOutcomeChangedHandler = this.measurementModel?.onOutcomeChanged(\n this.handleOutcomeChange,\n );\n\n this.updateStateFromModel();\n }\n\n /**\n * @internal\n */\n @Watch('resultTypes')\n protected handleResultTypesChanged(): void {\n this.updateStateFromModel();\n }\n\n /**\n * @internal\n */\n protected render(): h.JSX.IntrinsicElements {\n const isFilteredResultType = (result: MeasurementResult): boolean => {\n return this.resultTypes?.includes(result.type) ?? true;\n };\n\n const results = (this.measurementOutcome?.results ?? []).filter(\n isFilteredResultType,\n );\n\n return (\n <Host>\n {this.renderResult('planar-angle', results, (result) => (\n <PlanarAngleResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeAngleFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('planar-distance', results, (result) => (\n <PlanarDistanceResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeDistanceFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('surface-area', results, (result) => (\n <SurfaceAreaResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeAreaFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n\n {this.renderResult('minimum-distance', results, (result) => (\n <MinimumDistanceResultEntry\n result={result}\n overlays={this.measurementOverlays}\n formatter={this.makeDistanceFormatter()}\n onShowOverlay={this.handleShowOverlay}\n onHideOverlay={this.handleHideOverlay}\n />\n ))}\n </Host>\n );\n }\n\n private handleShowOverlay = (\n overlay: MeasurementOverlay | undefined,\n ): void => {\n this.overlay = overlay;\n };\n\n private handleHideOverlay = (): void => {\n this.overlay?.dispose();\n };\n\n private handleOutcomeChange = (): void => {\n this.updateStateFromModel();\n };\n\n private updateStateFromModel(): void {\n this.measurementOutcome = this.measurementModel?.getOutcome();\n }\n\n private renderResult<T extends MeasurementResult['type']>(\n type: T,\n results: MeasurementResult[],\n render: (\n result: Extract<MeasurementResult, { type: T }>,\n ) => h.JSX.IntrinsicElements | undefined,\n ): h.JSX.IntrinsicElements | undefined {\n const result = this.getResultForType(type, results);\n return result != null ? render(result) : undefined;\n }\n\n private getResultForType<T extends MeasurementResult['type']>(\n type: T,\n results: MeasurementResult[],\n ): Extract<MeasurementResult, { type: T }> | undefined {\n return results.find((result) => result.type === type) as Extract<\n MeasurementResult,\n { type: T }\n >;\n }\n\n private makeDistanceFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.distanceMeasurementUnits.convertWorldValueToReal(value),\n this.distanceMeasurementUnits.unit,\n this.distanceFormatter,\n );\n }\n\n private makeAngleFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.angleMeasurementUnits.convertTo(value),\n this.angleMeasurementUnits.unit,\n this.angleFormatter,\n );\n }\n\n private makeAreaFormatter(): Formatter<number> {\n return this.makeFormatter(\n (value) => this.areaMeasurementUnits.convertWorldValueToReal(value),\n this.areaMeasurementUnits.unit,\n this.areaFormatter,\n );\n }\n\n private makeFormatter(\n convert: (value: number) => number,\n units: Unit,\n customFormatter: Formatter<number> | undefined,\n ): Formatter<number> {\n return (value) => {\n const v = convert(value);\n\n if (customFormatter != null) {\n return customFormatter(v);\n } else {\n return this.formatValue(v, units);\n }\n };\n }\n\n private formatValue(value: number, unit: Unit): string {\n const val = value.toFixed(this.fractionalDigits);\n const isApprox = this.measurementOutcome?.isApproximate ?? false;\n return `${isApprox ? '~' + val : val} ${unit.abbreviatedName}`;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"hitTest.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/hitTest.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,qBAAqB;IAChC,YACU,OAAkC,EAClC,WAAwB,EACxB,QAAkB,EAClB,MAAwB;QAHxB,YAAO,GAAP,OAAO,CAA2B;QAClC,gBAAW,GAAX,WAAW,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAkB;IAC/B,CAAC;IAEG,OAAO,CAAC,EAAe;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,EAAe,EAAE,MAAc;QACvD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,qBAAqB,CAC1B,EAAe,EACf,EAAE,aAAa,GAAG,KAAK,KAAkC,EAAE;QAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,EAAe;QACrC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;CACF","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\n\nimport {\n DepthBuffer,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\n\nexport class PointToPointHitTester {\n public constructor(\n private stencil: StencilBuffer | undefined,\n private depthBuffer: DepthBuffer,\n private viewport: Viewport,\n private camera?: FrameCameraBase\n ) {}\n\n public hitTest(pt: Point.Point): boolean {\n const dpt = this.viewport.transformPointToFrame(pt, this.depthBuffer);\n if (this.stencil != null) {\n const spt = this.viewport.transformPointToFrame(pt, this.stencil);\n return this.stencil.hitTest(spt) || this.depthBuffer.hitTest(dpt);\n } else {\n return this.depthBuffer.hitTest(dpt);\n }\n }\n\n public snapToNearestPixel(pt: Point.Point, radius: number): Point.Point {\n if (this.stencil != null) {\n const framePt = this.viewport.transformPointToFrame(pt, this.stencil);\n const snapPt = this.stencil.snapToNearestPixel(framePt, radius);\n return this.viewport.transformPointToViewport(snapPt, this.stencil);\n } else {\n return pt;\n }\n }\n\n public transformPointToWorld(\n pt: Point.Point,\n { ignoreHitTest = false }: { ignoreHitTest?: boolean } = {}\n ): Vector3.Vector3 | undefined {\n const buffer = this.pickDepthBuffer(pt);\n\n if (buffer != null) {\n return this.viewport.transformPointToWorldSpace(pt, buffer);\n } else if (ignoreHitTest) {\n return this.viewport.transformPointToWorldSpace(pt, this.depthBuffer);\n }\n }\n\n private pickDepthBuffer(pt: Point.Point): DepthBuffer | undefined {\n if (this.stencil != null) {\n const stencilPt = this.viewport.transformPointToFrame(pt, this.stencil);\n if (this.stencil.hitTest(stencilPt)) {\n return this.stencil.depthBuffer;\n }\n }\n\n const depthPt = this.viewport.transformPointToFrame(pt, this.depthBuffer);\n return this.depthBuffer.hitTest(depthPt) ? this.depthBuffer : undefined;\n }\n}\n"]}
1
+ {"version":3,"file":"hitTest.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/hitTest.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,qBAAqB;IAChC,YACU,OAAkC,EAClC,WAAwB,EACxB,QAAkB,EAClB,MAAwB;QAHxB,YAAO,GAAP,OAAO,CAA2B;QAClC,gBAAW,GAAX,WAAW,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAU;QAClB,WAAM,GAAN,MAAM,CAAkB;IAC/B,CAAC;IAEG,OAAO,CAAC,EAAe;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEM,kBAAkB,CAAC,EAAe,EAAE,MAAc;QACvD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACtE,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAEM,qBAAqB,CAC1B,EAAe,EACf,EAAE,aAAa,GAAG,KAAK,KAAkC,EAAE;QAE3D,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAExC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,aAAa,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,EAAe;QACrC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAClC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,CAAC;CACF","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\n\nimport {\n DepthBuffer,\n FrameCameraBase,\n StencilBuffer,\n Viewport,\n} from '../../lib/types';\n\nexport class PointToPointHitTester {\n public constructor(\n private stencil: StencilBuffer | undefined,\n private depthBuffer: DepthBuffer,\n private viewport: Viewport,\n private camera?: FrameCameraBase,\n ) {}\n\n public hitTest(pt: Point.Point): boolean {\n const dpt = this.viewport.transformPointToFrame(pt, this.depthBuffer);\n if (this.stencil != null) {\n const spt = this.viewport.transformPointToFrame(pt, this.stencil);\n return this.stencil.hitTest(spt) || this.depthBuffer.hitTest(dpt);\n } else {\n return this.depthBuffer.hitTest(dpt);\n }\n }\n\n public snapToNearestPixel(pt: Point.Point, radius: number): Point.Point {\n if (this.stencil != null) {\n const framePt = this.viewport.transformPointToFrame(pt, this.stencil);\n const snapPt = this.stencil.snapToNearestPixel(framePt, radius);\n return this.viewport.transformPointToViewport(snapPt, this.stencil);\n } else {\n return pt;\n }\n }\n\n public transformPointToWorld(\n pt: Point.Point,\n { ignoreHitTest = false }: { ignoreHitTest?: boolean } = {},\n ): Vector3.Vector3 | undefined {\n const buffer = this.pickDepthBuffer(pt);\n\n if (buffer != null) {\n return this.viewport.transformPointToWorldSpace(pt, buffer);\n } else if (ignoreHitTest) {\n return this.viewport.transformPointToWorldSpace(pt, this.depthBuffer);\n }\n }\n\n private pickDepthBuffer(pt: Point.Point): DepthBuffer | undefined {\n if (this.stencil != null) {\n const stencilPt = this.viewport.transformPointToFrame(pt, this.stencil);\n if (this.stencil.hitTest(stencilPt)) {\n return this.stencil.depthBuffer;\n }\n }\n\n const depthPt = this.viewport.transformPointToFrame(pt, this.depthBuffer);\n return this.depthBuffer.hitTest(depthPt) ? this.depthBuffer : undefined;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\nimport { Mapper } from '@vertexvis/utils';\n\nimport { fromPbVector3f } from '../../lib/mappers';\nimport { RaycasterLike } from '../../lib/scenes';\nimport { PointToPointHitTester } from './hitTest';\nimport { Anchor } from './utils';\n\n/**\n * A measurement result that represents the distance between two points.\n */\nexport interface PointToPointMeasurementResult {\n /**\n * The distance, in world units, between two points. This value is only\n * populated if the result is valid.\n */\n distance?: number;\n\n /**\n * The first point, in world units.\n */\n start: Vector3.Vector3;\n\n /**\n * The second point, in world units.\n */\n end: Vector3.Vector3;\n\n /**\n * Indicates if this result is valid. A value of `false` indicates that one of\n * the points does not touch any geometry.\n */\n valid: boolean;\n}\n\n/**\n * Provides APIs to perform local or remote hit tests.\n */\nexport interface PointToPointHitProvider {\n /**\n * Returns a hit tester that can be used to test if a point is over geometry\n * without having to do an API call.\n */\n hitTester(): PointToPointHitTester;\n\n /**\n * Returns a raycaster that can be used to perform hits through API calls.\n */\n raycaster(): Promise<RaycasterLike>;\n}\n\n/**\n * A controller to handle point-to-point measurement interactions.\n */\nexport class PointToPointInteractionController {\n public constructor(private readonly model: PointToPointInteractionModel) {}\n\n /**\n * Returns an interaction handler to perform a new measurement.\n *\n * @param pt A point in viewport coordinates.\n * @param hits A provider to perform hits.\n * @returns An interaction handler, or `undefined` if the point does not hit\n * any geometry.\n */\n public newMeasurement(\n pt: Point.Point,\n hits: PointToPointHitProvider\n ): PointToPointInteraction | undefined {\n const world = hits.hitTester().transformPointToWorld(pt);\n return world != null\n ? new NewMeasurementInteraction(pt, world, this.model)\n : undefined;\n }\n\n /**\n * Returns an interaction handler to edit an existing measurement.\n *\n * @param anchor The anchor to edit.\n * @returns An interaction handler to edit a measurement.\n */\n public editMeasurement(anchor: Anchor): PointToPointInteraction {\n const measurement = this.model.getMeasurement();\n\n if (measurement == null) {\n throw new Error('Cannot edit measurement. Measurement is empty.');\n }\n\n return anchor === 'start'\n ? new EditStartAnchorInteraction(measurement, this.model)\n : new EditEndAnchorInteraction(measurement, this.model);\n }\n\n /**\n * Clears the position of the feedback indicator.\n */\n public clearIndicator(): void {\n this.model.setIndicator(undefined);\n }\n\n /**\n * Updates the position of the feedback indicator.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n * @returns `true` if the indicator is over geometry.\n */\n public moveIndicator(\n pt: Point.Point,\n hits: PointToPointHitProvider\n ): boolean {\n const worldPt = hits.hitTester().transformPointToWorld(pt);\n this.model.setIndicator(worldPt);\n return worldPt != null;\n }\n}\n\n/**\n * The model for point-to-point interactions.\n */\nexport class PointToPointInteractionModel {\n private indicator?: Vector3.Vector3;\n private measurement?: PointToPointMeasurementResult;\n\n private measurementChanged = new EventDispatcher<\n PointToPointMeasurementResult | undefined\n >();\n\n private indicatorChanged = new EventDispatcher<Vector3.Vector3 | undefined>();\n\n /**\n * Returns a model that doesn't have the indicator or measurement set.\n */\n public static empty(): PointToPointInteractionModel {\n return new PointToPointInteractionModel();\n }\n\n /**\n * Returns the current measurement for the interaction.\n */\n public getMeasurement(): PointToPointMeasurementResult | undefined {\n return this.measurement;\n }\n\n /**\n * Updates the measurement and emits a change event.\n *\n * @param measurement The new measurement.\n */\n public setMeasurement(\n measurement: PointToPointMeasurementResult | undefined\n ): void {\n if (this.measurement !== measurement) {\n this.measurement = measurement;\n this.measurementChanged.emit(measurement);\n }\n }\n\n /**\n * Updates the measurement from the given values. If `start` or `end` are\n * `undefined` the measurement will be cleared.\n *\n * @param start The start point.\n * @param end The end point.\n * @param valid `true` if the measurement is valid.\n */\n public setMeasurementFromValues(\n start: Vector3.Vector3 | undefined,\n end: Vector3.Vector3 | undefined,\n valid: boolean\n ): void {\n if (start != null && end != null) {\n const measurement = valid\n ? validMeasurement(start, end)\n : invalidMeasurement(start, end);\n this.setMeasurement(measurement);\n } else {\n this.setMeasurement(undefined);\n }\n }\n\n /**\n * Adds a callback that is invoked when the measurement changes.\n *\n * @param listener The callback to register.\n * @returns A `Disposable` to remove the event listener.\n */\n public onMeasurementChanged(\n listener: Listener<PointToPointMeasurementResult | undefined>\n ): Disposable {\n return this.measurementChanged.on(listener);\n }\n\n /**\n * Gets the position representing the feedback indicator.\n */\n public getIndicator(): Vector3.Vector3 | undefined {\n return this.indicator;\n }\n\n /**\n * Updates the position of the feedback indicator.\n */\n public setIndicator(pt: Vector3.Vector3 | undefined): void {\n if (this.indicator !== pt) {\n this.indicator = pt;\n this.indicatorChanged.emit(pt);\n }\n }\n\n /**\n * Adds a callback that is invoked when the feedback indicator position\n * changes.\n *\n * @param listener The callback to register.\n * @returns A `Disposable` to remove the event listener.\n */\n public onIndicatorChanged(\n listener: Listener<Vector3.Vector3 | undefined>\n ): Disposable {\n return this.indicatorChanged.on(listener);\n }\n}\n\n/**\n * An interface for performing point-to-point measurement interactions.\n *\n * @see {@link PointToPointInteractionController} to start an interaction.\n */\nexport interface PointToPointInteraction {\n /**\n * UI should call this for each user iteration.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n */\n update(pt: Point.Point, hits: PointToPointHitProvider): void;\n\n /**\n * UI should call this when the user interaction is finished. Returns a\n * `Promise` that resolves with the final measurement.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n */\n finish(\n pt: Point.Point,\n hits: PointToPointHitProvider\n ): Promise<PointToPointMeasurementResult>;\n}\n\n/**\n * An interaction handler to perform a new measurement. As a user is performing\n * an interaction, the handler will fetch the position of the starting anchor.\n * While fetching the position, a position from the depth buffer will be used.\n */\nclass NewMeasurementInteraction implements PointToPointInteraction {\n private pendingStart: Promise<void> | undefined;\n private hitWorld: Vector3.Vector3 | undefined;\n private hitWorldValid = true;\n\n // Prevents any updates of the interaction while finish is completing.\n private preventUpdate = false;\n\n public constructor(\n public readonly pt: Point.Point,\n public readonly world: Vector3.Vector3,\n private readonly model: PointToPointInteractionModel\n ) {}\n\n private fetchStartIfMissing(hits: PointToPointHitProvider): void {\n if (this.pendingStart == null) {\n this.pendingStart = this.fetchStart(hits);\n }\n }\n\n private async fetchStart(hits: PointToPointHitProvider): Promise<void> {\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, this.pt);\n\n if (hitPt == null) {\n // If the hit is empty, fallback to using a point derived from the depth\n // buffer.\n const invalidPt = hits.hitTester().transformPointToWorld(this.pt);\n\n this.hitWorld = invalidPt;\n this.hitWorldValid = false;\n } else {\n this.hitWorld = hitPt;\n this.hitWorldValid = true;\n }\n }\n\n public update(pt: Point.Point, hits: PointToPointHitProvider): void {\n if (!this.preventUpdate) {\n this.fetchStartIfMissing(hits);\n\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n const isHit = hits.hitTester().hitTest(pt);\n const start = this.hitWorld ?? this.world;\n\n if (end == null) {\n throw new Error(\n 'Cannot update new measurement interaction. End point is empty.'\n );\n } else if (!this.hitWorldValid || !isHit) {\n this.model.setIndicator(end);\n this.setMeasurement(invalidMeasurement(start, end));\n } else {\n this.model.setIndicator(end);\n this.setMeasurement(validMeasurement(start, end));\n }\n }\n }\n\n public async finish(\n pt: Point.Point,\n hits: PointToPointHitProvider\n ): Promise<PointToPointMeasurementResult> {\n this.preventUpdate = true;\n\n // Wait for the hit for the starting point.\n this.fetchStartIfMissing(hits);\n await this.pendingStart;\n\n this.model.setIndicator(undefined);\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, pt);\n const start = this.hitWorld ?? this.world;\n this.preventUpdate = false;\n\n if (hitPt == null) {\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n if (end == null) {\n throw new Error(\n 'Cannot complete new measurement interaction. End point is empty.'\n );\n }\n return this.setMeasurement(invalidMeasurement(start, end));\n } else if (!this.hitWorldValid) {\n return this.setMeasurement(invalidMeasurement(start, hitPt));\n } else {\n return this.setMeasurement(validMeasurement(start, hitPt));\n }\n }\n\n private setMeasurement(\n measurement: PointToPointMeasurementResult\n ): PointToPointMeasurementResult {\n this.model.setMeasurement(measurement);\n return measurement;\n }\n}\n\n/**\n * Base class for an edit anchor interaction.\n *\n * @see {@link EditStartAnchorInteraction}\n * @see {@link EditEndAnchorInteraction}\n */\nabstract class EditAnchorInteraction implements PointToPointInteraction {\n public constructor(\n protected readonly measurement: PointToPointMeasurementResult,\n protected readonly model: PointToPointInteractionModel\n ) {}\n\n public update(pt: Point.Point, context: PointToPointHitProvider): void {\n const world = context\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n const isHit = context.hitTester().hitTest(pt);\n\n if (world == null) {\n throw new Error(\n 'Cannot update new measurement interaction. End point is empty.'\n );\n } else if (!isHit) {\n this.model.setIndicator(world);\n this.setMeasurement(this.getInvalidMeasurement(world));\n } else {\n this.model.setIndicator(world);\n this.setMeasurement(this.getValidMeasurement(world));\n }\n }\n\n public async finish(\n pt: Point.Point,\n hits: PointToPointHitProvider\n ): Promise<PointToPointMeasurementResult> {\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, pt);\n\n this.model.setIndicator(undefined);\n\n if (hitPt == null) {\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n if (end == null) {\n throw new Error(\n 'Cannot complete edit measurement interaction. End point is empty.'\n );\n }\n return this.setMeasurement(this.getInvalidMeasurement(end));\n } else {\n return this.setMeasurement(this.getValidMeasurement(hitPt));\n }\n }\n\n private setMeasurement(\n measurement: PointToPointMeasurementResult\n ): PointToPointMeasurementResult {\n this.model.setMeasurement(measurement);\n return measurement;\n }\n\n protected abstract getInvalidMeasurement(\n world: Vector3.Vector3\n ): PointToPointMeasurementResult;\n\n protected abstract getValidMeasurement(\n world: Vector3.Vector3\n ): PointToPointMeasurementResult;\n}\n\nclass EditStartAnchorInteraction\n extends EditAnchorInteraction\n implements PointToPointInteraction\n{\n public constructor(\n measurement: PointToPointMeasurementResult,\n model: PointToPointInteractionModel\n ) {\n super(measurement, model);\n }\n\n protected getInvalidMeasurement(\n startPt: Vector3.Vector3\n ): PointToPointMeasurementResult {\n return invalidMeasurement(startPt, this.measurement.end);\n }\n\n protected getValidMeasurement(\n startPt: Vector3.Vector3\n ): PointToPointMeasurementResult {\n return validMeasurement(startPt, this.measurement.end);\n }\n}\n\nclass EditEndAnchorInteraction\n extends EditAnchorInteraction\n implements PointToPointInteraction\n{\n public constructor(\n measurement: PointToPointMeasurementResult,\n model: PointToPointInteractionModel\n ) {\n super(measurement, model);\n }\n\n protected getInvalidMeasurement(\n endPt: Vector3.Vector3\n ): PointToPointMeasurementResult {\n return invalidMeasurement(this.measurement.start, endPt);\n }\n\n protected getValidMeasurement(\n endPt: Vector3.Vector3\n ): PointToPointMeasurementResult {\n return validMeasurement(this.measurement.start, endPt);\n }\n}\n\nasync function getHit(\n raycaster: RaycasterLike,\n pt: Point.Point\n): Promise<Vector3.Vector3 | undefined> {\n const hitRes = await raycaster.hitItems(pt);\n const [hit] = hitRes?.hits ?? [];\n\n if (hit?.hitPoint != null) {\n const hitPt = fromPbVector3f(hit.hitPoint);\n if (Mapper.isInvalid(hitPt)) {\n throw new Error(`Invalid hit response [${hitPt.errors.join(',')}]`);\n }\n return hitPt;\n } else return undefined;\n}\n\nfunction validMeasurement(\n start: Vector3.Vector3,\n end: Vector3.Vector3\n): PointToPointMeasurementResult {\n return { start, end, distance: Vector3.distance(start, end), valid: true };\n}\n\nfunction invalidMeasurement(\n start: Vector3.Vector3,\n end: Vector3.Vector3\n): PointToPointMeasurementResult {\n return { start, end, valid: false };\n}\n"]}
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/components/viewer-measurement-distance/interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAc,eAAe,EAAY,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgDnD;;GAEG;AACH,MAAM,OAAO,iCAAiC;IAC5C,YAAoC,KAAmC;QAAnC,UAAK,GAAL,KAAK,CAA8B;IAAG,CAAC;IAE3E;;;;;;;OAOG;IACI,cAAc,CACnB,EAAe,EACf,IAA6B;QAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,KAAK,IAAI,IAAI;YAClB,CAAC,CAAC,IAAI,yBAAyB,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;YACtD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACI,eAAe,CAAC,MAAc;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAEhD,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,MAAM,KAAK,OAAO;YACvB,CAAC,CAAC,IAAI,0BAA0B,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC;YACzD,CAAC,CAAC,IAAI,wBAAwB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACI,cAAc;QACnB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACI,aAAa,CAClB,EAAe,EACf,IAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,OAAO,IAAI,IAAI,CAAC;IACzB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,4BAA4B;IAAzC;QAIU,uBAAkB,GAAG,IAAI,eAAe,EAE7C,CAAC;QAEI,qBAAgB,GAAG,IAAI,eAAe,EAA+B,CAAC;IA8FhF,CAAC;IA5FC;;OAEG;IACI,MAAM,CAAC,KAAK;QACjB,OAAO,IAAI,4BAA4B,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACI,cAAc;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,cAAc,CACnB,WAAsD;QAEtD,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACI,wBAAwB,CAC7B,KAAkC,EAClC,GAAgC,EAChC,KAAc;QAEd,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,KAAK;gBACvB,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC;gBAC9B,CAAC,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,oBAAoB,CACzB,QAA6D;QAE7D,OAAO,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,EAA+B;QACjD,IAAI,IAAI,CAAC,SAAS,KAAK,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CACvB,QAA+C;QAE/C,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;CACF;AA6BD;;;;GAIG;AACH,MAAM,yBAAyB;IAQ7B,YACkB,EAAe,EACf,KAAsB,EACrB,KAAmC;QAFpC,OAAE,GAAF,EAAE,CAAa;QACf,UAAK,GAAL,KAAK,CAAiB;QACrB,UAAK,GAAL,KAAK,CAA8B;QAR9C,kBAAa,GAAG,IAAI,CAAC;QAE7B,sEAAsE;QAC9D,kBAAa,GAAG,KAAK,CAAC;IAM3B,CAAC;IAEI,mBAAmB,CAAC,IAA6B;QACvD,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAA6B;QACpD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QAE/C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,wEAAwE;YACxE,UAAU;YACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAElE,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAEM,MAAM,CAAC,EAAe,EAAE,IAA6B;;QAC1D,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE/B,MAAM,GAAG,GAAG,IAAI;iBACb,SAAS,EAAE;iBACX,qBAAqB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,QAAQ,mCAAI,IAAI,CAAC,KAAK,CAAC;YAE1C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;YACJ,CAAC;iBAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC;gBACzC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,EAAe,EACf,IAA6B;;QAE7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,2CAA2C;QAC3C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,IAAI,CAAC,YAAY,CAAC;QAExB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,QAAQ,mCAAI,IAAI,CAAC,KAAK,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI;iBACb,SAAS,EAAE;iBACX,qBAAqB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,WAA0C;QAE1C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC;IACrB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAe,qBAAqB;IAClC,YACqB,WAA0C,EAC1C,KAAmC;QADnC,gBAAW,GAAX,WAAW,CAA+B;QAC1C,UAAK,GAAL,KAAK,CAA8B;IACrD,CAAC;IAEG,MAAM,CAAC,EAAe,EAAE,OAAgC;QAC7D,MAAM,KAAK,GAAG,OAAO;aAClB,SAAS,EAAE;aACX,qBAAqB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAE9C,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;QACJ,CAAC;aAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,EAAe,EACf,IAA6B;QAE7B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,IAAI;iBACb,SAAS,EAAE;iBACX,qBAAqB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,cAAc,CACpB,WAA0C;QAE1C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACvC,OAAO,WAAW,CAAC;IACrB,CAAC;CASF;AAED,MAAM,0BACJ,SAAQ,qBAAqB;IAG7B,YACE,WAA0C,EAC1C,KAAmC;QAEnC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAES,qBAAqB,CAC7B,OAAwB;QAExB,OAAO,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;IAES,mBAAmB,CAC3B,OAAwB;QAExB,OAAO,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,wBACJ,SAAQ,qBAAqB;IAG7B,YACE,WAA0C,EAC1C,KAAmC;QAEnC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAES,qBAAqB,CAC7B,KAAsB;QAEtB,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;IAES,mBAAmB,CAC3B,KAAsB;QAEtB,OAAO,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;CACF;AAED,KAAK,UAAU,MAAM,CACnB,SAAwB,EACxB,EAAe;;IAEf,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,mCAAI,EAAE,CAAC;IAEjC,IAAI,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,QAAQ,KAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;;QAAM,OAAO,SAAS,CAAC;AAC1B,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAsB,EACtB,GAAoB;IAEpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC7E,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAsB,EACtB,GAAoB;IAEpB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACtC,CAAC","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\nimport { Mapper } from '@vertexvis/utils';\n\nimport { fromPbVector3f } from '../../lib/mappers';\nimport { RaycasterLike } from '../../lib/scenes';\nimport { PointToPointHitTester } from './hitTest';\nimport { Anchor } from './utils';\n\n/**\n * A measurement result that represents the distance between two points.\n */\nexport interface PointToPointMeasurementResult {\n /**\n * The distance, in world units, between two points. This value is only\n * populated if the result is valid.\n */\n distance?: number;\n\n /**\n * The first point, in world units.\n */\n start: Vector3.Vector3;\n\n /**\n * The second point, in world units.\n */\n end: Vector3.Vector3;\n\n /**\n * Indicates if this result is valid. A value of `false` indicates that one of\n * the points does not touch any geometry.\n */\n valid: boolean;\n}\n\n/**\n * Provides APIs to perform local or remote hit tests.\n */\nexport interface PointToPointHitProvider {\n /**\n * Returns a hit tester that can be used to test if a point is over geometry\n * without having to do an API call.\n */\n hitTester(): PointToPointHitTester;\n\n /**\n * Returns a raycaster that can be used to perform hits through API calls.\n */\n raycaster(): Promise<RaycasterLike>;\n}\n\n/**\n * A controller to handle point-to-point measurement interactions.\n */\nexport class PointToPointInteractionController {\n public constructor(private readonly model: PointToPointInteractionModel) {}\n\n /**\n * Returns an interaction handler to perform a new measurement.\n *\n * @param pt A point in viewport coordinates.\n * @param hits A provider to perform hits.\n * @returns An interaction handler, or `undefined` if the point does not hit\n * any geometry.\n */\n public newMeasurement(\n pt: Point.Point,\n hits: PointToPointHitProvider,\n ): PointToPointInteraction | undefined {\n const world = hits.hitTester().transformPointToWorld(pt);\n return world != null\n ? new NewMeasurementInteraction(pt, world, this.model)\n : undefined;\n }\n\n /**\n * Returns an interaction handler to edit an existing measurement.\n *\n * @param anchor The anchor to edit.\n * @returns An interaction handler to edit a measurement.\n */\n public editMeasurement(anchor: Anchor): PointToPointInteraction {\n const measurement = this.model.getMeasurement();\n\n if (measurement == null) {\n throw new Error('Cannot edit measurement. Measurement is empty.');\n }\n\n return anchor === 'start'\n ? new EditStartAnchorInteraction(measurement, this.model)\n : new EditEndAnchorInteraction(measurement, this.model);\n }\n\n /**\n * Clears the position of the feedback indicator.\n */\n public clearIndicator(): void {\n this.model.setIndicator(undefined);\n }\n\n /**\n * Updates the position of the feedback indicator.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n * @returns `true` if the indicator is over geometry.\n */\n public moveIndicator(\n pt: Point.Point,\n hits: PointToPointHitProvider,\n ): boolean {\n const worldPt = hits.hitTester().transformPointToWorld(pt);\n this.model.setIndicator(worldPt);\n return worldPt != null;\n }\n}\n\n/**\n * The model for point-to-point interactions.\n */\nexport class PointToPointInteractionModel {\n private indicator?: Vector3.Vector3;\n private measurement?: PointToPointMeasurementResult;\n\n private measurementChanged = new EventDispatcher<\n PointToPointMeasurementResult | undefined\n >();\n\n private indicatorChanged = new EventDispatcher<Vector3.Vector3 | undefined>();\n\n /**\n * Returns a model that doesn't have the indicator or measurement set.\n */\n public static empty(): PointToPointInteractionModel {\n return new PointToPointInteractionModel();\n }\n\n /**\n * Returns the current measurement for the interaction.\n */\n public getMeasurement(): PointToPointMeasurementResult | undefined {\n return this.measurement;\n }\n\n /**\n * Updates the measurement and emits a change event.\n *\n * @param measurement The new measurement.\n */\n public setMeasurement(\n measurement: PointToPointMeasurementResult | undefined,\n ): void {\n if (this.measurement !== measurement) {\n this.measurement = measurement;\n this.measurementChanged.emit(measurement);\n }\n }\n\n /**\n * Updates the measurement from the given values. If `start` or `end` are\n * `undefined` the measurement will be cleared.\n *\n * @param start The start point.\n * @param end The end point.\n * @param valid `true` if the measurement is valid.\n */\n public setMeasurementFromValues(\n start: Vector3.Vector3 | undefined,\n end: Vector3.Vector3 | undefined,\n valid: boolean,\n ): void {\n if (start != null && end != null) {\n const measurement = valid\n ? validMeasurement(start, end)\n : invalidMeasurement(start, end);\n this.setMeasurement(measurement);\n } else {\n this.setMeasurement(undefined);\n }\n }\n\n /**\n * Adds a callback that is invoked when the measurement changes.\n *\n * @param listener The callback to register.\n * @returns A `Disposable` to remove the event listener.\n */\n public onMeasurementChanged(\n listener: Listener<PointToPointMeasurementResult | undefined>,\n ): Disposable {\n return this.measurementChanged.on(listener);\n }\n\n /**\n * Gets the position representing the feedback indicator.\n */\n public getIndicator(): Vector3.Vector3 | undefined {\n return this.indicator;\n }\n\n /**\n * Updates the position of the feedback indicator.\n */\n public setIndicator(pt: Vector3.Vector3 | undefined): void {\n if (this.indicator !== pt) {\n this.indicator = pt;\n this.indicatorChanged.emit(pt);\n }\n }\n\n /**\n * Adds a callback that is invoked when the feedback indicator position\n * changes.\n *\n * @param listener The callback to register.\n * @returns A `Disposable` to remove the event listener.\n */\n public onIndicatorChanged(\n listener: Listener<Vector3.Vector3 | undefined>,\n ): Disposable {\n return this.indicatorChanged.on(listener);\n }\n}\n\n/**\n * An interface for performing point-to-point measurement interactions.\n *\n * @see {@link PointToPointInteractionController} to start an interaction.\n */\nexport interface PointToPointInteraction {\n /**\n * UI should call this for each user iteration.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n */\n update(pt: Point.Point, hits: PointToPointHitProvider): void;\n\n /**\n * UI should call this when the user interaction is finished. Returns a\n * `Promise` that resolves with the final measurement.\n *\n * @param pt A point, in viewport coordinates.\n * @param hits A provider to perform hits.\n */\n finish(\n pt: Point.Point,\n hits: PointToPointHitProvider,\n ): Promise<PointToPointMeasurementResult>;\n}\n\n/**\n * An interaction handler to perform a new measurement. As a user is performing\n * an interaction, the handler will fetch the position of the starting anchor.\n * While fetching the position, a position from the depth buffer will be used.\n */\nclass NewMeasurementInteraction implements PointToPointInteraction {\n private pendingStart: Promise<void> | undefined;\n private hitWorld: Vector3.Vector3 | undefined;\n private hitWorldValid = true;\n\n // Prevents any updates of the interaction while finish is completing.\n private preventUpdate = false;\n\n public constructor(\n public readonly pt: Point.Point,\n public readonly world: Vector3.Vector3,\n private readonly model: PointToPointInteractionModel,\n ) {}\n\n private fetchStartIfMissing(hits: PointToPointHitProvider): void {\n if (this.pendingStart == null) {\n this.pendingStart = this.fetchStart(hits);\n }\n }\n\n private async fetchStart(hits: PointToPointHitProvider): Promise<void> {\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, this.pt);\n\n if (hitPt == null) {\n // If the hit is empty, fallback to using a point derived from the depth\n // buffer.\n const invalidPt = hits.hitTester().transformPointToWorld(this.pt);\n\n this.hitWorld = invalidPt;\n this.hitWorldValid = false;\n } else {\n this.hitWorld = hitPt;\n this.hitWorldValid = true;\n }\n }\n\n public update(pt: Point.Point, hits: PointToPointHitProvider): void {\n if (!this.preventUpdate) {\n this.fetchStartIfMissing(hits);\n\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n const isHit = hits.hitTester().hitTest(pt);\n const start = this.hitWorld ?? this.world;\n\n if (end == null) {\n throw new Error(\n 'Cannot update new measurement interaction. End point is empty.',\n );\n } else if (!this.hitWorldValid || !isHit) {\n this.model.setIndicator(end);\n this.setMeasurement(invalidMeasurement(start, end));\n } else {\n this.model.setIndicator(end);\n this.setMeasurement(validMeasurement(start, end));\n }\n }\n }\n\n public async finish(\n pt: Point.Point,\n hits: PointToPointHitProvider,\n ): Promise<PointToPointMeasurementResult> {\n this.preventUpdate = true;\n\n // Wait for the hit for the starting point.\n this.fetchStartIfMissing(hits);\n await this.pendingStart;\n\n this.model.setIndicator(undefined);\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, pt);\n const start = this.hitWorld ?? this.world;\n this.preventUpdate = false;\n\n if (hitPt == null) {\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n if (end == null) {\n throw new Error(\n 'Cannot complete new measurement interaction. End point is empty.',\n );\n }\n return this.setMeasurement(invalidMeasurement(start, end));\n } else if (!this.hitWorldValid) {\n return this.setMeasurement(invalidMeasurement(start, hitPt));\n } else {\n return this.setMeasurement(validMeasurement(start, hitPt));\n }\n }\n\n private setMeasurement(\n measurement: PointToPointMeasurementResult,\n ): PointToPointMeasurementResult {\n this.model.setMeasurement(measurement);\n return measurement;\n }\n}\n\n/**\n * Base class for an edit anchor interaction.\n *\n * @see {@link EditStartAnchorInteraction}\n * @see {@link EditEndAnchorInteraction}\n */\nabstract class EditAnchorInteraction implements PointToPointInteraction {\n public constructor(\n protected readonly measurement: PointToPointMeasurementResult,\n protected readonly model: PointToPointInteractionModel,\n ) {}\n\n public update(pt: Point.Point, context: PointToPointHitProvider): void {\n const world = context\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n const isHit = context.hitTester().hitTest(pt);\n\n if (world == null) {\n throw new Error(\n 'Cannot update new measurement interaction. End point is empty.',\n );\n } else if (!isHit) {\n this.model.setIndicator(world);\n this.setMeasurement(this.getInvalidMeasurement(world));\n } else {\n this.model.setIndicator(world);\n this.setMeasurement(this.getValidMeasurement(world));\n }\n }\n\n public async finish(\n pt: Point.Point,\n hits: PointToPointHitProvider,\n ): Promise<PointToPointMeasurementResult> {\n const raycaster = await hits.raycaster();\n const hitPt = await getHit(raycaster, pt);\n\n this.model.setIndicator(undefined);\n\n if (hitPt == null) {\n const end = hits\n .hitTester()\n .transformPointToWorld(pt, { ignoreHitTest: true });\n if (end == null) {\n throw new Error(\n 'Cannot complete edit measurement interaction. End point is empty.',\n );\n }\n return this.setMeasurement(this.getInvalidMeasurement(end));\n } else {\n return this.setMeasurement(this.getValidMeasurement(hitPt));\n }\n }\n\n private setMeasurement(\n measurement: PointToPointMeasurementResult,\n ): PointToPointMeasurementResult {\n this.model.setMeasurement(measurement);\n return measurement;\n }\n\n protected abstract getInvalidMeasurement(\n world: Vector3.Vector3,\n ): PointToPointMeasurementResult;\n\n protected abstract getValidMeasurement(\n world: Vector3.Vector3,\n ): PointToPointMeasurementResult;\n}\n\nclass EditStartAnchorInteraction\n extends EditAnchorInteraction\n implements PointToPointInteraction\n{\n public constructor(\n measurement: PointToPointMeasurementResult,\n model: PointToPointInteractionModel,\n ) {\n super(measurement, model);\n }\n\n protected getInvalidMeasurement(\n startPt: Vector3.Vector3,\n ): PointToPointMeasurementResult {\n return invalidMeasurement(startPt, this.measurement.end);\n }\n\n protected getValidMeasurement(\n startPt: Vector3.Vector3,\n ): PointToPointMeasurementResult {\n return validMeasurement(startPt, this.measurement.end);\n }\n}\n\nclass EditEndAnchorInteraction\n extends EditAnchorInteraction\n implements PointToPointInteraction\n{\n public constructor(\n measurement: PointToPointMeasurementResult,\n model: PointToPointInteractionModel,\n ) {\n super(measurement, model);\n }\n\n protected getInvalidMeasurement(\n endPt: Vector3.Vector3,\n ): PointToPointMeasurementResult {\n return invalidMeasurement(this.measurement.start, endPt);\n }\n\n protected getValidMeasurement(\n endPt: Vector3.Vector3,\n ): PointToPointMeasurementResult {\n return validMeasurement(this.measurement.start, endPt);\n }\n}\n\nasync function getHit(\n raycaster: RaycasterLike,\n pt: Point.Point,\n): Promise<Vector3.Vector3 | undefined> {\n const hitRes = await raycaster.hitItems(pt);\n const [hit] = hitRes?.hits ?? [];\n\n if (hit?.hitPoint != null) {\n const hitPt = fromPbVector3f(hit.hitPoint);\n if (Mapper.isInvalid(hitPt)) {\n throw new Error(`Invalid hit response [${hitPt.errors.join(',')}]`);\n }\n return hitPt;\n } else return undefined;\n}\n\nfunction validMeasurement(\n start: Vector3.Vector3,\n end: Vector3.Vector3,\n): PointToPointMeasurementResult {\n return { start, end, distance: Vector3.distance(start, end), valid: true };\n}\n\nfunction invalidMeasurement(\n start: Vector3.Vector3,\n end: Vector3.Vector3,\n): PointToPointMeasurementResult {\n return { start, end, valid: false };\n}\n"]}