UNPKG

@ue-too/board

Version:

<h1 align="center"> uē-tôo </h1> <p align="center"> pan, zoom, rotate, and more with your html canvas. </p>

1 lines 92.4 kB
import{PointCal as _Q}from"@ue-too/math";class f{observers=[];subscribe(Q,q){if(this.observers.push(Q),q?.signal){if(q.signal.aborted)return this.observers=this.observers.filter((J)=>J!==Q),()=>{};let $=()=>{this.observers=this.observers.filter((J)=>J!==Q),q.signal?.removeEventListener("abort",$)};q.signal.addEventListener("abort",$)}return()=>{this.observers=this.observers.filter(($)=>$!==Q)}}notify(...Q){this.observers.forEach((q)=>queueMicrotask(()=>q(...Q)))}}class i{observers=[];subscribe(Q,q){if(this.observers.push(Q),q?.signal){if(q.signal.aborted)return this.observers=this.observers.filter((J)=>J!==Q),()=>{};let $=()=>{this.observers=this.observers.filter((J)=>J!==Q),q.signal?.removeEventListener("abort",$)};q.signal.addEventListener("abort",$)}return()=>{this.observers=this.observers.filter(($)=>$!==Q)}}notify(...Q){this.observers.forEach((q)=>q(...Q))}}class RQ{pan;zoom;rotate;all;constructor(){this.pan=new f,this.zoom=new f,this.rotate=new f,this.all=new f}notifyPan(Q,q){this.pan.notify(Q,q),this.all.notify({type:"pan",diff:Q.diff},q)}notifyZoom(Q,q){this.zoom.notify(Q,q),this.all.notify({type:"zoom",deltaZoomAmount:Q.deltaZoomAmount},q)}notifyRotate(Q,q){this.rotate.notify(Q,q),this.all.notify({type:"rotate",deltaRotation:Q.deltaRotation},q)}on(Q,q,$){switch(Q){case"pan":return this.pan.subscribe(q,$);case"zoom":return this.zoom.subscribe(q,$);case"rotate":return this.rotate.subscribe(q,$);case"all":return this.all.subscribe(q,$);default:throw Error(`Invalid event name: ${Q}`)}}}import{PointCal as o}from"@ue-too/math";function Yq(Q,q,$,J){let{a:U,b:K,c:G,d:Y,e:j,f:B}=Q,W=-Math.atan2(K,U),_=Math.sqrt(U*U+K*K)/q,E=[j,B];E=[E[0]/q,E[1]/q],E=[E[0]-$/2,E[1]-J/2];let A=Math.cos(W),I=Math.sin(W);E=[A*E[0]-I*E[1],I*E[0]+A*E[1]],E=[E[0]/_,E[1]/_];let H=-E[0],g=-E[1];return{position:{x:H,y:g},zoom:_,rotation:W}}function i$(Q,q,$,J,U,K){let Y=a({a:J,b:0,c:0,d:J,e:0,f:0},{a:1,b:0,c:0,d:1,e:U/2,f:K/2}),j=Math.cos(-$),B=Math.sin(-$),W=a(Y,{a:j,b:B,c:-B,d:j,e:0,f:0}),F=a(W,{a:q,b:0,c:0,d:q,e:0,f:0});return a(F,{a:1,b:0,c:0,d:1,e:-Q.x,f:-Q.y})}function a(Q,q){let{a:$,b:J,c:U,d:K,e:G,f:Y}=Q,j=q.a,B=q.b,W=q.c,F=q.d,_=q.e,E=q.f;return{a:$*j+U*B,b:J*j+K*B,c:$*W+U*F,d:J*W+K*F,e:$*_+U*E+G,f:J*_+K*E+Y}}function Eq(Q){let{a:q,b:$,c:J,d:U,e:K,f:G}=Q,Y={x:K,y:G},j=q*U-$*J;if(Math.abs(j)<0.0000000001)throw Error("Matrix is singular and cannot be decomposed");let B=Math.atan2($,q),W=Math.cos(B),F=Math.sin(B),_=q*W+$*F,E=J*-F+U*W,A=B,I=_,H=E;if(_<0)I=-_,A+=Math.PI;if(E<0)H=-E,A+=Math.PI;while(A>Math.PI)A-=2*Math.PI;while(A<-Math.PI)A+=2*Math.PI;return{translation:Y,rotation:A,scale:{x:I,y:H}}}function a$(Q,q,$){let J=Math.cos(q),U=Math.sin(q);return{a:$.x*J,b:$.x*U,c:-$.y*U,d:$.y*J,e:Q.x,f:Q.y}}function o$(Q){let{a:q,b:$,c:J,d:U,e:K,f:G}=Q,Y={x:K,y:G},j=q,B=J,W=$,F=U,_=j*j+W*W,E=j*B+W*F,A=E,I=B*B+F*F,H=_+I,g=_*I-E*A,z=H*H-4*g;if(z<0)throw Error("Invalid transformation matrix");let Z=Math.sqrt(z),O=(H+Z)/2,x=(H-Z)/2,y=Math.sqrt(Math.max(0,O)),m=Math.sqrt(Math.max(0,x)),r={x:y,y:m},n=0;if(y>0.0000000001){let p=E,k=O-_,w=x-I,R=A,C=Math.sqrt(p*p+w*w),EQ=Math.sqrt(k*k+R*R);if(C>0.0000000001&&EQ>0.0000000001){let UQ=p/C,kQ=w/C,Gq=k/EQ,Xq=R/EQ,SQ=(j*UQ+B*kQ)/y,wQ=(W*UQ+F*kQ)/y;n=Math.atan2(wQ,SQ)}}return{translation:Y,rotation:n,scale:r}}import{PointCal as jq}from"@ue-too/math";function jQ(Q,q={x:0,y:0},$=!1){let J=jq.subVector(Q,q);if($)J.y=-J.y;return J}function Nq(Q,q={x:0,y:0},$=!1){if($)Q.y=-Q.y;return jq.addVector(Q,q)}import{PointCal as KQ}from"@ue-too/math";function IQ(Q,q,$,J,U=!1){let K=KQ.multiplyVectorByScalar(Q,1/$),G=KQ.rotatePoint(K,J);if(U)G.y=-G.y;return KQ.addVector(G,q)}function yQ(Q,q,$,J,U=!1){let K=KQ.subVector(Q,q);if(U)K.y=-K.y;let G=KQ.multiplyVectorByScalar(K,$);return KQ.rotatePoint(G,-J)}function NQ(Q,q,$,J,U,K){let G=jQ(q,{x:$/2,y:J/2},!1);return IQ(G,Q,U,K,!1)}function N9(Q,q,$,J,U,K){let G=jQ(Q,{x:q/2,y:$/2},!1);return IQ(G,J,U,K,!1)}function l(Q,q,$,J){return IQ(Q,q,$,J,!1)}function HQ(Q,q,$,J){return yQ(Q,q,$,J,!1)}function Y$(Q,q,$,J,U,K){let G=yQ(Q,J,U,K,!1);return Nq(G,{x:q/2,y:$/2},!1)}function F9(Q,q,$,J,U,K){let G=Y$(Q,q,$,J,U,K);if(G.x<0||G.x>q||G.y<0||G.y>$)return!1;return!0}function bQ(Q,q,$){return o.multiplyVectorByScalar(o.rotatePoint(Q,$),1/q)}function _9(Q,q,$){return o.multiplyVectorByScalar(o.rotatePoint(Q,-$),q)}function V9(Q,q,$,J){let U=o.multiplyVectorByScalar(q,1/$),K=o.rotatePoint(U,J);return o.subVector(Q,K)}function B9(Q,q,$){let J=Math.cos($),U=Math.sin($),K=a({a:1,b:0,c:0,d:1,e:Q.x,f:Q.y},{a:J,b:U,c:-U,d:J,e:0,f:0});return a(K,{a:1/q,b:0,c:0,d:1/q,e:0,f:0})}function A9(Q,q){return{x:Q.x*q.a+Q.y*q.c+q.e,y:Q.x*q.b+Q.y*q.d+q.f}}import{PointCal as FQ}from"@ue-too/math";function CQ(Q,q){if(q==null)return!0;let $=!1,J=!1,U=!1,K=!1;if(q.max==null||q.max.x==null||Q.x<=q.max.x)J=!0;if(q.min==null||q.min.x==null||Q.x>=q.min.x)$=!0;if(q.max==null||q.max.y==null||Q.y<=q.max.y)U=!0;if(q.min==null||q.min.y==null||Q.y>=q.min.y)K=!0;return $&&J&&U&&K}function O9(Q){if(Q==null)return!0;let q=Q.min?.x,$=Q.max?.x;if(q!=null&&$!=null&&q>=$)return!1;let J=Q.min?.y,U=Q.max?.y;if(J!=null&&U!=null&&J>=U)return!1;return!0}function fQ(Q){if(Q==null)return!1;if(Q.max==null||Q.min==null)return!1;if(Q.max.x==null||Q.max.y==null||Q.min.x==null||Q.min.y==null)return!1;return!0}function e(Q,q){if(CQ(Q,q)||q==null)return Q;let $={x:Q.x,y:Q.y},J=q.min;if(J!=null){if(J.x!=null)$.x=Math.max($.x,J.x);if(J.y!=null)$.y=Math.max($.y,J.y)}if(J=q.max,J!=null){if(J.x!=null)$.x=Math.min($.x,J.x);if(J.y!=null)$.y=Math.min($.y,J.y)}return $}function t(Q){if(Q==null||Q.min==null||Q.max==null||Q.min.x==null||Q.max.x==null)return;return Q.max.x-Q.min.x}function Fq(Q){let q=t(Q);return q!=null?q/2:void 0}function QQ(Q){if(Q==null||Q.min==null||Q.max==null||Q.min.y==null||Q.max.y==null)return;return Q.max.y-Q.min.y}function _q(Q){let q=QQ(Q);return q!=null?q/2:void 0}function LQ(Q,q,$,J,U,K){if(J==null)return Q;let G=NQ(Q,{x:0,y:$},q,$,U,K),Y=NQ(Q,{x:0,y:0},q,$,U,K),j=NQ(Q,{x:q,y:$},q,$,U,K),B=NQ(Q,{x:q,y:0},q,$,U,K),W=e(G,J),F=e(j,J),_=e(Y,J),E=e(B,J),A=FQ.subVector(W,G),I=FQ.subVector(F,j),H=FQ.subVector(_,Y),g=FQ.subVector(E,B),z=[A,I,H,g],Z=Math.abs(z[0].x),O=Math.abs(z[0].y),x=z[0];return z.forEach((y)=>{if(Math.abs(y.x)>Z)Z=Math.abs(y.x),x.x=y.x;if(Math.abs(y.y)>O)O=Math.abs(y.y),x.y=y.y}),FQ.addVector(Q,x)}function z9(Q){if(Q===void 0)return!0;if(Q.min!==void 0&&Q.max!==void 0&&Q.min>Q.max)return!1;return!0}function GQ(Q,q){if(PQ(Q,q)||q===void 0)return Q;if(q.max)Q=Math.min(q.max,Q);if(q.min)Q=Math.max(q.min,Q);return Q}function PQ(Q,q){if(q===void 0)return!0;if(Q<=0||q!==void 0&&(q.max!==void 0&&q.max<Q||q.min!==void 0&&q.min>Q))return!1;return!0}function YQ(Q,q){if(hQ(Q,q)||q===void 0)return Q;Q=S(Q);let $=XQ(q.start,Q),J=XQ(q.end,Q);if(q.ccw&&($<0||J>0)||!q.ccw&&($>0||J<0)){if(Math.abs($)===Math.abs(J))return q.startAsTieBreaker?q.start:q.end;return Math.abs($)<Math.abs(J)?q.start:q.end}return Q}function hQ(Q,q){if(q===void 0)return!0;if(S(q.start)===S(q.end))return!0;if(S(q.start+0.01)===S(q.end+0.01))return!0;let $=S(Q),J=XQ(q.start,$),U=XQ(q.end,$);if(q.ccw&&(J<0||U>0)||!q.ccw&&(J>0||U<0))return!1;return!0}function Z9(Q,q){if(S(q.start)===S(q.end))return!0;if(S(q.start+0.01)===S(q.end+0.01))return!0;let J=S(Q)-S(q.start);if(J<0)J+=Math.PI*2;if(!q.positiveDirection&&J>0)J=Math.PI*2-J;let U=S(q.end)-S(q.start);if(U<0)U+=Math.PI*2;if(!q.positiveDirection&&U>0)U=Math.PI*2-U;return U>=J}function S(Q){return Q=Q%(Math.PI*2),Q=(Q+Math.PI*2)%(Math.PI*2),Q}function XQ(Q,q){Q=S(Q),q=S(q);let $=q-Q;if($>Math.PI)$=-(Math.PI*2-$);if($<-Math.PI)$+=Math.PI*2;return $}function T9(Q){return Q*Math.PI/180}function S9(Q){return Q*180/Math.PI}import{PointCal as qQ}from"@ue-too/math";class OQ{_position;_rotation;_zoomLevel;currentCachedTransform;currentCachedTRS;_viewPortWidth;_viewPortHeight;_boundaries;_zoomBoundaries;_rotationBoundaries;constructor(Q=1000,q=1000,$={x:0,y:0},J=0,U=1,K={min:{x:-1e4,y:-1e4},max:{x:1e4,y:1e4}},G={min:0.1,max:10},Y=void 0){this._position=$,this._zoomLevel=U,this._rotation=J,this._viewPortHeight=q,this._viewPortWidth=Q,this._zoomBoundaries=G,this._rotationBoundaries=Y,this._boundaries=K}get boundaries(){return this._boundaries}set boundaries(Q){this._boundaries=Q}get viewPortWidth(){return this._viewPortWidth}set viewPortWidth(Q){this._viewPortWidth=Q}get viewPortHeight(){return this._viewPortHeight}set viewPortHeight(Q){this._viewPortHeight=Q}get position(){return{...this._position}}setPosition(Q){if(!CQ(Q,this._boundaries))return!1;let q=qQ.subVector(Q,this._position);if(qQ.magnitude(q)<0.000000001&&qQ.magnitude(q)<1/this._zoomLevel)return!1;return this._position=Q,!0}get zoomLevel(){return this._zoomLevel}get zoomBoundaries(){return this._zoomBoundaries}set zoomBoundaries(Q){let q={...Q};if(q!==void 0&&q.min!==void 0&&q.max!==void 0&&q.min>q.max){let $=q.max;q.max=q.min,q.min=$}this._zoomBoundaries=q}setMaxZoomLevel(Q){if(this._zoomBoundaries==null)this._zoomBoundaries={min:void 0,max:void 0};if(this._zoomBoundaries.min!=null&&this._zoomBoundaries.min>Q||this._zoomLevel>Q)return!1;return this._zoomBoundaries.max=Q,console.trace("setMaxZoomLevel",Q),!0}setMinZoomLevel(Q){if(this._zoomBoundaries==null)this._zoomBoundaries={min:void 0,max:void 0};if(this._zoomBoundaries.max!=null&&this._zoomBoundaries.max<Q)return!1;if(this._zoomBoundaries.min=Q,this._zoomLevel<Q)this._zoomLevel=Q;return console.trace("setMinZoomLevel",Q),!0}setZoomLevel(Q){if(!PQ(Q,this._zoomBoundaries))return!1;if(this._zoomBoundaries!==void 0&&this._zoomBoundaries.max!==void 0&&GQ(Q,this._zoomBoundaries)==this._zoomBoundaries.max&&this._zoomLevel==this._zoomBoundaries.max)return!1;if(this._zoomBoundaries!==void 0&&this._zoomBoundaries.min!==void 0&&GQ(Q,this._zoomBoundaries)==this._zoomBoundaries.min&&this._zoomLevel==this._zoomBoundaries.min)return!1;return this._zoomLevel=Q,!0}get rotation(){return this._rotation}get rotationBoundaries(){return this._rotationBoundaries}set rotationBoundaries(Q){if(Q!==void 0&&Q.start!==void 0&&Q.end!==void 0&&Q.start>Q.end){let q=Q.end;Q.end=Q.start,Q.start=q}this._rotationBoundaries=Q}getTransform(Q=1,q=!0){if(this.currentCachedTransform!==void 0&&this.currentCachedTransform.devicePixelRatio===Q&&this.currentCachedTransform.alignCoorindate===q&&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};let $=Q*this._viewPortWidth/2,J=Q*this._viewPortHeight/2,U=-this._position.x,K=q?-this._position.y:this._position.y,G=Q,Y=this._zoomLevel,j=q?-this._rotation:this._rotation,B=Math.sin(j),W=Math.cos(j),F=Y*G*W,_=Y*G*B,E=-G*Y*B,A=Y*G*W,I=G*Y*W*U-G*Y*B*K+$,H=G*Y*B*U+G*Y*W*K+J;return this.currentCachedTransform={transform:{a:F,b:_,c:E,d:A,e:I,f:H},position:this._position,rotation:this._rotation,zoomLevel:this._zoomLevel,alignCoorindate:q,devicePixelRatio:Q,viewPortWidth:this._viewPortWidth,viewPortHeight:this._viewPortHeight},{a:F,b:_,c:E,d:A,e:I,f:H,cached:!1}}getTRS(Q=1,q=!0){let $=this.getTransform(Q,q);if(this.currentCachedTRS!==void 0&&this.currentCachedTRS.transformMatrix.a===$.a&&this.currentCachedTRS.transformMatrix.b===$.b&&this.currentCachedTRS.transformMatrix.c===$.c&&this.currentCachedTRS.transformMatrix.d===$.d&&this.currentCachedTRS.transformMatrix.e===$.e&&this.currentCachedTRS.transformMatrix.f===$.f)return{scale:this.currentCachedTRS.scale,rotation:this.currentCachedTRS.rotation,translation:this.currentCachedTRS.translation,cached:!0};let J=Eq($);return this.currentCachedTRS={scale:J.scale,rotation:J.rotation,translation:J.translation,transformMatrix:$},{scale:J.scale,rotation:J.rotation,translation:J.translation,cached:!1}}setUsingTransformationMatrix(Q,q=1){let $=Yq(Q,q,this._viewPortWidth,this._viewPortHeight);this.setPosition($.position),this.setRotation($.rotation),this.setZoomLevel($.zoom)}setRotation(Q){if(!hQ(Q,this._rotationBoundaries))return!1;if(Q=S(Q),this._rotationBoundaries!==void 0&&this._rotationBoundaries.end!==void 0&&YQ(Q,this._rotationBoundaries)==this._rotationBoundaries.end&&this._rotation==this._rotationBoundaries.end)return!1;if(this._rotationBoundaries!==void 0&&this._rotationBoundaries.start!==void 0&&YQ(Q,this._rotationBoundaries)==this._rotationBoundaries.start&&this._rotation==this._rotationBoundaries.start)return!1;return this._rotation=Q,!0}getCameraOriginInWindow(Q){return Q}convertFromViewPort2WorldSpace(Q){return l(Q,this._position,this._zoomLevel,this._rotation)}convertFromWorld2ViewPort(Q){return HQ(Q,this._position,this._zoomLevel,this._rotation)}invertFromWorldSpace2ViewPort(Q){let q={x:this.viewPortWidth/2,y:this._viewPortHeight/2},$=qQ.subVector(Q,this._position);return $=qQ.rotatePoint($,-this._rotation),$=qQ.multiplyVectorByScalar($,this._zoomLevel),qQ.addVector(q,$)}setHorizontalBoundaries(Q,q){if(Q>q){let $=q;q=Q,Q=$}if(this._boundaries==null)this._boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}};if(this._boundaries.min==null)this._boundaries.min={x:void 0,y:void 0};if(this._boundaries.max==null)this._boundaries.max={x:void 0,y:void 0};this._boundaries.min.x=Q,this._boundaries.max.x=q}setVerticalBoundaries(Q,q){if(Q>q){let $=q;q=Q,Q=$}if(this._boundaries==null)this._boundaries={min:{x:void 0,y:void 0},max:{x:void 0,y:void 0}};if(this._boundaries.min==null)this._boundaries.min={x:void 0,y:void 0};if(this._boundaries.max==null)this._boundaries.max={x:void 0,y:void 0};this._boundaries.min.y=Q,this._boundaries.max.y=q}viewPortInWorldSpace(Q=!0){let q=l({x:-this._viewPortWidth/2,y:Q?-this._viewPortHeight/2:this._viewPortHeight/2},this._position,this._zoomLevel,this._rotation),$=l({x:this._viewPortWidth/2,y:Q?-this._viewPortHeight/2:this._viewPortHeight/2},this._position,this._zoomLevel,this._rotation),J=l({x:-this._viewPortWidth/2,y:Q?this._viewPortHeight/2:-this._viewPortHeight/2},this._position,this._zoomLevel,this._rotation),U=l({x:this._viewPortWidth/2,y:Q?this._viewPortHeight/2:-this._viewPortHeight/2},this._position,this._zoomLevel,this._rotation);return{top:{left:q,right:$},bottom:{left:J,right:U}}}viewPortAABB(Q){let{top:{left:q,right:$},bottom:{left:J,right:U}}=this.viewPortInWorldSpace(Q);return{min:{x:Math.min(q.x,J.x,$.x,U.x),y:Math.min(q.y,J.y,$.y,U.y)},max:{x:Math.max(q.x,J.x,$.x,U.x),y:Math.max(q.y,J.y,$.y,U.y)}}}}var E$=1000,j$=1000,N$={min:0.1,max:10},F$={min:{x:-1e4,y:-1e4},max:{x:1e4,y:1e4}},_$=void 0;class $Q{_baseCamera;_observer;constructor(Q=E$,q=j$,$={x:0,y:0},J=0,U=1,K=F$,G=N$,Y=_$){this._baseCamera=new OQ(Q,q,$,J,U,K,G,Y),this._observer=new RQ}get boundaries(){return this._baseCamera.boundaries}set boundaries(Q){this._baseCamera.boundaries=Q}get viewPortWidth(){return this._baseCamera.viewPortWidth}set viewPortWidth(Q){this._baseCamera.viewPortWidth=Q}get viewPortHeight(){return this._baseCamera.viewPortHeight}set viewPortHeight(Q){this._baseCamera.viewPortHeight=Q}get position(){return this._baseCamera.position}setPosition(Q){let q={...this._baseCamera.position};if(!this._baseCamera.setPosition(Q))return!1;return this._observer.notifyPan({diff:_Q.subVector(Q,q)},{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(Q){this._baseCamera.zoomBoundaries=Q}setMaxZoomLevel(Q){let q=this._baseCamera.zoomLevel;if(!this._baseCamera.setMaxZoomLevel(Q))return!1;return this._observer.notifyZoom({deltaZoomAmount:Q-q},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0}setMinZoomLevel(Q){if(!this._baseCamera.setMinZoomLevel(Q))return!1;return!0}setZoomLevel(Q){let q=this._baseCamera.zoomLevel;if(!this._baseCamera.setZoomLevel(Q))return!1;return this._observer.notifyZoom({deltaZoomAmount:this._baseCamera.zoomLevel-q},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0}get rotation(){return this._baseCamera.rotation}get rotationBoundaries(){return this._baseCamera.rotationBoundaries}set rotationBoundaries(Q){this._baseCamera.rotationBoundaries=Q}getTransform(Q=1,q=!0){return this._baseCamera.getTransform(Q,q)}setRotation(Q){let q=this._baseCamera.rotation;if(!this._baseCamera.setRotation(Q))return!1;return this._observer.notifyRotate({deltaRotation:Q-q},{position:this._baseCamera.position,rotation:this._baseCamera.rotation,zoomLevel:this._baseCamera.zoomLevel}),!0}getCameraOriginInWindow(Q){return Q}convertFromViewPort2WorldSpace(Q){return l(Q,this._baseCamera.position,this._baseCamera.zoomLevel,this._baseCamera.rotation)}convertFromWorld2ViewPort(Q){return HQ(Q,this._baseCamera.position,this._baseCamera.zoomLevel,this._baseCamera.rotation)}invertFromWorldSpace2ViewPort(Q){let q={x:this._baseCamera.viewPortWidth/2,y:this._baseCamera.viewPortHeight/2},$=_Q.subVector(Q,this._baseCamera.position);return $=_Q.rotatePoint($,-this._baseCamera.rotation),$=_Q.multiplyVectorByScalar($,this._baseCamera.zoomLevel),_Q.addVector(q,$)}setHorizontalBoundaries(Q,q){if(Q>q){let $=q;q=Q,Q=$}if(this._baseCamera.boundaries==null)this._baseCamera.boundaries={min:void 0,max:void 0};if(this._baseCamera.boundaries.min==null)this._baseCamera.boundaries.min={x:void 0,y:void 0};if(this._baseCamera.boundaries.max==null)this._baseCamera.boundaries.max={x:void 0,y:void 0};this._baseCamera.boundaries.min.x=Q,this._baseCamera.boundaries.max.x=q}setVerticalBoundaries(Q,q){if(Q>q){let $=q;q=Q,Q=$}if(this._baseCamera.boundaries==null)this._baseCamera.boundaries={min:void 0,max:void 0};if(this._baseCamera.boundaries.min==null)this._baseCamera.boundaries.min={x:void 0,y:void 0};if(this._baseCamera.boundaries.max==null)this._baseCamera.boundaries.max={x:void 0,y:void 0};this._baseCamera.boundaries.min.y=Q,this._baseCamera.boundaries.max.y=q}on(Q,q,$){return this._observer.on(Q,q,$)}getTRS(Q=1,q=!0){return this._baseCamera.getTRS(Q,q)}setUsingTransformationMatrix(Q,q=1){this._baseCamera.setUsingTransformationMatrix(Q,q)}viewPortInWorldSpace(Q=!0){return this._baseCamera.viewPortInWorldSpace(Q)}viewPortAABB(Q=!0){return this._baseCamera.viewPortAABB(Q)}}class gQ{_disabled=!1;_stateMachine;_orchestrator;_keyfirstPressed;_abortController;_canvas;constructor(Q,q,$){this._canvas=$,this.bindFunctions(),this._abortController=new AbortController,this._stateMachine=Q,this._orchestrator=q,this._keyfirstPressed=new Map}get disabled(){return this._disabled}disable(){this._disabled=!0}enable(){this._disabled=!1}addEventListeners(Q){if(this._canvas==null)return;this._canvas.addEventListener("pointerdown",this.pointerDownHandler,{signal:Q}),this._canvas.addEventListener("pointerup",this.pointerUpHandler,{signal:Q}),this._canvas.addEventListener("pointermove",this.pointerMoveHandler,{signal:Q}),this._canvas.addEventListener("wheel",this.scrollHandler,{signal:Q}),window.addEventListener("keydown",this.keypressHandler,{signal:Q}),window.addEventListener("keyup",this.keyupHandler,{signal:Q})}setUp(){if(this._abortController.signal.aborted)this._abortController=new AbortController;this.addEventListeners(this._abortController.signal)}tearDown(){this._abortController.abort(),this._abortController=new AbortController,this._canvas=void 0}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)}processEvent(...Q){let q=this._stateMachine.happens(...Q);if(q.handled&&"output"in q)this._orchestrator.processInputEventOutput(q.output)}pointerDownHandler(Q){if(this._disabled)return;if(Q.button===0&&Q.pointerType==="mouse"){this.processEvent("leftPointerDown",{x:Q.clientX,y:Q.clientY});return}if(Q.button===1&&Q.pointerType==="mouse"){this.processEvent("middlePointerDown",{x:Q.clientX,y:Q.clientY});return}}pointerUpHandler(Q){if(this._disabled)return;if(Q.button===0&&Q.pointerType==="mouse"){this.processEvent("leftPointerUp",{x:Q.clientX,y:Q.clientY});return}if(Q.button===1&&Q.pointerType==="mouse"){this.processEvent("middlePointerUp",{x:Q.clientX,y:Q.clientY});return}}pointerMoveHandler(Q){if(this._disabled)return;if(Q.buttons===1&&Q.pointerType==="mouse"){this.processEvent("leftPointerMove",{x:Q.clientX,y:Q.clientY});return}if(Q.buttons===4&&Q.pointerType==="mouse"){this.processEvent("middlePointerMove",{x:Q.clientX,y:Q.clientY});return}this.processEvent("pointerMove",{x:Q.clientX,y:Q.clientY})}scrollHandler(Q){if(this._disabled)return;if(Q.preventDefault(),Q.ctrlKey)this.processEvent("scrollWithCtrl",{x:Q.clientX,y:Q.clientY,deltaX:Q.deltaX,deltaY:Q.deltaY});else this.processEvent("scroll",{x:Q.clientX,y:Q.clientY,deltaX:Q.deltaX,deltaY:Q.deltaY})}keypressHandler(Q){if(Q.target!==document.body)return;if(this._keyfirstPressed.has(Q.key))return;if(this._keyfirstPressed.set(Q.key,!0),Q.key===" ")this.processEvent("spacebarDown")}keyupHandler(Q){if(this._keyfirstPressed.has(Q.key))this._keyfirstPressed.delete(Q.key);if(Q.key===" ")this.processEvent("spacebarUp")}attach(Q){this.tearDown(),this._canvas=Q,this.setUp()}}class xQ{_canvas;_disabled;_panDisabled=!1;_zoomDisabled=!1;_rotateDisabled=!1;_stateMachine;_orchestrator;_abortController;constructor(Q,q,$){this._canvas=$,this._disabled=!1,this._stateMachine=Q,this._orchestrator=q,this._abortController=new AbortController,this.bindListeners()}get orchestrator(){return this._orchestrator}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(){if(this._canvas==null)return;if(this._abortController.signal.aborted)this._abortController=new AbortController;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,this._canvas=void 0}get disabled(){return this._disabled}disable(){this._disabled=!0}enable(){this._disabled=!1}processEvent(...Q){let q=this._stateMachine.happens(...Q);if(q.handled&&"output"in q)this._orchestrator.processInputEventOutput(q.output)}touchstartHandler(Q){if(this._disabled)return;let q=[];for(let $=0;$<Q.changedTouches.length;$++)q.push({ident:Q.changedTouches[$].identifier,x:Q.changedTouches[$].clientX,y:Q.changedTouches[$].clientY});this.processEvent("touchstart",{points:q}),Q.preventDefault()}touchcancelHandler(Q){if(this._disabled)return;let q=[];for(let $=0;$<Q.changedTouches.length;$++)q.push({ident:Q.changedTouches[$].identifier,x:Q.changedTouches[$].clientX,y:Q.changedTouches[$].clientY});this.processEvent("touchend",{points:q})}touchendHandler(Q){if(this._disabled)return;let q=[];for(let $=0;$<Q.changedTouches.length;$++)q.push({ident:Q.changedTouches[$].identifier,x:Q.changedTouches[$].clientX,y:Q.changedTouches[$].clientY});this.processEvent("touchend",{points:q})}touchmoveHandler(Q){if(this._disabled)return;Q.preventDefault();let q=[];for(let $=0;$<Q.targetTouches.length;$++)q.push({ident:Q.targetTouches[$].identifier,x:Q.targetTouches[$].clientX,y:Q.targetTouches[$].clientY});this.processEvent("touchmove",{points:q})}attach(Q){this.tearDown(),this._canvas=Q,this.setUp()}}import{PointCal as V$}from"@ue-too/math";function Vq(Q,q){return V$.subVector(Q,q.position)}function J7(Q){let q=Math.cos(Math.PI/6),$=Math.cos(Math.PI/3);return{x:Q.x*q-Q.y*q,y:Q.x*$+Q.y*$+(Q.z??0)}}function Bq(Q,q,$={x:q.width/2,y:q.height/2},J=!1){let U=Vq(Q,q);return jQ(U,$,J)}function VQ(Q){if(Q<=0)return 0;let q=0;if(Q<1){let $=1;while($>Q)$/=10,q--}else{let $=1;while($*10<=Q)$*=10,q++}return q}function d(...Q){let q=Array.isArray(Q[0])?Q[0]:Q;return($,...J)=>{return q.reduce((U,K)=>K(U,...J),$)}}class uQ{lastRect;resizeObserver;intersectionObserver;mutationObserver;scrollHandler;resizeHandler;_observers;constructor(Q){if(this._observers=new i,this.resizeObserver=new ResizeObserver(((q)=>{for(let $ of q){let J=$.target.getBoundingClientRect(),U=M(J,window.getComputedStyle($.target));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}}).bind(this)),this.intersectionObserver=new IntersectionObserver(((q)=>{if(this.lastRect===void 0)return;for(let $ of q)if($.isIntersecting){let J=$.boundingClientRect,U=M(J,window.getComputedStyle($.target));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}}).bind(this)),this.attributeCallBack=this.attributeCallBack.bind(this),this.mutationObserver=new MutationObserver(this.attributeCallBack),Q)this.attach(Q)}dispose(){if(this.resizeObserver.disconnect(),this.intersectionObserver.disconnect(),this.mutationObserver.disconnect(),this.scrollHandler)window.removeEventListener("scroll",this.scrollHandler);if(this.resizeHandler)window.removeEventListener("resize",this.resizeHandler)}attach(Q){this.dispose(),this.resizeObserver.observe(Q),this.intersectionObserver.observe(Q),this.mutationObserver.observe(Q,{attributes:!0,attributeFilter:["width","height","style"]});let q=Q.getBoundingClientRect(),$=M(q,window.getComputedStyle(Q));this.lastRect=$,this.scrollHandler=(()=>{if(this.lastRect===void 0)return;let J=Q.getBoundingClientRect(),U=M(J,window.getComputedStyle(Q));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}).bind(this),this.resizeHandler=(()=>{if(this.lastRect===void 0)return;let J=Q.getBoundingClientRect(),U=M(J,window.getComputedStyle(Q));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}).bind(this),window.addEventListener("scroll",this.scrollHandler,{passive:!0}),window.addEventListener("resize",this.resizeHandler,{passive:!0})}publishPositionUpdate(Q){this._observers.notify(Q)}onPositionUpdate(Q,q){return this._observers.subscribe(Q,q)}attributeCallBack(Q,q){for(let $ of Q)if($.type==="attributes"){if($.attributeName==="width"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}else if($.attributeName==="height"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}else if($.attributeName==="style"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}}}}class vQ{lastRect;resizeObserver;intersectionObserver;mutationObserver;scrollHandler;resizeHandler;_observers;_abortController;_pixelRatioAbortController;constructor(Q){if(this._abortController=new AbortController,this._pixelRatioAbortController=new AbortController,this._observers=new i,this.resizeObserver=new ResizeObserver(((q)=>{for(let $ of q){let J=$.target.getBoundingClientRect(),U=M(J,window.getComputedStyle($.target));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}}).bind(this)),this.intersectionObserver=new IntersectionObserver(((q)=>{if(this.lastRect===void 0)return;for(let $ of q)if($.isIntersecting){let J=$.boundingClientRect,U=M(J,window.getComputedStyle($.target));if(L(this.lastRect,U))this.publishPositionUpdate(U),this.lastRect=U}}).bind(this)),this.attributeCallBack=this.attributeCallBack.bind(this),this.mutationObserver=new MutationObserver(this.attributeCallBack),Q)this.attach(Q)}dispose(){this.resizeObserver.disconnect(),this.intersectionObserver.disconnect(),this.mutationObserver.disconnect(),this._abortController.abort(),this._pixelRatioAbortController.abort()}attach(Q){this.dispose(),this._abortController.abort(),this._abortController=new AbortController,this._pixelRatioAbortController.abort(),this._pixelRatioAbortController=new AbortController,this.resizeObserver.observe(Q),this.intersectionObserver.observe(Q),this.mutationObserver.observe(Q,{attributes:!0,attributeFilter:["width","height","style"]});let q=Q.getBoundingClientRect(),$=M(q,window.getComputedStyle(Q));this.publishPositionUpdate($),this.lastRect=$,this.scrollHandler=(()=>{if(this.lastRect===void 0)return;let U=Q.getBoundingClientRect(),K=M(U,window.getComputedStyle(Q));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}).bind(this),this.resizeHandler=(()=>{if(this.lastRect===void 0)return;let U=Q.getBoundingClientRect(),K=M(U,window.getComputedStyle(Q));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}).bind(this),window.addEventListener("scroll",this.scrollHandler,{passive:!0,signal:this._abortController.signal}),window.addEventListener("resize",this.resizeHandler,{passive:!0,signal:this._abortController.signal});let J=(()=>{this._pixelRatioAbortController.abort(),this._pixelRatioAbortController=new AbortController,console.log("updatePixelRatio",window.devicePixelRatio);let U=Q.getBoundingClientRect(),K=M(U,window.getComputedStyle(Q));this.publishPositionUpdate(K);let G=`(resolution: ${window.devicePixelRatio}dppx)`;matchMedia(G).addEventListener("change",J,{signal:this._pixelRatioAbortController.signal})}).bind(this);J()}publishPositionUpdate(Q){this._observers.notify(Q)}onPositionUpdate(Q,q){return this._observers.subscribe(Q,q)}attributeCallBack(Q,q){for(let $ of Q)if($.type==="attributes"){if($.attributeName==="width"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}else if($.attributeName==="height"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}else if($.attributeName==="style"){let J=$.target,U=J.getBoundingClientRect(),K=M(U,window.getComputedStyle(J));if(L(this.lastRect,K))this.publishPositionUpdate(K),this.lastRect=K}}}}function M(Q,q){let $=parseFloat(q.paddingLeft),J=parseFloat(q.paddingTop),U=parseFloat(q.paddingRight),K=parseFloat(q.paddingBottom),G=parseFloat(q.borderLeftWidth),Y=parseFloat(q.borderTopWidth),j=parseFloat(q.borderRightWidth),B=parseFloat(q.borderBottomWidth),W=Q.left+$+G,F=Q.top+J+Y,_=Q.width-$-U-G-j,E=Q.height-J-K-Y-B;return new DOMRect(W,F,_,E)}function L(Q,q){if(Q===void 0)return!0;return Q.top!==q.top||Q.left!==q.left||Q.width!==q.width||Q.height!==q.height}var Aq={fillRect:[1,3],strokeRect:[1,3],fillText:[2],strokeText:[1],lineTo:[1],moveTo:[1],quadraticCurveTo:[1,3],bezierCurveTo:[1,3,5],arc:[1],drawImage:[2],rect:[1,3],roundRect:[1,3]};function Wq(Q){return new Proxy(Q,{get(q,$,J){let U=Reflect.get(q,$,q);if(typeof $==="string"&&$ in Aq&&typeof U==="function")return function(...K){let G=[...K];if($==="drawImage"&&K.length===9){let Y=B$(K);return U.apply(q,Y)}else{let Y=Aq[$];for(let j of Y)if(j<G.length)G[j]=-G[j];if($==="drawImage"&&K.length===5)G[2]-=G[4]}return U.apply(q,G)};if(typeof U==="function")return function(...K){return U.apply(q,K)};return U},set(q,$,J){return Reflect.set(q,$,J)}})}function B$(Q){if(Q.length!==9)return Q;let q=[...Q],$=Q[0].height;if($!==void 0)q[2]=$-q[2],q[6]=-q[6],q[6]-=q[8],q[4]=-q[4];return q}import{PointCal as V}from"@ue-too/math";function B7(Q,q,$,J,U,K="red"){let G=U/2;if(G=G/$,Q.beginPath(),Q.strokeStyle=K,Q.lineWidth=2/$,J)Q.moveTo(q.x-G,q.y),Q.lineTo(q.x+G,q.y),Q.moveTo(q.x,q.y-G),Q.lineTo(q.x,q.y+G);else Q.moveTo(q.x-G,-q.y),Q.lineTo(q.x+G,-q.y),Q.moveTo(q.x,-q.y-G),Q.lineTo(q.x,-q.y+G);Q.stroke(),Q.lineWidth=3}function A7(Q,q,$){if(!fQ(q))return;let J=t(q),U=QQ(q),K=q==null?void 0:q.min,G=K==null?void 0:K.x,Y=K==null?void 0:K.y;if(G==null||Y==null||J==null||U==null)return;if(Q.beginPath(),Q.strokeStyle="blue",Q.lineWidth=100,$)Q.roundRect(G,Y,J,U,5);else Q.roundRect(G,-Y,J,-U,5);Q.stroke(),Q.lineWidth=3,Q.strokeStyle="black"}function W7(Q,q,$,J){if(!fQ(q))return;let U=t(q),K=QQ(q),G=q==null?void 0:q.min,Y=G==null?void 0:G.x,j=G==null?void 0:G.y;if(Y==null||j==null||U==null||K==null)return;if(Q.lineWidth=1/$,Q.beginPath(),Q.strokeStyle="rgba(87, 173, 72, 0.8)",Q.moveTo(0,0),J)Q.lineTo(0,j+K);else Q.lineTo(0,-j-K);Q.stroke(),Q.beginPath(),Q.strokeStyle="rgba(220, 59, 59, 0.8)",Q.moveTo(0,0),Q.lineTo(Y+U,0),Q.stroke(),Q.strokeStyle="black"}function k7(Q,q,$,J,U,K,G){let Y=V.unitVectorFromA2B(q,$),j=V.unitVectorFromA2B(J,q),B=V.distanceBetweenPoints(q,$),W=V.distanceBetweenPoints(q,J),F=VQ(B),E=Math.pow(10,F)/10,A=Math.ceil(q.x/E)*E,I=Math.floor($.x/E)*E,H=K?Math.floor(q.y/E)*E:Math.ceil(J.y/E)*E,g=K?Math.ceil(J.y/E)*E:Math.floor(q.y/E)*E;for(let z=A;z<=I;z+=E){let Z=V.addVector({x:z,y:q.y},V.multiplyVectorByScalar(Y,E)),O=V.addVector({x:z,y:J.y},V.multiplyVectorByScalar(Y,E));Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=0.5/G,Q.moveTo(Z.x,Z.y),Q.lineTo(O.x,O.y),Q.stroke()}for(let z=H;z<=g;z+=E){let Z=V.addVector({x:q.x,y:z},V.multiplyVectorByScalar(j,E)),O=V.addVector({x:$.x,y:z},V.multiplyVectorByScalar(j,E));Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=0.5/G,Q.moveTo(Z.x,Z.y),Q.lineTo(O.x,O.y),Q.stroke()}}function I7(Q,q,$,J,U,K,G){let Y=V.unitVectorFromA2B(q,$),j=V.unitVectorFromA2B(J,q),B=V.distanceBetweenPoints(q,$),W=VQ(B),F=Math.pow(10,W),_=F/2,E=F/10,A=1;if(W<=0)A=Math.pow(10,-W+1);let I=Math.ceil(q.x/F)*F,H=Math.floor($.x/F)*F,g=K?Math.ceil(q.y/F)*F:Math.floor(J.y/F)*F,z=K?Math.floor(J.y/F)*F:Math.ceil(q.y/F)*F,Z=Math.ceil(q.x/_)*_,O=Math.floor($.x/_)*_,x=K?Math.ceil(q.y/_)*_:Math.floor(J.y/_)*_,y=K?Math.floor(J.y/_)*_:Math.ceil(q.y/_)*_,m=Math.ceil(q.x/E)*E,r=Math.floor($.x/E)*E,n=K?Math.ceil(q.y/E)*E:Math.floor(J.y/E)*E,p=K?Math.floor(J.y/E)*E:Math.ceil(q.y/E)*E,k=F*G,w=_*G,R=E*G;Q.font=`bold ${20/G}px Helvetica`;let C=Q.measureText(`${-(_+Z)}`),EQ=C.fontBoundingBoxAscent+C.fontBoundingBoxDescent,UQ=Q.measureText(`${-(E+m)}`),kQ=UQ.fontBoundingBoxAscent+UQ.fontBoundingBoxDescent,Gq=Math.ceil((H-I)/F);for(let D=0;D<=Gq;D++){let N=I+D*F;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=5/G;let X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,50/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,-50/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.textAlign="center",Q.textBaseline="middle",Q.font=`bold ${20/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`),b=T.fontBoundingBoxAscent+T.fontBoundingBoxDescent;if(!K)X=V.addVector(X,{x:0,y:-b/2-b*0.2}),Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,-X.y);else X=V.addVector(X,{x:0,y:b/2+b*0.2}),Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y);Q.stroke()}let Xq=Math.ceil((H-I)/F);for(let D=0;D<=Xq;D++){let N=g+D*F;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=5/G;let X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,-50/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,50/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.textAlign="center",Q.textBaseline="middle",Q.font=`bold ${20/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`);if(X=V.addVector(X,{x:T.width/2+T.width*0.3,y:0}),!K)Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,-X.y);else Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y);Q.stroke()}let SQ=Math.ceil((O-Z)/_);for(let D=0;D<=SQ;D++){let N=Z+D*_;if(Math.floor(N*A)%Math.floor(F*A)==0)continue;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=3/G;let X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,25/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,-25/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.font=`${15/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`);if(w>C.width*2){Q.textAlign="center",Q.textBaseline="middle";let b=T.fontBoundingBoxAscent+T.fontBoundingBoxDescent;if(!K)X=V.addVector(X,{x:0,y:-b/2-b*0.2}),X=V.flipYAxis(X);else X=V.addVector(X,{x:0,y:b/2+b*0.2});Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y)}Q.stroke()}let wQ=Math.ceil((y-x)/_);for(let D=0;D<=wQ;D++){let N=x+D*_;if(Math.floor(N*A)%Math.floor(F*A)==0)continue;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=3/G;let X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,-25/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,25/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.font=`${18/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`),b=T.fontBoundingBoxAscent+T.fontBoundingBoxDescent;if(w>EQ*2){if(Q.textAlign="center",Q.textBaseline="middle",X=V.addVector(X,{x:T.width/2+T.width*0.3,y:0}),!K)X=V.flipYAxis(X);Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y)}Q.stroke()}let G$=Math.ceil((r-m)/E);for(let D=0;D<=G$;D++){let N=m+D*E;if(Math.floor(N*A)%Math.floor(F*A)==0||Math.floor(N*A)%Math.floor(_*A)==0)continue;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=1/G;let X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,12.5/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:N,y:q.y},V.multiplyVectorByScalar(j,-12.5/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.font=`${10/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`);if(R>UQ.width*2){Q.textAlign="center",Q.textBaseline="middle";let b=T.fontBoundingBoxAscent+T.fontBoundingBoxDescent;if(!K)X=V.addVector(X,{x:0,y:-b/2-b*0.2}),X=V.flipYAxis(X);else X=V.addVector(X,{x:0,y:b/2+b*0.2});Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y)}Q.stroke()}let X$=Math.ceil((p-n)/E);for(let D=0;D<=X$;D++){let N=n+D*E;if(Math.floor(N*A)%Math.floor(F*A)==0||Math.floor(N*A)%Math.floor(_*A)==0)continue;Q.beginPath(),Q.strokeStyle="black",Q.fillStyle="black",Q.lineWidth=1/G;let X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,-12.5/G));if(!K)Q.moveTo(X.x,-X.y);else Q.moveTo(X.x,X.y);if(X=V.addVector({x:q.x,y:N},V.multiplyVectorByScalar(Y,12.5/G)),!K)Q.lineTo(X.x,-X.y);else Q.lineTo(X.x,X.y);Q.font=`${12/G}px Helvetica`;let T=Q.measureText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`),b=T.fontBoundingBoxAscent+T.fontBoundingBoxDescent;if(R>kQ*2){if(Q.textAlign="center",Q.textBaseline="middle",X=V.addVector(X,{x:T.width/2+T.width*0.3,y:0}),!K)X=V.flipYAxis(X);Q.fillText(`${Math.abs(N)%1==0?N.toFixed(0):N.toFixed(2)}`,X.x,X.y)}Q.stroke()}}function H7(Q,q,$,J,U=20,K="red"){if(U=U/$,Q.font=`${20/$}px Arial`,Q.fillStyle=K,J)Q.fillText(`x: ${q.x.toFixed(2)}, y: ${q.y.toFixed(2)}`,q.x+U,q.y+U);else Q.fillText(`x: ${q.x.toFixed(2)}, y: ${q.y.toFixed(2)}`,q.x+U,-q.y-U);Q.fillStyle="black"}function O7(Q,q,$){if(Q.beginPath(),Q.strokeStyle="rgba(87, 173, 72, 0.8)",$)Q.arc(q.x,q.y,5,0,2*Math.PI);else Q.arc(q.x,-q.y,5,0,2*Math.PI);Q.stroke(),Q.strokeStyle="black"}import{PointCal as s}from"@ue-too/math";function T7(Q,q,$,J,U=1,K=0.3){let G=s.distanceBetweenPoints($,J),Y=10<G*q*0.5?10/q:G*0.5,j=G-Y,B=s.linearInterpolation($,J,j/G);Q.beginPath(),Q.lineWidth=U/q,Q.moveTo($.x,$.y),Q.lineTo(B.x,B.y),Q.stroke();let W=s.rotatePoint(s.unitVectorFromA2B(J,$),Math.PI/2),F=s.addVector(B,s.multiplyVectorByScalar(W,Y*0.5)),_=s.subVector(B,s.multiplyVectorByScalar(W,Y*0.5));Q.beginPath(),Q.moveTo(J.x,J.y),Q.lineTo(F.x,F.y),Q.lineTo(_.x,_.y),Q.closePath(),Q.fill()}var BQ=30,pQ=BQ*0.3,dQ=BQ*0.5,mQ=10,lQ=2.5,kq=20,Iq=10;function S7(Q,q,$,J,U,K){let{minMajorTickValue:G,maxMajorTickValue:Y,majorTickStep:j,minMinTickValue:B,maxMaxTickValue:W,minTickStep:F,minHalfTickValue:_,maxHalfTickValue:E,halfTickStep:A,calibrationMultiplier:I,normalizedOrderOfMagnitude:H}=Hq(q.x,$.x);Q.save(),Q.strokeStyle="red";for(let k=G;k<=Y;k+=j){let w={x:k*I,y:q.y},R=U?BQ/K:-BQ/K,C=U?mQ/K:-mQ/K;cQ(Q,K,w,R,k*I,{textOffset:C,fontSize:kq})}for(let k=B;k<=W;k+=F){if(k%j===0)continue;if(k%A===0)continue;let w={x:k*I,y:q.y},R=U?pQ/K:-pQ/K;cQ(Q,K,w,R,k)}for(let k=_;k<=E;k+=A){if(k%j===0)continue;let w={x:k*I,y:q.y},R=U?dQ/K:-dQ/K,C=U?lQ/K:-lQ/K;cQ(Q,K,w,R,k*I,{textOffset:C,fontSize:Iq,color:"red"})}Q.restore();let{minMajorTickValue:g,maxMajorTickValue:z,majorTickStep:Z,minMinTickValue:O,maxMaxTickValue:x,minTickStep:y,minHalfTickValue:m,maxHalfTickValue:r,halfTickStep:n,calibrationMultiplier:p}=Hq(q.y,J.y,H);Q.save(),Q.strokeStyle="green";for(let k=g;k<=z;k+=Z){let w={x:q.x,y:k*p},R=BQ/K,C=mQ/K;sQ(Q,K,w,R,k,{textOffset:C,fontSize:kq})}for(let k=m;k<=r;k+=n){if(k%Z===0)continue;let w={x:q.x,y:k*p},R=dQ/K,C=lQ/K;sQ(Q,K,w,R,k,{textOffset:C,fontSize:Iq})}for(let k=O;k<=x;k+=y){if(k%Z===0)continue;let w={x:q.x,y:k*p},R=pQ/K;sQ(Q,K,w,R,k)}Q.restore()}function sQ(Q,q,$,J,U,K){let G=K!==void 0;if(Q.save(),Q.lineWidth=1/q,Q.beginPath(),Q.moveTo($.x,$.y),Q.lineTo($.x+J,$.y),Q.stroke(),Q.restore(),!G)return;let Y=K.color??"green";Q.save(),Q.textAlign="left",Q.textBaseline="middle",Q.fillStyle=Y,Q.font=`${K.fontSize/q}px Arial`;let j=U%1==0?U:U.toFixed(2);Q.fillText(`${j}`,$.x+J+K.textOffset,$.y),Q.restore()}function cQ(Q,q,$,J,U,K){let G=K!==void 0;if(Q.save(),Q.lineWidth=1/q,Q.beginPath(),Q.moveTo($.x,$.y),Q.lineTo($.x,$.y+J),Q.stroke(),Q.restore(),!G)return;let Y=K.color??"red";Q.save(),Q.textAlign="center",Q.textBaseline="top",Q.fillStyle=Y,Q.font=`${K.fontSize/q}px Arial`;let j=U%1==0?U:U.toFixed(2);Q.fillText(`${j}`,$.x,$.y+J+K.textOffset),Q.restore()}function Hq(Q,q,$){let J=Math.min(Q,q),U=Math.max(Q,q),K=U-J,G=$?$:VQ(K),Y=Math.max(1,G),j=Math.pow(10,Y-G),W=(Q>0?Math.floor(J*j/Math.pow(10,Y)):Math.ceil(J*j/Math.pow(10,Y)))*Math.pow(10,Y),_=(q>0?Math.floor(U*j/Math.pow(10,Y)):Math.ceil(U*j/Math.pow(10,Y)))*Math.pow(10,Y),E=Math.pow(10,Y),A=Y-1,H=(Q>0?Math.floor(J*j/Math.pow(10,A)):Math.ceil(J*j/Math.pow(10,A)))*Math.pow(10,A),z=(q>0?Math.floor(U*j/Math.pow(10,A)):Math.ceil(U*j/Math.pow(10,A)))*Math.pow(10,A),Z=Math.pow(10,A),O=E/2,y=(Q>0?Math.floor(J*j/O):Math.ceil(J*j/O))*O,r=(q>0?Math.floor(U*j/O):Math.ceil(U*j/O))*O;return{minMajorTickValue:W,maxMajorTickValue:_,majorTickStep:E,minMinTickValue:H,maxMaxTickValue:z,minTickStep:Z,minHalfTickValue:y,maxHalfTickValue:r,halfTickStep:O,calibrationMultiplier:1/j,normalizedOrderOfMagnitude:Y}}function Oq(Q,q,$,J){let U=t(Q),K=QQ(Q);if(U==null||K==null)return;let G=Math.abs(U*Math.cos(J)),Y=Math.abs(K*Math.cos(J)),j=Math.abs(U*Math.sin(J)),B=Math.abs(K*Math.sin(J)),W=q/G,F=q/Y,_=$/j,E=$/B;if(W==1/0)W=0;if(F==1/0)F=0;if(_==1/0)_=0;if(E==1/0)E=0;let A=$/K,I=q/U;return Math.max(A,I,W,F,_,E)}function DQ(Q,q){if(q==null)return!1;if(Q==null)return!0;if(q==1/0)return!1;if(Q!==void 0&&(Q.min==null||q>Q.min))return!0;return!1}function rQ(Q,q,$,J){let U=t(Q);if(U==null)return;let K=Math.abs(U*Math.cos(J)),G=Math.abs(U*Math.sin(J)),Y=q/K,j=$/G;if(Y==1/0)return j;return Math.max(q/K,$/G)}function b7(Q,q,$,J){let U=QQ(Q);if(U==null)return;let K=Math.abs(U*Math.cos(J)),G=Math.abs(U*Math.sin(J)),Y=q/K,j=$/G;if(j==1/0)return Y;return Math.max(Y,j)}import{PointCal as v$}from"@ue-too/math";class zQ{pan;zoom;rotate;all;constructor(){this.pan=new f,this.zoom=new f,this.rotate=new f,this.all=new f}notifyPan(Q){this.pan.notify({diff:Q}),this.all.notify({type:"pan",diff:Q})}notifyZoom(Q,q){this.zoom.notify({deltaZoomAmount:Q,anchorPoint:q}),this.all.notify({type:"zoom",deltaZoomAmount:Q,anchorPoint:q})}notifyRotate(Q){this.rotate.notify({deltaRotation:Q}),this.all.notify({type:"rotate",deltaRotation:Q})}on(Q,q){switch(Q){case"pan":return this.pan.subscribe(q);case"zoom":return this.zoom.subscribe(q);case"rotate":return this.rotate.subscribe(q);case"all":return this.all.subscribe(q);default:throw Error("Invalid raw user input event name")}}}function s7(){return new zQ}class A${pan;zoom;rotate;all;webWorker;constructor(Q){this.pan=new f,this.zoom=new f,this.rotate=new f,this.all=new f,this.webWorker=Q}notifyPan(Q){this.webWorker.postMessage({type:"notifyUserInput",payload:{type:"pan",diff:Q}}),this.pan.notify({diff:Q}),this.all.notify({type:"pan",diff:Q})}notifyZoom(Q,q){this.webWorker.postMessage({type:"notifyUserInput",payload:{type:"zoom",deltaZoomAmount:Q,anchorPoint:q}}),this.zoom.notify({deltaZoomAmount:Q,anchorPoint:q}),this.all.notify({type:"zoom",deltaZoomAmount:Q,anchorPoint:q})}notifyRotate(Q){this.webWorker.postMessage({type:"notifyUserInput",payload:{type:"rotate",deltaRotation:Q}}),this.rotate.notify({deltaRotation:Q}),this.all.notify({type:"rotate",deltaRotation:Q})}on(Q,q){switch(Q){case"pan":return this.pan.subscribe(q);case"zoom":return this.zoom.subscribe(q);case"rotate":return this.rotate.subscribe(q);case"all":return this.all.subscribe(q);default:throw Error("Invalid raw user input event name")}}}class Dq{constructor(){}notifyPanInput(Q){return{allowPassThrough:!0,delta:Q}}notifyZoomInput(Q,q){return{allowPassThrough:!0,delta:Q,anchorPoint:q}}notifyRotationInput(Q){return{allowPassThrough:!0,delta:Q}}}function i7(){return new Dq}import{NO_OP as MQ,TemplateState as nQ,TemplateStateMachine as W$}from"@ue-too/being";class zq extends W${constructor(Q,q,$){super(Q,q,$)}notifyPanInput(Q){return this.happens("userPanByInput",{diff:Q})}notifyPanToAnimationInput(Q){return this.happens("transitionPanToInput",{target:Q})}initateTransition(){return this.happens("initateTransition")}}class Mq extends nQ{constructor(){super()}_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:MQ,defaultTargetState:"TRANSITION"}};userPanByInputHandler(Q,q){return{type:"panByViewPort",delta:q.diff}}userPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}lockedOnObjectPanByInputHandler(Q,q){return{type:"panByViewPort",delta:q.diff}}lockedOnObjectPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}}class Zq extends nQ{constructor(){super()}_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(Q,q){return{type:"panByViewPort",delta:q.diff}}userPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}transitionPanByInputHandler(Q,q){return{type:"panByViewPort",delta:q.diff}}transitionPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}lockedOnObjectPanByInputHandler(Q,q){return{type:"panByViewPort",delta:q.diff}}lockedOnObjectPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}}class Tq extends nQ{constructor(){super()}_eventReactions={unlock:{action:MQ,defaultTargetState:"ACCEPTING_USER_INPUT"},lockedOnObjectPanByInput:{action:this.lockedOnObjectPanByInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"},lockedOnObjectPanToInput:{action:this.lockedOnObjectPanToInputHandler,defaultTargetState:"LOCKED_ON_OBJECT"}};lockedOnObjectPanByInputHandler(Q,q){return{type:"panByViewPort",delta:q.diff}}lockedOnObjectPanToInputHandler(Q,q){return{type:"panToWorld",target:q.target}}}function k$(){return{ACCEPTING_USER_INPUT:new Mq,TRANSITION:new Zq,LOCKED_ON_OBJECT:new Tq}}function Sq(Q={setup:MQ,cleanup:MQ}){return new zq(k$(),"ACCEPTING_USER_INPUT",Q)}import{NO_OP as iQ,TemplateState as aQ,TemplateStateMachine as I$}from"@ue-too/being";class wq extends aQ{_eventReactions={userZoomByAtInput:{action:this.userZoomByAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},userZoomToAtInput:{action:this.userZoomToAtInput,defaultTargetState:"ACCEPTING_USER_INPUT"},initiateTransition:{action:iQ,defaultTargetState:"TRANSITION"}};userZoomByAtInput(Q,q){return{type:"zoomByAt",deltaZoom:q.deltaZoom,anchorPoint:q.anchorPoint}}userZoomToAtInput(Q,q){return{type:"zoomToAt",targetZoom:q.targetZoom,anchorPoint:q.anchorPoint}}}class Rq extends aQ{constructor(){super()}_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"}};lockedOnObjectZoomByAtInput(Q,q){return{type:"zoomBy",deltaZoom:q.deltaZoom}}lockedOnObjectZoomToAtInput(Q,q){return{type:"zoomTo",targetZoom:q