@vertexvis/viewer 0.24.3 → 0.24.4-canary.1

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.
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import{r as i,h as t,H as s,g as n}from"./p-110f66c6.js";import{t as o,P as e,a as l}from"./p-f10a9c99.js";import{p as h}from"./p-9d26f24e.js";import{a as d}from"./p-6b00f7cd.js";import{l as r,p as a}from"./p-342dac8b.js";import{g as u}from"./p-95f6305a.js";import{E as v}from"./p-510dccbe.js";import{E as c}from"./p-0d971ad6.js";import{g as p}from"./p-86f529e1.js";class f{constructor(i,t,s){this.rectObserver=new v;this.droppableSurfaces=[c.PRECISE_SURFACE,c.IMPRECISE_SURFACE,c.GENERIC_GEOMETRY];this.handlePointerMove=async i=>{const t=await this.isDroppableSurface(i);const s=this.controller.getDraggable();if(s!=null&&t){this.handleDrag(s,i)}if(this.controller.getDraggable()==null&&this.controller.getToolMode()==="edit"&&t){this.addCursor(this.getCursorType())}else{this.clearCursor()}};this.handleDrag=async(i,t)=>{const s=u(t,this.elementRect);const n=await this.getWorldPositionForPoint(s);if(n!=null){this.controller.updateDraggable(Object.assign(Object.assign({},i),{lastPoint:s}),n)}};this.handlePointerDown=async i=>{const t=t=>{const n=h.distance(h.create(i.clientX,t.clientY),h.create(t.clientX,t.clientY));if(n<=2&&i.buttons!==2){if(this.controller.getToolMode()==="edit"){const t=u(i,this.elementRect);this.handlePlacePin(t)}}s()};const s=()=>{window.removeEventListener("pointerup",t)};window.addEventListener("pointerup",t);return{dispose:s}};this.handlePointerUp=async()=>{const i=this.controller.getDraggable();const t=i===null||i===void 0?void 0:i.lastPoint;this.controller.setDraggable(undefined);if(t!=null&&i!=null){this.ifInitialized((async({api:s})=>{var n,o,e,l,h,d;const[r]=await s.hitItems(t);if((r===null||r===void 0?void 0:r.hitPoint)!=null&&((n=r===null||r===void 0?void 0:r.hitPoint)===null||n===void 0?void 0:n.x)!=null&&((o=r===null||r===void 0?void 0:r.hitPoint)===null||o===void 0?void 0:o.y)!=null&&((e=r===null||r===void 0?void 0:r.hitPoint)===null||e===void 0?void 0:e.z)!=null){this.controller.updateDraggable(Object.assign(Object.assign({},i),{lastPoint:t}),{x:(l=r===null||r===void 0?void 0:r.hitPoint)===null||l===void 0?void 0:l.x,y:r===null||r===void 0?void 0:r.hitPoint.y,z:r===null||r===void 0?void 0:r.hitPoint.z},(d=(h=r===null||r===void 0?void 0:r.partId)===null||h===void 0?void 0:h.hex)!==null&&d!==void 0?d:undefined)}}))}};this.controller=i;this.xOffset=t;this.yOffset=s}get elementRect(){return this.rectObserver.rect}initialize(i,t){this.element=i;this.api=t;this.rectObserver.observe(i);i.addEventListener("pointermove",this.handlePointerMove);i.addEventListener("pointerdown",this.handlePointerDown);window.addEventListener("pointerup",this.handlePointerUp)}dispose(){var i,t;this.rectObserver.disconnect();this.clearCursor();(i=this.element)===null||i===void 0?void 0:i.removeEventListener("pointermove",this.handlePointerMove);(t=this.element)===null||t===void 0?void 0:t.removeEventListener("pointerdown",this.handlePointerDown);window.removeEventListener("pointerup",this.handlePointerUp);this.element=undefined;this.api=undefined}async getWorldPositionForPoint(i){return this.ifInitialized((async({api:t})=>{const s=await t.getWorldPointFromViewport(i);return s}))}async handlePlacePin(i,t){this.ifInitialized((async({api:s})=>{var n,e,l,h,r,a;const[u]=await s.hitItems(i);if((u===null||u===void 0?void 0:u.hitPoint)!=null&&this.elementRect!=null){if((u===null||u===void 0?void 0:u.hitPoint)!=null&&(u===null||u===void 0?void 0:u.hitPoint.x)!=null&&(u===null||u===void 0?void 0:u.hitPoint.y)!=null&&(u===null||u===void 0?void 0:u.hitPoint.z)!=null){const s=t!=null?t.id:d.create();const v=this.controller.getStyleAttributes()!=null?{style:this.controller.getStyleAttributes()}:undefined;switch(this.controller.getToolType()){case"pin-icon":this.controller.setPin({type:"icon",id:s,worldPosition:{x:(n=u===null||u===void 0?void 0:u.hitPoint)===null||n===void 0?void 0:n.x,y:u===null||u===void 0?void 0:u.hitPoint.y,z:u===null||u===void 0?void 0:u.hitPoint.z},partId:(l=(e=u===null||u===void 0?void 0:u.itemId)===null||e===void 0?void 0:e.hex)!==null&&l!==void 0?l:undefined,attributes:v});break;case"pin-text":const d=t==null;const c=o(i,this.elementRect,d,this.xOffset,this.yOffset);this.controller.setPin({type:"text",id:s,worldPosition:{x:(h=u===null||u===void 0?void 0:u.hitPoint)===null||h===void 0?void 0:h.x,y:u===null||u===void 0?void 0:u.hitPoint.y,z:u===null||u===void 0?void 0:u.hitPoint.z},partId:(a=(r=u===null||u===void 0?void 0:u.itemId)===null||r===void 0?void 0:r.hex)!==null&&a!==void 0?a:undefined,label:{point:c},attributes:v});this.controller.setSelectedPinId(s);break}}}else{this.controller.setSelectedPinId()}}))}getCursorType(){switch(this.controller.getToolType()){case"pin-icon":return a;case"pin-text":return r}}addCursor(i){this.clearCursor();this.cursor=this.ifInitialized((({api:t})=>t.addCursor(i)))}async isDroppableSurface(i){var t;const s=u(i,this.elementRect);const n=await((t=this.api)===null||t===void 0?void 0:t.getEntityTypeAtPoint(s));return n!=null&&this.droppableSurfaces.includes(n)}ifInitialized(i){if(this.element!=null&&this.api!=null){return i({element:this.element,api:this.api})}else{throw new Error("Pins interaction handler not initialized.")}}clearCursor(){var i;(i=this.cursor)===null||i===void 0?void 0:i.dispose();this.cursor=undefined}}const w=":host{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none;--viewer-pin-tool-initial-label-offset-x:20;--viewer-pin-tool-initial-label-offset-y:20}";const m=class{constructor(t){i(this,t);this.pinModel=new e;this.tool="pin-icon";this.mode="view";this.pins=[];this.stateMap={};this.handleSetProjectionMatrix=()=>{var i,t;this.projectionViewMatrix=(t=(i=this.viewer)===null||i===void 0?void 0:i.frame)===null||t===void 0?void 0:t.scene.camera.projectionViewMatrix}}watchModeChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setToolMode(this.mode);this.setupInteractionHandler()}watchTypeChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setToolType(this.tool);this.setupInteractionHandler()}watchAccentColorChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setAccentColor(this.accentColor);this.setupInteractionHandler()}watchPrimaryColorChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setPrimaryColor(this.primaryColor);this.setupInteractionHandler()}watchPinsChange(){if(this.pins.length>0){this.setDepthBuffers()}else{this.resetDepthBuffers()}}connectedCallback(){this.setupInteractionHandler();this.setDepthBuffers()}componentWillLoad(){this.updateViewport();this.setupController();this.setupInteractionHandler();this.setDepthBuffers();this.pinModel.onEntitiesChanged((i=>{this.pins=i}));this.pinModel.onSelectionChange((i=>{this.selectedPinId=i}));this.handleViewerChanged(this.viewer,undefined)}componentDidLoad(){this.resizeObserver=new ResizeObserver((()=>this.updateViewport()));this.resizeObserver.observe(this.hostEl)}disconnectedCallback(){this.clearInteractionHandler();this.clearModelListeners();this.resetDepthBuffers()}handleViewerChanged(i,t){this.setupInteractionHandler();this.setDepthBuffers();if(t!=null){t.removeEventListener("frameDrawn",this.handleSetProjectionMatrix)}if(i!=null){i.addEventListener("frameDrawn",this.handleSetProjectionMatrix)}this.handleSetProjectionMatrix()}render(){return t(s,null,t("vertex-viewer-dom-renderer",{viewer:this.viewer,drawMode:"2d"},this.pins.map((i=>t("vertex-viewer-pin-group",{id:`pin-group-${i.id}`,"data-is-dom-group-element":true,pin:i,elementBounds:this.elementBounds,pinModel:this.pinModel,pinController:this.pinController,projectionViewMatrix:this.projectionViewMatrix,selected:this.selectedPinId===i.id})))))}setupController(){const i=this.accentColor||this.primaryColor?{accentColor:this.accentColor,primaryColor:this.primaryColor}:undefined;this.pinController=new l(this.pinModel,this.mode,this.tool,i)}clearInteractionHandler(){var i;(i=this.registeredInteractionHandler)===null||i===void 0?void 0:i.then((i=>i.dispose()));this.registeredInteractionHandler=undefined}setupInteractionHandler(){var i;const t=window.getComputedStyle(this.hostEl);const s=t.getPropertyValue("--viewer-pin-tool-initial-label-offset-x").trim();const n=t.getPropertyValue("--viewer-pin-tool-initial-label-offset-y").trim();this.clearInteractionHandler();if(this.pinController!=null){this.registeredInteractionHandler=(i=this.viewer)===null||i===void 0?void 0:i.registerInteractionHandler(new f(this.pinController,parseInt(s),parseInt(n)))}}clearModelListeners(){var i,t;(i=this.onEntitiesChangedHandler)===null||i===void 0?void 0:i.dispose();this.onEntitiesChangedHandler=undefined;(t=this.resizeObserver)===null||t===void 0?void 0:t.disconnect()}updateViewport(){const i=p(this.hostEl);this.elementBounds=i}setDepthBuffers(){if(this.pins.length>0&&this.viewer!=null&&this.viewer.depthBuffers==null){this.stateMap.shouldClearDepthBuffers=true;this.viewer.depthBuffers="final"}}resetDepthBuffers(){if(this.stateMap.shouldClearDepthBuffers&&this.viewer!=null){this.viewer.depthBuffers=undefined;this.stateMap.shouldClearDepthBuffers=undefined}}get hostEl(){return n(this)}static get watchers(){return{mode:["watchModeChange"],tool:["watchTypeChange"],accentColor:["watchAccentColorChange"],primaryColor:["watchPrimaryColorChange"],pins:["watchPinsChange"],viewer:["handleViewerChanged"]}}};m.style=w;export{m as vertex_viewer_pin_tool};
5
- //# sourceMappingURL=p-856aecc5.entry.js.map
4
+ import{r as i,h as t,H as s,g as n}from"./p-110f66c6.js";import{t as o,P as e,a as l}from"./p-f10a9c99.js";import{p as h}from"./p-9d26f24e.js";import{a as d}from"./p-6b00f7cd.js";import{l as r,p as a}from"./p-342dac8b.js";import{g as u}from"./p-95f6305a.js";import{E as v}from"./p-510dccbe.js";import{E as c}from"./p-0d971ad6.js";import{g as p}from"./p-86f529e1.js";class f{constructor(i,t,s){this.rectObserver=new v;this.droppableSurfaces=[c.PRECISE_SURFACE,c.IMPRECISE_SURFACE,c.GENERIC_GEOMETRY];this.handlePointerMove=async i=>{const t=await this.isDroppableSurface(i);const s=this.controller.getDraggable();if(s!=null&&t){this.handleDrag(s,i)}if(this.controller.getDraggable()==null&&this.controller.getToolMode()==="edit"&&t){this.addCursor(this.getCursorType())}else{this.clearCursor()}};this.handleDrag=async(i,t)=>{const s=u(t,this.elementRect);const n=await this.getWorldPositionForPoint(s);if(n!=null){this.controller.updateDraggable(Object.assign(Object.assign({},i),{lastPoint:s}),n)}};this.handlePointerDown=async i=>{const t=t=>{const n=h.distance(h.create(i.clientX,t.clientY),h.create(t.clientX,t.clientY));if(n<=2&&i.buttons!==2){if(this.controller.getToolMode()==="edit"){const t=u(i,this.elementRect);this.handlePlacePin(t)}}s()};const s=()=>{window.removeEventListener("pointerup",t)};window.addEventListener("pointerup",t);return{dispose:s}};this.handlePointerUp=async()=>{const i=this.controller.getDraggable();const t=i===null||i===void 0?void 0:i.lastPoint;this.controller.setDraggable(undefined);if(t!=null&&i!=null){this.ifInitialized((async({api:s})=>{var n,o,e,l,h,d;const[r]=await s.hitItems(t);if((r===null||r===void 0?void 0:r.hitPoint)!=null&&((n=r===null||r===void 0?void 0:r.hitPoint)===null||n===void 0?void 0:n.x)!=null&&((o=r===null||r===void 0?void 0:r.hitPoint)===null||o===void 0?void 0:o.y)!=null&&((e=r===null||r===void 0?void 0:r.hitPoint)===null||e===void 0?void 0:e.z)!=null){this.controller.updateDraggable(Object.assign(Object.assign({},i),{lastPoint:t}),{x:(l=r===null||r===void 0?void 0:r.hitPoint)===null||l===void 0?void 0:l.x,y:r===null||r===void 0?void 0:r.hitPoint.y,z:r===null||r===void 0?void 0:r.hitPoint.z},(d=(h=r===null||r===void 0?void 0:r.partId)===null||h===void 0?void 0:h.hex)!==null&&d!==void 0?d:undefined)}}))}};this.controller=i;this.xOffset=t;this.yOffset=s}get elementRect(){return this.rectObserver.rect}initialize(i,t){this.element=i;this.api=t;this.rectObserver.observe(i);i.addEventListener("pointermove",this.handlePointerMove);i.addEventListener("pointerdown",this.handlePointerDown);window.addEventListener("pointerup",this.handlePointerUp)}dispose(){var i,t;this.rectObserver.disconnect();this.clearCursor();(i=this.element)===null||i===void 0?void 0:i.removeEventListener("pointermove",this.handlePointerMove);(t=this.element)===null||t===void 0?void 0:t.removeEventListener("pointerdown",this.handlePointerDown);window.removeEventListener("pointerup",this.handlePointerUp);this.element=undefined;this.api=undefined}async getWorldPositionForPoint(i){return this.ifInitialized((async({api:t})=>{const s=await t.getWorldPointFromViewport(i);return s}))}async handlePlacePin(i,t){this.ifInitialized((async({api:s})=>{var n,e,l,h,r,a;const[u]=await s.hitItems(i);if((u===null||u===void 0?void 0:u.hitPoint)!=null&&this.elementRect!=null){if((u===null||u===void 0?void 0:u.hitPoint)!=null&&(u===null||u===void 0?void 0:u.hitPoint.x)!=null&&(u===null||u===void 0?void 0:u.hitPoint.y)!=null&&(u===null||u===void 0?void 0:u.hitPoint.z)!=null){const s=t!=null?t.id:d.create();const v=this.controller.getStyleAttributes()!=null?{style:this.controller.getStyleAttributes()}:undefined;switch(this.controller.getToolType()){case"pin-icon":this.controller.setPin({type:"icon",id:s,worldPosition:{x:(n=u===null||u===void 0?void 0:u.hitPoint)===null||n===void 0?void 0:n.x,y:u===null||u===void 0?void 0:u.hitPoint.y,z:u===null||u===void 0?void 0:u.hitPoint.z},partId:(l=(e=u===null||u===void 0?void 0:u.itemId)===null||e===void 0?void 0:e.hex)!==null&&l!==void 0?l:undefined,attributes:v});break;case"pin-text":const d=t==null;const c=o(i,this.elementRect,d,this.xOffset,this.yOffset);this.controller.setPin({type:"text",id:s,worldPosition:{x:(h=u===null||u===void 0?void 0:u.hitPoint)===null||h===void 0?void 0:h.x,y:u===null||u===void 0?void 0:u.hitPoint.y,z:u===null||u===void 0?void 0:u.hitPoint.z},partId:(a=(r=u===null||u===void 0?void 0:u.itemId)===null||r===void 0?void 0:r.hex)!==null&&a!==void 0?a:undefined,label:{point:c},attributes:v});this.controller.setSelectedPinId(s);break}}}else{this.controller.setSelectedPinId()}}))}getCursorType(){switch(this.controller.getToolType()){case"pin-icon":return a;case"pin-text":return r}}addCursor(i){this.clearCursor();this.cursor=this.ifInitialized((({api:t})=>t.addCursor(i)))}async isDroppableSurface(i){var t;const s=u(i,this.elementRect);const n=await((t=this.api)===null||t===void 0?void 0:t.getEntityTypeAtPoint(s));return n!=null&&this.droppableSurfaces.includes(n)}ifInitialized(i){if(this.element!=null&&this.api!=null){return i({element:this.element,api:this.api})}else{throw new Error("Pins interaction handler not initialized.")}}clearCursor(){var i;(i=this.cursor)===null||i===void 0?void 0:i.dispose();this.cursor=undefined}}const w=":host{position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none;--viewer-pin-tool-initial-label-offset-x:20;--viewer-pin-tool-initial-label-offset-y:20}";const m=class{constructor(t){i(this,t);this.pinModel=new e;this.tool="pin-icon";this.mode="view";this.pins=[];this.stateMap={};this.handleSetProjectionMatrix=()=>{var i,t;this.projectionViewMatrix=(t=(i=this.viewer)===null||i===void 0?void 0:i.frame)===null||t===void 0?void 0:t.scene.camera.projectionViewMatrix}}watchModeChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setToolMode(this.mode);this.setupInteractionHandler();if(this.mode==="edit"){this.setFeatureMaps()}else{this.resetFeatureMaps()}}watchTypeChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setToolType(this.tool);this.setupInteractionHandler()}watchAccentColorChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setAccentColor(this.accentColor);this.setupInteractionHandler()}watchPrimaryColorChange(){var i;(i=this.pinController)===null||i===void 0?void 0:i.setPrimaryColor(this.primaryColor);this.setupInteractionHandler()}watchPinsChange(){if(this.pins.length>0){this.setDepthBuffers();this.setFeatureMaps()}else{this.resetDepthBuffers();this.resetFeatureMaps()}}connectedCallback(){this.setupInteractionHandler();this.setDepthBuffers();this.setFeatureMaps()}componentWillLoad(){this.updateViewport();this.setupController();this.setupInteractionHandler();this.setDepthBuffers();this.setFeatureMaps();this.pinModel.onEntitiesChanged((i=>{this.pins=i}));this.pinModel.onSelectionChange((i=>{this.selectedPinId=i}));this.handleViewerChanged(this.viewer,undefined)}componentDidLoad(){this.resizeObserver=new ResizeObserver((()=>this.updateViewport()));this.resizeObserver.observe(this.hostEl)}disconnectedCallback(){this.clearInteractionHandler();this.clearModelListeners();this.resetDepthBuffers();this.resetFeatureMaps()}handleViewerChanged(i,t){this.setupInteractionHandler();this.setDepthBuffers();this.setFeatureMaps();if(t!=null){t.removeEventListener("frameDrawn",this.handleSetProjectionMatrix)}if(i!=null){i.addEventListener("frameDrawn",this.handleSetProjectionMatrix)}this.handleSetProjectionMatrix()}render(){return t(s,null,t("vertex-viewer-dom-renderer",{viewer:this.viewer,drawMode:"2d"},this.pins.map((i=>t("vertex-viewer-pin-group",{id:`pin-group-${i.id}`,"data-is-dom-group-element":true,pin:i,elementBounds:this.elementBounds,pinModel:this.pinModel,pinController:this.pinController,projectionViewMatrix:this.projectionViewMatrix,selected:this.selectedPinId===i.id})))))}setupController(){const i=this.accentColor||this.primaryColor?{accentColor:this.accentColor,primaryColor:this.primaryColor}:undefined;this.pinController=new l(this.pinModel,this.mode,this.tool,i)}clearInteractionHandler(){var i;(i=this.registeredInteractionHandler)===null||i===void 0?void 0:i.then((i=>i.dispose()));this.registeredInteractionHandler=undefined}setupInteractionHandler(){var i;const t=window.getComputedStyle(this.hostEl);const s=t.getPropertyValue("--viewer-pin-tool-initial-label-offset-x").trim();const n=t.getPropertyValue("--viewer-pin-tool-initial-label-offset-y").trim();this.clearInteractionHandler();if(this.pinController!=null){this.registeredInteractionHandler=(i=this.viewer)===null||i===void 0?void 0:i.registerInteractionHandler(new f(this.pinController,parseInt(s),parseInt(n)))}}clearModelListeners(){var i,t;(i=this.onEntitiesChangedHandler)===null||i===void 0?void 0:i.dispose();this.onEntitiesChangedHandler=undefined;(t=this.resizeObserver)===null||t===void 0?void 0:t.disconnect()}updateViewport(){const i=p(this.hostEl);this.elementBounds=i}setDepthBuffers(){if(this.pins.length>0&&this.viewer!=null&&this.viewer.depthBuffers==null){this.stateMap.shouldClearDepthBuffers=true;this.viewer.depthBuffers="final"}}resetDepthBuffers(){if(this.stateMap.shouldClearDepthBuffers&&this.viewer!=null){this.viewer.depthBuffers=undefined;this.stateMap.shouldClearDepthBuffers=undefined}}setFeatureMaps(){if((this.pins.length>0||this.mode==="edit")&&this.viewer!=null&&this.viewer.featureMaps==null){this.stateMap.shouldClearFeatureMaps=true;this.viewer.featureMaps="final"}}resetFeatureMaps(){if(this.stateMap.shouldClearFeatureMaps&&this.viewer!=null){this.viewer.featureMaps=undefined;this.stateMap.shouldClearFeatureMaps=undefined}}get hostEl(){return n(this)}static get watchers(){return{mode:["watchModeChange"],tool:["watchTypeChange"],accentColor:["watchAccentColorChange"],primaryColor:["watchPrimaryColorChange"],pins:["watchPinsChange"],viewer:["handleViewerChanged"]}}};m.style=w;export{m as vertex_viewer_pin_tool};
5
+ //# sourceMappingURL=p-c6a12963.entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["src/lib/pins/interactions.ts","src/components/viewer-pin-tool/viewer-pin-tool.css?tag=vertex-viewer-pin-tool&encapsulation=shadow","src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"names":["PinsInteractionHandler","[object Object]","controller","xOffset","yOffset","this","rectObserver","ElementRectObserver","droppableSurfaces","EntityType","PRECISE_SURFACE","IMPRECISE_SURFACE","GENERIC_GEOMETRY","handlePointerMove","async","event","isDroppableSurface","draggable","getDraggable","handleDrag","getToolMode","addCursor","getCursorType","clearCursor","pt","getMouseClientPosition","elementRect","worldPosition","getWorldPositionForPoint","updateDraggable","Object","assign","lastPoint","handlePointerDown","pointerDown","pointerUp","distanceBetweenStartAndEndPoint","Point","distance","create","clientX","clientY","buttons","handlePlacePin","dispose","window","removeEventListener","addEventListener","handlePointerUp","setDraggable","undefined","ifInitialized","api","hit","hitItems","hitPoint","_a","x","_b","y","_c","z","_d","_f","_e","partId","hex","rect","element","observe","disconnect","vector3","getWorldPointFromViewport","existingPin","pinId","id","UUID","attributes","getStyleAttributes","style","getToolType","setPin","type","itemId","isNewPin","relativePoint","translatePointToRelative","label","point","setSelectedPinId","pinCursor","labelPinCursor","cursor","getEntityTypeAtPoint","includes","f","Error","viewerPinToolCss","ViewerPinTool","hostRef","pinModel","PinModel","tool","mode","pins","stateMap","handleSetProjectionMatrix","projectionViewMatrix","viewer","frame","scene","camera","pinController","setToolMode","setupInteractionHandler","setFeatureMaps","resetFeatureMaps","setToolType","setAccentColor","accentColor","setPrimaryColor","primaryColor","length","setDepthBuffers","resetDepthBuffers","updateViewport","setupController","onEntitiesChanged","entities","onSelectionChange","selectedId","selectedPinId","handleViewerChanged","resizeObserver","ResizeObserver","hostEl","clearInteractionHandler","clearModelListeners","newViewer","oldViewer","h","Host","drawMode","map","pin","data-is-dom-group-element","elementBounds","selected","PinController","registeredInteractionHandler","then","handler","hostStyles","getComputedStyle","getPropertyValue","trim","registerInteractionHandler","parseInt","onEntitiesChangedHandler","getMarkupBoundingClientRect","depthBuffers","shouldClearDepthBuffers","featureMaps","shouldClearFeatureMaps"],"mappings":"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","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, UUID } from '@vertexvis/utils';\n\nimport { translatePointToRelative } from '../../components/viewer-pin-tool/utils';\nimport { Cursor, labelPinCursor, pinCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport { InteractionApi, InteractionHandler } from '../interactions';\nimport { EntityType } from '../types/entities';\nimport { Draggable, PinController } from './controller';\nimport { Pin } from './model';\n\nexport class PinsInteractionHandler implements InteractionHandler {\n private controller: PinController;\n private element?: HTMLElement;\n private api?: InteractionApi;\n\n private cursor?: Disposable;\n\n private xOffset?: number;\n private yOffset?: number;\n\n private rectObserver = new ElementRectObserver();\n\n private droppableSurfaces: EntityType[] = [\n EntityType.PRECISE_SURFACE,\n EntityType.IMPRECISE_SURFACE,\n EntityType.GENERIC_GEOMETRY,\n ];\n\n private get elementRect(): DOMRect | undefined {\n return this.rectObserver.rect;\n }\n\n public constructor(\n controller: PinController,\n xOffset: number,\n yOffset: number\n ) {\n this.controller = controller;\n this.xOffset = xOffset;\n this.yOffset = yOffset;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n this.rectObserver.observe(element);\n\n element.addEventListener('pointermove', this.handlePointerMove);\n element.addEventListener('pointerdown', this.handlePointerDown);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n public dispose(): void {\n this.rectObserver.disconnect();\n this.clearCursor();\n this.element?.removeEventListener('pointermove', this.handlePointerMove);\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n public async getWorldPositionForPoint(\n pt: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n return this.ifInitialized(async ({ api }) => {\n const vector3 = await api.getWorldPointFromViewport(pt);\n\n return vector3;\n });\n }\n\n public async handlePlacePin(\n pt: Point.Point,\n existingPin?: Pin\n ): Promise<void> {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(pt);\n\n if (hit?.hitPoint != null && this.elementRect != null) {\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint.x != null &&\n hit?.hitPoint.y != null &&\n hit?.hitPoint.z != null\n ) {\n const pinId = existingPin != null ? existingPin.id : UUID.create();\n\n const attributes =\n this.controller.getStyleAttributes() != null\n ? {\n style: this.controller.getStyleAttributes(),\n }\n : undefined;\n\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n this.controller.setPin({\n type: 'icon',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n attributes,\n });\n break;\n case 'pin-text':\n const isNewPin = existingPin == null;\n const relativePoint = translatePointToRelative(\n pt,\n this.elementRect,\n isNewPin,\n this.xOffset,\n this.yOffset\n );\n this.controller.setPin({\n type: 'text',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n label: {\n point: relativePoint,\n },\n attributes,\n });\n this.controller.setSelectedPinId(pinId);\n break;\n }\n }\n } else {\n this.controller.setSelectedPinId();\n }\n });\n }\n\n private handlePointerMove = async (event: PointerEvent): Promise<void> => {\n const isDroppableSurface = await this.isDroppableSurface(event);\n const draggable = this.controller.getDraggable();\n if (draggable != null && isDroppableSurface) {\n this.handleDrag(draggable, event);\n }\n\n if (\n this.controller.getDraggable() == null &&\n this.controller.getToolMode() === 'edit' &&\n isDroppableSurface\n ) {\n this.addCursor(this.getCursorType());\n } else {\n this.clearCursor();\n }\n };\n\n private getCursorType(): Cursor {\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n return pinCursor;\n case 'pin-text':\n return labelPinCursor;\n }\n }\n\n private handleDrag = async (\n draggable: Draggable,\n event: PointerEvent\n ): Promise<void> => {\n const pt = getMouseClientPosition(event, this.elementRect);\n const worldPosition = await this.getWorldPositionForPoint(pt);\n\n if (worldPosition != null) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint: pt,\n },\n worldPosition\n );\n }\n };\n\n private handlePointerDown = async (\n pointerDown: PointerEvent\n ): Promise<Disposable> => {\n const pointerUp = (pointerUp: PointerEvent): void => {\n const distanceBetweenStartAndEndPoint = Point.distance(\n Point.create(pointerDown.clientX, pointerUp.clientY),\n Point.create(pointerUp.clientX, pointerUp.clientY)\n );\n\n if (distanceBetweenStartAndEndPoint <= 2 && pointerDown.buttons !== 2) {\n if (this.controller.getToolMode() === 'edit') {\n const pt = getMouseClientPosition(pointerDown, this.elementRect);\n\n this.handlePlacePin(pt);\n }\n }\n\n dispose();\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerup', pointerUp);\n\n return {\n dispose,\n };\n };\n\n private handlePointerUp = async (): Promise<void> => {\n const draggable = this.controller.getDraggable();\n const lastPoint = draggable?.lastPoint;\n\n this.controller.setDraggable(undefined);\n\n if (lastPoint != null && draggable != null) {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(lastPoint);\n\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint?.x != null &&\n hit?.hitPoint?.y != null &&\n hit?.hitPoint?.z != null\n ) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint,\n },\n {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n hit?.partId?.hex ?? undefined\n );\n }\n });\n }\n };\n\n private addCursor(cursor: Cursor): void {\n this.clearCursor();\n this.cursor = this.ifInitialized(({ api }) => api.addCursor(cursor));\n }\n\n private async isDroppableSurface(event: PointerEvent): Promise<boolean> {\n const pt = getMouseClientPosition(event, this.elementRect);\n const type = await this.api?.getEntityTypeAtPoint(pt);\n\n return type != null && this.droppableSurfaces.includes(type);\n }\n\n protected ifInitialized<R>(\n f: (data: { element: HTMLElement; api: InteractionApi }) => R\n ): R {\n if (this.element != null && this.api != null) {\n return f({ element: this.element, api: this.api });\n } else {\n throw new Error('Pins interaction handler not initialized.');\n }\n }\n\n private clearCursor(): void {\n this.cursor?.dispose();\n this.cursor = undefined;\n }\n}\n",":host {\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 * @prop --viewer-pin-tool-initial-label-offset-x: The number of pixels to offset\n the label in the x direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-x: 20;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-y: The number of pixels to offset\n the label in the y direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-y: 20;\n}\n","import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n shouldClearFeatureMaps?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n\n if (this.mode === 'edit') {\n this.setFeatureMaps();\n } else {\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n this.setFeatureMaps();\n } else {\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n parseInt(xOffset),\n parseInt(yOffset)\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private setFeatureMaps(): void {\n if (\n (this.pins.length > 0 || this.mode === 'edit') &&\n this.viewer != null &&\n this.viewer.featureMaps == null\n ) {\n this.stateMap.shouldClearFeatureMaps = true;\n this.viewer.featureMaps = 'final';\n }\n }\n\n private resetFeatureMaps(): void {\n if (this.stateMap.shouldClearFeatureMaps && this.viewer != null) {\n this.viewer.featureMaps = undefined;\n this.stateMap.shouldClearFeatureMaps = undefined;\n }\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2026 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import{d as e,N as t,w as a,p as n,b as i}from"./p-110f66c6.js";import{g as o}from"./p-3f3d62dd.js";import"./p-e5cc48b6.js";const r=e=>`__sc_import_${e.replace(/\s|-/g,"_")}`;const s=()=>{const i=Array.from(e.querySelectorAll("script")).find((e=>new RegExp(`/${t}(\\.esm)?\\.js($|\\?|#)`).test(e.src)||e.getAttribute("data-stencil-namespace")===t));const o="";const r={};if(o!==""){r.resourcesUrl=new URL(".",o).href}else{r.resourcesUrl=new URL(".",new URL(i.getAttribute("data-resources-url")||i.src,a.location.href)).href;{l(r.resourcesUrl,i)}if(!a.customElements){return __sc_import_viewer("./p-991f7bac.js").then((()=>r))}}return n(r)};const l=(n,i)=>{const o=r(t);try{a[o]=new Function("w",`return import(w);//${Math.random()}`)}catch(t){const r=new Map;a[o]=t=>{const s=new URL(t,n).href;let l=r.get(s);if(!l){const t=e.createElement("script");t.type="module";t.crossOrigin=i.crossOrigin;t.src=URL.createObjectURL(new Blob([`import * as m from '${s}'; window.${o}.m = m;`],{type:"application/javascript"}));l=new Promise((e=>{t.onload=()=>{e(a[o].m);t.remove()}}));r.set(s,l);e.head.appendChild(t)}return l}}};s().then((e=>{o();return i(JSON.parse('[["p-a16dab9d",[[1,"vertex-scene-tree",{"overScanCount":[2,"over-scan-count"],"viewerSelector":[1,"viewer-selector"],"viewer":[1040],"rowData":[16],"config":[1],"configEnv":[1,"config-env"],"controller":[1040],"searchOptions":[1040],"metadataSearchExactMatch":[1028,"metadata-search-exact-match"],"metadataSearchKeys":[1040],"metadataKeys":[16],"operationAnimationDuration":[2,"operation-animation-duration"],"rows":[32],"totalRows":[32],"showLoader":[32],"showEmptyResults":[32],"stateMap":[32],"errorDetails":[32],"hasPartialFilterResults":[32],"refreshingResults":[32],"attemptingRetry":[32],"invalidateRows":[64],"scrollToIndex":[64],"scrollToItem":[64],"expandAll":[64],"collapseAll":[64],"expandItem":[64],"collapseItem":[64],"toggleExpandItem":[64],"toggleItemVisibility":[64],"hideItem":[64],"showItem":[64],"selectItem":[64],"deselectItem":[64],"isolateItem":[64],"getRowAtIndex":[64],"getRowForItemId":[64],"getRowForEvent":[64],"getRowAtClientY":[64],"filterItems":[64],"selectFilteredItems":[64],"fetchMetadataKeys":[64]},[[0,"search","handleSearch"],[0,"cellLoaded","handleCellLoaded"]]]]],["p-856aecc5",[[1,"vertex-viewer-pin-tool",{"pinController":[1040],"pinModel":[16],"viewer":[16],"tool":[1025],"mode":[1025],"primaryColor":[1025,"primary-color"],"accentColor":[1025,"accent-color"],"pins":[32],"selectedPinId":[32],"elementBounds":[32],"projectionViewMatrix":[32]}]]],["p-5540add8",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["p-2ecdcd5d",[[1,"vertex-viewer-markup",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"selectedMarkupId":[1025,"selected-markup-id"],"selectNew":[4,"select-new"],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"toSelectMarkupId":[32],"pointerDownPosition":[32],"addMarkup":[64],"removeMarkup":[64],"getMarkupElements":[64],"getMarkupElement":[64]},[[0,"markupEnd","handleMarkupEnd"],[0,"interactionEnd","handleMarkupUpdated"],[1,"pointerdown","handleMarkupPointerDown"]]]]],["p-06b8bca7",[[1,"vertex-viewer-markup-tool",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"stateMap":[32],"reset":[64]}]]],["p-eac53fc5",[[1,"vertex-viewer-view-cube",{"xPositiveLabel":[1,"x-positive-label"],"xNegativeLabel":[1,"x-negative-label"],"yPositiveLabel":[1,"y-positive-label"],"yNegativeLabel":[1,"y-negative-label"],"zPositiveLabel":[1,"z-positive-label"],"zNegativeLabel":[1,"z-negative-label"],"standardViewsOff":[4,"standard-views-off"],"viewAll":[4,"view-all"],"animationDuration":[2,"animation-duration"],"triadOff":[4,"triad-off"],"worldOrientation":[1040],"camera":[1040],"viewer":[16],"boxLength":[32],"triadPosition":[32]}]]],["p-dbcc7dda",[[1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start-json"],"end":[1040],"endJson":[1,"end-json"],"distance":[1026],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"measurementModel":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32],"measurementUnits":[32],"computeElementMetrics":[64]}]]],["p-e1c0080c",[[1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementOverlays":[16],"measurementController":[1040],"measurableEntityTypes":[16],"viewer":[16],"configEnv":[1,"config-env"],"config":[1]}]]],["p-eb4c23e8",[[1,"vertex-scene-tree-table-cell",{"node":[16],"tree":[16],"value":[1],"placeholder":[1],"alwaysShowIcons":[4,"always-show-icons"],"hovered":[1028],"isScrolling":[4,"is-scrolling"],"expandToggle":[4,"expand-toggle"],"endItemIndicator":[4,"end-item-indicator"],"visibilityToggle":[4,"visibility-toggle"],"isolateButton":[4,"isolate-button"],"selectionHandler":[16],"visibilityHandler":[16],"expansionHandler":[16],"isolateHandler":[16],"hoverController":[16]}]]],["p-dcb64250",[[1,"vertex-viewer-annotation-callout",{"data":[16],"iconSize":[1,"icon-size"]}]]],["p-9d8e3e9e",[[1,"vertex-viewer-box-query-tool",{"viewer":[16],"controller":[1040],"model":[1040],"operationType":[1,"operation-type"],"mode":[1],"details":[32]}]]],["p-8c367e87",[[1,"vertex-viewer-walk-mode-tool",{"viewer":[16],"controller":[1040],"model":[1040],"teleportMode":[1,"teleport-mode"],"enabled":[4]}]]],["p-48b63c5f",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["p-0e0973f0",[[1,"vertex-scene-tree-table-header"]]],["p-05562c21",[[1,"vertex-scene-tree-table-resize-divider",{"hovering":[32],"dragging":[32]}]]],["p-9d54d593",[[1,"vertex-scene-tree-toolbar-group"]]],["p-ac6de78d",[[1,"vertex-viewer",{"src":[1],"clientId":[1,"client-id"],"deviceId":[1025,"device-id"],"config":[1],"configEnv":[1,"config-env"],"resolvedConfig":[1040],"cameraControls":[4,"camera-controls"],"cameraType":[1537,"camera-type"],"keyboardControls":[4,"keyboard-controls"],"rotateAroundTapPoint":[4,"rotate-around-tap-point"],"token":[1025],"depthBuffers":[1,"depth-buffers"],"phantom":[16],"noDefaultLights":[4,"no-default-lights"],"enableTemporalRefinement":[4,"enable-temporal-refinement"],"experimentalRenderingOptions":[1,"experimental-rendering-options"],"featureLines":[16],"selectionHighlighting":[16],"featureHighlighting":[16],"sceneComparison":[16],"crossSectioning":[16],"featureMaps":[1,"feature-maps"],"resizeDebounce":[2,"resize-debounce"],"frame":[1040],"stream":[1040],"stencilBuffer":[1040],"viewport":[1040],"annotations":[1040],"modelViews":[1040],"pmi":[1040],"sceneItems":[1040],"canvases":[1040],"experimentalSkipVisibilityCheck":[4,"experimental-skip-visibility-check"],"dimensions":[32],"hostDimensions":[32],"errorMessage":[32],"cursor":[32],"stateMap":[32],"dispatchFrameDrawn":[64],"registerInteractionHandler":[64],"registerTapKeyInteraction":[64],"getInteractionTarget_DEPRECATED":[64],"addCursor":[64],"getInteractionHandlers":[64],"getKeyInteractions":[64],"getBaseInteractionHandler":[64],"getJwt":[64],"load":[64],"unload":[64],"reload":[64],"scene":[64],"isSceneReady":[64]},[[0,"tap","handleTapEvent"]]]]],["p-d02ed9fe",[[1,"vertex-viewer-hit-result-indicator",{"viewer":[16],"position":[1040],"normal":[1040]}]]],["p-d08738e9",[[1,"vertex-viewer-measurement-details",{"measurementModel":[16],"measurementOverlays":[16],"measurementOutcome":[1040],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"resultTypes":[16],"overlay":[32],"distanceMeasurementUnits":[32],"angleMeasurementUnits":[32],"areaMeasurementUnits":[32]}]]],["p-49a9308e",[[1,"vertex-viewer-transform-widget",{"viewer":[16],"position":[1040],"rotation":[1040],"controller":[1040],"xRotationDisabled":[1028,"x-rotation-disabled"],"yRotationDisabled":[1028,"y-rotation-disabled"],"zRotationDisabled":[1028,"z-rotation-disabled"],"xTranslationDisabled":[1028,"x-translation-disabled"],"yTranslationDisabled":[1028,"y-translation-disabled"],"zTranslationDisabled":[1028,"z-translation-disabled"],"xyTranslationDisabled":[1028,"xy-translation-disabled"],"xzTranslationDisabled":[1028,"xz-translation-disabled"],"yzTranslationDisabled":[1028,"yz-translation-disabled"],"showInputs":[4,"show-inputs"],"distanceUnit":[1,"distance-unit"],"angleUnit":[1,"angle-unit"],"decimalPlaces":[2,"decimal-places"],"rotationSnapDegrees":[2,"rotation-snap-degrees"],"rotationSnapKey":[1,"rotation-snap-key"],"translationHandleScalar":[2,"translation-handle-scalar"],"rotationHandleScalar":[2,"rotation-handle-scalar"],"interactionThrottle":[2,"interaction-throttle"],"EXPERIMENTAL_undoKeybindings":[4,"e-x-p-e-r-i-m-e-n-t-a-l_undo-keybindings"],"hovered":[1040],"inputPosition":[32],"inputValue":[32],"isEndingTransform":[32],"inputShouldFocus":[32],"EXPERIMENTAL_undo":[64]}]]],["p-0873e668",[[0,"vertex-viewer-pin-group",{"pin":[16],"matrix":[1040],"projectionViewMatrix":[16],"elementBounds":[1040],"pinModel":[16],"pinController":[16],"selected":[4],"occluded":[1540],"detached":[1540],"invalidateStateCounter":[32]},[[0,"occlusionStateChanged","handleOcclusionStateChanged"],[0,"detachedStateChanged","handleDetachedStateChanged"]]]]],["p-fbfa1e82",[[6,"vertex-viewer-dom-group",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040]}]]],["p-842cc51b",[[1,"vertex-viewer-teleport-tool",{"viewer":[16],"mode":[1025],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"],"controller":[1040],"model":[1040]}]]],["p-2172230d",[[1,"vertex-viewer-spinner",{"size":[1]}]]],["p-40e8a5ea",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["p-a27a9775",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["p-629a5ae7",[[1,"vertex-scene-tree-search",{"debounce":[2],"disabled":[4],"placeholder":[1],"controller":[16],"value":[1025],"focused":[32],"isSearching":[32],"setFocus":[64],"clear":[64]}],[1,"vertex-scene-tree-notification-banner",{"message":[1],"actionLabel":[1,"action-label"]}],[1,"vertex-scene-tree-table-layout",{"tree":[16],"controller":[16],"rows":[16],"totalRows":[2,"total-rows"],"rowHeight":[1026,"row-height"],"overScanCount":[2,"over-scan-count"],"rowData":[16],"layoutOffset":[1026,"layout-offset"],"scrollOffset":[1026,"scroll-offset"],"layoutHeight":[1026,"layout-height"],"layoutWidth":[1026,"layout-width"],"viewportStartIndex":[1026,"viewport-start-index"],"viewportEndIndex":[1026,"viewport-end-index"],"columnGridLayout":[32],"columnGridFixedLayout":[32],"isComputingCellHeight":[32],"lastDividerPointerPosition":[32],"resizingColumnIndex":[32],"isScrolling":[32],"scrollTimer":[32],"stateMap":[32],"scrollToPosition":[64],"attemptComputeCellHeight":[64]}],[1,"vertex-scene-tree-toolbar"]]],["p-cddec53e",[[0,"vertex-viewer-pin-label",{"pin":[16],"elementBounds":[16],"value":[1025],"pinController":[16],"focused":[32],"computedScreenPosition":[32],"textareaRows":[32],"contentElBounds":[32],"setFocus":[64],"submit":[64]}],[0,"vertex-viewer-pin-label-line",{"pinPoint":[16],"labelPoint":[16],"pin":[16]}]]],["p-1a925fe9",[[1,"vertex-viewer-measurement-overlays",{"measurementOverlays":[16],"camera":[1040],"viewer":[16],"overlays":[32]}],[1,"vertex-viewer-measurement-line",{"start":[16],"end":[16],"capLength":[2,"cap-length"],"pointerEvents":[1,"pointer-events"]}]]],["p-4897f061",[[6,"vertex-viewer-dom-renderer",{"drawMode":[1,"draw-mode"],"propagateEventsToViewer":[4,"propagate-events-to-viewer"],"viewer":[16],"camera":[1040],"depthBuffer":[1040],"viewport":[32],"invalidateFrameCounter":[32],"interactionDisposables":[32]},[[0,"propertyChange","handlePropertyChange"]]],[1,"vertex-viewer-dom-element",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040],"occlusionOff":[4,"occlusion-off"],"occluded":[516],"detachedOff":[4,"detached-off"],"detached":[516],"billboardOff":[4,"billboard-off"],"interactionsOff":[516,"interactions-off"]}]]],["p-29318a17",[[1,"vertex-viewer-markup-arrow",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"mode":[513],"viewer":[16],"elementBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-circle",{"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-freeform",{"points":[1040],"pointsJson":[1,"points"],"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"screenPoints":[32],"dispose":[64]}]]],["p-983db3dd",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]]]'),e)}));
4
+ import{d as e,N as t,w as a,p as n,b as i}from"./p-110f66c6.js";import{g as o}from"./p-3f3d62dd.js";import"./p-e5cc48b6.js";const r=e=>`__sc_import_${e.replace(/\s|-/g,"_")}`;const s=()=>{const i=Array.from(e.querySelectorAll("script")).find((e=>new RegExp(`/${t}(\\.esm)?\\.js($|\\?|#)`).test(e.src)||e.getAttribute("data-stencil-namespace")===t));const o="";const r={};if(o!==""){r.resourcesUrl=new URL(".",o).href}else{r.resourcesUrl=new URL(".",new URL(i.getAttribute("data-resources-url")||i.src,a.location.href)).href;{l(r.resourcesUrl,i)}if(!a.customElements){return __sc_import_viewer("./p-991f7bac.js").then((()=>r))}}return n(r)};const l=(n,i)=>{const o=r(t);try{a[o]=new Function("w",`return import(w);//${Math.random()}`)}catch(t){const r=new Map;a[o]=t=>{const s=new URL(t,n).href;let l=r.get(s);if(!l){const t=e.createElement("script");t.type="module";t.crossOrigin=i.crossOrigin;t.src=URL.createObjectURL(new Blob([`import * as m from '${s}'; window.${o}.m = m;`],{type:"application/javascript"}));l=new Promise((e=>{t.onload=()=>{e(a[o].m);t.remove()}}));r.set(s,l);e.head.appendChild(t)}return l}}};s().then((e=>{o();return i(JSON.parse('[["p-a16dab9d",[[1,"vertex-scene-tree",{"overScanCount":[2,"over-scan-count"],"viewerSelector":[1,"viewer-selector"],"viewer":[1040],"rowData":[16],"config":[1],"configEnv":[1,"config-env"],"controller":[1040],"searchOptions":[1040],"metadataSearchExactMatch":[1028,"metadata-search-exact-match"],"metadataSearchKeys":[1040],"metadataKeys":[16],"operationAnimationDuration":[2,"operation-animation-duration"],"rows":[32],"totalRows":[32],"showLoader":[32],"showEmptyResults":[32],"stateMap":[32],"errorDetails":[32],"hasPartialFilterResults":[32],"refreshingResults":[32],"attemptingRetry":[32],"invalidateRows":[64],"scrollToIndex":[64],"scrollToItem":[64],"expandAll":[64],"collapseAll":[64],"expandItem":[64],"collapseItem":[64],"toggleExpandItem":[64],"toggleItemVisibility":[64],"hideItem":[64],"showItem":[64],"selectItem":[64],"deselectItem":[64],"isolateItem":[64],"getRowAtIndex":[64],"getRowForItemId":[64],"getRowForEvent":[64],"getRowAtClientY":[64],"filterItems":[64],"selectFilteredItems":[64],"fetchMetadataKeys":[64]},[[0,"search","handleSearch"],[0,"cellLoaded","handleCellLoaded"]]]]],["p-c6a12963",[[1,"vertex-viewer-pin-tool",{"pinController":[1040],"pinModel":[16],"viewer":[16],"tool":[1025],"mode":[1025],"primaryColor":[1025,"primary-color"],"accentColor":[1025,"accent-color"],"pins":[32],"selectedPinId":[32],"elementBounds":[32],"projectionViewMatrix":[32]}]]],["p-5540add8",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["p-2ecdcd5d",[[1,"vertex-viewer-markup",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"selectedMarkupId":[1025,"selected-markup-id"],"selectNew":[4,"select-new"],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"toSelectMarkupId":[32],"pointerDownPosition":[32],"addMarkup":[64],"removeMarkup":[64],"getMarkupElements":[64],"getMarkupElement":[64]},[[0,"markupEnd","handleMarkupEnd"],[0,"interactionEnd","handleMarkupUpdated"],[1,"pointerdown","handleMarkupPointerDown"]]]]],["p-06b8bca7",[[1,"vertex-viewer-markup-tool",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"stateMap":[32],"reset":[64]}]]],["p-eac53fc5",[[1,"vertex-viewer-view-cube",{"xPositiveLabel":[1,"x-positive-label"],"xNegativeLabel":[1,"x-negative-label"],"yPositiveLabel":[1,"y-positive-label"],"yNegativeLabel":[1,"y-negative-label"],"zPositiveLabel":[1,"z-positive-label"],"zNegativeLabel":[1,"z-negative-label"],"standardViewsOff":[4,"standard-views-off"],"viewAll":[4,"view-all"],"animationDuration":[2,"animation-duration"],"triadOff":[4,"triad-off"],"worldOrientation":[1040],"camera":[1040],"viewer":[16],"boxLength":[32],"triadPosition":[32]}]]],["p-dbcc7dda",[[1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start-json"],"end":[1040],"endJson":[1,"end-json"],"distance":[1026],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"measurementModel":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32],"measurementUnits":[32],"computeElementMetrics":[64]}]]],["p-e1c0080c",[[1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementOverlays":[16],"measurementController":[1040],"measurableEntityTypes":[16],"viewer":[16],"configEnv":[1,"config-env"],"config":[1]}]]],["p-eb4c23e8",[[1,"vertex-scene-tree-table-cell",{"node":[16],"tree":[16],"value":[1],"placeholder":[1],"alwaysShowIcons":[4,"always-show-icons"],"hovered":[1028],"isScrolling":[4,"is-scrolling"],"expandToggle":[4,"expand-toggle"],"endItemIndicator":[4,"end-item-indicator"],"visibilityToggle":[4,"visibility-toggle"],"isolateButton":[4,"isolate-button"],"selectionHandler":[16],"visibilityHandler":[16],"expansionHandler":[16],"isolateHandler":[16],"hoverController":[16]}]]],["p-dcb64250",[[1,"vertex-viewer-annotation-callout",{"data":[16],"iconSize":[1,"icon-size"]}]]],["p-9d8e3e9e",[[1,"vertex-viewer-box-query-tool",{"viewer":[16],"controller":[1040],"model":[1040],"operationType":[1,"operation-type"],"mode":[1],"details":[32]}]]],["p-8c367e87",[[1,"vertex-viewer-walk-mode-tool",{"viewer":[16],"controller":[1040],"model":[1040],"teleportMode":[1,"teleport-mode"],"enabled":[4]}]]],["p-48b63c5f",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["p-0e0973f0",[[1,"vertex-scene-tree-table-header"]]],["p-05562c21",[[1,"vertex-scene-tree-table-resize-divider",{"hovering":[32],"dragging":[32]}]]],["p-9d54d593",[[1,"vertex-scene-tree-toolbar-group"]]],["p-70dec719",[[1,"vertex-viewer",{"src":[1],"clientId":[1,"client-id"],"deviceId":[1025,"device-id"],"config":[1],"configEnv":[1,"config-env"],"resolvedConfig":[1040],"cameraControls":[4,"camera-controls"],"cameraType":[1537,"camera-type"],"keyboardControls":[4,"keyboard-controls"],"rotateAroundTapPoint":[4,"rotate-around-tap-point"],"token":[1025],"depthBuffers":[1,"depth-buffers"],"phantom":[16],"noDefaultLights":[4,"no-default-lights"],"enableTemporalRefinement":[4,"enable-temporal-refinement"],"experimentalRenderingOptions":[1,"experimental-rendering-options"],"featureLines":[16],"selectionHighlighting":[16],"featureHighlighting":[16],"sceneComparison":[16],"crossSectioning":[16],"featureMaps":[1,"feature-maps"],"resizeDebounce":[2,"resize-debounce"],"frame":[1040],"stream":[1040],"stencilBuffer":[1040],"viewport":[1040],"annotations":[1040],"modelViews":[1040],"pmi":[1040],"sceneItems":[1040],"canvases":[1040],"experimentalSkipVisibilityCheck":[4,"experimental-skip-visibility-check"],"dimensions":[32],"hostDimensions":[32],"errorMessage":[32],"cursor":[32],"stateMap":[32],"dispatchFrameDrawn":[64],"registerInteractionHandler":[64],"registerTapKeyInteraction":[64],"getInteractionTarget_DEPRECATED":[64],"addCursor":[64],"getInteractionHandlers":[64],"getKeyInteractions":[64],"getBaseInteractionHandler":[64],"getJwt":[64],"load":[64],"unload":[64],"reload":[64],"scene":[64],"isSceneReady":[64]},[[0,"tap","handleTapEvent"]]]]],["p-d02ed9fe",[[1,"vertex-viewer-hit-result-indicator",{"viewer":[16],"position":[1040],"normal":[1040]}]]],["p-d08738e9",[[1,"vertex-viewer-measurement-details",{"measurementModel":[16],"measurementOverlays":[16],"measurementOutcome":[1040],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"resultTypes":[16],"overlay":[32],"distanceMeasurementUnits":[32],"angleMeasurementUnits":[32],"areaMeasurementUnits":[32]}]]],["p-49a9308e",[[1,"vertex-viewer-transform-widget",{"viewer":[16],"position":[1040],"rotation":[1040],"controller":[1040],"xRotationDisabled":[1028,"x-rotation-disabled"],"yRotationDisabled":[1028,"y-rotation-disabled"],"zRotationDisabled":[1028,"z-rotation-disabled"],"xTranslationDisabled":[1028,"x-translation-disabled"],"yTranslationDisabled":[1028,"y-translation-disabled"],"zTranslationDisabled":[1028,"z-translation-disabled"],"xyTranslationDisabled":[1028,"xy-translation-disabled"],"xzTranslationDisabled":[1028,"xz-translation-disabled"],"yzTranslationDisabled":[1028,"yz-translation-disabled"],"showInputs":[4,"show-inputs"],"distanceUnit":[1,"distance-unit"],"angleUnit":[1,"angle-unit"],"decimalPlaces":[2,"decimal-places"],"rotationSnapDegrees":[2,"rotation-snap-degrees"],"rotationSnapKey":[1,"rotation-snap-key"],"translationHandleScalar":[2,"translation-handle-scalar"],"rotationHandleScalar":[2,"rotation-handle-scalar"],"interactionThrottle":[2,"interaction-throttle"],"EXPERIMENTAL_undoKeybindings":[4,"e-x-p-e-r-i-m-e-n-t-a-l_undo-keybindings"],"hovered":[1040],"inputPosition":[32],"inputValue":[32],"isEndingTransform":[32],"inputShouldFocus":[32],"EXPERIMENTAL_undo":[64]}]]],["p-0873e668",[[0,"vertex-viewer-pin-group",{"pin":[16],"matrix":[1040],"projectionViewMatrix":[16],"elementBounds":[1040],"pinModel":[16],"pinController":[16],"selected":[4],"occluded":[1540],"detached":[1540],"invalidateStateCounter":[32]},[[0,"occlusionStateChanged","handleOcclusionStateChanged"],[0,"detachedStateChanged","handleDetachedStateChanged"]]]]],["p-fbfa1e82",[[6,"vertex-viewer-dom-group",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040]}]]],["p-842cc51b",[[1,"vertex-viewer-teleport-tool",{"viewer":[16],"mode":[1025],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"],"controller":[1040],"model":[1040]}]]],["p-2172230d",[[1,"vertex-viewer-spinner",{"size":[1]}]]],["p-40e8a5ea",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["p-a27a9775",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["p-629a5ae7",[[1,"vertex-scene-tree-search",{"debounce":[2],"disabled":[4],"placeholder":[1],"controller":[16],"value":[1025],"focused":[32],"isSearching":[32],"setFocus":[64],"clear":[64]}],[1,"vertex-scene-tree-notification-banner",{"message":[1],"actionLabel":[1,"action-label"]}],[1,"vertex-scene-tree-table-layout",{"tree":[16],"controller":[16],"rows":[16],"totalRows":[2,"total-rows"],"rowHeight":[1026,"row-height"],"overScanCount":[2,"over-scan-count"],"rowData":[16],"layoutOffset":[1026,"layout-offset"],"scrollOffset":[1026,"scroll-offset"],"layoutHeight":[1026,"layout-height"],"layoutWidth":[1026,"layout-width"],"viewportStartIndex":[1026,"viewport-start-index"],"viewportEndIndex":[1026,"viewport-end-index"],"columnGridLayout":[32],"columnGridFixedLayout":[32],"isComputingCellHeight":[32],"lastDividerPointerPosition":[32],"resizingColumnIndex":[32],"isScrolling":[32],"scrollTimer":[32],"stateMap":[32],"scrollToPosition":[64],"attemptComputeCellHeight":[64]}],[1,"vertex-scene-tree-toolbar"]]],["p-cddec53e",[[0,"vertex-viewer-pin-label",{"pin":[16],"elementBounds":[16],"value":[1025],"pinController":[16],"focused":[32],"computedScreenPosition":[32],"textareaRows":[32],"contentElBounds":[32],"setFocus":[64],"submit":[64]}],[0,"vertex-viewer-pin-label-line",{"pinPoint":[16],"labelPoint":[16],"pin":[16]}]]],["p-1a925fe9",[[1,"vertex-viewer-measurement-overlays",{"measurementOverlays":[16],"camera":[1040],"viewer":[16],"overlays":[32]}],[1,"vertex-viewer-measurement-line",{"start":[16],"end":[16],"capLength":[2,"cap-length"],"pointerEvents":[1,"pointer-events"]}]]],["p-4897f061",[[6,"vertex-viewer-dom-renderer",{"drawMode":[1,"draw-mode"],"propagateEventsToViewer":[4,"propagate-events-to-viewer"],"viewer":[16],"camera":[1040],"depthBuffer":[1040],"viewport":[32],"invalidateFrameCounter":[32],"interactionDisposables":[32]},[[0,"propertyChange","handlePropertyChange"]]],[1,"vertex-viewer-dom-element",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040],"occlusionOff":[4,"occlusion-off"],"occluded":[516],"detachedOff":[4,"detached-off"],"detached":[516],"billboardOff":[4,"billboard-off"],"interactionsOff":[516,"interactions-off"]}]]],["p-29318a17",[[1,"vertex-viewer-markup-arrow",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"startLineAnchorStyle":[1025,"start-line-anchor-style"],"endLineAnchorStyle":[1025,"end-line-anchor-style"],"mode":[513],"viewer":[16],"elementBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-circle",{"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-freeform",{"points":[1040],"pointsJson":[1,"points"],"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"screenPoints":[32],"dispose":[64]}]]],["p-983db3dd",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]]]'),e)}));
5
5
  //# sourceMappingURL=viewer.esm.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertexvis/viewer",
3
- "version": "0.24.3",
3
+ "version": "0.24.4-canary.1",
4
4
  "description": "The Vertex SDK for viewing models.",
5
5
  "license": "MIT",
6
6
  "author": "Vertex Developers <support@vertexvis.com> (https://developer.vertexvis.com)",
@@ -50,12 +50,12 @@
50
50
  "@improbable-eng/grpc-web": "^0.15.0",
51
51
  "@stencil/core": "^2.16.1",
52
52
  "@vertexvis/frame-streaming-protos": "^0.17.0",
53
- "@vertexvis/geometry": "0.24.3",
54
- "@vertexvis/html-templates": "0.24.3",
53
+ "@vertexvis/geometry": "0.24.4-canary.1",
54
+ "@vertexvis/html-templates": "0.24.4-canary.1",
55
55
  "@vertexvis/scene-tree-protos": "^0.1.26",
56
56
  "@vertexvis/scene-view-protos": "^0.8.1",
57
- "@vertexvis/stream-api": "0.24.3",
58
- "@vertexvis/utils": "0.24.3",
57
+ "@vertexvis/stream-api": "0.24.4-canary.1",
58
+ "@vertexvis/utils": "0.24.4-canary.1",
59
59
  "@vertexvis/web-workers": "^0.1.0",
60
60
  "camel-case": "^4.1.2",
61
61
  "classnames": "^2.3.1",
@@ -84,7 +84,7 @@
84
84
  "@vertexvis/eslint-config-vertexvis-typescript": "^0.5.0",
85
85
  "@vertexvis/rollup-plugin-web-workers": "^0.1.0",
86
86
  "@vertexvis/typescript-config-vertexvis": "1.1.0",
87
- "@vertexwebsdk/build": "0.24.3",
87
+ "@vertexwebsdk/build": "0.24.4-canary.1",
88
88
  "abortcontroller-polyfill": "^1.7.3",
89
89
  "chance": "^1.1.8",
90
90
  "eslint": "^8.57.1",
@@ -99,5 +99,5 @@
99
99
  "typedoc": "^0.22.17",
100
100
  "typescript": "^4.5.4"
101
101
  },
102
- "gitHead": "e542667dfb640e3a27a933f88c11e5681a106fea"
102
+ "gitHead": "1e5a0ff668bbc612073f51eb1cfa87f0c4574b37"
103
103
  }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["src/lib/pins/interactions.ts","src/components/viewer-pin-tool/viewer-pin-tool.css?tag=vertex-viewer-pin-tool&encapsulation=shadow","src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"names":["PinsInteractionHandler","[object Object]","controller","xOffset","yOffset","this","rectObserver","ElementRectObserver","droppableSurfaces","EntityType","PRECISE_SURFACE","IMPRECISE_SURFACE","GENERIC_GEOMETRY","handlePointerMove","async","event","isDroppableSurface","draggable","getDraggable","handleDrag","getToolMode","addCursor","getCursorType","clearCursor","pt","getMouseClientPosition","elementRect","worldPosition","getWorldPositionForPoint","updateDraggable","Object","assign","lastPoint","handlePointerDown","pointerDown","pointerUp","distanceBetweenStartAndEndPoint","Point","distance","create","clientX","clientY","buttons","handlePlacePin","dispose","window","removeEventListener","addEventListener","handlePointerUp","setDraggable","undefined","ifInitialized","api","hit","hitItems","hitPoint","_a","x","_b","y","_c","z","_d","_f","_e","partId","hex","rect","element","observe","disconnect","vector3","getWorldPointFromViewport","existingPin","pinId","id","UUID","attributes","getStyleAttributes","style","getToolType","setPin","type","itemId","isNewPin","relativePoint","translatePointToRelative","label","point","setSelectedPinId","pinCursor","labelPinCursor","cursor","getEntityTypeAtPoint","includes","f","Error","viewerPinToolCss","ViewerPinTool","hostRef","pinModel","PinModel","tool","mode","pins","stateMap","handleSetProjectionMatrix","projectionViewMatrix","viewer","frame","scene","camera","pinController","setToolMode","setupInteractionHandler","setToolType","setAccentColor","accentColor","setPrimaryColor","primaryColor","length","setDepthBuffers","resetDepthBuffers","updateViewport","setupController","onEntitiesChanged","entities","onSelectionChange","selectedId","selectedPinId","handleViewerChanged","resizeObserver","ResizeObserver","hostEl","clearInteractionHandler","clearModelListeners","newViewer","oldViewer","h","Host","drawMode","map","pin","data-is-dom-group-element","elementBounds","selected","PinController","registeredInteractionHandler","then","handler","hostStyles","getComputedStyle","getPropertyValue","trim","registerInteractionHandler","parseInt","onEntitiesChangedHandler","getMarkupBoundingClientRect","depthBuffers","shouldClearDepthBuffers"],"mappings":"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","sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, UUID } from '@vertexvis/utils';\n\nimport { translatePointToRelative } from '../../components/viewer-pin-tool/utils';\nimport { Cursor, labelPinCursor, pinCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport { InteractionApi, InteractionHandler } from '../interactions';\nimport { EntityType } from '../types/entities';\nimport { Draggable, PinController } from './controller';\nimport { Pin } from './model';\n\nexport class PinsInteractionHandler implements InteractionHandler {\n private controller: PinController;\n private element?: HTMLElement;\n private api?: InteractionApi;\n\n private cursor?: Disposable;\n\n private xOffset?: number;\n private yOffset?: number;\n\n private rectObserver = new ElementRectObserver();\n\n private droppableSurfaces: EntityType[] = [\n EntityType.PRECISE_SURFACE,\n EntityType.IMPRECISE_SURFACE,\n EntityType.GENERIC_GEOMETRY,\n ];\n\n private get elementRect(): DOMRect | undefined {\n return this.rectObserver.rect;\n }\n\n public constructor(\n controller: PinController,\n xOffset: number,\n yOffset: number\n ) {\n this.controller = controller;\n this.xOffset = xOffset;\n this.yOffset = yOffset;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n this.rectObserver.observe(element);\n\n element.addEventListener('pointermove', this.handlePointerMove);\n element.addEventListener('pointerdown', this.handlePointerDown);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n public dispose(): void {\n this.rectObserver.disconnect();\n this.clearCursor();\n this.element?.removeEventListener('pointermove', this.handlePointerMove);\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n public async getWorldPositionForPoint(\n pt: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n return this.ifInitialized(async ({ api }) => {\n const vector3 = await api.getWorldPointFromViewport(pt);\n\n return vector3;\n });\n }\n\n public async handlePlacePin(\n pt: Point.Point,\n existingPin?: Pin\n ): Promise<void> {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(pt);\n\n if (hit?.hitPoint != null && this.elementRect != null) {\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint.x != null &&\n hit?.hitPoint.y != null &&\n hit?.hitPoint.z != null\n ) {\n const pinId = existingPin != null ? existingPin.id : UUID.create();\n\n const attributes =\n this.controller.getStyleAttributes() != null\n ? {\n style: this.controller.getStyleAttributes(),\n }\n : undefined;\n\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n this.controller.setPin({\n type: 'icon',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n attributes,\n });\n break;\n case 'pin-text':\n const isNewPin = existingPin == null;\n const relativePoint = translatePointToRelative(\n pt,\n this.elementRect,\n isNewPin,\n this.xOffset,\n this.yOffset\n );\n this.controller.setPin({\n type: 'text',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n label: {\n point: relativePoint,\n },\n attributes,\n });\n this.controller.setSelectedPinId(pinId);\n break;\n }\n }\n } else {\n this.controller.setSelectedPinId();\n }\n });\n }\n\n private handlePointerMove = async (event: PointerEvent): Promise<void> => {\n const isDroppableSurface = await this.isDroppableSurface(event);\n const draggable = this.controller.getDraggable();\n if (draggable != null && isDroppableSurface) {\n this.handleDrag(draggable, event);\n }\n\n if (\n this.controller.getDraggable() == null &&\n this.controller.getToolMode() === 'edit' &&\n isDroppableSurface\n ) {\n this.addCursor(this.getCursorType());\n } else {\n this.clearCursor();\n }\n };\n\n private getCursorType(): Cursor {\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n return pinCursor;\n case 'pin-text':\n return labelPinCursor;\n }\n }\n\n private handleDrag = async (\n draggable: Draggable,\n event: PointerEvent\n ): Promise<void> => {\n const pt = getMouseClientPosition(event, this.elementRect);\n const worldPosition = await this.getWorldPositionForPoint(pt);\n\n if (worldPosition != null) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint: pt,\n },\n worldPosition\n );\n }\n };\n\n private handlePointerDown = async (\n pointerDown: PointerEvent\n ): Promise<Disposable> => {\n const pointerUp = (pointerUp: PointerEvent): void => {\n const distanceBetweenStartAndEndPoint = Point.distance(\n Point.create(pointerDown.clientX, pointerUp.clientY),\n Point.create(pointerUp.clientX, pointerUp.clientY)\n );\n\n if (distanceBetweenStartAndEndPoint <= 2 && pointerDown.buttons !== 2) {\n if (this.controller.getToolMode() === 'edit') {\n const pt = getMouseClientPosition(pointerDown, this.elementRect);\n\n this.handlePlacePin(pt);\n }\n }\n\n dispose();\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerup', pointerUp);\n\n return {\n dispose,\n };\n };\n\n private handlePointerUp = async (): Promise<void> => {\n const draggable = this.controller.getDraggable();\n const lastPoint = draggable?.lastPoint;\n\n this.controller.setDraggable(undefined);\n\n if (lastPoint != null && draggable != null) {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(lastPoint);\n\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint?.x != null &&\n hit?.hitPoint?.y != null &&\n hit?.hitPoint?.z != null\n ) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint,\n },\n {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n hit?.partId?.hex ?? undefined\n );\n }\n });\n }\n };\n\n private addCursor(cursor: Cursor): void {\n this.clearCursor();\n this.cursor = this.ifInitialized(({ api }) => api.addCursor(cursor));\n }\n\n private async isDroppableSurface(event: PointerEvent): Promise<boolean> {\n const pt = getMouseClientPosition(event, this.elementRect);\n const type = await this.api?.getEntityTypeAtPoint(pt);\n\n return type != null && this.droppableSurfaces.includes(type);\n }\n\n protected ifInitialized<R>(\n f: (data: { element: HTMLElement; api: InteractionApi }) => R\n ): R {\n if (this.element != null && this.api != null) {\n return f({ element: this.element, api: this.api });\n } else {\n throw new Error('Pins interaction handler not initialized.');\n }\n }\n\n private clearCursor(): void {\n this.cursor?.dispose();\n this.cursor = undefined;\n }\n}\n",":host {\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 * @prop --viewer-pin-tool-initial-label-offset-x: The number of pixels to offset\n the label in the x direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-x: 20;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-y: The number of pixels to offset\n the label in the y direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-y: 20;\n}\n","import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n } else {\n this.resetDepthBuffers();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n parseInt(xOffset),\n parseInt(yOffset)\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n}\n"]}