@vertexvis/viewer 1.1.1-testing.3 → 1.1.1-testing.5

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 (476) hide show
  1. package/README.template.md +14 -8
  2. package/dist/cjs/{bundle-07I6_WqC.js → bundle-BCS0nA91.js} +28 -25
  3. package/dist/cjs/bundle-BCS0nA91.js.map +1 -0
  4. package/dist/cjs/{config-CepHuwRF.js → config-OELTgslY.js} +3 -3
  5. package/dist/cjs/{config-CepHuwRF.js.map → config-OELTgslY.js.map} +1 -1
  6. package/dist/cjs/{controller-Dklbe0Y6.js → controller-DvE3p6ta.js} +3 -3
  7. package/dist/cjs/{controller-Dklbe0Y6.js.map → controller-DvE3p6ta.js.map} +1 -1
  8. package/dist/cjs/{dom-Dlu6-7PF.js → dom-BuQSLPWr.js} +3 -3
  9. package/dist/cjs/{dom-Dlu6-7PF.js.map → dom-BuQSLPWr.js.map} +1 -1
  10. package/dist/cjs/{entities-BdWnb6KI.js → entities-rj-TEPKc.js} +4 -4
  11. package/dist/cjs/{entities-BdWnb6KI.js.map → entities-rj-TEPKc.js.map} +1 -1
  12. package/dist/cjs/{geometry_pb-BISQT2vx.js → geometry_pb-asn2mNvW.js} +3 -3
  13. package/dist/cjs/{geometry_pb-BISQT2vx.js.map → geometry_pb-asn2mNvW.js.map} +1 -1
  14. package/dist/cjs/grpc-D5Apx_zz.js.map +1 -1
  15. package/dist/cjs/index.cjs.js +13 -13
  16. package/dist/cjs/loader.cjs.js +1 -1
  17. package/dist/cjs/{markup-C-qyTwID.js → markup-Du4uVRo4.js} +3 -3
  18. package/dist/cjs/{markup-C-qyTwID.js.map → markup-Du4uVRo4.js.map} +1 -1
  19. package/dist/cjs/{model-Dy5FvjIA.js → model-BC6acIWJ.js} +3 -3
  20. package/dist/cjs/{model-Dy5FvjIA.js.map → model-BC6acIWJ.js.map} +1 -1
  21. package/dist/cjs/model-Bw4h8wNt.js.map +1 -1
  22. package/dist/cjs/{model-k5VBFN6C.js → model-DqxeakCS.js} +3 -3
  23. package/dist/cjs/{model-k5VBFN6C.js.map → model-DqxeakCS.js.map} +1 -1
  24. package/dist/cjs/{multiElementInteractionHandler-Bqpg2wVT.js → multiElementInteractionHandler-Bdeo6FYp.js} +6 -5
  25. package/dist/cjs/multiElementInteractionHandler-Bdeo6FYp.js.map +1 -0
  26. package/dist/cjs/{overlays-BujVkBnG.js → overlays-DASFbMSp.js} +3 -3
  27. package/dist/cjs/{overlays-BujVkBnG.js.map → overlays-DASFbMSp.js.map} +1 -1
  28. package/dist/cjs/{queries-GhYmoomu.js → queries-e19TP_oF.js} +5 -5
  29. package/dist/cjs/queries-e19TP_oF.js.map +1 -0
  30. package/dist/cjs/{regl-component-CB004H91.js → regl-component-DjVaO3t3.js} +6 -6
  31. package/dist/cjs/{regl-component-CB004H91.js.map → regl-component-DjVaO3t3.js.map} +1 -1
  32. package/dist/cjs/{representation_pb-CHCm5o1e.js → representation_pb-BVBPrHLf.js} +3 -3
  33. package/dist/cjs/{representation_pb-CHCm5o1e.js.map → representation_pb-BVBPrHLf.js.map} +1 -1
  34. package/dist/cjs/{results-BpfUIwa8.js → results-CU9Ctm2K.js} +3 -3
  35. package/dist/cjs/{results-BpfUIwa8.js.map → results-CU9Ctm2K.js.map} +1 -1
  36. package/dist/cjs/{streamAttributes-CJOD7AxG.js → streamAttributes-M3UUIO3l.js} +118 -95
  37. package/dist/cjs/streamAttributes-M3UUIO3l.js.map +1 -0
  38. package/dist/cjs/{util-smaTO4bk.js → util-gX3IGslq.js} +3 -3
  39. package/dist/cjs/{util-smaTO4bk.js.map → util-gX3IGslq.js.map} +1 -1
  40. package/dist/cjs/{utils-BsXO-wLi.js → utils-D5TGpFAV.js} +3 -3
  41. package/dist/cjs/utils-D5TGpFAV.js.map +1 -0
  42. package/dist/cjs/{utils-DY6afhh8.js → utils-opS9hsaU.js} +3 -3
  43. package/dist/cjs/{utils-DY6afhh8.js.map → utils-opS9hsaU.js.map} +1 -1
  44. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +2 -2
  45. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  46. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +3 -3
  47. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js.map +1 -1
  48. package/dist/cjs/vertex-scene-tree-table-column.cjs.entry.js.map +1 -1
  49. package/dist/cjs/vertex-scene-tree.cjs.entry.js +3 -3
  50. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  51. package/dist/cjs/vertex-viewer-annotation-callout.cjs.entry.js.map +1 -1
  52. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +4 -4
  53. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js.map +1 -1
  54. package/dist/cjs/vertex-viewer-button_3.cjs.entry.js +6 -1
  55. package/dist/cjs/vertex-viewer-button_3.cjs.entry.js.map +1 -1
  56. package/dist/cjs/vertex-viewer-default-toolbar.cjs.entry.js +2 -2
  57. package/dist/cjs/vertex-viewer-default-toolbar.cjs.entry.js.map +1 -1
  58. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +5 -5
  59. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
  60. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +5 -5
  61. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +3 -3
  62. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js +4 -4
  63. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js.map +1 -1
  64. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +3 -3
  65. package/dist/cjs/vertex-viewer-markup.cjs.entry.js.map +1 -1
  66. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +3 -3
  67. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +8 -8
  68. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +5 -5
  69. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +7 -7
  70. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +7 -7
  71. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  72. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +9 -8
  73. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  74. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +3 -3
  75. package/dist/cjs/vertex-viewer-spinner.cjs.entry.js.map +1 -1
  76. package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js +2 -2
  77. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +7 -7
  78. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  79. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +2 -2
  80. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js +1 -1
  81. package/dist/cjs/vertex-viewer.cjs.entry.js +8 -8
  82. package/dist/cjs/viewer.cjs.js +1 -1
  83. package/dist/cjs/{viewport-B70DgDZj.js → viewport-BDbB9o9T.js} +3 -3
  84. package/dist/cjs/{viewport-B70DgDZj.js.map → viewport-BDbB9o9T.js.map} +1 -1
  85. package/dist/collection/components/scene-tree/scene-tree.css +2 -3
  86. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  87. package/dist/collection/components/scene-tree-notification-banner/scene-tree-notification-banner.css +1 -1
  88. package/dist/collection/components/scene-tree-search/scene-tree-search.css +1 -1
  89. package/dist/collection/components/scene-tree-search/scene-tree-search.js +1 -1
  90. package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
  91. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.css +10 -10
  92. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js +1 -1
  93. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js.map +1 -1
  94. package/dist/collection/components/scene-tree-table-column/scene-tree-table-column.css +0 -1
  95. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.css +3 -3
  96. package/dist/collection/components/viewer-annotation-callout/viewer-annotation-callout.css +3 -4
  97. package/dist/collection/components/viewer-box-query-tool/types.js.map +1 -1
  98. package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.css +9 -7
  99. package/dist/collection/components/viewer-button/viewer-button.js +32 -1
  100. package/dist/collection/components/viewer-button/viewer-button.js.map +1 -1
  101. package/dist/collection/components/viewer-default-toolbar/viewer-default-toolbar.css +2 -2
  102. package/dist/collection/components/viewer-default-toolbar/viewer-default-toolbar.js +1 -1
  103. package/dist/collection/components/viewer-default-toolbar/viewer-default-toolbar.js.map +1 -1
  104. package/dist/collection/components/viewer-markup/viewer-markup.js.map +1 -1
  105. package/dist/collection/components/viewer-markup-arrow/utils.js.map +1 -1
  106. package/dist/collection/components/viewer-markup-tool/viewer-markup-tool.css +2 -2
  107. package/dist/collection/components/viewer-pin-group/viewer-pin-group.css +12 -11
  108. package/dist/collection/components/viewer-pin-label/viewer-pin-label.css +21 -8
  109. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js +4 -3
  110. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  111. package/dist/collection/components/viewer-pin-label-line/viewer-pin-label-line.css +5 -4
  112. package/dist/collection/components/viewer-spinner/viewer-spinner.css +2 -2
  113. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget-components.js +1 -1
  114. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget-components.js.map +1 -1
  115. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.css +1 -2
  116. package/dist/collection/lib/grpc.js.map +1 -1
  117. package/dist/collection/lib/interactions/baseInteractionHandler.js +2 -1
  118. package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
  119. package/dist/collection/lib/scenes/scene.js.map +1 -1
  120. package/dist/collection/lib/scenes/sceneViewStateLoader.js.map +1 -1
  121. package/dist/collection/lib/stream/state.js.map +1 -1
  122. package/dist/collection/lib/types/loadableResource.js.map +1 -1
  123. package/dist/collection/lib/types/sceneViewStateIdentifier.js.map +1 -1
  124. package/dist/collection/lib/walk-mode/model.js.map +1 -1
  125. package/dist/collection/workers/png-decoder-pool.js +4 -3
  126. package/dist/collection/workers/png-decoder-pool.js.map +1 -1
  127. package/dist/components/index.js +1 -1
  128. package/dist/components/p-2UsvOTHJ.js +5 -0
  129. package/dist/components/p-2UsvOTHJ.js.map +1 -0
  130. package/dist/components/{p-CZgX-9yo.js → p-5bk1mHRt.js} +2 -2
  131. package/dist/components/{p-DRGCkSEK.js → p-B8530k7R.js} +2 -2
  132. package/dist/components/{p-garvKln8.js → p-BAuOB8M-.js} +2 -2
  133. package/dist/components/p-BAuOB8M-.js.map +1 -0
  134. package/dist/components/{p-BKQMbekH.js → p-BCuMPvZO.js} +2 -2
  135. package/dist/components/p-BFEV_v80.js +5 -0
  136. package/dist/components/p-BFEV_v80.js.map +1 -0
  137. package/dist/components/{p-C02XtMl4.js → p-BHyxBmg6.js} +2 -2
  138. package/dist/components/{p-O1_Yvjd6.js → p-BT9d9jRt.js} +2 -2
  139. package/dist/components/{p-oDn1DcWj.js → p-BZDn1Vuv.js} +2 -2
  140. package/dist/components/{p-VEJB73Ei.js → p-Bdf4AcJ2.js} +2 -2
  141. package/dist/components/p-BgzjmANj.js +5 -0
  142. package/dist/components/p-BgzjmANj.js.map +1 -0
  143. package/dist/components/p-BjvjKoy7.js +5 -0
  144. package/dist/components/p-BjvjKoy7.js.map +1 -0
  145. package/dist/components/p-Bwtyddca.js +5 -0
  146. package/dist/components/p-Bwtyddca.js.map +1 -0
  147. package/dist/components/{p-CMdP8O-G.js → p-Bx42CNGV.js} +2 -2
  148. package/dist/components/{p-CelQDFR0.js → p-C12jtCFb.js} +2 -2
  149. package/dist/components/p-C86HMDzi.js +5 -0
  150. package/dist/components/p-C86HMDzi.js.map +1 -0
  151. package/dist/components/{p-Dzs4u_ZY.js → p-CABws4i9.js} +2 -2
  152. package/dist/components/p-CIuxJYJL.js.map +1 -1
  153. package/dist/components/{p-BqeEZXPn.js → p-CPROw2BU.js} +2 -2
  154. package/dist/components/p-CSVgoQU8.js +5 -0
  155. package/dist/components/p-CSVgoQU8.js.map +1 -0
  156. package/dist/components/{p-DnVcQAR9.js → p-CTi-0-dI.js} +2 -2
  157. package/dist/components/{p-EG7pMA2M.js → p-CeZe0Qql.js} +2 -2
  158. package/dist/components/p-CioaIHsi.js.map +1 -1
  159. package/dist/components/{p-Due5EmBt.js → p-Clyxptbp.js} +2 -2
  160. package/dist/components/{p-taOlygmc.js → p-Cs2aiMUK.js} +2 -2
  161. package/dist/components/p-Cs2aiMUK.js.map +1 -0
  162. package/dist/components/p-DUo-H-nW.js +5 -0
  163. package/dist/components/p-DUo-H-nW.js.map +1 -0
  164. package/dist/components/{p-MnZadXO8.js → p-D_h07qsA.js} +2 -2
  165. package/dist/components/{p-DCTZZ5Rd.js → p-DjQ6RXWP.js} +2 -2
  166. package/dist/components/p-DxuSiXYg.js.map +1 -1
  167. package/dist/components/{p-CxzyM08j.js → p-DyL2wWm6.js} +2 -2
  168. package/dist/components/{p-avWSFTeP.js → p-JvS9LLoO.js} +2 -2
  169. package/dist/components/{p-CfTvpqud.js → p-KidjtXKE.js} +2 -2
  170. package/dist/{viewer/p-7m7Vr5V7.js → components/p-Ng27jBsS.js} +2 -2
  171. package/dist/components/p-Ng27jBsS.js.map +1 -0
  172. package/dist/components/{p-BC777sCK.js → p-UJR-ixsy.js} +2 -2
  173. package/dist/components/{p-Ib4vgh2t.js → p-UrT4ZJv3.js} +2 -2
  174. package/dist/components/{p-Ib4vgh2t.js.map → p-UrT4ZJv3.js.map} +1 -1
  175. package/dist/components/{p-mpsCUvSn.js → p-_qi2VkC2.js} +2 -2
  176. package/dist/components/{p-CNprIkKd.js → p-rDr0x5Z7.js} +2 -2
  177. package/dist/components/vertex-scene-tree-search.js +1 -1
  178. package/dist/components/vertex-scene-tree-table-cell.js +1 -1
  179. package/dist/components/vertex-scene-tree-table-cell.js.map +1 -1
  180. package/dist/components/vertex-scene-tree-table-column.js.map +1 -1
  181. package/dist/components/vertex-scene-tree-table-layout.js +1 -1
  182. package/dist/components/vertex-scene-tree.js +1 -1
  183. package/dist/components/vertex-scene-tree.js.map +1 -1
  184. package/dist/components/vertex-viewer-annotation-callout.js.map +1 -1
  185. package/dist/components/vertex-viewer-box-query-tool.js +1 -1
  186. package/dist/components/vertex-viewer-box-query-tool.js.map +1 -1
  187. package/dist/components/vertex-viewer-button.js +1 -1
  188. package/dist/components/vertex-viewer-default-toolbar.js +1 -1
  189. package/dist/components/vertex-viewer-default-toolbar.js.map +1 -1
  190. package/dist/components/vertex-viewer-dom-element.js +1 -1
  191. package/dist/components/vertex-viewer-dom-group.js +1 -1
  192. package/dist/components/vertex-viewer-dom-renderer.js +1 -1
  193. package/dist/components/vertex-viewer-hit-result-indicator.js +1 -1
  194. package/dist/components/vertex-viewer-markup-arrow.js +1 -1
  195. package/dist/components/vertex-viewer-markup-circle.js +1 -1
  196. package/dist/components/vertex-viewer-markup-freeform.js +1 -1
  197. package/dist/components/vertex-viewer-markup-tool.js +1 -1
  198. package/dist/components/vertex-viewer-markup-tool.js.map +1 -1
  199. package/dist/components/vertex-viewer-markup.js +1 -1
  200. package/dist/components/vertex-viewer-markup.js.map +1 -1
  201. package/dist/components/vertex-viewer-measurement-details.js +1 -1
  202. package/dist/components/vertex-viewer-measurement-distance.js +1 -1
  203. package/dist/components/vertex-viewer-measurement-line.js +1 -1
  204. package/dist/components/vertex-viewer-measurement-overlays.js +1 -1
  205. package/dist/components/vertex-viewer-measurement-precise.js +1 -1
  206. package/dist/components/vertex-viewer-pin-group.js +1 -1
  207. package/dist/components/vertex-viewer-pin-label-line.js +1 -1
  208. package/dist/components/vertex-viewer-pin-label.js +1 -1
  209. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  210. package/dist/components/vertex-viewer-teleport-tool.js +1 -1
  211. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  212. package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
  213. package/dist/components/vertex-viewer-view-cube.js +1 -1
  214. package/dist/components/vertex-viewer-walk-mode-tool.js +1 -1
  215. package/dist/components/vertex-viewer.js +1 -1
  216. package/dist/esm/{bundle-CZZALKHT.js → bundle-2UsvOTHJ.js} +28 -25
  217. package/dist/esm/bundle-2UsvOTHJ.js.map +1 -0
  218. package/dist/esm/{config-CyaUTJEG.js → config-Cqrcty7U.js} +3 -3
  219. package/dist/esm/{config-CyaUTJEG.js.map → config-Cqrcty7U.js.map} +1 -1
  220. package/dist/esm/{controller-ByBd8r3O.js → controller-BPECXXfj.js} +3 -3
  221. package/dist/esm/{controller-ByBd8r3O.js.map → controller-BPECXXfj.js.map} +1 -1
  222. package/dist/esm/{dom-Bbf2HAst.js → dom-DaP9SiyY.js} +3 -3
  223. package/dist/esm/{dom-Bbf2HAst.js.map → dom-DaP9SiyY.js.map} +1 -1
  224. package/dist/esm/{entities-DriL3zBC.js → entities-CawBZH7i.js} +4 -4
  225. package/dist/esm/{entities-DriL3zBC.js.map → entities-CawBZH7i.js.map} +1 -1
  226. package/dist/esm/{geometry_pb-BEB8SExe.js → geometry_pb-COdZQiRi.js} +3 -3
  227. package/dist/esm/{geometry_pb-BEB8SExe.js.map → geometry_pb-COdZQiRi.js.map} +1 -1
  228. package/dist/esm/grpc-hWL8wFvk.js.map +1 -1
  229. package/dist/esm/index.js +13 -13
  230. package/dist/esm/index.mjs +13 -13
  231. package/dist/esm/loader.js +1 -1
  232. package/dist/esm/loader.mjs +1 -1
  233. package/dist/esm/{markup-y96-uR-l.js → markup-B58g75Hr.js} +3 -3
  234. package/dist/esm/{markup-y96-uR-l.js.map → markup-B58g75Hr.js.map} +1 -1
  235. package/dist/esm/{model-BJQo0DxL.js → model-B5KuXEsl.js} +3 -3
  236. package/dist/esm/{model-BJQo0DxL.js.map → model-B5KuXEsl.js.map} +1 -1
  237. package/dist/esm/model-BHVr1tU0.js.map +1 -1
  238. package/dist/esm/{model-CTdG73h9.js → model-Dc6T63-k.js} +3 -3
  239. package/dist/esm/{model-CTdG73h9.js.map → model-Dc6T63-k.js.map} +1 -1
  240. package/dist/esm/{multiElementInteractionHandler-C45E8VzE.js → multiElementInteractionHandler-3tE3OPpw.js} +6 -5
  241. package/dist/esm/multiElementInteractionHandler-3tE3OPpw.js.map +1 -0
  242. package/dist/esm/{overlays-DmcRtaSn.js → overlays-BwIqsqLW.js} +3 -3
  243. package/dist/esm/{overlays-DmcRtaSn.js.map → overlays-BwIqsqLW.js.map} +1 -1
  244. package/dist/esm/{queries-DWjy-LsV.js → queries-B4XotYyr.js} +5 -5
  245. package/dist/esm/queries-B4XotYyr.js.map +1 -0
  246. package/dist/esm/{regl-component-zzdsBise.js → regl-component-B1_h3_s8.js} +6 -6
  247. package/dist/esm/{regl-component-zzdsBise.js.map → regl-component-B1_h3_s8.js.map} +1 -1
  248. package/dist/esm/{representation_pb-CQdJxiGO.js → representation_pb-C4MJfZMo.js} +3 -3
  249. package/dist/esm/{representation_pb-CQdJxiGO.js.map → representation_pb-C4MJfZMo.js.map} +1 -1
  250. package/dist/esm/{results-ClIgKssN.js → results-De9arm7M.js} +3 -3
  251. package/dist/esm/{results-ClIgKssN.js.map → results-De9arm7M.js.map} +1 -1
  252. package/dist/esm/{streamAttributes-CTs61PCl.js → streamAttributes-BW9JzMeG.js} +117 -94
  253. package/dist/esm/streamAttributes-BW9JzMeG.js.map +1 -0
  254. package/dist/esm/{util-DUjEw5Kh.js → util-CMPFqnEv.js} +3 -3
  255. package/dist/esm/{util-DUjEw5Kh.js.map → util-CMPFqnEv.js.map} +1 -1
  256. package/dist/esm/{utils-DOjHP1wA.js → utils-B1mSYmAK.js} +3 -3
  257. package/dist/esm/{utils-DOjHP1wA.js.map → utils-B1mSYmAK.js.map} +1 -1
  258. package/dist/esm/{utils-DJ5FvINs.js → utils-c-mcLgsj.js} +3 -3
  259. package/dist/esm/utils-c-mcLgsj.js.map +1 -0
  260. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +2 -2
  261. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  262. package/dist/esm/vertex-scene-tree-table-cell.entry.js +3 -3
  263. package/dist/esm/vertex-scene-tree-table-cell.entry.js.map +1 -1
  264. package/dist/esm/vertex-scene-tree-table-column.entry.js.map +1 -1
  265. package/dist/esm/vertex-scene-tree.entry.js +3 -3
  266. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  267. package/dist/esm/vertex-viewer-annotation-callout.entry.js.map +1 -1
  268. package/dist/esm/vertex-viewer-box-query-tool.entry.js +4 -4
  269. package/dist/esm/vertex-viewer-box-query-tool.entry.js.map +1 -1
  270. package/dist/esm/vertex-viewer-button_3.entry.js +6 -1
  271. package/dist/esm/vertex-viewer-button_3.entry.js.map +1 -1
  272. package/dist/esm/vertex-viewer-default-toolbar.entry.js +2 -2
  273. package/dist/esm/vertex-viewer-default-toolbar.entry.js.map +1 -1
  274. package/dist/esm/vertex-viewer-dom-element_2.entry.js +5 -5
  275. package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
  276. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +5 -5
  277. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +3 -3
  278. package/dist/esm/vertex-viewer-markup-tool.entry.js +4 -4
  279. package/dist/esm/vertex-viewer-markup-tool.entry.js.map +1 -1
  280. package/dist/esm/vertex-viewer-markup.entry.js +3 -3
  281. package/dist/esm/vertex-viewer-markup.entry.js.map +1 -1
  282. package/dist/esm/vertex-viewer-measurement-details.entry.js +3 -3
  283. package/dist/esm/vertex-viewer-measurement-distance.entry.js +8 -8
  284. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +5 -5
  285. package/dist/esm/vertex-viewer-measurement-precise.entry.js +7 -7
  286. package/dist/esm/vertex-viewer-pin-group.entry.js +7 -7
  287. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  288. package/dist/esm/vertex-viewer-pin-label_2.entry.js +9 -8
  289. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  290. package/dist/esm/vertex-viewer-pin-tool.entry.js +3 -3
  291. package/dist/esm/vertex-viewer-spinner.entry.js.map +1 -1
  292. package/dist/esm/vertex-viewer-teleport-tool.entry.js +2 -2
  293. package/dist/esm/vertex-viewer-transform-widget.entry.js +7 -7
  294. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  295. package/dist/esm/vertex-viewer-view-cube.entry.js +2 -2
  296. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js +1 -1
  297. package/dist/esm/vertex-viewer.entry.js +8 -8
  298. package/dist/esm/viewer.js +1 -1
  299. package/dist/esm/{viewport-D90kzsD7.js → viewport-CHtidaFL.js} +3 -3
  300. package/dist/esm/{viewport-D90kzsD7.js.map → viewport-CHtidaFL.js.map} +1 -1
  301. package/dist/types/components/viewer-button/viewer-button.d.ts +5 -0
  302. package/dist/types/components.d.ts +14 -1
  303. package/dist/types/lib/walk-mode/model.d.ts +10 -10
  304. package/dist/types/regl-shape.d.ts +1 -5
  305. package/dist/types/workers/png-decoder-pool.d.ts +0 -1
  306. package/dist/viewer/index.esm.js +1 -1
  307. package/dist/viewer/{p-12a673f0.entry.js → p-1506f9a2.entry.js} +2 -2
  308. package/dist/viewer/p-1506f9a2.entry.js.map +1 -0
  309. package/dist/viewer/{p-78f422af.entry.js → p-287e0670.entry.js} +2 -2
  310. package/dist/viewer/{p-78f422af.entry.js.map → p-287e0670.entry.js.map} +1 -1
  311. package/dist/viewer/{p-7b4eec65.entry.js → p-293d8f3f.entry.js} +2 -2
  312. package/dist/viewer/p-2UsvOTHJ.js +5 -0
  313. package/dist/viewer/p-2UsvOTHJ.js.map +1 -0
  314. package/dist/viewer/{p-510fd2e1.entry.js → p-2d2fa147.entry.js} +2 -2
  315. package/dist/viewer/{p-a108a305.entry.js → p-2faddbf8.entry.js} +2 -2
  316. package/dist/viewer/{p-e3981cf8.entry.js → p-36349a80.entry.js} +2 -2
  317. package/dist/viewer/p-36349a80.entry.js.map +1 -0
  318. package/dist/viewer/{p-aa0359e0.entry.js → p-3c5dd716.entry.js} +2 -2
  319. package/dist/viewer/p-44395076.entry.js +5 -0
  320. package/dist/viewer/p-44395076.entry.js.map +1 -0
  321. package/dist/viewer/{p-fe434552.entry.js → p-45cc095e.entry.js} +2 -2
  322. package/dist/viewer/p-504e77a7.entry.js +5 -0
  323. package/dist/viewer/{p-c2c3579f.entry.js.map → p-504e77a7.entry.js.map} +1 -1
  324. package/dist/viewer/{p-71c03352.entry.js → p-53f6cc59.entry.js} +2 -2
  325. package/dist/viewer/{p-56e39cff.entry.js → p-83683307.entry.js} +2 -2
  326. package/dist/viewer/{p-91fca24b.entry.js → p-93311f46.entry.js} +2 -2
  327. package/dist/viewer/{p-BIR7Lfxx.js → p-BEOO-Ypv.js} +2 -2
  328. package/dist/viewer/{p-BIR7Lfxx.js.map → p-BEOO-Ypv.js.map} +1 -1
  329. package/dist/viewer/{p-C6YtUG51.js → p-BJGbLthH.js} +2 -2
  330. package/dist/viewer/{p-C6YtUG51.js.map → p-BJGbLthH.js.map} +1 -1
  331. package/dist/viewer/{p-O1_Yvjd6.js → p-BT9d9jRt.js} +2 -2
  332. package/dist/viewer/{p-O1_Yvjd6.js.map → p-BT9d9jRt.js.map} +1 -1
  333. package/dist/viewer/{p-VEJB73Ei.js → p-Bdf4AcJ2.js} +2 -2
  334. package/dist/viewer/{p-VEJB73Ei.js.map → p-Bdf4AcJ2.js.map} +1 -1
  335. package/dist/viewer/{p-C-huOg09.js → p-Br21pGVj.js} +2 -2
  336. package/dist/viewer/{p-C-huOg09.js.map → p-Br21pGVj.js.map} +1 -1
  337. package/dist/viewer/{p-Ce1j43tF.js → p-Bw_ryWU0.js} +2 -2
  338. package/dist/viewer/{p-Ce1j43tF.js.map → p-Bw_ryWU0.js.map} +1 -1
  339. package/dist/viewer/{p-CelQDFR0.js → p-C12jtCFb.js} +2 -2
  340. package/dist/viewer/{p-CelQDFR0.js.map → p-C12jtCFb.js.map} +1 -1
  341. package/dist/viewer/{p-B-J4CqZy.js → p-C4_1Jc7H.js} +2 -2
  342. package/dist/viewer/{p-B-J4CqZy.js.map → p-C4_1Jc7H.js.map} +1 -1
  343. package/dist/viewer/p-CEDqc5sS.js +5 -0
  344. package/dist/viewer/{p-BDy3SLKk.js.map → p-CEDqc5sS.js.map} +1 -1
  345. package/dist/viewer/p-Cc3XhAoA.js +5 -0
  346. package/dist/viewer/p-Cc3XhAoA.js.map +1 -0
  347. package/dist/viewer/{p-EG7pMA2M.js → p-CeZe0Qql.js} +2 -2
  348. package/dist/viewer/{p-EG7pMA2M.js.map → p-CeZe0Qql.js.map} +1 -1
  349. package/dist/viewer/p-CioaIHsi.js.map +1 -1
  350. package/dist/viewer/{p-EUeCUp3y.js → p-CxBXErQ8.js} +2 -2
  351. package/dist/viewer/{p-EUeCUp3y.js.map → p-CxBXErQ8.js.map} +1 -1
  352. package/dist/viewer/{p-CIBBr-p1.js → p-D0aTA_2m.js} +2 -2
  353. package/dist/viewer/{p-CIBBr-p1.js.map → p-D0aTA_2m.js.map} +1 -1
  354. package/dist/viewer/{p-UQXG8bCI.js → p-DBfvBC5O.js} +2 -2
  355. package/dist/viewer/p-DBfvBC5O.js.map +1 -0
  356. package/dist/{components/p-QhlhRt6X.js → viewer/p-DIbJ8Ijj.js} +2 -2
  357. package/dist/viewer/p-DIbJ8Ijj.js.map +1 -0
  358. package/dist/viewer/{p-Cju1inFh.js → p-DYDhLlLS.js} +2 -2
  359. package/dist/viewer/p-DYDhLlLS.js.map +1 -0
  360. package/dist/viewer/{p-CxzyM08j.js → p-DyL2wWm6.js} +2 -2
  361. package/dist/viewer/{p-CxzyM08j.js.map → p-DyL2wWm6.js.map} +1 -1
  362. package/dist/viewer/{p-avWSFTeP.js → p-JvS9LLoO.js} +2 -2
  363. package/dist/viewer/{p-avWSFTeP.js.map → p-JvS9LLoO.js.map} +1 -1
  364. package/dist/viewer/{p-mpsCUvSn.js → p-_qi2VkC2.js} +2 -2
  365. package/dist/viewer/{p-mpsCUvSn.js.map → p-_qi2VkC2.js.map} +1 -1
  366. package/dist/viewer/{p-9312a936.entry.js → p-a94b626c.entry.js} +2 -2
  367. package/dist/viewer/p-b5cc83a4.entry.js.map +1 -1
  368. package/dist/viewer/{p-fc7d9b2b.entry.js → p-c531ca97.entry.js} +2 -2
  369. package/dist/viewer/{p-fc7d9b2b.entry.js.map → p-c531ca97.entry.js.map} +1 -1
  370. package/dist/viewer/p-c9dee5c4.entry.js +5 -0
  371. package/dist/viewer/p-c9dee5c4.entry.js.map +1 -0
  372. package/dist/viewer/p-ce711ae0.entry.js +5 -0
  373. package/dist/viewer/p-ce711ae0.entry.js.map +1 -0
  374. package/dist/viewer/{p-82ed4346.entry.js → p-ced98004.entry.js} +2 -2
  375. package/dist/viewer/p-d357d235.entry.js.map +1 -1
  376. package/dist/viewer/p-dcb6ddfe.entry.js +5 -0
  377. package/dist/viewer/p-dcb6ddfe.entry.js.map +1 -0
  378. package/dist/viewer/p-e98db875.entry.js.map +1 -1
  379. package/dist/viewer/{p-c2454523.entry.js → p-ea45c3e9.entry.js} +2 -2
  380. package/dist/viewer/p-ebd9dd99.entry.js +5 -0
  381. package/dist/viewer/p-ebd9dd99.entry.js.map +1 -0
  382. package/dist/viewer/{p-a893a299.entry.js → p-ecd594f2.entry.js} +2 -2
  383. package/dist/viewer/{p-03a531d9.entry.js → p-ef9437ca.entry.js} +2 -2
  384. package/dist/viewer/p-fec5a15d.entry.js +5 -0
  385. package/dist/viewer/p-fec5a15d.entry.js.map +1 -0
  386. package/dist/viewer/p-ipyYHvea.js.map +1 -1
  387. package/dist/viewer/viewer.esm.js +1 -1
  388. package/package.json +10 -10
  389. package/readme.md +14 -8
  390. package/dist/cjs/bundle-07I6_WqC.js.map +0 -1
  391. package/dist/cjs/multiElementInteractionHandler-Bqpg2wVT.js.map +0 -1
  392. package/dist/cjs/queries-GhYmoomu.js.map +0 -1
  393. package/dist/cjs/streamAttributes-CJOD7AxG.js.map +0 -1
  394. package/dist/cjs/utils-BsXO-wLi.js.map +0 -1
  395. package/dist/components/p-B4sO9HdX.js +0 -5
  396. package/dist/components/p-B4sO9HdX.js.map +0 -1
  397. package/dist/components/p-C--Voxln.js +0 -5
  398. package/dist/components/p-C--Voxln.js.map +0 -1
  399. package/dist/components/p-CZZALKHT.js +0 -5
  400. package/dist/components/p-CZZALKHT.js.map +0 -1
  401. package/dist/components/p-Cn0vKqIN.js +0 -5
  402. package/dist/components/p-Cn0vKqIN.js.map +0 -1
  403. package/dist/components/p-DH341c7b.js +0 -5
  404. package/dist/components/p-DH341c7b.js.map +0 -1
  405. package/dist/components/p-DjrtwKcK.js +0 -5
  406. package/dist/components/p-DjrtwKcK.js.map +0 -1
  407. package/dist/components/p-Dmc49hX3.js +0 -5
  408. package/dist/components/p-Dmc49hX3.js.map +0 -1
  409. package/dist/components/p-QhlhRt6X.js.map +0 -1
  410. package/dist/components/p-Y8W_BXUk.js +0 -5
  411. package/dist/components/p-Y8W_BXUk.js.map +0 -1
  412. package/dist/components/p-garvKln8.js.map +0 -1
  413. package/dist/components/p-taOlygmc.js.map +0 -1
  414. package/dist/esm/bundle-CZZALKHT.js.map +0 -1
  415. package/dist/esm/multiElementInteractionHandler-C45E8VzE.js.map +0 -1
  416. package/dist/esm/queries-DWjy-LsV.js.map +0 -1
  417. package/dist/esm/streamAttributes-CTs61PCl.js.map +0 -1
  418. package/dist/esm/utils-DJ5FvINs.js.map +0 -1
  419. package/dist/viewer/p-02384d83.entry.js +0 -5
  420. package/dist/viewer/p-02384d83.entry.js.map +0 -1
  421. package/dist/viewer/p-12a673f0.entry.js.map +0 -1
  422. package/dist/viewer/p-49578ec9.entry.js +0 -5
  423. package/dist/viewer/p-49578ec9.entry.js.map +0 -1
  424. package/dist/viewer/p-4c223366.entry.js +0 -5
  425. package/dist/viewer/p-4c223366.entry.js.map +0 -1
  426. package/dist/viewer/p-7m7Vr5V7.js.map +0 -1
  427. package/dist/viewer/p-8774425b.entry.js +0 -5
  428. package/dist/viewer/p-8774425b.entry.js.map +0 -1
  429. package/dist/viewer/p-9c02567d.entry.js +0 -5
  430. package/dist/viewer/p-9c02567d.entry.js.map +0 -1
  431. package/dist/viewer/p-BDy3SLKk.js +0 -5
  432. package/dist/viewer/p-CZZALKHT.js +0 -5
  433. package/dist/viewer/p-CZZALKHT.js.map +0 -1
  434. package/dist/viewer/p-Cju1inFh.js.map +0 -1
  435. package/dist/viewer/p-Cr2EnhS-.js +0 -5
  436. package/dist/viewer/p-Cr2EnhS-.js.map +0 -1
  437. package/dist/viewer/p-UQXG8bCI.js.map +0 -1
  438. package/dist/viewer/p-c2c3579f.entry.js +0 -5
  439. package/dist/viewer/p-d5542b6a.entry.js +0 -5
  440. package/dist/viewer/p-d5542b6a.entry.js.map +0 -1
  441. package/dist/viewer/p-e3981cf8.entry.js.map +0 -1
  442. /package/dist/components/{p-CZgX-9yo.js.map → p-5bk1mHRt.js.map} +0 -0
  443. /package/dist/components/{p-DRGCkSEK.js.map → p-B8530k7R.js.map} +0 -0
  444. /package/dist/components/{p-BKQMbekH.js.map → p-BCuMPvZO.js.map} +0 -0
  445. /package/dist/components/{p-C02XtMl4.js.map → p-BHyxBmg6.js.map} +0 -0
  446. /package/dist/components/{p-O1_Yvjd6.js.map → p-BT9d9jRt.js.map} +0 -0
  447. /package/dist/components/{p-oDn1DcWj.js.map → p-BZDn1Vuv.js.map} +0 -0
  448. /package/dist/components/{p-VEJB73Ei.js.map → p-Bdf4AcJ2.js.map} +0 -0
  449. /package/dist/components/{p-CMdP8O-G.js.map → p-Bx42CNGV.js.map} +0 -0
  450. /package/dist/components/{p-CelQDFR0.js.map → p-C12jtCFb.js.map} +0 -0
  451. /package/dist/components/{p-Dzs4u_ZY.js.map → p-CABws4i9.js.map} +0 -0
  452. /package/dist/components/{p-BqeEZXPn.js.map → p-CPROw2BU.js.map} +0 -0
  453. /package/dist/components/{p-DnVcQAR9.js.map → p-CTi-0-dI.js.map} +0 -0
  454. /package/dist/components/{p-EG7pMA2M.js.map → p-CeZe0Qql.js.map} +0 -0
  455. /package/dist/components/{p-Due5EmBt.js.map → p-Clyxptbp.js.map} +0 -0
  456. /package/dist/components/{p-MnZadXO8.js.map → p-D_h07qsA.js.map} +0 -0
  457. /package/dist/components/{p-DCTZZ5Rd.js.map → p-DjQ6RXWP.js.map} +0 -0
  458. /package/dist/components/{p-CxzyM08j.js.map → p-DyL2wWm6.js.map} +0 -0
  459. /package/dist/components/{p-avWSFTeP.js.map → p-JvS9LLoO.js.map} +0 -0
  460. /package/dist/components/{p-CfTvpqud.js.map → p-KidjtXKE.js.map} +0 -0
  461. /package/dist/components/{p-BC777sCK.js.map → p-UJR-ixsy.js.map} +0 -0
  462. /package/dist/components/{p-mpsCUvSn.js.map → p-_qi2VkC2.js.map} +0 -0
  463. /package/dist/components/{p-CNprIkKd.js.map → p-rDr0x5Z7.js.map} +0 -0
  464. /package/dist/viewer/{p-7b4eec65.entry.js.map → p-293d8f3f.entry.js.map} +0 -0
  465. /package/dist/viewer/{p-510fd2e1.entry.js.map → p-2d2fa147.entry.js.map} +0 -0
  466. /package/dist/viewer/{p-a108a305.entry.js.map → p-2faddbf8.entry.js.map} +0 -0
  467. /package/dist/viewer/{p-aa0359e0.entry.js.map → p-3c5dd716.entry.js.map} +0 -0
  468. /package/dist/viewer/{p-fe434552.entry.js.map → p-45cc095e.entry.js.map} +0 -0
  469. /package/dist/viewer/{p-71c03352.entry.js.map → p-53f6cc59.entry.js.map} +0 -0
  470. /package/dist/viewer/{p-56e39cff.entry.js.map → p-83683307.entry.js.map} +0 -0
  471. /package/dist/viewer/{p-91fca24b.entry.js.map → p-93311f46.entry.js.map} +0 -0
  472. /package/dist/viewer/{p-9312a936.entry.js.map → p-a94b626c.entry.js.map} +0 -0
  473. /package/dist/viewer/{p-82ed4346.entry.js.map → p-ced98004.entry.js.map} +0 -0
  474. /package/dist/viewer/{p-c2454523.entry.js.map → p-ea45c3e9.entry.js.map} +0 -0
  475. /package/dist/viewer/{p-a893a299.entry.js.map → p-ecd594f2.entry.js.map} +0 -0
  476. /package/dist/viewer/{p-03a531d9.entry.js.map → p-ef9437ca.entry.js.map} +0 -0
@@ -1,5 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
- */
4
- import{h as e,F as i,t,p as n,H as o}from"./p-Bb32XUUS.js";import{p as s,m as r,v as a}from"./p-CZZALKHT.js";import"./p-DMG1CW3A.js";import"./p-DxMDDbmh.js";import"./p-BKQMbekH.js";import"./p-FRKLa468.js";import"./p-ux1ckSDN.js";import"./p-5kcpg4MZ.js";import"./p-DjrtwKcK.js";import"./p-DRGCkSEK.js";import{V as l}from"./p-EG7pMA2M.js";import{d,P as c,t as p}from"./p-B4sO9HdX.js";import{g as h,i as v,a as u,P as m}from"./p-D1akPoVm.js";import{c as b}from"./p-C6gMOKYg.js";import{d as f}from"./p-C02XtMl4.js";import{d as w}from"./p-Bkm6H5uq.js";import{d as x}from"./p-Cn0vKqIN.js";const k=({pin:t,selected:n,occluded:o,detached:s})=>{const{primaryColor:r}=h(t);return e(i,null,u(t)&&e("div",{id:"pin-anchor",class:b("pin-anchor",{selected:n,"pin-occluded":o,"pin-detached":s}),style:{background:r}}),v(t)&&e("vertex-viewer-icon",{name:"pin-fill",size:"lg",class:b("pin",{"pin-selected":n,"pin-occluded":o,"pin-detached":s}),style:{color:r}}))};function y(e,i,t){const n={x:e.x+t.width/2,y:e.y};const o={x:e.x+t.width/2,y:e.y+t.height};const r={x:e.x+t.width,y:e.y+t.height/2};const a={x:e.x,y:e.y+t.height/2};const l=[n,o,a,r];const d=l.map((e=>s.distance(e,i)));const c=d.indexOf(Math.min(...d));return l[c]}const g=()=>`:host{--viewer-annotations-pin-primary-color:var(--blue-700);--viewer-annotations-pin-accent-color:var(--blue-200);--viewer-annotations-pin-dot-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-color:var(--viewer-annotations-pin-primary-color);--viewer-annotations-pin-font-size:0.75rem;--viewer-annotations-pin-selected-stroke:var(--white);--viewer-annotations-pin-selected-border:2px solid var(--white);--viewer-annotations-pin-label-border:2px solid var(--black);--viewer-annotations-pin-selected-stroke:var(--white);font-size:var(--viewer-annotations-pin-font-size);position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none}.pin-anchor{position:absolute;border-radius:50%;transform:translate(-50%, -50%);display:block;width:9px;height:9px;box-sizing:border-box;border:var(--viewer-annotations-pin-label-border);background:var(--viewer-annotations-pin-dot-color);pointer-events:auto;cursor:pointer}.selected{width:13px;height:13px;border:var(--viewer-annotations-pin-selected-border)}.pin{color:var(--viewer-annotations-pin-color);cursor:pointer;transition:opacity 0.3s ease-in;transform:translate(0px, -12px)}.pin-selected{stroke-width:1;stroke:var(--viewer-annotations-pin-selected-stroke)}.pin-occluded{opacity:.3;transition:opacity 0.3s ease-in}.pin-detached{visibility:hidden}`;const P=n(class t extends o{constructor(e){super();if(e!==false){this.__registerHost()}this.matrix=r.makeIdentity();this.projectionViewMatrix=r.makeIdentity();this.pinModel=new m;this.selected=false;this.occluded=false;this.detached=false;this.invalidateStateCounter=0;this.invalidateState=()=>{this.invalidateStateCounter=this.invalidateStateCounter+1}}componentWillLoad(){if(this.pinController==null){this.pinController=new c(this.pinModel)}}componentDidLoad(){var e;this.setLabelObserver();if(this.selected){(e=this.labelEl)===null||e===void 0?void 0:e.setFocus()}}async handleOcclusionStateChanged(e){this.occluded=e.detail}async handleDetachedStateChanged(e){this.detached=e.detail}disconnectedCallback(){var e,i;(e=this.labelEl)===null||e===void 0?void 0:e.removeEventListener("labelChanged",this.invalidateState);(i=this.resizeObserver)===null||i===void 0?void 0:i.disconnect()}render(){var t;if(this.pin==null){throw new Error("Unable to draw pin")}const{pinPoint:n,labelPoint:o}=this.computePinPoints(this.pin);return e(i,{key:"84a22b24189e46d618c7266874d6584feb4e0b93"},e("vertex-viewer-dom-element",{key:"d4b9cf5194049099b2a7a2c1ef07fc3757e91cdc","data-testid":`drawn-pin-${this.pin.id}`,position:this.pin.worldPosition,onPointerDown:async()=>{var e;await((e=this.labelEl)===null||e===void 0?void 0:e.submit());this.selectPin();this.handleAnchorPointerDown()},detachedOff:false},e(k,{key:"7312b90e959e7d61de89c80ff032c29c5d32d888",pin:this.pin,selected:this.selected,occluded:this.occluded,detached:this.detached})),u(this.pin)&&!this.occluded&&!this.detached&&e(i,{key:"975ae561cc3eb0bf6d259d99c10c48ab0bb2661a"},e("vertex-viewer-pin-label-line",{key:"cbb32a2788a89f53c5ea2e2e6abe83b0b49c0fd4",id:`pin-label-line-${(t=this.pin)===null||t===void 0?void 0:t.id}`,pinPoint:n,pin:this.pin,labelPoint:o,onPointerDown:()=>this.selectPin()}),e("vertex-viewer-pin-label",{key:"296958cff46f102cef5621c2512b71f0d4d97ff9",pin:this.pin,ref:e=>this.labelEl=e,elementBounds:this.elementBounds,pinController:this.pinController,onPointerDown:()=>this.selectPin()})))}setLabelObserver(){if(this.labelEl!=null){this.labelEl.addEventListener("labelChanged",this.invalidateState);this.resizeObserver=new ResizeObserver((()=>this.invalidateState()));this.resizeObserver.observe(this.labelEl)}}computePinPoints(e){if(this.elementBounds!=null&&this.pin!=null){return u(this.pin)&&this.pin.label.point!=null?this.computeTextPinPoints(this.pin,this.elementBounds):this.computeDefaultPinPoints(this.pin,this.elementBounds)}return{pinPoint:e.worldPosition}}computeDefaultPinPoints(e,i){return{pinPoint:this.getFromWorldPosition(e.worldPosition,this.projectionViewMatrix,i)}}computeTextPinPoints(e,i){var t,n,o,s;const{pinPoint:r}=this.computeDefaultPinPoints(e,i);const a=p(e.label.point,i);const l=((n=(t=this.labelEl)===null||t===void 0?void 0:t.firstElementChild)===null||n===void 0?void 0:n.clientWidth)||0;const d=((s=(o=this.labelEl)===null||o===void 0?void 0:o.firstElementChild)===null||s===void 0?void 0:s.clientHeight)||0;return{pinPoint:r,labelPoint:y(a,r,{width:l,height:d})}}handleAnchorPointerDown(){var e,i;if(this.elementBounds!=null&&((e=this.pinController)===null||e===void 0?void 0:e.getToolMode())==="edit"&&this.pin!=null){(i=this.pinController)===null||i===void 0?void 0:i.setDraggable({id:this.pin.id})}}selectPin(){var e,i;(e=this.pinController)===null||e===void 0?void 0:e.setSelectedPinId((i=this.pin)===null||i===void 0?void 0:i.id)}getFromWorldPosition(e,i,t){const n=a.multiplyByTransformMatrixColumnMajor(e,i);return l.fromDimensions(t).transformVectorToViewport(n)}static get style(){return g()}},[0,"vertex-viewer-pin-group",{pin:[16],matrix:[1040],projectionViewMatrix:[16],elementBounds:[1040],pinModel:[16],pinController:[1040],selected:[4],occluded:[1540],detached:[1540],invalidateStateCounter:[32]},[[0,"occlusionStateChanged","handleOcclusionStateChanged"],[0,"detachedStateChanged","handleDetachedStateChanged"]]]);function j(){if(typeof customElements==="undefined"){return}const e=["vertex-viewer-pin-group","vertex-viewer-dom-element","vertex-viewer-icon","vertex-viewer-pin-label","vertex-viewer-pin-label-line"];e.forEach((e=>{switch(e){case"vertex-viewer-pin-group":if(!customElements.get(t(e))){customElements.define(t(e),P)}break;case"vertex-viewer-dom-element":if(!customElements.get(t(e))){f()}break;case"vertex-viewer-icon":if(!customElements.get(t(e))){w()}break;case"vertex-viewer-pin-label":if(!customElements.get(t(e))){d()}break;case"vertex-viewer-pin-label-line":if(!customElements.get(t(e))){x()}break}}))}j();export{P as V,j as d};
5
- //# sourceMappingURL=p-Dmc49hX3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["PinRenderer","pin","selected","occluded","detached","primaryColor","getPinColors","h","Fragment","isTextPin","id","class","classNames","style","background","isIconPin","name","size","color","getClosestCenterToPoint","boxPoint","pointToMeasure","dimensions","topPoint","x","width","y","bottomPoint","height","rightPoint","leftPoint","candidates","distances","map","candidate","Point","distance","candidateIndex","indexOf","Math","min","viewerPinGroupCss","ViewerPinGroup","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","matrix","Matrix4","makeIdentity","projectionViewMatrix","pinModel","PinModel","invalidateStateCounter","invalidateState","componentWillLoad","pinController","PinController","componentDidLoad","setLabelObserver","_a","labelEl","setFocus","handleOcclusionStateChanged","event","detail","handleDetachedStateChanged","disconnectedCallback","removeEventListener","_b","resizeObserver","disconnect","render","Error","pinPoint","labelPoint","computePinPoints","key","position","worldPosition","onPointerDown","async","submit","selectPin","handleAnchorPointerDown","detachedOff","ref","el","elementBounds","addEventListener","ResizeObserver","observe","label","point","computeTextPinPoints","computeDefaultPinPoints","getFromWorldPosition","screenPosition","translatePointToScreen","labelWidth","firstElementChild","clientWidth","labelHeight","_d","_c","clientHeight","getToolMode","setDraggable","setSelectedPinId","pt","ndcPt","Vector3","multiplyByTransformMatrixColumnMajor","Viewport","fromDimensions","transformVectorToViewport"],"sources":["src/components/viewer-pin-group/pin-renderer.tsx","src/components/viewer-pin-group/utils.ts","src/components/viewer-pin-group/viewer-pin-group.css?tag=vertex-viewer-pin-group","src/components/viewer-pin-group/viewer-pin-group.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Fragment, FunctionalComponent, h } from '@stencil/core';\nimport classNames from 'classnames';\n\nimport { getPinColors, isIconPin, isTextPin, Pin } from '../../lib/pins/model';\n\ninterface PinRendererProps {\n pin?: Pin;\n selected: boolean;\n occluded: boolean;\n detached: boolean;\n}\n\nexport const PinRenderer: FunctionalComponent<PinRendererProps> = ({\n pin,\n selected,\n occluded,\n detached,\n}) => {\n const { primaryColor } = getPinColors(pin);\n\n return (\n <Fragment>\n {isTextPin(pin) && (\n <div\n id=\"pin-anchor\"\n class={classNames('pin-anchor', {\n selected: selected,\n 'pin-occluded': occluded,\n 'pin-detached': detached,\n })}\n style={{\n background: primaryColor,\n }}\n ></div>\n )}\n\n {isIconPin(pin) && (\n <vertex-viewer-icon\n name=\"pin-fill\"\n size=\"lg\"\n class={classNames('pin', {\n 'pin-selected': selected,\n 'pin-occluded': occluded,\n 'pin-detached': detached,\n })}\n style={{\n color: primaryColor,\n }}\n />\n )}\n </Fragment>\n );\n};\n","import { Dimensions, Point } from '@vertexvis/geometry';\n\nexport function getClosestCenterToPoint(\n boxPoint: Point.Point,\n pointToMeasure: Point.Point,\n dimensions: Dimensions.Dimensions,\n): Point.Point {\n const topPoint = {\n x: boxPoint.x + dimensions.width / 2,\n y: boxPoint.y,\n };\n\n const bottomPoint = {\n x: boxPoint.x + dimensions.width / 2,\n y: boxPoint.y + dimensions.height,\n };\n\n const rightPoint = {\n x: boxPoint.x + dimensions.width,\n y: boxPoint.y + dimensions.height / 2,\n };\n\n const leftPoint = {\n x: boxPoint.x,\n y: boxPoint.y + dimensions.height / 2,\n };\n\n const candidates = [topPoint, bottomPoint, leftPoint, rightPoint];\n\n const distances = candidates.map((candidate) =>\n Point.distance(candidate, pointToMeasure),\n );\n\n const candidateIndex = distances.indexOf(Math.min(...distances));\n return candidates[candidateIndex];\n}\n",":host {\n\n /**\n * @prop --viewer-annotations-pin-primary-color: A CSS color that\n * specifies the primary color for the pins. This value gets used for the dot color \n * and borders\n */\n --viewer-annotations-pin-primary-color: var(--blue-700);\n\n /**\n * @prop --viewer-annotations-pin-accent-color: A CSS color that\n * specifies the accent color for the pins. This value gets used for background colors\n * \n */\n\n --viewer-annotations-pin-accent-color: var(--blue-200);\n /**\n * @prop viewer-annotations-pin-dot-color: A CSS color that\n * specifies the color of the anchor dot\n */\n --viewer-annotations-pin-dot-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-color: A CSS color that\n * specifies the color of the pin\n */\n --viewer-annotations-pin-color: var(--viewer-annotations-pin-primary-color);\n\n /**\n * @prop --viewer-annotations-pin-font-size: A CSS property to specify\n the font size of the pin\n */\n --viewer-annotations-pin-font-size: 0.75rem;\n\n /**\n * @prop --viewer-annotations-pin-selected-stroke: A CSS color that\n * specifies the stroke color of a selected pin\n */\n --viewer-annotations-pin-selected-stroke: var(--white);\n\n /**\n * @prop --viewer-annotations-pin-selected-border: A CSS color that\n * specifies the border of a selected pin\n */\n --viewer-annotations-pin-selected-border: 2px solid var(--white);\n\n /**\n * @prop --viewer-annotations-pin-label-border: A CSS color that\n * specifies the border of a text pin anchor\n */\n --viewer-annotations-pin-label-border: 2px solid var(--black);\n\n /**\n * @prop --viewer-annotations-pin-selected-border: A CSS color that\n * specifies the stroke of a selected default pin\n */\n --viewer-annotations-pin-selected-stroke: var(--white);\n\n font-size: var(--viewer-annotations-pin-font-size);\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n pointer-events: none;\n}\n\n.pin-anchor {\n position: absolute;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n display: block;\n width: 9px;\n height: 9px;\n box-sizing: border-box;\n border: var(--viewer-annotations-pin-label-border);\n background: var(--viewer-annotations-pin-dot-color);\n pointer-events: auto;\n cursor: pointer;\n}\n\n.selected {\n width: 13px;\n height: 13px;\n border: var(--viewer-annotations-pin-selected-border)\n}\n\n.pin {\n color: var(--viewer-annotations-pin-color);\n cursor: pointer;\n transition: opacity 0.3s ease-in;\n\n /**\n * Place bottom point of the pin at the location instead of the middle of the pin\n */\n transform: translate(0px, -12px);\n}\n\n.pin-selected {\n stroke-width: 1;\n stroke: var(--viewer-annotations-pin-selected-stroke);\n}\n\n.pin-occluded {\n opacity: .3;\n transition: opacity 0.3s ease-in;\n}\n\n.pin-detached {\n visibility: hidden;\n}","import {\n Component,\n Fragment,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n JSX,\n Listen,\n Prop,\n State,\n} from '@stencil/core';\nimport { Dimensions, Matrix4, Point, Vector3 } from '@vertexvis/geometry';\n\nimport { Viewport } from '../..';\nimport { PinController } from '../../lib/pins/controller';\nimport { isTextPin, Pin, TextPin } from '../../lib/pins/model';\nimport { PinModel } from '../../lib/pins/model';\nimport { translatePointToScreen } from '../viewer-pin-tool/utils';\nimport { PinRenderer } from './pin-renderer';\nimport { getClosestCenterToPoint } from './utils';\n\ninterface ComputedPoints {\n pinPoint: Point.Point;\n labelPoint?: Point.Point;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-group',\n styleUrl: 'viewer-pin-group.css',\n shadow: false,\n})\nexport class ViewerPinGroup {\n /**\n * The pin to draw for the group\n */\n @Prop()\n public pin?: Pin;\n\n /**\n * The local matrix of this element.\n */\n @Prop({ mutable: true, attribute: null })\n public matrix: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n /**\n * Projection view matrix used for computing the position of the pin line\n */\n @Prop()\n public projectionViewMatrix: Matrix4.Matrix4 = Matrix4.makeIdentity();\n\n /**\n * The dimensions of the canvas for the pins\n */\n @Prop({ mutable: true })\n public elementBounds?: DOMRect;\n\n /**\n * The model that contains the entities and outcomes from performing pin operations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The controller that drives behavior for pin operations\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * Whether the pin is \"selected\"\n */\n @Prop()\n public selected = false;\n\n /**\n * @internal\n * Whether the pin is occluded\n */\n @Prop({ mutable: true, reflect: true })\n public occluded = false;\n\n /**\n * @internal\n * Whether the pin is detached\n */\n @Prop({ mutable: true, reflect: true })\n public detached = false;\n\n @State()\n private invalidateStateCounter = 0;\n\n private labelEl: HTMLVertexViewerPinLabelElement | undefined;\n\n private resizeObserver?: ResizeObserver;\n\n protected componentWillLoad(): void {\n if (this.pinController == null) {\n this.pinController = new PinController(this.pinModel);\n }\n }\n\n protected componentDidLoad(): void {\n this.setLabelObserver();\n\n if (this.selected) {\n this.labelEl?.setFocus();\n }\n }\n\n /**\n * @ignore\n */\n @Listen('occlusionStateChanged')\n protected async handleOcclusionStateChanged(\n event: CustomEvent<boolean>,\n ): Promise<void> {\n this.occluded = event.detail;\n }\n\n /**\n * @ignore\n */\n @Listen('detachedStateChanged')\n protected async handleDetachedStateChanged(\n event: CustomEvent<boolean>,\n ): Promise<void> {\n this.detached = event.detail;\n }\n\n protected disconnectedCallback(): void {\n this.labelEl?.removeEventListener('labelChanged', this.invalidateState);\n this.resizeObserver?.disconnect();\n }\n\n protected render(): JSX.Element {\n if (this.pin == null) {\n throw new Error('Unable to draw pin');\n }\n\n const { pinPoint, labelPoint } = this.computePinPoints(this.pin);\n\n return (\n <Fragment>\n <vertex-viewer-dom-element\n data-testid={`drawn-pin-${this.pin.id}`}\n position={this.pin.worldPosition}\n onPointerDown={async () => {\n await this.labelEl?.submit();\n this.selectPin();\n this.handleAnchorPointerDown();\n }}\n detachedOff={false}\n >\n <PinRenderer\n pin={this.pin}\n selected={this.selected}\n occluded={this.occluded}\n detached={this.detached}\n />\n </vertex-viewer-dom-element>\n\n {isTextPin(this.pin) && !this.occluded && !this.detached && (\n <Fragment>\n <vertex-viewer-pin-label-line\n id={`pin-label-line-${this.pin?.id}`}\n pinPoint={pinPoint}\n pin={this.pin}\n labelPoint={labelPoint}\n onPointerDown={() => this.selectPin()}\n ></vertex-viewer-pin-label-line>\n\n <vertex-viewer-pin-label\n pin={this.pin}\n ref={(el) => (this.labelEl = el)}\n elementBounds={this.elementBounds}\n pinController={this.pinController}\n onPointerDown={() => this.selectPin()}\n ></vertex-viewer-pin-label>\n </Fragment>\n )}\n </Fragment>\n );\n }\n\n private invalidateState = (): void => {\n this.invalidateStateCounter = this.invalidateStateCounter + 1;\n };\n\n private setLabelObserver(): void {\n if (this.labelEl != null) {\n this.labelEl.addEventListener('labelChanged', this.invalidateState);\n\n this.resizeObserver = new ResizeObserver(() => this.invalidateState());\n this.resizeObserver.observe(this.labelEl);\n }\n }\n\n private computePinPoints(pin: Pin): ComputedPoints {\n if (this.elementBounds != null && this.pin != null) {\n return isTextPin(this.pin) && this.pin.label.point != null\n ? this.computeTextPinPoints(this.pin, this.elementBounds)\n : this.computeDefaultPinPoints(this.pin, this.elementBounds);\n }\n\n return { pinPoint: pin.worldPosition };\n }\n\n private computeDefaultPinPoints(\n pin: Pin,\n elementBounds: DOMRect,\n ): ComputedPoints {\n return {\n pinPoint: this.getFromWorldPosition(\n pin.worldPosition,\n this.projectionViewMatrix,\n elementBounds,\n ),\n };\n }\n\n private computeTextPinPoints(\n pin: TextPin,\n elementBounds: DOMRect,\n ): ComputedPoints {\n const { pinPoint } = this.computeDefaultPinPoints(pin, elementBounds);\n\n const screenPosition = translatePointToScreen(\n pin.label.point,\n elementBounds,\n );\n\n const labelWidth = this.labelEl?.firstElementChild?.clientWidth || 0;\n const labelHeight = this.labelEl?.firstElementChild?.clientHeight || 0;\n\n return {\n pinPoint,\n labelPoint: getClosestCenterToPoint(screenPosition, pinPoint, {\n width: labelWidth,\n height: labelHeight,\n }),\n };\n }\n\n private handleAnchorPointerDown(): void {\n if (\n this.elementBounds != null &&\n this.pinController?.getToolMode() === 'edit' &&\n this.pin != null\n ) {\n this.pinController?.setDraggable({ id: this.pin.id });\n }\n }\n\n private selectPin(): void {\n this.pinController?.setSelectedPinId(this.pin?.id);\n }\n\n private getFromWorldPosition(\n pt: Vector3.Vector3,\n projectionViewMatrix: Matrix4.Matrix4,\n dimensions: Dimensions.Dimensions,\n ): Point.Point {\n const ndcPt = Vector3.multiplyByTransformMatrixColumnMajor(\n pt,\n projectionViewMatrix,\n );\n return Viewport.fromDimensions(dimensions).transformVectorToViewport(ndcPt);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["DEFAULT_FONT_SIZE","DEFAULT_FONT_TO_LINE_HEIGHT_MULTIPLIER","BaseInteractionHandler","constructor","downEvent","upEvent","moveEvent","rotateInteraction","rotatePointInteraction","zoomInteraction","panInteraction","twistInteraction","pivotInteraction","getConfig","this","isDragging","keyboardControls","disableIndividualInteractions","primaryInteractionTypeChange","EventDispatcher","primaryInteraction","handleDownEvent","bind","handleMouseWheel","handleWindowMove","handleWindowUp","handleDoubleClick","initialize","element","api","interactionApi","addEventListener","passive","dispose","_a","removeEventListener","_b","_c","undefined","onPrimaryInteractionTypeChange","listener","on","setCurrentInteractionType","type","currentInteraction","draggingInteraction","point","getPosition","resetLastAngle","setPosition","getPrimaryInteractionType","getType","getCurrentInteractionType","setPrimaryInteractionType","lastPrimaryRotateInteraction","emit","setDefaultKeyboardControls","event","preventDefault","interactionTimer","window","setTimeout","downPosition","Point","create","screenX","screenY","downPositionCanvas","getCanvasPosition","lastMoveEvent","interactions","interactionDelay","position","pixelThreshold","isTouch","distance","beginDrag","drag","endDrag","clearTimeout","detail","buttons","viewAll","metaKey","shiftKey","altKey","ctrlKey","clientX","clientY","delta","wheelDeltaToPixels","deltaY","deltaMode","rect","getBoundingClientRect","getMouseClientPosition","scrollSize","Math","abs","zoomToPoint","divisions","min","ceil","zoomDelta","i","delayMs","bodyStyleCache","bodyStyle","getComputedStyle","document","body","fontSize","Number","parseFloat","getPropertyValue","lineHeight","lineHeightPixels","isFinite","height","innerHeight","canvasBounds","canvasOffset","left","top","subtract","PointerEvent","pointerType","MultiElementInteractionHandler","registeredExternalElements","registerAdditionalElement","external","id","UUID","disposable","addEventListenersToElement","deregisterAdditionalElementById","externalElement","Object","fromEntries","entries","filter","key","deregisterAllListeners","keys","forEach"],"sources":["src/lib/interactions/baseInteractionHandler.ts","src/lib/interactions/multiElementInteractionHandler.ts"],"sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { ConfigProvider } from '../config';\nimport { getMouseClientPosition } from '../dom';\nimport { InteractionApi } from './interactionApi';\nimport { BaseEvent } from './interactionEvent';\nimport { InteractionHandler } from './interactionHandler';\nimport {\n MouseInteraction,\n PanInteraction,\n PivotInteraction,\n RotateInteraction,\n RotatePointInteraction,\n TwistInteraction,\n ZoomInteraction,\n} from './mouseInteractions';\n\nexport type InteractionType =\n | 'rotate'\n | 'zoom'\n | 'pan'\n | 'twist'\n | 'rotate-point'\n | 'pivot';\n\nconst DEFAULT_FONT_SIZE = 16;\nconst DEFAULT_FONT_TO_LINE_HEIGHT_MULTIPLIER = 1.2;\n\nexport abstract class BaseInteractionHandler implements InteractionHandler {\n protected interactionApi?: InteractionApi;\n protected element?: HTMLElement;\n protected downPosition?: Point.Point;\n private downPositionCanvas?: Point.Point;\n private primaryInteraction: MouseInteraction;\n private currentInteraction?: MouseInteraction;\n private draggingInteraction: MouseInteraction | undefined;\n private lastPrimaryRotateInteraction?: MouseInteraction;\n private isDragging = false;\n private lastMoveEvent?: BaseEvent;\n private interactionTimer?: number;\n private keyboardControls = false;\n\n protected disableIndividualInteractions = false;\n\n private bodyStyleCache?: {\n lineHeightPixels: number;\n height: number;\n };\n\n private primaryInteractionTypeChange = new EventDispatcher<void>();\n\n public constructor(\n protected downEvent: 'mousedown' | 'pointerdown',\n protected upEvent: 'mouseup' | 'pointerup',\n protected moveEvent: 'mousemove' | 'pointermove',\n private rotateInteraction: RotateInteraction,\n private rotatePointInteraction: RotatePointInteraction,\n private zoomInteraction: ZoomInteraction,\n private panInteraction: PanInteraction,\n private twistInteraction: TwistInteraction,\n private pivotInteraction: PivotInteraction,\n private getConfig: ConfigProvider,\n ) {\n this.primaryInteraction = rotateInteraction;\n this.handleDownEvent = this.handleDownEvent.bind(this);\n this.handleMouseWheel = this.handleMouseWheel.bind(this);\n this.handleWindowMove = this.handleWindowMove.bind(this);\n this.handleWindowUp = this.handleWindowUp.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.interactionApi = api;\n element.addEventListener(this.downEvent, this.handleDownEvent);\n element.addEventListener('mousedown', this.handleDoubleClick);\n element.addEventListener('wheel', this.handleMouseWheel, {\n passive: false,\n });\n }\n\n public dispose(): void {\n this.element?.removeEventListener(this.downEvent, this.handleDownEvent);\n this.element?.removeEventListener('mousedown', this.handleDoubleClick);\n this.element?.removeEventListener('wheel', this.handleMouseWheel);\n this.element = undefined;\n }\n\n public onPrimaryInteractionTypeChange(listener: Listener<void>): Disposable {\n return this.primaryInteractionTypeChange.on(listener);\n }\n\n public setCurrentInteractionType(type?: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.currentInteraction = this.rotateInteraction;\n break;\n case 'zoom':\n this.currentInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.currentInteraction = this.panInteraction;\n break;\n case 'twist':\n this.currentInteraction = this.twistInteraction;\n break;\n case 'rotate-point':\n this.currentInteraction = this.rotatePointInteraction;\n break;\n case 'pivot':\n this.currentInteraction = this.pivotInteraction;\n break;\n default:\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction) {\n const point = this.draggingInteraction.getPosition();\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n this.interactionApi?.resetLastAngle();\n this.draggingInteraction.setPosition(point);\n }\n }\n\n public getPrimaryInteractionType(): InteractionType {\n return this.primaryInteraction.getType();\n }\n\n public getCurrentInteractionType(): InteractionType {\n return (this.currentInteraction || this.primaryInteraction).getType();\n }\n\n public setPrimaryInteractionType(type: InteractionType): void {\n switch (type) {\n case 'rotate':\n this.primaryInteraction = this.rotateInteraction;\n this.lastPrimaryRotateInteraction = this.rotateInteraction;\n break;\n case 'rotate-point':\n this.primaryInteraction = this.rotatePointInteraction;\n this.lastPrimaryRotateInteraction = this.rotatePointInteraction;\n break;\n case 'zoom':\n this.primaryInteraction = this.zoomInteraction;\n break;\n case 'pan':\n this.primaryInteraction = this.panInteraction;\n break;\n case 'pivot':\n this.primaryInteraction = this.pivotInteraction;\n break;\n }\n this.primaryInteractionTypeChange.emit();\n }\n\n public setDefaultKeyboardControls(keyboardControls: boolean): void {\n this.keyboardControls = keyboardControls;\n }\n\n protected handleDownEvent(event: BaseEvent): void {\n // Prevent selection of any text while interacting with the model.\n event.preventDefault();\n\n this.interactionTimer = window.setTimeout(() => {\n this.downPosition = Point.create(event.screenX, event.screenY);\n this.downPositionCanvas = this.getCanvasPosition(event);\n this.interactionTimer = undefined;\n\n // Perform the current movement in the case that the interaction timer elapses\n if (this.lastMoveEvent != null) {\n this.handleWindowMove(this.lastMoveEvent);\n }\n }, this.getConfig().interactions.interactionDelay);\n\n window.addEventListener(this.moveEvent, this.handleWindowMove);\n window.addEventListener(this.upEvent, this.handleWindowUp);\n }\n\n protected handleWindowMove(event: BaseEvent): void {\n if (this.interactionTimer == null) {\n if (this.disableIndividualInteractions) {\n return;\n }\n\n const position = Point.create(event.screenX, event.screenY);\n const pixelThreshold =\n this.interactionApi != null\n ? this.interactionApi.pixelThreshold(this.isTouch(event))\n : 2;\n if (\n this.downPosition != null &&\n Point.distance(position, this.downPosition) >= pixelThreshold &&\n !this.isDragging\n ) {\n this.beginDrag(event);\n this.isDragging = true;\n }\n\n if (this.isDragging) {\n this.drag(event);\n }\n }\n\n this.lastMoveEvent = event;\n }\n\n protected async handleWindowUp(event: BaseEvent): Promise<void> {\n if (this.isDragging) {\n this.endDrag(event);\n this.isDragging = false;\n }\n\n if (this.interactionTimer != null) {\n window.clearTimeout(this.interactionTimer);\n this.interactionTimer = undefined;\n }\n\n window.removeEventListener(this.moveEvent, this.handleWindowMove);\n window.removeEventListener(this.upEvent, this.handleWindowUp);\n this.lastMoveEvent = undefined;\n }\n\n protected async handleDoubleClick(event: BaseEvent): Promise<void> {\n // event.detail is the number of clicks that have happened recently. If the number is 2, then the user double clicked.\n if (\n event.detail === 2 &&\n event.buttons === 4 &&\n this.interactionApi != null\n ) {\n await this.interactionApi.viewAll();\n }\n }\n\n protected beginDrag(event: BaseEvent): void {\n if (this.keyboardControls && event.metaKey && event.shiftKey) {\n this.currentInteraction = this.rotatePointInteraction;\n } else if (this.keyboardControls && event.shiftKey && event.altKey) {\n this.currentInteraction = this.twistInteraction;\n } else if (this.keyboardControls && event.shiftKey) {\n this.currentInteraction = this.zoomInteraction;\n } else if (this.keyboardControls && (event.metaKey || event.ctrlKey)) {\n this.currentInteraction = this.panInteraction;\n } else if (this.keyboardControls && event.altKey) {\n this.currentInteraction = this.rotateInteraction;\n }\n\n if (event.buttons === 1) {\n this.draggingInteraction =\n this.currentInteraction || this.primaryInteraction;\n } else if (event.buttons === 2) {\n this.draggingInteraction = this.panInteraction;\n } else if (event.buttons === 4) {\n this.draggingInteraction =\n this.lastPrimaryRotateInteraction ?? this.rotateInteraction;\n }\n\n if (\n this.draggingInteraction != null &&\n this.interactionApi != null &&\n this.element != null\n ) {\n // Ensure any scroll wheel interactions have been ended prior to beginning\n // another interaction to prevent the interaction from being ended early.\n this.zoomInteraction.endDrag(event, this.interactionApi);\n\n this.draggingInteraction.beginDrag(\n event,\n this.downPositionCanvas || Point.create(event.clientX, event.clientY),\n this.interactionApi,\n this.element,\n );\n }\n }\n\n protected drag(event: BaseEvent): void {\n if (this.keyboardControls && event.altKey && event.shiftKey) {\n this.currentInteraction = this.twistInteraction;\n } else {\n this.currentInteraction = undefined;\n }\n this.draggingInteraction =\n this.currentInteraction ||\n this.draggingInteraction ||\n this.primaryInteraction;\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.drag(event, this.interactionApi);\n }\n }\n\n protected endDrag(event: BaseEvent): void {\n if (\n this.keyboardControls &&\n this.currentInteraction === this.twistInteraction\n ) {\n this.currentInteraction = undefined;\n }\n\n if (this.draggingInteraction != null && this.interactionApi != null) {\n this.draggingInteraction.endDrag(event, this.interactionApi);\n this.draggingInteraction = undefined;\n }\n }\n\n protected handleMouseWheel(event: WheelEvent): void {\n event.preventDefault();\n\n if (\n this.element != null &&\n this.interactionApi != null &&\n event.buttons !== 4\n ) {\n const delta =\n -this.wheelDeltaToPixels(event.deltaY, event.deltaMode) / 10;\n const rect = this.element.getBoundingClientRect();\n const point = getMouseClientPosition(event, rect);\n const scrollSize = Math.abs(event.deltaY);\n\n if (scrollSize < 12) {\n // For small wheel movements, send a single zoom event.\n void this.zoomInteraction.zoomToPoint(\n point,\n delta,\n this.interactionApi,\n );\n } else {\n const divisions = Math.min(10, Math.ceil(scrollSize / 12));\n const zoomDelta = delta / divisions;\n // For larger wheel movements, divide the delta into multiple zoom events with increasing delay\n // which approximates a smooth zoom deceleration curve for the end user.\n for (let i = 1; i <= divisions; i++) {\n const delayMs = i * 5;\n window.setTimeout(() => {\n if (this.interactionApi != null) {\n this.zoomInteraction.zoomToPoint(\n point,\n zoomDelta,\n this.interactionApi,\n delayMs,\n );\n }\n }, delayMs);\n }\n }\n }\n }\n\n protected wheelDeltaToPixels(deltaY: number, deltaMode: number): number {\n // Cached values are an optimization we can use given mouseWheel\n // events can happen dozen or hundreds of times per scroll, but body style\n // is very unlikely to change frequently or while doing wheel movements.\n if (this.bodyStyleCache == null) {\n const bodyStyle = window.getComputedStyle(document.body);\n const fontSize =\n Number.parseFloat(bodyStyle.getPropertyValue('fontSize')) || DEFAULT_FONT_SIZE;\n const lineHeight = Number.parseFloat(bodyStyle.getPropertyValue('lineHeight'));\n this.bodyStyleCache = {\n lineHeightPixels: Number.isFinite(lineHeight)\n ? lineHeight\n : fontSize * DEFAULT_FONT_TO_LINE_HEIGHT_MULTIPLIER,\n height:\n Number.parseFloat(bodyStyle.getPropertyValue('height')) ||\n window.innerHeight,\n };\n window.setTimeout(() => {\n this.bodyStyleCache = undefined;\n }, 4800); // For now hardcoded. Could be derived. eg mouseWheelInteractionEndDebounce * 12\n }\n\n if (deltaMode === 1) {\n // deltaMode 1 corresponds to DOM_DELTA_LINE, which computes deltas in lines\n return deltaY * this.bodyStyleCache.lineHeightPixels;\n } else if (deltaMode === 2) {\n // deltaMode 2 corresponds to DOM_DELTA_PAGE, which computes deltas in pages\n return deltaY * this.bodyStyleCache.height;\n }\n // deltaMode 0 corresponds to DOM_DELTA_PIXEL, which computes deltas in pixels\n return deltaY;\n }\n\n protected getCanvasPosition(event: BaseEvent): Point.Point | undefined {\n const canvasBounds = this.element?.getBoundingClientRect();\n const canvasOffset =\n canvasBounds != null\n ? Point.create(canvasBounds.left, canvasBounds.top)\n : undefined;\n\n return canvasOffset != null\n ? Point.subtract(Point.create(event.clientX, event.clientY), canvasOffset)\n : undefined;\n }\n\n protected isTouch(event: BaseEvent): boolean {\n return window.PointerEvent != null && event instanceof PointerEvent\n ? event.pointerType === 'touch'\n : false;\n }\n}\n","import { Disposable, UUID } from '@vertexvis/utils';\n\nimport { BaseInteractionHandler } from './baseInteractionHandler';\n\nexport abstract class MultiElementInteractionHandler extends BaseInteractionHandler {\n protected registeredExternalElements: Record<UUID.UUID, Disposable> = {};\n\n public registerAdditionalElement(external: HTMLElement): Disposable {\n const id = UUID.create();\n const disposable = this.addEventListenersToElement(external);\n\n this.registeredExternalElements[id] = disposable;\n return disposable;\n }\n\n public deregisterAdditionalElementById(id: UUID.UUID): void {\n const externalElement = this.registeredExternalElements[id];\n\n externalElement.dispose();\n\n this.registeredExternalElements = Object.fromEntries(\n Object.entries(this.registeredExternalElements).filter(\n ([key]) => key !== id,\n ),\n );\n }\n\n protected deregisterAllListeners(): void {\n Object.keys(this.registeredExternalElements).forEach((id) =>\n this.deregisterAdditionalElementById(id),\n );\n }\n\n public abstract addEventListenersToElement(element?: HTMLElement): Disposable;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +0,0 @@
1
- /*!
2
- * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
- */
4
- import{t as e,p as t,H as s,d as i,h as r,e as n}from"./p-Bb32XUUS.js";import{c as o}from"./p-C6gMOKYg.js";import{d as c}from"./p-Cd7kap5W.js";import{d as a}from"./p-Bkm6H5uq.js";import{d}from"./p-DxuSiXYg.js";const l=()=>`button{border:none;background:transparent;cursor:pointer;margin:0;padding:0}:host{--scene-tree-search-search-icon-offset:8px;--scene-tree-search-clear-button-offset:8px;--scene-tree-search-input-padding:0.5rem 32px;--scene-tree-search-input-border:none;--scene-tree-search-input-border-radius:0.25rem;--scene-tree-search-input-background:none;--scene-tree-search-focused-input-background:var(--neutral-200);--scene-tree-search-focused-input-outline:none;display:block;width:100%;font-size:0.875rem}.root{width:100%;position:relative}.input{background:var(--scene-tree-search-input-background);border:var(--scene-tree-search-input-border);border-radius:var(--scene-tree-search-input-border-radius);box-sizing:border-box;font-size:inherit;padding:var(--scene-tree-search-input-padding);outline:none;width:100%}.input.background{background:var(--scene-tree-search-focused-input-background);outline:var(--scene-tree-search-focused-input-outline)}.overlay{position:absolute;top:0;bottom:0;display:flex;align-items:center;justify-content:center;pointer-events:none}.overlay-clear{display:none;right:var(--scene-tree-search-clear-button-offset)}.overlay-clear.show{display:flex}.icon{color:var(--neutral-700)}.icon-search{position:absolute;left:var(--scene-tree-search-search-icon-offset);pointer-events:none}.clear-btn{display:flex;align-items:center;justify-content:center;pointer-events:initial;cursor:pointer}.clear-btn:hover{color:var(--neutral-800)}.clear-btn:disabled{pointer-events:none;opacity:0.5}`;const h=t(class e extends s{constructor(e){super();if(e!==false){this.__registerHost()}this.__attachShadow();this.search=i(this,"search");this.searchCompleted=i(this,"searchCompleted");this.disabled=false;this.placeholder=undefined;this.value="";this.focused=false;this.isSearching=false;this.handleTextInput=e=>{const t=e.target;this.value=t.value;if(this.debounce!=null||this.value===""){this.emitCurrentValue()}};this.handleTextFocus=()=>{this.focused=true};this.handleTextBlur=()=>{var e;this.focused=false;(e=this.searchDisposable)===null||e===void 0?void 0:e.dispose();if(this.value!==this.lastEmittedValue){this.emitCurrentValue()}};this.handleKeyPress=e=>{var t;if(e.key==="Enter"){(t=this.searchDisposable)===null||t===void 0?void 0:t.dispose();this.emitCurrentValue()}};this.handleClear=e=>{var t;e.preventDefault();this.value="";(t=this.searchDisposable)===null||t===void 0?void 0:t.dispose();this.emitCurrentValue();this.setFocus()}}async setFocus(){var e,t;if(typeof((e=this.inputEl)===null||e===void 0?void 0:e.focus)==="function"){(t=this.inputEl)===null||t===void 0?void 0:t.focus()}}controllerChanged(e){this.setupController()}componentDidLoad(){this.handleDebounceChanged();this.setupController()}disconnectedCallback(){var e;(e=this.onStateChangeDisposable)===null||e===void 0?void 0:e.dispose()}async clear(){var e;this.value="";(e=this.searchDisposable)===null||e===void 0?void 0:e.dispose();this.emitCurrentValue()}render(){return r(n,{key:"763e2f4c7ab3d80a197b94c123f61b25eba41b24"},r("div",{key:"14b5f4af01483f0d31ee77f03fc36fd1ff46e525",class:"root"},r("div",{key:"a1ebe30b97a16c83c9443402998e0f3f761d687d",class:"overlay icon icon-search"},r("slot",{key:"41073c4ecd626c3b4a38b0e62d95c6317cd2e98a",name:"search-icon"},this.isSearching?r("vertex-viewer-spinner",{slot:"search-icon",size:"xs"}):r("vertex-viewer-icon",{name:"search",size:"sm"}))),r("input",{key:"173d13b8d597425fdff082eb872225279e99bd34",class:o("input",{background:this.focused||this.value.length>0}),type:"text",ref:e=>this.inputEl=e,placeholder:this.placeholder,disabled:this.disabled,value:this.value,onInput:this.handleTextInput,onFocus:this.handleTextFocus,onBlur:this.handleTextBlur,onKeyPress:this.handleKeyPress}),r("div",{key:"f5b0de0431a9c8b051f61fcd76ce9eb430c0a0c9",class:o("overlay overlay-clear",{show:this.value.length>0})},r("button",{key:"92a36b952320fe724ba2f962a5a758a2e514fd18",class:"clear-btn icon",tabIndex:-1,onMouseDown:this.handleClear,disabled:this.disabled},r("slot",{key:"97dcec892120a855dd6a4d633f4a2cd84e57e670",name:"clear-icon"},r("vertex-viewer-icon",{key:"7df2c0ef411a569ccc0cd50cfbc43c6d8533d073",name:"close-circle",size:"sm"}))))))}handleDebounceChanged(){var e,t;(e=this.searchDisposable)===null||e===void 0?void 0:e.dispose();const s=c(this.search,(t=this.debounce)!==null&&t!==void 0?t:0);this.search=s;this.searchDisposable=s}setupController(){var e,t;(e=this.onStateChangeDisposable)===null||e===void 0?void 0:e.dispose();this.onStateChangeDisposable=(t=this.controller)===null||t===void 0?void 0:t.onStateChange.on((e=>{if(this.isSearching&&!e.isSearching){this.searchCompleted.emit(this.value)}this.isSearching=e.isSearching}))}emitCurrentValue(){this.lastEmittedValue=this.value;this.search.emit(this.value)}static get watchers(){return{controller:[{controllerChanged:0}]}}static get style(){return l()}},[257,"vertex-scene-tree-search",{debounce:[2],disabled:[4],placeholder:[1],controller:[16],value:[1025],focused:[32],isSearching:[32],setFocus:[64],clear:[64]},undefined,{controller:[{controllerChanged:0}]}]);function u(){if(typeof customElements==="undefined"){return}const t=["vertex-scene-tree-search","vertex-viewer-icon","vertex-viewer-spinner"];t.forEach((t=>{switch(t){case"vertex-scene-tree-search":if(!customElements.get(e(t))){customElements.define(e(t),h)}break;case"vertex-viewer-icon":if(!customElements.get(e(t))){a()}break;case"vertex-viewer-spinner":if(!customElements.get(e(t))){d()}break}}))}u();export{h as S,u as d};
5
- //# sourceMappingURL=p-Y8W_BXUk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["sceneTreeSearchCss","SceneTreeSearch","__stencil_proxyCustomElement","HTMLElement","constructor","registerHost","this","disabled","placeholder","undefined","value","focused","isSearching","handleTextInput","event","input","target","debounce","emitCurrentValue","handleTextFocus","handleTextBlur","_a","searchDisposable","dispose","lastEmittedValue","handleKeyPress","key","handleClear","preventDefault","setFocus","inputEl","focus","_b","controllerChanged","controller","setupController","componentDidLoad","handleDebounceChanged","disconnectedCallback","onStateChangeDisposable","clear","render","h","Host","class","name","slot","size","classNames","background","length","type","ref","onInput","onFocus","onBlur","onKeyPress","show","tabIndex","onMouseDown","emitter","debounceEvent","search","onStateChange","on","state","searchCompleted","emit"],"sources":["src/components/scene-tree-search/scene-tree-search.css?tag=vertex-scene-tree-search&encapsulation=shadow","src/components/scene-tree-search/scene-tree-search.tsx"],"sourcesContent":["@import url('../../css/button-reset.css');\n\n:host {\n /**\n * @prop --scene-tree-search-search-icon-offset: A CSS length that specifies\n * the horizontal offset of the search icon\n */\n --scene-tree-search-search-icon-offset: 8px;\n\n /**\n * @prop --scene-tree-search-clear-button-offset: A CSS length that specifies\n * the horizontal offset of the clear button.\n */\n --scene-tree-search-clear-button-offset: 8px;\n\n /**\n * @prop --scene-tree-search-input-padding: A CSS padding value that specifies\n * horizontal and vertical lengths of the internal text input.\n */\n --scene-tree-search-input-padding: 0.5rem 32px;\n\n /**\n * @prop --scene-tree-search-input-border: A CSS border value that specifies\n * the border of the internal text input.\n */\n --scene-tree-search-input-border: none;\n\n /**\n * @prop --scene-tree-search-input-border-radius: A CSS length that specifies\n * the radius of the internal text input.\n */\n --scene-tree-search-input-border-radius: 0.25rem;\n\n /**\n * @prop --scene-tree-search-input-background: A CSS background that specifies\n * the background color or image of the internal text input.\n */\n --scene-tree-search-input-background: none;\n\n /**\n * @prop --scene-tree-search-focused-input-background: A CSS background value\n * that specifies the background of the internal text input when focused.\n */\n --scene-tree-search-focused-input-background: var(--neutral-200);\n\n /**\n * @prop --scene-tree-search-focused-input-outline: A CSS outline value that\n * specifies the outline of the internal text input when focused.\n */\n --scene-tree-search-focused-input-outline: none;\n\n display: block;\n width: 100%;\n font-size: 0.875rem;\n}\n\n.root {\n width: 100%;\n position: relative;\n}\n\n.input {\n background: var(--scene-tree-search-input-background);\n border: var(--scene-tree-search-input-border);\n border-radius: var(--scene-tree-search-input-border-radius);\n box-sizing: border-box;\n font-size: inherit;\n padding: var(--scene-tree-search-input-padding);\n outline: none;\n width: 100%;\n}\n\n.input.background {\n background: var(--scene-tree-search-focused-input-background);\n outline: var(--scene-tree-search-focused-input-outline);\n}\n\n.overlay {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.overlay-clear {\n display: none;\n right: var(--scene-tree-search-clear-button-offset);\n}\n\n.overlay-clear.show {\n display: flex;\n}\n\n.icon {\n color: var(--neutral-700);\n}\n\n.icon-search {\n position: absolute;\n left: var(--scene-tree-search-search-icon-offset);\n pointer-events: none;\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: initial;\n cursor: pointer;\n}\n.clear-btn:hover {\n color: var(--neutral-800);\n}\n.clear-btn:disabled {\n pointer-events: none;\n opacity: 0.5;\n}","import {\n Component,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { debounceEvent } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\n\n/**\n * @slot search-icon - A slot that replaces the component's default search icon.\n * @slot clear-icon - A slot that replaces the component's default clear icon.\n */\n@Component({\n tag: 'vertex-scene-tree-search',\n styleUrl: 'scene-tree-search.css',\n shadow: true,\n})\nexport class SceneTreeSearch {\n /**\n * Specifies the delay, in milliseconds, to emit `search` events after user\n * input.\n *\n * If this value is specified, searches will automatically occur after a\n * keystroke has occurred and the debounce threshold has elapsed.\n *\n * Defaults to `undefined`, and searches only occur on an `Enter` press\n * or a `blur` event.\n */\n @Prop()\n public debounce?: number;\n\n /**\n * If `true`, disables user interaction of the component.\n */\n @Prop()\n public disabled = false;\n\n /**\n * Placeholder text if `value` is empty.\n */\n @Prop()\n public placeholder?: string = undefined;\n\n /**\n * The scene tree controller\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * The current text value of the component. Value is updated on user\n * interaction.\n */\n @Prop({ mutable: true })\n public value = '';\n\n /**\n * An event that is emitted when a user has changed or cleared the search\n * term. The event may be delayed according to the current `debounce` value.\n */\n @Event({ bubbles: true })\n public search!: EventEmitter<string>;\n\n /**\n * An event that is emitted when a search has completed.\n */\n @Event({ bubbles: true })\n public searchCompleted!: EventEmitter<string>;\n\n @State()\n private focused = false;\n\n @State()\n private isSearching = false;\n\n private lastEmittedValue?: string;\n private inputEl?: HTMLInputElement;\n private onStateChangeDisposable?: Disposable;\n private searchDisposable?: Disposable;\n\n /**\n * Gives focus to the component's internal text input.\n */\n @Method()\n public async setFocus(): Promise<void> {\n // HTMLInputElement.focus() doesn't exist in tests.\n if (typeof this.inputEl?.focus === 'function') {\n this.inputEl?.focus();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n public controllerChanged(controller: SceneTreeController): void {\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.handleDebounceChanged();\n\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.onStateChangeDisposable?.dispose();\n }\n\n /**\n * Clears the current search term and clears any debounced filters.\n */\n @Method()\n public async clear(): Promise<void> {\n this.value = '';\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"root\">\n <div class=\"overlay icon icon-search\">\n <slot name=\"search-icon\">\n {this.isSearching ? (\n <vertex-viewer-spinner slot=\"search-icon\" size=\"xs\" />\n ) : (\n <vertex-viewer-icon name=\"search\" size=\"sm\" />\n )}\n </slot>\n </div>\n\n <input\n class={classNames('input', {\n background: this.focused || this.value.length > 0,\n })}\n type=\"text\"\n ref={(ref) => (this.inputEl = ref)}\n placeholder={this.placeholder}\n disabled={this.disabled}\n value={this.value}\n onInput={this.handleTextInput}\n onFocus={this.handleTextFocus}\n onBlur={this.handleTextBlur}\n onKeyPress={this.handleKeyPress}\n />\n\n <div\n class={classNames('overlay overlay-clear', {\n show: this.value.length > 0,\n })}\n >\n <button\n class=\"clear-btn icon\"\n tabIndex={-1}\n onMouseDown={this.handleClear}\n disabled={this.disabled}\n >\n <slot name=\"clear-icon\">\n <vertex-viewer-icon name=\"close-circle\" size=\"sm\" />\n </slot>\n </button>\n </div>\n </div>\n </Host>\n );\n }\n\n private handleTextInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n\n if (this.debounce != null || this.value === '') {\n this.emitCurrentValue();\n }\n };\n\n private handleTextFocus = (): void => {\n this.focused = true;\n };\n\n private handleTextBlur = (): void => {\n this.focused = false;\n\n this.searchDisposable?.dispose();\n\n if (this.value !== this.lastEmittedValue) {\n this.emitCurrentValue();\n }\n };\n\n private handleKeyPress = (event: KeyboardEvent): void => {\n if (event.key === 'Enter') {\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n }\n };\n\n private handleClear = (event: MouseEvent): void => {\n event.preventDefault();\n\n this.value = '';\n this.searchDisposable?.dispose();\n this.emitCurrentValue();\n this.setFocus();\n };\n\n private handleDebounceChanged(): void {\n this.searchDisposable?.dispose();\n\n const emitter = debounceEvent(this.search, this.debounce ?? 0);\n\n // Track this emitter in two separate variables to maintain the `EventEmitter` typing for\n // `this.search`. This allows for correct generation of `CustomEvent` types.\n this.search = emitter;\n this.searchDisposable = emitter;\n }\n\n private setupController(): void {\n this.onStateChangeDisposable?.dispose();\n\n this.onStateChangeDisposable = this.controller?.onStateChange.on(\n (state) => {\n // If a search was previously being performed, but has now finished,\n // emit the event that the search has completed.\n if (this.isSearching && !state.isSearching) {\n this.searchCompleted.emit(this.value);\n }\n\n this.isSearching = state.isSearching;\n },\n );\n }\n\n private emitCurrentValue(): void {\n this.lastEmittedValue = this.value;\n this.search.emit(this.value);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["getSceneTreeViewportHeight","el","clientHeight","getSceneTreeContainsElement","other","contains","lowerCase","str","toLowerCase","DEFAULT_SPLIT_REGEXP","DEFAULT_STRIP_REGEXP","noCase","input","options","_a","splitRegexp","_b","stripRegexp","_c","transform","_d","delimiter","result","replace","start","end","length","charAt","slice","split","map","join","re","value","RegExp","reduce","pascalCaseTransform","index","firstChar","lowerChars","substr","toUpperCase","pascalCase","__assign","camelCaseTransform","camelCase","bindingRegEx","CollectionBinding","constructor","bindings","this","bind","data","forEach","binding","NodeBinding","node","expr","TextNodeBinding","super","newContent","replaceBindingString","textContent","AttributeBinding","attr","newValue","oldValue","getAttribute","setAttribute","PropertyBinding","prop","replaceBinding","EventHandlerBinding","eventName","path","extractBindingPath","disposable","dispose","listener","getBindableValue","addEventListener","removeEventListener","generateBindings","nodeType","Node","ELEMENT_NODE","bindableAttributes","getBindableAttributes","name","startsWith","push","propName","TEXT_NODE","test","i","childNodes","element","Array","from","attributes","filter","exec","undefined","toString","isHead","head","tail","ElementPool","container","elementFactory","instanceMap","Map","elements","swapHeadToTail","count","sliced","splice","concat","swapTailToHead","updateElements","diff","createElement","deleteElement","updateData","f","instance","get","updateElementFactory","iterateElements","set","append","pop","delete","remove","generateInstanceFromTemplate","template","fragment","content","cloneNode","firstElementChild","getSceneTreeTableOffsetTop","getBoundingClientRect","top","getSceneTreeTableViewportWidth","clientWidth","scrollToTop","scrollTo","SceneTreeCellHoverController","onStateChange","EventDispatcher","setHovered","id","emit","stateChanged","on","restartTimeout","fn","existingTimeout","delay","window","clearTimeout","setTimeout","sceneTreeTableLayoutCss","SceneTreeTableLayout","__stencil_proxyCustomElement","HTMLElement","registerHost","rows","totalRows","rowHeight","overScanCount","layoutOffset","scrollOffset","viewportStartIndex","viewportEndIndex","columnGridLayout","columnGridFixedLayout","isComputingCellHeight","isScrolling","stateMap","viewportRows","columnWidths","columnWidthPercentages","lastStartIndex","columnElements","cellHoverController","layoutColumns","visibleRowCount","iterateColumns","col","pool","colIndex","style","minHeight","cellPaddingLeft","depth","rowIndex","row","isLoadedRow","updateCell","cell","position","boxSizing","height","width","paddingLeft","tree","hoverController","updateLayoutPosition","readDOM","tableElement","recomputeColumnWidths","layoutWidth","getLayoutWidth","w","columnsResized","recomputeColumnPercentages","computeInitialColumnWidths","c","initialWidth","columnWidthSum","scaledColumnWidths","updateColumnElements","hostEl","querySelectorAll","computeCellHeight","async","dummyData","hex","expanded","selected","visible","partiallyVisible","isLeaf","columnsList","filterHit","hasGeometry","phantom","endItem","metadata","createColumnCellInstance","visibility","appendChild","componentOnReady","Promise","resolve","computeHeaderHeight","headerHeight","headerElement","setProperty","computeColumnGridLayout","res","bindHeaderData","headerInstances","createHeaderInstance","paddingRight","slot","gridColumnStart","gridColumnEnd","headerDividerInstances","_","createDividerInstance","right","pointerEvents","rebindHeaderData","removeDividerDragListeners","addDividerDragListeners","createDividerPointerDownHandler","event","preventDefault","stopPropagation","lastDividerPointerPosition","Point","create","Math","floor","clientX","clientY","resizingColumnIndex","classList","add","handleDividerPointerMove","handleDividerPointerUp","current","resizingIndex","subtract","abs","x","isValidResize","currentColumn","nextColumn","currentWidth","nextWidth","currentMinWidth","minWidth","currentMaxWidth","maxWidth","Number","MAX_SAFE_INTEGER","nextMinWidth","nextMaxWidth","currentIsValid","nextIsValid","handleScrollChanged","scrollTimer","target","scrollTop","computeAndUpdateViewportRows","componentWillLoad","createPools","initializeColumnLayout","headerResizeObserver","ResizeObserver","resizeObserver","clearLayoutHeight","clearLayoutWidth","componentDidLoad","passive","observe","initializeMeasuredLayout","componentWillRender","componentDidRender","layoutRendered","componentDidUpdate","disconnectedCallback","disconnect","handleViewportRowsPropsChanged","scrollToPosition","attemptComputeCellHeight","render","h","Host","key","class","ref","gridTemplateColumns","display","onSlotchange","ensureDividerTemplateDefined","recreateColumnPools","computeViewportRows","viewportHeight","getLayoutHeight","canComputeIndices","viewportCount","ceil","startIndex","max","endIndex","min","getViewportRows","controller","isConnected","updateActiveRowRange","columnElementPools","WeakMap","column","Error","querySelector","defaultDividerTemplate","document","innerHTML","headerDividerListeners","d","listeners","populateRowData","rowData","call","layoutHeight","computedWidth"],"sources":["src/components/scene-tree/lib/dom.ts","../html-templates/dist/bundle.js","src/components/scene-tree-table-layout/lib/dom.ts","src/components/scene-tree-table-layout/lib/hover-controller.ts","src/components/scene-tree-table-layout/lib/window.ts","src/components/scene-tree-table-layout/scene-tree-table-layout.css?tag=vertex-scene-tree-table-layout&encapsulation=shadow","src/components/scene-tree-table-layout/scene-tree-table-layout.tsx"],"sourcesContent":["export function getSceneTreeViewportHeight(el: HTMLElement): number {\n return el.clientHeight;\n}\n\nexport function getSceneTreeOffsetTop(el: HTMLElement): number {\n return el.offsetTop;\n}\n\nexport function getSceneTreeContainsElement(\n el: Element,\n other: Element,\n): boolean {\n return el.contains(other);\n}\n","import { __assign } from 'tslib';\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\n/**\n * Lower case as a function.\n */\nfunction lowerCase(str) {\n return str.toLowerCase();\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nvar DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n// Remove all non-word characters.\nvar DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nfunction noCase(input, options) {\n if (options === void 0) { options = {}; }\n var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? \" \" : _d;\n var result = replace(replace(input, splitRegexp, \"$1\\0$2\"), stripRegexp, \"\\0\");\n var start = 0;\n var end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n // Transform each token independently.\n return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input, re, value) {\n if (re instanceof RegExp)\n return input.replace(re, value);\n return re.reduce(function (input, re) { return input.replace(re, value); }, input);\n}\n\nfunction pascalCaseTransform(input, index) {\n var firstChar = input.charAt(0);\n var lowerChars = input.substr(1).toLowerCase();\n if (index > 0 && firstChar >= \"0\" && firstChar <= \"9\") {\n return \"_\" + firstChar + lowerChars;\n }\n return \"\" + firstChar.toUpperCase() + lowerChars;\n}\nfunction pascalCase(input, options) {\n if (options === void 0) { options = {}; }\n return noCase(input, __assign({ delimiter: \"\", transform: pascalCaseTransform }, options));\n}\n\nfunction camelCaseTransform(input, index) {\n if (index === 0)\n return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\nfunction camelCase(input, options) {\n if (options === void 0) { options = {}; }\n return pascalCase(input, __assign({ transform: camelCaseTransform }, options));\n}\n\nconst bindingRegEx = /{{(.+)}}/;\nclass CollectionBinding {\n constructor(bindings) {\n this.bindings = bindings;\n }\n bind(data) {\n this.bindings.forEach((binding) => binding.bind(data));\n }\n}\nclass NodeBinding {\n constructor(node, expr) {\n this.node = node;\n this.expr = expr;\n }\n}\nclass TextNodeBinding extends NodeBinding {\n constructor(node, expr) {\n super(node, expr);\n }\n bind(data) {\n const newContent = replaceBindingString(data, this.expr);\n if (newContent !== this.node.textContent) {\n this.node.textContent = newContent;\n }\n }\n}\nclass AttributeBinding extends NodeBinding {\n constructor(node, expr, attr) {\n super(node, expr);\n this.attr = attr;\n }\n bind(data) {\n const newValue = replaceBindingString(data, this.expr);\n const oldValue = this.node.getAttribute(this.attr);\n if (oldValue !== newValue) {\n this.node.setAttribute(this.attr, newValue);\n }\n }\n}\nclass PropertyBinding extends NodeBinding {\n constructor(node, expr, prop) {\n super(node, expr);\n this.prop = prop;\n }\n bind(data) {\n const newValue = replaceBinding(data, this.expr);\n /* eslint-disable @typescript-eslint/no-explicit-any */\n const oldValue = this.node[this.prop];\n if (oldValue !== newValue) {\n this.node[this.prop] = newValue;\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n}\nclass EventHandlerBinding extends NodeBinding {\n constructor(node, expr, eventName) {\n super(node, expr);\n this.eventName = eventName;\n }\n bind(data) {\n var _a;\n const path = extractBindingPath(this.expr);\n if (path != null) {\n (_a = this.disposable) === null || _a === void 0 ? void 0 : _a.dispose();\n const listener = getBindableValue(data, path, true);\n this.node.addEventListener(this.eventName, listener);\n this.disposable = {\n dispose: () => {\n this.node.removeEventListener(this.eventName, listener);\n },\n };\n }\n }\n}\nfunction generateBindings(node) {\n const bindings = [];\n if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node;\n const bindableAttributes = getBindableAttributes(el);\n bindableAttributes.forEach((attr) => {\n if (attr.name.startsWith('event:')) {\n const eventName = camelCase(attr.name.replace('event:', ''));\n bindings.push(new EventHandlerBinding(el, attr.value, eventName));\n }\n else if (attr.name.startsWith('attr:')) {\n bindings.push(new AttributeBinding(el, attr.value, attr.name.replace('attr:', '')));\n }\n else if (attr.name.startsWith('prop:')) {\n const propName = camelCase(attr.name.replace('prop:', ''));\n bindings.push(new PropertyBinding(el, attr.value, propName));\n }\n });\n }\n else if (node.nodeType === Node.TEXT_NODE &&\n node.textContent != null &&\n bindingRegEx.test(node.textContent)) {\n bindings.push(new TextNodeBinding(node, node.textContent));\n }\n for (let i = 0; i < node.childNodes.length; i++) {\n bindings.push(...generateBindings(node.childNodes[i]));\n }\n return bindings;\n}\nfunction getBindableAttributes(element) {\n return Array.from(element.attributes).filter((attr) => bindingRegEx.test(attr.value));\n}\nfunction extractBindingPath(expr) {\n const result = bindingRegEx.exec(expr);\n return result != null ? result[1] : undefined;\n}\nfunction replaceBindingString(data, expr) {\n const path = extractBindingPath(expr);\n if (path != null) {\n const value = getBindableValue(data, path, true);\n return expr.replace(`{{${path}}}`, value === null || value === void 0 ? void 0 : value.toString());\n }\n else {\n return expr;\n }\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction replaceBinding(data, expr) {\n const path = extractBindingPath(expr);\n if (path != null) {\n const value = getBindableValue(data, path, true);\n return value;\n }\n else {\n return expr;\n }\n}\nfunction getBindableValue(data, path, isHead = false) {\n const [head, ...tail] = path.split('.');\n if (isHead && tail.length === 0) {\n return data;\n }\n else if (isHead && tail.length > 0) {\n return getBindableValue(data, tail.join('.'), false);\n }\n else {\n const value = data[head];\n if (tail.length > 0) {\n return getBindableValue(value, tail.join('.'), false);\n }\n else {\n return value;\n }\n }\n}\n\nclass ElementPool {\n constructor(container, elementFactory) {\n this.container = container;\n this.elementFactory = elementFactory;\n this.instanceMap = new Map();\n this.elements = [];\n }\n swapHeadToTail(count) {\n const sliced = this.elements.splice(0, count);\n this.elements.splice(this.elements.length, 0, ...sliced);\n return this.elements.concat();\n }\n swapTailToHead(count) {\n const sliced = this.elements.splice(-count, count);\n this.elements.splice(0, 0, ...sliced);\n return this.elements.concat();\n }\n updateElements(count) {\n const diff = count - this.elements.length;\n if (diff > 0) {\n for (let i = 0; i < diff; i++) {\n this.createElement();\n }\n }\n else {\n for (let i = 0; i < -diff; i++) {\n this.deleteElement();\n }\n }\n return this.elements.concat();\n }\n updateData(f) {\n this.elements.forEach((el, i) => {\n const instance = this.instanceMap.get(el);\n const data = f(i);\n instance === null || instance === void 0 ? void 0 : instance.bindings.bind(data);\n });\n }\n updateElementFactory(elementFactory) {\n this.elementFactory = elementFactory;\n this.updateElements(0);\n }\n iterateElements(f) {\n this.elements.forEach((el, i) => {\n const instance = this.instanceMap.get(el);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n f(el, instance.bindings, i);\n });\n }\n createElement() {\n const instance = this.elementFactory();\n this.elements.push(instance.element);\n this.instanceMap.set(instance.element, instance);\n this.container.append(instance.element);\n return instance;\n }\n deleteElement() {\n const element = this.elements.pop();\n if (element != null) {\n this.instanceMap.delete(element);\n element.remove();\n }\n }\n}\n\nfunction append(container, element, data) {\n const bindings = new CollectionBinding(generateBindings(element));\n bindings.bind(data);\n container.appendChild(element);\n const created = container.lastElementChild;\n if (created != null) {\n return { element: created, bindings };\n }\n else {\n throw new Error('Failed to append element');\n }\n}\nfunction generateInstanceFromTemplate(template) {\n const fragment = template.content.cloneNode(true);\n const element = fragment.firstElementChild;\n const bindings = new CollectionBinding(generateBindings(fragment));\n return { element, bindings };\n}\n\nexport { AttributeBinding, CollectionBinding, ElementPool, EventHandlerBinding, NodeBinding, PropertyBinding, TextNodeBinding, append, generateBindings, generateInstanceFromTemplate };\n//# sourceMappingURL=bundle.js.map\n","export type DomScrollToOptions = ScrollToOptions;\n\nexport function getSceneTreeTableOffsetTop(el: HTMLElement): number {\n return el.getBoundingClientRect().top ?? 0;\n}\n\nexport function getSceneTreeTableViewportWidth(el: HTMLElement): number {\n return el.clientWidth;\n}\n\nexport function scrollToTop(\n el: HTMLElement,\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>,\n): void {\n el.scrollTo({ top, ...options });\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nexport class SceneTreeCellHoverController {\n public onStateChange = new EventDispatcher<string | undefined>();\n\n public setHovered(id?: string): void {\n this.onStateChange.emit(id);\n }\n\n public stateChanged(listener: Listener<string | undefined>): Disposable {\n return this.onStateChange.on(listener);\n }\n}\n","export function restartTimeout(\n fn: VoidFunction,\n existingTimeout?: number,\n delay = 200,\n): number {\n window.clearTimeout(existingTimeout);\n return window.setTimeout(fn, delay);\n}\n",":host {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n font-size: 0.825rem;\n\n /**\n * @prop --scene-tree-table-row-padding: CSS lengths that specifies the amount of\n * padding between the row's border and content.\n */\n --scene-tree-table-row-padding: 2px 0px;\n\n /**\n * @prop --scene-tree-table-column-gap: CSS length that specifies the amount of\n * padding between columns in the table.\n */\n --scene-tree-table-column-gap: 0.5rem;\n\n /**\n * @prop --scene-tree-table-column-resize-cursor: A CSS cursor value that will\n * be displayed when resizing a column. Defaults to `col-resize`.\n */\n --scene-tree-table-column-resize-cursor: col-resize;\n}\n\n.header {\n position: relative;\n display: grid;\n width: 100%;\n border-bottom: var(--scene-tree-toolbar-separator);\n}\n\n.table {\n position: relative;\n display: grid;\n width: 100%;\n height: 100%;\n overflow: auto;\n}\n\n.resize-overlay {\n position: absolute;\n top: 0;\n cursor: var(--scene-tree-table-column-resize-cursor);\n z-index: 1000;\n width: 100%;\n height: 100%;\n}\n\n.divider-overlay {\n position: absolute;\n top: 0;\n display: grid;\n pointer-events: none;\n z-index: 2000;\n width: 100%;\n height: 100%;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport {\n Binding,\n ElementPool,\n generateInstanceFromTemplate,\n InstancedTemplate,\n} from '@vertexvis/html-templates';\n\nimport { readDOM } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\nimport { getSceneTreeViewportHeight } from '../scene-tree/lib/dom';\nimport { isLoadedRow, LoadedRow, Row } from '../scene-tree/lib/row';\nimport { RowDataProvider } from '../scene-tree/types';\nimport {\n DomScrollToOptions,\n getSceneTreeTableOffsetTop,\n getSceneTreeTableViewportWidth,\n scrollToTop,\n} from './lib/dom';\nimport { SceneTreeCellHoverController } from './lib/hover-controller';\nimport { restartTimeout } from './lib/window';\n\ninterface StateMap {\n columnElementPools?: WeakMap<\n HTMLVertexSceneTreeTableColumnElement,\n ElementPool\n >;\n headerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerListeners?: Array<(event: PointerEvent) => void>;\n\n viewportRows: Row[];\n\n headerHeight?: number;\n columnWidths: number[];\n columnWidthPercentages: number[];\n}\n\n@Component({\n tag: 'vertex-scene-tree-table-layout',\n styleUrl: 'scene-tree-table-layout.css',\n shadow: true,\n})\nexport class SceneTreeTableLayout {\n /**\n * A reference to the scene tree to perform operations for interactions. Such\n * as expansion, visibility and selection.\n */\n @Prop()\n public tree?: HTMLVertexSceneTreeElement;\n\n /**\n * @internal\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * @internal\n */\n @Prop()\n public rows: Row[] = [];\n\n /**\n * @internal\n */\n @Prop()\n public totalRows = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public rowHeight = 24;\n\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n *\n * This prop will be automatically populated based on the `overScanCount` prop\n * specified in the parent `<vertex-scene-tree />` element.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A callback that is invoked immediately before a row is about to be rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * This prop will be automatically populated based on the `rowData` prop\n * specified in the parent `<vertex-scene-tree />` element.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public scrollOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutHeight?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutWidth?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportStartIndex = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportEndIndex = 0;\n\n /**\n * @internal\n */\n @Event()\n public layoutRendered!: EventEmitter<void>;\n\n /**\n * An event that is emitted when the columns of this `<vertex-scene-tree-table-layout>`\n * are resized with an array containing the widths of the columns in pixels.\n */\n @Event({ bubbles: true })\n public columnsResized!: EventEmitter<number[]>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private columnGridLayout = '1fr';\n\n @State()\n private columnGridFixedLayout = '';\n\n @State()\n private isComputingCellHeight = true;\n\n @State()\n private lastDividerPointerPosition?: Point.Point;\n\n @State()\n private resizingColumnIndex?: number;\n\n @State()\n private isScrolling = false;\n\n @State()\n private scrollTimer: number | undefined;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n viewportRows: [],\n columnWidths: [],\n columnWidthPercentages: [],\n };\n\n private lastStartIndex = 0;\n private resizeObserver?: ResizeObserver;\n private headerResizeObserver?: ResizeObserver;\n\n private tableElement?: HTMLDivElement;\n private headerElement?: HTMLDivElement;\n private columnElements: HTMLVertexSceneTreeTableColumnElement[] = [];\n\n private cellHoverController = new SceneTreeCellHoverController();\n\n public componentWillLoad(): void {\n this.updateColumnElements();\n this.createPools();\n this.initializeColumnLayout();\n\n this.headerResizeObserver = new ResizeObserver(() => {\n this.stateMap.headerHeight = undefined;\n this.computeHeaderHeight();\n this.updateLayoutPosition();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateLayoutPosition();\n this.clearLayoutHeight();\n this.clearLayoutWidth();\n this.recomputeColumnWidths();\n this.computeColumnGridLayout();\n });\n }\n\n public async componentDidLoad(): Promise<void> {\n this.tableElement?.addEventListener('scroll', this.handleScrollChanged, {\n passive: true,\n });\n\n if (this.headerElement != null) {\n this.headerResizeObserver?.observe(this.headerElement);\n }\n\n this.resizeObserver?.observe(this.hostEl);\n\n // These measurements require rendered DOM, but mutating tracked values\n // directly in componentDidLoad triggers Stencil dev warnings.\n await Promise.resolve();\n await this.initializeMeasuredLayout();\n }\n\n public async componentWillRender(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n public componentDidRender(): void {\n this.layoutColumns();\n\n this.layoutRendered.emit();\n }\n\n public async componentDidUpdate(): Promise<void> {\n if (this.isComputingCellHeight) {\n await this.computeCellHeight();\n }\n }\n\n public disconnectedCallback(): void {\n this.tableElement?.removeEventListener('scroll', this.handleScrollChanged);\n this.removeDividerDragListeners();\n this.headerResizeObserver?.disconnect();\n this.resizeObserver?.disconnect();\n this.stateMap.columnWidths = [];\n this.stateMap.columnWidthPercentages = [];\n }\n\n @Watch('rows')\n @Watch('totalRows')\n @Watch('rowHeight')\n protected async handleViewportRowsPropsChanged(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n /**\n * Scrolls the table to the provided top value.\n *\n * @param top The position to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToPosition(\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>,\n ): Promise<void> {\n if (this.tableElement != null) {\n scrollToTop(this.tableElement, top, options);\n }\n }\n\n /**\n * Attempts to compute the height of templated cells. Used for internals\n * or testing.\n *\n * @internal\n * @ignore\n */\n @Method()\n public async attemptComputeCellHeight(): Promise<void> {\n this.computeCellHeight();\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"header\"\n ref={(ref) => (this.headerElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n display: this.columnElements.length <= 1 ? 'none' : 'grid',\n }}\n >\n <slot name=\"header\" />\n </div>\n <div\n class=\"table\"\n ref={(ref) => (this.tableElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridLayout,\n }}\n >\n <slot\n onSlotchange={() => {\n this.ensureDividerTemplateDefined();\n this.updateColumnElements();\n this.recreateColumnPools();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n this.computeColumnGridLayout();\n }}\n />\n </div>\n <div\n class=\"divider-overlay\"\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n }}\n >\n <slot name=\"divider\" />\n </div>\n {this.resizingColumnIndex != null && <div class=\"resize-overlay\" />}\n </Host>\n );\n }\n\n private computeViewportRows(): void {\n const viewportHeight = this.getLayoutHeight();\n const canComputeIndices =\n viewportHeight != null &&\n viewportHeight > 0 &&\n !this.isComputingCellHeight;\n\n if (canComputeIndices) {\n const viewportCount = Math.ceil(viewportHeight / this.rowHeight);\n\n const viewportStartIndex = Math.floor(this.scrollOffset / this.rowHeight);\n const viewportEndIndex = viewportStartIndex + viewportCount;\n\n const startIndex = Math.max(0, viewportStartIndex - this.overScanCount);\n const endIndex = Math.min(\n this.totalRows - 1,\n viewportEndIndex + this.overScanCount,\n );\n\n const rows = this.getViewportRows(startIndex, endIndex);\n\n this.viewportStartIndex = startIndex;\n this.viewportEndIndex = endIndex;\n this.stateMap.viewportRows = rows;\n }\n }\n\n private initializeColumnLayout(): void {\n this.computeInitialColumnWidths();\n this.computeColumnGridLayout();\n this.ensureDividerTemplateDefined();\n this.rebindHeaderData();\n }\n\n private async initializeMeasuredLayout(): Promise<void> {\n await this.computeCellHeight();\n this.computeHeaderHeight();\n }\n\n private async computeAndUpdateViewportRows(): Promise<void> {\n this.computeViewportRows();\n\n if (this.controller?.isConnected && this.totalRows > 0) {\n await this.controller.updateActiveRowRange(\n this.viewportStartIndex,\n this.viewportEndIndex,\n );\n }\n }\n\n private layoutColumns = (): void => {\n const visibleRowCount = this.viewportEndIndex - this.viewportStartIndex + 1;\n const diff = this.viewportStartIndex - this.lastStartIndex;\n this.lastStartIndex = this.viewportStartIndex;\n\n this.iterateColumns((col, pool, colIndex) => {\n pool.updateElements(visibleRowCount);\n\n if (diff > 0) {\n pool.swapHeadToTail(diff);\n } else {\n pool.swapTailToHead(-diff);\n }\n\n col.style.minHeight = `${this.rowHeight * this.totalRows}px`;\n\n const cellPaddingLeft =\n colIndex === 0\n ? (depth: number) => `calc(${depth} * 0.5rem)`\n : () => `0`;\n\n pool.iterateElements((el, binding, rowIndex) => {\n const row = this.stateMap.viewportRows[rowIndex];\n\n if (isLoadedRow(row)) {\n this.updateCell(row, el, binding, rowIndex, cellPaddingLeft);\n }\n });\n });\n };\n\n private updateCell = (\n row: LoadedRow,\n cell: HTMLElement,\n binding: Binding,\n rowIndex: number,\n cellPaddingLeft: (depth: number) => string,\n ): void => {\n cell.style.position = 'absolute';\n cell.style.top = `${(this.viewportStartIndex + rowIndex) * this.rowHeight}px`;\n cell.style.boxSizing = 'border-box';\n cell.style.height = `${this.rowHeight}px`;\n cell.style.width = '100%';\n cell.style.paddingLeft = cellPaddingLeft(row.node.depth);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (cell as any).tree = this.tree;\n (cell as any).node = row.node;\n (cell as any).hoverController = this.cellHoverController;\n (cell as any).isScrolling = this.isScrolling;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n binding.bind(row);\n };\n\n private updateLayoutPosition = (): void => {\n readDOM(() => {\n if (this.tableElement != null) {\n this.layoutOffset = getSceneTreeTableOffsetTop(this.tableElement);\n }\n });\n };\n\n private recomputeColumnWidths = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidths = this.stateMap.columnWidthPercentages.map(\n (w) => w * layoutWidth,\n );\n\n this.columnsResized.emit(this.stateMap.columnWidths);\n }\n };\n\n private recomputeColumnPercentages = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidthPercentages = this.stateMap.columnWidths.map(\n (w) => w / layoutWidth,\n );\n }\n };\n\n private computeInitialColumnWidths = (): void => {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100,\n );\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n const columnWidthSum = this.stateMap.columnWidths.reduce(\n (result, w) => result + w,\n 0,\n );\n const scaledColumnWidths = this.stateMap.columnWidths.map(\n (w) => w * (layoutWidth / columnWidthSum),\n );\n\n this.stateMap.columnWidthPercentages = scaledColumnWidths.map(\n (w) => w / layoutWidth,\n );\n this.stateMap.columnWidths = scaledColumnWidths;\n }\n };\n\n private updateColumnElements = (): void => {\n this.columnElements = Array.from(\n this.hostEl.querySelectorAll('vertex-scene-tree-table-column'),\n ) as Array<HTMLVertexSceneTreeTableColumnElement>;\n };\n\n private createPools(): void {\n if (this.stateMap.columnElementPools == null) {\n this.stateMap.columnElementPools = this.columnElements.reduce(\n (map, c) =>\n map.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c)),\n ),\n new WeakMap(),\n );\n }\n }\n\n private recreateColumnPools(): void {\n this.columnElements.forEach((c) => {\n if (this.stateMap.columnElementPools?.get(c) == null) {\n this.stateMap.columnElementPools?.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c)),\n );\n } else {\n this.stateMap.columnElementPools\n .get(c)\n ?.updateElementFactory(() => this.createColumnCellInstance(c));\n }\n });\n }\n\n private iterateColumns(\n f: (\n column: HTMLVertexSceneTreeTableColumnElement,\n pool: ElementPool,\n index: number,\n ) => void,\n ): void {\n this.columnElements.forEach((column, i) => {\n const pool = this.stateMap.columnElementPools?.get(column);\n if (pool != null) {\n f(column, pool, i);\n } else {\n throw new Error('Cannot find pool for column');\n }\n });\n }\n\n private ensureDividerTemplateDefined(): void {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]',\n ) as HTMLTemplateElement;\n if (template == null) {\n const defaultDividerTemplate = document.createElement('template');\n defaultDividerTemplate.slot = 'divider';\n defaultDividerTemplate.innerHTML = `\n <vertex-scene-tree-table-resize-divider slot=\"divider\">\n </vertex-scene-tree-table-resize-divider>\n `;\n this.hostEl.appendChild(defaultDividerTemplate);\n }\n }\n\n private createHeaderInstance(\n column: HTMLVertexSceneTreeTableColumnElement,\n ): InstancedTemplate<HTMLElement> | undefined {\n const template = column.querySelector(\n 'template[slot=\"header\"]',\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n }\n }\n\n private createDividerInstance(): InstancedTemplate<HTMLElement> {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]',\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Table is missing divider template element');\n }\n }\n\n private createColumnCellInstance(\n column: HTMLVertexSceneTreeTableColumnElement,\n ): InstancedTemplate<HTMLElement> {\n const template = column.querySelector(\n 'template:not([slot=\"header\"])',\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Column is missing cell template element');\n }\n }\n\n private computeCellHeight = async (): Promise<void> => {\n if (this.isComputingCellHeight && this.columnElements.length > 0) {\n const dummyData: LoadedRow = {\n index: 0,\n node: {\n id: { hex: '' },\n name: 'Dummy row',\n expanded: false,\n selected: false,\n visible: false,\n partiallyVisible: false,\n isLeaf: false,\n depth: 0,\n columnsList: [],\n filterHit: false,\n hasGeometry: false,\n phantom: false,\n endItem: false,\n },\n metadata: {},\n data: {},\n };\n const { bindings, element } = this.createColumnCellInstance(\n this.columnElements[0],\n );\n bindings.bind(dummyData);\n element.style.visibility = 'hidden';\n\n this.columnElements[0]?.appendChild(element);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (element as any).componentOnReady === 'function') {\n await (element as any).componentOnReady();\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n let height = element.clientHeight;\n if (height === 0) {\n height = await new Promise((resolve) => {\n setTimeout(() => resolve(element.getBoundingClientRect().height), 5);\n });\n }\n\n this.rowHeight = height ?? this.rowHeight;\n element.remove();\n this.isComputingCellHeight = this.rowHeight === 0;\n }\n };\n\n private computeHeaderHeight = (): void => {\n if (this.stateMap.headerHeight == null) {\n this.stateMap.headerHeight =\n this.headerElement?.getBoundingClientRect().height;\n this.hostEl.style.setProperty(\n '--header-height',\n `${this.stateMap.headerHeight}px`,\n );\n }\n };\n\n private computeColumnGridLayout = (): void => {\n if (this.stateMap.columnWidths.length === 0) {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100,\n );\n }\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n if (this.stateMap.columnWidthPercentages.length === 0) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth,\n );\n }\n }\n\n /**\n * This layout uses `1fr` instead of the final column width to\n * allow the final column to shrink when a scrollbar appears.\n *\n * This flex behavior is not desired for the header and divider\n * elements since they are not scrollable, and `columnGridFixedLayout`\n * should be used instead.\n */\n this.columnGridLayout = `${this.stateMap.columnWidths\n .slice(0, -1)\n .reduce((res, w) => `${res} ${w}px`, '')} 1fr`;\n\n this.columnGridFixedLayout = `${this.stateMap.columnWidths.reduce(\n (res, w) => `${res} ${w}px`,\n '',\n )}`;\n };\n\n private bindHeaderData = (): void => {\n if (this.stateMap.headerInstances == null) {\n this.stateMap.headerInstances = this.columnElements\n .map((c, i) => {\n const instance = this.createHeaderInstance(c);\n\n if (instance != null) {\n instance.element.style.paddingRight =\n i === this.columnElements.length - 1\n ? `0`\n : `var(--scene-tree-table-column-gap)`;\n instance.element.slot = 'header';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n }\n\n return instance;\n })\n .filter((i) => i != null) as Array<InstancedTemplate<HTMLElement>>;\n }\n\n if (this.stateMap.headerDividerInstances == null) {\n this.stateMap.headerDividerInstances = this.columnElements\n .slice(0, -1)\n .map((_, i) => {\n const instance = this.createDividerInstance();\n\n instance.element.slot = 'divider';\n instance.element.style.position = 'absolute';\n instance.element.style.right = '0';\n instance.element.style.pointerEvents = 'auto';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n\n return instance;\n });\n }\n };\n\n private rebindHeaderData = (): void => {\n this.removeDividerDragListeners();\n\n this.stateMap.headerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerDividerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerInstances = undefined;\n this.stateMap.headerDividerInstances = undefined;\n\n this.bindHeaderData();\n this.addDividerDragListeners();\n };\n\n private addDividerDragListeners(): void {\n this.stateMap.headerDividerListeners =\n this.stateMap.headerDividerInstances?.map((d, i) => {\n const listener = this.createDividerPointerDownHandler(i);\n\n d.element.addEventListener('pointerdown', listener);\n\n return listener;\n });\n }\n\n private removeDividerDragListeners(): void {\n if (this.stateMap.headerDividerListeners != null) {\n const listeners = this.stateMap.headerDividerListeners;\n\n this.stateMap.headerDividerInstances?.forEach((d, i) => {\n const listener = listeners[i];\n if (listener != null) {\n d.element.removeEventListener('pointerdown', listener);\n }\n });\n this.stateMap.headerDividerListeners = undefined;\n }\n }\n\n private createDividerPointerDownHandler = (\n index: number,\n ): ((event: PointerEvent) => void) => {\n return (event: PointerEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.lastDividerPointerPosition = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY),\n );\n this.resizingColumnIndex = index;\n this.stateMap.headerDividerInstances?.[index]?.element.classList.add(\n 'dragging',\n );\n\n window.addEventListener('pointermove', this.handleDividerPointerMove);\n window.addEventListener('pointerup', this.handleDividerPointerUp);\n };\n };\n\n private handleDividerPointerMove = (event: PointerEvent): void => {\n const current = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY),\n );\n\n if (\n this.lastDividerPointerPosition != null &&\n this.resizingColumnIndex != null\n ) {\n const resizingIndex = this.resizingColumnIndex;\n const diff = Point.subtract(this.lastDividerPointerPosition, current);\n\n if (Math.abs(diff.x) >= 1 && this.isValidResize(diff, resizingIndex)) {\n this.stateMap.columnWidths = this.stateMap.columnWidths.map((w, i) =>\n i === resizingIndex ? w - diff.x : w,\n );\n\n if (resizingIndex + 1 < this.stateMap.columnWidths.length) {\n this.stateMap.columnWidths = this.stateMap.columnWidths.map((w, i) =>\n i === resizingIndex + 1 ? w + diff.x : w,\n );\n }\n\n this.lastDividerPointerPosition = current;\n this.computeColumnGridLayout();\n }\n }\n };\n\n private handleDividerPointerUp = (): void => {\n if (this.resizingColumnIndex != null) {\n this.stateMap.headerDividerInstances?.[\n this.resizingColumnIndex\n ]?.element.classList.remove('dragging');\n }\n this.lastDividerPointerPosition = undefined;\n this.resizingColumnIndex = undefined;\n\n this.recomputeColumnPercentages();\n this.recomputeColumnWidths();\n\n window.removeEventListener('pointermove', this.handleDividerPointerMove);\n window.removeEventListener('pointerup', this.handleDividerPointerUp);\n };\n\n private isValidResize = (diff: Point.Point, index: number): boolean => {\n const currentColumn = this.columnElements[index];\n const nextColumn = this.columnElements[index + 1];\n const currentWidth = this.stateMap.columnWidths[index];\n const nextWidth = this.stateMap.columnWidths[index + 1];\n const currentMinWidth = currentColumn.minWidth ?? 0;\n const currentMaxWidth = currentColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n const nextMinWidth = nextColumn.minWidth ?? 0;\n const nextMaxWidth = nextColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n\n const currentIsValid =\n currentWidth - diff.x > currentMinWidth &&\n currentWidth - diff.x < currentMaxWidth;\n const nextIsValid =\n nextColumn != null\n ? nextWidth + diff.x > nextMinWidth && nextWidth + diff.x < nextMaxWidth\n : true;\n\n return currentIsValid && nextIsValid;\n };\n\n private handleScrollChanged = async (event: Event): Promise<void> => {\n this.isScrolling = true;\n\n this.scrollTimer = restartTimeout(() => {\n this.isScrolling = false;\n }, this.scrollTimer);\n\n this.scrollOffset = (event.target as HTMLElement).scrollTop;\n await this.computeAndUpdateViewportRows();\n };\n\n private getViewportRows(startIndex: number, endIndex: number): Row[] {\n const rows = this.rows.slice(startIndex, endIndex + 1);\n return rows.map((row) => (row != null ? this.populateRowData(row) : row));\n }\n\n private populateRowData(row: Row): Row {\n if (this.rowData != null && row != null) {\n const data = this.rowData?.(row) || {};\n return { ...row, data };\n } else {\n return row;\n }\n }\n\n private getLayoutHeight(): number | undefined {\n if (this.layoutHeight == null && this.tableElement != null) {\n this.layoutHeight = getSceneTreeViewportHeight(this.tableElement);\n }\n return this.layoutHeight;\n }\n\n private getLayoutWidth(): number | undefined {\n if (this.layoutWidth == null) {\n const computedWidth = getSceneTreeTableViewportWidth(this.hostEl);\n if (computedWidth > 0) {\n this.layoutWidth = computedWidth;\n }\n }\n return this.layoutWidth;\n }\n\n private clearLayoutHeight(): void {\n this.layoutHeight = undefined;\n }\n\n private clearLayoutWidth(): void {\n this.layoutWidth = undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +0,0 @@
1
- {"version":3,"names":["create","x","y","distance","a","b","delta","subtract","Math","sqrt","add","scaleProportional","pt","scale","magnitude","normalizeVector","magnitudeOfPoint","normalDirectionVector","ptA","ptB","orthogonalVector","unitVectorBetweenPoints","abs","vectorXValue","pow","vectorYValue","fromJson","json","obj","JSON","parse","Array","isArray","createArrowheadPoints","start","end","arrowSideLength","arrowHeadTheta","arrowOrthogonalVector","Point.orthogonalVector","normalizedDirection","Point.normalDirectionVector","arrowLeft","Point.subtract","Point.add","Point.scaleProportional","cos","sin","arrowRight","leftPoint","rightPoint","createLineAnchorStylePoints","triangleArrowAngle","lineArrowAngle","Point.distance","arrowHeadHeight","max","min","hashHeight","radius","triangleArrowRelativeHeight","triangleArrowBasePosition","triangleArrowTheta","Angle","toRadians","triangleArrowSideLength","triangleArrow","lineArrowTheta","lineArrowSideLength","lineArrow","hashLineTheta","hashLine","tip","base","arrowTriangle","arrowLine","hash","arrowheadPointsToPolygonPoints","points","scaledRight","scalePointProportional","scaledLeft","scaledBase","map","join","arrowheadPointsToPathPoints","arrowheadPointsToHashPoints","x1","y1","x2","y2","arrowheadPointsToCirclePoints","cx","cy","r","isVertexViewerArrowMarkup","el","HTMLElement","nodeName","parsePoint","value","Point.fromJson","basePoint","scaledPoint","isVertexViewerCircleMarkup","parseBounds","Rectangle","parsePoints","values","Point","stringify","isVertexViewerFreeformMarkup","getBoundingBox2dAnchorPosition","rect","position","width","height","center","translatePointToScreen","canvasDimensions","contentDimensions","centeringBehavior","canvasToContentScaleFactor","effectiveScalar","contentScaleFactor","getScaleFactor","contentRelativePoint","Dimensions","scaledContentWidth","scaledContentHeight","centerOffsetX","centerOffsetY","translateDimensionsToScreen","dimensions","contentRelativeDimensions","translateRectToScreen","fromPointAndDimensions","translatePointToRelative","offset","pointWithoutOffset","getWindowDevicePixelRatio","centeredContentPoint","contentCenterRelativePoint","translatePointsToBounds","original","bounds","createRectangle","initialPoint","currentPoint","maintainAspectRatio","fromPoints","fitBoundsSize","isPortrait","currentIsLeftOfInitial","currentIsAboveInitial","fitBoundsX","fitBoundsY","transformRectangle","current","anchor","left","top","w","h","right","bottom","topLeft","bottomLeft","topRight","bottomRight","isVertexViewerMarkupElement","isValidPointData","every","Number","isNaN","isValidStartEvent","event","target","mode","RelativeAnchor","id","transform","rotation","name","point","onPointerDown","children","class","style","onTouchStart","preventDefault","SvgShadow","effectiveScale","xOffset","yOffset","filterUnits","in","stdDeviation","dx","dy","result","in2","operator","MarkupInteractionHandler","constructor","scalingOptions","this","handlePointerDown","handleInteractionAttempt","handlePointerMove","handleInteractionMove","handlePointerUp","window","removeEventListener","handleInteractionEnd","resizeObserver","ResizeObserver","entry","elementBounds","computeBoundingRect","initialize","element","observe","addEventListener","dispose","disconnect","_a","undefined","updateScalingOptions","getScalingOptions","acceptInteraction"],"sources":["../geometry/src/point.ts","src/components/viewer-markup-arrow/utils.ts","src/components/viewer-markup-circle/utils.ts","src/components/viewer-markup-freeform/utils.ts","src/components/viewer-markup/markup-utils.ts","src/components/viewer-markup/viewer-markup-components.tsx","src/lib/markup/interactions.ts"],"sourcesContent":["import * as Angle from './angle';\nimport { lerp as lerpNumber } from './math';\n\n/**\n * A `Point` represents a cartesian coordinate with a horizontal and vertical\n * position or length.\n */\nexport interface Point {\n x: number;\n y: number;\n}\n\n/**\n * Returns a new `Point` with the given horizontal and vertical position.\n */\nexport function create(x = 0, y = 0): Point {\n return { x, y };\n}\n\n/**\n * Converts a polar coordinate (length and angle) into a Cartesian coordinate.\n */\nexport function polar(length: number, radians: Angle.Angle): Point {\n const x = Math.cos(radians) * length;\n const y = Math.sin(radians) * length;\n return create(x, y);\n}\n\n/**\n * Returns the distance between two points.\n */\nexport function distance(a: Point, b: Point): number {\n const delta = subtract(a, b);\n return Math.sqrt(delta.x * delta.x + delta.y * delta.y);\n}\n\n/**\n * Returns a new `Point` where `b` is subtracted from `a`.\n */\nexport function subtract(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\n\n/**\n * Returns a new `Point` where `b` is added to `a`.\n */\nexport function add(a: Point, b: Point): Point {\n return { x: a.x + b.x, y: a.y + b.y };\n}\n\n/**\n * Returns `true` if the `x` and `y` positions of `a` and `b` are equal.\n */\nexport function isEqual(a: Point, b: Point): boolean {\n return a.x === b.x && a.y === b.y;\n}\n\n/**\n * Performs a linear interpolation between `a` and `b` and returns the result.\n * The value of `t` is clamped between `[0, 1]`.\n *\n * @param a The start value.\n * @param b The end value.\n * @param t A value between 0 and 1.\n * @returns A point between `a` and `b`.\n */\nexport function lerp(a: Point, b: Point, t: number): Point {\n return {\n x: lerpNumber(a.x, b.x, t),\n y: lerpNumber(a.y, b.y, t),\n };\n}\n\n/**\n * Returns a new `Point` where `x` and `y` are inverted.\n */\nexport function negate(pt: Point): Point {\n return create(-pt.x, -pt.y);\n}\n\n/**\n * Returns a new `Point` where `x` and `y` are multiplied by the given scale\n * factors.\n */\nexport function scale(pt: Point, scaleX: number, scaleY: number): Point {\n return {\n x: pt.x * scaleX,\n y: pt.y * scaleY,\n };\n}\n\n/**\n * Returns a new `Point` where `x` and `y` are multiplied by the given scale\n * factor.\n */\nexport function scaleProportional(pt: Point, scale: number): Point {\n return {\n x: pt.x * scale,\n y: pt.y * scale,\n };\n}\n\n/**\n * Returns the magnitude of a point.\n */\nexport function magnitude(pt: Point): number {\n return Math.sqrt(pt.x * pt.x + pt.y * pt.y);\n}\n\n/**\n * Transforms a vector into the corresponding normal (unit) vector.\n */\nexport function normalizeVector(pt: Point): Point {\n const magnitudeOfPoint = magnitude(pt);\n if (magnitudeOfPoint === 0) {\n return create(0, 0);\n } else {\n return scaleProportional(pt, 1 / magnitudeOfPoint);\n }\n}\n\n/**\n * Returns a new normal (unit) vector pointing between the two given points.\n */\nexport function normalDirectionVector(ptA: Point, ptB: Point): Point {\n return normalizeVector(subtract(ptB, ptA));\n}\n\n/**\n * Returns a vector orthogonal to the vector between the two given points.\n */\nexport function orthogonalVector(ptA: Point, ptB: Point): Point {\n const unitVectorBetweenPoints = normalDirectionVector(ptA, ptB);\n\n // Handle vectors that are parallel to the x or y axis\n if (unitVectorBetweenPoints.x === 0 || unitVectorBetweenPoints.y === 0) {\n return create(-1 * unitVectorBetweenPoints.y, unitVectorBetweenPoints.x);\n }\n\n if (\n Math.abs(unitVectorBetweenPoints.x) > Math.abs(unitVectorBetweenPoints.y)\n ) {\n const vectorXValue = 1 - Math.pow(unitVectorBetweenPoints.x, 2);\n const vectorYValue =\n -1 * unitVectorBetweenPoints.x * unitVectorBetweenPoints.y;\n return normalizeVector(create(vectorXValue, vectorYValue));\n } else {\n const vectorXValue =\n -1 * unitVectorBetweenPoints.x * unitVectorBetweenPoints.y;\n const vectorYValue = 1 - Math.pow(unitVectorBetweenPoints.y, 2);\n return normalizeVector(create(vectorXValue, vectorYValue));\n }\n}\n\n/**\n * Parses a JSON string representation of a Point and returns an object.\n *\n * @param json A JSON string, either in the form `[x,y]` or `{\"x\": 0, \"y\": 0}`\n * @returns A parsed Point.\n */\nexport function fromJson(json: string): Point {\n const obj = JSON.parse(json);\n if (Array.isArray(obj)) {\n const [x, y] = obj;\n return create(x, y);\n } else {\n const { x, y } = obj;\n return create(x, y);\n }\n}\n","import { Angle } from '@vertexvis/geometry';\n\nimport * as Point from '../../../../geometry/src/point';\n\nexport type LineAnchorStyle =\n | 'arrow-triangle'\n | 'arrow-line'\n | 'dot'\n | 'hash'\n | 'none';\n\nexport interface LineAnchorStylePoints {\n tip: Point.Point;\n base: Point.Point;\n arrowTriangle: ArrowheadPoints;\n arrowLine: ArrowheadPoints;\n hash: ArrowheadPoints;\n radius: number;\n}\n\nexport interface ArrowheadPoints {\n leftPoint: Point.Point;\n rightPoint: Point.Point;\n}\n\nexport interface LinePoints {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nexport interface CirclePoints {\n cx: number;\n cy: number;\n r: number;\n}\n\nexport function createArrowheadPoints(\n start: Point.Point,\n end: Point.Point,\n arrowSideLength: number,\n arrowHeadTheta: number,\n): ArrowheadPoints {\n const arrowOrthogonalVector = Point.orthogonalVector(start, end);\n const normalizedDirection = Point.normalDirectionVector(start, end);\n\n const arrowLeft = Point.subtract(\n end,\n Point.add(\n Point.scaleProportional(\n normalizedDirection,\n arrowSideLength * Math.cos(arrowHeadTheta),\n ),\n Point.scaleProportional(\n arrowOrthogonalVector,\n arrowSideLength * Math.sin(arrowHeadTheta),\n ),\n ),\n );\n const arrowRight = Point.subtract(\n end,\n Point.subtract(\n Point.scaleProportional(\n normalizedDirection,\n arrowSideLength * Math.cos(arrowHeadTheta),\n ),\n Point.scaleProportional(\n arrowOrthogonalVector,\n arrowSideLength * Math.sin(arrowHeadTheta),\n ),\n ),\n );\n\n return {\n leftPoint: arrowLeft,\n rightPoint: arrowRight,\n };\n}\n\nexport function createLineAnchorStylePoints(\n start: Point.Point,\n end: Point.Point,\n triangleArrowAngle = 65,\n lineArrowAngle = 85,\n): LineAnchorStylePoints {\n // Adjust the size of the end style to the distance between the start and end points\n const distance = Point.distance(start, end);\n const arrowHeadHeight = Math.max(4, Math.min(16, distance * 0.25));\n const hashHeight = Math.max(4, Math.min(12, distance * 0.16));\n const radius = Math.min(5, distance * 0.1);\n\n // Triangle arrow position\n const triangleArrowRelativeHeight = arrowHeadHeight / distance;\n const triangleArrowBasePosition = Point.add(\n Point.scaleProportional(end, 1 - triangleArrowRelativeHeight),\n Point.scaleProportional(start, triangleArrowRelativeHeight),\n );\n const triangleArrowTheta = Angle.toRadians(triangleArrowAngle / 2);\n const triangleArrowSideLength =\n arrowHeadHeight / Math.cos(triangleArrowTheta);\n const triangleArrow = createArrowheadPoints(\n start,\n end,\n triangleArrowSideLength,\n triangleArrowTheta,\n );\n\n // Line arrow position\n const lineArrowTheta = Angle.toRadians(lineArrowAngle / 2);\n const lineArrowSideLength = arrowHeadHeight / Math.cos(lineArrowTheta);\n const lineArrow = createArrowheadPoints(\n start,\n end,\n lineArrowSideLength,\n lineArrowTheta,\n );\n\n // Hash position\n // Setting the arrowHeadAngle to 90 degrees results in a\n // straight hash mark perpendicular to the direction of the line\n const hashLineTheta = Angle.toRadians(90);\n const hashLine = createArrowheadPoints(start, end, hashHeight, hashLineTheta);\n\n return {\n tip: end,\n base: triangleArrowBasePosition,\n arrowTriangle: triangleArrow,\n arrowLine: lineArrow,\n hash: hashLine,\n radius: radius,\n };\n}\n\nexport function arrowheadPointsToPolygonPoints(\n points: LineAnchorStylePoints,\n scale = 1,\n): string {\n const scaledRight = scalePointProportional(\n points.tip,\n points.arrowTriangle.rightPoint,\n scale,\n );\n const scaledLeft = scalePointProportional(\n points.tip,\n points.arrowTriangle.leftPoint,\n scale,\n );\n const scaledBase = scalePointProportional(points.tip, points.base, scale);\n\n return [points.tip, scaledRight, scaledBase, scaledLeft]\n .map((pt) => `${pt.x},${pt.y}`)\n .join(' ');\n}\n\nexport function arrowheadPointsToPathPoints(\n points: LineAnchorStylePoints,\n scale = 1,\n): string {\n const scaledRight = scalePointProportional(\n points.tip,\n points.arrowLine.rightPoint,\n scale,\n );\n const scaledLeft = scalePointProportional(\n points.tip,\n points.arrowLine.leftPoint,\n scale,\n );\n\n return `M${scaledRight.x} ${scaledRight.y} L${points.tip.x} ${points.tip.y} L${scaledLeft.x} ${scaledLeft.y} L${points.tip.x} ${points.tip.y} Z`;\n}\n\nexport function arrowheadPointsToHashPoints(\n points: LineAnchorStylePoints,\n scale = 1,\n): LinePoints {\n const scaledRight = scalePointProportional(\n points.tip,\n points.hash.rightPoint,\n scale,\n );\n const scaledLeft = scalePointProportional(\n points.tip,\n points.hash.leftPoint,\n scale,\n );\n\n return {\n x1: scaledRight.x,\n y1: scaledRight.y,\n x2: scaledLeft.x,\n y2: scaledLeft.y,\n };\n}\n\nexport function arrowheadPointsToCirclePoints(\n points: LineAnchorStylePoints,\n scale = 1,\n): CirclePoints {\n return {\n cx: points.tip.x,\n cy: points.tip.y,\n r: points.radius * scale,\n };\n}\n\nexport function isVertexViewerArrowMarkup(\n el: unknown,\n): el is HTMLVertexViewerMarkupArrowElement {\n return (\n el instanceof HTMLElement && el.nodeName === 'VERTEX-VIEWER-MARKUP-ARROW'\n );\n}\n\nexport function parsePoint(\n value: string | Point.Point | undefined,\n): Point.Point | undefined {\n return typeof value === 'string' ? Point.fromJson(value) : value;\n}\n\nexport function scalePointProportional(\n basePoint: Point.Point,\n scaledPoint: Point.Point,\n scale: number,\n): Point.Point {\n return Point.add(\n basePoint,\n Point.scaleProportional(Point.subtract(scaledPoint, basePoint), scale),\n );\n}\n","import { Rectangle } from '@vertexvis/geometry';\n\nexport function isVertexViewerCircleMarkup(\n el: unknown,\n): el is HTMLVertexViewerMarkupCircleElement {\n return (\n el instanceof HTMLElement && el.nodeName === 'VERTEX-VIEWER-MARKUP-CIRCLE'\n );\n}\n\nexport function parseBounds(\n value: string | Rectangle.Rectangle | undefined,\n): Rectangle.Rectangle | undefined {\n return typeof value === 'string' ? Rectangle.fromJson(value) : value;\n}\n","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","import { Dimensions, Point, Rectangle } from '@vertexvis/geometry';\n\nimport { getWindowDevicePixelRatio } from '../../lib/dom';\nimport { MarkupCenteringBehavior } from '../../lib/types';\nimport { isVertexViewerArrowMarkup } from '../viewer-markup-arrow/utils';\nimport { isVertexViewerCircleMarkup } from '../viewer-markup-circle/utils';\nimport { isVertexViewerFreeformMarkup } from '../viewer-markup-freeform/utils';\n\nexport type BoundingBox2dAnchorPosition =\n | 'left'\n | 'right'\n | 'top'\n | 'bottom'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n | 'center';\n\nexport function getBoundingBox2dAnchorPosition(\n rect: Rectangle.Rectangle,\n position: BoundingBox2dAnchorPosition,\n): Point.Point {\n switch (position) {\n case 'top-left':\n return Point.create(rect.x, rect.y);\n case 'top':\n return Point.create(rect.x + rect.width / 2, rect.y);\n case 'top-right':\n return Point.create(rect.x + rect.width, rect.y);\n case 'right':\n return Point.create(rect.x + rect.width, rect.y + rect.height / 2);\n case 'bottom-right':\n return Point.create(rect.x + rect.width, rect.y + rect.height);\n case 'bottom':\n return Point.create(rect.x + rect.width / 2, rect.y + rect.height);\n case 'bottom-left':\n return Point.create(rect.x, rect.y + rect.height);\n case 'left':\n return Point.create(rect.x, rect.y + rect.height / 2);\n case 'center':\n return Rectangle.center(rect);\n }\n}\n\nexport function translatePointToScreen(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1,\n): Point.Point {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height,\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativePoint = Point.add(\n Point.scale(pt, contentScaleFactor, contentScaleFactor),\n Dimensions.center(contentDimensions),\n );\n\n // Include an offset for width and height to account for cases where the\n // content dimensions are smaller than the canvas dimensions.\n const scaledContentWidth = contentDimensions.width * effectiveScalar;\n const scaledContentHeight = contentDimensions.height * effectiveScalar;\n const centerOffsetX =\n centeringBehavior === 'both' || centeringBehavior === 'x-only'\n ? Math.max(0, (canvasDimensions.width - scaledContentWidth) / 2)\n : 0;\n const centerOffsetY =\n centeringBehavior === 'both' || centeringBehavior === 'y-only'\n ? Math.max(0, (canvasDimensions.height - scaledContentHeight) / 2)\n : 0;\n\n return Point.create(\n contentRelativePoint.x * effectiveScalar + centerOffsetX,\n contentRelativePoint.y * effectiveScalar + centerOffsetY,\n );\n}\n\nexport function translatePointToBounds(\n pt: Point.Point,\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions,\n): Point.Point {\n const rectToScreen = translateRectToScreen(rect, canvasDimensions);\n return Point.add(pt, rectToScreen);\n}\n\nexport function translateDimensionsToScreen(\n dimensions: Dimensions.Dimensions,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n scale = 1,\n): Dimensions.Dimensions {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height,\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentRelativeDimensions = Dimensions.scale(\n contentScaleFactor,\n contentScaleFactor,\n dimensions,\n );\n\n return Dimensions.scale(\n effectiveScalar,\n effectiveScalar,\n contentRelativeDimensions,\n );\n}\n\n/**\n * Translates a rectangle in relative units, to a rectangle in screen units.\n *\n * Shape coordinates are persisted in relative units, so they can be presented\n * at any size.\n */\nexport function translateRectToScreen(\n rect: Rectangle.Rectangle,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions?: Dimensions.Dimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1,\n): Rectangle.Rectangle {\n const position = translatePointToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n centeringBehavior,\n scale,\n );\n const dimensions = translateDimensionsToScreen(\n rect,\n canvasDimensions,\n contentDimensions,\n scale,\n );\n return Rectangle.fromPointAndDimensions(position, dimensions);\n}\n\n/**\n * Translates a point in screen units, to a point in relative units.\n */\nexport function translatePointToRelative(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n contentDimensions: Dimensions.Dimensions = canvasDimensions,\n centeringBehavior: MarkupCenteringBehavior = 'none',\n scale = 1,\n offset: Point.Point = Point.create(0, 0),\n): Point.Point {\n const canvasToContentScaleFactor = Math.min(\n canvasDimensions.width / contentDimensions.width,\n canvasDimensions.height / contentDimensions.height,\n );\n const effectiveScalar = canvasToContentScaleFactor * scale;\n\n // Include an offset for width and height to account for cases where the\n // content dimensions are smaller than the canvas dimensions.\n const scaledContentWidth = contentDimensions.width * effectiveScalar;\n const scaledContentHeight = contentDimensions.height * effectiveScalar;\n const centerOffsetX =\n centeringBehavior === 'both' || centeringBehavior === 'x-only'\n ? Math.max(0, (canvasDimensions.width - scaledContentWidth) / 2)\n : 0;\n const centerOffsetY =\n centeringBehavior === 'both' || centeringBehavior === 'y-only'\n ? Math.max(0, (canvasDimensions.height - scaledContentHeight) / 2)\n : 0;\n\n const pointWithoutOffset = Point.subtract(\n pt,\n Point.scale(\n offset,\n 1 / getWindowDevicePixelRatio(),\n 1 / getWindowDevicePixelRatio(),\n ),\n );\n const centeredContentPoint = Point.create(\n (pointWithoutOffset.x - centerOffsetX) / effectiveScalar,\n (pointWithoutOffset.y - centerOffsetY) / effectiveScalar,\n );\n const contentScaleFactor = getScaleFactor(contentDimensions);\n const contentCenterRelativePoint = Point.subtract(\n centeredContentPoint,\n Dimensions.center(contentDimensions),\n );\n\n return Point.scale(\n contentCenterRelativePoint,\n 1 / contentScaleFactor,\n 1 / contentScaleFactor,\n );\n}\n\n/**\n * Translates a set of points in relative `original` units to\n * points in relative `bounds` units.\n */\nexport function translatePointsToBounds(\n points: Point.Point[],\n original: Rectangle.Rectangle,\n bounds: Rectangle.Rectangle,\n): Point.Point[] {\n return points.map((pt) =>\n Point.add(\n Point.scale(\n Point.subtract(pt, original),\n bounds.width / (original.width || 1),\n bounds.height / (original.height || 1),\n ),\n bounds,\n ),\n );\n}\n\nexport function createRectangle(\n initialPoint: Point.Point,\n currentPoint: Point.Point,\n maintainAspectRatio: boolean,\n): Rectangle.Rectangle {\n const bounds = Rectangle.fromPoints(initialPoint, currentPoint);\n if (maintainAspectRatio) {\n const fitBoundsSize = Math.max(bounds.width, bounds.height);\n const isPortrait = bounds.height > bounds.width;\n const currentIsLeftOfInitial = currentPoint.x <= initialPoint.x;\n const currentIsAboveInitial = currentPoint.y <= initialPoint.y;\n const fitBoundsX = currentIsLeftOfInitial\n ? isPortrait\n ? initialPoint.x - fitBoundsSize\n : currentPoint.x\n : initialPoint.x;\n const fitBoundsY = currentIsAboveInitial\n ? isPortrait\n ? currentPoint.y\n : initialPoint.y - fitBoundsSize\n : initialPoint.y;\n return Rectangle.create(\n fitBoundsX,\n fitBoundsY,\n fitBoundsSize,\n fitBoundsSize,\n );\n } else {\n return bounds;\n }\n}\n\nexport function transformRectangle(\n bounds: Rectangle.Rectangle,\n start: Point.Point,\n current: Point.Point,\n anchor: BoundingBox2dAnchorPosition,\n maintainAspectRatio?: boolean,\n): Rectangle.Rectangle {\n const delta = Point.subtract(current, start);\n const { x: left, y: top, width: w, height: h } = bounds;\n const right = left + w;\n const bottom = top + h;\n const topLeft = Point.create(left, top);\n const bottomLeft = Point.create(left, bottom);\n const topRight = Point.create(right, top);\n const bottomRight = Point.create(right, bottom);\n switch (anchor) {\n case 'top-left':\n return createRectangle(bottomRight, current, !!maintainAspectRatio);\n case 'top':\n return createRectangle(\n bottomRight,\n Point.create(left, current.y),\n !!maintainAspectRatio,\n );\n case 'top-right':\n return createRectangle(bottomLeft, current, !!maintainAspectRatio);\n case 'right':\n return createRectangle(\n bottomLeft,\n Point.create(current.x, top),\n !!maintainAspectRatio,\n );\n case 'bottom-right':\n return createRectangle(topLeft, current, !!maintainAspectRatio);\n case 'bottom':\n return createRectangle(\n topLeft,\n Point.create(right, current.y),\n !!maintainAspectRatio,\n );\n case 'bottom-left':\n return createRectangle(topRight, current, !!maintainAspectRatio);\n case 'left':\n return createRectangle(\n bottomRight,\n Point.create(current.x, top),\n !!maintainAspectRatio,\n );\n case 'center':\n return Rectangle.create(\n bounds.x + delta.x,\n bounds.y + delta.y,\n bounds.width,\n bounds.height,\n );\n }\n}\n\nexport function isVertexViewerMarkupElement(\n el: HTMLElement,\n): el is\n | HTMLVertexViewerMarkupArrowElement\n | HTMLVertexViewerMarkupCircleElement\n | HTMLVertexViewerMarkupFreeformElement {\n return (\n isVertexViewerArrowMarkup(el) ||\n isVertexViewerCircleMarkup(el) ||\n isVertexViewerFreeformMarkup(el)\n );\n}\n\nexport function isValidPointData(...points: Point.Point[]): boolean {\n return points.every((pt) => !Number.isNaN(pt.x) && !Number.isNaN(pt.y));\n}\n\nexport function isValidStartEvent(event: PointerEvent): boolean {\n const el = event.target as HTMLElement;\n\n return isVertexViewerMarkupElement(el) && el.mode !== 'edit';\n}\n\nfunction getScaleFactor(dimensions: Dimensions.Dimensions): number {\n // We intentionally use the content's height when scaling to maintain a consistent coordinate\n // space for markup. This is to ensure the markup will be displayed in the same position\n // on the canvas regardless of the aspect ratio at the time the markup was created.\n // See https://github.com/Vertexvis/vertex-web-sdk/pull/429 for more details.\n return dimensions.height;\n}\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { FunctionalComponent, h } from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\n\nexport interface RelativeAnchorProps {\n id?: string;\n transform?: string;\n rotation?: number;\n name: string;\n point: Point.Point;\n onPointerDown?: (event: PointerEvent) => void;\n}\n\nexport const RelativeAnchor: FunctionalComponent<RelativeAnchorProps> = (\n { id, transform, rotation, name, point, onPointerDown },\n children,\n) => {\n return (\n <div\n id={id}\n class=\"bounds-anchor-position\"\n style={{\n top: `${point.y}px`,\n left: `${point.x}px`,\n }}\n onTouchStart={(event) => event.preventDefault()}\n onPointerDown={onPointerDown}\n >\n <div style={{ transform }}>\n <div\n class=\"bounds-anchor\"\n style={{\n transform: `rotateZ(${rotation ?? 0}deg)`,\n }}\n >\n <slot name={name}>{children}</slot>\n </div>\n </div>\n </div>\n );\n};\n\nexport interface SvgShadowProps {\n id: string;\n scale?: number;\n}\n\nexport const SvgShadow: FunctionalComponent<SvgShadowProps> = ({\n id,\n scale,\n}) => {\n // Scale default values for a `<filter>` element by the provided scale.\n // This prevents the filter area from being too small when scale is greater than 1,\n // and uses the default values for a scale less than 1 to prevent the same issue.\n // See https://developer.mozilla.org/en-US/docs/Web/SVG/Reference/Element/filter\n // for more details on the default values used here.\n const effectiveScale = scale ?? 1;\n const xOffset = Math.max(10, 10 * effectiveScale);\n const yOffset = Math.max(10, 10 * effectiveScale);\n const width = Math.max(120, 110 * effectiveScale + xOffset);\n const height = Math.max(120, 110 * effectiveScale + yOffset);\n\n return (\n <filter\n id={id}\n filterUnits=\"userSpaceOnUse\"\n x={`${-xOffset}%`}\n y={`${-yOffset}%`}\n width={`${width}%`}\n height={`${height}%`}\n >\n <feGaussianBlur in=\"SourceAlpha\" stdDeviation=\"2\" />\n <feOffset dx=\"0\" dy=\"1\" result=\"offsetblur\" />\n <feFlood flood-color=\"#000000\" flood-opacity=\"0.25\" />\n <feComposite in2=\"offsetblur\" operator=\"in\" />\n <feMerge>\n <feMergeNode />\n <feMergeNode in=\"SourceGraphic\" />\n </feMerge>\n </filter>\n );\n};\n","import { Dimensions, Point } from '@vertexvis/geometry';\nimport { BasicInteractionHandler } from '@vertexvis/utils';\n\nimport { MarkupCenteringBehavior } from '../types';\n\nexport interface MarkupInteractionHandlerScalingOptions {\n scale?: number;\n offset?: Point.Point;\n originatingViewport?: Dimensions.Dimensions;\n centeringBehavior?: MarkupCenteringBehavior;\n}\n\nexport abstract class MarkupInteractionHandler implements BasicInteractionHandler {\n protected element?: HTMLElement;\n protected elementBounds?: DOMRect;\n protected scalingOptions: MarkupInteractionHandlerScalingOptions;\n\n private resizeObserver: ResizeObserver;\n\n public constructor(scalingOptions?: MarkupInteractionHandlerScalingOptions) {\n this.resizeObserver = new ResizeObserver(([entry]) => {\n this.elementBounds = this.computeBoundingRect();\n });\n\n this.scalingOptions = scalingOptions ?? {};\n }\n\n public initialize(element: HTMLElement): void {\n this.element = element;\n\n this.elementBounds = this.computeBoundingRect();\n this.resizeObserver.observe(this.element);\n\n this.element.addEventListener('pointerdown', this.handlePointerDown);\n }\n\n public dispose(): void {\n this.resizeObserver.disconnect();\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n\n this.element = undefined;\n }\n\n public updateScalingOptions(\n scalingOptions: MarkupInteractionHandlerScalingOptions,\n ): void {\n this.scalingOptions = {\n ...this.scalingOptions,\n ...scalingOptions,\n };\n }\n\n public getScalingOptions(): MarkupInteractionHandlerScalingOptions {\n return this.scalingOptions;\n }\n\n protected acceptInteraction(): void {\n window.addEventListener('pointermove', this.handlePointerMove);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n private handlePointerDown = (event: PointerEvent): void => {\n this.handleInteractionAttempt(event);\n };\n\n private handlePointerMove = (event: PointerEvent): void => {\n this.handleInteractionMove(event);\n };\n\n private handlePointerUp = (event: PointerEvent): void => {\n window.removeEventListener('pointermove', this.handlePointerMove);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.handleInteractionEnd(event);\n };\n\n protected abstract computeBoundingRect(): DOMRect;\n\n protected abstract handleInteractionAttempt(event: PointerEvent): void;\n\n protected abstract handleInteractionMove(event: PointerEvent): void;\n\n protected abstract handleInteractionEnd(event: PointerEvent): void;\n}\n"],"mappings":"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","ignoreList":[]}