mudlet-map-renderer 0.34.0-konva → 0.34.2-konva

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.
@@ -19,6 +19,16 @@ export type HitTestCallbacks = {
19
19
  } | null;
20
20
  findRoomAtPoint: (mapX: number, mapY: number) => MapData.Room | null;
21
21
  getAreaExitHitZones: () => AreaExitHitZone[];
22
+ /**
23
+ * Inverse of the drawing backend's coordinate transform — maps a point from
24
+ * rendered space (what `clientToMapPoint` returns) back to untransformed map
25
+ * space. Needed for hit tests that compare against map-space bounds (e.g.
26
+ * area-exit hit zones) under decorators like IsometricStyle.
27
+ */
28
+ renderedToMapPoint: (x: number, y: number) => {
29
+ x: number;
30
+ y: number;
31
+ };
22
32
  };
23
33
  /**
24
34
  * Handles all DOM interaction on the map container:
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`konva`);l=c(l,1);var u=.6,d=.025,f=`rgb(225, 255, 225)`;function p(){return{roomSize:u,lineWidth:d,lineColor:f,backgroundColor:`#000000`,instantMapMove:!1,highlightCurrentRoom:!0,cullingEnabled:!0,cullingMode:`indexed`,cullingBounds:null,labelRenderMode:`image`,transparentLabels:!1,roomShape:`rectangle`,playerMarker:{strokeColor:`#00e5b2`,strokeAlpha:1,fillColor:`#00e5b2`,fillAlpha:0,strokeWidth:.1,sizeFactor:1.7,dash:[.05,.05],dashEnabled:!0,matchRoomShape:!1},gridEnabled:!1,gridSize:1,gridColor:`rgba(200, 200, 200, 0.15)`,gridLineWidth:.03,perfCallback:null,borders:!0,frameMode:!1,coloredMode:!1,emboss:!1,areaName:!0,fontFamily:`sans-serif`,uniformLevelSize:!1,areaExitLabels:!1}}function m(e){let t,n,r,i=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(i)t=parseInt(i[1])/255,n=parseInt(i[2])/255,r=parseInt(i[3])/255;else if(e.startsWith(`#`)&&e.length>=7)t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;else return .5;return(Math.max(t,n,r)+Math.min(t,n,r))/2}function h(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.round(n*(1-t)),r=Math.round(r*(1-t)),i=Math.round(i*(1-t)),`rgb(${n}, ${r}, ${i})`}function g(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.min(255,Math.round(n+(255-n)*t)),r=Math.min(255,Math.round(r+(255-r)*t)),i=Math.min(255,Math.round(i+(255-i)*t)),`rgb(${n}, ${r}, ${i})`}function _(e,t){return`rgba(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)}, ${t})`}var v=class{constructor(e){this.listeners=new Map,this.container=e}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}removeAllListeners(){this.listeners.clear()}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t)),this.container&&this.container.dispatchEvent(new CustomEvent(e,{detail:t}))}},y=class{constructor(e,t){this.events=new v,this.highlights=new Map,this.paths=[],this.mapReader=e,this.settings=t}setArea(e,t){let n=this.mapReader.getArea(e);return!n||!n.getPlane(t)?!1:(this.currentArea=e,this.currentAreaInstance=n,this.currentZIndex=t,this.currentAreaVersion=n.getVersion(),this.events.emit(`area`,{area:n,zIndex:t}),!0)}setPosition(e,t=!0){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.mapReader.getArea(n.area),i=r?.getVersion(),a=this.currentArea!==n.area||this.currentZIndex!==n.z||i!==void 0&&this.currentAreaVersion!==i||r!==void 0&&this.currentAreaInstance!==r;return a&&this.setArea(n.area,n.z),this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:t,areaChanged:a}),!0}updatePositionMarker(e){this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:!1,areaChanged:!1})}refreshPosition(){this.positionRoomId!==void 0&&this.events.emit(`position`,{roomId:this.positionRoomId,center:!1,areaChanged:!1})}clearPosition(){this.positionRoomId=void 0,this.events.emit(`position`,{roomId:void 0,center:!1,areaChanged:!1})}setCenterRoom(e,t){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.currentArea!==n.area||this.currentZIndex!==n.z;return(r||this.needsAreaRedraw(n))&&this.setArea(n.area,n.z),this.centerRoomId=e,this.events.emit(`center`,{roomId:e,instant:t??r}),!0}needsAreaRedraw(e){let t=this.mapReader.getArea(e.area),n=t?.getVersion();return n!==void 0&&this.currentAreaVersion!==n||t!==void 0&&this.currentAreaInstance!==t}addHighlight(e,t){let n=this.mapReader.getRoom(e);return n?(this.highlights.set(e,{color:t,area:n.area,z:n.z}),this.events.emit(`highlight`,{roomId:e,color:t}),!0):!1}removeHighlight(e){this.highlights.has(e)&&(this.highlights.delete(e),this.events.emit(`highlight`,{roomId:e,color:void 0}))}hasHighlight(e){return this.highlights.has(e)}clearHighlights(){this.highlights.clear(),this.events.emit(`clear`,void 0)}addPath(e,t=`#66E64D`){this.paths.push({locations:e,color:t}),this.events.emit(`path`,void 0)}clearPaths(){this.paths=[],this.events.emit(`path`,void 0)}getOverlaysForArea(e){let t={...e};if(this.positionRoomId!==void 0){let e=this.mapReader.getRoom(this.positionRoomId);e&&e.area===this.currentArea&&e.z===this.currentZIndex&&(t.position={roomId:this.positionRoomId})}let n=[...e?.highlights??[]];for(let[e,t]of this.highlights)t.area===this.currentArea&&t.z===this.currentZIndex&&n.push({roomId:e,color:t.color});n.length>0&&(t.highlights=n);let r=[...e?.paths??[]];return r.push(...this.paths),r.length>0&&(t.paths=r),t}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}computeExportBounds(e,t,n,r){if(n!==void 0){let e=this.mapReader.getRoom(n);if(!e)throw Error(`Room ${n} not found`);return{x:e.x-r,y:e.y-r,w:r*2,h:r*2}}let i=this.getEffectiveBounds(e,t),a=this.settings.areaName?e.getAreaName():void 0,o=a?7:0,s=a?3.5:0,c=i.minX-s,l=i.minY-o,u=a?i.minX-3.5+a.length*2.5*.6:-1/0,d=Math.max(i.maxX,u);return{x:c-r,y:l-r,w:d-c+r*2,h:i.maxY-l+r*2}}},b=(e,t)=>({x:e,y:t}),x=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,t)}addCircle(e,t){this.inner.addCircle(e,t)}addLine(e,t){this.inner.addLine(e,t)}addPolygon(e,t){this.inner.addPolygon(e,t)}addText(e,t){this.inner.addText(e,t)}addImage(e,t){this.inner.addImage(e,t)}supportsBatchExitRendering(){return this.inner.supportsBatchExitRendering?.()??!1}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},S=e=>e;function ee(...e){return e.length===0?S:e.length===1?e[0]:t=>{let n=t;for(let t of e)n=t(n);return n}}var C=72,w=200,T=120,E=new Map,D=null;function O(){return D||(D=l.default.Util.createCanvasElement(),D.width=w,D.height=w),D}function te(e,t){let n=`${e}::${t}`,r=E.get(n);if(r!==void 0)return r;let i=O().getContext(`2d`,{willReadFrequently:!0}),a=`bold ${C}px ${t}`;i.clearRect(0,0,w,w),i.font=a,i.textBaseline=`alphabetic`,i.textAlign=`center`,i.fillStyle=`#ffffff`,i.fillText(e,w/2,T);let{data:o}=i.getImageData(0,0,w,w),s=w,c=-1;for(let e=0;e<w;e++)for(let t=0;t<w;t++)o[(e*w+t)*4+3]>16&&(e<s&&(s=e),e>c&&(c=e));if(c===-1){let e={baselineRatio:.35,konvaCorrectionRatio:0};return E.set(n,e),e}let l=(T-s-Math.max(0,c-T))/2/C,u=i.measureText(`M`),d={baselineRatio:l,konvaCorrectionRatio:((u.fontBoundingBoxAscent??u.actualBoundingBoxAscent??0)-(u.fontBoundingBoxDescent??u.actualBoundingBoxDescent??0))/2/C-l};return E.set(n,d),d}function ne(e,t,n,r){let i=t.getColorValue(e.env),a=n.coloredMode?h(i,.5):n.frameMode?n.backgroundColor:i,o=n.coloredMode?g(i,.1):i;return{fillColor:a,strokeColor:r?n.frameMode||n.coloredMode?o:r:n.frameMode||n.coloredMode?o:n.lineColor,borderWidth:n.borders?n.lineWidth:0,symbolColor:n.frameMode||n.coloredMode?o:t.getSymbolColor(e.env),envColor:i}}function re(e,t){if(!t.emboss)return null;let n=t.roomSize,r=t.borders?t.lineWidth/2:0,i=t.lineWidth,a=g(e,.35),o=h(e,.45);if(t.roomShape===`circle`){let e=n/2,t=n/2,s=n/2-r,c=[];for(let n=0;n<=48;n++){let r=n/48*360*Math.PI/180;c.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}let l=[];for(let n=0;n<=19;n++){let r=(200+n/19*140)*Math.PI/180;l.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}return{shadow:{points:c,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`},highlight:{points:l,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}if(t.roomShape===`roundedRectangle`){let e=(n-r*2)*.2,t=r,s=r,c=n-r,l=n-r,u=[];for(let n=0;n<=10/2;n++){let r=(135+n/(10/2)*45)*Math.PI/180;u.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}for(let n=1;n<=10;n++){let r=(180+n/10*90)*Math.PI/180;u.push(t+e+Math.cos(r)*e,s+e+Math.sin(r)*e)}for(let t=1;t<=10/2;t++){let n=(270+t/(10/2)*45)*Math.PI/180;u.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}let d=u.slice(),f=[];for(let t=0;t<=10/2;t++){let n=(315+t/(10/2)*45)*Math.PI/180;f.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}for(let t=1;t<=10;t++){let n=t/10*90*Math.PI/180;f.push(c-e+Math.cos(n)*e,l-e+Math.sin(n)*e)}for(let n=1;n<=10/2;n++){let r=(90+n/(10/2)*45)*Math.PI/180;f.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}return{highlight:{points:d,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`},shadow:{points:f,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}return{highlight:{points:[r,n-r,r,r,n-r,r],stroke:a,strokeWidth:i},shadow:{points:[r,n-r,n-r,n-r,n-r,r],stroke:o,strokeWidth:i}}}var ie=class{constructor(e,t,n){this.mapReader=e,this.settings=t,this.backend=n}createRoomGroup(e,t){let{fillColor:n,strokeColor:r,borderWidth:i,symbolColor:a}=ne(e,this.mapReader,this.settings,t?.strokeOverride),o=this.settings.roomSize,s=this.backend.createGroup(e.x-o/2,e.y-o/2),c=i/2,l=re(n,this.settings),u=l?0:i,d=this.backend.getTransform()===b,f=this.settings.coloredMode&&u>0&&d,p=e=>this.settings.roomShape===`roundedRectangle`?Math.max(0,(o-2*e)*.2):0;if(f){let e=[h(r,.5),r],t=i*2;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-t,fill:n}):this.backend.addRect(s,{x:t,y:t,width:o-t*2,height:o-t*2,fill:n,cornerRadius:p(t)});for(let t=0;t<e.length;t++){let n=i/2+t*i;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-n,stroke:e[t],strokeWidth:i}):this.backend.addRect(s,{x:n,y:n,width:o-n*2,height:o-n*2,stroke:e[t],strokeWidth:i,cornerRadius:p(n)})}}else this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-c,fill:n,stroke:u?r:void 0,strokeWidth:u}):this.backend.addRect(s,{x:c,y:c,width:o-i,height:o-i,fill:n,stroke:u?r:void 0,strokeWidth:u,cornerRadius:this.settings.roomShape===`roundedRectangle`?(o-i)*.2:0});if(l&&(this.backend.addLine(s,{points:l.shadow.points,stroke:l.shadow.stroke,strokeWidth:l.shadow.strokeWidth,lineCap:l.shadow.lineCap,lineJoin:l.shadow.lineJoin}),this.backend.addLine(s,{points:l.highlight.points,stroke:l.highlight.stroke,strokeWidth:l.highlight.strokeWidth,lineCap:l.highlight.lineCap,lineJoin:l.shadow.lineJoin})),e.roomChar){let t=o*.75,{baselineRatio:n,konvaCorrectionRatio:r}=te(e.roomChar,this.settings.fontFamily),i=Math.max(o,e.roomChar.length*t*.8),c=(i-o)/2;this.backend.addText(s,{x:-c,y:0,text:e.roomChar,fontSize:t,fontFamily:this.settings.fontFamily,fontStyle:`bold`,fill:a,align:`center`,verticalAlign:`middle`,width:i,height:o,baselineRatio:n,konvaCorrectionRatio:r})}return s}},ae=class{constructor(e,t,n){this.cachedBounds=null,this.inverseTransform=(e,t)=>({x:e,y:t}),this.layer=e,this.settings=t,this.backend=n}setInverseTransform(e){this.inverseTransform=e,this.invalidateCache()}invalidateCache(){this.cachedBounds=null}render(e){if(!this.settings.gridEnabled){this.cachedBounds!==null&&(this.layer.destroyChildren(),this.layer.batchDraw(),this.cachedBounds=null);return}let t=this.inverseTransform,{minX:n,maxX:r,minY:i,maxY:a}=e,o=t(n,i),s=t(r,i),c=t(r,a),l=t(n,a),u=Math.min(o.x,s.x,c.x,l.x),d=Math.max(o.x,s.x,c.x,l.x),f=Math.min(o.y,s.y,c.y,l.y),p=Math.max(o.y,s.y,c.y,l.y),m=this.settings.gridSize*2,h=Math.floor((u-m)/this.settings.gridSize)*this.settings.gridSize,g=Math.ceil((d+m)/this.settings.gridSize)*this.settings.gridSize,_=Math.floor((f-m)/this.settings.gridSize)*this.settings.gridSize,v=Math.ceil((p+m)/this.settings.gridSize)*this.settings.gridSize,y=this.cachedBounds;if(y&&y.left===h&&y.right===g&&y.top===_&&y.bottom===v)return;this.layer.destroyChildren();let b=this.backend.createGroup(0,0);for(let e=h;e<=g;e+=this.settings.gridSize)this.backend.addLine(b,{points:[e,_,e,v],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});for(let e=_;e<=v;e+=this.settings.gridSize)this.backend.addLine(b,{points:[h,e,g,e],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});this.layer.addNode(b),this.cachedBounds={left:h,right:g,top:_,bottom:v},this.layer.batchDraw()}},k=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],oe={n:`north`,s:`south`,e:`east`,w:`west`,ne:`northeast`,nw:`northwest`,se:`southeast`,sw:`southwest`},A={north:`n`,south:`s`,east:`e`,west:`w`,northeast:`ne`,northwest:`nw`,southeast:`se`,southwest:`sw`,up:`u`,down:`d`,in:`i`,out:`o`},j={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:1,y:-1},northwest:{x:-1,y:-1},southeast:{x:1,y:1},southwest:{x:-1,y:1}},se=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],ce={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,northwest:`southeast`,southeast:`northwest`,southwest:`northeast`};function le(e){return e?Object.prototype.hasOwnProperty.call(j,e):!1}function M(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=j[n];return{x:e+i.x*r,y:t+i.y*r}}function ue(e,t,n,r=1,i=0){if(!le(n))return{x:e,y:t};let a=j[n];if(!(a.x!==0&&a.y!==0)||i<=0)return M(e,t,n,r);let o=r-i+i/Math.SQRT2;return{x:e+a.x*o,y:t+a.y*o}}function de(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=j[n],a=Math.atan2(i.y,i.x);return{x:e+Math.cos(a)*r,y:t+Math.sin(a)*r}}var N={OPEN_DOOR:`rgb(10, 155, 10)`,CLOSED_DOOR:`rgb(226, 205, 59)`,LOCKED_DOOR:`rgb(155, 10, 10)`,ONE_WAY_FILL:`rgb(155, 10, 10)`};function fe(e){switch(e){case 1:return N.OPEN_DOOR;case 2:return N.CLOSED_DOOR;default:return N.LOCKED_DOOR}}var pe=class{constructor(e,t){this.mapReader=e,this.settings=t}getRoomEdgePoint(e,t,n,r){let i=r-(this.settings.borders?this.settings.lineWidth/2:0);return this.settings.roomShape===`circle`?de(e,t,n,i):this.settings.roomShape===`roundedRectangle`?ue(e,t,n,i,this.settings.roomSize*.2):M(e,t,n,i)}renderData(e,t){return this.renderDataWithColor(e,this.settings.lineColor,t)}renderDataWithColor(e,t,n){let r=e.aDir&&k.includes(e.aDir),i=e.bDir&&k.includes(e.bDir);if(r&&i)return this.renderTwoWayExitData(e,t,n);if(r||i){let n=r?`a`:`b`;return this.renderOneWayExitData(e,t,n)}}renderTwoWayExitData(e,t,n){let r=this.mapReader.getRoom(e.a),i=this.mapReader.getRoom(e.b);if(!r||!i||!e.aDir||!e.bDir||r.customLines[A[e.aDir]]&&i.customLines[A[e.bDir]]||r.z!==i.z&&(n!==i.z&&r.customLines[A[e.aDir]]||n!==r.z&&i.customLines[A[e.bDir]]))return;let a=this.getRoomEdgePoint(r.x,r.y,e.aDir,this.settings.roomSize/2),o=this.getRoomEdgePoint(i.x,i.y,e.bDir,this.settings.roomSize/2),s=[a.x,a.y,o.x,o.y],c=[{points:s,stroke:t,strokeWidth:this.settings.lineWidth}],l=[],u=r.doors[A[e.aDir]]??i.doors[A[e.bDir]];if(u){let e=s[0]+(s[2]-s[0])/2,t=s[1]+(s[3]-s[1])/2;l.push({x:e-this.settings.roomSize/4,y:t-this.settings.roomSize/4,width:this.settings.roomSize/2,height:this.settings.roomSize/2,stroke:fe(u),strokeWidth:this.settings.lineWidth})}let d=Math.min(s[0],s[2]),f=Math.max(s[0],s[2]),p=Math.min(s[1],s[3]),m=Math.max(s[1],s[3]),h=(r.z===i.z?void 0:r.z===n?i.id:r.id)??(r.area===i.area?void 0:i.id),g=h===void 0?{}:{from:{x:r.x,y:r.y},tip:{x:o.x,y:o.y},arrowColor:this.mapReader.getColorValue(i.env)};return{lines:c,arrows:[],doors:l,bounds:{x:d,y:p,width:f-d,height:m-p},targetRoomId:h,...g}}renderOneWayExitData(e,t,n){let r=n===`a`||!n&&e.aDir,i=r?this.mapReader.getRoom(e.a):this.mapReader.getRoom(e.b),a=r?this.mapReader.getRoom(e.b):this.mapReader.getRoom(e.a),o=r?e.aDir:e.bDir;if(!o||!i||!a||!k.includes(o)||i.customLines[A[o]||o])return;if(i.area!=a.area&&o){let e=this.mapReader.getColorValue(a.env),t=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),n=M(i.x,i.y,o,this.settings.roomSize*1.5),r=e;return{lines:[],arrows:[{points:[t.x,t.y,n.x,n.y],pointerLength:.3,pointerWidth:.3,strokeWidth:this.settings.lineWidth*1.4,stroke:r,fill:r}],doors:[],bounds:{x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},targetRoomId:a.id,from:{x:i.x,y:i.y},tip:{x:n.x,y:n.y},arrowColor:r}}let s=a.area!==i.area||a.z!==i.z,c={x:a.x,y:a.y};s&&(c=M(i.x,i.y,o,this.settings.roomSize/2));let l=M(i.x,i.y,o,.3),u=l.x-(l.x-c.x)/2,d=l.y-(l.y-c.y)/2,f=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),p=[f.x,f.y,c.x,c.y],m=[f.x,c.x,u],h=[f.y,c.y,d],g=Math.min(...m),_=Math.max(...m),v=Math.min(...h),y=Math.max(...h);return{lines:[{points:p,stroke:t,strokeWidth:this.settings.lineWidth,dash:[.1,.05]}],arrows:[{points:[p[0],p[1],u,d],pointerLength:.5,pointerWidth:.35,strokeWidth:this.settings.lineWidth*1.4,stroke:t,fill:N.ONE_WAY_FILL,dash:[.1,.05]}],doors:[],bounds:{x:g,y:v,width:_-g,height:y-v},...s?{targetRoomId:a.id}:{}}}getInnerExitAreaTargets(e){let t=[`up`,`down`,`in`,`out`],n=this.settings.roomSize,r=[];for(let i of t){let t=e.exits[i];if(t===void 0)continue;let a=this.mapReader.getRoom(t);!a||a.area===e.area||r.push({bounds:{x:e.x-n/4,y:e.y-n/4,width:n/2,height:n/2},targetRoomId:t,from:{x:e.x,y:e.y},tip:{x:e.x,y:e.y},arrowColor:this.mapReader.getColorValue(a.env)})}return r}getSpecialExitAreaTargets(e){let t=[],n={u:`up`,d:`down`,i:`in`,o:`out`};for(let[r,i]of Object.entries(e.customLines)){let a=e.specialExits[r];if(a===void 0){let t=oe[r]??n[r];t&&(a=e.exits[t]??e.specialExits[t])}if(a===void 0&&(a=e.exits[r]??e.specialExits[r]),a===void 0)continue;let o=this.mapReader.getRoom(a);if(!o||o.area===e.area&&o.z===e.z)continue;let s=[e.x,e.y];i.points.reduce((e,t)=>(e.push(t.x,-t.y),e),s);let c=1/0,l=1/0,u=-1/0,d=-1/0;for(let e=0;e<s.length;e+=2)c=Math.min(c,s[e]),u=Math.max(u,s[e]),l=Math.min(l,s[e+1]),d=Math.max(d,s[e+1]);let f=s.length-2,p={x:s[f],y:s[f+1]};t.push({bounds:{x:c,y:l,width:u-c,height:d-l},targetRoomId:a,from:{x:e.x,y:e.y},tip:p,arrowColor:this.mapReader.getColorValue(o.env)})}return t}},me={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function he(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function ge(e,t,n){let r=[];for(let i of e.stubs){let a=me[i];if(!a)continue;let o=he(t,e.x,e.y,a,t.roomSize/2),s=M(e.x,e.y,a,t.roomSize/2+.5);r.push({x1:o.x,y1:o.y,x2:s.x,y2:s.y,stroke:n??t.lineColor,strokeWidth:t.lineWidth})}return r}var _e={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function ve(e,t,n){let r=[];for(let[i,a]of Object.entries(e.customLines)){let o=[e.x,e.y];for(let e of a.points)o.push(e.x,-e.y);let s=n??`rgb(${a.attributes.color.r}, ${a.attributes.color.g}, ${a.attributes.color.b})`,c;a.attributes.style===`dot line`?c=[.05,.05]:a.attributes.style===`dash line`&&(c=[.4,.2]);let l={points:o,stroke:s,strokeWidth:t.lineWidth,dash:c},u;if(a.attributes.arrow&&o.length>=4){let e=o.length-2,n=o[e],r=o[e+1],i=o[e-2],a=o[e-1],c=Math.atan2(r-a,n-i),l=.3,d=.1;u={tipX:n,tipY:r,x1:n-l*Math.cos(c-Math.atan2(d,l)),y1:r-l*Math.sin(c-Math.atan2(d,l)),x2:n-l*Math.cos(c+Math.atan2(d,l)),y2:r-l*Math.sin(c+Math.atan2(d,l)),fill:s,stroke:s,strokeWidth:t.lineWidth}}let d,f=e.doors[i];if(f&&o.length>=4){let e=o[0]+(o[2]-o[0])/2,n=o[1]+(o[3]-o[1])/2,r=t.roomSize/2;d={x:e-r/2,y:n-r/2,width:r,height:r,stroke:_e[f]??_e[3],strokeWidth:t.lineWidth}}r.push({line:l,arrow:u,door:d})}return r}var ye=[`up`,`down`,`in`,`out`];function P(e,t,n,r){let i=r*Math.PI/180,a=[];for(let r=0;r<3;r++){let o=2*Math.PI*r/3-Math.PI/2,s=Math.cos(o)*n*1.4,c=Math.sin(o)*n*.8,l=s*Math.cos(i)-c*Math.sin(i),u=s*Math.sin(i)+c*Math.cos(i);a.push(e+l,t+u)}return a}function be(e,t,n){return{symbolColor:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env),symbolFill:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env,.6)}}var xe={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function Se(e,t,n){let r=[],i=n.roomSize,a=i/5,{symbolColor:o,symbolFill:s}=be(e,t,n);for(let t of ye){if(!e.exits[t])continue;let c=e.doors[t],l=c===void 0?o:xe[c]??xe[3];switch(t){case`up`:{let t=M(e.x,e.y,`south`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,0),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`down`:{let t=M(e.x,e.y,`north`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,180),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`in`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`out`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}}}return{triangles:r}}function Ce(e){let t=(e?.alpha??255)/255,n=e=>Math.min(255,Math.max(0,e??0));return`rgba(${n(e?.r)}, ${n(e?.g)}, ${n(e?.b)}, ${t})`}function we(e,t){let n=Te(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Te(e){let t=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(t)return{r:+t[1],g:+t[2],b:+t[3]};if(e.startsWith(`#`)&&e.length>=7)return{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16)}}function Ee(e,t,n){let r=Te(e),i=Te(t);return!r||!i?e:`rgb(${Math.round(r.r*n+i.r*(1-n))}, ${Math.round(r.g*n+i.g*(1-n))}, ${Math.round(r.b*n+i.b*(1-n))})`}function De(e,t){let n=t*t,r=[];outer:for(let t of e){for(let e of r)for(let r of e){let i=t.tip.x-r.tip.x,a=t.tip.y-r.tip.y;if(i*i+a*a<=n){e.push(t);continue outer}}r.push([t])}return r}var Oe=class{constructor(e,t,n,r){this.mapReader=e,this.settings=t,this.backend=n,this.gridLayer=r.gridLayer,this.linkLayer=r.linkLayer,this.roomLayer=r.roomLayer,this.roomShapeRenderer=new ie(e,t,n),this.gridRenderer=new ae(r.gridLayer,t,n),this.exitRenderer=new pe(e,t)}buildScene(e,t,n,r){this.gridLayer.destroyChildren(),this.gridRenderer.invalidateCache(),this.linkLayer.destroyChildren(),this.roomLayer.destroyChildren(),r&&this.gridRenderer.render(r),this.renderLabels(t.getLabels());let i=this.renderLinkExits(e.getLinkExits(n),n),a=this.renderRooms(t.getRooms()??[]);this.renderAreaName(e,t);let o=[...i.areaExitHitZones,...a.areaExitHitZones],s=this.renderAreaExitLabels(o,e.getAreaId(),t.getRooms()??[],i.standaloneExitNodes.map(e=>e.bounds));return o.push(...s),{roomNodes:a.roomNodes,standaloneExitNodes:i.standaloneExitNodes,areaExitHitZones:o}}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}renderRooms(e){let t=new Map,n=[],r=this.settings.roomSize,i=this.backend.getExitDepthOffset();return e.forEach(e=>{let a=this.roomShapeRenderer.createRoomGroup(e);for(let t of ve(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);if(this.backend.addLine(e,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow){let n=t.arrow;this.backend.addPolygon(e,{vertices:[n.tipX,n.tipY,n.x1,n.y1,n.x2,n.y2],fill:n.fill,stroke:n.stroke,strokeWidth:n.strokeWidth})}if(t.door){let n=t.door;this.backend.addRect(e,{x:n.x,y:n.y,width:n.width,height:n.height,stroke:n.stroke,strokeWidth:n.strokeWidth})}this.linkLayer.addNode(e)}this.exitRenderer.getSpecialExitAreaTargets(e).forEach(e=>{n.push({bounds:e.bounds,targetRoomId:e.targetRoomId,from:e.from,tip:e.tip,arrowColor:e.arrowColor})}),this.exitRenderer.getInnerExitAreaTargets(e).forEach(e=>{n.push({bounds:e.bounds,targetRoomId:e.targetRoomId,from:e.from,tip:e.tip,arrowColor:e.arrowColor})});for(let t of ge(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);this.backend.addLine(e,{points:[t.x1,t.y1,t.x2,t.y2],stroke:t.stroke,strokeWidth:t.strokeWidth}),this.linkLayer.addNode(e)}let o=e.x-r/2,s=e.y-r/2,{triangles:c}=Se(e,this.mapReader,this.settings);for(let e of c){let t=[];for(let n=0;n<e.vertices.length;n+=2)t.push(e.vertices[n]-o,e.vertices[n+1]-s);this.backend.addPolygon(a,{vertices:t,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth})}this.roomLayer.addNode(a),t.set(e.id,{room:e,group:a})}),{roomNodes:t,areaExitHitZones:n}}renderLinkExits(e,t){let n=[],r=[];return e.forEach(e=>{let i=this.exitRenderer.renderData(e,t);if(!i)return;let a=this.renderExitData(i);this.linkLayer.addNode(a),n.push({group:a,bounds:i.bounds,targetRoomId:i.targetRoomId}),i.targetRoomId!==void 0&&r.push({bounds:i.bounds,targetRoomId:i.targetRoomId,from:i.from,tip:i.tip,arrowColor:i.arrowColor})}),{standaloneExitNodes:n,areaExitHitZones:r}}renderExitData(e){let t=this.backend.getExitDepthOffset(),n=this.backend.createGroup(t.x,t.y);for(let t of e.lines)this.backend.addLine(n,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});for(let t of e.arrows)this.renderArrow(n,t);for(let t of e.doors)this.backend.addRect(n,{x:t.x,y:t.y,width:t.width,height:t.height,stroke:t.stroke,strokeWidth:t.strokeWidth});return n}renderArrow(e,t){this.backend.addLine(e,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});let n=t.points.length-2,r=t.points[n],i=t.points[n+1],a=t.points[n-2],o=t.points[n-1],s=Math.atan2(i-o,r-a),c=t.pointerLength,l=t.pointerWidth/2,u=r-c*Math.cos(s-Math.atan2(l,c)),d=i-c*Math.sin(s-Math.atan2(l,c)),f=r-c*Math.cos(s+Math.atan2(l,c)),p=i-c*Math.sin(s+Math.atan2(l,c));this.backend.addPolygon(e,{vertices:[r,i,u,d,f,p],fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth})}renderLabels(e){this.settings.labelRenderMode!==`none`&&e.forEach(e=>{let t=e.X,n=-e.Y;if(this.settings.labelRenderMode===`image`&&e.pixMap){let r=this.backend.createGroup(0,0);this.backend.addImage(r,{x:t,y:n,width:e.Width,height:e.Height,src:`data:image/png;base64,${e.pixMap}`}),this.linkLayer.addNode(r);return}let r=this.backend.createGroup(0,0);if((e.BgColor?.alpha??0)>0&&!this.settings.transparentLabels&&this.backend.addRect(r,{x:t,y:n,width:e.Width,height:e.Height,fill:Ce(e.BgColor)}),e.Text){let i=Math.min(.75,e.Width/Math.max(e.Text.length/2,1)),a=Math.max(.1,Math.min(i,Math.max(e.Height*.9,.1)));this.backend.addText(r,{x:t,y:n,width:e.Width,height:e.Height,text:e.Text,fontSize:a,fill:Ce(e.FgColor),align:`center`,verticalAlign:`middle`})}this.linkLayer.addNode(r)})}renderAreaExitLabels(e,t,n,r){let i=[];if(!this.settings.areaExitLabels||e.length===0)return i;let a=new Map;for(let n of e){if(!n.tip||!n.from)continue;let e=this.mapReader.getRoom(n.targetRoomId);if(!e||e.area===t)continue;let r=n.tip.x-n.from.x,i=n.tip.y-n.from.y,o=Math.hypot(r,i)||1,s={tip:n.tip,dir:{x:r/o,y:i/o},color:n.arrowColor??`white`,bounds:n.bounds,targetRoomId:n.targetRoomId},c=a.get(e.area);c?c.push(s):a.set(e.area,[s])}let o=.3,s=.18,c=.1;o*.55,o*1.1;let l=.35,u=this.settings.roomSize,d=n.map(e=>({x:e.x-u/2,y:e.y-u/2,width:u,height:u})),f=e.map(e=>e.bounds),p=(e,t,n)=>{let r=Math.max(0,Math.max(e.x,t.x)-Math.min(e.x+e.w,t.x+t.w)),i=Math.max(0,Math.max(e.y,t.y)-Math.min(e.y+e.h,t.y+t.h));return Math.hypot(r,i)<=n},h=(e,t,n,r,i)=>{for(let a of i)if(e<a.x+a.width&&e+n>a.x&&t<a.y+a.height&&t+r>a.y)return!0;return!1},g=[[0,1],[0,-1],[1,0],[-1,0],[.707,.707],[-.707,.707],[.707,-.707],[-.707,-.707]],_=(e,t)=>{let n=t.length*.165+s*2,i=.33+c*2,a=0,o=0,l=0,u=0,p=new Map;for(let t of e)a+=t.tip.x,o+=t.tip.y,l+=t.dir.x,u+=t.dir.y,p.set(t.color,(p.get(t.color)??0)+1);let m=e.length,_=a/m,v=o/m,y=Math.hypot(l,u),b=y>0?l/y:0,x=y>0?u/y:0,S=0;for(let t=0;t<e.length;t++)for(let n=t+1;n<e.length;n++){let r=e[t].tip.x-e[n].tip.x,i=e[t].tip.y-e[n].tip.y,a=Math.hypot(r,i);a>S&&(S=a)}let ee=!(S>3)&&y/m>=.4,C=`white`,w=0;for(let[e,t]of p)t>w&&(C=e,w=t);let T=d.concat(f).concat(r),E=(e,t,r=0)=>.5+r+Math.abs(e)*n/2+Math.abs(t)*i/2,D=[];if(ee){let e=E(b,x);D.push({x:_+b*e,y:v+x*e})}D.push({x:_,y:v});for(let e of[0,.6,1.4])for(let[t,n]of g){let r=E(t,n,e);D.push({x:_+t*r,y:v+n*r})}for(let t of D){let r=t.x-n/2,a=t.y-i/2;if(!h(r,a,n,i,T))return{cluster:e,boxX:r,boxY:a,boxW:n,boxH:i,color:C}}};for(let[e,t]of a){let n=this.mapReader.getArea(e)?.getAreaName()||`Area ${e}`,r=De(t,10).map(e=>_(e,n)).filter(e=>e!==void 0),a=!0;for(;a&&r.length>1;){a=!1;outer:for(let e=0;e<r.length;e++)for(let t=e+1;t<r.length;t++)if(p({x:r[e].boxX,y:r[e].boxY,w:r[e].boxW,h:r[e].boxH},{x:r[t].boxX,y:r[t].boxY,w:r[t].boxW,h:r[t].boxH},2)){let i=_([...r[e].cluster,...r[t].cluster],n);i?(r[e]=i,r.splice(t,1)):(r.splice(t,1),r.splice(e,1)),a=!0;break outer}}for(let e of r){let t=we(e.color,l),r=m(Ee(e.color,this.settings.backgroundColor,l))>.55?`#000`:`#fff`,a=this.backend.createGroup(0,0);this.backend.addRect(a,{x:e.boxX,y:e.boxY,width:e.boxW,height:e.boxH,fill:t,stroke:e.color,strokeWidth:.03,cornerRadius:.18}),this.backend.addText(a,{x:e.boxX+s,y:e.boxY+c,width:e.boxW-s*2,height:e.boxH-c*2,text:n,fontSize:o,fontFamily:this.settings.fontFamily,fill:r,align:`center`,verticalAlign:`middle`}),this.roomLayer.addNode(a),i.push({bounds:{x:e.boxX,y:e.boxY,width:e.boxW,height:e.boxH},targetRoomId:e.cluster[0].targetRoomId})}}return i}renderAreaName(e,t){if(!this.settings.areaName)return;let n=e.getAreaName();if(!n)return;let r=this.getEffectiveBounds(e,t),i=this.backend.createGroup(0,0);this.backend.addText(i,{x:r.minX-3.5,y:r.minY-4.5,text:n,fontSize:2.5,fontFamily:this.settings.fontFamily,fill:`white`}),this.roomLayer.addNode(i)}},ke=75;function Ae(e){return e<.5?2*e*e:-1+(4-2*e)*e}var je=class{constructor(e,t){this.zoom=1,this.minZoom=.05,this.position={x:0,y:0},this.centerOnResize=!0,this.dragging=!1,this.dragStart={x:0,y:0},this.positionAtDragStart={x:0,y:0},this.width=e,this.height=t}getScale(){return ke*this.zoom}setZoom(e){let t=Math.max(this.minZoom,Math.min(5,e));return this.zoom===t?!1:(this.zoom=t,this.notify(),!0)}zoomToCenter(e){let t=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===t)return!1;let n=this.getScale(),r=this.width/2,i=this.height/2,a={x:(r-this.position.x)/n,y:(i-this.position.y)/n};this.zoom=t;let o=this.getScale();return this.position={x:r-a.x*o,y:i-a.y*o},this.notify(),!0}zoomToPoint(e,t,n){let r=this.getScale(),i={x:(t-this.position.x)/r,y:(n-this.position.y)/r},a=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===a)return!1;this.zoom=a;let o=this.getScale();return this.position={x:t-i.x*o,y:n-i.y*o},this.notify(),!0}getViewportBounds(){let e=this.getScale();return{minX:(0-this.position.x)/e,maxX:(this.width-this.position.x)/e,minY:(0-this.position.y)/e,maxY:(this.height-this.position.y)/e}}clientToMapPoint(e,t,n){let r=e-(n?.left??0),i=t-(n?.top??0),a=this.getScale();return a?{x:(r-this.position.x)/a,y:(i-this.position.y)/a}:null}panToMapPoint(e,t){let n=this.getScale();this.position={x:this.width/2-e*n,y:this.height/2-t*n},this.notify()}panToMapPointAnimated(e,t,n){if(n){this.panToMapPoint(e,t);return}let r={...this.position},i=this.getScale(),a={x:this.width/2-e*i,y:this.height/2-t*i};this.animate(200,e=>{this.position={x:r.x+(a.x-r.x)*e,y:r.y+(a.y-r.y)*e}})}computeFitZoom(e,t,n,r,i){let a=t-e,o=r-n;if(a<=0||o<=0)return this.zoom;let s=i?.top??0,c=i?.right??0,l=i?.bottom??0,u=i?.left??0,d=Math.max(1,this.width-u-c),f=Math.max(1,this.height-s-l),p=d/((a+4)*ke),m=f/((o+4)*ke);return Math.max(.05,Math.min(5,Math.min(p,m)))}fitToMapBounds(e,t,n,r,i){let a=t-e,o=r-n;if(a<=0||o<=0)return;let s=i?.top??0,c=i?.left??0,l=Math.max(1,this.width-c-(i?.right??0)),u=Math.max(1,this.height-s-(i?.bottom??0));this.zoom=this.computeFitZoom(e,t,n,r,i),this.minZoom=this.zoom;let d=this.getScale(),f=(e+t)/2,p=(n+r)/2;this.position={x:c+l/2-f*d,y:s+u/2-p*d},this.notify()}setSize(e,t){this.width=e,this.height=t,this.notify()}startDrag(e,t){this.cancelAnimation(),this.dragging=!0,this.dragStart={x:e,y:t},this.positionAtDragStart={...this.position}}updateDrag(e,t){this.dragging&&(this.position={x:this.positionAtDragStart.x+(e-this.dragStart.x),y:this.positionAtDragStart.y+(t-this.dragStart.y)},this.notify())}endDrag(){this.dragging=!1}isDragging(){return this.dragging}animate(e,t){this.cancelAnimation();let n=performance.now(),r=typeof requestAnimationFrame<`u`?requestAnimationFrame:e=>setTimeout(()=>e(performance.now()),16),i=a=>{let o=a-n,s=Math.min(o/e,1);t(Ae(s)),this.notify(),s<1?this.animationId=r(i):this.animationId=void 0};this.animationId=r(i)}cancelAnimation(){this.animationId!==void 0&&((typeof cancelAnimationFrame<`u`?cancelAnimationFrame:e=>clearTimeout(e))(this.animationId),this.animationId=void 0)}isAnimating(){return this.animationId!==void 0}notify(){this.onChange?.()}},Me=class{constructor(e=60){this.samples=[],this.lastCullingTime=0,this.callback=null,this.windowSize=e}setCallback(e){e!==this.callback&&(this.callback=e,this.samples=[])}record(e){this.callback&&(this.samples.push(e),this.samples.length>=this.windowSize&&this.flush())}computeFps(){let e=performance.now(),t=e-this.lastCullingTime;return this.lastCullingTime=e,t>0?1e3/t:0}flush(){let e=this.samples.length;if(e===0)return;let t={cullingMs:0,gridMs:0,visibleRooms:0,totalRooms:0,visibleExits:0,fps:0};for(let e of this.samples)t.cullingMs+=e.cullingMs,t.gridMs+=e.gridMs,t.visibleRooms+=e.visibleRooms,t.totalRooms+=e.totalRooms,t.visibleExits+=e.visibleExits,t.fps+=e.fps;t.cullingMs/=e,t.gridMs/=e,t.visibleRooms=Math.round(t.visibleRooms/e),t.totalRooms=Math.round(t.totalRooms/e),t.visibleExits=Math.round(t.visibleExits/e),t.fps=Math.round(t.fps),this.callback(t),this.samples=[]}},Ne=class{constructor(e,t,n,r){this.roomNodes=new Map,this.standaloneExitNodes=[],this.spatialBucketSize=5,this.roomSpatialIndex=new Map,this.exitSpatialIndex=new Map,this.visibleRooms=new Set,this.visibleStandaloneExitNodes=new Set,this.bufferRoomSet=new Set,this.bufferExitSet=new Set,this.bufferRoomCandidates=new Set,this.bufferExitCandidates=new Set,this.cullingScheduled=!1,this.perfMonitor=new Me,this.coordinateTransform=(e,t)=>({x:e,y:t}),this.stageInfo=e,this.roomLayer=t,this.linkLayer=n,this.settings=r}setCoordinateTransform(e){this.coordinateTransform=e}transformPoint(e,t){return this.coordinateTransform(e,t)}transformBounds(e){let t=this.coordinateTransform,n=t(e.x,e.y),r=t(e.x+e.width,e.y),i=t(e.x+e.width,e.y+e.height),a=t(e.x,e.y+e.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y);return{x:o,y:c,width:s-o,height:l-c}}computeBucketSize(){this.spatialBucketSize=Math.max(this.settings.roomSize*10,5)}clear(){this.roomNodes.clear(),this.standaloneExitNodes=[],this.standaloneExitBoundsRoomSize=void 0,this.roomSpatialIndex.clear(),this.exitSpatialIndex.clear(),this.visibleRooms.clear(),this.visibleStandaloneExitNodes.clear()}getBucketKey(e,t){return e*1000003+t}forEachBucket(e,t,n,r,i){let a=this.spatialBucketSize,o=Math.min(e,n),s=Math.max(e,n),c=Math.min(t,r),l=Math.max(t,r),u=Math.floor(o/a),d=Math.floor(s/a),f=Math.floor(c/a),p=Math.floor(l/a);for(let e=u;e<=d;e++)for(let t=f;t<=p;t++)i(this.getBucketKey(e,t))}addRoomToSpatialIndex(e){let t=this.settings.roomSize/2,n=this.transformBounds({x:e.room.x-t,y:e.room.y-t,width:this.settings.roomSize,height:this.settings.roomSize});this.forEachBucket(n.x,n.y,n.x+n.width,n.y+n.height,t=>{let n=this.roomSpatialIndex.get(t);n||(n=new Set,this.roomSpatialIndex.set(t,n)),n.add(e)})}addStandaloneExitToSpatialIndex(e){let t=this.transformBounds(e.bounds);this.forEachBucket(t.x,t.y,t.x+t.width,t.y+t.height,t=>{let n=this.exitSpatialIndex.get(t);n||(n=new Set,this.exitSpatialIndex.set(t,n)),n.add(e)})}findRoomAtMapPoint(e,t){let n=this.settings.roomSize,r=this.getBucketKey(Math.floor(e/this.spatialBucketSize),Math.floor(t/this.spatialBucketSize)),i=this.roomSpatialIndex.get(r);if(!i)return null;let a=null,o=1/0;for(let r of i){let i=this.transformPoint(r.room.x,r.room.y),s=e-i.x,c=t-i.y;if(s>=-n&&s<=n&&c>=-n&&c<=n){let e=s*s+c*c;e<o&&(o=e,a=r.room)}}return a}markExitBoundsStale(){this.standaloneExitBoundsRoomSize=void 0}setExitBoundsRoomSize(){this.standaloneExitBoundsRoomSize=this.settings.roomSize}collectRoomCandidates(e,t,n,r){let i=this.bufferRoomCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.roomSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}collectStandaloneExitCandidates(e,t,n,r){let i=this.bufferExitCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.exitSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}refreshStandaloneExitBoundsIfNeeded(){this.standaloneExitBoundsRoomSize!==this.settings.roomSize&&(this.exitSpatialIndex.clear(),this.standaloneExitNodes.forEach(e=>this.addStandaloneExitToSpatialIndex(e)),this.standaloneExitBoundsRoomSize=this.settings.roomSize)}scheduleCulling(){if(this.cullingScheduled)return;this.cullingScheduled=!0;let e=()=>{this.cullingScheduled=!1,this.updateCulling()};typeof requestAnimationFrame<`u`?requestAnimationFrame(e):e()}updateCulling(){if(this.roomNodes.size===0&&this.standaloneExitNodes.length===0)return;let e=this.stageInfo.scaleX();if(!e)return;this.perfMonitor.setCallback(this.settings.perfCallback);let t=this.settings.perfCallback?performance.now():0,n=this.stageInfo.position(),r=this.settings.roomSize/2,i=this.settings.cullingBounds,a=i?i.x:0,o=i?i.x+i.width:this.stageInfo.width(),s=i?i.y:0,c=i?i.y+i.height:this.stageInfo.height(),l=(Math.min(a,o)-n.x)/e,u=(Math.max(a,o)-n.x)/e,d=(Math.min(s,c)-n.y)/e,f=(Math.max(s,c)-n.y)/e,p=!1,m=!1,h=this.settings.cullingEnabled?this.settings.cullingMode??`indexed`:`none`,g=l-r,_=u+r,v=d-r,y=f+r;if(this.refreshStandaloneExitBoundsIfNeeded(),h===`none`){this.roomNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),p=!0)}),this.standaloneExitNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),m=!0)}),p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.visibleRooms.clear(),this.roomNodes.forEach(e=>this.visibleRooms.add(e)),this.visibleStandaloneExitNodes.clear(),this.standaloneExitNodes.forEach(e=>this.visibleStandaloneExitNodes.add(e));return}if(h===`basic`){let e=this.bufferRoomSet;e.clear();let t=this.settings.roomSize;this.roomNodes.forEach(n=>{let i=this.transformBounds({x:n.room.x-r,y:n.room.y-r,width:t,height:t}),a=i.x+i.width>=l&&i.x<=u&&i.y+i.height>=d&&i.y<=f;n.group.isVisible()!==a&&(n.group.setVisible(a),p=!0),a&&e.add(n)}),m=this.cullExits(l,u,d,f).changed,this.bufferRoomSet=this.visibleRooms,this.visibleRooms=e,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw();return}let b=this.collectRoomCandidates(g,v,_,y),x=this.bufferRoomSet;x.clear();let S=this.settings.roomSize;if(b.forEach(e=>{let t=this.transformBounds({x:e.room.x-r,y:e.room.y-r,width:S,height:S}),n=t.x+t.width>=l&&t.x<=u&&t.y+t.height>=d&&t.y<=f;e.group.isVisible()!==n&&(e.group.setVisible(n),p=!0),n&&x.add(e)}),this.visibleRooms.forEach(e=>{!b.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),p=!0)}),this.bufferRoomSet=this.visibleRooms,this.visibleRooms=x,m=this.cullExits(l,u,d,f,!0).changed,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.settings.perfCallback){let e=performance.now()-t;this.perfMonitor.record({cullingMs:e,gridMs:0,visibleRooms:this.visibleRooms.size,totalRooms:this.roomNodes.size,visibleExits:this.visibleStandaloneExitNodes.size,fps:this.perfMonitor.computeFps()})}}cullExits(e,t,n,r,i=!1){let a=i?this.collectStandaloneExitCandidates(e-this.settings.roomSize,n-this.settings.roomSize,t+this.settings.roomSize,r+this.settings.roomSize):this.standaloneExitNodes,o=this.bufferExitSet;o.clear();let s=!1;return a[Symbol.iterator],a.forEach(i=>{let a=this.transformBounds(i.bounds),c=a.x+a.width>=e&&a.x<=t&&a.y+a.height>=n&&a.y<=r;i.group.isVisible()!==c&&(i.group.setVisible(c),s=!0),c&&o.add(i)}),this.visibleStandaloneExitNodes.forEach(e=>{!o.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),s=!0)}),this.bufferExitSet=this.visibleStandaloneExitNodes,this.visibleStandaloneExitNodes=o,{changed:s}}},Pe=class{constructor(e,t,n,r,i,a){this.cleanupFns=[],this.destroyed=!1,this.container=e,this.viewport=t,this.state=n,this.settings=r,this.hitTest=i,this.events=a,this.initViewportEvents(),this.initMapEvents()}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cleanupFns)e();this.cleanupFns.length=0}}listen(e,t,n,r){e.addEventListener(t,n,r),this.cleanupFns.push(()=>e.removeEventListener(t,n,r))}initViewportEvents(){let e=this.container,t=this.viewport,n=1.1,r=()=>{if(t.setSize(e.clientWidth,e.clientHeight),t.centerOnResize&&this.state.positionRoomId){let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&t.panToMapPoint(e.x,e.y)}};typeof window<`u`&&this.listen(window,`resize`,r),this.listen(e,`resize`,r);let i=!1,a;this.listen(e,`pointerdown`,n=>{if(n.button!==0||n.pointerType===`touch`)return;i=!0,a=n.pointerId,e.setPointerCapture(n.pointerId);let r=e.getBoundingClientRect();t.startDrag(n.clientX-r.left,n.clientY-r.top)}),this.listen(e,`pointermove`,n=>{if(!i||n.pointerId!==a)return;let r=e.getBoundingClientRect();t.updateDrag(n.clientX-r.left,n.clientY-r.top),this.events.emit(`pan`,t.getViewportBounds())}),this.listen(e,`pointerup`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag(),this.events.emit(`pan`,t.getViewportBounds()))}),this.listen(e,`pointercancel`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag())});let o;this.listen(e,`touchstart`,n=>{if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}else t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`touchmove`,n=>{let r=n.touches;if(r.length>=2){n.preventDefault(),t.isDragging()&&t.endDrag(),o=void 0;let i=e.getBoundingClientRect(),a={x:r[0].clientX-i.left,y:r[0].clientY-i.top},s={x:r[1].clientX-i.left,y:r[1].clientY-i.top};this.handlePinch(a,s);return}if(r.length===1&&o===r[0].identifier){let n=r[0],i=e.getBoundingClientRect();t.updateDrag(n.clientX-i.left,n.clientY-i.top),this.events.emit(`pan`,t.getViewportBounds())}}),this.listen(e,`touchend`,n=>{if(this.lastPinchDistance=void 0,n.touches.length===0)t.isDragging()&&(t.endDrag(),this.events.emit(`pan`,t.getViewportBounds())),o=void 0;else if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}},{passive:!0}),this.listen(e,`touchcancel`,()=>{this.lastPinchDistance=void 0,t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`wheel`,r=>{r.preventDefault();let i=e.getBoundingClientRect(),a=r.clientX-i.left,o=r.clientY-i.top,s=r.deltaY>0?-1:1;r.ctrlKey&&(s=-s);let c=s>0?t.zoom*n:t.zoom/n;t.zoomToPoint(c,a,o)&&(this.events.emit(`zoom`,{zoom:t.zoom}),this.events.emit(`pan`,t.getViewportBounds()))},{passive:!1})}handlePinch(e,t){let n=Math.hypot(e.x-t.x,e.y-t.y);if(this.lastPinchDistance===void 0||this.lastPinchDistance===0||n===0){this.lastPinchDistance=n;return}let r=(e.x+t.x)/2,i=(e.y+t.y)/2,a=this.viewport.zoom*(n/this.lastPinchDistance);this.viewport.zoomToPoint(a,r,i)&&(this.events.emit(`zoom`,{zoom:this.viewport.zoom}),this.events.emit(`pan`,this.viewport.getViewportBounds())),this.lastPinchDistance=n}initMapEvents(){let e=this.container,t=null;this.listen(e,`mousemove`,n=>{let r=this.findRoomAtClientPoint(n.clientX,n.clientY);if(r!==t&&(t=r,r)){e.style.cursor=`pointer`;return}if(!t){let t=this.findAreaExitAtClientPoint(n.clientX,n.clientY)!==null;e.style.cursor=t?`pointer`:`auto`}}),this.listen(e,`mouseleave`,()=>{t=null,e.style.cursor=`auto`});let n=null;this.listen(e,`mousedown`,e=>{e.button===0&&(n={x:e.clientX,y:e.clientY})}),this.listen(e,`mouseup`,e=>{if(e.button!==0||!n)return;let t=e.clientX-n.x,r=e.clientY-n.y;if(n=null,t*t+r*r>25)return;let i=this.findRoomAtClientPoint(e.clientX,e.clientY);if(i){this.emitRoomClickEvent(i.id,e.clientX,e.clientY);return}let a=this.findAreaExitAtClientPoint(e.clientX,e.clientY);if(a){this.emitAreaExitClickEvent(a.targetRoomId,e.clientX,e.clientY);return}this.emitMapClickEvent()}),this.listen(e,`contextmenu`,e=>{let t=this.findRoomAtClientPoint(e.clientX,e.clientY);t&&(e.preventDefault(),this.emitRoomContextEvent(t.id,e.clientX,e.clientY))});let r,i,a=()=>{r!==void 0&&(window.clearTimeout(r),r=void 0),i=void 0};this.listen(e,`touchstart`,e=>{if(a(),e.touches.length>1)return;let t=e.touches[0];t&&this.findRoomAtClientPoint(t.clientX,t.clientY)&&(i={clientX:t.clientX,clientY:t.clientY},r=window.setTimeout(()=>{if(i){let e=this.findRoomAtClientPoint(i.clientX,i.clientY);e&&this.emitRoomContextEvent(e.id,i.clientX,i.clientY)}a()},500))},{passive:!0}),this.listen(e,`touchend`,()=>a(),{passive:!0}),this.listen(e,`touchcancel`,()=>a(),{passive:!0}),this.listen(e,`touchmove`,e=>{if(!i)return;let t=e.touches[0];if(!t){a();return}let n=t.clientX-i.clientX,r=t.clientY-i.clientY;n*n+r*r>100&&a()},{passive:!0})}findRoomAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);return n?this.hitTest.findRoomAtPoint(n.x,n.y):null}findAreaExitAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);if(!n)return null;let r=this.settings.roomSize*.5;for(let e of this.hitTest.getAreaExitHitZones()){let t=e.bounds;if(n.x>=t.x-r&&n.x<=t.x+t.width+r&&n.y>=t.y-r&&n.y<=t.y+t.height+r)return e}return null}emitRoomClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomclick`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitRoomContextEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomcontextmenu`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitAreaExitClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`areaexitclick`,{targetRoomId:e,position:{x:t-r.left,y:n-r.top}})}emitMapClickEvent(){this.events.emit(`mapclick`,void 0)}};function Fe(e,t){switch(t.type){case`rect`:e.beginPath(),t.cr>0&&typeof e.roundRect==`function`?e.roundRect(t.x,t.y,t.w,t.h,t.cr):e.rect(t.x,t.y,t.w,t.h),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),e.stroke());break;case`circle`:e.beginPath(),e.arc(t.cx,t.cy,t.r,0,Math.PI*2),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),e.stroke());break;case`line`:{if(t.points.length<4)break;let n=e.globalAlpha;t.alpha!==void 0&&(e.globalAlpha=t.alpha),e.beginPath(),e.moveTo(t.points[0],t.points[1]);for(let n=2;n<t.points.length;n+=2)e.lineTo(t.points[n],t.points[n+1]);t.stroke&&(e.strokeStyle=t.stroke),e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),t.lineCap&&(e.lineCap=t.lineCap),t.lineJoin&&(e.lineJoin=t.lineJoin),e.stroke(),t.alpha!==void 0&&(e.globalAlpha=n);break}case`polygon`:if(t.vertices.length<4)break;e.beginPath(),e.moveTo(t.vertices[0],t.vertices[1]);for(let n=2;n<t.vertices.length;n+=2)e.lineTo(t.vertices[n],t.vertices[n+1]);e.closePath(),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,e.setLineDash([]),e.stroke());break;case`text`:{let n=t.fontSize*100,r=`${t.fontStyle} ${n}px ${t.fontFamily}`;e.save(),e.font=r,e.fillStyle=t.fill;let i=t.baselineRatio!==void 0;if(t.transform)if(e.transform(...t.transform),e.scale(1/100,1/100),e.textAlign=`center`,i){e.textBaseline=`alphabetic`;let n=(t.h/2+t.baselineRatio*t.fontSize)*100;e.fillText(t.text,t.w*100/2,n)}else e.textBaseline=`middle`,e.fillText(t.text,t.w*100/2,t.h*100/2);else if(t.w>0&&t.h>0){e.textAlign=t.align||`left`;let n=t.align===`center`?t.x+t.w/2:t.x;if(e.scale(1/100,1/100),t.vAlign===`middle`&&i){e.textBaseline=`alphabetic`;let r=t.y+t.h/2+t.baselineRatio*t.fontSize;e.fillText(t.text,n*100,r*100)}else{e.textBaseline=t.vAlign===`middle`?`middle`:`top`;let r=t.vAlign===`middle`?t.y+t.h/2:t.y;e.fillText(t.text,n*100,r*100)}}else e.textAlign=`left`,e.textBaseline=`top`,e.scale(1/100,1/100),e.fillText(t.text,t.x*100,t.y*100);e.restore();break}case`image`:if(!t.image)break;t.transform?(e.save(),e.transform(...t.transform),e.drawImage(t.image,0,0,t.w,t.h),e.restore()):e.drawImage(t.image,t.x,t.y,t.w,t.h);break}}var F=class{constructor(e,t){this._visible=!0,this.commands=[],this.x=e,this.y=t}setVisible(e){this._visible=e,this._konvaGroup?.visible(e)}isVisible(){return this._visible}destroy(){this._konvaGroup?.destroy(),this._konvaGroup=void 0,this.commands.length=0}setPosition(e,t){this.x=e,this.y=t,this._konvaGroup?.position({x:e,y:t})}getPosition(){return{x:this.x,y:this.y}}moveToTop(){this._konvaGroup?.moveToTop()}materialize(){if(this._konvaGroup)return this._konvaGroup;let e=new l.default.Group({x:this.x,y:this.y,listening:!1,visible:this._visible}),t=this.commands;return e.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{let n=e._context;for(let e of t)Fe(n,e)}})),this._konvaGroup=e,e}},I=class{constructor(e){this.groups=[],this.konvaLayer=e,e.destroyChildren();let t=this;this.konvaShape=new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{let n=e._context,r=n.getTransform(),i=r.a,a=r.b,o=r.c,s=r.d;for(let e of t.groups){if(!e._visible)continue;let t=i*e.x+o*e.y+r.e,c=a*e.x+s*e.y+r.f;n.setTransform(i,a,o,s,t,c);for(let t of e.commands)Fe(n,t)}n.setTransform(r)}}),e.add(this.konvaShape)}ensureShape(){this.konvaShape.getParent()||this.konvaLayer.add(this.konvaShape)}addNode(e){e instanceof F&&(this.groups.push(e),this.ensureShape())}destroyChildren(){this.groups.length=0}batchDraw(){this.konvaLayer.batchDraw()}};function Ie(e){let t=l.default===void 0?typeof Image<`u`?new Image:null:l.default.Util.createImageElement();return t&&(t.src=e),t}var Le=class{createGroup(e,t){return new F(e,t)}addRect(e,t){e instanceof F&&e.commands.push({type:`rect`,x:t.x,y:t.y,w:t.width,h:t.height,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0,cr:t.cornerRadius??0,dash:t.dashEnabled!==!1&&t.dash?t.dash:void 0})}addCircle(e,t){e instanceof F&&e.commands.push({type:`circle`,cx:t.cx,cy:t.cy,r:t.radius,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0,dash:t.dashEnabled!==!1&&t.dash?t.dash:void 0})}addLine(e,t){e instanceof F&&e.commands.push({type:`line`,points:t.points,stroke:t.stroke,sw:t.strokeWidth??0,dash:t.dash,lineCap:t.lineCap,lineJoin:t.lineJoin,alpha:t.alpha})}addPolygon(e,t){e instanceof F&&e.commands.push({type:`polygon`,vertices:t.vertices,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0})}addText(e,t){e instanceof F&&e.commands.push({type:`text`,x:t.x,y:t.y,text:t.text,fontSize:t.fontSize,fontFamily:t.fontFamily??`sans-serif`,fontStyle:t.fontStyle??`normal`,fill:t.fill??`black`,align:t.align??`left`,vAlign:t.verticalAlign??`top`,w:t.width??0,h:t.height??0,baselineRatio:t.baselineRatio,transform:t.transform})}addImage(e,t){e instanceof F&&e.commands.push({type:`image`,x:t.x,y:t.y,w:t.width,h:t.height,image:Ie(t.src),transform:t.transform})}supportsBatchExitRendering(){return!0}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}},Re=class{constructor(e){this.konvaGroup=e}setVisible(e){this.konvaGroup.visible(e)}isVisible(){return this.konvaGroup.visible()}destroy(){this.konvaGroup.destroy()}setPosition(e,t){this.konvaGroup.position({x:e,y:t})}getPosition(){return this.konvaGroup.position()}moveToTop(){this.konvaGroup.moveToTop()}},ze=class{constructor(e){this.konvaLayer=e}addNode(e){e instanceof Re?this.konvaLayer.add(e.konvaGroup):e instanceof F&&this.konvaLayer.add(e.materialize())}destroyChildren(){this.konvaLayer.destroyChildren()}batchDraw(){this.konvaLayer.batchDraw()}},L=[`up`,`down`,`in`,`out`];function R(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function Be(e,t,n){for(let[e,r]of Object.entries(t.exits))if(r===n.id){let r=e;if(L.includes(r)){let e=A[r];return{type:`inner`,fromDir:r,customLineKey:t.customLines[e]?e:t.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=A[r];return t.customLines[i]?{type:`special`,fromDir:r,customLineKey:i,fromRoom:t,toRoom:n}:t.customLines[r]?{type:`special`,fromDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,fromDir:r,toDir:Ve(n,t.id),fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(t.specialExits))if(r===n.id)return t.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};for(let[e,r]of Object.entries(n.exits))if(r===t.id){let r=e;if(L.includes(r)){let e=A[r];return{type:`inner`,toDir:r,customLineKey:n.customLines[e]?e:n.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=A[r];return n.customLines[i]?{type:`special`,toDir:r,customLineKey:i,fromRoom:t,toRoom:n}:n.customLines[r]?{type:`special`,toDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,toDir:r,fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(n.specialExits))if(r===t.id)return n.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};return{type:`none`,fromRoom:t,toRoom:n}}function Ve(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t)return n}function He(e,t,n){return e?e.area===t&&e.z===n:!1}function Ue(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t.id)return{direction:n};for(let[n,r]of Object.entries(e.specialExits))if(r===t.id)return}function We(e,t){for(let n of se)if(e.exits[n]===t.id)return n;for(let n of se)if(t.exits[n]===e.id)return ce[n]}function Ge(e,t,n){let{fromRoom:r,toRoom:i,fromDir:a,toDir:o}=t;if(n.length===0&&n.push(r.x,r.y),a&&k.includes(a)){let t=R(e,r.x,r.y,a,e.roomSize/2);n.push(t.x,t.y)}if(o&&k.includes(o)){let t=R(e,i.x,i.y,o,e.roomSize/2);n.push(t.x,t.y)}n.push(i.x,i.y)}function Ke(e,t){let{fromRoom:n,toRoom:r,customLineKey:i}=e,a=n,o;i&&(o=n.customLines[i],o||(o=r.customLines[i],a=r)),t.length===0&&t.push(a.x,a.y),o&&o.points.forEach(e=>{t.push(e.x,-e.y)}),t.push(r.x,r.y)}function qe(e,t,n,r,i){let a=[],o=[],s=[],c=n.map(t=>e.getRoom(t)).filter(e=>e!==void 0),l=[],u=()=>{l.length>=4&&a.push({points:[...l]}),l=[]},d=e=>{let{fromRoom:t,toRoom:n,fromDir:r,toDir:i,customLineKey:a}=e;if(a){let e=t,r=t.customLines[a];if(r||(r=n.customLines[a],e=n),r){let t=[e.x,e.y];r.points.forEach(e=>{t.push(e.x,-e.y)}),s.push({points:t})}}r&&L.includes(r)&&o.push({room:t,direction:r}),i&&L.includes(i)&&o.push({room:n,direction:i})};for(let n=0;n<c.length-1;n++){let a=c[n],s=c[n+1],f=He(a,r,i),p=He(s,r,i);if(!f&&!p){u();continue}if(f&&p){let n=Be(e,a,s);switch(n.type){case`regular`:Ge(t,n,l);break;case`special`:Ke(n,l);break;case`inner`:u(),d(n);break;case`none`:l.length===0&&l.push(a.x,a.y),l.push(s.x,s.y);break}}else{let e=f?a:s,n=f?s:a,r=Ue(e,n);if(r){if(L.includes(r.direction))u(),o.push({room:e,direction:r.direction});else if(k.includes(r.direction)){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r.direction,t.roomSize/2),i=M(e.x,e.y,r.direction,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}else{let r=We(e,n);if(r){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r,t.roomSize/2),i=M(e.x,e.y,r,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}}}return u(),{segments:a,innerMarkers:o,customLines:s}}function Je(e,t,n){let r=1.425,i=n.roomSize;return{shape:n.roomShape===`circle`?`circle`:`rect`,cx:e.x,cy:e.y,size:i/2*r,cornerRadius:n.roomShape===`roundedRectangle`?i*r*.2:0,stroke:t,strokeWidth:.1,dash:[.05,.05]}}function Ye(e,t){let n=t.playerMarker,r=t.roomSize*n.sizeFactor,i=n.matchRoomShape&&t.roomShape!==`circle`;return{shape:i?`rect`:`circle`,cx:e.x,cy:e.y,size:r/2,cornerRadius:i&&t.roomShape===`roundedRectangle`?r*.2:0,strokeColor:n.strokeColor,strokeWidth:n.strokeWidth,strokeAlpha:n.strokeAlpha,fillColor:n.fillColor,fillAlpha:n.fillAlpha,dash:n.dash,dashEnabled:n.dashEnabled}}function Xe(e,t,n,r,i,a){let o=qe(e,t,n,i,a),s=t.lineWidth,c=t.roomSize/5,l=[];for(let e of o.segments)e.points.length>=4&&l.push({points:e.points});for(let e of o.customLines)e.points.length>=4&&l.push({points:e.points});let u=[];for(let e of o.innerMarkers){let t=e.direction===`up`?0:e.direction===`down`?180:e.direction===`in`?90:-90;u.push({vertices:P(e.room.x,e.room.y,c,t)})}return{segments:l,triangles:u,color:r,outlineWidth:s*8,lineWidth:s*4}}function Ze(e,t){let n=e.createGroup(0,0);if(t.shape===`circle`)e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:!0});else{let r=t.cx-t.size,i=t.cy-t.size,a=t.cx+t.size,o=t.cy+t.size,s=[[r,i,a,i],[a,i,a,o],[a,o,r,o],[r,o,r,i]];for(let r of s)e.addLine(n,{points:r,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,lineCap:`butt`})}return n}function Qe(e,t){let n=e.createGroup(0,0),r=_(t.strokeColor,t.strokeAlpha),i=t.fillAlpha>0?_(t.fillColor,t.fillAlpha):void 0;return t.shape===`circle`?e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,fill:i,stroke:r,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:t.dashEnabled}):e.addRect(n,{x:t.cx-t.size,y:t.cy-t.size,width:t.size*2,height:t.size*2,fill:i,stroke:r,strokeWidth:t.strokeWidth,cornerRadius:t.cornerRadius,dash:t.dash,dashEnabled:t.dashEnabled}),n}function $e(e,t){let n=e.createGroup(0,0);for(let r of t.segments)e.addLine(n,{points:r.points,stroke:`black`,strokeWidth:t.outlineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8}),e.addLine(n,{points:r.points,stroke:t.color,strokeWidth:t.lineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8});for(let r of t.triangles)e.addPolygon(n,{vertices:r.vertices,fill:t.color,stroke:`black`,strokeWidth:t.outlineWidth/4});return n}function et(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);return e.addLine(r,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow&&e.addPolygon(r,{vertices:[t.arrow.tipX,t.arrow.tipY,t.arrow.x1,t.arrow.y1,t.arrow.x2,t.arrow.y2],fill:t.arrow.fill,stroke:t.arrow.stroke,strokeWidth:t.arrow.strokeWidth}),t.door&&e.addRect(r,{x:t.door.x,y:t.door.y,width:t.door.width,height:t.door.height,stroke:t.door.stroke,strokeWidth:t.door.strokeWidth}),r}function tt(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);for(let n of t)e.addLine(r,{points:[n.x1,n.y1,n.x2,n.y2],stroke:n.stroke,strokeWidth:n.strokeWidth});return r}function nt(e,t){let n=e.createGroup(0,0);for(let r of t)e.addPolygon(n,{vertices:r.vertices,fill:r.fill,stroke:r.stroke,strokeWidth:r.strokeWidth});return n}function rt(e,t){let n=e.createGroup(0,0);return e.addImage(n,{x:t.cx-t.displaySize/2,y:t.cy-t.displaySize/2,width:t.displaySize,height:t.displaySize,src:t.src}),n}var it=class{constructor(e,t){this.rooms=[],this.labels=[],this.rooms=e,this.labels=t,this.bounds=this.createBounds()}getRooms(){return this.rooms}getLabels(){return this.labels}getBounds(){return this.bounds}createBounds(){let e=this.rooms.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0});for(let t of this.labels){let n=t.X,r=-t.Y;e.minX=Math.min(e.minX,n),e.maxX=Math.max(e.maxX,n+t.Width),e.minY=Math.min(e.minY,r),e.maxY=Math.max(e.maxY,r+t.Height)}return e}},z=class e{constructor(e){this.planes={},this.exits=new Map,this.version=0,this.area=e,this.planes=this.createPlanes(),this.createExits()}getAreaName(){return this.area.areaName}getAreaId(){return parseInt(this.area.areaId)}getVersion(){return this.version}markDirty(){this.version++}getPlane(e){return this.planes[e]}getPlanes(){return Object.values(this.planes)}getZLevels(){return Object.keys(this.planes).map(Number).sort((e,t)=>e-t)}getRooms(){return this.area.rooms}getFullBounds(){return this.getPlanes().reduce((e,t)=>{let n=t.getBounds();return{minX:Math.min(e.minX,n.minX),maxX:Math.max(e.maxX,n.maxX),minY:Math.min(e.minY,n.minY),maxY:Math.max(e.maxY,n.maxY)}},{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0})}getLinkExits(e){return Array.from(this.exits.values()).filter(t=>t.zIndex.includes(e))}createPlanes(){let e=this.area.rooms.reduce((e,t)=>(e[t.z]||(e[t.z]=[]),e[t.z].push(t),e),{});return Object.entries(e).reduce((e,[t,n])=>(e[+t]=new it(n,this.area.labels.filter(e=>e.Z===+t)),e),{})}static{this.oppositeDir={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,southwest:`northeast`,northwest:`southeast`,southeast:`northwest`,up:`down`,down:`up`,in:`out`,out:`in`}}createExits(){let t=new Map;this.area.rooms.forEach(e=>{Object.entries(e.exits).forEach(([n,r])=>{if(e.id===r)return;let i=`${Math.min(e.id,r)}-${Math.max(e.id,r)}`;t.has(i)||t.set(i,[]),t.get(i).push({origin:e.id,target:r,z:e.z,dir:n})})});for(let[n,r]of t){let[t,i]=n.split(`-`),a=parseInt(t),o=parseInt(i),s=r.filter(e=>e.origin===a),c=r.filter(e=>e.origin===o),l=new Set;for(let t of s){let r=-1;for(let n=0;n<c.length;n++)if(!l.has(n)){if(c[n].dir===e.oppositeDir[t.dir]){r=n;break}r===-1&&(r=n)}if(r!==-1){l.add(r);let e=c[r];this.exits.set(`${n}-${t.dir}`,{a,b:o,aDir:t.dir,bDir:e.dir,zIndex:[t.z,e.z]})}else this.exits.set(`${n}-a:${t.dir}`,{a,b:o,aDir:t.dir,zIndex:[t.z]})}for(let e=0;e<c.length;e++)if(!l.has(e)){let t=c[e];this.exits.set(`${n}-b:${t.dir}`,{a,b:o,bDir:t.dir,zIndex:[t.z]})}}}},at=class extends it{constructor(e,t){super(e.getRooms(),e.getLabels()),this.basePlane=e,this.visitedRooms=t}getRooms(){return this.basePlane.getRooms().filter(e=>this.visitedRooms.has(e.id))}getLabels(){return this.basePlane.getLabels()}getBounds(){let e=this.getRooms();return e.length?e.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0}):this.basePlane.getBounds()}},B=class extends z{constructor(e,t){super(e),this.planeCache=new WeakMap,this.visitedRooms=t instanceof Set?t:new Set(t??[]),this.areaRoomIds=new Set(e.rooms.map(e=>e.id))}getPlane(e){let t=super.getPlane(e);if(!t)return t;let n=this.planeCache.get(t);return n||(n=new at(t,this.visitedRooms),this.planeCache.set(t,n)),n}getPlanes(){return super.getPlanes().map(e=>{let t=this.planeCache.get(e);return t||(t=new at(e,this.visitedRooms),this.planeCache.set(e,t)),t})}getLinkExits(e){return super.getLinkExits(e).filter(e=>this.visitedRooms.has(e.a)||this.visitedRooms.has(e.b))}getVisitedRoomCount(){return super.getRooms().reduce((e,t)=>e+ +!!this.visitedRooms.has(t.id),0)}getTotalRoomCount(){return this.areaRoomIds.size}hasVisitedRoom(e){return this.areaRoomIds.has(e)&&this.visitedRooms.has(e)}getVisitedRoomIds(){return super.getRooms().filter(e=>this.visitedRooms.has(e.id)).map(e=>e.id)}addVisitedRoom(e){let t=this.visitedRooms.has(e);this.visitedRooms.add(e);let n=!t&&this.areaRoomIds.has(e);return n&&this.markDirty(),n}addVisitedRooms(e){let t=0;for(let n of e){let e=this.visitedRooms.has(n);this.visitedRooms.add(n),!e&&this.areaRoomIds.has(n)&&t++}return t>0&&this.markDirty(),t}},V=`rgb(120, 72, 0)`,ot=class{get coordinateTransform(){return this._coordinateTransform}constructor(e,t,n){this.highlightShapes=new Map,this.pathShapes=[],this.currentRoomOverlay=[],this.areaExitHitZones=[],this.destroyed=!1,this._coordinateTransform=b,this.coordinateInverse=b,this.liveEffects=new Map,this.sceneOverlays=new Map,this.sceneOverlayNodes=new Map,this.viewportSubscribers=new Set,this.state=e,this.container=t,t?(this.stage=new l.default.Stage({container:t,width:t.clientWidth,height:t.clientHeight,draggable:!1}),t.style.backgroundColor=e.settings.backgroundColor,this.viewport=new je(t.clientWidth,t.clientHeight)):(this.stage=new l.default.Stage({width:1,height:1}),this.viewport=new je(1,1)),this.gridLayer=new l.default.Layer({listening:!1}),this.stage.add(this.gridLayer),this.linkLayer=new l.default.Layer({listening:!1}),this.stage.add(this.linkLayer),this.roomLayer=new l.default.Layer({listening:!1}),this.stage.add(this.roomLayer),this.positionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.positionLayer),this.overlayLayer=new l.default.Layer({listening:!1}),this.stage.add(this.overlayLayer),this.drawingBackend=n??new Le,this.positionLayerNode=new ze(this.positionLayer),this.overlayLayerNode=new ze(this.overlayLayer);let r=new I(this.roomLayer),i=new I(this.linkLayer);if(this.pipeline=new Oe(e.mapReader,e.settings,this.drawingBackend,{gridLayer:new I(this.gridLayer),linkLayer:i,roomLayer:r}),this.events=new v(t),this.culling=new Ne(this.stage,r,i,e.settings),this.viewport.onChange=()=>this.applyViewportToStage(),t){this.origSetSize=this.viewport.setSize.bind(this.viewport);let n=this.origSetSize;this.viewport.setSize=(e,t)=>{n(e,t),this.stage.width(e),this.stage.height(t)},this.interactionHandler=new Pe(t,this.viewport,e,e.settings,{clientToMapPoint:(e,n)=>this.viewport.clientToMapPoint(e,n,t.getBoundingClientRect()),findRoomAtPoint:(e,t)=>this.culling.findRoomAtMapPoint(e,t),getAreaExitHitZones:()=>this.areaExitHitZones},this.events)}this.applyDrawingBackendTransforms(this.drawingBackend),this.subscribeToState(e)}setDrawingBackend(e){this.drawingBackend=e,this.pipeline=new Oe(this.state.mapReader,this.state.settings,e,{gridLayer:new I(this.gridLayer),linkLayer:new I(this.linkLayer),roomLayer:new I(this.roomLayer)}),this.applyDrawingBackendTransforms(e)}applyDrawingBackendTransforms(e){let t=e.getTransform(),n=e.getInverseTransform(),r=this.coordinateInverse;this._coordinateTransform=t,this.coordinateInverse=n,this.culling.setCoordinateTransform(t),this.pipeline.gridRenderer.setInverseTransform(n);let i=this.viewport.getScale(),a=this.viewport.width/2,o=this.viewport.height/2,s=r((a-this.viewport.position.x)/i,(o-this.viewport.position.y)/i),c=t(s.x,s.y);this.viewport.position={x:a-c.x*i,y:o-c.y*i},this.applyViewportToStage()}mapPoint(e,t){return this._coordinateTransform(e,t)}get exitRenderer(){return this.pipeline.exitRenderer}get roomShapeRenderer(){return this.pipeline.roomShapeRenderer}get gridRenderer(){return this.pipeline.gridRenderer}destroy(){if(!this.destroyed){this.destroyed=!0,this.state.events.removeAllListeners(),this.interactionHandler?.destroy();for(let e of this.liveEffects.values())e.destroy();this.liveEffects.clear();for(let e of this.sceneOverlays.values())e.detach?.();this.sceneOverlays.clear();for(let e of this.sceneOverlayNodes.values())for(let t of e)t.destroy();this.sceneOverlayNodes.clear(),this.viewportSubscribers.clear(),this.viewport.cancelAnimation(),this.origSetSize&&(this.viewport.setSize=this.origSetSize),this.viewport.onChange=void 0,this.clearOverlayShapes(),this.clearCurrentRoomOverlay(),this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.stage.destroy(),this.events.removeAllListeners()}}updateBackground(){this.container&&(this.container.style.backgroundColor=this.state.settings.backgroundColor)}exportCanvas(e){if(this.state.currentArea===void 0||this.state.currentZIndex===void 0)return;let t=this.stage.toCanvas({pixelRatio:e?.pixelRatio??1}),n=document.createElement(`canvas`);n.width=t.width,n.height=t.height;let r=n.getContext(`2d`);return r.fillStyle=this.state.settings.backgroundColor,r.fillRect(0,0,n.width,n.height),r.drawImage(t,0,0),n}applyViewportToStage(){let e=this.viewport.getScale();this.stage.scale({x:e,y:e}),this.stage.position(this.viewport.position),this.stage.batchDraw(),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.scheduleCulling();let t=this.viewport.getViewportBounds();for(let e of this.viewportSubscribers)e();for(let n of this.liveEffects.values())n.updateViewport(t,e,this.coordinateTransform)}toCanvas(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let{width:o,height:s}=e,c=e.padding??3,u=this.viewport.width,d=this.viewport.height,f=this.viewport.zoom,p=this.viewport.minZoom,m={...this.viewport.position},h=this.viewport.onChange;this.viewport.onChange=void 0;let g=this.state.computeExportBounds(i,a,e.roomId,c),_=this._coordinateTransform,v=_(g.x,g.y),y=_(g.x+g.w,g.y),b=_(g.x+g.w,g.y+g.h),x=_(g.x,g.y+g.h),S=Math.min(v.x,y.x,b.x,x.x),ee=Math.max(v.x,y.x,b.x,x.x),C=Math.min(v.y,y.y,b.y,x.y),w=Math.max(v.y,y.y,b.y,x.y),T={x:S,y:C,w:ee-S,h:w-C},E=o/T.w,D=s/T.h,O=Math.min(E,D),te=T.w*O,ne=T.h*O,re=(o-te)/2,ie=(s-ne)/2,ae={x:re-T.x*O,y:ie-T.y*O};this.viewport.width=o,this.viewport.height=s,this.viewport.zoom=O/(this.viewport.getScale()/this.viewport.zoom),this.viewport.position=ae,this.stage.width(o),this.stage.height(s),this.stage.scale({x:O,y:O}),this.stage.position(ae),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.updateCulling();let k=new l.default.Layer({listening:!1});k.scale({x:1/O,y:1/O}),k.position({x:-(re-T.x*O)/O,y:-(ie-T.y*O)/O}),k.add(new l.default.Rect({x:0,y:0,width:o,height:s,fill:this.state.settings.backgroundColor})),this.stage.add(k),k.moveToBottom();let oe=this.stage.toCanvas({width:o,height:s});return k.destroy(),this.viewport.width=u,this.viewport.height=d,this.viewport.zoom=f,this.viewport.minZoom=p,this.viewport.position=m,this.viewport.onChange=h,this.stage.width(u),this.stage.height(d),this.applyViewportToStage(),this.culling.updateCulling(),oe}refresh(){let{currentAreaInstance:e,currentZIndex:t,positionRoomId:n}=this.state;if(!e||t===void 0)return;let r=e.getPlane(t);if(!r)return;this.updateBackground();let i=this.buildScene(e,r,t,this.viewport.getViewportBounds());this.onSceneBuilt(i),this.syncHighlights(),this.syncPaths(),n!==void 0&&this.onPositionChanged(n,!1,!1);for(let[e,t]of this.sceneOverlays)this.renderSceneOverlay(e,t)}addLiveEffect(e,t){this.removeLiveEffect(e),t.attach(this.overlayLayer),this.liveEffects.set(e,t),t.updateViewport(this.viewport.getViewportBounds(),this.viewport.getScale(),this.coordinateTransform)}removeLiveEffect(e){let t=this.liveEffects.get(e);t&&(t.destroy(),this.liveEffects.delete(e))}addSceneOverlay(e,t){let n=this.sceneOverlays.get(e);n&&(n.detach?.(),this.clearSceneOverlayNodes(e)),this.sceneOverlays.set(e,t),t.attach?.(this.createOverlayContext(e,t)),this.renderSceneOverlay(e,t)}removeSceneOverlay(e){let t=this.sceneOverlays.get(e);t&&(t.detach?.(),this.sceneOverlays.delete(e),this.clearSceneOverlayNodes(e),this.overlayLayer.batchDraw())}getSceneOverlays(){return this.sceneOverlays.values()}createOverlayContext(e,t){return{state:this.state,onViewportChange:e=>(this.viewportSubscribers.add(e),()=>this.viewportSubscribers.delete(e)),invalidate:()=>{this.sceneOverlays.get(e)===t&&this.renderSceneOverlay(e,t)}}}renderSceneOverlay(e,t){this.clearSceneOverlayNodes(e);let n=this.viewport.getViewportBounds(),r=t.render(this.drawingBackend,this.state,n);if(r){let t=Array.isArray(r)?r:[r],n=[];for(let e of t)this.overlayLayerNode.addNode(e),n.push(e);this.sceneOverlayNodes.set(e,n)}this.overlayLayer.batchDraw()}clearSceneOverlayNodes(e){let t=this.sceneOverlayNodes.get(e);if(t){for(let e of t)e.destroy();this.sceneOverlayNodes.delete(e)}}subscribeToState(e){e.events.on(`area`,()=>{this.refresh()}),e.events.on(`position`,({roomId:e,center:t,areaChanged:n})=>{this.onPositionChanged(e,t,n)}),e.events.on(`center`,({roomId:t,instant:n})=>{let r=e.mapReader.getRoom(t);if(r){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}}),e.events.on(`highlight`,({roomId:e,color:t})=>{this.syncHighlight(e,t)}),e.events.on(`path`,()=>{this.syncPaths()}),e.events.on(`clear`,()=>{this.syncHighlights()})}buildScene(e,t,n,r){this.positionLayer.destroyChildren(),this.positionMarker=void 0,this.clearOverlayShapes(),this.currentRoomOverlay=[];let i=this.pipeline.buildScene(e,t,n,r);return this.lastBuildResult=i,i}onSceneBuilt(e){this.culling.clear(),this.areaExitHitZones=[],this.culling.computeBucketSize();let t=this.viewport.getScale();this.stage.scale({x:t,y:t});for(let[,t]of e.roomNodes)this.culling.roomNodes.set(t.room.id,t),this.culling.addRoomToSpatialIndex(t);for(let t of e.standaloneExitNodes)this.culling.standaloneExitNodes.push(t),this.culling.addStandaloneExitToSpatialIndex(t);this.culling.setExitBoundsRoomSize(),this.areaExitHitZones=e.areaExitHitZones,this.culling.updateCulling(),this.stage.batchDraw()}onPositionChanged(e,t,n){if(e===void 0){this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.positionLayerNode.batchDraw(),this.clearCurrentRoomOverlay(),this.overlayLayerNode.batchDraw();return}let r=this.state.mapReader.getRoom(e);if(r){if(t){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}this.updateCurrentRoomOverlay(r),this.applyPositionMarker(r)}}applyPositionMarker(e){this.positionMarker&&this.positionMarker.destroy();let t=Ye(e,this.state.settings);this.positionMarker=Qe(this.drawingBackend,t),this.positionLayerNode.addNode(this.positionMarker)}clearCurrentRoomOverlay(){this.currentRoomOverlay.forEach(e=>e.destroy()),this.currentRoomOverlay=[],this.positionLayerNode.batchDraw()}updateCurrentRoomOverlay(e){if(this.clearCurrentRoomOverlay(),e.area!==this.state.currentArea||e.z!==this.state.currentZIndex){this.positionLayerNode.batchDraw();return}let t=this.state.settings;if(!t.highlightCurrentRoom){this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw();return}let n=new Map;n.set(e.id,e);let r=[],i=this.pipeline.exitRenderer,a=this.state.currentAreaInstance instanceof B?this.state.currentAreaInstance:void 0;this.state.currentAreaInstance&&this.state.currentZIndex!==void 0&&this.state.currentAreaInstance.getLinkExits(this.state.currentZIndex).filter(t=>t.a===e.id||t.b===e.id).forEach(e=>{let t=i.renderDataWithColor(e,V,this.state.currentZIndex);t&&r.push(this.pipeline.renderExitData(t))});for(let n of ve(e,t,V))r.push(et(this.drawingBackend,n));let o=ge(e,t,V);o.length>0&&r.push(tt(this.drawingBackend,o)),[...Object.values(e.exits),...Object.values(e.specialExits)].forEach(e=>{let t=this.state.mapReader.getRoom(e),r=!a||a.hasVisitedRoom(e);t&&t.area===this.state.currentArea&&t.z===this.state.currentZIndex&&r&&n.set(e,t)}),r.forEach(e=>{this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}),n.forEach((n,r)=>{let i=r===e.id,a=this.pipeline.roomShapeRenderer.createRoomGroup(n,{strokeOverride:i?V:t.lineColor});this.positionLayerNode.addNode(a),this.currentRoomOverlay.push(a)}),n.forEach(e=>{let{triangles:n}=Se(e,this.state.mapReader,t);if(n.length>0){let e=nt(this.drawingBackend,n);this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}}),this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw()}syncHighlight(e,t){let n=this.highlightShapes.get(e);if(n&&(n.destroy(),this.highlightShapes.delete(e)),t!==void 0){let n=this.state.mapReader.getRoom(e);if(n&&n.area===this.state.currentArea&&n.z===this.state.currentZIndex){let r=Je(n,t,this.state.settings),i=Ze(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}}this.overlayLayerNode.batchDraw()}syncHighlights(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear();for(let[e,t]of this.state.highlights){if(t.area!==this.state.currentArea||t.z!==this.state.currentZIndex)continue;let n=this.state.mapReader.getRoom(e);if(!n)continue;let r=Je(n,t.color,this.state.settings),i=Ze(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}this.overlayLayerNode.batchDraw()}syncPaths(){this.clearPathShapes();let{currentArea:e,currentZIndex:t}=this.state;if(!(e===void 0||t===void 0)){for(let n of this.state.paths){let r=Xe(this.state.mapReader,this.state.settings,n.locations,n.color,e,t),i=$e(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.pathShapes.push(i)}this.overlayLayerNode.batchDraw()}}clearOverlayShapes(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear(),this.clearPathShapes()}clearPathShapes(){for(let e of this.pathShapes)e.destroy();this.pathShapes=[]}},st=class{get settings(){return this.state.settings}constructor(e,t,n,r){this.currentStyle=S,this.state=new y(e,t??p()),this.backend=r?r(this.state):new ot(this.state,n)}destroy(){this.backend.destroy()}drawArea(e,t){this.state.setArea(e,t)}getCurrentArea(){return this.state.currentAreaInstance}setPosition(e,t=!0){this.state.setPosition(e,t)}updatePositionMarker(e){this.state.updatePositionMarker(e)}clearPosition(){this.state.clearPosition()}centerOn(e,t){this.state.setCenterRoom(e,t)}renderHighlight(e,t){this.state.addHighlight(e,t)}removeHighlight(e){this.state.removeHighlight(e)}hasHighlight(e){return this.state.hasHighlight(e)}clearHighlights(){this.state.clearHighlights()}renderPath(e,t){this.state.addPath(e,t)}clearPaths(){this.state.clearPaths()}refreshCurrentRoomOverlay(){this.state.refreshPosition()}setStyle(e){this.currentStyle=e,this.backend.setDrawingBackend(e(new Le))}clearStyle(){this.setStyle(S)}getStyle(){return this.currentStyle}updateBackground(){this.backend.updateBackground()}refresh(){this.backend.updateBackground(),this.backend.refresh()}addSceneOverlay(e,t){this.backend.addSceneOverlay(e,t)}removeSceneOverlay(e){this.backend.removeSceneOverlay(e)}addLiveEffect(e,t){this.backend.addLiveEffect(e,t)}removeLiveEffect(e){this.backend.removeLiveEffect(e)}export(e){let t={state:this.state,backend:this.backend,style:this.currentStyle,sceneOverlays:this.backend.getSceneOverlays()};return e.render(t)}on(e,t){this.backend.events.on(e,t)}off(e,t){this.backend.events.off(e,t)}setZoom(e){return this.backend.viewport.setZoom(e)}zoomToCenter(e){return this.backend.viewport.zoomToCenter(e)}getZoom(){return this.backend.viewport.zoom}getViewportBounds(){return this.backend.viewport.getViewportBounds()}getAreaBounds(){if(!this.state.currentAreaInstance||this.state.currentZIndex===void 0)return null;let e=this.state.currentAreaInstance.getPlane(this.state.currentZIndex);if(!e)return null;let t=this.state.getEffectiveBounds(this.state.currentAreaInstance,e),n=this.state.settings.areaName&&this.state.currentAreaInstance.getAreaName(),r={minX:n?t.minX-4:t.minX,maxX:t.maxX,minY:n?t.minY-7:t.minY,maxY:t.maxY},i=this.backend.coordinateTransform,a=i(r.minX,r.minY),o=i(r.maxX,r.minY),s=i(r.maxX,r.maxY),c=i(r.minX,r.maxY);return{minX:Math.min(a.x,o.x,s.x,c.x),maxX:Math.max(a.x,o.x,s.x,c.x),minY:Math.min(a.y,o.y,s.y,c.y),maxY:Math.max(a.y,o.y,s.y,c.y)}}fitArea(e){let t=this.getAreaBounds();t&&this.backend.viewport.fitToMapBounds(t.minX,t.maxX,t.minY,t.maxY,e)}get centerOnResize(){return this.backend.viewport.centerOnResize}set centerOnResize(e){this.backend.viewport.centerOnResize=e}get minZoom(){return this.backend.viewport.minZoom}set minZoom(e){this.backend.viewport.minZoom=e}setCullingMode(e){this.state.settings.cullingMode=e,this.state.settings.cullingEnabled=e!==`none`,this.backend.culling.scheduleCulling()}getCullingMode(){return this.state.settings.cullingMode}};function H(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function U(e,t){return t===void 0?``:` ${e}="${typeof t==`string`?H(t):t}"`}function ct(e,t){return!e||t===!1?``:` stroke-dasharray="${e.join(` `)}"`}var W=class{constructor(e,t){this.elements=[],this.visible=!0,this.x=e,this.y=t}setVisible(e){this.visible=e}isVisible(){return this.visible}destroy(){this.elements.length=0}setPosition(e,t){}getPosition(){return{x:this.x,y:this.y}}moveToTop(){}toSvg(){return!this.visible||this.elements.length===0?``:this.x===0&&this.y===0?this.elements.join(`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),s=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},c=(n,r,a)=>(a=n==null?{}:e(i(n)),s(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let l=require(`konva`);l=c(l,1);var u=.6,d=.025,f=`rgb(225, 255, 225)`;function p(){return{roomSize:u,lineWidth:d,lineColor:f,backgroundColor:`#000000`,instantMapMove:!1,highlightCurrentRoom:!0,cullingEnabled:!0,cullingMode:`indexed`,cullingBounds:null,labelRenderMode:`image`,transparentLabels:!1,roomShape:`rectangle`,playerMarker:{strokeColor:`#00e5b2`,strokeAlpha:1,fillColor:`#00e5b2`,fillAlpha:0,strokeWidth:.1,sizeFactor:1.7,dash:[.05,.05],dashEnabled:!0,matchRoomShape:!1},gridEnabled:!1,gridSize:1,gridColor:`rgba(200, 200, 200, 0.15)`,gridLineWidth:.03,perfCallback:null,borders:!0,frameMode:!1,coloredMode:!1,emboss:!1,areaName:!0,fontFamily:`sans-serif`,uniformLevelSize:!1,areaExitLabels:!1}}function m(e){let t,n,r,i=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(i)t=parseInt(i[1])/255,n=parseInt(i[2])/255,r=parseInt(i[3])/255;else if(e.startsWith(`#`)&&e.length>=7)t=parseInt(e.slice(1,3),16)/255,n=parseInt(e.slice(3,5),16)/255,r=parseInt(e.slice(5,7),16)/255;else return .5;return(Math.max(t,n,r)+Math.min(t,n,r))/2}function h(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.round(n*(1-t)),r=Math.round(r*(1-t)),i=Math.round(i*(1-t)),`rgb(${n}, ${r}, ${i})`}function g(e,t){let n,r,i,a=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(a)n=parseInt(a[1]),r=parseInt(a[2]),i=parseInt(a[3]);else if(e.startsWith(`#`)&&e.length>=7)n=parseInt(e.slice(1,3),16),r=parseInt(e.slice(3,5),16),i=parseInt(e.slice(5,7),16);else return e;return n=Math.min(255,Math.round(n+(255-n)*t)),r=Math.min(255,Math.round(r+(255-r)*t)),i=Math.min(255,Math.round(i+(255-i)*t)),`rgb(${n}, ${r}, ${i})`}function _(e,t){return`rgba(${parseInt(e.slice(1,3),16)}, ${parseInt(e.slice(3,5),16)}, ${parseInt(e.slice(5,7),16)}, ${t})`}var v=class{constructor(e){this.listeners=new Map,this.container=e}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){this.listeners.get(e)?.delete(t)}removeAllListeners(){this.listeners.clear()}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t)),this.container&&this.container.dispatchEvent(new CustomEvent(e,{detail:t}))}},y=class{constructor(e,t){this.events=new v,this.highlights=new Map,this.paths=[],this.mapReader=e,this.settings=t}setArea(e,t){let n=this.mapReader.getArea(e);return!n||!n.getPlane(t)?!1:(this.currentArea=e,this.currentAreaInstance=n,this.currentZIndex=t,this.currentAreaVersion=n.getVersion(),this.events.emit(`area`,{area:n,zIndex:t}),!0)}setPosition(e,t=!0){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.mapReader.getArea(n.area),i=r?.getVersion(),a=this.currentArea!==n.area||this.currentZIndex!==n.z||i!==void 0&&this.currentAreaVersion!==i||r!==void 0&&this.currentAreaInstance!==r;return a&&this.setArea(n.area,n.z),this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:t,areaChanged:a}),!0}updatePositionMarker(e){this.positionRoomId=e,this.events.emit(`position`,{roomId:e,center:!1,areaChanged:!1})}refreshPosition(){this.positionRoomId!==void 0&&this.events.emit(`position`,{roomId:this.positionRoomId,center:!1,areaChanged:!1})}clearPosition(){this.positionRoomId=void 0,this.events.emit(`position`,{roomId:void 0,center:!1,areaChanged:!1})}setCenterRoom(e,t){let n=this.mapReader.getRoom(e);if(!n)return!1;let r=this.currentArea!==n.area||this.currentZIndex!==n.z;return(r||this.needsAreaRedraw(n))&&this.setArea(n.area,n.z),this.centerRoomId=e,this.events.emit(`center`,{roomId:e,instant:t??r}),!0}needsAreaRedraw(e){let t=this.mapReader.getArea(e.area),n=t?.getVersion();return n!==void 0&&this.currentAreaVersion!==n||t!==void 0&&this.currentAreaInstance!==t}addHighlight(e,t){let n=this.mapReader.getRoom(e);return n?(this.highlights.set(e,{color:t,area:n.area,z:n.z}),this.events.emit(`highlight`,{roomId:e,color:t}),!0):!1}removeHighlight(e){this.highlights.has(e)&&(this.highlights.delete(e),this.events.emit(`highlight`,{roomId:e,color:void 0}))}hasHighlight(e){return this.highlights.has(e)}clearHighlights(){this.highlights.clear(),this.events.emit(`clear`,void 0)}addPath(e,t=`#66E64D`){this.paths.push({locations:e,color:t}),this.events.emit(`path`,void 0)}clearPaths(){this.paths=[],this.events.emit(`path`,void 0)}getOverlaysForArea(e){let t={...e};if(this.positionRoomId!==void 0){let e=this.mapReader.getRoom(this.positionRoomId);e&&e.area===this.currentArea&&e.z===this.currentZIndex&&(t.position={roomId:this.positionRoomId})}let n=[...e?.highlights??[]];for(let[e,t]of this.highlights)t.area===this.currentArea&&t.z===this.currentZIndex&&n.push({roomId:e,color:t.color});n.length>0&&(t.highlights=n);let r=[...e?.paths??[]];return r.push(...this.paths),r.length>0&&(t.paths=r),t}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}computeExportBounds(e,t,n,r){if(n!==void 0){let e=this.mapReader.getRoom(n);if(!e)throw Error(`Room ${n} not found`);return{x:e.x-r,y:e.y-r,w:r*2,h:r*2}}let i=this.getEffectiveBounds(e,t),a=this.settings.areaName?e.getAreaName():void 0,o=a?7:0,s=a?3.5:0,c=i.minX-s,l=i.minY-o,u=a?i.minX-3.5+a.length*2.5*.6:-1/0,d=Math.max(i.maxX,u);return{x:c-r,y:l-r,w:d-c+r*2,h:i.maxY-l+r*2}}},b=(e,t)=>({x:e,y:t}),x=class{constructor(e){this.inner=e}createGroup(e,t){return this.inner.createGroup(e,t)}addRect(e,t){this.inner.addRect(e,t)}addCircle(e,t){this.inner.addCircle(e,t)}addLine(e,t){this.inner.addLine(e,t)}addPolygon(e,t){this.inner.addPolygon(e,t)}addText(e,t){this.inner.addText(e,t)}addImage(e,t){this.inner.addImage(e,t)}supportsBatchExitRendering(){return this.inner.supportsBatchExitRendering?.()??!1}getExitDepthOffset(){return this.inner.getExitDepthOffset()}getTransform(){return this.inner.getTransform()}getInverseTransform(){return this.inner.getInverseTransform()}},S=e=>e;function ee(...e){return e.length===0?S:e.length===1?e[0]:t=>{let n=t;for(let t of e)n=t(n);return n}}var C=72,w=200,T=120,E=new Map,D=null;function O(){return D||(D=l.default.Util.createCanvasElement(),D.width=w,D.height=w),D}function te(e,t){let n=`${e}::${t}`,r=E.get(n);if(r!==void 0)return r;let i=O().getContext(`2d`,{willReadFrequently:!0}),a=`bold ${C}px ${t}`;i.clearRect(0,0,w,w),i.font=a,i.textBaseline=`alphabetic`,i.textAlign=`center`,i.fillStyle=`#ffffff`,i.fillText(e,w/2,T);let{data:o}=i.getImageData(0,0,w,w),s=w,c=-1;for(let e=0;e<w;e++)for(let t=0;t<w;t++)o[(e*w+t)*4+3]>16&&(e<s&&(s=e),e>c&&(c=e));if(c===-1){let e={baselineRatio:.35,konvaCorrectionRatio:0};return E.set(n,e),e}let l=(T-s-Math.max(0,c-T))/2/C,u=i.measureText(`M`),d={baselineRatio:l,konvaCorrectionRatio:((u.fontBoundingBoxAscent??u.actualBoundingBoxAscent??0)-(u.fontBoundingBoxDescent??u.actualBoundingBoxDescent??0))/2/C-l};return E.set(n,d),d}function ne(e,t,n,r){let i=t.getColorValue(e.env),a=n.coloredMode?h(i,.5):n.frameMode?n.backgroundColor:i,o=n.coloredMode?g(i,.1):i;return{fillColor:a,strokeColor:r?n.frameMode||n.coloredMode?o:r:n.frameMode||n.coloredMode?o:n.lineColor,borderWidth:n.borders?n.lineWidth:0,symbolColor:n.frameMode||n.coloredMode?o:t.getSymbolColor(e.env),envColor:i}}function re(e,t){if(!t.emboss)return null;let n=t.roomSize,r=t.borders?t.lineWidth/2:0,i=t.lineWidth,a=g(e,.35),o=h(e,.45);if(t.roomShape===`circle`){let e=n/2,t=n/2,s=n/2-r,c=[];for(let n=0;n<=48;n++){let r=n/48*360*Math.PI/180;c.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}let l=[];for(let n=0;n<=19;n++){let r=(200+n/19*140)*Math.PI/180;l.push(e+Math.cos(r)*s,t+Math.sin(r)*s)}return{shadow:{points:c,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`},highlight:{points:l,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}if(t.roomShape===`roundedRectangle`){let e=(n-r*2)*.2,t=r,s=r,c=n-r,l=n-r,u=[];for(let n=0;n<=10/2;n++){let r=(135+n/(10/2)*45)*Math.PI/180;u.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}for(let n=1;n<=10;n++){let r=(180+n/10*90)*Math.PI/180;u.push(t+e+Math.cos(r)*e,s+e+Math.sin(r)*e)}for(let t=1;t<=10/2;t++){let n=(270+t/(10/2)*45)*Math.PI/180;u.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}let d=u.slice(),f=[];for(let t=0;t<=10/2;t++){let n=(315+t/(10/2)*45)*Math.PI/180;f.push(c-e+Math.cos(n)*e,s+e+Math.sin(n)*e)}for(let t=1;t<=10;t++){let n=t/10*90*Math.PI/180;f.push(c-e+Math.cos(n)*e,l-e+Math.sin(n)*e)}for(let n=1;n<=10/2;n++){let r=(90+n/(10/2)*45)*Math.PI/180;f.push(t+e+Math.cos(r)*e,l-e+Math.sin(r)*e)}return{highlight:{points:d,stroke:a,strokeWidth:i,lineCap:`round`,lineJoin:`round`},shadow:{points:f,stroke:o,strokeWidth:i,lineCap:`round`,lineJoin:`round`}}}return{highlight:{points:[r,n-r,r,r,n-r,r],stroke:a,strokeWidth:i},shadow:{points:[r,n-r,n-r,n-r,n-r,r],stroke:o,strokeWidth:i}}}var ie=class{constructor(e,t,n){this.mapReader=e,this.settings=t,this.backend=n}createRoomGroup(e,t){let{fillColor:n,strokeColor:r,borderWidth:i,symbolColor:a}=ne(e,this.mapReader,this.settings,t?.strokeOverride),o=this.settings.roomSize,s=this.backend.createGroup(e.x-o/2,e.y-o/2),c=i/2,l=re(n,this.settings),u=l?0:i,d=this.backend.getTransform()===b,f=this.settings.coloredMode&&u>0&&d,p=e=>this.settings.roomShape===`roundedRectangle`?Math.max(0,(o-2*e)*.2):0;if(f){let e=[h(r,.5),r],t=i*2;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-t,fill:n}):this.backend.addRect(s,{x:t,y:t,width:o-t*2,height:o-t*2,fill:n,cornerRadius:p(t)});for(let t=0;t<e.length;t++){let n=i/2+t*i;this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-n,stroke:e[t],strokeWidth:i}):this.backend.addRect(s,{x:n,y:n,width:o-n*2,height:o-n*2,stroke:e[t],strokeWidth:i,cornerRadius:p(n)})}}else this.settings.roomShape===`circle`?this.backend.addCircle(s,{cx:o/2,cy:o/2,radius:o/2-c,fill:n,stroke:u?r:void 0,strokeWidth:u}):this.backend.addRect(s,{x:c,y:c,width:o-i,height:o-i,fill:n,stroke:u?r:void 0,strokeWidth:u,cornerRadius:this.settings.roomShape===`roundedRectangle`?(o-i)*.2:0});if(l&&(this.backend.addLine(s,{points:l.shadow.points,stroke:l.shadow.stroke,strokeWidth:l.shadow.strokeWidth,lineCap:l.shadow.lineCap,lineJoin:l.shadow.lineJoin}),this.backend.addLine(s,{points:l.highlight.points,stroke:l.highlight.stroke,strokeWidth:l.highlight.strokeWidth,lineCap:l.highlight.lineCap,lineJoin:l.shadow.lineJoin})),e.roomChar){let t=o*.75,{baselineRatio:n,konvaCorrectionRatio:r}=te(e.roomChar,this.settings.fontFamily),i=Math.max(o,e.roomChar.length*t*.8),c=(i-o)/2;this.backend.addText(s,{x:-c,y:0,text:e.roomChar,fontSize:t,fontFamily:this.settings.fontFamily,fontStyle:`bold`,fill:a,align:`center`,verticalAlign:`middle`,width:i,height:o,baselineRatio:n,konvaCorrectionRatio:r})}return s}},ae=class{constructor(e,t,n){this.cachedBounds=null,this.inverseTransform=(e,t)=>({x:e,y:t}),this.layer=e,this.settings=t,this.backend=n}setInverseTransform(e){this.inverseTransform=e,this.invalidateCache()}invalidateCache(){this.cachedBounds=null}render(e){if(!this.settings.gridEnabled){this.cachedBounds!==null&&(this.layer.destroyChildren(),this.layer.batchDraw(),this.cachedBounds=null);return}let t=this.inverseTransform,{minX:n,maxX:r,minY:i,maxY:a}=e,o=t(n,i),s=t(r,i),c=t(r,a),l=t(n,a),u=Math.min(o.x,s.x,c.x,l.x),d=Math.max(o.x,s.x,c.x,l.x),f=Math.min(o.y,s.y,c.y,l.y),p=Math.max(o.y,s.y,c.y,l.y),m=this.settings.gridSize*2,h=Math.floor((u-m)/this.settings.gridSize)*this.settings.gridSize,g=Math.ceil((d+m)/this.settings.gridSize)*this.settings.gridSize,_=Math.floor((f-m)/this.settings.gridSize)*this.settings.gridSize,v=Math.ceil((p+m)/this.settings.gridSize)*this.settings.gridSize,y=this.cachedBounds;if(y&&y.left===h&&y.right===g&&y.top===_&&y.bottom===v)return;this.layer.destroyChildren();let b=this.backend.createGroup(0,0);for(let e=h;e<=g;e+=this.settings.gridSize)this.backend.addLine(b,{points:[e,_,e,v],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});for(let e=_;e<=v;e+=this.settings.gridSize)this.backend.addLine(b,{points:[h,e,g,e],stroke:this.settings.gridColor,strokeWidth:this.settings.gridLineWidth});this.layer.addNode(b),this.cachedBounds={left:h,right:g,top:_,bottom:v},this.layer.batchDraw()}},k=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],oe={n:`north`,s:`south`,e:`east`,w:`west`,ne:`northeast`,nw:`northwest`,se:`southeast`,sw:`southwest`},A={north:`n`,south:`s`,east:`e`,west:`w`,northeast:`ne`,northwest:`nw`,southeast:`se`,southwest:`sw`,up:`u`,down:`d`,in:`i`,out:`o`},j={north:{x:0,y:-1},south:{x:0,y:1},east:{x:1,y:0},west:{x:-1,y:0},northeast:{x:1,y:-1},northwest:{x:-1,y:-1},southeast:{x:1,y:1},southwest:{x:-1,y:1}},se=[`north`,`south`,`east`,`west`,`northeast`,`northwest`,`southeast`,`southwest`],ce={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,northwest:`southeast`,southeast:`northwest`,southwest:`northeast`};function le(e){return e?Object.prototype.hasOwnProperty.call(j,e):!1}function M(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=j[n];return{x:e+i.x*r,y:t+i.y*r}}function ue(e,t,n,r=1,i=0){if(!le(n))return{x:e,y:t};let a=j[n];if(!(a.x!==0&&a.y!==0)||i<=0)return M(e,t,n,r);let o=r-i+i/Math.SQRT2;return{x:e+a.x*o,y:t+a.y*o}}function de(e,t,n,r=1){if(!le(n))return{x:e,y:t};let i=j[n],a=Math.atan2(i.y,i.x);return{x:e+Math.cos(a)*r,y:t+Math.sin(a)*r}}var N={OPEN_DOOR:`rgb(10, 155, 10)`,CLOSED_DOOR:`rgb(226, 205, 59)`,LOCKED_DOOR:`rgb(155, 10, 10)`,ONE_WAY_FILL:`rgb(155, 10, 10)`};function fe(e){switch(e){case 1:return N.OPEN_DOOR;case 2:return N.CLOSED_DOOR;default:return N.LOCKED_DOOR}}var pe=class{constructor(e,t){this.mapReader=e,this.settings=t}getRoomEdgePoint(e,t,n,r){let i=r-(this.settings.borders?this.settings.lineWidth/2:0);return this.settings.roomShape===`circle`?de(e,t,n,i):this.settings.roomShape===`roundedRectangle`?ue(e,t,n,i,this.settings.roomSize*.2):M(e,t,n,i)}renderData(e,t){return this.renderDataWithColor(e,this.settings.lineColor,t)}renderDataWithColor(e,t,n){let r=e.aDir&&k.includes(e.aDir),i=e.bDir&&k.includes(e.bDir);if(r&&i)return this.renderTwoWayExitData(e,t,n);if(r||i){let n=r?`a`:`b`;return this.renderOneWayExitData(e,t,n)}}renderTwoWayExitData(e,t,n){let r=this.mapReader.getRoom(e.a),i=this.mapReader.getRoom(e.b);if(!r||!i||!e.aDir||!e.bDir||r.customLines[A[e.aDir]]&&i.customLines[A[e.bDir]]||r.z!==i.z&&(n!==i.z&&r.customLines[A[e.aDir]]||n!==r.z&&i.customLines[A[e.bDir]]))return;let a=this.getRoomEdgePoint(r.x,r.y,e.aDir,this.settings.roomSize/2),o=this.getRoomEdgePoint(i.x,i.y,e.bDir,this.settings.roomSize/2),s=[a.x,a.y,o.x,o.y],c=[{points:s,stroke:t,strokeWidth:this.settings.lineWidth}],l=[],u=r.doors[A[e.aDir]]??i.doors[A[e.bDir]];if(u){let e=s[0]+(s[2]-s[0])/2,t=s[1]+(s[3]-s[1])/2;l.push({x:e-this.settings.roomSize/4,y:t-this.settings.roomSize/4,width:this.settings.roomSize/2,height:this.settings.roomSize/2,stroke:fe(u),strokeWidth:this.settings.lineWidth})}let d=Math.min(s[0],s[2]),f=Math.max(s[0],s[2]),p=Math.min(s[1],s[3]),m=Math.max(s[1],s[3]),h=(r.z===i.z?void 0:r.z===n?i.id:r.id)??(r.area===i.area?void 0:i.id),g=h===void 0?{}:{from:{x:r.x,y:r.y},tip:{x:o.x,y:o.y},arrowColor:this.mapReader.getColorValue(i.env)};return{lines:c,arrows:[],doors:l,bounds:{x:d,y:p,width:f-d,height:m-p},targetRoomId:h,...g}}renderOneWayExitData(e,t,n){let r=n===`a`||!n&&e.aDir,i=r?this.mapReader.getRoom(e.a):this.mapReader.getRoom(e.b),a=r?this.mapReader.getRoom(e.b):this.mapReader.getRoom(e.a),o=r?e.aDir:e.bDir;if(!o||!i||!a||!k.includes(o)||i.customLines[A[o]||o])return;if(i.area!=a.area&&o){let e=this.mapReader.getColorValue(a.env),t=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),n=M(i.x,i.y,o,this.settings.roomSize*1.5),r=e;return{lines:[],arrows:[{points:[t.x,t.y,n.x,n.y],pointerLength:.3,pointerWidth:.3,strokeWidth:this.settings.lineWidth*1.4,stroke:r,fill:r}],doors:[],bounds:{x:Math.min(t.x,n.x),y:Math.min(t.y,n.y),width:Math.abs(n.x-t.x),height:Math.abs(n.y-t.y)},targetRoomId:a.id,from:{x:i.x,y:i.y},tip:{x:n.x,y:n.y},arrowColor:r}}let s=a.area!==i.area||a.z!==i.z,c={x:a.x,y:a.y};s&&(c=M(i.x,i.y,o,this.settings.roomSize/2));let l=M(i.x,i.y,o,.3),u=l.x-(l.x-c.x)/2,d=l.y-(l.y-c.y)/2,f=this.getRoomEdgePoint(i.x,i.y,o,this.settings.roomSize/2),p=[f.x,f.y,c.x,c.y],m=[f.x,c.x,u],h=[f.y,c.y,d],g=Math.min(...m),_=Math.max(...m),v=Math.min(...h),y=Math.max(...h);return{lines:[{points:p,stroke:t,strokeWidth:this.settings.lineWidth,dash:[.1,.05]}],arrows:[{points:[p[0],p[1],u,d],pointerLength:.5,pointerWidth:.35,strokeWidth:this.settings.lineWidth*1.4,stroke:t,fill:N.ONE_WAY_FILL,dash:[.1,.05]}],doors:[],bounds:{x:g,y:v,width:_-g,height:y-v},...s?{targetRoomId:a.id}:{}}}getInnerExitAreaTargets(e){let t=[`up`,`down`,`in`,`out`],n=this.settings.roomSize,r=[];for(let i of t){let t=e.exits[i];if(t===void 0)continue;let a=this.mapReader.getRoom(t);!a||a.area===e.area||r.push({bounds:{x:e.x-n/4,y:e.y-n/4,width:n/2,height:n/2},targetRoomId:t,from:{x:e.x,y:e.y},tip:{x:e.x,y:e.y},arrowColor:this.mapReader.getColorValue(a.env)})}return r}getSpecialExitAreaTargets(e){let t=[],n={u:`up`,d:`down`,i:`in`,o:`out`};for(let[r,i]of Object.entries(e.customLines)){let a=e.specialExits[r];if(a===void 0){let t=oe[r]??n[r];t&&(a=e.exits[t]??e.specialExits[t])}if(a===void 0&&(a=e.exits[r]??e.specialExits[r]),a===void 0)continue;let o=this.mapReader.getRoom(a);if(!o||o.area===e.area&&o.z===e.z)continue;let s=[e.x,e.y];i.points.reduce((e,t)=>(e.push(t.x,-t.y),e),s);let c=1/0,l=1/0,u=-1/0,d=-1/0;for(let e=0;e<s.length;e+=2)c=Math.min(c,s[e]),u=Math.max(u,s[e]),l=Math.min(l,s[e+1]),d=Math.max(d,s[e+1]);let f=s.length-2,p={x:s[f],y:s[f+1]};t.push({bounds:{x:c,y:l,width:u-c,height:d-l},targetRoomId:a,from:{x:e.x,y:e.y},tip:p,arrowColor:this.mapReader.getColorValue(o.env)})}return t}},me={1:`north`,2:`northeast`,3:`northwest`,4:`east`,5:`west`,6:`south`,7:`southeast`,8:`southwest`,9:`up`,10:`down`,11:`in`,12:`out`};function he(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function ge(e,t,n){let r=[];for(let i of e.stubs){let a=me[i];if(!a)continue;let o=he(t,e.x,e.y,a,t.roomSize/2),s=M(e.x,e.y,a,t.roomSize/2+.5);r.push({x1:o.x,y1:o.y,x2:s.x,y2:s.y,stroke:n??t.lineColor,strokeWidth:t.lineWidth})}return r}var _e={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function ve(e,t,n){let r=[];for(let[i,a]of Object.entries(e.customLines)){let o=[e.x,e.y];for(let e of a.points)o.push(e.x,-e.y);let s=n??`rgb(${a.attributes.color.r}, ${a.attributes.color.g}, ${a.attributes.color.b})`,c;a.attributes.style===`dot line`?c=[.05,.05]:a.attributes.style===`dash line`&&(c=[.4,.2]);let l={points:o,stroke:s,strokeWidth:t.lineWidth,dash:c},u;if(a.attributes.arrow&&o.length>=4){let e=o.length-2,n=o[e],r=o[e+1],i=o[e-2],a=o[e-1],c=Math.atan2(r-a,n-i),l=.3,d=.1;u={tipX:n,tipY:r,x1:n-l*Math.cos(c-Math.atan2(d,l)),y1:r-l*Math.sin(c-Math.atan2(d,l)),x2:n-l*Math.cos(c+Math.atan2(d,l)),y2:r-l*Math.sin(c+Math.atan2(d,l)),fill:s,stroke:s,strokeWidth:t.lineWidth}}let d,f=e.doors[i];if(f&&o.length>=4){let e=o[0]+(o[2]-o[0])/2,n=o[1]+(o[3]-o[1])/2,r=t.roomSize/2;d={x:e-r/2,y:n-r/2,width:r,height:r,stroke:_e[f]??_e[3],strokeWidth:t.lineWidth}}r.push({line:l,arrow:u,door:d})}return r}var ye=[`up`,`down`,`in`,`out`];function P(e,t,n,r){let i=r*Math.PI/180,a=[];for(let r=0;r<3;r++){let o=2*Math.PI*r/3-Math.PI/2,s=Math.cos(o)*n*1.4,c=Math.sin(o)*n*.8,l=s*Math.cos(i)-c*Math.sin(i),u=s*Math.sin(i)+c*Math.cos(i);a.push(e+l,t+u)}return a}function be(e,t,n){return{symbolColor:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env),symbolFill:n.frameMode||n.coloredMode?t.getColorValue(e.env):t.getSymbolColor(e.env,.6)}}var xe={1:`rgb(10, 155, 10)`,2:`rgb(226, 205, 59)`,3:`rgb(155, 10, 10)`};function Se(e,t,n){let r=[],i=n.roomSize,a=i/5,{symbolColor:o,symbolFill:s}=be(e,t,n);for(let t of ye){if(!e.exits[t])continue;let c=e.doors[t],l=c===void 0?o:xe[c]??xe[3];switch(t){case`up`:{let t=M(e.x,e.y,`south`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,0),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`down`:{let t=M(e.x,e.y,`north`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,180),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`in`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}case`out`:{let t=M(e.x,e.y,`west`,i/4),o=M(e.x,e.y,`east`,i/4);r.push({cx:t.x,cy:t.y,vertices:P(t.x,t.y,a,-90),fill:s,stroke:l,strokeWidth:n.lineWidth}),r.push({cx:o.x,cy:o.y,vertices:P(o.x,o.y,a,90),fill:s,stroke:l,strokeWidth:n.lineWidth});break}}}return{triangles:r}}function Ce(e){let t=(e?.alpha??255)/255,n=e=>Math.min(255,Math.max(0,e??0));return`rgba(${n(e?.r)}, ${n(e?.g)}, ${n(e?.b)}, ${t})`}function we(e,t){let n=Te(e);return n?`rgba(${n.r}, ${n.g}, ${n.b}, ${t})`:e}function Te(e){let t=e.match(/(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(t)return{r:+t[1],g:+t[2],b:+t[3]};if(e.startsWith(`#`)&&e.length>=7)return{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16)}}function Ee(e,t,n){let r=Te(e),i=Te(t);return!r||!i?e:`rgb(${Math.round(r.r*n+i.r*(1-n))}, ${Math.round(r.g*n+i.g*(1-n))}, ${Math.round(r.b*n+i.b*(1-n))})`}function De(e,t){let n=t*t,r=[];outer:for(let t of e){for(let e of r)for(let r of e){let i=t.tip.x-r.tip.x,a=t.tip.y-r.tip.y;if(i*i+a*a<=n){e.push(t);continue outer}}r.push([t])}return r}var Oe=class{constructor(e,t,n,r){this.mapReader=e,this.settings=t,this.backend=n,this.gridLayer=r.gridLayer,this.linkLayer=r.linkLayer,this.roomLayer=r.roomLayer,this.roomShapeRenderer=new ie(e,t,n),this.gridRenderer=new ae(r.gridLayer,t,n),this.exitRenderer=new pe(e,t)}buildScene(e,t,n,r){this.gridLayer.destroyChildren(),this.gridRenderer.invalidateCache(),this.linkLayer.destroyChildren(),this.roomLayer.destroyChildren(),r&&this.gridRenderer.render(r),this.renderLabels(t.getLabels());let i=this.renderLinkExits(e.getLinkExits(n),n),a=this.renderRooms(t.getRooms()??[]);this.renderAreaName(e,t);let o=[...i.areaExitHitZones,...a.areaExitHitZones],s=this.renderAreaExitLabels(o,e.getAreaId(),t.getRooms()??[],i.standaloneExitNodes.map(e=>e.bounds));return o.push(...s),{roomNodes:a.roomNodes,standaloneExitNodes:i.standaloneExitNodes,areaExitHitZones:o}}getEffectiveBounds(e,t){return this.settings.uniformLevelSize?e.getFullBounds():t.getBounds()}renderRooms(e){let t=new Map,n=[],r=this.settings.roomSize,i=this.backend.getExitDepthOffset();return e.forEach(e=>{let a=this.roomShapeRenderer.createRoomGroup(e);for(let t of ve(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);if(this.backend.addLine(e,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow){let n=t.arrow;this.backend.addPolygon(e,{vertices:[n.tipX,n.tipY,n.x1,n.y1,n.x2,n.y2],fill:n.fill,stroke:n.stroke,strokeWidth:n.strokeWidth})}if(t.door){let n=t.door;this.backend.addRect(e,{x:n.x,y:n.y,width:n.width,height:n.height,stroke:n.stroke,strokeWidth:n.strokeWidth})}this.linkLayer.addNode(e)}this.exitRenderer.getSpecialExitAreaTargets(e).forEach(e=>{n.push({bounds:e.bounds,targetRoomId:e.targetRoomId,from:e.from,tip:e.tip,arrowColor:e.arrowColor})}),this.exitRenderer.getInnerExitAreaTargets(e).forEach(e=>{n.push({bounds:e.bounds,targetRoomId:e.targetRoomId,from:e.from,tip:e.tip,arrowColor:e.arrowColor})});for(let t of ge(e,this.settings)){let e=this.backend.createGroup(i.x,i.y);this.backend.addLine(e,{points:[t.x1,t.y1,t.x2,t.y2],stroke:t.stroke,strokeWidth:t.strokeWidth}),this.linkLayer.addNode(e)}let o=e.x-r/2,s=e.y-r/2,{triangles:c}=Se(e,this.mapReader,this.settings);for(let e of c){let t=[];for(let n=0;n<e.vertices.length;n+=2)t.push(e.vertices[n]-o,e.vertices[n+1]-s);this.backend.addPolygon(a,{vertices:t,fill:e.fill,stroke:e.stroke,strokeWidth:e.strokeWidth})}this.roomLayer.addNode(a),t.set(e.id,{room:e,group:a})}),{roomNodes:t,areaExitHitZones:n}}renderLinkExits(e,t){let n=[],r=[];return e.forEach(e=>{let i=this.exitRenderer.renderData(e,t);if(!i)return;let a=this.renderExitData(i);this.linkLayer.addNode(a),n.push({group:a,bounds:i.bounds,targetRoomId:i.targetRoomId}),i.targetRoomId!==void 0&&r.push({bounds:i.bounds,targetRoomId:i.targetRoomId,from:i.from,tip:i.tip,arrowColor:i.arrowColor})}),{standaloneExitNodes:n,areaExitHitZones:r}}renderExitData(e){let t=this.backend.getExitDepthOffset(),n=this.backend.createGroup(t.x,t.y);for(let t of e.lines)this.backend.addLine(n,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});for(let t of e.arrows)this.renderArrow(n,t);for(let t of e.doors)this.backend.addRect(n,{x:t.x,y:t.y,width:t.width,height:t.height,stroke:t.stroke,strokeWidth:t.strokeWidth});return n}renderArrow(e,t){this.backend.addLine(e,{points:t.points,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash});let n=t.points.length-2,r=t.points[n],i=t.points[n+1],a=t.points[n-2],o=t.points[n-1],s=Math.atan2(i-o,r-a),c=t.pointerLength,l=t.pointerWidth/2,u=r-c*Math.cos(s-Math.atan2(l,c)),d=i-c*Math.sin(s-Math.atan2(l,c)),f=r-c*Math.cos(s+Math.atan2(l,c)),p=i-c*Math.sin(s+Math.atan2(l,c));this.backend.addPolygon(e,{vertices:[r,i,u,d,f,p],fill:t.fill,stroke:t.stroke,strokeWidth:t.strokeWidth})}renderLabels(e){this.settings.labelRenderMode!==`none`&&e.forEach(e=>{let t=e.X,n=-e.Y;if(this.settings.labelRenderMode===`image`&&e.pixMap){let r=this.backend.createGroup(0,0);this.backend.addImage(r,{x:t,y:n,width:e.Width,height:e.Height,src:`data:image/png;base64,${e.pixMap}`}),this.linkLayer.addNode(r);return}let r=this.backend.createGroup(0,0);if((e.BgColor?.alpha??0)>0&&!this.settings.transparentLabels&&this.backend.addRect(r,{x:t,y:n,width:e.Width,height:e.Height,fill:Ce(e.BgColor)}),e.Text){let i=Math.min(.75,e.Width/Math.max(e.Text.length/2,1)),a=Math.max(.1,Math.min(i,Math.max(e.Height*.9,.1)));this.backend.addText(r,{x:t,y:n,width:e.Width,height:e.Height,text:e.Text,fontSize:a,fill:Ce(e.FgColor),align:`center`,verticalAlign:`middle`})}this.linkLayer.addNode(r)})}renderAreaExitLabels(e,t,n,r){let i=[];if(!this.settings.areaExitLabels||e.length===0)return i;let a=new Map;for(let n of e){if(!n.tip||!n.from)continue;let e=this.mapReader.getRoom(n.targetRoomId);if(!e||e.area===t)continue;let r=n.tip.x-n.from.x,i=n.tip.y-n.from.y,o=Math.hypot(r,i)||1,s={tip:n.tip,dir:{x:r/o,y:i/o},color:n.arrowColor??`white`,bounds:n.bounds,targetRoomId:n.targetRoomId},c=a.get(e.area);c?c.push(s):a.set(e.area,[s])}let o=.3,s=.18,c=.1;o*.55,o*1.1;let l=.35,u=this.settings.roomSize,d=n.map(e=>({x:e.x-u/2,y:e.y-u/2,width:u,height:u})),f=e.map(e=>e.bounds),p=(e,t,n)=>{let r=Math.max(0,Math.max(e.x,t.x)-Math.min(e.x+e.w,t.x+t.w)),i=Math.max(0,Math.max(e.y,t.y)-Math.min(e.y+e.h,t.y+t.h));return Math.hypot(r,i)<=n},h=(e,t,n,r,i)=>{for(let a of i)if(e<a.x+a.width&&e+n>a.x&&t<a.y+a.height&&t+r>a.y)return!0;return!1},g=[[0,1],[0,-1],[1,0],[-1,0],[.707,.707],[-.707,.707],[.707,-.707],[-.707,-.707]],_=(e,t)=>{let n=t.length*.165+s*2,i=.33+c*2,a=0,o=0,l=0,u=0,p=new Map;for(let t of e)a+=t.tip.x,o+=t.tip.y,l+=t.dir.x,u+=t.dir.y,p.set(t.color,(p.get(t.color)??0)+1);let m=e.length,_=a/m,v=o/m,y=Math.hypot(l,u),b=y>0?l/y:0,x=y>0?u/y:0,S=0;for(let t=0;t<e.length;t++)for(let n=t+1;n<e.length;n++){let r=e[t].tip.x-e[n].tip.x,i=e[t].tip.y-e[n].tip.y,a=Math.hypot(r,i);a>S&&(S=a)}let ee=!(S>3)&&y/m>=.4,C=`white`,w=0;for(let[e,t]of p)t>w&&(C=e,w=t);let T=d.concat(f).concat(r),E=(e,t,r=0)=>.5+r+Math.abs(e)*n/2+Math.abs(t)*i/2,D=[];if(ee){let e=E(b,x);D.push({x:_+b*e,y:v+x*e})}D.push({x:_,y:v});for(let e of[0,.6,1.4])for(let[t,n]of g){let r=E(t,n,e);D.push({x:_+t*r,y:v+n*r})}for(let t of D){let r=t.x-n/2,a=t.y-i/2;if(!h(r,a,n,i,T))return{cluster:e,boxX:r,boxY:a,boxW:n,boxH:i,color:C}}};for(let[e,t]of a){let n=this.mapReader.getArea(e)?.getAreaName()||`Area ${e}`,r=De(t,10).map(e=>_(e,n)).filter(e=>e!==void 0),a=!0;for(;a&&r.length>1;){a=!1;outer:for(let e=0;e<r.length;e++)for(let t=e+1;t<r.length;t++)if(p({x:r[e].boxX,y:r[e].boxY,w:r[e].boxW,h:r[e].boxH},{x:r[t].boxX,y:r[t].boxY,w:r[t].boxW,h:r[t].boxH},2)){let i=_([...r[e].cluster,...r[t].cluster],n);i?(r[e]=i,r.splice(t,1)):(r.splice(t,1),r.splice(e,1)),a=!0;break outer}}for(let e of r){let t=we(e.color,l),r=m(Ee(e.color,this.settings.backgroundColor,l))>.55?`#000`:`#fff`,a=this.backend.createGroup(0,0);this.backend.addRect(a,{x:e.boxX,y:e.boxY,width:e.boxW,height:e.boxH,fill:t,stroke:e.color,strokeWidth:.03,cornerRadius:.18}),this.backend.addText(a,{x:e.boxX+s,y:e.boxY+c,width:e.boxW-s*2,height:e.boxH-c*2,text:n,fontSize:o,fontFamily:this.settings.fontFamily,fill:r,align:`center`,verticalAlign:`middle`}),this.roomLayer.addNode(a),i.push({bounds:{x:e.boxX,y:e.boxY,width:e.boxW,height:e.boxH},targetRoomId:e.cluster[0].targetRoomId})}}return i}renderAreaName(e,t){if(!this.settings.areaName)return;let n=e.getAreaName();if(!n)return;let r=this.getEffectiveBounds(e,t),i=this.backend.createGroup(0,0);this.backend.addText(i,{x:r.minX-3.5,y:r.minY-4.5,text:n,fontSize:2.5,fontFamily:this.settings.fontFamily,fill:`white`}),this.roomLayer.addNode(i)}},ke=75;function Ae(e){return e<.5?2*e*e:-1+(4-2*e)*e}var je=class{constructor(e,t){this.zoom=1,this.minZoom=.05,this.position={x:0,y:0},this.centerOnResize=!0,this.dragging=!1,this.dragStart={x:0,y:0},this.positionAtDragStart={x:0,y:0},this.width=e,this.height=t}getScale(){return ke*this.zoom}setZoom(e){let t=Math.max(this.minZoom,Math.min(5,e));return this.zoom===t?!1:(this.zoom=t,this.notify(),!0)}zoomToCenter(e){let t=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===t)return!1;let n=this.getScale(),r=this.width/2,i=this.height/2,a={x:(r-this.position.x)/n,y:(i-this.position.y)/n};this.zoom=t;let o=this.getScale();return this.position={x:r-a.x*o,y:i-a.y*o},this.notify(),!0}zoomToPoint(e,t,n){let r=this.getScale(),i={x:(t-this.position.x)/r,y:(n-this.position.y)/r},a=Math.max(this.minZoom,Math.min(5,e));if(this.zoom===a)return!1;this.zoom=a;let o=this.getScale();return this.position={x:t-i.x*o,y:n-i.y*o},this.notify(),!0}getViewportBounds(){let e=this.getScale();return{minX:(0-this.position.x)/e,maxX:(this.width-this.position.x)/e,minY:(0-this.position.y)/e,maxY:(this.height-this.position.y)/e}}clientToMapPoint(e,t,n){let r=e-(n?.left??0),i=t-(n?.top??0),a=this.getScale();return a?{x:(r-this.position.x)/a,y:(i-this.position.y)/a}:null}panToMapPoint(e,t){let n=this.getScale();this.position={x:this.width/2-e*n,y:this.height/2-t*n},this.notify()}panToMapPointAnimated(e,t,n){if(n){this.panToMapPoint(e,t);return}let r={...this.position},i=this.getScale(),a={x:this.width/2-e*i,y:this.height/2-t*i};this.animate(200,e=>{this.position={x:r.x+(a.x-r.x)*e,y:r.y+(a.y-r.y)*e}})}computeFitZoom(e,t,n,r,i){let a=t-e,o=r-n;if(a<=0||o<=0)return this.zoom;let s=i?.top??0,c=i?.right??0,l=i?.bottom??0,u=i?.left??0,d=Math.max(1,this.width-u-c),f=Math.max(1,this.height-s-l),p=d/((a+4)*ke),m=f/((o+4)*ke);return Math.max(.05,Math.min(5,Math.min(p,m)))}fitToMapBounds(e,t,n,r,i){let a=t-e,o=r-n;if(a<=0||o<=0)return;let s=i?.top??0,c=i?.left??0,l=Math.max(1,this.width-c-(i?.right??0)),u=Math.max(1,this.height-s-(i?.bottom??0));this.zoom=this.computeFitZoom(e,t,n,r,i),this.minZoom=this.zoom;let d=this.getScale(),f=(e+t)/2,p=(n+r)/2;this.position={x:c+l/2-f*d,y:s+u/2-p*d},this.notify()}setSize(e,t){this.width=e,this.height=t,this.notify()}startDrag(e,t){this.cancelAnimation(),this.dragging=!0,this.dragStart={x:e,y:t},this.positionAtDragStart={...this.position}}updateDrag(e,t){this.dragging&&(this.position={x:this.positionAtDragStart.x+(e-this.dragStart.x),y:this.positionAtDragStart.y+(t-this.dragStart.y)},this.notify())}endDrag(){this.dragging=!1}isDragging(){return this.dragging}animate(e,t){this.cancelAnimation();let n=performance.now(),r=typeof requestAnimationFrame<`u`?requestAnimationFrame:e=>setTimeout(()=>e(performance.now()),16),i=a=>{let o=a-n,s=Math.min(o/e,1);t(Ae(s)),this.notify(),s<1?this.animationId=r(i):this.animationId=void 0};this.animationId=r(i)}cancelAnimation(){this.animationId!==void 0&&((typeof cancelAnimationFrame<`u`?cancelAnimationFrame:e=>clearTimeout(e))(this.animationId),this.animationId=void 0)}isAnimating(){return this.animationId!==void 0}notify(){this.onChange?.()}},Me=class{constructor(e=60){this.samples=[],this.lastCullingTime=0,this.callback=null,this.windowSize=e}setCallback(e){e!==this.callback&&(this.callback=e,this.samples=[])}record(e){this.callback&&(this.samples.push(e),this.samples.length>=this.windowSize&&this.flush())}computeFps(){let e=performance.now(),t=e-this.lastCullingTime;return this.lastCullingTime=e,t>0?1e3/t:0}flush(){let e=this.samples.length;if(e===0)return;let t={cullingMs:0,gridMs:0,visibleRooms:0,totalRooms:0,visibleExits:0,fps:0};for(let e of this.samples)t.cullingMs+=e.cullingMs,t.gridMs+=e.gridMs,t.visibleRooms+=e.visibleRooms,t.totalRooms+=e.totalRooms,t.visibleExits+=e.visibleExits,t.fps+=e.fps;t.cullingMs/=e,t.gridMs/=e,t.visibleRooms=Math.round(t.visibleRooms/e),t.totalRooms=Math.round(t.totalRooms/e),t.visibleExits=Math.round(t.visibleExits/e),t.fps=Math.round(t.fps),this.callback(t),this.samples=[]}},Ne=class{constructor(e,t,n,r){this.roomNodes=new Map,this.standaloneExitNodes=[],this.spatialBucketSize=5,this.roomSpatialIndex=new Map,this.exitSpatialIndex=new Map,this.visibleRooms=new Set,this.visibleStandaloneExitNodes=new Set,this.bufferRoomSet=new Set,this.bufferExitSet=new Set,this.bufferRoomCandidates=new Set,this.bufferExitCandidates=new Set,this.cullingScheduled=!1,this.perfMonitor=new Me,this.coordinateTransform=(e,t)=>({x:e,y:t}),this.stageInfo=e,this.roomLayer=t,this.linkLayer=n,this.settings=r}setCoordinateTransform(e){this.coordinateTransform=e}transformPoint(e,t){return this.coordinateTransform(e,t)}transformBounds(e){let t=this.coordinateTransform,n=t(e.x,e.y),r=t(e.x+e.width,e.y),i=t(e.x+e.width,e.y+e.height),a=t(e.x,e.y+e.height),o=Math.min(n.x,r.x,i.x,a.x),s=Math.max(n.x,r.x,i.x,a.x),c=Math.min(n.y,r.y,i.y,a.y),l=Math.max(n.y,r.y,i.y,a.y);return{x:o,y:c,width:s-o,height:l-c}}computeBucketSize(){this.spatialBucketSize=Math.max(this.settings.roomSize*10,5)}clear(){this.roomNodes.clear(),this.standaloneExitNodes=[],this.standaloneExitBoundsRoomSize=void 0,this.roomSpatialIndex.clear(),this.exitSpatialIndex.clear(),this.visibleRooms.clear(),this.visibleStandaloneExitNodes.clear()}getBucketKey(e,t){return e*1000003+t}forEachBucket(e,t,n,r,i){let a=this.spatialBucketSize,o=Math.min(e,n),s=Math.max(e,n),c=Math.min(t,r),l=Math.max(t,r),u=Math.floor(o/a),d=Math.floor(s/a),f=Math.floor(c/a),p=Math.floor(l/a);for(let e=u;e<=d;e++)for(let t=f;t<=p;t++)i(this.getBucketKey(e,t))}addRoomToSpatialIndex(e){let t=this.settings.roomSize/2,n=this.transformBounds({x:e.room.x-t,y:e.room.y-t,width:this.settings.roomSize,height:this.settings.roomSize});this.forEachBucket(n.x,n.y,n.x+n.width,n.y+n.height,t=>{let n=this.roomSpatialIndex.get(t);n||(n=new Set,this.roomSpatialIndex.set(t,n)),n.add(e)})}addStandaloneExitToSpatialIndex(e){let t=this.transformBounds(e.bounds);this.forEachBucket(t.x,t.y,t.x+t.width,t.y+t.height,t=>{let n=this.exitSpatialIndex.get(t);n||(n=new Set,this.exitSpatialIndex.set(t,n)),n.add(e)})}findRoomAtMapPoint(e,t){let n=this.settings.roomSize,r=this.getBucketKey(Math.floor(e/this.spatialBucketSize),Math.floor(t/this.spatialBucketSize)),i=this.roomSpatialIndex.get(r);if(!i)return null;let a=null,o=1/0;for(let r of i){let i=this.transformPoint(r.room.x,r.room.y),s=e-i.x,c=t-i.y;if(s>=-n&&s<=n&&c>=-n&&c<=n){let e=s*s+c*c;e<o&&(o=e,a=r.room)}}return a}markExitBoundsStale(){this.standaloneExitBoundsRoomSize=void 0}setExitBoundsRoomSize(){this.standaloneExitBoundsRoomSize=this.settings.roomSize}collectRoomCandidates(e,t,n,r){let i=this.bufferRoomCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.roomSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}collectStandaloneExitCandidates(e,t,n,r){let i=this.bufferExitCandidates;return i.clear(),this.forEachBucket(e,t,n,r,e=>{this.exitSpatialIndex.get(e)?.forEach(e=>i.add(e))}),i}refreshStandaloneExitBoundsIfNeeded(){this.standaloneExitBoundsRoomSize!==this.settings.roomSize&&(this.exitSpatialIndex.clear(),this.standaloneExitNodes.forEach(e=>this.addStandaloneExitToSpatialIndex(e)),this.standaloneExitBoundsRoomSize=this.settings.roomSize)}scheduleCulling(){if(this.cullingScheduled)return;this.cullingScheduled=!0;let e=()=>{this.cullingScheduled=!1,this.updateCulling()};typeof requestAnimationFrame<`u`?requestAnimationFrame(e):e()}updateCulling(){if(this.roomNodes.size===0&&this.standaloneExitNodes.length===0)return;let e=this.stageInfo.scaleX();if(!e)return;this.perfMonitor.setCallback(this.settings.perfCallback);let t=this.settings.perfCallback?performance.now():0,n=this.stageInfo.position(),r=this.settings.roomSize/2,i=this.settings.cullingBounds,a=i?i.x:0,o=i?i.x+i.width:this.stageInfo.width(),s=i?i.y:0,c=i?i.y+i.height:this.stageInfo.height(),l=(Math.min(a,o)-n.x)/e,u=(Math.max(a,o)-n.x)/e,d=(Math.min(s,c)-n.y)/e,f=(Math.max(s,c)-n.y)/e,p=!1,m=!1,h=this.settings.cullingEnabled?this.settings.cullingMode??`indexed`:`none`,g=l-r,_=u+r,v=d-r,y=f+r;if(this.refreshStandaloneExitBoundsIfNeeded(),h===`none`){this.roomNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),p=!0)}),this.standaloneExitNodes.forEach(e=>{e.group.isVisible()||(e.group.setVisible(!0),m=!0)}),p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.visibleRooms.clear(),this.roomNodes.forEach(e=>this.visibleRooms.add(e)),this.visibleStandaloneExitNodes.clear(),this.standaloneExitNodes.forEach(e=>this.visibleStandaloneExitNodes.add(e));return}if(h===`basic`){let e=this.bufferRoomSet;e.clear();let t=this.settings.roomSize;this.roomNodes.forEach(n=>{let i=this.transformBounds({x:n.room.x-r,y:n.room.y-r,width:t,height:t}),a=i.x+i.width>=l&&i.x<=u&&i.y+i.height>=d&&i.y<=f;n.group.isVisible()!==a&&(n.group.setVisible(a),p=!0),a&&e.add(n)}),m=this.cullExits(l,u,d,f).changed,this.bufferRoomSet=this.visibleRooms,this.visibleRooms=e,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw();return}let b=this.collectRoomCandidates(g,v,_,y),x=this.bufferRoomSet;x.clear();let S=this.settings.roomSize;if(b.forEach(e=>{let t=this.transformBounds({x:e.room.x-r,y:e.room.y-r,width:S,height:S}),n=t.x+t.width>=l&&t.x<=u&&t.y+t.height>=d&&t.y<=f;e.group.isVisible()!==n&&(e.group.setVisible(n),p=!0),n&&x.add(e)}),this.visibleRooms.forEach(e=>{!b.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),p=!0)}),this.bufferRoomSet=this.visibleRooms,this.visibleRooms=x,m=this.cullExits(l,u,d,f,!0).changed,p&&this.roomLayer.batchDraw(),m&&this.linkLayer.batchDraw(),this.settings.perfCallback){let e=performance.now()-t;this.perfMonitor.record({cullingMs:e,gridMs:0,visibleRooms:this.visibleRooms.size,totalRooms:this.roomNodes.size,visibleExits:this.visibleStandaloneExitNodes.size,fps:this.perfMonitor.computeFps()})}}cullExits(e,t,n,r,i=!1){let a=i?this.collectStandaloneExitCandidates(e-this.settings.roomSize,n-this.settings.roomSize,t+this.settings.roomSize,r+this.settings.roomSize):this.standaloneExitNodes,o=this.bufferExitSet;o.clear();let s=!1;return a[Symbol.iterator],a.forEach(i=>{let a=this.transformBounds(i.bounds),c=a.x+a.width>=e&&a.x<=t&&a.y+a.height>=n&&a.y<=r;i.group.isVisible()!==c&&(i.group.setVisible(c),s=!0),c&&o.add(i)}),this.visibleStandaloneExitNodes.forEach(e=>{!o.has(e)&&e.group.isVisible()&&(e.group.setVisible(!1),s=!0)}),this.bufferExitSet=this.visibleStandaloneExitNodes,this.visibleStandaloneExitNodes=o,{changed:s}}},Pe=class{constructor(e,t,n,r,i,a){this.cleanupFns=[],this.destroyed=!1,this.container=e,this.viewport=t,this.state=n,this.settings=r,this.hitTest=i,this.events=a,this.initViewportEvents(),this.initMapEvents()}destroy(){if(!this.destroyed){this.destroyed=!0;for(let e of this.cleanupFns)e();this.cleanupFns.length=0}}listen(e,t,n,r){e.addEventListener(t,n,r),this.cleanupFns.push(()=>e.removeEventListener(t,n,r))}initViewportEvents(){let e=this.container,t=this.viewport,n=1.1,r=()=>{if(t.setSize(e.clientWidth,e.clientHeight),t.centerOnResize&&this.state.positionRoomId){let e=this.state.mapReader.getRoom(this.state.positionRoomId);e&&t.panToMapPoint(e.x,e.y)}};typeof window<`u`&&this.listen(window,`resize`,r),this.listen(e,`resize`,r);let i=!1,a;this.listen(e,`pointerdown`,n=>{if(n.button!==0||n.pointerType===`touch`)return;i=!0,a=n.pointerId,e.setPointerCapture(n.pointerId);let r=e.getBoundingClientRect();t.startDrag(n.clientX-r.left,n.clientY-r.top)}),this.listen(e,`pointermove`,n=>{if(!i||n.pointerId!==a)return;let r=e.getBoundingClientRect();t.updateDrag(n.clientX-r.left,n.clientY-r.top),this.events.emit(`pan`,t.getViewportBounds())}),this.listen(e,`pointerup`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag(),this.events.emit(`pan`,t.getViewportBounds()))}),this.listen(e,`pointercancel`,e=>{e.pointerId===a&&(i=!1,a=void 0,t.endDrag())});let o;this.listen(e,`touchstart`,n=>{if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}else t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`touchmove`,n=>{let r=n.touches;if(r.length>=2){n.preventDefault(),t.isDragging()&&t.endDrag(),o=void 0;let i=e.getBoundingClientRect(),a={x:r[0].clientX-i.left,y:r[0].clientY-i.top},s={x:r[1].clientX-i.left,y:r[1].clientY-i.top};this.handlePinch(a,s);return}if(r.length===1&&o===r[0].identifier){let n=r[0],i=e.getBoundingClientRect();t.updateDrag(n.clientX-i.left,n.clientY-i.top),this.events.emit(`pan`,t.getViewportBounds())}}),this.listen(e,`touchend`,n=>{if(this.lastPinchDistance=void 0,n.touches.length===0)t.isDragging()&&(t.endDrag(),this.events.emit(`pan`,t.getViewportBounds())),o=void 0;else if(n.touches.length===1){let r=n.touches[0];o=r.identifier;let i=e.getBoundingClientRect();t.startDrag(r.clientX-i.left,r.clientY-i.top)}},{passive:!0}),this.listen(e,`touchcancel`,()=>{this.lastPinchDistance=void 0,t.isDragging()&&t.endDrag(),o=void 0},{passive:!0}),this.listen(e,`wheel`,r=>{r.preventDefault();let i=e.getBoundingClientRect(),a=r.clientX-i.left,o=r.clientY-i.top,s=r.deltaY>0?-1:1;r.ctrlKey&&(s=-s);let c=s>0?t.zoom*n:t.zoom/n;t.zoomToPoint(c,a,o)&&(this.events.emit(`zoom`,{zoom:t.zoom}),this.events.emit(`pan`,t.getViewportBounds()))},{passive:!1})}handlePinch(e,t){let n=Math.hypot(e.x-t.x,e.y-t.y);if(this.lastPinchDistance===void 0||this.lastPinchDistance===0||n===0){this.lastPinchDistance=n;return}let r=(e.x+t.x)/2,i=(e.y+t.y)/2,a=this.viewport.zoom*(n/this.lastPinchDistance);this.viewport.zoomToPoint(a,r,i)&&(this.events.emit(`zoom`,{zoom:this.viewport.zoom}),this.events.emit(`pan`,this.viewport.getViewportBounds())),this.lastPinchDistance=n}initMapEvents(){let e=this.container,t=null;this.listen(e,`mousemove`,n=>{let r=this.findRoomAtClientPoint(n.clientX,n.clientY);if(r!==t&&(t=r,r)){e.style.cursor=`pointer`;return}if(!t){let t=this.findAreaExitAtClientPoint(n.clientX,n.clientY)!==null;e.style.cursor=t?`pointer`:`auto`}}),this.listen(e,`mouseleave`,()=>{t=null,e.style.cursor=`auto`});let n=null;this.listen(e,`mousedown`,e=>{e.button===0&&(n={x:e.clientX,y:e.clientY})}),this.listen(e,`mouseup`,e=>{if(e.button!==0||!n)return;let t=e.clientX-n.x,r=e.clientY-n.y;if(n=null,t*t+r*r>25)return;let i=this.findRoomAtClientPoint(e.clientX,e.clientY);if(i){this.emitRoomClickEvent(i.id,e.clientX,e.clientY);return}let a=this.findAreaExitAtClientPoint(e.clientX,e.clientY);if(a){this.emitAreaExitClickEvent(a.targetRoomId,e.clientX,e.clientY);return}this.emitMapClickEvent()}),this.listen(e,`contextmenu`,e=>{let t=this.findRoomAtClientPoint(e.clientX,e.clientY);t&&(e.preventDefault(),this.emitRoomContextEvent(t.id,e.clientX,e.clientY))});let r,i,a=()=>{r!==void 0&&(window.clearTimeout(r),r=void 0),i=void 0};this.listen(e,`touchstart`,e=>{if(a(),e.touches.length>1)return;let t=e.touches[0];t&&this.findRoomAtClientPoint(t.clientX,t.clientY)&&(i={clientX:t.clientX,clientY:t.clientY},r=window.setTimeout(()=>{if(i){let e=this.findRoomAtClientPoint(i.clientX,i.clientY);e&&this.emitRoomContextEvent(e.id,i.clientX,i.clientY)}a()},500))},{passive:!0}),this.listen(e,`touchend`,()=>a(),{passive:!0}),this.listen(e,`touchcancel`,()=>a(),{passive:!0}),this.listen(e,`touchmove`,e=>{if(!i)return;let t=e.touches[0];if(!t){a();return}let n=t.clientX-i.clientX,r=t.clientY-i.clientY;n*n+r*r>100&&a()},{passive:!0})}findRoomAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);return n?this.hitTest.findRoomAtPoint(n.x,n.y):null}findAreaExitAtClientPoint(e,t){let n=this.hitTest.clientToMapPoint(e,t);if(!n)return null;let r=this.hitTest.renderedToMapPoint(n.x,n.y),i=this.settings.roomSize*.5;for(let e of this.hitTest.getAreaExitHitZones()){let t=e.bounds;if(r.x>=t.x-i&&r.x<=t.x+t.width+i&&r.y>=t.y-i&&r.y<=t.y+t.height+i)return e}return null}emitRoomClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomclick`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitRoomContextEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`roomcontextmenu`,{roomId:e,position:{x:t-r.left,y:n-r.top}})}emitAreaExitClickEvent(e,t,n){let r=this.container.getBoundingClientRect();this.events.emit(`areaexitclick`,{targetRoomId:e,position:{x:t-r.left,y:n-r.top}})}emitMapClickEvent(){this.events.emit(`mapclick`,void 0)}};function Fe(e,t){switch(t.type){case`rect`:e.beginPath(),t.cr>0&&typeof e.roundRect==`function`?e.roundRect(t.x,t.y,t.w,t.h,t.cr):e.rect(t.x,t.y,t.w,t.h),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),e.stroke());break;case`circle`:e.beginPath(),e.arc(t.cx,t.cy,t.r,0,Math.PI*2),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),e.stroke());break;case`line`:{if(t.points.length<4)break;let n=e.globalAlpha;t.alpha!==void 0&&(e.globalAlpha=t.alpha),e.beginPath(),e.moveTo(t.points[0],t.points[1]);for(let n=2;n<t.points.length;n+=2)e.lineTo(t.points[n],t.points[n+1]);t.stroke&&(e.strokeStyle=t.stroke),e.lineWidth=t.sw,t.dash?e.setLineDash(t.dash):e.setLineDash([]),t.lineCap&&(e.lineCap=t.lineCap),t.lineJoin&&(e.lineJoin=t.lineJoin),e.stroke(),t.alpha!==void 0&&(e.globalAlpha=n);break}case`polygon`:if(t.vertices.length<4)break;e.beginPath(),e.moveTo(t.vertices[0],t.vertices[1]);for(let n=2;n<t.vertices.length;n+=2)e.lineTo(t.vertices[n],t.vertices[n+1]);e.closePath(),t.fill&&(e.fillStyle=t.fill,e.fill()),t.stroke&&t.sw>0&&(e.strokeStyle=t.stroke,e.lineWidth=t.sw,e.setLineDash([]),e.stroke());break;case`text`:{let n=t.fontSize*100,r=`${t.fontStyle} ${n}px ${t.fontFamily}`;e.save(),e.font=r,e.fillStyle=t.fill;let i=t.baselineRatio!==void 0;if(t.transform)if(e.transform(...t.transform),e.scale(1/100,1/100),e.textAlign=`center`,i){e.textBaseline=`alphabetic`;let n=(t.h/2+t.baselineRatio*t.fontSize)*100;e.fillText(t.text,t.w*100/2,n)}else e.textBaseline=`middle`,e.fillText(t.text,t.w*100/2,t.h*100/2);else if(t.w>0&&t.h>0){e.textAlign=t.align||`left`;let n=t.align===`center`?t.x+t.w/2:t.x;if(e.scale(1/100,1/100),t.vAlign===`middle`&&i){e.textBaseline=`alphabetic`;let r=t.y+t.h/2+t.baselineRatio*t.fontSize;e.fillText(t.text,n*100,r*100)}else{e.textBaseline=t.vAlign===`middle`?`middle`:`top`;let r=t.vAlign===`middle`?t.y+t.h/2:t.y;e.fillText(t.text,n*100,r*100)}}else e.textAlign=`left`,e.textBaseline=`top`,e.scale(1/100,1/100),e.fillText(t.text,t.x*100,t.y*100);e.restore();break}case`image`:if(!t.image)break;t.transform?(e.save(),e.transform(...t.transform),e.drawImage(t.image,0,0,t.w,t.h),e.restore()):e.drawImage(t.image,t.x,t.y,t.w,t.h);break}}var F=class{constructor(e,t){this._visible=!0,this.commands=[],this.x=e,this.y=t}setVisible(e){this._visible=e,this._konvaGroup?.visible(e)}isVisible(){return this._visible}destroy(){this._konvaGroup?.destroy(),this._konvaGroup=void 0,this.commands.length=0}setPosition(e,t){this.x=e,this.y=t,this._konvaGroup?.position({x:e,y:t})}getPosition(){return{x:this.x,y:this.y}}moveToTop(){this._konvaGroup?.moveToTop()}materialize(){if(this._konvaGroup)return this._konvaGroup;let e=new l.default.Group({x:this.x,y:this.y,listening:!1,visible:this._visible}),t=this.commands;return e.add(new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{let n=e._context;for(let e of t)Fe(n,e)}})),this._konvaGroup=e,e}},I=class{constructor(e){this.groups=[],this.konvaLayer=e,e.destroyChildren();let t=this;this.konvaShape=new l.default.Shape({listening:!1,perfectDrawEnabled:!1,sceneFunc:e=>{let n=e._context,r=n.getTransform(),i=r.a,a=r.b,o=r.c,s=r.d;for(let e of t.groups){if(!e._visible)continue;let t=i*e.x+o*e.y+r.e,c=a*e.x+s*e.y+r.f;n.setTransform(i,a,o,s,t,c);for(let t of e.commands)Fe(n,t)}n.setTransform(r)}}),e.add(this.konvaShape)}ensureShape(){this.konvaShape.getParent()||this.konvaLayer.add(this.konvaShape)}addNode(e){e instanceof F&&(this.groups.push(e),this.ensureShape())}destroyChildren(){this.groups.length=0}batchDraw(){this.konvaLayer.batchDraw()}};function Ie(e){let t=l.default===void 0?typeof Image<`u`?new Image:null:l.default.Util.createImageElement();return t&&(t.src=e),t}var Le=class{createGroup(e,t){return new F(e,t)}addRect(e,t){e instanceof F&&e.commands.push({type:`rect`,x:t.x,y:t.y,w:t.width,h:t.height,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0,cr:t.cornerRadius??0,dash:t.dashEnabled!==!1&&t.dash?t.dash:void 0})}addCircle(e,t){e instanceof F&&e.commands.push({type:`circle`,cx:t.cx,cy:t.cy,r:t.radius,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0,dash:t.dashEnabled!==!1&&t.dash?t.dash:void 0})}addLine(e,t){e instanceof F&&e.commands.push({type:`line`,points:t.points,stroke:t.stroke,sw:t.strokeWidth??0,dash:t.dash,lineCap:t.lineCap,lineJoin:t.lineJoin,alpha:t.alpha})}addPolygon(e,t){e instanceof F&&e.commands.push({type:`polygon`,vertices:t.vertices,fill:t.fill,stroke:t.stroke,sw:t.strokeWidth??0})}addText(e,t){e instanceof F&&e.commands.push({type:`text`,x:t.x,y:t.y,text:t.text,fontSize:t.fontSize,fontFamily:t.fontFamily??`sans-serif`,fontStyle:t.fontStyle??`normal`,fill:t.fill??`black`,align:t.align??`left`,vAlign:t.verticalAlign??`top`,w:t.width??0,h:t.height??0,baselineRatio:t.baselineRatio,transform:t.transform})}addImage(e,t){e instanceof F&&e.commands.push({type:`image`,x:t.x,y:t.y,w:t.width,h:t.height,image:Ie(t.src),transform:t.transform})}supportsBatchExitRendering(){return!0}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}},Re=class{constructor(e){this.konvaGroup=e}setVisible(e){this.konvaGroup.visible(e)}isVisible(){return this.konvaGroup.visible()}destroy(){this.konvaGroup.destroy()}setPosition(e,t){this.konvaGroup.position({x:e,y:t})}getPosition(){return this.konvaGroup.position()}moveToTop(){this.konvaGroup.moveToTop()}},ze=class{constructor(e){this.konvaLayer=e}addNode(e){e instanceof Re?this.konvaLayer.add(e.konvaGroup):e instanceof F&&this.konvaLayer.add(e.materialize())}destroyChildren(){this.konvaLayer.destroyChildren()}batchDraw(){this.konvaLayer.batchDraw()}},L=[`up`,`down`,`in`,`out`];function R(e,t,n,r,i){return e.roomShape===`circle`?de(t,n,r,i):e.roomShape===`roundedRectangle`?ue(t,n,r,i,e.roomSize*.2):M(t,n,r,i)}function Be(e,t,n){for(let[e,r]of Object.entries(t.exits))if(r===n.id){let r=e;if(L.includes(r)){let e=A[r];return{type:`inner`,fromDir:r,customLineKey:t.customLines[e]?e:t.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=A[r];return t.customLines[i]?{type:`special`,fromDir:r,customLineKey:i,fromRoom:t,toRoom:n}:t.customLines[r]?{type:`special`,fromDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,fromDir:r,toDir:Ve(n,t.id),fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(t.specialExits))if(r===n.id)return t.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};for(let[e,r]of Object.entries(n.exits))if(r===t.id){let r=e;if(L.includes(r)){let e=A[r];return{type:`inner`,toDir:r,customLineKey:n.customLines[e]?e:n.customLines[r]?r:void 0,fromRoom:t,toRoom:n}}let i=A[r];return n.customLines[i]?{type:`special`,toDir:r,customLineKey:i,fromRoom:t,toRoom:n}:n.customLines[r]?{type:`special`,toDir:r,customLineKey:r,fromRoom:t,toRoom:n}:{type:`regular`,toDir:r,fromRoom:t,toRoom:n}}for(let[e,r]of Object.entries(n.specialExits))if(r===t.id)return n.customLines[e]?{type:`special`,customLineKey:e,fromRoom:t,toRoom:n}:{type:`inner`,fromRoom:t,toRoom:n};return{type:`none`,fromRoom:t,toRoom:n}}function Ve(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t)return n}function He(e,t,n){return e?e.area===t&&e.z===n:!1}function Ue(e,t){for(let[n,r]of Object.entries(e.exits))if(r===t.id)return{direction:n};for(let[n,r]of Object.entries(e.specialExits))if(r===t.id)return}function We(e,t){for(let n of se)if(e.exits[n]===t.id)return n;for(let n of se)if(t.exits[n]===e.id)return ce[n]}function Ge(e,t,n){let{fromRoom:r,toRoom:i,fromDir:a,toDir:o}=t;if(n.length===0&&n.push(r.x,r.y),a&&k.includes(a)){let t=R(e,r.x,r.y,a,e.roomSize/2);n.push(t.x,t.y)}if(o&&k.includes(o)){let t=R(e,i.x,i.y,o,e.roomSize/2);n.push(t.x,t.y)}n.push(i.x,i.y)}function Ke(e,t){let{fromRoom:n,toRoom:r,customLineKey:i}=e,a=n,o;i&&(o=n.customLines[i],o||(o=r.customLines[i],a=r)),t.length===0&&t.push(a.x,a.y),o&&o.points.forEach(e=>{t.push(e.x,-e.y)}),t.push(r.x,r.y)}function qe(e,t,n,r,i){let a=[],o=[],s=[],c=n.map(t=>e.getRoom(t)).filter(e=>e!==void 0),l=[],u=()=>{l.length>=4&&a.push({points:[...l]}),l=[]},d=e=>{let{fromRoom:t,toRoom:n,fromDir:r,toDir:i,customLineKey:a}=e;if(a){let e=t,r=t.customLines[a];if(r||(r=n.customLines[a],e=n),r){let t=[e.x,e.y];r.points.forEach(e=>{t.push(e.x,-e.y)}),s.push({points:t})}}r&&L.includes(r)&&o.push({room:t,direction:r}),i&&L.includes(i)&&o.push({room:n,direction:i})};for(let n=0;n<c.length-1;n++){let a=c[n],s=c[n+1],f=He(a,r,i),p=He(s,r,i);if(!f&&!p){u();continue}if(f&&p){let n=Be(e,a,s);switch(n.type){case`regular`:Ge(t,n,l);break;case`special`:Ke(n,l);break;case`inner`:u(),d(n);break;case`none`:l.length===0&&l.push(a.x,a.y),l.push(s.x,s.y);break}}else{let e=f?a:s,n=f?s:a,r=Ue(e,n);if(r){if(L.includes(r.direction))u(),o.push({room:e,direction:r.direction});else if(k.includes(r.direction)){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r.direction,t.roomSize/2),i=M(e.x,e.y,r.direction,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}else{let r=We(e,n);if(r){l.length===0&&l.push(e.x,e.y);let n=R(t,e.x,e.y,r,t.roomSize/2),i=M(e.x,e.y,r,t.roomSize);l.push(n.x,n.y,i.x,i.y),u()}}}}return u(),{segments:a,innerMarkers:o,customLines:s}}function Je(e,t,n){let r=1.425,i=n.roomSize;return{shape:n.roomShape===`circle`?`circle`:`rect`,cx:e.x,cy:e.y,size:i/2*r,cornerRadius:n.roomShape===`roundedRectangle`?i*r*.2:0,stroke:t,strokeWidth:.1,dash:[.05,.05]}}function Ye(e,t){let n=t.playerMarker,r=t.roomSize*n.sizeFactor,i=n.matchRoomShape&&t.roomShape!==`circle`;return{shape:i?`rect`:`circle`,cx:e.x,cy:e.y,size:r/2,cornerRadius:i&&t.roomShape===`roundedRectangle`?r*.2:0,strokeColor:n.strokeColor,strokeWidth:n.strokeWidth,strokeAlpha:n.strokeAlpha,fillColor:n.fillColor,fillAlpha:n.fillAlpha,dash:n.dash,dashEnabled:n.dashEnabled}}function Xe(e,t,n,r,i,a){let o=qe(e,t,n,i,a),s=t.lineWidth,c=t.roomSize/5,l=[];for(let e of o.segments)e.points.length>=4&&l.push({points:e.points});for(let e of o.customLines)e.points.length>=4&&l.push({points:e.points});let u=[];for(let e of o.innerMarkers){let t=e.direction===`up`?0:e.direction===`down`?180:e.direction===`in`?90:-90;u.push({vertices:P(e.room.x,e.room.y,c,t)})}return{segments:l,triangles:u,color:r,outlineWidth:s*8,lineWidth:s*4}}function Ze(e,t){let n=e.createGroup(0,0);if(t.shape===`circle`)e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:!0});else{let r=t.cx-t.size,i=t.cy-t.size,a=t.cx+t.size,o=t.cy+t.size,s=[[r,i,a,i],[a,i,a,o],[a,o,r,o],[r,o,r,i]];for(let r of s)e.addLine(n,{points:r,stroke:t.stroke,strokeWidth:t.strokeWidth,dash:t.dash,lineCap:`butt`})}return n}function Qe(e,t){let n=e.createGroup(0,0),r=_(t.strokeColor,t.strokeAlpha),i=t.fillAlpha>0?_(t.fillColor,t.fillAlpha):void 0;return t.shape===`circle`?e.addCircle(n,{cx:t.cx,cy:t.cy,radius:t.size,fill:i,stroke:r,strokeWidth:t.strokeWidth,dash:t.dash,dashEnabled:t.dashEnabled}):e.addRect(n,{x:t.cx-t.size,y:t.cy-t.size,width:t.size*2,height:t.size*2,fill:i,stroke:r,strokeWidth:t.strokeWidth,cornerRadius:t.cornerRadius,dash:t.dash,dashEnabled:t.dashEnabled}),n}function $e(e,t){let n=e.createGroup(0,0);for(let r of t.segments)e.addLine(n,{points:r.points,stroke:`black`,strokeWidth:t.outlineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8}),e.addLine(n,{points:r.points,stroke:t.color,strokeWidth:t.lineWidth,lineCap:`round`,lineJoin:`round`,alpha:.8});for(let r of t.triangles)e.addPolygon(n,{vertices:r.vertices,fill:t.color,stroke:`black`,strokeWidth:t.outlineWidth/4});return n}function et(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);return e.addLine(r,{points:t.line.points,stroke:t.line.stroke,strokeWidth:t.line.strokeWidth,dash:t.line.dash}),t.arrow&&e.addPolygon(r,{vertices:[t.arrow.tipX,t.arrow.tipY,t.arrow.x1,t.arrow.y1,t.arrow.x2,t.arrow.y2],fill:t.arrow.fill,stroke:t.arrow.stroke,strokeWidth:t.arrow.strokeWidth}),t.door&&e.addRect(r,{x:t.door.x,y:t.door.y,width:t.door.width,height:t.door.height,stroke:t.door.stroke,strokeWidth:t.door.strokeWidth}),r}function tt(e,t){let n=e.getExitDepthOffset(),r=e.createGroup(n.x,n.y);for(let n of t)e.addLine(r,{points:[n.x1,n.y1,n.x2,n.y2],stroke:n.stroke,strokeWidth:n.strokeWidth});return r}function nt(e,t){let n=e.createGroup(0,0);for(let r of t)e.addPolygon(n,{vertices:r.vertices,fill:r.fill,stroke:r.stroke,strokeWidth:r.strokeWidth});return n}function rt(e,t){let n=e.createGroup(0,0);return e.addImage(n,{x:t.cx-t.displaySize/2,y:t.cy-t.displaySize/2,width:t.displaySize,height:t.displaySize,src:t.src}),n}var it=class{constructor(e,t){this.rooms=[],this.labels=[],this.rooms=e,this.labels=t,this.bounds=this.createBounds()}getRooms(){return this.rooms}getLabels(){return this.labels}getBounds(){return this.bounds}createBounds(){let e=this.rooms.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0});for(let t of this.labels){let n=t.X,r=-t.Y;e.minX=Math.min(e.minX,n),e.maxX=Math.max(e.maxX,n+t.Width),e.minY=Math.min(e.minY,r),e.maxY=Math.max(e.maxY,r+t.Height)}return e}},z=class e{constructor(e){this.planes={},this.exits=new Map,this.version=0,this.area=e,this.planes=this.createPlanes(),this.createExits()}getAreaName(){return this.area.areaName}getAreaId(){return parseInt(this.area.areaId)}getVersion(){return this.version}markDirty(){this.version++}getPlane(e){return this.planes[e]}getPlanes(){return Object.values(this.planes)}getZLevels(){return Object.keys(this.planes).map(Number).sort((e,t)=>e-t)}getRooms(){return this.area.rooms}getFullBounds(){return this.getPlanes().reduce((e,t)=>{let n=t.getBounds();return{minX:Math.min(e.minX,n.minX),maxX:Math.max(e.maxX,n.maxX),minY:Math.min(e.minY,n.minY),maxY:Math.max(e.maxY,n.maxY)}},{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0})}getLinkExits(e){return Array.from(this.exits.values()).filter(t=>t.zIndex.includes(e))}createPlanes(){let e=this.area.rooms.reduce((e,t)=>(e[t.z]||(e[t.z]=[]),e[t.z].push(t),e),{});return Object.entries(e).reduce((e,[t,n])=>(e[+t]=new it(n,this.area.labels.filter(e=>e.Z===+t)),e),{})}static{this.oppositeDir={north:`south`,south:`north`,east:`west`,west:`east`,northeast:`southwest`,southwest:`northeast`,northwest:`southeast`,southeast:`northwest`,up:`down`,down:`up`,in:`out`,out:`in`}}createExits(){let t=new Map;this.area.rooms.forEach(e=>{Object.entries(e.exits).forEach(([n,r])=>{if(e.id===r)return;let i=`${Math.min(e.id,r)}-${Math.max(e.id,r)}`;t.has(i)||t.set(i,[]),t.get(i).push({origin:e.id,target:r,z:e.z,dir:n})})});for(let[n,r]of t){let[t,i]=n.split(`-`),a=parseInt(t),o=parseInt(i),s=r.filter(e=>e.origin===a),c=r.filter(e=>e.origin===o),l=new Set;for(let t of s){let r=-1;for(let n=0;n<c.length;n++)if(!l.has(n)){if(c[n].dir===e.oppositeDir[t.dir]){r=n;break}r===-1&&(r=n)}if(r!==-1){l.add(r);let e=c[r];this.exits.set(`${n}-${t.dir}`,{a,b:o,aDir:t.dir,bDir:e.dir,zIndex:[t.z,e.z]})}else this.exits.set(`${n}-a:${t.dir}`,{a,b:o,aDir:t.dir,zIndex:[t.z]})}for(let e=0;e<c.length;e++)if(!l.has(e)){let t=c[e];this.exits.set(`${n}-b:${t.dir}`,{a,b:o,bDir:t.dir,zIndex:[t.z]})}}}},at=class extends it{constructor(e,t){super(e.getRooms(),e.getLabels()),this.basePlane=e,this.visitedRooms=t}getRooms(){return this.basePlane.getRooms().filter(e=>this.visitedRooms.has(e.id))}getLabels(){return this.basePlane.getLabels()}getBounds(){let e=this.getRooms();return e.length?e.reduce((e,t)=>({minX:Math.min(e.minX,t.x),maxX:Math.max(e.maxX,t.x),minY:Math.min(e.minY,t.y),maxY:Math.max(e.maxY,t.y)}),{minX:1/0,maxX:-1/0,minY:1/0,maxY:-1/0}):this.basePlane.getBounds()}},B=class extends z{constructor(e,t){super(e),this.planeCache=new WeakMap,this.visitedRooms=t instanceof Set?t:new Set(t??[]),this.areaRoomIds=new Set(e.rooms.map(e=>e.id))}getPlane(e){let t=super.getPlane(e);if(!t)return t;let n=this.planeCache.get(t);return n||(n=new at(t,this.visitedRooms),this.planeCache.set(t,n)),n}getPlanes(){return super.getPlanes().map(e=>{let t=this.planeCache.get(e);return t||(t=new at(e,this.visitedRooms),this.planeCache.set(e,t)),t})}getLinkExits(e){return super.getLinkExits(e).filter(e=>this.visitedRooms.has(e.a)||this.visitedRooms.has(e.b))}getVisitedRoomCount(){return super.getRooms().reduce((e,t)=>e+ +!!this.visitedRooms.has(t.id),0)}getTotalRoomCount(){return this.areaRoomIds.size}hasVisitedRoom(e){return this.areaRoomIds.has(e)&&this.visitedRooms.has(e)}getVisitedRoomIds(){return super.getRooms().filter(e=>this.visitedRooms.has(e.id)).map(e=>e.id)}addVisitedRoom(e){let t=this.visitedRooms.has(e);this.visitedRooms.add(e);let n=!t&&this.areaRoomIds.has(e);return n&&this.markDirty(),n}addVisitedRooms(e){let t=0;for(let n of e){let e=this.visitedRooms.has(n);this.visitedRooms.add(n),!e&&this.areaRoomIds.has(n)&&t++}return t>0&&this.markDirty(),t}},V=`rgb(120, 72, 0)`,ot=class{get coordinateTransform(){return this._coordinateTransform}constructor(e,t,n){this.highlightShapes=new Map,this.pathShapes=[],this.currentRoomOverlay=[],this.areaExitHitZones=[],this.destroyed=!1,this._coordinateTransform=b,this.coordinateInverse=b,this.liveEffects=new Map,this.sceneOverlays=new Map,this.sceneOverlayNodes=new Map,this.viewportSubscribers=new Set,this.state=e,this.container=t,t?(this.stage=new l.default.Stage({container:t,width:t.clientWidth,height:t.clientHeight,draggable:!1}),t.style.backgroundColor=e.settings.backgroundColor,this.viewport=new je(t.clientWidth,t.clientHeight)):(this.stage=new l.default.Stage({width:1,height:1}),this.viewport=new je(1,1)),this.gridLayer=new l.default.Layer({listening:!1}),this.stage.add(this.gridLayer),this.linkLayer=new l.default.Layer({listening:!1}),this.stage.add(this.linkLayer),this.roomLayer=new l.default.Layer({listening:!1}),this.stage.add(this.roomLayer),this.positionLayer=new l.default.Layer({listening:!1}),this.stage.add(this.positionLayer),this.overlayLayer=new l.default.Layer({listening:!1}),this.stage.add(this.overlayLayer),this.drawingBackend=n??new Le,this.positionLayerNode=new ze(this.positionLayer),this.overlayLayerNode=new ze(this.overlayLayer);let r=new I(this.roomLayer),i=new I(this.linkLayer);if(this.pipeline=new Oe(e.mapReader,e.settings,this.drawingBackend,{gridLayer:new I(this.gridLayer),linkLayer:i,roomLayer:r}),this.events=new v(t),this.culling=new Ne(this.stage,r,i,e.settings),this.viewport.onChange=()=>this.applyViewportToStage(),t){this.origSetSize=this.viewport.setSize.bind(this.viewport);let n=this.origSetSize;this.viewport.setSize=(e,t)=>{n(e,t),this.stage.width(e),this.stage.height(t)},this.interactionHandler=new Pe(t,this.viewport,e,e.settings,{clientToMapPoint:(e,n)=>this.viewport.clientToMapPoint(e,n,t.getBoundingClientRect()),findRoomAtPoint:(e,t)=>this.culling.findRoomAtMapPoint(e,t),getAreaExitHitZones:()=>this.areaExitHitZones,renderedToMapPoint:(e,t)=>this.coordinateInverse(e,t)},this.events)}this.applyDrawingBackendTransforms(this.drawingBackend),this.subscribeToState(e)}setDrawingBackend(e){this.drawingBackend=e,this.pipeline=new Oe(this.state.mapReader,this.state.settings,e,{gridLayer:new I(this.gridLayer),linkLayer:new I(this.linkLayer),roomLayer:new I(this.roomLayer)}),this.applyDrawingBackendTransforms(e)}applyDrawingBackendTransforms(e){let t=e.getTransform(),n=e.getInverseTransform(),r=this.coordinateInverse;this._coordinateTransform=t,this.coordinateInverse=n,this.culling.setCoordinateTransform(t),this.pipeline.gridRenderer.setInverseTransform(n);let i=this.viewport.getScale(),a=this.viewport.width/2,o=this.viewport.height/2,s=r((a-this.viewport.position.x)/i,(o-this.viewport.position.y)/i),c=t(s.x,s.y);this.viewport.position={x:a-c.x*i,y:o-c.y*i},this.applyViewportToStage()}mapPoint(e,t){return this._coordinateTransform(e,t)}get exitRenderer(){return this.pipeline.exitRenderer}get roomShapeRenderer(){return this.pipeline.roomShapeRenderer}get gridRenderer(){return this.pipeline.gridRenderer}destroy(){if(!this.destroyed){this.destroyed=!0,this.state.events.removeAllListeners(),this.interactionHandler?.destroy();for(let e of this.liveEffects.values())e.destroy();this.liveEffects.clear();for(let e of this.sceneOverlays.values())e.detach?.();this.sceneOverlays.clear();for(let e of this.sceneOverlayNodes.values())for(let t of e)t.destroy();this.sceneOverlayNodes.clear(),this.viewportSubscribers.clear(),this.viewport.cancelAnimation(),this.origSetSize&&(this.viewport.setSize=this.origSetSize),this.viewport.onChange=void 0,this.clearOverlayShapes(),this.clearCurrentRoomOverlay(),this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.stage.destroy(),this.events.removeAllListeners()}}updateBackground(){this.container&&(this.container.style.backgroundColor=this.state.settings.backgroundColor)}exportCanvas(e){if(this.state.currentArea===void 0||this.state.currentZIndex===void 0)return;let t=this.stage.toCanvas({pixelRatio:e?.pixelRatio??1}),n=document.createElement(`canvas`);n.width=t.width,n.height=t.height;let r=n.getContext(`2d`);return r.fillStyle=this.state.settings.backgroundColor,r.fillRect(0,0,n.width,n.height),r.drawImage(t,0,0),n}applyViewportToStage(){let e=this.viewport.getScale();this.stage.scale({x:e,y:e}),this.stage.position(this.viewport.position),this.stage.batchDraw(),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.scheduleCulling();let t=this.viewport.getViewportBounds();for(let e of this.viewportSubscribers)e();for(let n of this.liveEffects.values())n.updateViewport(t,e,this.coordinateTransform)}toCanvas(e){let{currentArea:t,currentZIndex:n,currentAreaInstance:r}=this.state;if(t===void 0||n===void 0||!r)return;let i=r,a=i.getPlane(n);if(!a)return;let{width:o,height:s}=e,c=e.padding??3,u=this.viewport.width,d=this.viewport.height,f=this.viewport.zoom,p=this.viewport.minZoom,m={...this.viewport.position},h=this.viewport.onChange;this.viewport.onChange=void 0;let g=this.state.computeExportBounds(i,a,e.roomId,c),_=this._coordinateTransform,v=_(g.x,g.y),y=_(g.x+g.w,g.y),b=_(g.x+g.w,g.y+g.h),x=_(g.x,g.y+g.h),S=Math.min(v.x,y.x,b.x,x.x),ee=Math.max(v.x,y.x,b.x,x.x),C=Math.min(v.y,y.y,b.y,x.y),w=Math.max(v.y,y.y,b.y,x.y),T={x:S,y:C,w:ee-S,h:w-C},E=o/T.w,D=s/T.h,O=Math.min(E,D),te=T.w*O,ne=T.h*O,re=(o-te)/2,ie=(s-ne)/2,ae={x:re-T.x*O,y:ie-T.y*O};this.viewport.width=o,this.viewport.height=s,this.viewport.zoom=O/(this.viewport.getScale()/this.viewport.zoom),this.viewport.position=ae,this.stage.width(o),this.stage.height(s),this.stage.scale({x:O,y:O}),this.stage.position(ae),this.pipeline.gridRenderer.render(this.viewport.getViewportBounds()),this.culling.updateCulling();let k=new l.default.Layer({listening:!1});k.scale({x:1/O,y:1/O}),k.position({x:-(re-T.x*O)/O,y:-(ie-T.y*O)/O}),k.add(new l.default.Rect({x:0,y:0,width:o,height:s,fill:this.state.settings.backgroundColor})),this.stage.add(k),k.moveToBottom();let oe=this.stage.toCanvas({width:o,height:s});return k.destroy(),this.viewport.width=u,this.viewport.height=d,this.viewport.zoom=f,this.viewport.minZoom=p,this.viewport.position=m,this.viewport.onChange=h,this.stage.width(u),this.stage.height(d),this.applyViewportToStage(),this.culling.updateCulling(),oe}refresh(){let{currentAreaInstance:e,currentZIndex:t,positionRoomId:n}=this.state;if(!e||t===void 0)return;let r=e.getPlane(t);if(!r)return;this.updateBackground();let i=this.buildScene(e,r,t,this.viewport.getViewportBounds());this.onSceneBuilt(i),this.syncHighlights(),this.syncPaths(),n!==void 0&&this.onPositionChanged(n,!1,!1);for(let[e,t]of this.sceneOverlays)this.renderSceneOverlay(e,t)}addLiveEffect(e,t){this.removeLiveEffect(e),t.attach(this.overlayLayer),this.liveEffects.set(e,t),t.updateViewport(this.viewport.getViewportBounds(),this.viewport.getScale(),this.coordinateTransform)}removeLiveEffect(e){let t=this.liveEffects.get(e);t&&(t.destroy(),this.liveEffects.delete(e))}addSceneOverlay(e,t){let n=this.sceneOverlays.get(e);n&&(n.detach?.(),this.clearSceneOverlayNodes(e)),this.sceneOverlays.set(e,t),t.attach?.(this.createOverlayContext(e,t)),this.renderSceneOverlay(e,t)}removeSceneOverlay(e){let t=this.sceneOverlays.get(e);t&&(t.detach?.(),this.sceneOverlays.delete(e),this.clearSceneOverlayNodes(e),this.overlayLayer.batchDraw())}getSceneOverlays(){return this.sceneOverlays.values()}createOverlayContext(e,t){return{state:this.state,onViewportChange:e=>(this.viewportSubscribers.add(e),()=>this.viewportSubscribers.delete(e)),invalidate:()=>{this.sceneOverlays.get(e)===t&&this.renderSceneOverlay(e,t)}}}renderSceneOverlay(e,t){this.clearSceneOverlayNodes(e);let n=this.viewport.getViewportBounds(),r=t.render(this.drawingBackend,this.state,n);if(r){let t=Array.isArray(r)?r:[r],n=[];for(let e of t)this.overlayLayerNode.addNode(e),n.push(e);this.sceneOverlayNodes.set(e,n)}this.overlayLayer.batchDraw()}clearSceneOverlayNodes(e){let t=this.sceneOverlayNodes.get(e);if(t){for(let e of t)e.destroy();this.sceneOverlayNodes.delete(e)}}subscribeToState(e){e.events.on(`area`,()=>{this.refresh()}),e.events.on(`position`,({roomId:e,center:t,areaChanged:n})=>{this.onPositionChanged(e,t,n)}),e.events.on(`center`,({roomId:t,instant:n})=>{let r=e.mapReader.getRoom(t);if(r){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}}),e.events.on(`highlight`,({roomId:e,color:t})=>{this.syncHighlight(e,t)}),e.events.on(`path`,()=>{this.syncPaths()}),e.events.on(`clear`,()=>{this.syncHighlights()})}buildScene(e,t,n,r){this.positionLayer.destroyChildren(),this.positionMarker=void 0,this.clearOverlayShapes(),this.currentRoomOverlay=[];let i=this.pipeline.buildScene(e,t,n,r);return this.lastBuildResult=i,i}onSceneBuilt(e){this.culling.clear(),this.areaExitHitZones=[],this.culling.computeBucketSize();let t=this.viewport.getScale();this.stage.scale({x:t,y:t});for(let[,t]of e.roomNodes)this.culling.roomNodes.set(t.room.id,t),this.culling.addRoomToSpatialIndex(t);for(let t of e.standaloneExitNodes)this.culling.standaloneExitNodes.push(t),this.culling.addStandaloneExitToSpatialIndex(t);this.culling.setExitBoundsRoomSize(),this.areaExitHitZones=e.areaExitHitZones,this.culling.updateCulling(),this.stage.batchDraw()}onPositionChanged(e,t,n){if(e===void 0){this.positionMarker&&=(this.positionMarker.destroy(),void 0),this.positionLayerNode.batchDraw(),this.clearCurrentRoomOverlay(),this.overlayLayerNode.batchDraw();return}let r=this.state.mapReader.getRoom(e);if(r){if(t){let e=this.mapPoint(r.x,r.y);this.viewport.panToMapPointAnimated(e.x,e.y,n||this.state.settings.instantMapMove)}this.updateCurrentRoomOverlay(r),this.applyPositionMarker(r)}}applyPositionMarker(e){this.positionMarker&&this.positionMarker.destroy();let t=Ye(e,this.state.settings);this.positionMarker=Qe(this.drawingBackend,t),this.positionLayerNode.addNode(this.positionMarker)}clearCurrentRoomOverlay(){this.currentRoomOverlay.forEach(e=>e.destroy()),this.currentRoomOverlay=[],this.positionLayerNode.batchDraw()}updateCurrentRoomOverlay(e){if(this.clearCurrentRoomOverlay(),e.area!==this.state.currentArea||e.z!==this.state.currentZIndex){this.positionLayerNode.batchDraw();return}let t=this.state.settings;if(!t.highlightCurrentRoom){this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw();return}let n=new Map;n.set(e.id,e);let r=[],i=this.pipeline.exitRenderer,a=this.state.currentAreaInstance instanceof B?this.state.currentAreaInstance:void 0;this.state.currentAreaInstance&&this.state.currentZIndex!==void 0&&this.state.currentAreaInstance.getLinkExits(this.state.currentZIndex).filter(t=>t.a===e.id||t.b===e.id).forEach(e=>{let t=i.renderDataWithColor(e,V,this.state.currentZIndex);t&&r.push(this.pipeline.renderExitData(t))});for(let n of ve(e,t,V))r.push(et(this.drawingBackend,n));let o=ge(e,t,V);o.length>0&&r.push(tt(this.drawingBackend,o)),[...Object.values(e.exits),...Object.values(e.specialExits)].forEach(e=>{let t=this.state.mapReader.getRoom(e),r=!a||a.hasVisitedRoom(e);t&&t.area===this.state.currentArea&&t.z===this.state.currentZIndex&&r&&n.set(e,t)}),r.forEach(e=>{this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}),n.forEach((n,r)=>{let i=r===e.id,a=this.pipeline.roomShapeRenderer.createRoomGroup(n,{strokeOverride:i?V:t.lineColor});this.positionLayerNode.addNode(a),this.currentRoomOverlay.push(a)}),n.forEach(e=>{let{triangles:n}=Se(e,this.state.mapReader,t);if(n.length>0){let e=nt(this.drawingBackend,n);this.positionLayerNode.addNode(e),this.currentRoomOverlay.push(e)}}),this.positionMarker&&this.positionMarker.moveToTop(),this.positionLayerNode.batchDraw()}syncHighlight(e,t){let n=this.highlightShapes.get(e);if(n&&(n.destroy(),this.highlightShapes.delete(e)),t!==void 0){let n=this.state.mapReader.getRoom(e);if(n&&n.area===this.state.currentArea&&n.z===this.state.currentZIndex){let r=Je(n,t,this.state.settings),i=Ze(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}}this.overlayLayerNode.batchDraw()}syncHighlights(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear();for(let[e,t]of this.state.highlights){if(t.area!==this.state.currentArea||t.z!==this.state.currentZIndex)continue;let n=this.state.mapReader.getRoom(e);if(!n)continue;let r=Je(n,t.color,this.state.settings),i=Ze(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.highlightShapes.set(e,i)}this.overlayLayerNode.batchDraw()}syncPaths(){this.clearPathShapes();let{currentArea:e,currentZIndex:t}=this.state;if(!(e===void 0||t===void 0)){for(let n of this.state.paths){let r=Xe(this.state.mapReader,this.state.settings,n.locations,n.color,e,t),i=$e(this.drawingBackend,r);this.overlayLayerNode.addNode(i),this.pathShapes.push(i)}this.overlayLayerNode.batchDraw()}}clearOverlayShapes(){for(let e of this.highlightShapes.values())e.destroy();this.highlightShapes.clear(),this.clearPathShapes()}clearPathShapes(){for(let e of this.pathShapes)e.destroy();this.pathShapes=[]}},st=class{get settings(){return this.state.settings}constructor(e,t,n,r){this.currentStyle=S,this.state=new y(e,t??p()),this.backend=r?r(this.state):new ot(this.state,n)}destroy(){this.backend.destroy()}drawArea(e,t){this.state.setArea(e,t)}getCurrentArea(){return this.state.currentAreaInstance}setPosition(e,t=!0){this.state.setPosition(e,t)}updatePositionMarker(e){this.state.updatePositionMarker(e)}clearPosition(){this.state.clearPosition()}centerOn(e,t){this.state.setCenterRoom(e,t)}renderHighlight(e,t){this.state.addHighlight(e,t)}removeHighlight(e){this.state.removeHighlight(e)}hasHighlight(e){return this.state.hasHighlight(e)}clearHighlights(){this.state.clearHighlights()}renderPath(e,t){this.state.addPath(e,t)}clearPaths(){this.state.clearPaths()}refreshCurrentRoomOverlay(){this.state.refreshPosition()}setStyle(e){this.currentStyle=e,this.backend.setDrawingBackend(e(new Le))}clearStyle(){this.setStyle(S)}getStyle(){return this.currentStyle}updateBackground(){this.backend.updateBackground()}refresh(){this.backend.updateBackground(),this.backend.refresh()}addSceneOverlay(e,t){this.backend.addSceneOverlay(e,t)}removeSceneOverlay(e){this.backend.removeSceneOverlay(e)}addLiveEffect(e,t){this.backend.addLiveEffect(e,t)}removeLiveEffect(e){this.backend.removeLiveEffect(e)}export(e){let t={state:this.state,backend:this.backend,style:this.currentStyle,sceneOverlays:this.backend.getSceneOverlays()};return e.render(t)}on(e,t){this.backend.events.on(e,t)}off(e,t){this.backend.events.off(e,t)}setZoom(e){return this.backend.viewport.setZoom(e)}zoomToCenter(e){return this.backend.viewport.zoomToCenter(e)}getZoom(){return this.backend.viewport.zoom}getViewportBounds(){return this.backend.viewport.getViewportBounds()}getAreaBounds(){if(!this.state.currentAreaInstance||this.state.currentZIndex===void 0)return null;let e=this.state.currentAreaInstance.getPlane(this.state.currentZIndex);if(!e)return null;let t=this.state.getEffectiveBounds(this.state.currentAreaInstance,e),n=this.state.settings.areaName&&this.state.currentAreaInstance.getAreaName(),r={minX:n?t.minX-4:t.minX,maxX:t.maxX,minY:n?t.minY-7:t.minY,maxY:t.maxY},i=this.backend.coordinateTransform,a=i(r.minX,r.minY),o=i(r.maxX,r.minY),s=i(r.maxX,r.maxY),c=i(r.minX,r.maxY);return{minX:Math.min(a.x,o.x,s.x,c.x),maxX:Math.max(a.x,o.x,s.x,c.x),minY:Math.min(a.y,o.y,s.y,c.y),maxY:Math.max(a.y,o.y,s.y,c.y)}}fitArea(e){let t=this.getAreaBounds();t&&this.backend.viewport.fitToMapBounds(t.minX,t.maxX,t.minY,t.maxY,e)}get centerOnResize(){return this.backend.viewport.centerOnResize}set centerOnResize(e){this.backend.viewport.centerOnResize=e}get minZoom(){return this.backend.viewport.minZoom}set minZoom(e){this.backend.viewport.minZoom=e}setCullingMode(e){this.state.settings.cullingMode=e,this.state.settings.cullingEnabled=e!==`none`,this.backend.culling.scheduleCulling()}getCullingMode(){return this.state.settings.cullingMode}};function H(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}function U(e,t){return t===void 0?``:` ${e}="${typeof t==`string`?H(t):t}"`}function ct(e,t){return!e||t===!1?``:` stroke-dasharray="${e.join(` `)}"`}var W=class{constructor(e,t){this.elements=[],this.visible=!0,this.x=e,this.y=t}setVisible(e){this.visible=e}isVisible(){return this.visible}destroy(){this.elements.length=0}setPosition(e,t){}getPosition(){return{x:this.x,y:this.y}}moveToTop(){}toSvg(){return!this.visible||this.elements.length===0?``:this.x===0&&this.y===0?this.elements.join(`
2
2
  `):`<g transform="translate(${this.x},${this.y})">\n${this.elements.join(`
3
3
  `)}\n</g>`}},G=class{constructor(){this.groups=[]}addNode(e){e instanceof W&&this.groups.push(e)}destroyChildren(){this.groups=[]}batchDraw(){}toSvg(){return this.groups.filter(e=>e.isVisible()).map(e=>e.toSvg()).filter(e=>e.length>0).join(`
4
4
  `)}},lt=class{createGroup(e,t){return new W(e,t)}addRect(e,t){if(!(e instanceof W))return;let n=t.fill??`none`,r=`<rect${U(`x`,t.x)}${U(`y`,t.y)}${U(`width`,t.width)}${U(`height`,t.height)}${U(`fill`,n)}${U(`stroke`,t.stroke)}${U(`stroke-width`,t.strokeWidth)}${t.cornerRadius?`${U(`rx`,t.cornerRadius)}${U(`ry`,t.cornerRadius)}`:``}${ct(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addCircle(e,t){if(!(e instanceof W))return;let n=t.fill??`none`,r=`<circle${U(`cx`,t.cx)}${U(`cy`,t.cy)}${U(`r`,t.radius)}${U(`fill`,n)}${U(`stroke`,t.stroke)}${U(`stroke-width`,t.strokeWidth)}${ct(t.dash,t.dashEnabled)}/>`;e.elements.push(r)}addLine(e,t){if(!(e instanceof W))return;let n=t.points,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polyline points="${r.join(` `)}"${U(`stroke`,t.stroke)}${U(`stroke-width`,t.strokeWidth)}${ct(t.dash)}${U(`stroke-linecap`,t.lineCap)}${U(`stroke-linejoin`,t.lineJoin)}${U(`opacity`,t.alpha)} fill="none"/>`;e.elements.push(i)}addPolygon(e,t){if(!(e instanceof W))return;let n=t.vertices,r=[];for(let e=0;e<n.length;e+=2)r.push(`${n[e]},${n[e+1]}`);let i=`<polygon points="${r.join(` `)}"${U(`fill`,t.fill)}${U(`stroke`,t.stroke)}${U(`stroke-width`,t.strokeWidth)}/>`;e.elements.push(i)}addText(e,t){if(!(e instanceof W))return;let n=t.x,r=t.y,i=`start`,a=`auto`;t.width!==void 0&&(t.align===`center`?(n=t.x+t.width/2,i=`middle`):t.align===`right`&&(n=t.x+t.width,i=`end`)),t.height!==void 0&&t.verticalAlign===`middle`?t.baselineRatio===void 0?(r=t.y+t.height/2,a=`central`):r=t.y+t.height/2+t.baselineRatio*t.fontSize:t.offsetY&&(r-=t.offsetY);let o=t.transform?` transform="matrix(${t.transform.join(`,`)})"`:``,s=`<text${U(`x`,n)}${U(`y`,r)}${U(`font-size`,t.fontSize)}${t.fontFamily?U(`font-family`,t.fontFamily):``}${t.fontStyle===`bold`?` font-weight="bold"`:``}${U(`fill`,t.fill)} text-anchor="${i}" dominant-baseline="${a}"${o}>${H(t.text)}</text>`;e.elements.push(s)}addImage(e,t){if(e instanceof W)if(t.transform){let[n,r,i,a,o,s]=t.transform,c=`<image${U(`width`,t.width)}${U(`height`,t.height)} href="${H(t.src)}" transform="matrix(${n},${r},${i},${a},${o},${s})"/>`;e.elements.push(c)}else{let n=`<image${U(`x`,t.x)}${U(`y`,t.y)}${U(`width`,t.width)}${U(`height`,t.height)} href="${H(t.src)}"/>`;e.elements.push(n)}}getExitDepthOffset(){return{x:0,y:0}}getTransform(){return b}getInverseTransform(){return b}},ut=`#4a3728`,dt=`#3b2a1a`,ft=139,pt=115,mt=85,ht=244,gt=228,_t=193;function vt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function yt(e){let t=vt(e);if(!t)return`rgb(${ht}, ${gt}, ${_t})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(ft+(ht-ft)*n),i=Math.round(pt+(gt-pt)*n),a=Math.round(mt+(_t-mt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function K(e){let t=vt(e);if(!t||t.a>=1)return ut;let n=vt(ut);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var bt=class extends x{addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?yt(t.fill):void 0,stroke:t.stroke?K(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?yt(t.fill):void 0,stroke:t.stroke?K(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?K(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?yt(t.fill):void 0,stroke:t.stroke?K(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:dt})}},xt=`#c0deff`,St=`#e0f0ff`,Ct=20,wt=40,Tt=80,Et=60,Dt=100,Ot=160;function kt(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function At(e){let t=kt(e);if(!t)return`rgb(${Et}, ${Dt}, ${Ot})`;let n=(.299*t.r+.587*t.g+.114*t.b)/255,r=Math.round(Ct+(Et-Ct)*n),i=Math.round(wt+(Dt-wt)*n),a=Math.round(Tt+(Ot-Tt)*n);return t.a<1?`rgba(${r}, ${i}, ${a}, ${t.a})`:`rgb(${r}, ${i}, ${a})`}function q(e){let t=kt(e);if(!t||t.a>=1)return xt;let n=kt(xt);return`rgba(${n.r}, ${n.g}, ${n.b}, ${t.a})`}var jt=class extends x{addRect(e,t){this.inner.addRect(e,{...t,fill:t.fill?At(t.fill):void 0,stroke:t.stroke?q(t.stroke):void 0})}addCircle(e,t){this.inner.addCircle(e,{...t,fill:t.fill?At(t.fill):void 0,stroke:t.stroke?q(t.stroke):void 0})}addLine(e,t){this.inner.addLine(e,{...t,stroke:t.stroke?q(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?At(t.fill):void 0,stroke:t.stroke?q(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:St})}},Mt=`#00ffd0`,Nt=.3,Pt=3;function Ft(e){let t=e.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:\s*,\s*([\d.]+))?\s*\)/);return t?{r:parseInt(t[1]),g:parseInt(t[2]),b:parseInt(t[3]),a:t[4]===void 0?1:parseFloat(t[4])}:e.startsWith(`#`)&&e.length>=7?{r:parseInt(e.slice(1,3),16),g:parseInt(e.slice(3,5),16),b:parseInt(e.slice(5,7),16),a:1}:null}function It(e,t,n){e/=255,t/=255,n/=255;let r=Math.max(e,t,n),i=Math.min(e,t,n),a=(r+i)/2;if(r===i)return[0,0,a];let o=r-i,s=a>.5?o/(2-r-i):o/(r+i),c;return c=r===e?((t-n)/o+(t<n?6:0))/6:r===t?((n-e)/o+2)/6:((e-t)/o+4)/6,[c*360,s,a]}function Lt(e,t,n,r=1){e=(e%360+360)%360;let i=(1-Math.abs(2*n-1))*t,a=i*(1-Math.abs(e/60%2-1)),o=n-i/2,s,c,l;e<60?(s=i,c=a,l=0):e<120?(s=a,c=i,l=0):e<180?(s=0,c=i,l=a):e<240?(s=0,c=a,l=i):e<300?(s=a,c=0,l=i):(s=i,c=0,l=a);let u=Math.round((s+o)*255),d=Math.round((c+o)*255),f=Math.round((l+o)*255);return r<1?`rgba(${u}, ${d}, ${f}, ${r})`:`rgb(${u}, ${d}, ${f})`}function Rt(e){let t=Ft(e);if(!t)return{neon:`#00ff88`,h:150,s:1,a:1};let[n,,]=It(t.r,t.g,t.b);return{neon:Lt(n,.95,.65,t.a),h:n,s:.95,a:t.a}}function J(e){let t=Ft(e);if(!t)return`rgb(8, 12, 10)`;let[n,,]=It(t.r,t.g,t.b);return Lt(n,.4,.1,t.a)}function zt(e){let{h:t,a:n}=Rt(e);return Lt(t,.95,.65,Math.min(n,Nt))}function Y(e){let{neon:t}=Rt(e);return t}var Bt=class extends x{addRect(e,t){if(t.stroke){let n=(t.strokeWidth??1)*Pt;this.inner.addRect(e,{...t,fill:void 0,stroke:zt(t.stroke),strokeWidth:n})}this.inner.addRect(e,{...t,fill:t.fill?J(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addCircle(e,t){if(t.stroke){let n=(t.strokeWidth??1)*Pt;this.inner.addCircle(e,{...t,fill:void 0,stroke:zt(t.stroke),strokeWidth:n})}this.inner.addCircle(e,{...t,fill:t.fill?J(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addLine(e,t){if(t.stroke){let n=(t.strokeWidth??1)*Pt;this.inner.addLine(e,{...t,stroke:zt(t.stroke),strokeWidth:n,alpha:Nt})}this.inner.addLine(e,{...t,stroke:t.stroke?Y(t.stroke):void 0})}addPolygon(e,t){this.inner.addPolygon(e,{...t,fill:t.fill?J(t.fill):void 0,stroke:t.stroke?Y(t.stroke):void 0})}addText(e,t){this.inner.addText(e,{...t,fill:Mt})}};function X(e){let t=e|0||1;return()=>(t=t*1664525+1013904223|0,(t>>>0)/4294967296)}function Z(...e){let t=2654435769;for(let n of e)t^=(n*1e3|0)+2654435769+(t<<6)+(t>>2);return t}function Vt(e,t,n,r,i,a){let o=n-e,s=r-t,c=Math.sqrt(o*o+s*s);if(c<.001)return[e,t,n,r];let l=-s/c,u=o/c,d=Math.max(2,Math.min(6,Math.ceil(c/.15))),f=[e+l*(a()-.5)*i*.3,t+u*(a()-.5)*i*.3];for(let n=1;n<d;n++){let r=n/d,c=e+o*r,p=t+s*r,m=(a()-.5)*2*i;f.push(c+l*m,p+u*m)}return f.push(n+l*(a()-.5)*i*.3,r+u*(a()-.5)*i*.3),f}function Ht(e,t,n){if(e.length<4)return e;let r=[];for(let i=0;i<e.length-2;i+=2){let a=Vt(e[i],e[i+1],e[i+2],e[i+3],t,n);if(i===0)r.push(...a);else for(let e=2;e<a.length;e++)r.push(a[e])}return r}function Ut(e,t,n,r,i,a){let o=[e,t,e+n,t,e+n,t+r,e,t+r],s=[];for(let e=0;e<4;e++){let t=o[e*2],n=o[e*2+1],r=(e+1)%4,c=o[r*2],l=o[r*2+1],u=Vt(t,n,c,l,i,a);for(let e=0;e<u.length-2;e++)s.push(u[e])}return s}function Wt(e,t,n,r,i){let a=[];for(let o=0;o<24;o++){let s=o/24*Math.PI*2,c=n+(i()-.5)*2*r;a.push(e+Math.cos(s)*c,t+Math.sin(s)*c)}return a}function Gt(e,t,n){let r=e.length/2;if(r<2)return e;let i=[];for(let a=0;a<r;a++){let o=e[a*2],s=e[a*2+1],c=(a+1)%r,l=e[c*2],u=e[c*2+1],d=Vt(o,s,l,u,t,n);for(let e=0;e<d.length-2;e++)i.push(d[e])}return i}var Kt=class extends x{constructor(e,t,n){super(e),this.jitter=t,this.pencil=n}applyPencilWithAlpha(e){if(!e)return this.pencil;let t=e.match(/^rgba\(.+,\s*([\d.]+)\s*\)$/);if(!t)return this.pencil;let n=parseFloat(t[1]);return n>=1?this.pencil:`rgba(${parseInt(this.pencil.slice(1,3),16)}, ${parseInt(this.pencil.slice(3,5),16)}, ${parseInt(this.pencil.slice(5,7),16)}, ${n})`}addRect(e,t){let n=this.jitter,r=this.pencil,i=X(Z(t.x,t.y,t.width,t.height)),a=t.fill?`#ffffff`:void 0,o=t.stroke?r:void 0;if(t.cornerRadius&&t.cornerRadius>0){if(a&&this.inner.addRect(e,{...t,fill:a,stroke:void 0,strokeWidth:0}),o&&t.strokeWidth){let r=Ut(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:r,stroke:o,strokeWidth:t.strokeWidth})}return}let s=Ut(t.x,t.y,t.width,t.height,n,i);this.inner.addPolygon(e,{vertices:s,fill:a,stroke:o,strokeWidth:t.strokeWidth??0})}addCircle(e,t){let n=this.jitter,r=this.pencil,i=X(Z(t.cx,t.cy,t.radius)),a=Wt(t.cx,t.cy,t.radius,n,i);this.inner.addPolygon(e,{vertices:a,fill:t.fill?`#ffffff`:void 0,stroke:t.stroke?r:void 0,strokeWidth:t.strokeWidth??0})}addLine(e,t){let n=this.jitter,r=X(Z(...t.points.slice(0,4))),i=Ht(t.points,n,r),a=this.applyPencilWithAlpha(t.stroke);this.inner.addLine(e,{...t,points:i,stroke:a})}addPolygon(e,t){let n=this.jitter,r=this.pencil,i=X(Z(...t.vertices.slice(0,4))),a=Gt(t.vertices,n,i);this.inner.addPolygon(e,{...t,vertices:a,fill:t.fill?r:void 0,stroke:t.stroke?r:void 0})}addText(e,t){this.inner.addText(e,{...t,fill:this.pencil})}};function qt(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n-t*r,(e*r+t*n)*.5]}function Jt(e){let t=e*Math.PI/180,n=Math.cos(t),r=Math.sin(t);return(e,t)=>[e*n+2*t*r,-e*r+2*t*n]}var Q=32,Yt=class extends x{constructor(e,t){if(super(e),typeof t==`number`)this.depth=t,this.iso=qt(0),this.isoInv=Jt(0);else{let e=t?.rotation??0;this.depth=t?.depth??.18,this.iso=qt(e),this.isoInv=Jt(e)}}ix(e,t){return this.iso(e,t)[0]}iy(e,t){return this.iso(e,t)[1]}isoFlatPoints(e){let t=Array(e.length);for(let n=0;n<e.length;n+=2){let[r,i]=this.iso(e[n],e[n+1]);t[n]=r,t[n+1]=i}return t}rectToDiamond(e,t,n,r){let i=this.iso,[a,o]=i(e,t),[s,c]=i(e+n,t),[l,u]=i(e+n,t+r),[d,f]=i(e,t+r);return[a,o,s,c,l,u,d,f]}createGroup(e,t){let[n,r]=this.iso(e,t);return this.inner.createGroup(n,r)}addRect(e,t){let{x:n,y:r,width:i,height:a,fill:o,stroke:s,strokeWidth:c}=t,l=this.rectToDiamond(n,r,i,a);if(t.dash||t.dashEnabled){for(let n=0;n<8;n+=2){let r=(n+2)%8;this.inner.addLine(e,{points:[l[n],l[n+1],l[r],l[r+1]],stroke:s,strokeWidth:c,dash:t.dash})}return}if(this.depth>0&&o){let t=this.depth,n=0;for(let e=1;e<4;e++)l[e*2+1]>l[n*2+1]&&(n=e);let r=l[n*2],i=l[n*2+1],a=(n+3)%4,u=l[a*2],d=l[a*2+1],f=(n+1)%4,p=l[f*2],m=l[f*2+1],g=(n+2)%4,_=l[g*2],v=l[g*2+1];if(this.inner.addPolygon(e,{vertices:[u,d,r,i,r,i+t,u,d+t],fill:h(o,.2)}),this.inner.addPolygon(e,{vertices:[r,i,p,m,p,m+t,r,i+t],fill:h(o,.4)}),this.inner.addPolygon(e,{vertices:l,fill:o}),s&&c){let n=c;this.inner.addLine(e,{points:[_,v,u,d],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,_,v],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d,u,d+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[p,m,p,m+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[u,d+t,r,i+t],stroke:s,strokeWidth:n}),this.inner.addLine(e,{points:[r,i+t,p,m+t],stroke:s,strokeWidth:n})}return}this.inner.addPolygon(e,{vertices:l,fill:o,stroke:s,strokeWidth:c})}addCircle(e,t){let{cx:n,cy:r,radius:i,fill:a,stroke:o,strokeWidth:s}=t,c=Array(Q*2);for(let e=0;e<Q;e++){let t=e/Q*Math.PI*2,a=n+Math.cos(t)*i,o=r+Math.sin(t)*i,[s,l]=this.iso(a,o);c[e*2]=s,c[e*2+1]=l}if(t.dash||t.dashEnabled){for(let n=0;n<Q;n++){let r=(n+1)%Q;this.inner.addLine(e,{points:[c[n*2],c[n*2+1],c[r*2],c[r*2+1]],stroke:o,strokeWidth:s,dash:t.dash})}return}if(this.depth>0&&a){let t=this.depth,n=0,r=0,i=0,l=-1/0,u=1/0,d=-1/0;for(let e=0;e<Q;e++)c[e*2]>l&&(l=c[e*2],n=e),c[e*2]<u&&(u=c[e*2],r=e),c[e*2+1]>d&&(d=c[e*2+1],i=e);let f=[],p=n;for(let e=0;e<=Q&&(f.push(c[p*2],c[p*2+1]),p!==i);e++)p=(p+1)%Q;for(let e=f.length-2;e>=0;e-=2)f.push(f[e],f[e+1]+t);this.inner.addPolygon(e,{vertices:f,fill:h(a,.2),stroke:o,strokeWidth:s?s*.5:void 0});let m=[];p=i;for(let e=0;e<=Q&&(m.push(c[p*2],c[p*2+1]),p!==r);e++)p=(p+1)%Q;for(let e=m.length-2;e>=0;e-=2)m.push(m[e],m[e+1]+t);this.inner.addPolygon(e,{vertices:m,fill:h(a,.4),stroke:o,strokeWidth:s?s*.5:void 0})}this.inner.addPolygon(e,{vertices:c,fill:a,stroke:o,strokeWidth:s})}addLine(e,t){this.inner.addLine(e,{...t,points:this.isoFlatPoints(t.points)})}addPolygon(e,t){this.inner.addPolygon(e,{...t,vertices:this.isoFlatPoints(t.vertices)})}isoAffine(e,t,n,r){let[i,a]=this.iso(e,t),[o,s]=this.iso(e+n,t),[c,l]=this.iso(e,t+r);return[(o-i)/n,(s-a)/n,(c-i)/r,(l-a)/r,i,a]}addText(e,t){let n=t.width??0,r=t.height??0;if(n>0&&r>0)this.inner.addText(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,n,r)});else{let[n,r]=this.iso(t.x,t.y);this.inner.addText(e,{...t,x:n,y:r})}}addImage(e,t){this.inner.addImage(e,{...t,x:0,y:0,transform:this.isoAffine(t.x,t.y,t.width,t.height)})}getTransform(){let e=this.iso;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getInverseTransform(){let e=this.isoInv;return(t,n)=>{let[r,i]=e(t,n);return{x:r,y:i}}}getExitDepthOffset(){if(this.depth<=0)return this.inner.getExitDepthOffset();let[e,t]=this.isoInv(0,this.depth),n=this.inner.getExitDepthOffset();return{x:e+n.x,y:t+n.y}}},Xt=(e=>new bt(e)),Zt=(e=>new jt(e)),Qt=(e=>new Bt(e));function $t(e){return(t=>new Kt(t,e.jitter,e.color))}function en(e={}){return(t=>new Yt(t,e))}function tn(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&#39;`)}var nn=class{constructor(e={}){this.options=e}render({state:e,style:t,sceneOverlays:n}){let{currentArea:r,currentZIndex:i,currentAreaInstance:a}=e;if(r===void 0||i===void 0||!a)return;let o=a,s=o.getPlane(i);if(!s)return;let c=e.settings,l=this.options.padding??3,u=e.computeExportBounds(o,s,this.options.roomId,l),d=t(new lt),f=new G,p=new G,m=new G,h=new Oe(e.mapReader,c,d,{gridLayer:f,linkLayer:p,roomLayer:m}),g={minX:u.x,maxX:u.x+u.w,minY:u.y,maxY:u.y+u.h};h.buildScene(o,s,i,g);let _=[];_.push(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${u.x} ${u.y} ${u.w} ${u.h}">`),_.push(`<rect x="${u.x}" y="${u.y}" width="${u.w}" height="${u.h}" fill="${tn(c.backgroundColor)}"/>`);let v=f.toSvg();v&&_.push(v);let y=p.toSvg();y&&_.push(y);let b=m.toSvg();b&&_.push(b);let x=e.getOverlaysForArea(this.options.overlays);this.renderBuiltInOverlays(x,d,e,g,_);for(let t of n){let n=t.render(d,e,g),r=n===void 0?[]:Array.isArray(n)?n:[n];for(let e of r)if(e instanceof W){let t=e.toSvg();t&&_.push(t)}}return _.push(`</svg>`),_.join(`