ue-too
Version:
pan, zoom, and rotate your html canvas
1 lines • 92.6 kB
JavaScript
"use strict";var t=require("point2point");const e=()=>{};class o{constructor(t,e,o){this._timeouts=void 0,this._states=t,this._currentState=e,this._context=o,this._statesArray=Object.keys(t),this._stateChangeCallbacks=[],this._happensCallbacks=[]}switchTo(t){this._currentState=t}happens(t,e){this._timeouts&&clearTimeout(this._timeouts),this._happensCallbacks.forEach((o=>o(t,e,this._context)));const o=this._states[this._currentState].handles(t,e,this._context,this);if(void 0!==o&&o!==this._currentState){const t=this._currentState;this._states[this._currentState].beforeExit(this._context,this,o),this.switchTo(o),this._states[this._currentState].uponEnter(this._context,this,t),this._stateChangeCallbacks.forEach((e=>e(t,this._currentState)))}return o}onStateChange(t){this._stateChangeCallbacks.push(t)}onHappens(t){this._happensCallbacks.push(t)}get currentState(){return this._currentState}setContext(t){this._context=t}get possibleStates(){return this._statesArray}get states(){return this._states}}class i{constructor(){this._guards={},this._eventGuards={},this._delay=void 0}get guards(){return this._guards}get eventGuards(){return this._eventGuards}get delay(){return this._delay}uponEnter(t,e,o){}beforeExit(t,e,o){}handles(t,e,o,i){if(this.eventReactions[t]){this.eventReactions[t].action(o,e,i);const n=this.eventReactions[t].defaultTargetState,a=this._eventGuards[t];if(a){const t=a.find((t=>!!this.guards[t.guard]&&this.guards[t.guard](o)));return t?t.target:n}return n}}}function n(t,e){return a(t,e)||void 0===e||(e.max&&(t=Math.min(e.max,t)),e.min&&(t=Math.max(e.min,t))),t}function a(t,e){return void 0===e||!(t<=0||void 0!==e&&(void 0!==e.max&&e.max<t||void 0!==e.min&&e.min>t))}function s(t,e,o,i){const n=t.a,a=t.b;t.c,t.d;const s=t.e,r=t.f,l=-Math.atan2(a,n),h=Math.sqrt(n*n+a*a)/e;let c=[s,r];c=[c[0]/e,c[1]/e],c=[c[0]-o/2,c[1]-i/2];const u=Math.cos(l),d=Math.sin(l);c=[u*c[0]-d*c[1],d*c[0]+u*c[1]],c=[c[0]/h,c[1]/h];return{position:{x:-c[0],y:-c[1]},zoom:h,rotation:l}}function r(t,e){const o=t.a,i=t.b,n=t.c,a=t.d,s=t.e,r=t.f,l=e.a,h=e.b,c=e.c,u=e.d,d=e.e,m=e.f;return{a:o*l+n*h,b:i*l+a*h,c:o*c+n*u,d:i*c+a*u,e:o*d+n*m+s,f:i*d+a*m+r}}function l(e,o,i,n,a,s){let r={x:i/2,y:n/2},l=t.PointCal.subVector(o,r);return l=t.PointCal.multiplyVectorByScalar(l,1/a),l=t.PointCal.rotatePoint(l,s),t.PointCal.addVector(e,l)}function h(e,o,i,n){const a=t.PointCal.multiplyVectorByScalar(e,1/i),s=t.PointCal.rotatePoint(a,n);return t.PointCal.addVector(s,o)}function c(e,o,i,n){const a=t.PointCal.subVector(e,o),s=t.PointCal.multiplyVectorByScalar(a,i);return t.PointCal.rotatePoint(s,-n)}function u(e,o,i,n,a,s){let r={x:o/2,y:i/2},l=t.PointCal.subVector(e,n);return l=t.PointCal.rotatePoint(l,-s),l=t.PointCal.multiplyVectorByScalar(l,a),t.PointCal.addVector(r,l)}function d(e,o,i){return t.PointCal.multiplyVectorByScalar(t.PointCal.rotatePoint(e,i),1/o)}function m(t,e){if(null==e)return!0;let o=!1,i=!1,n=!1,a=!1;return(null==e.max||null==e.max.x||t.x<=e.max.x)&&(i=!0),(null==e.min||null==e.min.x||t.x>=e.min.x)&&(o=!0),(null==e.max||null==e.max.y||t.y<=e.max.y)&&(n=!0),(null==e.min||null==e.min.y||t.y>=e.min.y)&&(a=!0),o&&i&&n&&a}function p(t){return null!=t&&(null!=t.max&&null!=t.min&&(null!=t.max.x&&null!=t.max.y&&null!=t.min.x&&null!=t.min.y))}function _(t,e){if(m(t,e)||null==e)return t;let o={x:t.x,y:t.y},i=e.min;return null!=i&&(null!=i.x&&(o.x=Math.max(o.x,i.x)),null!=i.y&&(o.y=Math.max(o.y,i.y))),i=e.max,null!=i&&(null!=i.x&&(o.x=Math.min(o.x,i.x)),null!=i.y&&(o.y=Math.min(o.y,i.y))),o}function P(t){if(null!=t&&null!=t.min&&null!=t.max&&null!=t.min.x&&null!=t.max.x)return t.max.x-t.min.x}function y(t){const e=P(t);return null!=e?e/2:void 0}function x(t){if(null!=t&&null!=t.min&&null!=t.max&&null!=t.min.y&&null!=t.max.y)return t.max.y-t.min.y}function f(t){const e=x(t);return null!=e?e/2:void 0}function v(e,o,i,n,a,s){if(null==n)return e;let r=l(e,{x:0,y:i},o,i,a,s),h=l(e,{x:0,y:0},o,i,a,s),c=l(e,{x:o,y:i},o,i,a,s),u=l(e,{x:o,y:0},o,i,a,s),d=_(r,n),m=_(c,n),p=_(h,n),P=_(u,n),y=[t.PointCal.subVector(d,r),t.PointCal.subVector(m,c),t.PointCal.subVector(p,h),t.PointCal.subVector(P,u)],x=Math.abs(y[0].x),f=Math.abs(y[0].y),v=y[0];return y.forEach((t=>{Math.abs(t.x)>x&&(x=Math.abs(t.x),v.x=t.x),Math.abs(t.y)>f&&(f=Math.abs(t.y),v.y=t.y)})),t.PointCal.addVector(e,v)}function g(t,e){if(T(t,e)||void 0===e)return t;t=b(t);const o=C(e.start,t),i=C(e.end,t);if(e.ccw&&(o<0||i>0)||!e.ccw&&(o>0||i<0)){if(Math.abs(o)===Math.abs(i))return e.startAsTieBreaker?e.start:e.end;return Math.abs(o)<Math.abs(i)?e.start:e.end}return t}function T(t,e){if(void 0===e)return!0;if(b(e.start)===b(e.end))return!0;if(b(e.start+.01)===b(e.end+.01))return!0;const o=b(t),i=C(e.start,o),n=C(e.end,o);return!(e.ccw&&(i<0||n>0)||!e.ccw&&(i>0||n<0))}function b(t){return t=((t%=2*Math.PI)+2*Math.PI)%(2*Math.PI)}function C(t,e){t=b(t);let o=(e=b(e))-t;return o>Math.PI&&(o=-(2*Math.PI-o)),o<-Math.PI&&(o+=2*Math.PI),o}class w{constructor(){this.observers=[]}subscribe(t,e){if(this.observers.push(t),null==e?void 0:e.signal){if(e.signal.aborted)return this.observers=this.observers.filter((e=>e!==t)),()=>{};const o=()=>{var i;this.observers=this.observers.filter((e=>e!==t)),null===(i=e.signal)||void 0===i||i.removeEventListener("abort",o)};e.signal.addEventListener("abort",o)}return()=>{this.observers=this.observers.filter((e=>e!==t))}}notify(...t){this.observers.forEach((e=>queueMicrotask((()=>e(...t)))))}}class B{constructor(){this.pan=new w,this.zoom=new w,this.rotate=new w,this.all=new w}notifyPan(t,e){this.pan.notify(t,e),this.all.notify({type:"pan",diff:t.diff},e)}notifyZoom(t,e){this.zoom.notify(t,e),this.all.notify({type:"zoom",deltaZoomAmount:t.deltaZoomAmount},e)}notifyRotate(t,e){this.rotate.notify(t,e),this.all.notify({type:"rotate",deltaRotation:t.deltaRotation},e)}on(t,e,o){switch(t){case"pan":return this.pan.subscribe(e,o);case"zoom":return this.zoom.subscribe(e,o);case"rotate":return this.rotate.subscribe(e,o);case"all":return this.all.subscribe(e,o);default:throw new Error(`Invalid event name: ${t}`)}}}class I{constructor(t=1e3,e=1e3,o={x:0,y:0},i=0,n=1,a={min:{x:-1e4,y:-1e4},max:{x:1e4,y:1e4}},s={min:.1,max:10},r=void 0){this._position=o,this._zoomLevel=n,this._rotation=i,this._viewPortHeight=e,this._viewPortWidth=t,this._zoomBoundaries=s,this._rotationBoundaries=r,this._boundaries=a}get boundaries(){return this._boundaries}set boundaries(t){this._boundaries=t}get viewPortWidth(){return this._viewPortWidth}set viewPortWidth(t){this._viewPortWidth=t}get viewPortHeight(){return this._viewPortHeight}set viewPortHeight(t){this._viewPortHeight=t}get position(){return this._position}setPosition(e){if(!m(e,this._boundaries))return!1;const o=t.PointCal.subVector(e,this._position);return!(t.PointCal.magnitude(o)<1e-9&&t.PointCal.magnitude(o)<1/this._zoomLevel)&&(this._position=e,!0)}get zoomLevel(){return this._zoomLevel}get zoomBoundaries(){return this._zoomBoundaries}set zoomBoundaries(t){if(void 0!==t&&void 0!==t.min&&void 0!==t.max&&t.min>t.max){let e=t.max;t.max=t.min,t.min=e}this._zoomBoundaries=t}setMaxZoomLevel(t){return null==this._zoomBoundaries&&(this._zoomBoundaries={min:void 0,max:void 0}),!(null!=this._zoomBoundaries.min&&this._zoomBoundaries.min>t||this._zoomLevel>t)&&(this._zoomBoundaries.max=t,!0)}setMinZoomLevel(t){return null==this._zoomBoundaries&&(this._zoomBoundaries={min:void 0,max:void 0}),!(null!=this._zoomBoundaries.max&&this._zoomBoundaries.max<t)&&(this._zoomBoundaries.min=t,this._zoomLevel<t&&(this._zoomLevel=t),!0)}setZoomLevel(t){return!!a(t,this._zoomBoundaries)&&((void 0===this._zoomBoundaries||void 0===this._zoomBoundaries.max||n(t,this._zoomBoundaries)!=this._zoomBoundaries.max||this._zoomLevel!=this._zoomBoundaries.max)&&((void 0===this._zoomBoundaries||void 0===this._zoomBoundaries.min||n(t,this._zoomBoundaries)!=this._zoomBoundaries.min||this._zoomLevel!=this._zoomBoundaries.min)&&(this._zoomLevel=t,!0)))}get rotation(){return this._rotation}get rotationBoundaries(){return this._rotationBoundaries}set rotationBoundaries(t){if(void 0!==t&&void 0!==t.start&&void 0!==t.end&&t.start>t.end){let e=t.end;t.end=t.start,t.start=e}this._rotationBoundaries=t}getTransform(t,e){if(void 0!==this.currentCachedTransform&&this.currentCachedTransform.devicePixelRatio===t&&this.currentCachedTransform.alignCoorindate===e&&this.currentCachedTransform.position.x===this._position.x&&this.currentCachedTransform.position.y===this._position.y&&this.currentCachedTransform.rotation===this._rotation&&this.currentCachedTransform.zoomLevel===this._zoomLevel&&this.currentCachedTransform.viewPortWidth===this._viewPortWidth&&this.currentCachedTransform.viewPortHeight===this._viewPortHeight)return Object.assign(Object.assign({},this.currentCachedTransform.transform),{cached:!0});const o=t*this._viewPortWidth/2,i=t*this._viewPortHeight/2,n=-this._position.x,a=e?-this._position.y:this._position.y,s=t,r=this._zoomLevel,l=e?-this._rotation:this._rotation,h=Math.sin(l),c=Math.cos(l),u=r*s*c,d=r*s*h,m=-s*r*h,p=r*s*c,_=s*r*c*n-s*r*h*a+o,P=s*r*h*n+s*r*c*a+i;return this.currentCachedTransform={transform:{a:u,b:d,c:m,d:p,e:_,f:P},position:this._position,rotation:this._rotation,zoomLevel:this._zoomLevel,alignCoorindate:e,devicePixelRatio:t,viewPortWidth:this._viewPortWidth,viewPortHeight:this._viewPortHeight},{a:u,b:d,c:m,d:p,e:_,f:P,cached:!1}}setUsingTransformationMatrix(t){const e=s(t,this._viewPortWidth,this._viewPortHeight,this._zoomLevel);this.setPosition(e.position),this.setRotation(e.rotation),this.setZoomLevel(e.zoom)}setRotation(t){return!!T(t,this._rotationBoundaries)&&(t=b(t),(void 0===this._rotationBoundaries||void 0===this._rotationBoundaries.end||g(t,this._rotationBoundaries)!=this._rotationBoundaries.end||this._rotation!=this._rotationBoundaries.end)&&((void 0===this._rotationBoundaries||void 0===this.rotationBoundaries.start||g(t,this._rotationBoundaries)!=this._rotationBoundaries.start||this._rotation!=this._rotationBoundaries.start)&&(this._rotation=t,!0)))}getCameraOriginInWindow(t){return t}convertFromViewPort2WorldSpace(t){return h(t,this._position,this._zoomLevel,this._rotation)}convertFromWorld2ViewPort(t){return c(t,this._position,this._zoomLevel,this._rotation)}invertFromWorldSpace2ViewPort(e){let o={x:this.viewPortWidth/2,y:this._viewPortHeight/2},i=t.PointCal.subVector(e,this._position);return i=t.PointCal.rotatePoint(i,-this._rotation),i=t.PointCal.multiplyVectorByScalar(i,this._zoomLevel),t.PointCal.addVector(o,i)}setHorizontalBoundaries(t,e){if(t>e){let o=e;e=t,t=o}null==this._boundaries&&(this._boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}}),this._boundaries.min.x=t,this._boundaries.max.x=e}setVerticalBoundaries(t,e){if(t>e){let o=e;e=t,t=o}null==this._boundaries&&(this._boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}}),this._boundaries.min.y=t,this._boundaries.max.y=e}}const R={min:.1,max:10},S={min:{x:-1e4,y:-1e4},max:{x:1e4,y:1e4}},O=void 0;class M{constructor(t=1e3,e=1e3,o={x:0,y:0},i=0,n=1,a=S,s=R,r=O){this._baseCamera=new I(t,e,o,i,n,a,s,r),this._observer=new B}get boundaries(){return this._baseCamera.boundaries}set boundaries(t){this._baseCamera.boundaries=t}get viewPortWidth(){return this._baseCamera.viewPortWidth}set viewPortWidth(t){this._baseCamera.viewPortWidth=t}get viewPortHeight(){return this._baseCamera.viewPortHeight}set viewPortHeight(t){this._baseCamera.viewPortHeight=t}get position(){return this._baseCamera.position}setPosition(e){const o=Object.assign({},this._baseCamera.position);return!!this._baseCamera.setPosition(e)&&(this._observer.notifyPan({diff:t.PointCal.subVector(e,o)},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0)}get zoomLevel(){return this._baseCamera.zoomLevel}get zoomBoundaries(){return this._baseCamera.zoomBoundaries}set zoomBoundaries(t){this._baseCamera.zoomBoundaries=t}setMaxZoomLevel(t){const e=this._baseCamera.zoomLevel;return!!this._baseCamera.setMaxZoomLevel(t)&&(this._observer.notifyZoom({deltaZoomAmount:t-e},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0)}setMinZoomLevel(t){return!!this._baseCamera.setMinZoomLevel(t)}setZoomLevel(t){return!!this._baseCamera.setZoomLevel(t)}get rotation(){return this._baseCamera.rotation}get rotationBoundaries(){return this._baseCamera.rotationBoundaries}set rotationBoundaries(t){this._baseCamera.rotationBoundaries=t}getTransform(t,e){return this._baseCamera.getTransform(t,e)}setRotation(t){const e=this._baseCamera.rotation;return!!this._baseCamera.setRotation(t)&&(this._observer.notifyRotate({deltaRotation:t-e},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0)}getCameraOriginInWindow(t){return t}convertFromViewPort2WorldSpace(t){return h(t,this._baseCamera.position,this._baseCamera.zoomLevel,this._baseCamera.rotation)}convertFromWorld2ViewPort(t){return c(t,this._baseCamera.position,this._baseCamera.zoomLevel,this._baseCamera.rotation)}invertFromWorldSpace2ViewPort(e){let o={x:this._baseCamera.viewPortWidth/2,y:this._baseCamera.viewPortHeight/2},i=t.PointCal.subVector(e,this._baseCamera.position);return i=t.PointCal.rotatePoint(i,-this._baseCamera.rotation),i=t.PointCal.multiplyVectorByScalar(i,this._baseCamera.zoomLevel),t.PointCal.addVector(o,i)}setHorizontalBoundaries(t,e){if(t>e){let o=e;e=t,t=o}null==this._baseCamera.boundaries&&(this._baseCamera.boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}}),this._baseCamera.boundaries.min.x=t,this._baseCamera.boundaries.max.x=e}setVerticalBoundaries(t,e){if(t>e){let o=e;e=t,t=o}null==this._baseCamera.boundaries&&(this._baseCamera.boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}}),this._baseCamera.boundaries.min.y=t,this._baseCamera.boundaries.max.y=e}on(t,e,o){return this._observer.on(t,e,o)}}function A(...t){const e=Array.isArray(t[0])?t[0]:t;return(t,...o)=>e.reduce(((t,e)=>e(t,...o)),t)}function E(){return A(z,L)}function V(){return A(H,k)}function z(e,o,i){let n=t.PointCal.subVector(e,o.position);if(n=U(n,o,i),0===n.x&&0===n.y)return e;return t.PointCal.addVector(o.position,n)}function H(t,e,o){return t=U(t,e,o)}function L(t,e,o){if(!o.clampTranslation)return t;let i=_(t,e.boundaries);return o.limitEntireViewPort&&(i=v(t,e.viewPortWidth,e.viewPortHeight,e.boundaries,e.zoomLevel,e.rotation)),i}function k(e,o,i){if(!i.clampTranslation)return e;let n=t.PointCal.subVector(_(t.PointCal.addVector(o.position,e),o.boundaries),o.position);return i.limitEntireViewPort&&(n=t.PointCal.subVector(v(t.PointCal.addVector(o.position,e),o.viewPortWidth,o.viewPortHeight,o.boundaries,o.zoomLevel,o.rotation),o.position)),n}function U(e,o,i){if(i.restrictXTranslation&&i.restrictYTranslation)return{x:0,y:0};if(i.restrictRelativeXTranslation&&i.restrictRelativeYTranslation)return{x:0,y:0};if(i.restrictXTranslation&&(e.x=0),i.restrictYTranslation&&(e.y=0),i.restrictRelativeXTranslation){const i=t.PointCal.rotatePoint({x:0,y:1},o.rotation),n=t.PointCal.dotProduct(i,e);e=t.PointCal.multiplyVectorByScalar(i,n)}if(i.restrictRelativeYTranslation){const i=t.PointCal.rotatePoint({x:1,y:0},o.rotation),n=t.PointCal.dotProduct(i,e);e=t.PointCal.multiplyVectorByScalar(i,n)}return e}function Z(t,e,o){return o.clampZoom?n(t,e.zoomBoundaries):t}function W(t,e,o){if(!o.clampZoom)return t;let i=e.zoomLevel+t;return i=n(i,e.zoomBoundaries),t=i-e.zoomLevel}function N(t,e,o){return o.restrictZoom?e.zoomLevel:t}function D(t,e,o){return o.restrictZoom?0:t}function F(){return A(Z,N)}function j(){return A(W,D)}function q(t,e,o){if(!o.clampRotation)return t;const i=g(b(e.rotation+t),e.rotationBoundaries);return C(e.rotation,i)}function G(t,e,o){return o.restrictRotation?0:t}function Y(t,e,o){if(!o.clampRotation)return t;return g(t,e.rotationBoundaries)}function X(t,e,o){return o.restrictRotation?e.rotation:t}function K(){return A(G,q)}function J(){return A(X,Y)}class ${constructor(){this.nextPosition=null,this.delta={x:0,y:0},this.queuePositionUpdateCount=0,this.queuePositionUpdateToCount=0,this.queuePositionUpdateByCount=0,this.lastUpdateCount=0,this.observable=new w}queuePositionUpdate(t,e){this.queuePositionUpdateCount++,this.queuePositionUpdateTo({x:t,y:e})}queuePositionUpdateTo(t){this.queuePositionUpdateToCount++,this.nextPosition=Object.assign({},t),this.delta={x:0,y:0}}queuePositionUpdateBy(t){this.queuePositionUpdateByCount++,null===this.nextPosition?this.delta={x:this.delta.x+t.x,y:this.delta.y+t.y}:this.nextPosition={x:this.nextPosition.x+t.x,y:this.nextPosition.y+t.y}}processQueuedUpdates(){if(this.lastUpdateCount=this.queuePositionUpdateCount+this.queuePositionUpdateToCount+this.queuePositionUpdateByCount,this.queuePositionUpdateCount=0,this.queuePositionUpdateToCount=0,this.queuePositionUpdateByCount=0,null!==this.nextPosition){const t=Object.assign(Object.assign({},this.nextPosition),{type:"destination"});return this.nextPosition=null,this.delta={x:0,y:0},this.observable.notify(t),t}if(0!==this.delta.x||0!==this.delta.y){const t=Object.assign(Object.assign({},this.delta),{type:"delta"});return this.delta={x:0,y:0},this.observable.notify(t),t}return null}subscribe(t,e){return this.observable.subscribe(t,e)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queuePositionUpdateCalls:this.queuePositionUpdateCount,queuePositionUpdateToCalls:this.queuePositionUpdateToCount,queuePositionUpdateByCalls:this.queuePositionUpdateByCount}}}class Q{constructor(){this.nextZoom=null,this.anchor=null,this.delta=0,this.anchorCoordinateSystem="viewport",this.queueZoomUpdateCount=0,this.queueZoomUpdateToCount=0,this.lastUpdateCount=0,this.observable=new w}queueZoomUpdateTo(t,e){"world"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="viewport",this.nextZoom=null,this.delta=0),this.anchor=e,this.nextZoom=t,0!==this.delta&&(this.delta=0)}queueZoomUpdateBy(t,e){"world"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="viewport",this.nextZoom=null,this.delta=0),null===this.nextZoom?this.delta+=t:this.nextZoom+=t,this.anchor=e}queueZoomByAtWorld(t,e){"viewport"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="world",this.nextZoom=null,this.delta=0),this.anchor=e,null===this.nextZoom?this.delta+=t:this.nextZoom+=t}queueZoomToAtWorld(t,e){"viewport"===this.anchorCoordinateSystem&&(this.anchorCoordinateSystem="world",this.nextZoom=null,this.delta=0),this.anchor=e,this.nextZoom=t,0!==this.delta&&(this.delta=0)}processQueuedUpdates(){if(null===this.nextZoom&&0===this.delta)return null;const t=this.delta,e=this.nextZoom,o=this.anchor;return this.delta=0,this.nextZoom=null,this.anchor=null,0!==t?{anchorCoordinateSystem:this.anchorCoordinateSystem,update:{type:"delta",delta:t,anchor:o}}:{anchorCoordinateSystem:this.anchorCoordinateSystem,update:{type:"destination",destination:e,anchor:o}}}subscribe(t,e){return this.observable.subscribe(t,e)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queueZoomUpdateCalls:this.queueZoomUpdateCount,queueZoomUpdateToCalls:this.queueZoomUpdateToCount}}}class tt{constructor(){this.nextRotation=null,this.delta=0,this.queueRotationUpdateCount=0,this.queueRotationUpdateToCount=0,this.queueRotationUpdateByCount=0,this.lastUpdateCount=0,this.observable=new w}queueRotationUpdate(t){this.queueRotationUpdateCount++,this.queueRotationUpdateTo(t)}queueRotationUpdateTo(t){this.queueRotationUpdateToCount++,this.nextRotation=t,this.delta=0}queueRotationUpdateBy(t){this.queueRotationUpdateByCount++,null===this.nextRotation?this.delta=this.delta+t:this.nextRotation=this.nextRotation+t}processQueuedUpdates(){if(this.lastUpdateCount=this.queueRotationUpdateCount+this.queueRotationUpdateToCount+this.queueRotationUpdateByCount,this.queueRotationUpdateCount=0,this.queueRotationUpdateToCount=0,this.queueRotationUpdateByCount=0,null!==this.nextRotation){const t={destination:this.nextRotation,type:"destination"};return this.nextRotation=null,this.delta=0,this.observable.notify(t),t}if(0!==this.delta){const t={delta:this.delta,type:"delta"};return this.delta=0,this.observable.notify(t),t}return null}subscribe(t,e){return this.observable.subscribe(t,e)}getDebugInfo(){return{lastUpdateTotalCalls:this.lastUpdateCount,queueRotationUpdateCalls:this.queueRotationUpdateCount,queueRotationUpdateToCalls:this.queueRotationUpdateToCount,queueRotationUpdateByCalls:this.queueRotationUpdateByCount}}}class et{constructor(t,e=new M){this._panBy=V(),this._panTo=E(),this._zoomTo=F(),this._zoomBy=j(),this._rotateBy=K(),this._rotateTo=J(),this._config=Object.assign(Object.assign({},t),{restrictRotation:!1,clampRotation:!0}),this._camera=e,this._positionBatcher=new $,this._zoomBatcher=new Q,this._rotationBatcher=new tt}zoomToAt(t,e){this._zoomBatcher.queueZoomUpdateTo(t,e)}zoomByAt(t,e){this._zoomBatcher.queueZoomUpdateBy(t,e)}zoomTo(t){this._zoomBatcher.queueZoomUpdateTo(t)}zoomBy(t){this._zoomBatcher.queueZoomUpdateBy(t)}zoomToAtWorld(t,e){this._zoomBatcher.queueZoomToAtWorld(t,e)}zoomByAtWorld(t,e){this._zoomBatcher.queueZoomByAtWorld(t,e)}_actualPanByWorld(e){const o=this._panBy(e,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,o))}_actualPanToWorld(t){const e=this._panTo(t,this._camera,this._config);this._camera.setPosition(e)}panByWorld(t){this._positionBatcher.queuePositionUpdateBy(t)}panByViewPort(e){const o=t.PointCal.multiplyVectorByScalar(t.PointCal.rotatePoint(e,this._camera.rotation),1/this._camera.zoomLevel);this._positionBatcher.queuePositionUpdateBy(o)}panToWorld(t){this._positionBatcher.queuePositionUpdateTo(t)}panToViewPort(t){const e=this._camera.convertFromViewPort2WorldSpace(t);this._positionBatcher.queuePositionUpdateTo(e)}rotateBy(t){this._rotationBatcher.queueRotationUpdateBy(t)}rotateTo(t){this._rotationBatcher.queueRotationUpdateTo(t)}set limitEntireViewPort(t){this._config.limitEntireViewPort=t}get limitEntireViewPort(){return this._config.limitEntireViewPort}get camera(){return this._camera}get config(){return this._config}set config(t){this._config=Object.assign({},t)}updatePosition(){const t=this._positionBatcher.processQueuedUpdates();if(null!=t)switch(t.type){case"destination":this._actualPanToWorld(t);break;case"delta":this._actualPanByWorld(t);break;default:throw new Error("Invalid position update type")}}updateZoom(){const t=this._zoomBatcher.processQueuedUpdates();if(null!=t)if("world"===t.anchorCoordinateSystem)switch(t.update.type){case"destination":if(t.update.anchor)this._zoomToAtWorld(t.update.destination,t.update.anchor);else{const e=this._zoomTo(t.update.destination,this._camera,this._config);this._camera.setZoomLevel(e)}break;case"delta":if(t.update.anchor)this._zoomByAtWorld(t.update.delta,t.update.anchor);else{const e=this._zoomBy(t.update.delta,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+e)}}else switch(t.update.type){case"destination":if(t.update.anchor)this._zoomToAtViewPort(t.update.destination,t.update.anchor);else{const e=this._zoomTo(t.update.destination,this._camera,this._config);this._camera.setZoomLevel(e)}break;case"delta":if(t.update.anchor)this._zoomByAtViewPort(t.update.delta,t.update.anchor);else{const e=this._zoomBy(t.update.delta,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+e)}}}updateRotation(){const t=this._rotationBatcher.processQueuedUpdates();if(null!=t)switch(t.type){case"destination":const e=this._rotateTo(t.destination,this._camera,this._config);this._camera.setRotation(e);break;case"delta":const o=this._rotateBy(t.delta,this._camera,this._config);this._camera.setRotation(this._camera.rotation+o);break;default:throw new Error("Invalid rotation update type")}}update(){this.updateZoom(),this.updatePosition(),this.updateRotation()}_zoomToAtViewPort(e,o){const i=this._camera.convertFromViewPort2WorldSpace(o),n=this._zoomTo(e,this._camera,this._config);this._camera.setZoomLevel(n);const a=this._camera.convertFromViewPort2WorldSpace(o),s=t.PointCal.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}_zoomToAtWorld(e,o){let i=this._camera.convertFromWorld2ViewPort(o);const n=this._zoomTo(e,this._camera,this._config);this._camera.setZoomLevel(n);let a=this._camera.convertFromWorld2ViewPort(o);const s=t.PointCal.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}_zoomByAtViewPort(e,o){const i=this._camera.convertFromViewPort2WorldSpace(o),n=this._zoomBy(e,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+n);const a=this._camera.convertFromViewPort2WorldSpace(o),s=t.PointCal.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}_zoomByAtWorld(e,o){let i=this._camera.convertFromWorld2ViewPort(o);const n=this._zoomBy(e,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+n);let a=this._camera.convertFromWorld2ViewPort(o);const s=d(t.PointCal.subVector(i,a),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}configure(t){this._config=Object.assign(Object.assign({},this._config),t)}cleanup(){}setup(){}}class ot{constructor(t,e=new M){this._panBy=V(),this._panTo=E(),this._zoomTo=F(),this._zoomBy=j(),this._rotateBy=K(),this._rotateTo=J(),this._config=Object.assign(Object.assign({},t),{restrictRotation:!1,clampRotation:!0}),this._camera=e}zoomToAt(e,o){let i=this._camera.convertFromViewPort2WorldSpace(o);const n=this._zoomTo(e,this._camera,this._config);this._camera.setZoomLevel(n);let a=this._camera.convertFromViewPort2WorldSpace(o);const s=t.PointCal.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}zoomByAt(e,o){let i=this._camera.convertFromViewPort2WorldSpace(o);const n=this._zoomBy(e,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+n);let a=this._camera.convertFromViewPort2WorldSpace(o);const s=t.PointCal.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}zoomTo(t){this._zoomTo(t,this._camera,this._config)}zoomBy(t){this._zoomBy(t,this._camera,this._config)}zoomToAtWorld(e,o){let i=this._camera.convertFromWorld2ViewPort(o);const n=this._zoomTo(e,this._camera,this._config);this._camera.setZoomLevel(n);let a=this._camera.convertFromWorld2ViewPort(o);const s=d(t.PointCal.subVector(a,i),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}zoomByAtWorld(e,o){let i=this._camera.convertFromWorld2ViewPort(o);const n=this._zoomBy(e,this._camera,this._config);this._camera.setZoomLevel(this._camera.zoomLevel+n);let a=this._camera.convertFromWorld2ViewPort(o);const s=d(t.PointCal.subVector(a,i),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,r))}panByViewPort(e){const o=t.PointCal.multiplyVectorByScalar(t.PointCal.rotatePoint(e,this._camera.rotation),1/this._camera.zoomLevel),i=this._panBy(o,this._camera,this._config);this._camera.setPosition(t.PointCal.addVector(this._camera.position,i))}panByWorld(t){const e=this._camera.convertFromWorld2ViewPort(t);this.panByViewPort(e)}panToWorld(t){const e=this._panTo(t,this._camera,this._config);this._camera.setPosition(e)}panToViewPort(t){const e=this._camera.convertFromViewPort2WorldSpace(t);this.panToWorld(e)}rotateBy(t){const e=this._rotateBy(t,this._camera,this._config);this._camera.setRotation(this._camera.rotation+e)}rotateTo(t){const e=this._rotateTo(t,this._camera,this._config);this._camera.setRotation(e)}set limitEntireViewPort(t){this._config.limitEntireViewPort=t}get limitEntireViewPort(){return this._config.limitEntireViewPort}get camera(){return this._camera}get config(){return this._config}set config(t){this._config=Object.assign({},t)}configure(t){this._config=Object.assign(Object.assign({},this._config),t)}cleanup(){}setup(){}update(){}}function it(t){return new ot({limitEntireViewPort:!0,restrictRelativeXTranslation:!1,restrictRelativeYTranslation:!1,restrictXTranslation:!1,restrictYTranslation:!1,restrictZoom:!1,clampTranslation:!0,clampZoom:!0},t)}class nt{constructor(t,e){this._canvas=t,this.bindFunctions(),this._abortController=new AbortController,this._stateMachine=e,this._keyfirstPressed=new Map}get disabled(){return this._disabled}set disabled(t){this._disabled=t}get stateMachine(){return this._stateMachine}addEventListeners(t){this._canvas.addEventListener("pointerdown",this.pointerDownHandler,{signal:t}),this._canvas.addEventListener("pointerup",this.pointerUpHandler,{signal:t}),this._canvas.addEventListener("pointermove",this.pointerMoveHandler,{signal:t}),this._canvas.addEventListener("wheel",this.scrollHandler,{signal:t}),window.addEventListener("keydown",this.keypressHandler,{signal:t}),window.addEventListener("keyup",this.keyupHandler,{signal:t})}setUp(){this.addEventListeners(this._abortController.signal)}tearDown(){this._abortController.abort(),this._abortController=new AbortController}bindFunctions(){this.pointerDownHandler=this.pointerDownHandler.bind(this),this.pointerUpHandler=this.pointerUpHandler.bind(this),this.pointerMoveHandler=this.pointerMoveHandler.bind(this),this.scrollHandler=this.scrollHandler.bind(this),this.keypressHandler=this.keypressHandler.bind(this),this.keyupHandler=this.keyupHandler.bind(this)}pointerDownHandler(t){this._disabled||(0!==t.button||"mouse"!==t.pointerType?1!==t.button||"mouse"!==t.pointerType||this.stateMachine.happens("middlePointerDown",{x:t.clientX,y:t.clientY}):this.stateMachine.happens("leftPointerDown",{x:t.clientX,y:t.clientY}))}pointerUpHandler(t){this._disabled||(0!==t.button||"mouse"!==t.pointerType?1!==t.button||"mouse"!==t.pointerType||this.stateMachine.happens("middlePointerUp",{x:t.clientX,y:t.clientY}):this.stateMachine.happens("leftPointerUp",{x:t.clientX,y:t.clientY}))}pointerMoveHandler(t){this._disabled||(1!==t.buttons||"mouse"!==t.pointerType?4!==t.buttons||"mouse"!==t.pointerType||this.stateMachine.happens("middlePointerMove",{x:t.clientX,y:t.clientY}):this.stateMachine.happens("leftPointerMove",{x:t.clientX,y:t.clientY}))}scrollHandler(t){this._disabled||(t.preventDefault(),t.ctrlKey?this.stateMachine.happens("scrollWithCtrl",{x:t.clientX,y:t.clientY,deltaX:t.deltaX,deltaY:t.deltaY}):this.stateMachine.happens("scroll",{deltaX:t.deltaX,deltaY:t.deltaY}))}keypressHandler(t){this._keyfirstPressed.has(t.key)||(this._keyfirstPressed.set(t.key,!0)," "===t.key&&(t.preventDefault(),this.stateMachine.happens("spacebarDown",{})))}keyupHandler(t){this._keyfirstPressed.has(t.key)&&this._keyfirstPressed.delete(t.key)," "===t.key&&this.stateMachine.happens("spacebarUp",{})}attach(t){this.tearDown(),this._canvas=t,this.setUp()}}class at{constructor(t,e){this._panDisabled=!1,this._zoomDisabled=!1,this._rotateDisabled=!1,this._canvas=t,this._disabled=!1,this.touchSM=e,this._abortController=new AbortController,this.bindListeners()}get touchStateMachine(){return this.touchSM}bindListeners(){this.touchstartHandler=this.touchstartHandler.bind(this),this.touchendHandler=this.touchendHandler.bind(this),this.touchcancelHandler=this.touchcancelHandler.bind(this),this.touchmoveHandler=this.touchmoveHandler.bind(this)}enableStrategy(){this._disabled=!1}disableStrategy(){this._disabled=!0}setUp(){this._canvas.addEventListener("touchstart",this.touchstartHandler,{signal:this._abortController.signal}),this._canvas.addEventListener("touchend",this.touchendHandler,{signal:this._abortController.signal}),this._canvas.addEventListener("touchcancel",this.touchcancelHandler,{signal:this._abortController.signal}),this._canvas.addEventListener("touchmove",this.touchmoveHandler,{signal:this._abortController.signal})}tearDown(){this._abortController.abort(),this._abortController=new AbortController}get disabled(){return this._disabled}get alignCoordinateSystem(){return this._touchInputTracker.alignCoordinateSystem}set alignCoordinateSystem(t){this._touchInputTracker.alignCoordinateSystem=t}get panDisabled(){return this._panDisabled}set panDisabled(t){this._panDisabled=t}get zoomDisabled(){return this._zoomDisabled}set zoomDisabled(t){this._zoomDisabled=t}get rotateDisabled(){return this._rotateDisabled}set rotateDisabled(t){this._rotateDisabled=t}touchstartHandler(t){if(this._disabled)return;const e=[];for(let o=0;o<t.changedTouches.length;o++)e.push({ident:t.changedTouches[o].identifier,x:t.changedTouches[o].clientX,y:t.changedTouches[o].clientY});this.touchSM.happens("touchstart",{points:e}),t.preventDefault()}touchcancelHandler(t){if(this._disabled)return;const e=[];for(let o=0;o<t.changedTouches.length;o++)e.push({ident:t.changedTouches[o].identifier,x:t.changedTouches[o].clientX,y:t.changedTouches[o].clientY});this.touchSM.happens("touchend",{points:e})}touchendHandler(t){if(this._disabled)return;const e=[];for(let o=0;o<t.changedTouches.length;o++)e.push({ident:t.changedTouches[o].identifier,x:t.changedTouches[o].clientX,y:t.changedTouches[o].clientY});this.touchSM.happens("touchend",{points:e})}touchmoveHandler(t){if(this._disabled)return;t.preventDefault();const e=[];for(let o=0;o<t.targetTouches.length;o++)e.push({ident:t.targetTouches[o].identifier,x:t.targetTouches[o].clientX,y:t.targetTouches[o].clientY});this.touchSM.happens("touchmove",{points:e})}attach(t){this.tearDown(),this._canvas=t,this.setUp()}}function st(t,e,o,i){const n=P(t),a=x(t);if(null==n||null==a)return;let s=e/Math.abs(n*Math.cos(i)),r=e/Math.abs(a*Math.cos(i)),l=o/Math.abs(n*Math.sin(i)),h=o/Math.abs(a*Math.sin(i));s==1/0&&(s=0),r==1/0&&(r=0),l==1/0&&(l=0),h==1/0&&(h=0);const c=o/a,u=e/n;return Math.max(c,u,s,r,l,h)}function rt(t,e){return null!=e&&(null==t||e!=1/0&&(void 0!==t&&(null==t.min||e>t.min)))}function lt(t,e,o,i){const n=P(t);if(null==n)return;const a=Math.abs(n*Math.cos(i)),s=Math.abs(n*Math.sin(i));if(e/a==1/0)return o/s;return Math.max(e/a,o/s)}function ht(t,e,o,i){const n=x(t);if(null==n)return;const a=e/Math.abs(n*Math.cos(i)),s=o/Math.abs(n*Math.sin(i));if(s==1/0)return a;return Math.max(a,s)}function ct(t){if(t<=0)return 0;let e=0;if(t<1){let o=1;for(;o>t;)o/=10,e--}else{let o=1;for(;10*o<=t;)o*=10,e++}return e}function ut(t,e,o,i,n,a){var s;const r=void 0!==a;if(t.save(),t.lineWidth=1/e,t.beginPath(),t.moveTo(o.x,o.y),t.lineTo(o.x+i,o.y),t.stroke(),t.restore(),!r)return;const l=null!==(s=a.color)&&void 0!==s?s:"green";t.save(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=l,t.font=a.fontSize/e+"px Arial";const h=n%1==0?n:n.toFixed(2);t.fillText(`${h}`,o.x+i+a.textOffset,o.y),t.restore()}function dt(t,e,o,i,n,a){var s;const r=void 0!==a;if(t.save(),t.lineWidth=1/e,t.beginPath(),t.moveTo(o.x,o.y),t.lineTo(o.x,o.y+i),t.stroke(),t.restore(),!r)return;const l=null!==(s=a.color)&&void 0!==s?s:"red";t.save(),t.textAlign="center",t.textBaseline="top",t.fillStyle=l,t.font=a.fontSize/e+"px Arial";const h=n%1==0?n:n.toFixed(2);t.fillText(`${h}`,o.x,o.y+i+a.textOffset),t.restore()}function mt(t,e,o){const i=Math.min(t,e),n=Math.max(t,e),a=o||ct(n-i),s=Math.max(1,a),r=Math.pow(10,s-a),l=(t>0?Math.floor(i*r/Math.pow(10,s)):Math.ceil(i*r/Math.pow(10,s)))*Math.pow(10,s),h=(e>0?Math.floor(n*r/Math.pow(10,s)):Math.ceil(n*r/Math.pow(10,s)))*Math.pow(10,s),c=Math.pow(10,s),u=s-1,d=c/2;return{minMajorTickValue:l,maxMajorTickValue:h,majorTickStep:c,minMinTickValue:(t>0?Math.floor(i*r/Math.pow(10,u)):Math.ceil(i*r/Math.pow(10,u)))*Math.pow(10,u),maxMaxTickValue:(e>0?Math.floor(n*r/Math.pow(10,u)):Math.ceil(n*r/Math.pow(10,u)))*Math.pow(10,u),minTickStep:Math.pow(10,u),minHalfTickValue:(t>0?Math.floor(i*r/d):Math.ceil(i*r/d))*d,maxHalfTickValue:(e>0?Math.floor(n*r/d):Math.ceil(n*r/d))*d,halfTickStep:d,calibrationMultiplier:1/r,normalizedOrderOfMagnitude:s}}class pt{constructor(t){this._observers=new w,this.lastRect=t.getBoundingClientRect(),this.resizeObserver=new ResizeObserver((t=>{for(const e of t){const t=_t(e.target.getBoundingClientRect(),window.getComputedStyle(e.target));Pt(this.lastRect,t)&&(this.publishPositionUpdate(t),this.lastRect=t)}})),this.intersectionObserver=new IntersectionObserver((t=>{for(const e of t)if(e.isIntersecting){const t=_t(e.boundingClientRect,window.getComputedStyle(e.target));Pt(this.lastRect,t)&&(this.publishPositionUpdate(t),this.lastRect=t)}})),this.scrollHandler=(()=>{const e=_t(t.getBoundingClientRect(),window.getComputedStyle(t));Pt(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),this.resizeHandler=(()=>{const e=_t(t.getBoundingClientRect(),window.getComputedStyle(t));Pt(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),this.resizeObserver.observe(t),this.intersectionObserver.observe(t),window.addEventListener("scroll",this.scrollHandler,{passive:!0}),window.addEventListener("resize",this.resizeHandler,{passive:!0})}dispose(){this.resizeObserver.disconnect(),this.intersectionObserver.disconnect(),window.removeEventListener("scroll",this.scrollHandler),window.removeEventListener("resize",this.resizeHandler)}attach(t){this.dispose(),this.resizeObserver.observe(t),this.intersectionObserver.observe(t),this.scrollHandler=(()=>{const e=_t(t.getBoundingClientRect(),window.getComputedStyle(t));Pt(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),this.resizeHandler=(()=>{const e=_t(t.getBoundingClientRect(),window.getComputedStyle(t));Pt(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),window.addEventListener("scroll",this.scrollHandler,{passive:!0}),window.addEventListener("resize",this.resizeHandler,{passive:!0})}publishPositionUpdate(t){this._observers.notify(t)}onPositionUpdate(t,e){this._observers.subscribe(t,e)}}function _t(t,e){const o=parseFloat(e.paddingLeft),i=parseFloat(e.paddingTop),n=parseFloat(e.paddingRight),a=parseFloat(e.paddingBottom),s=parseFloat(e.borderLeftWidth),r=parseFloat(e.borderTopWidth),l=parseFloat(e.borderRightWidth),h=parseFloat(e.borderBottomWidth),c=t.left+o+s,u=t.top+i+r,d=t.width-o-n-s-l,m=t.height-i-a-r-h;return new DOMRect(c,u,d,m)}function Pt(t,e){return t.top!==e.top||t.left!==e.left||t.width!==e.width||t.height!==e.height}const yt={fillRect:[1],strokeRect:[1],fillText:[2],strokeText:[1],lineTo:[1],moveTo:[1],quadraticCurveTo:[1,3],bezierCurveTo:[1,3,5],arc:[1],drawImage:[2],rect:[1],roundRect:[1]};function xt(t){return new Proxy(t,{get(t,e,o){const i=Reflect.get(t,e,t);return"string"==typeof e&&e in yt&&"function"==typeof i?function(...o){const n=[...o];if("drawImage"===e&&9===o.length){const e=ft(o);return i.apply(t,e)}{const t=yt[e];for(const e of t)e<n.length&&(n[e]=-n[e]);"drawImage"===e&&5===o.length&&(n[2]-=n[4])}return i.apply(t,n)}:"function"==typeof i?function(...e){return i.apply(t,e)}:i},set:(t,e,o)=>Reflect.set(t,e,o)})}function ft(t){if(9!==t.length)return t;const e=[...t],o=t[0].height;return void 0!==o&&(e[2]=o-e[2],e[6]=-e[6],e[6]-=e[8],e[4]=-e[4]),e}class vt extends o{constructor(t,e,o){super(t,e,o)}notifyPanInput(t){this.happens("userPanByInput",{diff:t})}notifyPanToAnimationInput(t){this.happens("transitionPanToInput",{target:t})}initateTransition(){this.happens("initateTransition",{})}set limitEntireViewPort(t){this._context.limitEntireViewPort=t}get limitEntireViewPort(){return this._context.limitEntireViewPort}}let gt=class extends i{constructor(){super(),this.eventReactions={userPanByInput:{action:this.userPanByInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},userPanToInput:{action:this.userPanToInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},lockedOnObjectPanByInput:{action:this.lockedOnObjectPanByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectPanToInput:{action:this.lockedOnObjectPanToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},initateTransition:{action:e,defaultTargetState:"TRANSITION"}}}userPanByInputHandler(t,e){t.panByViewPort(e.diff)}userPanToInputHandler(t,e){t.panToWorld(e.target)}lockedOnObjectPanByInputHandler(t,e){t.panByViewPort(e.diff)}lockedOnObjectPanToInputHandler(t,e){t.panToWorld(e.target)}},Tt=class extends i{constructor(){super(),this.eventReactions={userPanByInput:{action:this.userPanByInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},userPanToInput:{action:this.userPanToInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},transitionPanByInput:{action:this.transitionPanByInputHandler,defaultTargetState:"TRANSITION"},transitionPanToInput:{action:this.transitionPanToInputHandler,defaultTargetState:"TRANSITION"},lockedOnObjectPanByInput:{action:this.lockedOnObjectPanByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectPanToInput:{action:this.lockedOnObjectPanToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"}}}userPanByInputHandler(t,e){return t.panByViewPort(e.diff),"ACCEPTING_USER_INPUT"}userPanToInputHandler(t,e){return t.panToWorld(e.target),"ACCEPTING_USER_INPUT"}transitionPanByInputHandler(t,e){return t.panByViewPort(e.diff),"TRANSITION"}transitionPanToInputHandler(t,e){return t.panToWorld(e.target),"TRANSITION"}lockedOnObjectPanByInputHandler(t,e){return t.panByViewPort(e.diff),"LOCKED_ON_OBJECT"}lockedOnObjectPanToInputHandler(t,e){return t.panToWorld(e.target),"LOCKED_ON_OBJECT"}},bt=class extends i{constructor(){super(),this.eventReactions={unlock:{action:e,defaultTargetState:"ACCEPTING_USER_INPUT"},lockedOnObjectPanByInput:{action:this.lockedOnObjectPanByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectPanToInput:{action:this.lockedOnObjectPanToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"}}}lockedOnObjectPanByInputHandler(t,e){t.panByViewPort(e.diff)}lockedOnObjectPanToInputHandler(t,e){t.panToWorld(e.target)}};function Ct(t){return new vt({ACCEPTING_USER_INPUT:new gt,TRANSITION:new Tt,LOCKED_ON_OBJECT:new bt},"ACCEPTING_USER_INPUT",t)}class wt extends i{constructor(){super(...arguments),this._eventReactions={userZoomByAtInput:{action:this.userZoomByAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},userZoomToAtInput:{action:this.userZoomToAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},initiateTransition:{action:e,defaultTargetState:"TRANSITION"}}}get eventReactions(){return this._eventReactions}userZoomByAtInput(t,e){t.zoomByAt(e.deltaZoom,e.anchorPoint)}userZoomToAtInput(t,e){t.zoomToAt(e.targetZoom,e.anchorPoint)}}class Bt extends i{constructor(){super(),this._eventReactions={lockedOnObjectZoomByAtInput:{action:this.lockedOnObjectZoomByAtInput,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectZoomToAtInput:{action:this.lockedOnObjectZoomToAtInput,defaultTargetState:"LOCKED_ON_OBJECT"},transitionZoomByAtInput:{action:this.transitionZoomByAtInput,defaultTargetState:"TRANSITION"},transitionZoomToAtInput:{action:this.transitionZoomToAtInput,defaultTargetState:"TRANSITION"},transitionZoomToAtCenterInput:{action:this.transitionZoomToAtCenterInput,defaultTargetState:"TRANSITION"},transitionZoomToAtWorldInput:{action:this.transitionZoomToAtWorldInput,defaultTargetState:"TRANSITION"},userZoomByAtInput:{action:this.userZoomByAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},userZoomToAtInput:{action:this.userZoomToAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"}}}get eventReactions(){return this._eventReactions}lockedOnObjectZoomByAtInput(t,e){t.zoomBy(e.deltaZoom)}lockedOnObjectZoomToAtInput(t,e){t.zoomTo(e.targetZoom)}userZoomByAtInput(t,e){t.zoomByAt(e.deltaZoom,e.anchorPoint)}userZoomToAtInput(t,e){t.zoomToAt(e.targetZoom,e.anchorPoint)}transitionZoomByAtInput(t,e){t.zoomByAt(e.deltaZoom,e.anchorPoint)}transitionZoomByAtCenterInput(t,e){t.zoomBy(e.deltaZoom)}transitionZoomToAtInput(t,e){t.zoomToAt(e.targetZoom,e.anchorPoint)}transitionZoomToAtCenterInput(t,e){t.zoomTo(e.targetZoom)}transitionZoomToAtWorldInput(t,e){t.zoomToAtWorld(e.targetZoom,e.anchorPoint)}}class It extends i{constructor(){super(),this._eventReactions={lockedOnObjectZoomByAtInput:{action:this.lockedOnObjectZoomByAtInput,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectZoomToAtInput:{action:this.lockedOnObjectZoomToAtInput,defaultTargetState:"LOCKED_ON_OBJECT"},userZoomByAtInput:{action:this.userZoomByAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},userZoomToAtInput:{action:this.userZoomToAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"}}}get eventReactions(){return this._eventReactions}lockedOnObjectZoomByAtInput(t,e){t.zoomByAt(e.deltaZoom,e.anchorPoint)}lockedOnObjectZoomToAtInput(t,e){t.zoomToAt(e.targetZoom,e.anchorPoint)}userZoomByAtInput(t,e){t.zoomByAt(e.deltaZoom,e.anchorPoint)}userZoomToAtInput(t,e){t.zoomToAt(e.targetZoom,e.anchorPoint)}}class Rt extends o{constructor(t,e,o){super(t,e,o)}notifyZoomByAtInput(t,e){this.happens("userZoomByAtInput",{deltaZoom:t,anchorPoint:e})}notifyZoomByAtInputAnimation(t,e){this.happens("transitionZoomByAtInput",{deltaZoom:t,anchorPoint:e})}notifyZoomToAtCenterInput(t,e){this.happens("transitionZoomToAtCenterInput",{targetZoom:t,anchorPoint:e})}notifyZoomToAtWorldInput(t,e){this.happens("transitionZoomToAtWorldInput",{targetZoom:t,anchorPoint:e})}initateTransition(){this.happens("initiateTransition",{})}}function St(t){return new Rt({ACCEPTING_USER_INPUT:new wt,TRANSITION:new Bt,LOCKED_ON_OBJECT:new It},"ACCEPTING_USER_INPUT",t)}class Ot extends o{constructor(t,e,o){super(t,e,o)}notifyRotateByInput(t){this.happens("userRotateByInput",{diff:t})}notifyRotateToAnimationInput(t){this.happens("transitionRotateToInput",{target:t})}initateTransition(){this.happens("initateTransition",{})}}class Mt extends i{constructor(){super(),this.eventReactions={userRotateByInput:{action:this.userRotateByInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},userRotateToInput:{action:this.userRotateToInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},lockedOnObjectRotateByInput:{action:this.lockedOnObjectRotateByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectRotateToInput:{action:this.lockedOnObjectRotateToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},initateTransition:{action:e,defaultTargetState:"TRANSITION"}}}userRotateByInputHandler(t,e){t.rotateBy(e.diff)}userRotateToInputHandler(t,e){t.rotateTo(e.target)}lockedOnObjectRotateByInputHandler(t,e){t.rotateBy(e.diff)}lockedOnObjectRotateToInputHandler(t,e){t.rotateTo(e.target)}}class At extends i{constructor(){super(),this.eventReactions={userRotateByInput:{action:this.userRotateByInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},userRotateToInput:{action:this.userRotateToInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},transitionRotateByInput:{action:this.transitionRotateByInputHandler,defaultTargetState:"TRANSITION"},transitionRotateToInput:{action:this.transitionRotateToInputHandler,defaultTargetState:"TRANSITION"},lockedOnObjectRotateByInput:{action:this.lockedOnObjectRotateByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectRotateToInput:{action:this.lockedOnObjectRotateToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"}}}userRotateByInputHandler(t,e){return t.rotateBy(e.diff),"ACCEPTING_USER_INPUT"}userRotateToInputHandler(t,e){return t.rotateTo(e.target),"ACCEPTING_USER_INPUT"}transitionRotateByInputHandler(t,e){return t.rotateBy(e.diff),"TRANSITION"}transitionRotateToInputHandler(t,e){return t.rotateTo(e.target),"TRANSITION"}lockedOnObjectRotateByInputHandler(t,e){return t.rotateBy(e.diff),"LOCKED_ON_OBJECT"}lockedOnObjectRotateToInputHandler(t,e){return t.rotateTo(e.target),"LOCKED_ON_OBJECT"}}class Et extends i{constructor(){super(),this.eventReactions={unlock:{action:e,defaultTargetState:"ACCEPTING_USER_INPUT"},lockedOnObjectRotateByInput:{action:this.lockedOnObjectRotateByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectRotateToInput:{action:this.lockedOnObjectRotateToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"}}}lockedOnObjectRotateByInputHandler(t,e){t.rotateBy(e.diff)}lockedOnObjectRotateToInputHandler(t,e){t.rotateTo(e.target)}}function Vt(t){return new Ot({ACCEPTING_USER_INPUT:new Mt,TRANSITION:new At,LOCKED_ON_OBJECT:new Et},"ACCEPTING_USER_INPUT",t)}class zt{constructor(t,e,o){this._panStateMachine=t,this._zoomStateMachine=e,this._rotateStateMachine=o}notifyPanToAnimationInput(t){this._panStateMachine.notifyPanToAnimationInput(t)}notifyPanInput(t){this._panStateMachine.notifyPanInput(t)}notifyZoomInput(t,e){this._zoomStateMachine.notifyZoomByAtInput(t,e)}notifyRotateByInput(t){this._rotateStateMachine.notifyRotateByInput(t)}notifyRotateToAnimationInput(t){this._rotateStateMachine.notifyRotateToAnimationInput(t)}notifyZoomInputAnimation(t,e={x:0,y:0}){this._zoomStateMachine.notifyZoomToAtCenterInput(t,e)}notifyZoomInputAnimationWorld(t,e={x:0,y:0}){this._zoomStateMachine.notifyZoomToAtWorldInput(t,e)}notifyRotationInput(t){console.error("Rotation input is not implemented")}initatePanTransition(){this._panStateMachine.initateTransition()}initateZoomTransition(){this._zoomStateMachine.initateTransition()}initateRotateTransition(){this._rotateStateMachine.initateTransition()}get rotateStateMachine(){return this._rotateStateMachine}get panStateMachine(){return this._panStateMachine}get zoomStateMachine(){return this._zoomStateMachine}}function Ht(t){const e=Ct(t),o=St(t),i=Vt(t);return new zt(e,o,i)}class Lt{constructor(t=it(new M)){this._cameraRig=t}notifyPanInput(t){this._cameraRig.panByViewPort(t)}notifyZoomInput(t,e){this._cameraRig.zoomByAt(t,e)}notifyRotationInput(t){this._cameraRig.rotateBy(t)}}function kt(t){const e=it(t);return new Lt(e)}class Ut{constructor(t){this.pan=new w,this.zoom=new w,this.rotate=new w,this.all=new w,this._cameraMux=t}notifyPan(t){this._cameraMux.notifyPanInput(t),this.pan.notify({diff:t}),this.all.notify({type:"pan",diff:t})}notifyZoom(t,e){this._cameraMux.notifyZoomInput(t,e),this.zoom.notify(