@ue-too/board
Version:
1 lines • 86.2 kB
JavaScript
import{PointCal as t}from"@ue-too/math";import{TemplateStateMachine as e,TemplateState as o,NO_OP as i}from"@ue-too/being";class n{constructor(){this.observers=[]}subscribe(t,e){if(this.observers.push(t),e?.signal){if(e.signal.aborted)return this.observers=this.observers.filter((e=>e!==t)),()=>{};const o=()=>{this.observers=this.observers.filter((e=>e!==t)),e.signal?.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 a{constructor(){this.pan=new n,this.zoom=new n,this.rotate=new n,this.all=new n}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}`)}}}function s(t,e,o,i){const n=t.a,a=t.b;t.c,t.d;const s=t.e,r=t.f,h=-Math.atan2(a,n),c=Math.sqrt(n*n+a*a)/e;let l=[s,r];l=[l[0]/e,l[1]/e],l=[l[0]-o/2,l[1]-i/2];const u=Math.cos(h),d=Math.sin(h);l=[u*l[0]-d*l[1],d*l[0]+u*l[1]],l=[l[0]/c,l[1]/c];return{position:{x:-l[0],y:-l[1]},zoom:c,rotation:h}}function r(t,e,o,i,n,a){const s=h({a:i,b:0,c:0,d:i,e:0,f:0},{a:1,b:0,c:0,d:1,e:n/2,f:a/2}),r=Math.cos(-o),c=Math.sin(-o),l=h(s,{a:r,b:c,c:-c,d:r,e:0,f:0}),u=h(l,{a:e,b:0,c:0,d:e,e:0,f:0});return h(u,{a:1,b:0,c:0,d:1,e:-t.x,f:-t.y})}function h(t,e){const o=t.a,i=t.b,n=t.c,a=t.d,s=t.e,r=t.f,h=e.a,c=e.b,l=e.c,u=e.d,d=e.e,m=e.f;return{a:o*h+n*c,b:i*h+a*c,c:o*l+n*u,d:i*l+a*u,e:o*d+n*m+s,f:i*d+a*m+r}}function c(t){const{a:e,b:o,c:i,d:n,e:a,f:s}=t,r={x:a,y:s},h=e*n-o*i;if(Math.abs(h)<1e-10)throw new Error("Matrix is singular and cannot be decomposed");const c=Math.atan2(o,e),l=Math.cos(c),u=Math.sin(c),d=e*l+o*u,m=i*-u+n*l;let p=c,_=d,y=m;for(d<0&&(_=-d,p+=Math.PI),m<0&&(y=-m,p+=Math.PI);p>Math.PI;)p-=2*Math.PI;for(;p<-Math.PI;)p+=2*Math.PI;return{translation:r,rotation:p,scale:{x:_,y:y}}}function l(t,e,o){const i=Math.cos(e),n=Math.sin(e);return{a:o.x*i,b:o.x*n,c:-o.y*n,d:o.y*i,e:t.x,f:t.y}}function u(t){const{a:e,b:o,c:i,d:n,e:a,f:s}=t,r={x:a,y:s},h=e,c=i,l=o,u=n,d=h*h+l*l,m=h*c+l*u,p=m,_=c*c+u*u,y=d+_,f=y*y-4*(d*_-m*p);if(f<0)throw new Error("Invalid transformation matrix");const v=Math.sqrt(f),T=(y+v)/2,g=(y-v)/2,P=Math.sqrt(Math.max(0,T)),x={x:P,y:Math.sqrt(Math.max(0,g))};let b=0;if(P>1e-10){const t=m,e=T-d,o=g-_,i=p,n=Math.sqrt(t*t+o*o),a=Math.sqrt(e*e+i*i);if(n>1e-10&&a>1e-10){const e=t/n,i=o/n,a=(h*e+c*i)/P,s=(l*e+u*i)/P;b=Math.atan2(s,a)}}return{translation:r,rotation:b,scale:x}}function d(e,o,i,n,a,s){let r={x:i/2,y:n/2},h=t.subVector(o,r);return h=t.multiplyVectorByScalar(h,1/a),h=t.rotatePoint(h,s),t.addVector(e,h)}function m(e,o,i,n,a,s){let r={x:o/2,y:i/2},h=t.subVector(e,r);return h=t.multiplyVectorByScalar(h,1/a),h=t.rotatePoint(h,s),t.addVector(n,h)}function p(e,o,i,n){const a=t.multiplyVectorByScalar(e,1/i),s=t.rotatePoint(a,n);return t.addVector(s,o)}function _(e,o,i,n){const a=t.subVector(e,o),s=t.multiplyVectorByScalar(a,i);return t.rotatePoint(s,-n)}function y(e,o,i,n,a,s){let r={x:o/2,y:i/2},h=t.subVector(e,n);return h=t.rotatePoint(h,-s),h=t.multiplyVectorByScalar(h,a),t.addVector(r,h)}function f(t,e,o,i,n,a){const s=y(t,e,o,i,n,a);return!(s.x<0||s.x>e||s.y<0||s.y>o)}function v(e,o,i){return t.multiplyVectorByScalar(t.rotatePoint(e,i),1/o)}function T(e,o,i){return t.multiplyVectorByScalar(t.rotatePoint(e,-i),o)}function g(e,o,i,n){const a=t.multiplyVectorByScalar(o,1/i),s=t.rotatePoint(a,n);return t.subVector(e,s)}function P(t,e,o){const i=Math.cos(o),n=Math.sin(o),a=h({a:1,b:0,c:0,d:1,e:t.x,f:t.y},{a:i,b:n,c:-n,d:i,e:0,f:0});return h(a,{a:1/e,b:0,c:0,d:1/e,e:0,f:0})}function x(t,e){return{x:t.x*e.a+t.y*e.c+e.e,y:t.x*e.b+t.y*e.d+e.f}}function b(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 w(t){if(null==t)return!0;const e=t.min?.x,o=t.max?.x;if(null!=e&&null!=o&&e>=o)return!1;const i=t.min?.y,n=t.max?.y;return!(null!=i&&null!=n&&i>=n)}function B(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 C(t,e){if(b(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 I(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 R(t){const e=I(t);return null!=e?e/2:void 0}function S(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 M(t){const e=S(t);return null!=e?e/2:void 0}function O(e,o,i,n,a,s){if(null==n)return e;let r=d(e,{x:0,y:i},o,i,a,s),h=d(e,{x:0,y:0},o,i,a,s),c=d(e,{x:o,y:i},o,i,a,s),l=d(e,{x:o,y:0},o,i,a,s),u=C(r,n),m=C(c,n),p=C(h,n),_=C(l,n),y=[t.subVector(u,r),t.subVector(m,c),t.subVector(p,h),t.subVector(_,l)],f=Math.abs(y[0].x),v=Math.abs(y[0].y),T=y[0];return y.forEach((t=>{Math.abs(t.x)>f&&(f=Math.abs(t.x),T.x=t.x),Math.abs(t.y)>v&&(v=Math.abs(t.y),T.y=t.y)})),t.addVector(e,T)}function A(t){return void 0===t||!(void 0!==t.min&&void 0!==t.max&&t.min>t.max)}function E(t,e){return V(t,e)||void 0===e||(e.max&&(t=Math.min(e.max,t)),e.min&&(t=Math.max(e.min,t))),t}function V(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 z(t,e){if(k(t,e)||void 0===e)return t;t=H(t);const o=Z(e.start,t),i=Z(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 k(t,e){if(void 0===e)return!0;if(H(e.start)===H(e.end))return!0;if(H(e.start+.01)===H(e.end+.01))return!0;const o=H(t),i=Z(e.start,o),n=Z(e.end,o);return!(e.ccw&&(i<0||n>0)||!e.ccw&&(i>0||n<0))}function U(t,e){if(H(e.start)===H(e.end))return!0;if(H(e.start+.01)===H(e.end+.01))return!0;let o=H(t)-H(e.start);o<0&&(o+=2*Math.PI),!e.positiveDirection&&o>0&&(o=2*Math.PI-o);let i=H(e.end)-H(e.start);return i<0&&(i+=2*Math.PI),!e.positiveDirection&&i>0&&(i=2*Math.PI-i),i>=o}function H(t){return t=((t%=2*Math.PI)+2*Math.PI)%(2*Math.PI)}function Z(t,e){t=H(t);let o=(e=H(e))-t;return o>Math.PI&&(o=-(2*Math.PI-o)),o<-Math.PI&&(o+=2*Math.PI),o}function L(t){return t*Math.PI/180}function N(t){return 180*t/Math.PI}class W{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(!b(e,this._boundaries))return!1;const o=t.subVector(e,this._position);return!(t.magnitude(o)<1e-9&&t.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!!V(t,this._zoomBoundaries)&&((void 0===this._zoomBoundaries||void 0===this._zoomBoundaries.max||E(t,this._zoomBoundaries)!=this._zoomBoundaries.max||this._zoomLevel!=this._zoomBoundaries.max)&&((void 0===this._zoomBoundaries||void 0===this._zoomBoundaries.min||E(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{...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,h=e?-this._rotation:this._rotation,c=Math.sin(h),l=Math.cos(h),u=r*s*l,d=r*s*c,m=-s*r*c,p=r*s*l,_=s*r*l*n-s*r*c*a+o,y=s*r*c*n+s*r*l*a+i;return this.currentCachedTransform={transform:{a:u,b:d,c:m,d:p,e:_,f:y},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:y,cached:!1}}getTRS(t,e){return c(this.getTransform(t,e))}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!!k(t,this._rotationBoundaries)&&(t=H(t),(void 0===this._rotationBoundaries||void 0===this._rotationBoundaries.end||z(t,this._rotationBoundaries)!=this._rotationBoundaries.end||this._rotation!=this._rotationBoundaries.end)&&((void 0===this._rotationBoundaries||void 0===this.rotationBoundaries.start||z(t,this._rotationBoundaries)!=this._rotationBoundaries.start||this._rotation!=this._rotationBoundaries.start)&&(this._rotation=t,!0)))}getCameraOriginInWindow(t){return t}convertFromViewPort2WorldSpace(t){return p(t,this._position,this._zoomLevel,this._rotation)}convertFromWorld2ViewPort(t){return _(t,this._position,this._zoomLevel,this._rotation)}invertFromWorldSpace2ViewPort(e){let o={x:this.viewPortWidth/2,y:this._viewPortHeight/2},i=t.subVector(e,this._position);return i=t.rotatePoint(i,-this._rotation),i=t.multiplyVectorByScalar(i,this._zoomLevel),t.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 D=1e3,F=1e3,q={min:.1,max:10},j={min:{x:-1e4,y:-1e4},max:{x:1e4,y:1e4}},G=void 0;class Y{constructor(t=1e3,e=1e3,o={x:0,y:0},i=0,n=1,s=j,r=q,h=G){this._baseCamera=new W(t,e,o,i,n,s,r,h),this._observer=new a}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={...this._baseCamera.position};return!!this._baseCamera.setPosition(e)&&(this._observer.notifyPan({diff:t.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 p(t,this._baseCamera.position,this._baseCamera.zoomLevel,this._baseCamera.rotation)}convertFromWorld2ViewPort(t){return _(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.subVector(e,this._baseCamera.position);return i=t.rotatePoint(i,-this._baseCamera.rotation),i=t.multiplyVectorByScalar(i,this._baseCamera.zoomLevel),t.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)}getTRS(t,e){return this._baseCamera.getTRS(t,e)}}class X{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){t.target===document.body&&(this._keyfirstPressed.has(t.key)||(this._keyfirstPressed.set(t.key,!0)," "===t.key&&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 K{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 $(t){const e=Math.cos(Math.PI/6),o=Math.cos(Math.PI/3);return{x:t.x*e-t.y*e,y:t.x*o+t.y*o+(t.z??0)}}function J(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 Q(...t){const e=Array.isArray(t[0])?t[0]:t;return(t,...o)=>e.reduce(((t,e)=>e(t,...o)),t)}class tt{constructor(t){this._observers=new n,this.lastRect=t.getBoundingClientRect(),this.resizeObserver=new ResizeObserver((t=>{for(const e of t){const t=et(e.target.getBoundingClientRect(),window.getComputedStyle(e.target));ot(this.lastRect,t)&&(this.publishPositionUpdate(t),this.lastRect=t)}})),this.intersectionObserver=new IntersectionObserver((t=>{for(const e of t)if(e.isIntersecting){const t=et(e.boundingClientRect,window.getComputedStyle(e.target));ot(this.lastRect,t)&&(this.publishPositionUpdate(t),this.lastRect=t)}})),this.scrollHandler=(()=>{const e=et(t.getBoundingClientRect(),window.getComputedStyle(t));ot(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),this.resizeHandler=(()=>{const e=et(t.getBoundingClientRect(),window.getComputedStyle(t));ot(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=et(t.getBoundingClientRect(),window.getComputedStyle(t));ot(this.lastRect,e)&&(this.publishPositionUpdate(e),this.lastRect=e)}).bind(this),this.resizeHandler=(()=>{const e=et(t.getBoundingClientRect(),window.getComputedStyle(t));ot(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 et(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),h=parseFloat(e.borderRightWidth),c=parseFloat(e.borderBottomWidth),l=t.left+o+s,u=t.top+i+r,d=t.width-o-n-s-h,m=t.height-i-a-r-c;return new DOMRect(l,u,d,m)}function ot(t,e){return t.top!==e.top||t.left!==e.left||t.width!==e.width||t.height!==e.height}const it={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 nt(t){return new Proxy(t,{get(t,e,o){const i=Reflect.get(t,e,t);return"string"==typeof e&&e in it&&"function"==typeof i?function(...o){const n=[...o];if("drawImage"===e&&9===o.length){const e=at(o);return i.apply(t,e)}{const t=it[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 at(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}function st(t,e,o,i,n,a="red"){let s=n/2;s/=o,t.beginPath(),t.strokeStyle=a,t.lineWidth=2/o,i?(t.moveTo(e.x-s,e.y),t.lineTo(e.x+s,e.y),t.moveTo(e.x,e.y-s),t.lineTo(e.x,e.y+s)):(t.moveTo(e.x-s,-e.y),t.lineTo(e.x+s,-e.y),t.moveTo(e.x,-e.y-s),t.lineTo(e.x,-e.y+s)),t.stroke(),t.lineWidth=3}function rt(t,e,o){if(!B(e))return;const i=I(e),n=S(e),a=null==e?void 0:e.min,s=null==a?void 0:a.x,r=null==a?void 0:a.y;null!=s&&null!=r&&null!=i&&null!=n&&(t.beginPath(),t.strokeStyle="blue",t.lineWidth=100,o?t.roundRect(s,r,i,n,5):t.roundRect(s,-r,i,-n,5),t.stroke(),t.lineWidth=3,t.strokeStyle="black")}function ht(t,e,o,i){if(!B(e))return;const n=I(e),a=S(e),s=null==e?void 0:e.min,r=null==s?void 0:s.x,h=null==s?void 0:s.y;null!=r&&null!=h&&null!=n&&null!=a&&(t.lineWidth=1/o,t.beginPath(),t.strokeStyle="rgba(87, 173, 72, 0.8)",t.moveTo(0,0),i?t.lineTo(0,h+a):t.lineTo(0,-h-a),t.stroke(),t.beginPath(),t.strokeStyle="rgba(220, 59, 59, 0.8)",t.moveTo(0,0),t.lineTo(r+n,0),t.stroke(),t.strokeStyle="black")}function ct(e,o,i,n,a,s,r){let h=t.unitVectorFromA2B(o,i),c=t.unitVectorFromA2B(n,o),l=t.distanceBetweenPoints(o,i);t.distanceBetweenPoints(o,n);let u=J(l),d=Math.pow(10,u)/10,m=Math.ceil(o.x/d)*d,p=Math.floor(i.x/d)*d,_=s?Math.floor(o.y/d)*d:Math.ceil(n.y/d)*d,y=s?Math.ceil(n.y/d)*d:Math.floor(o.y/d)*d;for(let i=m;i<=p;i+=d){const a=t.addVector({x:i,y:o.y},t.multiplyVectorByScalar(h,d)),s=t.addVector({x:i,y:n.y},t.multiplyVectorByScalar(h,d));e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=.5/r,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke()}for(let n=_;n<=y;n+=d){const a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(c,d)),s=t.addVector({x:i.x,y:n},t.multiplyVectorByScalar(c,d));e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=.5/r,e.moveTo(a.x,a.y),e.lineTo(s.x,s.y),e.stroke()}}function lt(e,o,i,n,a,s,r){let h=t.unitVectorFromA2B(o,i),c=t.unitVectorFromA2B(n,o),l=J(t.distanceBetweenPoints(o,i)),u=Math.pow(10,l),d=u/2,m=u/10,p=1;l<=0&&(p=Math.pow(10,1-l));let _=Math.ceil(o.x/u)*u,y=Math.floor(i.x/u)*u,f=s?Math.ceil(o.y/u)*u:Math.floor(n.y/u)*u;s?Math.floor(n.y/u):Math.ceil(o.y/u);let v=Math.ceil(o.x/d)*d,T=Math.floor(i.x/d)*d,g=s?Math.ceil(o.y/d)*d:Math.floor(n.y/d)*d,P=s?Math.floor(n.y/d)*d:Math.ceil(o.y/d)*d,x=Math.ceil(o.x/m)*m,b=Math.floor(i.x/m)*m,w=s?Math.ceil(o.y/m)*m:Math.floor(n.y/m)*m,B=s?Math.floor(n.y/m)*m:Math.ceil(o.y/m)*m,C=d*r,I=m*r;e.font=`bold ${20/r}px Helvetica`;const R=e.measureText(""+-(d+v)),S=R.fontBoundingBoxAscent+R.fontBoundingBoxDescent,M=e.measureText(""+-(m+x)),O=M.fontBoundingBoxAscent+M.fontBoundingBoxDescent,A=Math.ceil((y-_)/u);for(let i=0;i<=A;i++){const n=_+i*u;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=5/r;let a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,50/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,-50/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.textAlign="center",e.textBaseline="middle",e.font=`bold ${20/r}px Helvetica`;const h=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`),l=h.fontBoundingBoxAscent+h.fontBoundingBoxDescent;s?(a=t.addVector(a,{x:0,y:l/2+.2*l}),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y)):(a=t.addVector(a,{x:0,y:-l/2-.2*l}),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,-a.y)),e.stroke()}const E=Math.ceil((y-_)/u);for(let i=0;i<=E;i++){const n=f+i*u;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=5/r;let a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,-50/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,50/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.textAlign="center",e.textBaseline="middle",e.font=`bold ${20/r}px Helvetica`;const c=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`);a=t.addVector(a,{x:c.width/2+.3*c.width,y:0}),s?e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y):e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,-a.y),e.stroke()}const V=Math.ceil((T-v)/d);for(let i=0;i<=V;i++){const n=v+i*d;if(Math.floor(n*p)%Math.floor(u*p)==0)continue;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=3/r;let a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,25/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,-25/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.font=15/r+"px Helvetica";const h=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`);if(C>2*R.width){e.textAlign="center",e.textBaseline="middle";const o=h.fontBoundingBoxAscent+h.fontBoundingBoxDescent;s?a=t.addVector(a,{x:0,y:o/2+.2*o}):(a=t.addVector(a,{x:0,y:-o/2-.2*o}),a=t.flipYAxis(a)),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y)}e.stroke()}const z=Math.ceil((P-g)/d);for(let i=0;i<=z;i++){const n=g+i*d;if(Math.floor(n*p)%Math.floor(u*p)==0)continue;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=3/r;let a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,-25/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,25/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.font=18/r+"px Helvetica";const c=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`);c.fontBoundingBoxAscent,c.fontBoundingBoxDescent,C>2*S&&(e.textAlign="center",e.textBaseline="middle",a=t.addVector(a,{x:c.width/2+.3*c.width,y:0}),s||(a=t.flipYAxis(a)),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y)),e.stroke()}const k=Math.ceil((b-x)/m);for(let i=0;i<=k;i++){const n=x+i*m;if(Math.floor(n*p)%Math.floor(u*p)==0||Math.floor(n*p)%Math.floor(d*p)==0)continue;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=1/r;let a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,12.5/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:n,y:o.y},t.multiplyVectorByScalar(c,-12.5/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.font=10/r+"px Helvetica";const h=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`);if(I>2*M.width){e.textAlign="center",e.textBaseline="middle";const o=h.fontBoundingBoxAscent+h.fontBoundingBoxDescent;s?a=t.addVector(a,{x:0,y:o/2+.2*o}):(a=t.addVector(a,{x:0,y:-o/2-.2*o}),a=t.flipYAxis(a)),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y)}e.stroke()}const U=Math.ceil((B-w)/m);for(let i=0;i<=U;i++){const n=w+i*m;if(Math.floor(n*p)%Math.floor(u*p)==0||Math.floor(n*p)%Math.floor(d*p)==0)continue;e.beginPath(),e.strokeStyle="black",e.fillStyle="black",e.lineWidth=1/r;let a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,-12.5/r));s?e.moveTo(a.x,a.y):e.moveTo(a.x,-a.y),a=t.addVector({x:o.x,y:n},t.multiplyVectorByScalar(h,12.5/r)),s?e.lineTo(a.x,a.y):e.lineTo(a.x,-a.y),e.font=12/r+"px Helvetica";const c=e.measureText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`);c.fontBoundingBoxAscent,c.fontBoundingBoxDescent,I>2*O&&(e.textAlign="center",e.textBaseline="middle",a=t.addVector(a,{x:c.width/2+.3*c.width,y:0}),s||(a=t.flipYAxis(a)),e.fillText(`${Math.abs(n)%1==0?n.toFixed(0):n.toFixed(2)}`,a.x,a.y)),e.stroke()}}function ut(t,e,o,i,n=20,a="red"){n/=o,t.font=20/o+"px Arial",t.fillStyle=a,i?t.fillText(`x: ${e.x.toFixed(2)}, y: ${e.y.toFixed(2)}`,e.x+n,e.y+n):t.fillText(`x: ${e.x.toFixed(2)}, y: ${e.y.toFixed(2)}`,e.x+n,-e.y-n),t.fillStyle="black"}function dt(t,e,o){t.beginPath(),t.strokeStyle="rgba(87, 173, 72, 0.8)",o?t.arc(e.x,e.y,5,0,2*Math.PI):t.arc(e.x,-e.y,5,0,2*Math.PI),t.stroke(),t.strokeStyle="black"}function mt(e,o,i,n,a=1,s=.3){const r=t.distanceBetweenPoints(i,n),h=10<r*o*.5?10/o:.5*r,c=r-h,l=t.linearInterpolation(i,n,c/r);e.beginPath(),e.lineWidth=a/o,e.moveTo(i.x,i.y),e.lineTo(l.x,l.y),e.stroke();const u=t.rotatePoint(t.unitVectorFromA2B(n,i),Math.PI/2),d=t.addVector(l,t.multiplyVectorByScalar(u,.5*h)),m=t.subVector(l,t.multiplyVectorByScalar(u,.5*h));e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(d.x,d.y),e.lineTo(m.x,m.y),e.closePath(),e.fill()}const pt=30,_t=9,yt=15,ft=10,vt=2.5,Tt=20,gt=10;function Pt(t,e,o,i,n,a){const{minMajorTickValue:s,maxMajorTickValue:r,majorTickStep:h,minMinTickValue:c,maxMaxTickValue:l,minTickStep:u,minHalfTickValue:d,maxHalfTickValue:m,halfTickStep:p,calibrationMultiplier:_,normalizedOrderOfMagnitude:y}=wt(e.x,o.x);t.save(),t.strokeStyle="red";for(let o=s;o<=r;o+=h){bt(t,a,{x:o*_,y:e.y},n?30/a:-30/a,o*_,{textOffset:n?10/a:-10/a,fontSize:20})}for(let o=c;o<=l;o+=u){if(o%h==0)continue;if(o%p==0)continue;bt(t,a,{x:o*_,y:e.y},n?9/a:-9/a,o)}for(let o=d;o<=m;o+=p){if(o%h==0)continue;bt(t,a,{x:o*_,y:e.y},n?15/a:-15/a,o*_,{textOffset:n?2.5/a:-2.5/a,fontSize:10,color:"red"})}t.restore();const{minMajorTickValue:f,maxMajorTickValue:v,majorTickStep:T,minMinTickValue:g,maxMaxTickValue:P,minTickStep:x,minHalfTickValue:b,maxHalfTickValue:w,halfTickStep:B,calibrationMultiplier:C}=wt(e.y,i.y,y);t.save(),t.strokeStyle="green";for(let o=f;o<=v;o+=T){xt(t,a,{x:e.x,y:o*C},30/a,o,{textOffset:10/a,fontSize:20})}for(let o=b;o<=w;o+=B){if(o%T==0)continue;xt(t,a,{x:e.x,y:o*C},15/a,o,{textOffset:2.5/a,fontSize:10})}for(let o=g;o<=P;o+=x){if(o%T==0)continue;xt(t,a,{x:e.x,y:o*C},9/a,o)}t.restore()}function xt(t,e,o,i,n,a){const s=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(),!s)return;const r=a.color??"green";t.save(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=r,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 bt(t,e,o,i,n,a){const s=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(),!s)return;const r=a.color??"red";t.save(),t.textAlign="center",t.textBaseline="top",t.fillStyle=r,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 wt(t,e,o){const i=Math.min(t,e),n=Math.max(t,e),a=o||J(n-i),s=Math.max(1,a),r=Math.pow(10,s-a),h=(t>0?Math.floor(i*r/Math.pow(10,s)):Math.ceil(i*r/Math.pow(10,s)))*Math.pow(10,s),c=(e>0?Math.floor(n*r/Math.pow(10,s)):Math.ceil(n*r/Math.pow(10,s)))*Math.pow(10,s),l=Math.pow(10,s),u=s-1,d=l/2;return{minMajorTickValue:h,maxMajorTickValue:c,majorTickStep:l,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}}function Bt(t,e,o,i){const n=I(t),a=S(t);if(null==n||null==a)return;let s=e/Math.abs(n*Math.cos(i)),r=e/Math.abs(a*Math.cos(i)),h=o/Math.abs(n*Math.sin(i)),c=o/Math.abs(a*Math.sin(i));s==1/0&&(s=0),r==1/0&&(r=0),h==1/0&&(h=0),c==1/0&&(c=0);const l=o/a,u=e/n;return Math.max(l,u,s,r,h,c)}function Ct(t,e){return null!=e&&(null==t||e!=1/0&&(void 0!==t&&(null==t.min||e>t.min)))}function It(t,e,o,i){const n=I(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 Rt(t,e,o,i){const n=S(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 St(t,e,o){return o.clampZoom?E(t,e.zoomBoundaries):t}function Mt(t,e,o){if(!o.clampZoom)return t;let i=e.zoomLevel+t;return i=E(i,e.zoomBoundaries),t=i-e.zoomLevel}function Ot(t,e,o){return o.restrictZoom?e.zoomLevel:t}function At(t,e,o){return o.restrictZoom?0:t}function Et(){return Q(St,Ot)}function Vt(){return Q(Mt,At)}function zt(){return Q(Ut,Zt)}function kt(){return Q(Ht,Lt)}function Ut(e,o,i){let n=t.subVector(e,o.position);if(n=Nt(n,o,i),0===n.x&&0===n.y)return e;return t.addVector(o.position,n)}function Ht(t,e,o){return t=Nt(t,e,o)}function Zt(t,e,o){if(!o.clampTranslation)return t;let i=C(t,e.boundaries);return o.limitEntireViewPort&&(i=O(t,e.viewPortWidth,e.viewPortHeight,e.boundaries,e.zoomLevel,e.rotation)),i}function Lt(e,o,i){if(!i.clampTranslation)return e;let n=t.subVector(C(t.addVector(o.position,e),o.boundaries),o.position);return i.limitEntireViewPort&&(n=t.subVector(O(t.addVector(o.position,e),o.viewPortWidth,o.viewPortHeight,o.boundaries,o.zoomLevel,o.rotation),o.position)),n}function Nt(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.rotatePoint({x:0,y:1},o.rotation),n=t.dotProduct(i,e);e=t.multiplyVectorByScalar(i,n)}if(i.restrictRelativeYTranslation){const i=t.rotatePoint({x:1,y:0},o.rotation),n=t.dotProduct(i,e);e=t.multiplyVectorByScalar(i,n)}return e}function Wt(e,o){return t.multiplyVectorByScalar(t.rotatePoint(e,o.rotation),1/o.zoomLevel)}function Dt(t,e,o){if(!o.clampRotation)return t;const i=z(H(e.rotation+t),e.rotationBoundaries);return Z(e.rotation,i)}function Ft(t,e,o){return o.restrictRotation?0:t}function qt(t,e,o){if(!o.clampRotation)return t;return z(t,e.rotationBoundaries)}function jt(t,e,o){return o.restrictRotation?e.rotation:t}function Gt(){return Q(Ft,Dt)}function Yt(){return Q(jt,qt)}class Xt{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 n}queuePositionUpdate(t,e){this.queuePositionUpdateCount++,this.queuePositionUpdateTo({x:t,y:e})}queuePositionUpdateTo(t){this.queuePositionUpdateToCount++,this.nextPosition={...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={...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={...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 Kt{constructor(){this.nextRotation=null,this.delta=0,this.queueRotationUpdateCount=0,this.queueRotationUpdateToCount=0,this.queueRotationUpdateByCount=0,this.lastUpdateCount=0,this.observable=new n}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 $t{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 n}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 Jt{constructor(t,e=new Y){this._panBy=kt(),this._panTo=zt(),this._zoomTo=Et(),this._zoomBy=Vt(),this._rotateBy=Gt(),this._rotateTo=Yt(),this._config={...t,restrictRotation:!1,clampRotation:!0},this._camera=e,this._positionBatcher=new Xt,this._zoomBatcher=new $t,this._rotationBatcher=new Kt}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.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.multiplyVectorByScalar(t.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={...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.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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=v(t.subVector(i,a),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.addVector(this._camera.position,r))}configure(t){this._config={...this._config,...t}}cleanup(){}setup(){}}function Qt(t){return new Jt({limitEntireViewPort:!0,restrictRelativeXTranslation:!1,restrictRelativeYTranslation:!1,restrictXTranslation:!1,restrictYTranslation:!1,restrictZoom:!1,clampTranslation:!0,clampZoom:!0},t)}class te{constructor(t,e=new Y){this._panBy=kt(),this._panTo=zt(),this._zoomTo=Et(),this._zoomBy=Vt(),this._rotateBy=Gt(),this._rotateTo=Yt(),this._config={...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.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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.subVector(i,a),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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=v(t.subVector(a,i),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.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=v(t.subVector(a,i),this._camera.zoomLevel,this._camera.rotation),r=this._panBy(s,this._camera,this._config);this._camera.setPosition(t.addVector(this._camera.position,r))}panByViewPort(e){const o=t.multiplyVectorByScalar(t.rotatePoint(e,this._camera.rotation),1/this._camera.zoomLevel),i=this._panBy(o,this._camera,this._config);this._camera.setPosition(t.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={...t}}configure(t){this._config={...this._config,...t}}cleanup(){}setup(){}update(){}}function ee(t){return new te({limitEntireViewPort:!0,restrictRelativeXTranslation:!1,restrictRelativeYTranslation:!1,restrictXTranslation:!1,restrictYTranslation:!1,restrictZoom:!1,clampTranslation:!0,clampZoom:!0},t)}class oe{constructor(t=ee(new Y)){this._cameraRig=t}notifyPanInput(t){this._cameraRig.panByViewPort(t)}notifyZoomInput(t,e){this._cameraRig.zoomByAt(t,e)}notifyRotationInput(t){this._cameraRig.rotateBy(t)}}function ie(t){const e=ee(t);return new oe(e)}function ne(t){return new oe(t)}class ae extends e{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}}class se extends o{constructor(){super(),this.eventReactions={userPanByInput:{action:this.userPanByInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT"},userPanToInput:{action:this.userPanToInputHandler,defaultTargetState:"ACCEPTING_USER_INPUT